1.8.0
Compatibility
Required content
Changes
PlayerAPI — Patch Notes
New: DisplayActions
New class for showing in-game overlays without touching Minecraft internals directly.
showTitle(title, subtitle)— shows a title and subtitle with default fade timing (10/70/20 ticks)showTitle(title, subtitle, fadeIn, stay, fadeOut)— same but with custom timingshowActionBar(message)— shows text on the action bar above the hotbar- All methods accept
§colour codes
New: BlockSnapshot type
New immutable record representing a block in the world.
- Fields:
x,y,z,blockId(e.g."minecraft:wheat"),blockState(Map<String, String>) - Helpers:
getState(String key),hasState(String key),stateEquals(String key, String value)
WorldInfo — new methods
getNearbyEntitiesMatching(double radius, Predicate<EntitySnapshot>)— filtered version ofgetNearbyEntities; avoids iterating the full list on the caller's sidegetNearbyBlocks(double radius, String blockId)— returns all blocks of a specific type within radius (sphere scan)getNearbyBlocksMatching(double radius, Predicate<BlockSnapshot>)— same but with a custom predicategetEntityAtCrosshair()→Optional<EntitySnapshot>— entity the player is currently looking at (uses the client crosshair raycast)getBlockAtCrosshair()→Optional<BlockSnapshot>— block the player is currently looking atgetEntityNbt(int entityId)→Map<String, String>— reads top-level NBT values for a nearby entity; moderately expensive, do not call every tick
Bug fix:
getNearbyEntitiesandgetNearbyPlayerswere incorrectly passingx,y,zas separate arguments toBox.of()instead ofnew Vec3d(x, y, z). The bounding box was being constructed with the wrong overload, causing entities to be missed or wrongly included. Now fixed.
TabListInfo — new methods
getAllLinesRaw()— returns display name strings before formatting stripping (for inspecting raw style data)findLinesWithPrefix(String prefix)— returns all lines with the prefix, not just the firstfindLinesContaining(String substring)— case-insensitive substring search, returns all matchesparseKeyValueLines(String... prefixes)— batch extracts multiple"Key: Value"pairs in one callanyLineMatches(String regex)— tests whether any tab list line matches a regexisLineStrikethrough(String substring)— returnstrueif the first line containing the substring has any segment with strikethrough styling applied; usesText.visit()to walk the style tree (the only reliable method —getString()strips all formatting)getPlayerUsernames()— returns actual Minecraft account names (not display names) from the tab listisPlayerOnline(String username)— case-insensitive check for a player's presencegetPlayerCount()— total number of entries in the tab list
SoundActions — new methods
playById(String fullSoundId, float volume, float pitch)— plays any vanilla or registered sound by its string ID (e.g."entity.player.levelup"); if no namespace is given, defaults tominecraft:playRepeated(Identifier, float volume, float pitch, int times, int intervalTicks)— plays a sound N times with a configurable tick gap between repeatsplayRepeated(Identifier, float volume, float pitch, int times)— same with the default 20-tick (1 second) intervalplayByIdRepeated(String fullSoundId, float volume, float pitch, int times, int intervalTicks)— string-ID convenience overload ofplayRepeated
New: Update checker
PlayerAPI now checks for newer releases on every world join and shows a single chat message if one is found. Nothing is downloaded automatically.
- Runs on a daemon thread so the network request never blocks the game thread
- Reads the
tag_namefield from the GitHub Releases API and compares it against the installed version using numeric segment comparison (handles bothv1.2.0and1.2.0tag formats) - Only fires the notification once per world join
- Silent on failure (network errors, offline, restricted networks)
- Can be disabled in the new config screen
New: PlayerAPIConfig
GSON-backed config singleton persisted to config/playerapi/config.json.
isUpdateCheckEnabled()/setUpdateCheckEnabled(boolean)— controls the update checkload()/save()— called automatically on world init and config screen close
New: Config screen
A YACL config screen with a single Updates tab containing the update check toggle. Accessible from the ModMenu mods list if ModMenu is installed.
New: ModMenu integration
Implements ModMenuApi to add a Config button to PlayerAPI's entry in the ModMenu mods list.
ModMenu remains an optional dependency — PlayerAPI runs normally without it.
New dependencies
| Dependency | Type | Notes |
|---|---|---|
yet-another-config-lib (YACL3) |
Required | Needed for the config screen |
modmenu |
Optional | Adds the Config button to the mods list if present |
Optional dependencies
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:f1lqUfu0:FAiRrInZ"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:f1lqUfu0:FAiRrInZ"
}



