Tags
Creators
Details
0.8.7
Compatibility
Changes
Lattice 0.8.7 - Folia Thread-Safety Hardening
Fixed
Critical (AsyncCatcher Errors)
-
[CRITICAL] Fixed
PaperTaskService.scheduleEntity()thread validation- Added thread ownership validation before entity access
- Prevents unsafe entity lookups from async contexts
- Uses
ReentrantLockfor better granularity
-
[CRITICAL] Fixed race conditions in UI event handlers
- Synchronized
onInventoryClick()withReentrantLock - Synchronized
onPrepareAnvil()withReentrantLock - Added
closed()checks to prevent operations on closed sessions
- Synchronized
-
[CRITICAL] Fixed block/player access in text input renderers
- Protected
getBlock()calls inPaperVirtualSignTextInputRenderer.restore() - Protected
getLocation()calls in both virtual sign and anvil renderers - Prevents AsyncCatcher errors during text input UI operations
- Protected
-
[CRITICAL] Fixed PacketEvents callback thread safety
- Wrapped
PacketEventslisteners to execute in global region scheduler - Prevents unsafe operations from packet thread
- Wrapped
Important (Race Conditions)
-
[IMPORTANT] Added volatile modifiers to
PaperTextInputUiSessioncompleted,anvilView,signPosition,signLocationare now volatile- Ensures visibility across event handler and scheduler threads
-
[IMPORTANT] Synchronized
handleVirtualSignChange()withReentrantLock- Prevents race condition with concurrent session removal
-
[IMPORTANT] Synchronized
PaperInventorySurfaceRenderer.render()page access- Copies button list atomically to avoid concurrent modification
- Prevents
IndexOutOfBoundsException
-
[IMPORTANT] Synchronized
runOnPlayer()ownership check- Prevents race condition between region ownership check and schedule
-
[IMPORTANT] Added thread-safety documentation to PlaceholderAPI integrations
- Documents that handlers are called from arbitrary threads
- Lists unsafe and safe operations
Minor (Edge Cases)
- Improved lock granularity in
session(Inventory)lookup - Prevented double registration in
registerRefreshEvent()
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:Ed95iBPq:MW3NV4R3"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:Ed95iBPq:MW3NV4R3"
}

