Tags
Creators
Details
Licensed MIT
Published 5 months ago
Updated last week
All versions
1.4.7
Release
1.4.7 -- Fix Folia Async Crash & Netty Packet Filtering3 months ago 18
Compatibility
Minecraft: Java Edition
26.2
26.1.x
1.21.x
1.20.x
1.19.x
Platforms
Bukkit
Folia
Paper
Purpur
Spigot
Changes
š Bug Fixes
- Fixed Folia crash:
AsyncCatchererror onChunk getEntities callā TheENTITY_SOUND_EFFECTpacket handler was callingworld.getEntities()on the Netty IO thread, which Folia blocks. Replaced with a thread-safe entity position cache that requires zero Bukkit API calls on the network thread. - Fixed Folia raycast thread-safety violation ā The raycast task was running on the
GlobalRegionSchedulerwhile accessing world block data across different region threads. Each player's raycast is now scheduled on their owning region thread.
ā” Performance Improvements
- Early packet-type filtering ā The packet listener now checks the packet type before any Bukkit API calls. Previously,
Bukkit.getPlayer(),player.getWorld(),player.hasPermission(), andplayer.getGameMode()were executed for every single outbound packet (chat, tab list, keep-alive, etc.) ā even though we only handle ~10 specific packet types. This eliminates unnecessary overhead for ~90% of all outbound packets. - Bypass permission caching ā
player.hasPermission()andplayer.getGameMode()are no longer called on the Netty IO thread. A thread-safe bypass cache is updated on the main thread during player join, quit, world change, gamemode change, and/fpac bypass, so the packet handler only performs a fast map lookup. - Cached reflection calls ā All scheduler reflection in
PlatformUtil(getMethod,invoke) is now resolved once at class load instead of on every scheduler call. The tile entity reflection field in the chunk handler is also cached statically. - Reduced debug logging overhead ā Debug string concatenation in the hot packet path is now properly guarded and only runs when debug mode is actually enabled.
š¦ Housekeeping
- Bumped config version to
4.2
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:NodGIhss:Kv9oaXEg"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:NodGIhss:Kv9oaXEg"
}

