
132
5
[3.3.5] - 2026-06-13
Speak your language — and a smoother stash teleport.
Added
- 5 built-in translations. Set
language:in config.yml to switch all in-game messages at once:pt_BRPortuguês do BrasilesEspañoldeDeutschruРусскийplPolski
- Your own edits in
messages.ymlstill win over the chosen translation, and anything a translation misses falls back to English. Found a wonky phrase? Corrections are very welcome on GitHub! - Updating? Add one line to your config.yml:
language: pt_BR(or whichever you want). Without it the plugin stays English.
Fixed
- Stash teleport no longer shows a scary popup. Newer Minecraft
versions ask "this command requires elevated permissions, are you
sure?" when a chat click runs a vanilla command like
/execute. Clicking stash coordinates now uses the plugin's own teleport (/adp ledger tp), which goes through without any confirmation dialog — and works the same in every world.
- 5 built-in translations. Set
[3.3.5] - 2026-06-13
Speak your language — and a smoother stash teleport.
Added
- 5 built-in translations. Set
language:in config.yml to switch all in-game messages at once:pt_BRPortuguês do BrasilesEspañoldeDeutschruРусскийplPolski
- Your own edits in
messages.ymlstill win over the chosen translation, and anything a translation misses falls back to English. Found a wonky phrase? Corrections are very welcome on GitHub! - Updating? Add one line to your config.yml:
language: pt_BR(or whichever you want). Without it the plugin stays English.
Fixed
- Stash teleport no longer shows a scary popup. Newer Minecraft
versions ask "this command requires elevated permissions, are you
sure?" when a chat click runs a vanilla command like
/execute. Clicking stash coordinates now uses the plugin's own teleport (/adp ledger tp), which goes through without any confirmation dialog — and works the same in every world.
- 5 built-in translations. Set
[3.3.4] - 2026-06-12
Get dupe alerts outside the game!
Added
- Webhook notifications — AntiDupePro can now push dupe alerts to:
- Discord (paste a channel webhook URL)
- Telegram (bot token + chat id)
- Slack (incoming webhook URL)
- Anything else via a generic JSON webhook (n8n, Zapier, your own bot)
- All off by default. Set them up in the new
notificationssection ofconfig.yml— each option has step-by-step comments. - Built-in safety rails:
min_severity(default HIGH) so small wobbles don't ping your phone.rate_limit_seconds(default 30) so an alert burst sends one message, not hundreds.- A broken webhook never affects the server — it just logs one warning per minute until it works again.
- Notifications use the same language as your
messages.yml.
Good to know
- Updating from an older version? Your existing
config.ymlis kept, so the newnotificationssection won't appear automatically. Copy it from the default config (shown in the user guide) into your file. - The ready-made translations move to a later release — webhooks were the more-requested feature.
[3.3.3] - 2026-06-12
The plugin is now translatable!
Added
- messages.yml — every message shown in-game (alerts, all
/adpcommand output) now lives inplugins/AntiDupePro/messages.yml. Translate or restyle anything you like:- Colors use
&codes (&c= red,&l= bold). {placeholders}are filled in by the plugin — keep them, but you can move them around in the sentence.- Any line you delete falls back to the built-in English text, so updates can add new messages without breaking your translation.
- Colors use
- Console logs stay English on purpose — that keeps errors searchable and makes it easier to get help.
- Ready-made translations (e.g.
messages_de.yml) are planned for 3.3.4.
- Webhook notifications — AntiDupePro can now push dupe alerts to:
[3.3.4] - 2026-06-12
Get dupe alerts outside the game!
Added
- Webhook notifications — AntiDupePro can now push dupe alerts to:
- Discord (paste a channel webhook URL)
- Telegram (bot token + chat id)
- Slack (incoming webhook URL)
- Anything else via a generic JSON webhook (n8n, Zapier, your own bot)
- All off by default. Set them up in the new
notificationssection ofconfig.yml— each option has step-by-step comments. - Built-in safety rails:
min_severity(default HIGH) so small wobbles don't ping your phone.rate_limit_seconds(default 30) so an alert burst sends one message, not hundreds.- A broken webhook never affects the server — it just logs one warning per minute until it works again.
- Notifications use the same language as your
messages.yml.
Good to know
- Updating from an older version? Your existing
config.ymlis kept, so the newnotificationssection won't appear automatically. Copy it from the default config (shown in the user guide) into your file. - The ready-made translations move to a later release — webhooks were the more-requested feature.
[3.3.3] - 2026-06-12
The plugin is now translatable!
Added
- messages.yml — every message shown in-game (alerts, all
/adpcommand output) now lives inplugins/AntiDupePro/messages.yml. Translate or restyle anything you like:- Colors use
&codes (&c= red,&l= bold). {placeholders}are filled in by the plugin — keep them, but you can move them around in the sentence.- Any line you delete falls back to the built-in English text, so updates can add new messages without breaking your translation.
- Colors use
- Console logs stay English on purpose — that keeps errors searchable and makes it easier to get help.
- Ready-made translations (e.g.
messages_de.yml) are planned for 3.3.4.
- Webhook notifications — AntiDupePro can now push dupe alerts to:
[3.3.2] - 2026-06-11
A false-alarm crackdown. If your console ever filled up with repeated
[DUPE]alerts, or honest players got flagged, this update is for you.Fixed
- Alert flood stopped. When another plugin blocked an item pickup (vault, claim and loot-protection plugins do this), AntiDupePro could spam hundreds of CRITICAL dupe alerts per second for a single item. It now waits one tick and only reacts to pickups that really happened — and a given item can only trigger that alert once.
- Worn gear counted twice. Equipped armor and offhand items were double-counted, so a worn elytra read as 2 and caused bogus "has more than the ledger says" alerts.
- Double chests were invisible. Items moved in and out of double chests weren't recorded at all, which slowly built up false alarms.
- Chest moves measured, not guessed. Shift-clicks into nearly-full chests, number-key swaps, offhand swaps, double-click gathering and drag-moves are now recorded by what actually moved. This removes a whole family of false alarms (and a loophole dupers could abuse).
- Mining drops counted correctly. Fortune could make the real drop differ from the prediction; the plugin now looks at the real drops.
- Placing blocks / dropping items is also double-checked one tick later, so other plugins undoing those actions can't skew balances.
- More stable on busy servers. Inventory checks now run on the correct thread (proper Folia support) and database writes can no longer collide with each other.
- Suspicion cools down properly. It now only fades while a player has been quiet, instead of fading constantly.
- Stash teleport links now work for stashes in the Nether and End.
Added
- Villager trades are tracked. Buying a tracked item (e.g. an enchanted book from a librarian) is now recorded properly.
- Enchanting a book is tracked — the new enchanted book is credited.
- Alert severity now follows your own
alert_thresholdssettings instead of a built-in list of "important" items.
Good to know
- If players were wrongly flagged before this update, run
/adp ledger clear <player>once to reset them. - Plugins that hand out items directly (shops, kits, vault plugins like
ElytraVaults) are invisible to any event-based tracker. AntiDupePro is
built to not punish players for that — but if a specific item still
alerts too eagerly, raise its number in
alert_thresholds(materials.yml), or ask the plugin's author to call therecordSystemGrantAPI.
[3.3.2] - 2026-06-11
A false-alarm crackdown. If your console ever filled up with repeated
[DUPE]alerts, or honest players got flagged, this update is for you.Fixed
- Alert flood stopped. When another plugin blocked an item pickup (vault, claim and loot-protection plugins do this), AntiDupePro could spam hundreds of CRITICAL dupe alerts per second for a single item. It now waits one tick and only reacts to pickups that really happened — and a given item can only trigger that alert once.
- Worn gear counted twice. Equipped armor and offhand items were double-counted, so a worn elytra read as 2 and caused bogus "has more than the ledger says" alerts.
- Double chests were invisible. Items moved in and out of double chests weren't recorded at all, which slowly built up false alarms.
- Chest moves measured, not guessed. Shift-clicks into nearly-full chests, number-key swaps, offhand swaps, double-click gathering and drag-moves are now recorded by what actually moved. This removes a whole family of false alarms (and a loophole dupers could abuse).
- Mining drops counted correctly. Fortune could make the real drop differ from the prediction; the plugin now looks at the real drops.
- Placing blocks / dropping items is also double-checked one tick later, so other plugins undoing those actions can't skew balances.
- More stable on busy servers. Inventory checks now run on the correct thread (proper Folia support) and database writes can no longer collide with each other.
- Suspicion cools down properly. It now only fades while a player has been quiet, instead of fading constantly.
- Stash teleport links now work for stashes in the Nether and End.
Added
- Villager trades are tracked. Buying a tracked item (e.g. an enchanted book from a librarian) is now recorded properly.
- Enchanting a book is tracked — the new enchanted book is credited.
- Alert severity now follows your own
alert_thresholdssettings instead of a built-in list of "important" items.
Good to know
- If players were wrongly flagged before this update, run
/adp ledger clear <player>once to reset them. - Plugins that hand out items directly (shops, kits, vault plugins like
ElytraVaults) are invisible to any event-based tracker. AntiDupePro is
built to not punish players for that — but if a specific item still
alerts too eagerly, raise its number in
alert_thresholds(materials.yml), or ask the plugin's author to call therecordSystemGrantAPI.
[3.3.1] - 2026-06-02
Fixed
- Chain integrity false alarm on upgrade from 3.2.x. Pre-3.3.0 entries stored a global prevHash (each entry linked to the previous one written server-wide). 3.3.0's per-player verifier expected a per-player prevHash, which meant the first entry below any player's most-recent legacy entry read as a chain break on startup. Verification now starts from the most recent CHAIN_RESET marker, and a one-time migration appends that marker for every existing player on first 3.3.1 startup. Old entries remain available for history and balance; the new chain verifies cleanly.
detection.on_confirm_commandis now included in the default config.yml. 3.3.0 documented the key but didn't write it on first launch, so fresh installs had to add it by hand.
Changed
- Startup chain-check log demoted from SEVERE to WARNING — a break is worth
attention but isn't necessarily a dupe; the message now points at
/adp ledger verify <player>for a per-player drill-down.
[3.3.1] - 2026-06-02
Fixed
- Chain integrity false alarm on upgrade from 3.2.x. Pre-3.3.0 entries stored a global prevHash (each entry linked to the previous one written server-wide). 3.3.0's per-player verifier expected a per-player prevHash, which meant the first entry below any player's most-recent legacy entry read as a chain break on startup. Verification now starts from the most recent CHAIN_RESET marker, and a one-time migration appends that marker for every existing player on first 3.3.1 startup. Old entries remain available for history and balance; the new chain verifies cleanly.
detection.on_confirm_commandis now included in the default config.yml. 3.3.0 documented the key but didn't write it on first launch, so fresh installs had to add it by hand.
Changed
- Startup chain-check log demoted from SEVERE to WARNING — a break is worth
attention but isn't necessarily a dupe; the message now points at
/adp ledger verify <player>for a per-player drill-down.
[3.3.0] - 2026-06-02
A detection-architecture overhaul that eliminates the false-positive classes seen on raid farms and trial-vault looting, without weakening real detection.
Fixed
- Raid-farm / mob-loot false positives. Mob deaths (and loot-table fills) now authorise acquisitions, so legitimate looting of evoker totems and raid drops no longer reads as a dupe. The quantity bound still flags a duped entity (more items than mobs produced).
- Negative-ledger false positives. A negative balance is proof of an unobserved acquisition (e.g. /give, a shop plugin, a tracking gap), not a dupe — duping makes a balance go positive, never negative. Reconciliation now re-baselines to the real inventory and moves on instead of flagging. This was the root cause of the "has 1 but ledger shows -146" alerts.
- Trial-vault / fast-loot false positives. Proof-of-Witness and acquisition- rate (TMAR) no longer fire standalone alerts; solo play with nobody nearby never accrues suspicion at all.
Added
- Global
detection.sensitivity(1–100, default 50). One knob from very lenient to very paranoid; scales the excess needed to alert. - Per-player adaptive suspicion. An earned floor (raised by deterministic hits and admin confirmation; does not decay) plus transient heat (low- confidence signals; decays over time). More-suspicious players trip on less.
- Confidence-tiered detection. Deterministic detectors (entity-UUID reuse) alert alone; source-bound excess and balance surplus are gated by suspicion + sensitivity; TMAR and witness patterns are heat-only signals.
- Admin verdict loop.
/adp ledger confirm <player>pins suspicion high and optionally runsdetection.on_confirm_command({player} placeholder);/adp ledger clear <player>marks a false positive and resets suspicion. - Baseline-on-join. A never-seen player's owned inventory seeds their ledger once, so pre-existing items don't read as a surplus.
console_log_level(CRITICAL/ERROR/WARNING/INFO/DEBUG) to control verbosity.
Changed
- Source-bound matching consumes authorisations across multiple nearby drops (fixes a latent excess false-flag when single drops merge into one ground stack), and is chunk-keyed for O(nearby) performance under farm volume.
- TMAR and Proof-of-Witness demoted from triggers to low-confidence signals.
[3.2.0] - 2026-05-31
Added
/adp ledger stash <player>— new admin command that lists a player's recent CONTAINER_PUT / ENTITY_PUT / FRAME_PUT events with clickable coordinates. Clicking the coords runs/execute in <world> run tp @s x y zso the admin teleports directly to the stash location, including across worlds. Built on the Spigot/Bukkit BaseComponent API so it works identically on Spigot, Paper and Folia.- The current-suspects display now explains what
material: +Nmeans (cumulative excess across all of that suspect's violations) and points admins at the new stash command.
Notes
- Adventure / MiniMessage was considered for click events but not used, because Adventure isn't available on Spigot. The BungeeCord-style BaseComponent API is present on every supported platform.
[3.2.0] - 2026-05-31
Added
/adp ledger stash <player>— new admin command that lists a player's recent CONTAINER_PUT / ENTITY_PUT / FRAME_PUT events with clickable coordinates. Clicking the coords runs/execute in <world> run tp @s x y zso the admin teleports directly to the stash location, including across worlds. Built on the Spigot/Bukkit BaseComponent API so it works identically on Spigot, Paper and Folia.- The current-suspects display now explains what
material: +Nmeans (cumulative excess across all of that suspect's violations) and points admins at the new stash command.
Notes
- Adventure / MiniMessage was considered for click events but not used, because Adventure isn't available on Spigot. The BungeeCord-style BaseComponent API is present on every supported platform.
[3.1.0] - 2026-05-31
Added
- Deep container reconciliation. The balance check now recursively descends into shulker boxes, barrels, chests-stored-as-items and bundles at every nesting level (up to 10 deep). Closes the "items hidden inside a held shulker" blind spot — a player carrying a duped shulker full of diamonds used to show a clean balance against an empty main inventory; the deep scan counts the contents and surfaces the discrepancy.
- Deep foreign-item detection.
findForeignItemsDeepwalks the same nesting tree and reports any tracked items inside containers whose owner UUID doesn't match the bearer, so admins can see exactly which slot path leads to suspicious contents.
Notes
- Recursion is bounded at depth 10 (matches the previous v1 isotope scanner limit) to defend against pathological nested-container chains.
- The shallow
countOwnedInInventory/findForeignItemsmethods are kept for callers that explicitly want a flat view.
[3.1.0] - 2026-05-31
Added
- Deep container reconciliation. The balance check now recursively descends into shulker boxes, barrels, chests-stored-as-items and bundles at every nesting level (up to 10 deep). Closes the "items hidden inside a held shulker" blind spot — a player carrying a duped shulker full of diamonds used to show a clean balance against an empty main inventory; the deep scan counts the contents and surfaces the discrepancy.
- Deep foreign-item detection.
findForeignItemsDeepwalks the same nesting tree and reports any tracked items inside containers whose owner UUID doesn't match the bearer, so admins can see exactly which slot path leads to suspicious contents.
Notes
- Recursion is bounded at depth 10 (matches the previous v1 isotope scanner limit) to defend against pathological nested-container chains.
- The shallow
countOwnedInInventory/findForeignItemsmethods are kept for callers that explicitly want a flat view.
[2.7.0] - 2026-05-30
Added
- Per-entity pickup history: every item-entity UUID is recorded the first time it's picked up. If the same UUID is ever picked up again — which only happens for chunk-load dupes, drop-pickup race dupes, and cross-server-race dupes — the second pickup is flagged as a CRITICAL dupe alert and is not credited to the player's ledger balance.
- Pickup history is persisted across server restarts and prunes automatically after 30 days. Implemented across all three storage backends (SQLite uses a new pickup_history table; Redis uses SET NX with a 30-day TTL; in-memory uses ConcurrentHashMap).
[2.6.0] - 2026-05-30
Fixed
- Long-standing double-counting bug where mining a tracked block credited the player twice — once when the block broke and once when the dropped item was picked up. The ledger now credits the pickup only, and the originating event (mine, frame take, pot break) is recorded as the pickup's source. Same fix applies to intentional item-frame takes.
- Excess pickups from a single expected drop (the dupe surplus) are no longer credited to the ledger at all, so the resulting inventory-vs-ledger gap reinforces the immediate dupe alert with a balance-reconciliation hit on the next pass.
Changed
- Ledger history entries for PICKUP now carry source attribution
(e.g.
MINE:DIAMOND_ORE|TOOL:NETHERITE_PICKAXE), so admins can see at a glance whether an acquisition came from mining, a frame, a pot break, or a generic ground pickup.
[2.5.0] - 2026-05-30
Added
- Decorated pot deposits are now recorded as container puts; the matching break registers the deposited stack as an expected drop, so deposit-then-break cycles net to zero in the ledger and any extra copies are flagged as dupes
Changed
- The block-break handler now special-cases decorated pots — their contents are treated as previously-deposited items rather than fresh "mined" drops, which removes a double-counting source for legitimate pot use
[2.4.0] - 2026-05-30
Added
- Material lists now live in their own file,
materials.yml, soconfig.ymlstays short even when many items are tracked. Holdstracked_materials,tmar_limitsandalert_thresholds. - Automatic one-time migration: existing installs that had these keys in
config.ymlget them moved tomaterials.ymlon first start of this version, and the legacy keys are removed fromconfig.yml.
Changed
- User guide updated to document the new configuration file layout.
- Material lists now live in their own file,
[2.3.0] - 2026-05-30
Added
- Workstation output tracking for smithing tables, anvils, looms, stonecutters, cartography tables and grindstones (closes the workstation-output blind spot for these recipes)
- Furnace, smoker and blast furnace output tracking on player extract
- Lectern book-take tracking (closes lectern swap dupe family)
- Ender chest transfers now recorded as container put/take
- Bundle content scanning: items stored inside bundles are now inspected just like shulker box contents, so duped items can no longer be laundered through bundles
Changed
- Audit-trail vocabulary extended with STATION_OUTPUT action
[2.2.0] - 2026-05-30
Added
- Item-frame transaction tracking: placing into and removing from frames is now ledgered
- Item-frame drop accounting: frames register exactly one expected drop on break, and any surplus pickups in that area trigger a high-severity alert (closes the piston / chunk-race item-frame dupe family)
- Entity-inventory tracking for horses, donkeys, llamas, mules, chest boats and chest minecarts
- Public API
ChainOfCustody.recordSystemGrant(...)for other plugins to declare legitimate item grants and avoid false-positive reconciliation hits
Changed
- Audit-trail vocabulary extended with FRAME_PUT, FRAME_TAKE, ENTITY_PUT, ENTITY_TAKE actions
[2.1.0] - 2026-05-30
Added
- Pluggable storage backend with three options: file-based (default), networked, and in-memory
- File-based storage works out of the box — no external services required
- New user guide covering install, configuration, and feature walkthroughs
- Configurable thresholds, cooldowns, and witness radius now read from config
Changed
- Targets Paper 1.21.x (verified up to 1.21.11)
- Default install path no longer depends on any external service
- Audit trail writes are now serialised so concurrent events keep the chain intact
Fixed
- Network connection identifiers built correctly when a password is set
- Background workers shut down cleanly on plugin disable / server reload
- Container transfers logged with correct direction and quantity
- Shift-craft amount no longer over-counts when the inventory is nearly full
- Witness history collections are now safe for concurrent access
- Large-scope key lookups replaced with cursored scans to avoid backend stalls
- Recent-acquisition checks no longer make per-entry round-trips
- Inventory snapshots are cleaned up when a player disconnects mid-session
- Offline player lookups no longer block the calling thread
Removed
- External license verification and feature gating
- Build-time obfuscation pass (release artefact is now a plain shaded jar)
Авторы
Сведения
Лицензия:
Опубликован:2 недели назад
Обновлён:1 день назад
ID проекта:
