LumoAiDetector icon

LumoAiDetector -----

An experimental anti-cheat that trains a local Random Forest model on your server's combat data



LumoAiDetector 0.1.1 - alert history fix, async prediction, model improvements
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 rest
  • LumoAiDetector.bypass permission - exempt a player from detection entirely
  • detector.disabled-worlds in config.yml - disable detection in specific worlds
  • detector.whitelisted-uuids in config.yml - exempt players by UUID without a permission plugin
  • punishment.notify-player in config.yml - send a warning to the player when punishment triggers
  • {world} and {ping} placeholders for punishment commands
  • performance.async-prediction in 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.
What you do to upgrade
1. Replace the jar.
2. Start the server.
3. That is it.
The config and dataset from 0.1.0 are backward compatible. New config keys have safe defaults.
----------, Jun 2, 2026
Resource Information
Author:
----------
Total Downloads: 19
First Release: Jun 1, 2026
Last Update: Jun 10, 2026
Category: ---------------
All-Time Rating:
2 ratings
Find more info at github.com...
Version -----
Released: --------------------
Downloads: ------
Version Rating:
----------------------
-- ratings