EndyDev Read the docs
Esc

How detection works

eDupeFix uses two mechanisms, because a dupe copies an item exactly, and only some items can be told apart.

1. Item ids (items that don’t stack)

Netherite and diamond gear, elytras, tridents, totems, enchanted books, shulker boxes and bundles (plus anything enchanted or renamed, by default) get a random 64-bit id, written into the item’s data. Players never see it. A dupe copies the item with its id, so:

  • Two copies in one place (one chest, one inventory) is a clone, at once.
  • One id in two places is a clone too. eDupeFix knows where every id was last seen. When an item turns up somewhere it couldn’t have come from (it wasn’t in the chest the player had open, or in the hopper’s source), it jumped. eDupeFix then looks at both places in the same tick. Found in both, it’s a confirmed clone.
  • When the old place can’t be looked at right now (an unloaded chunk, an offline player), it’s looked at when it comes back: when the chunk loads or the player joins.

Every move is history: opened and closed containers, hoppers (a whole chain of hoppers is one line), dropping and picking up, shulkers placed and broken, deaths, joining and leaving, auction houses. That history is what /edf history shows and what goes into every alert.

A shulker box carries its contents: when a shulker is cloned, the alert says what was inside, and the items inside don’t each raise an alert of their own.

2. The book of accounts (stackable items)

Spawners, netherite blocks, beacons… stack, so they can’t carry an id: an id would stop them stacking. eDupeFix counts them instead, in every player’s inventory (shulker contents included). It counts each time they close an inventory, every minute, and when they join or leave. Whatever a player gains has to be explained by something eDupeFix saw:

  • items picked up from the ground, taken out of a container, bought or claimed on an auction house, taken from a furnace or returned from the vault: exact amounts;
  • crafting, villager trades, breaking a watched block (spawner plugins), a trusted command (/kit, /shop…), a trusted menu, a console command that names the player (crates, votes): everything gained in the next few seconds.

What’s left adds up over 10 minutes. At the material’s medium limit staff hear about it; at high the unexplained amount is confiscated. The alert says what part was explained, and which menu or command the player had just used.

Containers keep a count too: what a chest had when it was last closed, plus what hoppers put in or took out. A chest that gained watched items on its own catches chunk, piston and rollback dupes.

What each alert means

AlertSeverityMeans
Duplicated: in two places at onceCRITICALOne id found at both places in the same tick
Duplicated: two copies in one placeCRITICALOne id twice in one inventory or container
Probably duplicatedMEDIUMThe original was still there, but the new copy had already moved on
Unexplained gain (player or container)HIGH / MEDIUMPast the material’s high or medium limit
Copy of a creative-mode itemLOWCreative mode clones items as a feature
TemplateLOWOne id copied many times: usually a kit or shop item (/edf untag)

What each severity does is up to you (actions in config.yml). By default CRITICAL and HIGH confiscate, and everything from MEDIUM up is told to staff and Discord.

Confiscating

The copy that appeared from nowhere (copy B) goes to the vault; copy A stays. Which one is the “original” can’t be known: they’re identical. Staff open /edf vault and return it (to its owner, now or when they next join) or delete it. A returned item gets a new id, so it’s a separate item from then on.

What it can’t see

  • Items duped before eDupeFix first saw them get different ids. eDupeFix gives ids at every chance (opening a chest, closing an inventory, joining, every minute) to keep that window short.
  • Plugins that move items without events (some backpacks, /invsee edits by other plugins, chest sorters) make items jump. That’s shown in the history as “appeared with no recorded way”, and it’s an alert only when the old copy is still there.
  • Kit and shop plugins that saved an item after it got an id hand out copies of it. eDupeFix takes such an id for a template after template-after clones. Take the id off the template with /edf untag.
  • On Folia, items lying on the ground can’t be looked up by id from another region, so ground copies are only compared when picked up.