Thank you to MrSal for the persistence, in-game testing, and bug report that kept this issue alive, and to Cronu for looking into it as well.
What changed
π§ Inventory interaction guard rewrite
The previous approach to preventing armor duplication and destruction was a blanket ban on all armor-related inventory interaction. This worked, but it was far too restrictive. Players couldn't even move a spare chestplate from their bag to a chest while wearing rainbow armor.
3.3.0 replaces this with a surgical approach. The guard now blocks only the exact interaction patterns that can actually cause a dupe or destroy a piece, and explicitly allows everything else.
β Now allowed while wearing rainbow armor
- Freely moving armor pieces between bag slots (click, drag, pick up, place down)
- Moving armor pieces into and out of external inventories (chests, barrels, shulkers, etc.)
β Still blocked β these are hard Minecraft limitations
| Action | Why it's blocked |
|---|---|
| Click on an armor slot | The animator recreates the piece next tick β dupe |
| Drag onto an armor slot | Overwrites the rainbow piece β destruction |
| Shift-click any armor item | Minecraft always auto-routes to the nearest matching armor slot β the destination can't be intercepted |
| Right-click equip from hand | Same auto-equip behaviour |
| Hotbar number-key swap involving armor | Would move a piece into or out of the rainbow slot |
π Player feedback message
Blocked actions now show a configurable chat message so players understand why the interaction didn't work, rather than items silently disappearing.
New config.yml key (added automatically on first run):
armor-shift-click-blocked-message: '&(255,150,0)You can''t equip armor while wearing rainbow armor!'π Fixes
- Fixed
ARMOR_RAW_SLOTSincorrectly including hotbar slots36β39(Paper 1.21 raw slot numbering), which was causing all hotbar interaction to be blocked - Fixed creative mode consuming cancelled armor items due to client-side prediction β items are now explicitly restored to their slot server-side
- Fixed interaction guard relying solely on
SlotType.ARMORwhich is inconsistently reported across Paper versions β now also checks raw slot numbers5β8as a fallback
Full changelog
ArmorListener: complete rewrite ofinventoryClick,inventoryDrag, andonPlayerInteractguardsConfigKey: newARMOR_SHIFT_CLICK_BLOCKED_MESSAGEentryconfig.yml: newarmor-shift-click-blocked-messagekeyREADME.md: new Armor Interaction Restrictions section documenting all allowed/blocked actions and the reason for each- Updated to API v1.21.11