fix(D-01/A): adversarial review fixes — 4 logic bugs

1. NECK region explicitly blocked in interactLivingEntity() — prevents
   V2 collars equipping without ownership setup (latent, no JSONs yet)

2. Swap rollback safety: if re-equip fails after swap failure, drop the
   old bind as item entity instead of losing it silently

3. GaggingComponent: cache GagMaterial at construction time — eliminates
   valueOf() log spam on every chat message with misconfigured material

4. Dual-bind prevention: check both V1 isTiedUp() AND V2 region occupied
   in TyingInteractionHelper and PacketSelfBondage to prevent equipping
   V2 bind on top of V1 bind
This commit is contained in:
NotEvil
2026-04-14 16:48:50 +02:00
parent b97bdf367e
commit df56ebb6bc
4 changed files with 35 additions and 18 deletions

View File

@@ -248,8 +248,8 @@ public class PacketSelfBondage {
IV2BondageItem v2Item,
IBondageState state
) {
// Can't self-tie if already tied
if (state.isTiedUp()) {
// Can't self-tie if already tied (check both V1 state and V2 region to prevent dual-bind)
if (state.isTiedUp() || V2EquipmentHelper.isRegionOccupied(player, BodyRegionV2.ARMS)) {
TiedUpMod.LOGGER.debug("[SelfBondage] {} tried V2 self-tie but already tied", player.getName().getString());
return;
}