Links
Tags
Creators
Details
0.1.1
Compatibility
Changes
Changelog
What changed
Alert history no longer sits in memory forever. When a player left, their state was cleaned up but the alert history stayed. On a server with a few thousand unique players over a week, that turned into a slow leak. Fixed now.
The IO executor waits for pending writes before shutdown. It was sending a shutdown signal and walking away. If the dataset had queued rows, they got lost. Now it waits up to ten seconds. If the writes do not finish in time, it logs a warning and moves on.
pruneStatesIfNeeded stopped hammering every tick. It ran on every single PlayerMoveEvent, checking the state map size and calling Bukkit.getPlayer for every UUID. That is pointless work. Now it runs at most once every five seconds.
Windows path traversal in dataset-path is blocked. A config value like C:\evil\file passed the existing check because it does not contain .. or start with /. Now drive-letter paths are rejected too.
Model metadata is written once, not twice. saveModel wrote the metadata file, read it back, added the SHA-256, and wrote it again. Now SHA-256 is computed before the first write and included from the start.
CSV formatting is faster. String.format with Locale.US on every feature value adds up across thousands of windows. Replaced with a ThreadLocal DecimalFormat. About three times faster.
Model training adapts to your data now. Small datasets get conservative trees with limited depth to avoid overfitting. Large datasets get deeper trees for better accuracy. The train/validation split is stratified, so class ratios are preserved. If one class heavily outnumbers the other, the model adds regularization to cut down false positives.
New features
/lad dataset trim <rows>- keep only the last N rows and delete the restLumoAiDetector.bypasspermission - exempt a player from detection entirelydetector.disabled-worldsin config.yml - disable detection in specific worldsdetector.whitelisted-uuidsin config.yml - exempt players by UUID without a permission pluginpunishment.notify-playerin config.yml - send a warning to the player when punishment triggers{world}and{ping}placeholders for punishment commandsperformance.async-predictionin config.yml - run ML predictions off the main thread
Bug fixes
- Fixed alert history not being cleaned up when a player disconnects.
- Fixed hardcoded English text in
/lad dataset info(now reads from messages.yml). - Fixed IO executor not waiting for pending writes on server shutdown.
- Fixed pruneStatesIfNeeded running on every PlayerMoveEvent.
- Fixed Windows drive-letter paths passing the dataset-path security check.
- Fixed saveModel writing metadata file twice instead of once.
- Fixed String.format being called 120 times per recorded window in CSV writing.
- Fixed target() checking every entity in the bounding box without an early distance filter.
Security
- Windows drive-letter paths in dataset-path config are now rejected.
- LumoAiDetector.bypass permission added for staff and trusted players.
What you do to upgrade
- Replace the jar.
- Start the server.
- That is it.
The config and dataset from 0.1.0 are backward compatible. New config keys have safe defaults.
Full Changelog: https://github.com/isLumo/LumoAiDetector/compare/v0.1.0...v0.1.1
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:avzsux62"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:pw0YUPv0:avzsux62"
}

