Links
Tags
Creators
Details
0.1.0
Compatibility
Changes
Changelog
What changed
Threading is no longer aspirational. The old code had ScheduledFuture fields with no visibility guarantees, shared DecimalFormat instances, a BufferedWriter that got replaced mid-write, and computeIfAbsent called from concurrent paths without a ConcurrentMap. Every one of those caused data corruption or silent drops under load. All of them are fixed.
Model training no longer blocks your entire server. It now runs on a dedicated trainExecutor thread pool. You can train a fifty-tree model on fifty thousand rows without timing out the main thread.
Recording stops when the server stops. Not after. There is a proper shutdown hook now. Your last session will not be truncated.
Dates are UTC everywhere. Not JVM default, not Moscow time, not whatever the hosting provider configured. UTC.
New features
/lad models info <name>- see accuracy, precision, recall, and F1-score for any model/lad dataset info- row counts by class, file size, skipped rows/lad check history <player>- replay recent check results for a player/lad record stop all- stop every active recording session at once- Command aliases -
activeworks likemodelactivate,deactivatelikemodeldeactive,deletelikemodeldeleted. Old names still work. max-dataset-rowsin config.yml - cap the dataset size before it eats your disk- Build scripts -
build.ps1for Windows,build.shfor Linux
Bug fixes
- Fixed
Location.subtract()mutating the entity's actual position in the world. The detector was not just reading location data, it was moving the player. - Fixed
SimpleDateFormatbreaking under concurrent access from multiple threads. - Fixed
ScheduledFuturefield visibility across threads. The cancel method was sometimes running on a null handle. - Fixed
DecimalFormatinstance shared across threads without synchronization. - Fixed
BufferedWriterbeing replaced mid-recording, losing buffered data. - Fixed
catch(Throwable)maskingOutOfMemoryErrorand other serious JVM problems. - Fixed reader and serializer streams not closing when constructors threw.
- Fixed
PluginSettingsfield not visible across threads on reload. - Fixed GCD calculation producing negative values for large tick differences.
- Fixed dataset row limit not being enforced during recording.
- Fixed label change warning message being untranslated.
- Fixed
RuntimeStateServicereturning stale cached state after state transitions. - Fixed
/lad models infowith no argument causing aStackOverflowErrorfrom infinite recursion. - Fixed recordings not stopping cleanly when the server shuts down.
Security
- SHA-256 hash verification for all downloaded model files
- Path traversal prevention - model names containing
..or/are rejected - Model name length limited to 64 characters to prevent filesystem abuse
What you do to upgrade
- Replace the jar
- Start the server
- That is it
The config file and dataset are backward-compatible. If you use the old command names in scripts or chat binds, they still work - the aliases are transparent.
License
Apache License 2.0. Do not remove my name or reupload as your own. If you fork it, use a different name and mention the original. Full terms in the LICENSE file.
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:pw0YUPv0:kSKAqlO2"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:pw0YUPv0:kSKAqlO2"
}

