From a71093ba9ce54be056a1e83531e32aab34292fc6 Mon Sep 17 00:00:00 2001 From: NotEvil Date: Sun, 12 Apr 2026 01:24:49 +0200 Subject: [PATCH] Remove internal phase comments and format code Strip all Phase references, TODO/FUTURE roadmap notes, and internal planning comments from the codebase. Run Prettier for consistent formatting across all Java files. --- Makefile | 10 + .../tiedup/remake/blocks/BlockCellDoor.java | 1 - .../tiedup/remake/blocks/BlockKidnapBomb.java | 11 - .../tiedup/remake/blocks/BlockRopeTrap.java | 15 - .../remake/blocks/BlockTrappedChest.java | 9 - .../tiedup/remake/blocks/ICanBeLoaded.java | 1 - .../com/tiedup/remake/blocks/ModBlocks.java | 11 - .../blocks/entity/BondageItemBlockEntity.java | 23 - .../blocks/entity/IBondageItemHolder.java | 17 - .../blocks/entity/KidnapBombBlockEntity.java | 1 - .../blocks/entity/ModBlockEntities.java | 9 - .../remake/blocks/entity/TrapBlockEntity.java | 1 - .../entity/TrappedChestBlockEntity.java | 7 - .../java/com/tiedup/remake/bounty/Bounty.java | 1 - .../tiedup/remake/bounty/BountyManager.java | 3 +- .../tiedup/remake/cells/CampMaidManager.java | 11 +- .../tiedup/remake/cells/CampOwnership.java | 1 - .../cells/ConfiscatedInventoryRegistry.java | 1 - .../client/FirstPersonMittensRenderer.java | 5 +- .../tiedup/remake/client/ModKeybindings.java | 61 +- .../animation/BondageAnimationManager.java | 96 +- .../animation/context/AnimationContext.java | 1 - .../context/AnimationContextResolver.java | 46 +- .../context/ContextAnimationFactory.java | 43 +- .../animation/context/ContextGlbRegistry.java | 30 +- .../context/GlbAnimationResolver.java | 19 +- .../animation/context/RegionBoneMapper.java | 128 ++- .../render/DogPoseRenderHandler.java | 2 +- .../animation/render/PetBedRenderHandler.java | 2 +- .../render/PlayerArmHideEventHandler.java | 8 +- .../animation/tick/AnimationTickHandler.java | 67 +- .../tick/NpcAnimationTickHandler.java | 53 +- .../animation/util/AnimationIdBuilder.java | 2 - .../events/BlindfoldRenderEventHandler.java | 5 +- .../events/LeashProxyClientHandler.java | 2 +- .../events/SelfBondageInputHandler.java | 2 +- .../tiedup/remake/client/gltf/GlbParser.java | 306 ++++-- .../remake/client/gltf/GlbParserUtils.java | 95 +- .../client/gltf/GltfAnimationApplier.java | 167 +++- .../remake/client/gltf/GltfBoneMapper.java | 23 +- .../tiedup/remake/client/gltf/GltfCache.java | 3 +- .../remake/client/gltf/GltfClientSetup.java | 77 +- .../tiedup/remake/client/gltf/GltfData.java | 216 +++-- .../client/gltf/GltfLiveBoneReader.java | 58 +- .../remake/client/gltf/GltfMeshRenderer.java | 110 ++- .../remake/client/gltf/GltfPoseConverter.java | 279 ++++-- .../remake/client/gltf/GltfRenderLayer.java | 26 +- .../client/gltf/GltfSkinningEngine.java | 99 +- .../client/gui/overlays/ProgressOverlay.java | 1 - .../client/gui/overlays/StatusOverlay.java | 1 - .../gui/overlays/UntieTooltipOverlay.java | 2 +- .../client/gui/screens/AdjustmentScreen.java | 3 +- .../client/gui/screens/CellManagerScreen.java | 2 +- .../gui/screens/CellSelectorScreen.java | 2 +- .../client/gui/screens/CommandWandScreen.java | 26 +- .../gui/screens/ConversationScreen.java | 2 - .../gui/screens/LockpickMiniGameScreen.java | 1 - .../gui/screens/NpcInventoryScreen.java | 2 +- .../client/gui/screens/PetRequestScreen.java | 1 - .../gui/screens/RemoteAdjustmentScreen.java | 3 +- .../gui/screens/SlaveManagementScreen.java | 6 +- .../gui/screens/UnifiedBondageScreen.java | 198 +++- .../remake/client/gui/util/GuiColors.java | 15 +- .../remake/client/gui/util/GuiRenderUtil.java | 168 +++- .../client/gui/widgets/ActionPanel.java | 443 +++++++-- .../client/gui/widgets/AdjustmentSlider.java | 1 - .../client/gui/widgets/CellListRenderer.java | 6 +- .../gui/widgets/EntityPreviewWidget.java | 1 - .../client/gui/widgets/ItemPickerOverlay.java | 264 +++++- .../client/gui/widgets/RegionSlotWidget.java | 103 +- .../client/gui/widgets/RegionTabBar.java | 168 +++- .../client/gui/widgets/SlaveEntryWidget.java | 2 +- .../client/gui/widgets/StatusBarWidget.java | 172 +++- .../remake/client/model/DamselModel.java | 30 +- .../client/renderer/DamselRenderer.java | 6 +- .../client/renderer/KidnapBombRenderer.java | 1 - .../client/renderer/RopeArrowRenderer.java | 1 - .../renderer/layers/ClothesRenderHelper.java | 2 +- .../client/state/ClothesClientCache.java | 2 +- .../client/state/CollarRegistryClient.java | 1 - .../state/MovementStyleClientState.java | 3 +- .../client/texture/DynamicOnlineTexture.java | 2 +- .../client/texture/DynamicTextureManager.java | 2 +- .../tiedup/remake/commands/BountyCommand.java | 3 +- .../tiedup/remake/commands/CollarCommand.java | 4 +- .../tiedup/remake/commands/CommandHelper.java | 4 +- .../tiedup/remake/commands/KeyCommand.java | 2 +- .../remake/commands/KidnapSetCommand.java | 2 +- .../tiedup/remake/commands/NPCCommand.java | 32 +- .../tiedup/remake/commands/SocialCommand.java | 8 +- .../subcommands/BondageSubCommand.java | 137 ++- .../commands/subcommands/DebtSubCommand.java | 6 +- .../subcommands/InventorySubCommand.java | 12 +- .../subcommands/MasterTestSubCommand.java | 21 +- .../subcommands/TestAnimSubCommand.java | 34 +- .../remake/compat/mca/MCABondageManager.java | 12 +- .../compat/mca/ai/MCABondageAIController.java | 12 - .../mca/capability/MCAKidnappedAdapter.java | 59 +- .../capability/MCAKidnappedCapability.java | 29 +- .../mca/dialogue/MCADialogueManager.java | 14 - .../compat/mca/event/MCACompatEvents.java | 6 +- .../mca/personality/MCAMoodManager.java | 4 - .../personality/MCAPersonalityManager.java | 10 +- .../wildfire/render/WildfireDamselLayer.java | 6 +- .../com/tiedup/remake/core/ModConfig.java | 24 +- .../tiedup/remake/core/SettingsAccessor.java | 152 ++- .../remake/core/SystemMessageManager.java | 12 - .../com/tiedup/remake/core/TiedUpMod.java | 38 +- .../remake/dialogue/DialogueBridge.java | 4 +- .../remake/dialogue/DialogueContext.java | 2 +- .../remake/dialogue/DialogueLoader.java | 4 +- .../remake/dialogue/DialogueManager.java | 2 +- .../dialogue/DialogueTriggerSystem.java | 4 +- .../dialogue/EntityDialogueManager.java | 13 - .../remake/dialogue/GagTalkManager.java | 5 - .../remake/dialogue/IDialogueSpeaker.java | 2 +- .../KidnapperDialogueTriggerSystem.java | 2 +- .../conversation/ConversationManager.java | 8 +- .../ConversationRefusalReason.java | 1 - .../conversation/ConversationTopic.java | 1 - .../conversation/PetRequestManager.java | 7 +- .../dialogue/conversation/TopicEffect.java | 1 - .../dispenser/ClothesDispenseBehavior.java | 2 +- .../GenericBondageDispenseBehavior.java | 2 - .../remake/entities/AbstractTiedUpNpc.java | 108 +-- .../entities/BondageServiceHandler.java | 12 +- .../remake/entities/DamselRewardTracker.java | 10 +- .../tiedup/remake/entities/DamselVariant.java | 1 - .../tiedup/remake/entities/EntityDamsel.java | 183 ++-- .../remake/entities/EntityDamselShiny.java | 26 +- .../remake/entities/EntityKidnapBomb.java | 5 +- .../remake/entities/EntityKidnapper.java | 177 ++-- .../entities/EntityKidnapperArcher.java | 38 +- .../remake/entities/EntityKidnapperElite.java | 20 +- .../entities/EntityKidnapperMerchant.java | 55 +- .../tiedup/remake/entities/EntityMaid.java | 61 +- .../tiedup/remake/entities/EntityMaster.java | 150 ++- .../remake/entities/EntityRopeArrow.java | 7 +- .../remake/entities/EntitySlaveTrader.java | 42 +- .../entities/KidnapperCaptureEquipment.java | 10 +- .../entities/KidnapperCollarConfig.java | 14 +- .../entities/KidnapperItemSelector.java | 8 +- .../remake/entities/KidnapperJobManager.java | 12 +- .../remake/entities/LeashProxyEntity.java | 2 +- .../tiedup/remake/entities/ModEntities.java | 18 +- .../tiedup/remake/entities/NpcTypeHelper.java | 1 + .../remake/entities/ai/StuckDetector.java | 2 +- .../ai/damsel/DamselFleeFromPlayerGoal.java | 5 +- .../entities/ai/damsel/DamselPanicGoal.java | 1 - .../entities/ai/damsel/DamselWanderGoal.java | 1 - .../ai/damsel/DamselWatchPlayerGoal.java | 1 - .../kidnapper/AbstractKidnapperFleeGoal.java | 1 - .../ai/kidnapper/KidnapperAlertGoal.java | 1 - .../kidnapper/KidnapperArcherRangedGoal.java | 1 - .../kidnapper/KidnapperBringToCellGoal.java | 3 +- .../ai/kidnapper/KidnapperCaptureGoal.java | 4 +- .../KidnapperDecideNextActionGoal.java | 3 +- .../ai/kidnapper/KidnapperFindTargetGoal.java | 1 - .../ai/kidnapper/KidnapperFleeSafeGoal.java | 1 - .../KidnapperFleeWithCaptiveGoal.java | 1 - .../ai/kidnapper/KidnapperPatrolGoal.java | 1 - .../ai/kidnapper/KidnapperPunishGoal.java | 1 - .../entities/ai/kidnapper/KidnapperState.java | 1 - .../kidnapper/KidnapperWaitForBuyerGoal.java | 1 - .../ai/kidnapper/KidnapperWaitForJobGoal.java | 3 +- .../kidnapper/KidnapperWalkPrisonerGoal.java | 7 +- .../ai/maid/MaidCollectRansomGoal.java | 4 - .../ai/maid/MaidDeliverCaptiveGoal.java | 2 +- .../ai/maid/goals/MaidAssignTaskGoal.java | 6 +- .../ai/maid/goals/MaidReturnGoal.java | 11 +- .../ai/master/MasterBuyPlayerGoal.java | 26 +- .../entities/ai/master/MasterDogwalkGoal.java | 2 +- .../ai/master/MasterHumanChairGoal.java | 14 +- .../ai/master/MasterPlaceBlockGoal.java | 2 - .../ai/master/MasterRandomEventGoal.java | 15 +- .../ai/master/MasterTaskAssignGoal.java | 2 - .../ai/master/MasterTaskWatchGoal.java | 2 +- .../ai/personality/AbstractNpcJobGoal.java | 40 +- .../ai/personality/NpcFarmCommandGoal.java | 63 +- .../ai/personality/NpcFishCommandGoal.java | 88 +- .../ai/personality/NpcFollowCommandGoal.java | 6 +- .../ai/personality/NpcGoalHelper.java | 2 +- .../ai/personality/NpcGuardCommandGoal.java | 6 +- .../ai/personality/NpcIdleCommandGoal.java | 2 +- .../ai/personality/NpcStruggleGoal.java | 12 +- .../ArmorStandBondageClientCache.java | 5 +- .../armorstand/ArmorStandBondageHelper.java | 31 +- .../ArmorStandInteractionHandler.java | 6 +- .../damsel/components/DamselAIController.java | 15 - .../components/DamselAnimationController.java | 15 +- .../damsel/components/DamselAppearance.java | 15 +- .../components/DamselBondageManager.java | 386 ++++++-- .../components/DamselDataSerializer.java | 5 - .../components/DamselDialogueHandler.java | 5 - .../components/DamselInventoryManager.java | 25 +- .../components/DamselPersonalitySystem.java | 29 +- .../entities/damsel/components/IAIHost.java | 9 - .../damsel/components/IAnimationHost.java | 7 - .../damsel/components/IBondageHost.java | 1 - .../damsel/components/IDialogueHost.java | 1 - .../components/IPersonalityTickContext.java | 1 - .../components/NpcCaptivityManager.java | 19 +- .../components/NpcEquipmentManager.java | 117 +-- .../remake/entities/damsel/hosts/AIHost.java | 9 - .../entities/damsel/hosts/AnimationHost.java | 6 +- .../entities/damsel/hosts/BondageHost.java | 1 - .../entities/damsel/hosts/DialogueHost.java | 1 - .../hosts/PersonalityTickContextHost.java | 3 +- .../kidnapper/components/IAIHost.java | 26 +- .../kidnapper/components/IAggressionHost.java | 2 +- .../kidnapper/components/IAppearanceHost.java | 2 +- .../kidnapper/components/ICaptiveHost.java | 2 +- .../kidnapper/components/ICellHost.java | 2 +- .../components/IDataSerializerHost.java | 8 - .../kidnapper/components/ISaleHost.java | 2 +- .../kidnapper/components/ITargetHost.java | 2 +- .../components/KidnapperAIManager.java | 9 +- .../components/KidnapperAggressionSystem.java | 19 +- .../components/KidnapperAlertManager.java | 19 +- .../components/KidnapperAppearance.java | 15 +- .../components/KidnapperCampManager.java | 11 - .../components/KidnapperCaptiveManager.java | 27 +- .../components/KidnapperCellManager.java | 17 +- .../components/KidnapperDataSerializer.java | 7 - .../components/KidnapperSaleManager.java | 15 - .../components/KidnapperStateManager.java | 9 - .../components/KidnapperTargetSelector.java | 25 +- .../entities/kidnapper/hosts/AIHost.java | 24 - .../kidnapper/hosts/AggressionHost.java | 3 +- .../kidnapper/hosts/AppearanceHost.java | 3 +- .../entities/kidnapper/hosts/BondageHost.java | 1 - .../entities/kidnapper/hosts/CampHost.java | 1 - .../entities/kidnapper/hosts/CaptiveHost.java | 2 +- .../entities/kidnapper/hosts/CellHost.java | 2 +- .../kidnapper/hosts/DataSerializerHost.java | 8 - .../entities/kidnapper/hosts/SaleHost.java | 2 +- .../entities/kidnapper/hosts/StateHost.java | 1 - .../entities/kidnapper/hosts/TargetHost.java | 2 +- .../components/MaidPrisonInteraction.java | 31 +- .../maid/components/MaidTraderLink.java | 18 - .../master/components/MasterPetManager.java | 29 +- .../master/components/MasterStateManager.java | 16 - .../master/components/MasterTaskManager.java | 18 +- .../entities/skins/EntitySkinRegistry.java | 1 - .../entities/skins/MaidSkinManager.java | 1 - .../remake/entities/skins/SkinDefinition.java | 1 - .../remake/entities/skins/SkinLoader.java | 1 - .../entities/skins/SkinReloadListener.java | 1 - .../entities/skins/TraderSkinManager.java | 1 - .../events/camp/CampManagementHandler.java | 5 +- .../captivity/ForcedSeatingHandler.java | 9 +- .../captivity/PlayerEnslavementHandler.java | 26 +- .../interaction/DialogueTickHandler.java | 1 - .../KidnapperInteractionEventHandler.java | 4 +- .../lifecycle/CapabilityEventHandler.java | 44 +- .../lifecycle/PlayerDisconnectHandler.java | 4 +- .../lifecycle/PlayerLifecycleHandler.java | 19 +- .../lifecycle/PlayerStateEventHandler.java | 6 +- .../BondageItemRestrictionHandler.java | 48 +- .../LaborToolProtectionHandler.java | 2 +- .../PetPlayRestrictionHandler.java | 10 +- .../restriction/RestraintTaskTickHandler.java | 23 +- .../events/system/AnvilEventHandler.java | 1 - .../events/system/BountyDeliveryHandler.java | 3 +- .../events/system/CellV2EventHandler.java | 2 +- .../events/system/ChatEventHandler.java | 12 +- .../events/system/MiniGameTickHandler.java | 5 +- .../com/tiedup/remake/items/GenericKnife.java | 5 +- .../tiedup/remake/items/GenericMittens.java | 1 - .../remake/items/ItemChloroformBottle.java | 1 - .../tiedup/remake/items/ItemChokeCollar.java | 2 - .../remake/items/ItemClassicCollar.java | 1 - .../tiedup/remake/items/ItemCommandWand.java | 2 +- .../tiedup/remake/items/ItemDebugWand.java | 7 +- .../tiedup/remake/items/ItemGpsCollar.java | 1 - .../tiedup/remake/items/ItemGpsLocator.java | 7 +- .../com/tiedup/remake/items/ItemHood.java | 1 - .../java/com/tiedup/remake/items/ItemKey.java | 12 +- .../com/tiedup/remake/items/ItemLockpick.java | 1 - .../tiedup/remake/items/ItemMasterKey.java | 8 +- .../tiedup/remake/items/ItemMedicalGag.java | 1 - .../com/tiedup/remake/items/ItemPaddle.java | 5 +- .../com/tiedup/remake/items/ItemPadlock.java | 1 - .../java/com/tiedup/remake/items/ItemRag.java | 1 - .../tiedup/remake/items/ItemRopeArrow.java | 1 - .../remake/items/ItemShockCollarAuto.java | 2 - .../remake/items/ItemShockerController.java | 12 +- .../com/tiedup/remake/items/ItemWhip.java | 10 +- .../tiedup/remake/items/ModCreativeTabs.java | 18 +- .../com/tiedup/remake/items/ModItems.java | 2 - .../tiedup/remake/items/base/BindVariant.java | 4 +- .../remake/items/base/IHasResistance.java | 6 - .../tiedup/remake/items/base/ILockable.java | 4 +- .../tiedup/remake/items/base/ItemBind.java | 84 +- .../remake/items/base/ItemBlindfold.java | 7 +- .../tiedup/remake/items/base/ItemCollar.java | 70 +- .../remake/items/base/ItemEarplugs.java | 6 +- .../com/tiedup/remake/items/base/ItemGag.java | 8 +- .../tiedup/remake/items/base/ItemMittens.java | 6 +- .../remake/items/base/ItemOwnerTarget.java | 42 +- .../remake/items/base/MittensVariant.java | 2 +- .../tiedup/remake/items/base/PoseType.java | 1 - .../remake/items/clothes/GenericClothes.java | 4 +- .../com/tiedup/remake/labor/LaborTask.java | 2 +- .../remake/labor/LaborTaskGenerator.java | 2 +- .../minigame/LockpickMiniGameState.java | 1 - .../minigame/MiniGameSessionManager.java | 6 +- .../minigame/StruggleSessionManager.java | 179 +++- .../mixin/MixinLivingEntityBodyRot.java | 2 +- .../remake/mixin/MixinMCAMessenger.java | 2 +- .../remake/mixin/MixinMCAOpenAIChatAI.java | 2 +- .../mixin/MixinMCAVillagerInteraction.java | 4 +- .../remake/mixin/MixinMCAVillagerLeash.java | 2 +- .../remake/mixin/client/MixinCamera.java | 2 +- .../remake/mixin/client/MixinPlayerModel.java | 2 +- .../MixinVillagerEntityBaseModelMCA.java | 19 +- .../MixinVillagerEntityMCAAnimated.java | 2 - .../com/tiedup/remake/network/ModNetwork.java | 525 ++++++++-- .../remake/network/NetworkEventHandler.java | 104 +- .../remake/network/action/PacketStruggle.java | 1 - .../remake/network/action/PacketTighten.java | 5 +- .../network/base/AbstractProgressPacket.java | 1 - .../network/bounty/PacketDeleteBounty.java | 1 - .../network/bounty/PacketRequestBounties.java | 1 - .../network/bounty/PacketSendBounties.java | 1 - .../cell/PacketAssignCellToCollar.java | 2 +- .../network/cell/PacketOpenCellManager.java | 11 +- .../network/cell/PacketOpenCellSelector.java | 11 +- .../network/cell/PacketOpenCoreMenu.java | 1 + .../network/cell/PacketSyncCellData.java | 5 +- .../PacketEndConversationC2S.java | 42 +- .../PacketEndConversationS2C.java | 1 + .../conversation/PacketOpenConversation.java | 1 - .../PacketRequestConversation.java | 1 - .../conversation/PacketSelectTopic.java | 1 - .../remake/network/item/PacketAdjustItem.java | 3 +- .../network/item/PacketAdjustRemote.java | 7 +- .../labor/PacketSyncLaborProgress.java | 1 + .../network/master/PacketMasterStateSync.java | 8 +- .../PacketContinuousStruggleState.java | 19 +- .../minigame/PacketLockpickAttempt.java | 56 +- .../minigame/PacketLockpickMiniGameMove.java | 1 - .../PacketLockpickMiniGameResult.java | 15 +- .../minigame/PacketLockpickMiniGameStart.java | 5 +- .../minigame/PacketLockpickMiniGameState.java | 5 +- .../network/personality/NpcCommandType.java | 2 +- .../network/personality/PacketNpcCommand.java | 286 ++++-- .../PacketRequestNpcInventory.java | 2 +- .../personality/PacketSlaveBeingFreed.java | 1 - .../selfbondage/PacketSelfBondage.java | 26 +- .../network/slave/PacketMasterEquip.java | 61 +- .../network/slave/PacketSlaveAction.java | 16 +- .../network/slave/PacketSlaveItemManage.java | 30 +- .../network/sync/PacketPlayTestAnimation.java | 10 +- .../network/sync/PacketSyncMovementStyle.java | 20 +- .../network/sync/PacketSyncPetBedState.java | 25 +- .../remake/network/sync/SyncManager.java | 11 +- .../network/trader/PacketBuyCaptive.java | 2 +- .../trader/PacketOpenTraderScreen.java | 14 +- .../remake/personality/CellQuality.java | 2 +- .../tiedup/remake/personality/HomeType.java | 2 +- .../remake/personality/PersonalityState.java | 2 +- .../com/tiedup/remake/prison/RansomData.java | 29 +- .../remake/prison/service/BondageService.java | 2 +- .../remake/prison/service/ItemService.java | 2 +- .../prison/service/PrisonerService.java | 36 +- .../tiedup/remake/state/CollarRegistry.java | 1 - .../tiedup/remake/state/IBondageState.java | 35 +- .../java/com/tiedup/remake/state/ICaptor.java | 36 +- .../com/tiedup/remake/state/ICapturable.java | 11 +- .../com/tiedup/remake/state/ICoercible.java | 8 +- .../remake/state/IRestrainableEntity.java | 70 +- .../com/tiedup/remake/state/ISaleable.java | 1 - .../tiedup/remake/state/PlayerBindState.java | 104 +- .../remake/state/PlayerCaptorManager.java | 43 +- .../com/tiedup/remake/state/SocialData.java | 1 - .../state/components/PlayerCaptivity.java | 9 +- .../components/PlayerClothesPermission.java | 21 +- .../state/components/PlayerDataRetrieval.java | 36 +- .../state/components/PlayerEquipment.java | 154 ++- .../state/components/PlayerLifecycle.java | 3 +- .../remake/state/components/PlayerSale.java | 1 - .../state/components/PlayerShockCollar.java | 4 +- .../components/PlayerSpecialActions.java | 3 - .../state/components/PlayerStateQuery.java | 52 +- .../state/components/PlayerStruggle.java | 2 - .../components/PlayerTaskManagement.java | 1 - .../state/struggle/StruggleAccessory.java | 7 +- .../remake/state/struggle/StruggleBinds.java | 38 +- .../remake/state/struggle/StruggleCollar.java | 32 +- .../remake/state/struggle/StruggleState.java | 12 +- .../tiedup/remake/tasks/PlayerStateTask.java | 1 - .../remake/tasks/TimedInteractTask.java | 2 - .../com/tiedup/remake/tasks/TimedTask.java | 1 - .../tiedup/remake/tasks/TyingPlayerTask.java | 29 +- .../com/tiedup/remake/tasks/TyingTask.java | 2 - .../remake/tasks/UntyingPlayerTask.java | 19 +- .../com/tiedup/remake/tasks/UntyingTask.java | 2 - .../remake/tasks/V2TyingPlayerTask.java | 4 +- .../com/tiedup/remake/util/FoodEffects.java | 2 +- .../com/tiedup/remake/util/GagMaterial.java | 4 - .../com/tiedup/remake/util/GameConstants.java | 1 - .../com/tiedup/remake/util/ItemNBTHelper.java | 14 +- .../tiedup/remake/util/KidnapExplosion.java | 3 +- .../tiedup/remake/util/KidnappedHelper.java | 8 +- .../tiedup/remake/util/MessageDispatcher.java | 16 +- .../com/tiedup/remake/util/ModGameRules.java | 47 +- .../com/tiedup/remake/util/NameGenerator.java | 1 - .../remake/util/RestraintApplicator.java | 3 +- .../remake/util/RestraintEffectUtils.java | 8 +- .../com/tiedup/remake/util/TiedUpSounds.java | 1 - .../tiedup/remake/util/ValidationHelper.java | 2 +- .../tiedup/remake/util/tasks/ItemTask.java | 9 - .../tiedup/remake/util/tasks/JobLoader.java | 1 - .../tiedup/remake/util/tasks/SaleLoader.java | 1 - .../tiedup/remake/util/teleport/Position.java | 6 - .../remake/util/teleport/TeleportHelper.java | 4 +- .../com/tiedup/remake/util/time/Timer.java | 1 - .../com/tiedup/remake/v2/BodyRegionV2.java | 2 +- .../java/com/tiedup/remake/v2/V2Blocks.java | 2 - .../java/com/tiedup/remake/v2/V2Items.java | 2 - .../remake/v2/blocks/PetBedBlockEntity.java | 6 - .../remake/v2/blocks/PetBedManager.java | 2 +- .../remake/v2/blocks/PetBowlBlockEntity.java | 4 - .../tiedup/remake/v2/blocks/PetCageBlock.java | 6 - .../remake/v2/blocks/PetCageBlockEntity.java | 4 - .../remake/v2/blocks/PetCageManager.java | 2 +- .../v2/bondage/IV2BondageEquipment.java | 17 +- .../remake/v2/bondage/IV2BondageItem.java | 4 +- .../remake/v2/bondage/IV2EquipmentHolder.java | 1 - .../remake/v2/bondage/V2BondageItems.java | 12 +- .../remake/v2/bondage/V2EquipResult.java | 21 +- .../remake/v2/bondage/V2EquipmentManager.java | 47 +- .../capability/V2BondageEquipment.java | 47 +- .../V2BondageEquipmentProvider.java | 2 +- .../bondage/capability/V2EquipmentHelper.java | 55 +- .../bondage/client/V2BondageRenderLayer.java | 61 +- .../datadriven/DataDrivenBondageItem.java | 34 +- .../datadriven/DataDrivenItemDefinition.java | 3 +- .../datadriven/DataDrivenItemParser.java | 274 ++++-- .../datadriven/DataDrivenItemRegistry.java | 21 +- .../DataDrivenItemReloadListener.java | 66 +- .../DataDrivenItemServerReloadListener.java | 66 +- .../bondage/items/AbstractV2BondageItem.java | 42 +- .../remake/v2/bondage/items/V2Handcuffs.java | 41 +- .../v2/bondage/movement/MovementStyle.java | 9 +- .../movement/MovementStyleManager.java | 190 ++-- .../movement/MovementStyleResolver.java | 49 +- .../v2/bondage/movement/ResolvedMovement.java | 7 +- .../network/PacketSyncV2Equipment.java | 17 +- .../bondage/network/PacketV2LockToggle.java | 44 +- .../v2/bondage/network/PacketV2SelfEquip.java | 56 +- .../v2/bondage/network/PacketV2SelfLock.java | 31 +- .../bondage/network/PacketV2SelfRemove.java | 21 +- .../bondage/network/PacketV2SelfUnlock.java | 42 +- .../network/PacketV2StruggleStart.java | 19 +- .../v2/client/DataDrivenIconBakedModel.java | 11 +- .../v2/client/DataDrivenIconOverrides.java | 40 +- .../remake/v2/client/V2ClientSetup.java | 6 +- .../remake/v2/furniture/EntityFurniture.java | 232 +++-- .../v2/furniture/FurnitureFeedback.java | 7 +- .../remake/v2/furniture/FurnitureParser.java | 293 ++++-- .../v2/furniture/FurniturePlacerItem.java | 33 +- .../v2/furniture/FurnitureRegistry.java | 9 +- .../FurnitureServerReloadListener.java | 66 +- .../remake/v2/furniture/ISeatProvider.java | 1 - .../client/FurnitureAnimationContext.java | 53 +- .../client/FurnitureEntityRenderer.java | 47 +- .../furniture/client/FurnitureGlbParser.java | 897 +++++++++++++----- .../furniture/client/FurnitureGltfCache.java | 29 +- .../client/FurnitureSeatPositionHelper.java | 10 +- .../network/PacketFurnitureEscape.java | 132 ++- .../network/PacketFurnitureForcemount.java | 65 +- .../network/PacketFurnitureLock.java | 50 +- .../PacketSyncFurnitureDefinitions.java | 71 +- .../network/PacketSyncFurnitureState.java | 11 +- .../worldgen/AbstractKidnapperStructure.java | 1 - .../remake/worldgen/HangingCagePiece.java | 6 - .../worldgen/KidnapperFortressStructure.java | 1 - .../worldgen/KidnapperOutpostStructure.java | 1 - .../tiedup/remake/worldgen/ModStructures.java | 1 - .../com/tiedup/remake/worldgen/RoomTheme.java | 250 +---- 482 files changed, 8500 insertions(+), 5155 deletions(-) diff --git a/Makefile b/Makefile index 9f42f4d..b5bf0fb 100644 --- a/Makefile +++ b/Makefile @@ -138,6 +138,16 @@ idea: ## Generate IntelliJ IDEA run configurations eclipse: ## Generate Eclipse project files @$(GRADLE) eclipse +##@ Formatting + +.PHONY: format +format: ## Format code using Prettier + @npx --yes prettier --plugin prettier-plugin-java --tab-width 4 --write "src/**/*.java" + +.PHONY: check-format +check-format: ## Check code formatting + @npx --yes prettier --plugin prettier-plugin-java --tab-width 4 --check "src/**/*.java" + ##@ Information .PHONY: info diff --git a/src/main/java/com/tiedup/remake/blocks/BlockCellDoor.java b/src/main/java/com/tiedup/remake/blocks/BlockCellDoor.java index 66ea23a..43f686e 100644 --- a/src/main/java/com/tiedup/remake/blocks/BlockCellDoor.java +++ b/src/main/java/com/tiedup/remake/blocks/BlockCellDoor.java @@ -9,7 +9,6 @@ import net.minecraft.world.level.material.MapColor; /** * Cell Door Block - Iron-like door that cannot be opened by hand. * - * Phase 16: Blocks * * Features: * - Cannot be opened by clicking (requires redstone) diff --git a/src/main/java/com/tiedup/remake/blocks/BlockKidnapBomb.java b/src/main/java/com/tiedup/remake/blocks/BlockKidnapBomb.java index 1940841..9a56e03 100644 --- a/src/main/java/com/tiedup/remake/blocks/BlockKidnapBomb.java +++ b/src/main/java/com/tiedup/remake/blocks/BlockKidnapBomb.java @@ -37,7 +37,6 @@ import net.minecraft.world.phys.BlockHitResult; /** * Kidnap Bomb Block - TNT that applies bondage on explosion. * - * Phase 16: Blocks * * Features: * - TNT-like block that can be ignited @@ -61,9 +60,7 @@ public class BlockKidnapBomb ); } - // ======================================== // BLOCK ENTITY - // ======================================== @Nullable @Override @@ -82,9 +79,7 @@ public class BlockKidnapBomb : null; } - // ======================================== // EXPLOSION HANDLING - // ======================================== @Override public void onCaughtFire( @@ -139,9 +134,7 @@ public class BlockKidnapBomb } } - // ======================================== // LOADING ITEMS - // ======================================== @Override public InteractionResult use( @@ -199,9 +192,7 @@ public class BlockKidnapBomb return InteractionResult.PASS; } - // ======================================== // DROPS WITH NBT - // ======================================== @Override public List getDrops( @@ -225,9 +216,7 @@ public class BlockKidnapBomb return List.of(stack); } - // ======================================== // TOOLTIP - // ======================================== @Override public void appendHoverText( diff --git a/src/main/java/com/tiedup/remake/blocks/BlockRopeTrap.java b/src/main/java/com/tiedup/remake/blocks/BlockRopeTrap.java index c24a196..172b883 100644 --- a/src/main/java/com/tiedup/remake/blocks/BlockRopeTrap.java +++ b/src/main/java/com/tiedup/remake/blocks/BlockRopeTrap.java @@ -43,7 +43,6 @@ import net.minecraft.world.phys.shapes.VoxelShape; /** * Rope Trap Block - Trap that ties up entities when they walk on it. * - * Phase 16: Blocks * * Features: * - Flat block (1 pixel tall) placed on solid surfaces @@ -76,9 +75,7 @@ public class BlockRopeTrap extends Block implements EntityBlock, ICanBeLoaded { ); } - // ======================================== // SHAPE AND RENDERING - // ======================================== @Override public VoxelShape getShape( @@ -105,9 +102,7 @@ public class BlockRopeTrap extends Block implements EntityBlock, ICanBeLoaded { return RenderShape.MODEL; } - // ======================================== // PLACEMENT RULES - // ======================================== @Override public boolean canSurvive( @@ -159,9 +154,7 @@ public class BlockRopeTrap extends Block implements EntityBlock, ICanBeLoaded { ); } - // ======================================== // BLOCK ENTITY - // ======================================== @Nullable @Override @@ -175,9 +168,7 @@ public class BlockRopeTrap extends Block implements EntityBlock, ICanBeLoaded { return be instanceof TrapBlockEntity ? (TrapBlockEntity) be : null; } - // ======================================== // TRAP TRIGGER - // ======================================== @Override public void entityInside( @@ -239,9 +230,7 @@ public class BlockRopeTrap extends Block implements EntityBlock, ICanBeLoaded { ); } - // ======================================== // LOADING ITEMS - // ======================================== @Override public InteractionResult use( @@ -293,9 +282,7 @@ public class BlockRopeTrap extends Block implements EntityBlock, ICanBeLoaded { return InteractionResult.PASS; } - // ======================================== // DROPS WITH NBT - // ======================================== @Override public List getDrops( @@ -319,9 +306,7 @@ public class BlockRopeTrap extends Block implements EntityBlock, ICanBeLoaded { return List.of(stack); } - // ======================================== // TOOLTIP - // ======================================== @Override public void appendHoverText( diff --git a/src/main/java/com/tiedup/remake/blocks/BlockTrappedChest.java b/src/main/java/com/tiedup/remake/blocks/BlockTrappedChest.java index 2d1239c..12a5950 100644 --- a/src/main/java/com/tiedup/remake/blocks/BlockTrappedChest.java +++ b/src/main/java/com/tiedup/remake/blocks/BlockTrappedChest.java @@ -33,7 +33,6 @@ import net.minecraft.world.phys.BlockHitResult; /** * Trapped Chest Block - Chest that traps players when opened. * - * Phase 16: Blocks * * Extends vanilla ChestBlock for proper chest behavior. * Sneak + right-click to load bondage items. @@ -47,9 +46,7 @@ public class BlockTrappedChest extends ChestBlock implements ICanBeLoaded { ); } - // ======================================== // BLOCK ENTITY - // ======================================== @Override public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { @@ -67,9 +64,7 @@ public class BlockTrappedChest extends ChestBlock implements ICanBeLoaded { : null; } - // ======================================== // INTERACTION - TRAP TRIGGER - // ======================================== @Override public InteractionResult use( @@ -151,9 +146,7 @@ public class BlockTrappedChest extends ChestBlock implements ICanBeLoaded { return super.use(state, level, pos, player, hand, hit); } - // ======================================== // DROPS WITH NBT - // ======================================== @Override public List getDrops( @@ -180,9 +173,7 @@ public class BlockTrappedChest extends ChestBlock implements ICanBeLoaded { return drops; } - // ======================================== // TOOLTIP - // ======================================== @Override public void appendHoverText( diff --git a/src/main/java/com/tiedup/remake/blocks/ICanBeLoaded.java b/src/main/java/com/tiedup/remake/blocks/ICanBeLoaded.java index 71e0f52..eeca6ad 100644 --- a/src/main/java/com/tiedup/remake/blocks/ICanBeLoaded.java +++ b/src/main/java/com/tiedup/remake/blocks/ICanBeLoaded.java @@ -3,7 +3,6 @@ package com.tiedup.remake.blocks; /** * Marker interface for blocks that can have bondage items loaded into them. * - * Phase 16: Blocks * * Implemented by: * - BlockRopesTrap - applies items when entity walks on it diff --git a/src/main/java/com/tiedup/remake/blocks/ModBlocks.java b/src/main/java/com/tiedup/remake/blocks/ModBlocks.java index 5db466e..d5aa175 100644 --- a/src/main/java/com/tiedup/remake/blocks/ModBlocks.java +++ b/src/main/java/com/tiedup/remake/blocks/ModBlocks.java @@ -19,7 +19,6 @@ import net.minecraftforge.registries.RegistryObject; /** * Mod Blocks Registration * - * Phase 16: Blocks * * Handles registration of all TiedUp blocks using DeferredRegister. * @@ -40,9 +39,7 @@ public class ModBlocks { public static final DeferredRegister BLOCK_ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, TiedUpMod.MOD_ID); - // ======================================== // PADDED BLOCKS - // ======================================== /** * Base padded block properties. @@ -83,9 +80,7 @@ public class ModBlocks { ) ); - // ======================================== // TRAP BLOCKS - // ======================================== /** * Rope Trap - Flat trap that ties up entities that walk on it. @@ -114,9 +109,7 @@ public class ModBlocks { BlockTrappedChest::new ); - // ======================================== // DOOR BLOCKS - // ======================================== /** * Cell Door - Iron-like door that requires redstone to open. @@ -125,9 +118,7 @@ public class ModBlocks { public static final RegistryObject CELL_DOOR = registerDoorBlock("cell_door", BlockCellDoor::new); - // ======================================== // CELL SYSTEM BLOCKS - // ======================================== /** * Marker Block - Invisible block for cell spawn points. @@ -154,9 +145,7 @@ public class ModBlocks { BlockCellCore::new ); - // ======================================== // REGISTRATION HELPERS - // ======================================== /** * Register a block and its corresponding BlockItem. diff --git a/src/main/java/com/tiedup/remake/blocks/entity/BondageItemBlockEntity.java b/src/main/java/com/tiedup/remake/blocks/entity/BondageItemBlockEntity.java index 237c3ee..8cea85b 100644 --- a/src/main/java/com/tiedup/remake/blocks/entity/BondageItemBlockEntity.java +++ b/src/main/java/com/tiedup/remake/blocks/entity/BondageItemBlockEntity.java @@ -20,7 +20,6 @@ import net.minecraft.world.level.block.state.BlockState; /** * Base BlockEntity for blocks that store bondage items. * - * Phase 16: Blocks * * Stores up to 6 bondage items: * - Bind (ropes, chains, straitjacket, etc.) @@ -42,9 +41,7 @@ public abstract class BondageItemBlockEntity implements IBondageItemHolder { - // ======================================== // STORED ITEMS - // ======================================== private ItemStack bind = ItemStack.EMPTY; private ItemStack gag = ItemStack.EMPTY; @@ -59,9 +56,7 @@ public abstract class BondageItemBlockEntity */ private final boolean offMode; - // ======================================== // CONSTRUCTORS - // ======================================== public BondageItemBlockEntity( BlockEntityType type, @@ -81,9 +76,7 @@ public abstract class BondageItemBlockEntity this.offMode = offMode; } - // ======================================== // BIND - // ======================================== @Override public ItemStack getBind() { @@ -96,9 +89,7 @@ public abstract class BondageItemBlockEntity this.setChangedAndSync(); } - // ======================================== // GAG - // ======================================== @Override public ItemStack getGag() { @@ -111,9 +102,7 @@ public abstract class BondageItemBlockEntity this.setChangedAndSync(); } - // ======================================== // BLINDFOLD - // ======================================== @Override public ItemStack getBlindfold() { @@ -126,9 +115,7 @@ public abstract class BondageItemBlockEntity this.setChangedAndSync(); } - // ======================================== // EARPLUGS - // ======================================== @Override public ItemStack getEarplugs() { @@ -141,9 +128,7 @@ public abstract class BondageItemBlockEntity this.setChangedAndSync(); } - // ======================================== // COLLAR - // ======================================== @Override public ItemStack getCollar() { @@ -156,9 +141,7 @@ public abstract class BondageItemBlockEntity this.setChangedAndSync(); } - // ======================================== // CLOTHES - // ======================================== @Override public ItemStack getClothes() { @@ -171,9 +154,7 @@ public abstract class BondageItemBlockEntity this.setChangedAndSync(); } - // ======================================== // STATE - // ======================================== @Override public boolean isArmed() { @@ -194,9 +175,7 @@ public abstract class BondageItemBlockEntity this.setChangedAndSync(); } - // ======================================== // NBT SERIALIZATION - // ======================================== @Override public void load(CompoundTag tag) { @@ -300,9 +279,7 @@ public abstract class BondageItemBlockEntity return tag; } - // ======================================== // NETWORK SYNC - // ======================================== /** * Mark dirty and sync to clients. diff --git a/src/main/java/com/tiedup/remake/blocks/entity/IBondageItemHolder.java b/src/main/java/com/tiedup/remake/blocks/entity/IBondageItemHolder.java index a5866dc..0b27127 100644 --- a/src/main/java/com/tiedup/remake/blocks/entity/IBondageItemHolder.java +++ b/src/main/java/com/tiedup/remake/blocks/entity/IBondageItemHolder.java @@ -6,7 +6,6 @@ import net.minecraft.world.item.ItemStack; /** * Interface for BlockEntities that store bondage items. * - * Phase 16: Blocks * * Defines the contract for storing and retrieving bondage items: * - Bind (ropes, chains, etc.) @@ -19,51 +18,37 @@ import net.minecraft.world.item.ItemStack; * Based on original ITileEntityBondageItemHolder from 1.12.2 */ public interface IBondageItemHolder { - // ======================================== // BIND - // ======================================== ItemStack getBind(); void setBind(ItemStack bind); - // ======================================== // GAG - // ======================================== ItemStack getGag(); void setGag(ItemStack gag); - // ======================================== // BLINDFOLD - // ======================================== ItemStack getBlindfold(); void setBlindfold(ItemStack blindfold); - // ======================================== // EARPLUGS - // ======================================== ItemStack getEarplugs(); void setEarplugs(ItemStack earplugs); - // ======================================== // COLLAR - // ======================================== ItemStack getCollar(); void setCollar(ItemStack collar); - // ======================================== // CLOTHES - // ======================================== ItemStack getClothes(); void setClothes(ItemStack clothes); - // ======================================== // NBT SERIALIZATION - // ======================================== /** * Read bondage items from NBT. @@ -78,9 +63,7 @@ public interface IBondageItemHolder { */ CompoundTag writeBondageData(CompoundTag tag); - // ======================================== // STATE - // ======================================== /** * Check if this holder has any bondage items loaded. diff --git a/src/main/java/com/tiedup/remake/blocks/entity/KidnapBombBlockEntity.java b/src/main/java/com/tiedup/remake/blocks/entity/KidnapBombBlockEntity.java index 8fe3e21..e641de0 100644 --- a/src/main/java/com/tiedup/remake/blocks/entity/KidnapBombBlockEntity.java +++ b/src/main/java/com/tiedup/remake/blocks/entity/KidnapBombBlockEntity.java @@ -6,7 +6,6 @@ import net.minecraft.world.level.block.state.BlockState; /** * BlockEntity for kidnap bomb blocks. * - * Phase 16: Blocks * * Stores bondage items that will be applied when the bomb explodes. * Simple extension of BondageItemBlockEntity. diff --git a/src/main/java/com/tiedup/remake/blocks/entity/ModBlockEntities.java b/src/main/java/com/tiedup/remake/blocks/entity/ModBlockEntities.java index 62ba712..f23d5f8 100644 --- a/src/main/java/com/tiedup/remake/blocks/entity/ModBlockEntities.java +++ b/src/main/java/com/tiedup/remake/blocks/entity/ModBlockEntities.java @@ -10,7 +10,6 @@ import net.minecraftforge.registries.RegistryObject; /** * Mod Block Entities Registration * - * Phase 16: Blocks * * Handles registration of all TiedUp block entities using DeferredRegister. */ @@ -23,9 +22,7 @@ public class ModBlockEntities { TiedUpMod.MOD_ID ); - // ======================================== // TRAP BLOCK ENTITIES - // ======================================== /** * Trap block entity - stores bondage items for rope trap. @@ -40,9 +37,7 @@ public class ModBlockEntities { // LOW FIX: Removed BED BLOCK ENTITIES section - feature not implemented - // ======================================== // BOMB BLOCK ENTITIES - // ======================================== /** * Kidnap bomb block entity - stores bondage items for explosion effect. @@ -56,9 +51,7 @@ public class ModBlockEntities { ).build(null) ); - // ======================================== // CHEST BLOCK ENTITIES - // ======================================== /** * Trapped chest block entity - stores bondage items for when player opens it. @@ -72,9 +65,7 @@ public class ModBlockEntities { ).build(null) ); - // ======================================== // CELL SYSTEM BLOCK ENTITIES - // ======================================== /** * Marker block entity - stores cell UUID for cell system. diff --git a/src/main/java/com/tiedup/remake/blocks/entity/TrapBlockEntity.java b/src/main/java/com/tiedup/remake/blocks/entity/TrapBlockEntity.java index d584f02..f10ddf6 100644 --- a/src/main/java/com/tiedup/remake/blocks/entity/TrapBlockEntity.java +++ b/src/main/java/com/tiedup/remake/blocks/entity/TrapBlockEntity.java @@ -6,7 +6,6 @@ import net.minecraft.world.level.block.state.BlockState; /** * BlockEntity for rope trap blocks. * - * Phase 16: Blocks * * Stores bondage items that will be applied when an entity walks on the trap. * Simple extension of BondageItemBlockEntity. diff --git a/src/main/java/com/tiedup/remake/blocks/entity/TrappedChestBlockEntity.java b/src/main/java/com/tiedup/remake/blocks/entity/TrappedChestBlockEntity.java index fe6ab1e..e4db192 100644 --- a/src/main/java/com/tiedup/remake/blocks/entity/TrappedChestBlockEntity.java +++ b/src/main/java/com/tiedup/remake/blocks/entity/TrappedChestBlockEntity.java @@ -15,7 +15,6 @@ import net.minecraft.world.level.block.state.BlockState; /** * BlockEntity for trapped chest blocks. * - * Phase 16: Blocks * * Extends ChestBlockEntity for proper chest behavior, * but also stores bondage items for the trap. @@ -37,9 +36,7 @@ public class TrappedChestBlockEntity super(ModBlockEntities.TRAPPED_CHEST.get(), pos, state); } - // ======================================== // BONDAGE ITEM HOLDER IMPLEMENTATION - // ======================================== @Override public ItemStack getBind() { @@ -172,9 +169,7 @@ public class TrappedChestBlockEntity return tag; } - // ======================================== // NBT SERIALIZATION - // ======================================== @Override public void load(CompoundTag tag) { @@ -188,9 +183,7 @@ public class TrappedChestBlockEntity writeBondageData(tag); } - // ======================================== // NETWORK SYNC - // ======================================== /** * Mark dirty and sync to clients. diff --git a/src/main/java/com/tiedup/remake/bounty/Bounty.java b/src/main/java/com/tiedup/remake/bounty/Bounty.java index c9c99fc..6ea9a68 100644 --- a/src/main/java/com/tiedup/remake/bounty/Bounty.java +++ b/src/main/java/com/tiedup/remake/bounty/Bounty.java @@ -7,7 +7,6 @@ import net.minecraft.world.item.ItemStack; /** * Represents a single bounty placed on a player. * - * Phase 17: Bounty System * * A bounty is created when a player (client) offers a reward for capturing * another player (target). Anyone who delivers the target to the client diff --git a/src/main/java/com/tiedup/remake/bounty/BountyManager.java b/src/main/java/com/tiedup/remake/bounty/BountyManager.java index fe1c71c..3ec7f1b 100644 --- a/src/main/java/com/tiedup/remake/bounty/BountyManager.java +++ b/src/main/java/com/tiedup/remake/bounty/BountyManager.java @@ -1,8 +1,8 @@ package com.tiedup.remake.bounty; +import com.tiedup.remake.core.SettingsAccessor; import com.tiedup.remake.core.SystemMessageManager; import com.tiedup.remake.core.TiedUpMod; -import com.tiedup.remake.core.SettingsAccessor; import java.util.*; import javax.annotation.Nullable; import net.minecraft.ChatFormatting; @@ -20,7 +20,6 @@ import net.minecraft.world.level.saveddata.SavedData; /** * World-saved data manager for bounties. * - * Phase 17: Bounty System * * Manages all active bounties, handles expiration, delivery rewards, * and stores bounties for offline players. diff --git a/src/main/java/com/tiedup/remake/cells/CampMaidManager.java b/src/main/java/com/tiedup/remake/cells/CampMaidManager.java index d11d644..9812cb3 100644 --- a/src/main/java/com/tiedup/remake/cells/CampMaidManager.java +++ b/src/main/java/com/tiedup/remake/cells/CampMaidManager.java @@ -26,7 +26,11 @@ public final class CampMaidManager { * @param currentTime The current game time * @param level The server level */ - public static void markMaidDead(UUID campId, long currentTime, ServerLevel level) { + public static void markMaidDead( + UUID campId, + long currentTime, + ServerLevel level + ) { CampOwnership ownership = CampOwnership.get(level); CampOwnership.CampData data = ownership.getCamp(campId); if (data == null || !data.isAlive()) { @@ -93,7 +97,10 @@ public final class CampMaidManager { * @param level The server level * @return List of camp IDs ready for maid respawn */ - public static List getCampsNeedingMaidRespawn(long currentTime, ServerLevel level) { + public static List getCampsNeedingMaidRespawn( + long currentTime, + ServerLevel level + ) { CampOwnership ownership = CampOwnership.get(level); List result = new ArrayList<>(); for (CampOwnership.CampData data : ownership.getAllCamps()) { diff --git a/src/main/java/com/tiedup/remake/cells/CampOwnership.java b/src/main/java/com/tiedup/remake/cells/CampOwnership.java index 487d706..25afb2c 100644 --- a/src/main/java/com/tiedup/remake/cells/CampOwnership.java +++ b/src/main/java/com/tiedup/remake/cells/CampOwnership.java @@ -572,5 +572,4 @@ public class CampOwnership extends SavedData { return registry; } - } diff --git a/src/main/java/com/tiedup/remake/cells/ConfiscatedInventoryRegistry.java b/src/main/java/com/tiedup/remake/cells/ConfiscatedInventoryRegistry.java index d38739e..155bc6a 100644 --- a/src/main/java/com/tiedup/remake/cells/ConfiscatedInventoryRegistry.java +++ b/src/main/java/com/tiedup/remake/cells/ConfiscatedInventoryRegistry.java @@ -22,7 +22,6 @@ import net.minecraft.world.level.saveddata.SavedData; import org.jetbrains.annotations.Nullable; /** - * Phase 2: SavedData registry for confiscated player inventories. * * When a player is imprisoned: * 1. Their inventory is saved to NBT diff --git a/src/main/java/com/tiedup/remake/client/FirstPersonMittensRenderer.java b/src/main/java/com/tiedup/remake/client/FirstPersonMittensRenderer.java index 75aa239..5ab94da 100644 --- a/src/main/java/com/tiedup/remake/client/FirstPersonMittensRenderer.java +++ b/src/main/java/com/tiedup/remake/client/FirstPersonMittensRenderer.java @@ -139,10 +139,7 @@ public class FirstPersonMittensRenderer { */ private static boolean isBindHidingMittens(AbstractClientPlayer player) { net.minecraft.world.item.ItemStack bindStack = - V2EquipmentHelper.getInRegion( - player, - BodyRegionV2.ARMS - ); + V2EquipmentHelper.getInRegion(player, BodyRegionV2.ARMS); if (bindStack.isEmpty()) return false; if (bindStack.getItem() instanceof GenericBind bind) { BindVariant variant = bind.getVariant(); diff --git a/src/main/java/com/tiedup/remake/client/ModKeybindings.java b/src/main/java/com/tiedup/remake/client/ModKeybindings.java index 7c23660..549c617 100644 --- a/src/main/java/com/tiedup/remake/client/ModKeybindings.java +++ b/src/main/java/com/tiedup/remake/client/ModKeybindings.java @@ -1,22 +1,21 @@ package com.tiedup.remake.client; import com.mojang.blaze3d.platform.InputConstants; -import com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper; import com.tiedup.remake.client.gui.screens.AdjustmentScreen; import com.tiedup.remake.client.gui.screens.UnifiedBondageScreen; -import com.tiedup.remake.items.base.ItemCollar; -import org.jetbrains.annotations.Nullable; import com.tiedup.remake.core.ModConfig; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.items.base.ILockable; +import com.tiedup.remake.items.base.ItemCollar; import com.tiedup.remake.network.ModNetwork; import com.tiedup.remake.network.action.PacketForceSeatModifier; import com.tiedup.remake.network.action.PacketStruggle; import com.tiedup.remake.network.action.PacketTighten; import com.tiedup.remake.network.bounty.PacketRequestBounties; -import com.tiedup.remake.v2.BodyRegionV2; -import com.tiedup.remake.v2.bondage.network.PacketV2StruggleStart; import com.tiedup.remake.state.PlayerBindState; +import com.tiedup.remake.v2.BodyRegionV2; +import com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper; +import com.tiedup.remake.v2.bondage.network.PacketV2StruggleStart; import net.minecraft.ChatFormatting; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; @@ -29,9 +28,9 @@ import net.minecraftforge.client.event.RegisterKeyMappingsEvent; import net.minecraftforge.event.TickEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; +import org.jetbrains.annotations.Nullable; /** - * Phase 7: Client-side keybindings for TiedUp mod. * * Manages key mappings and sends packets to server when keys are pressed. * @@ -227,7 +226,7 @@ public class ModKeybindings { ); } - // Check struggle key - Phase 21: Flow based on bind/accessories + // Check struggle key - Flow based on bind/accessories while (STRUGGLE_KEY.consumeClick()) { handleStruggleKey(); } @@ -284,7 +283,6 @@ public class ModKeybindings { } /** - * Phase 21: Handle struggle key press with new flow. * * Flow: * 1. If bind equipped: Send PacketStruggle to server (struggle against bind) @@ -300,7 +298,11 @@ public class ModKeybindings { } // V2 path: check if player has V2 equipment to struggle against - if (com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper.hasAnyEquipment(player)) { + if ( + com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper.hasAnyEquipment( + player + ) + ) { handleV2Struggle(player); return; } @@ -313,10 +315,11 @@ public class ModKeybindings { // Check if player has bind equipped if (state.isTiedUp()) { // Has bind - struggle against it - // Phase 2.5: Check if mini-game is enabled if (ModConfig.SERVER.struggleMiniGameEnabled.get()) { // New: Start struggle mini-game - ModNetwork.sendToServer(new PacketV2StruggleStart(BodyRegionV2.ARMS)); + ModNetwork.sendToServer( + new PacketV2StruggleStart(BodyRegionV2.ARMS) + ); TiedUpMod.LOGGER.debug( "[CLIENT] Struggle key pressed - starting V2 struggle mini-game" ); @@ -359,7 +362,9 @@ public class ModKeybindings { */ private static void handleV2Struggle(Player player) { java.util.Map equipped = - com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper.getAllEquipped(player); + com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper.getAllEquipped( + player + ); if (equipped.isEmpty()) return; @@ -367,9 +372,15 @@ public class ModKeybindings { com.tiedup.remake.v2.BodyRegionV2 bestRegion = null; int bestPriority = Integer.MIN_VALUE; - for (java.util.Map.Entry entry : equipped.entrySet()) { + for (java.util.Map.Entry< + com.tiedup.remake.v2.BodyRegionV2, + ItemStack + > entry : equipped.entrySet()) { ItemStack stack = entry.getValue(); - if (stack.getItem() instanceof com.tiedup.remake.v2.bondage.IV2BondageItem item) { + if ( + stack.getItem() instanceof + com.tiedup.remake.v2.bondage.IV2BondageItem item + ) { if (item.getPosePriority(stack) > bestPriority) { bestPriority = item.getPosePriority(stack); bestRegion = entry.getKey(); @@ -379,7 +390,9 @@ public class ModKeybindings { if (bestRegion != null) { ModNetwork.sendToServer( - new com.tiedup.remake.v2.bondage.network.PacketV2StruggleStart(bestRegion) + new com.tiedup.remake.v2.bondage.network.PacketV2StruggleStart( + bestRegion + ) ); TiedUpMod.LOGGER.debug( "[CLIENT] V2 Struggle key pressed - targeting region {}", @@ -406,11 +419,19 @@ public class ModKeybindings { /** * Returns true if the given entity has a collar in the NECK region that lists the player as an owner. */ - private static boolean checkCollarOwnership(LivingEntity target, Player player) { - ItemStack collarStack = com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper.getInRegion( - target, BodyRegionV2.NECK - ); - if (!collarStack.isEmpty() && collarStack.getItem() instanceof ItemCollar collar) { + private static boolean checkCollarOwnership( + LivingEntity target, + Player player + ) { + ItemStack collarStack = + com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper.getInRegion( + target, + BodyRegionV2.NECK + ); + if ( + !collarStack.isEmpty() && + collarStack.getItem() instanceof ItemCollar collar + ) { return collar.isOwner(collarStack, player); } return false; diff --git a/src/main/java/com/tiedup/remake/client/animation/BondageAnimationManager.java b/src/main/java/com/tiedup/remake/client/animation/BondageAnimationManager.java index 8fe0e1b..fc0ed3a 100644 --- a/src/main/java/com/tiedup/remake/client/animation/BondageAnimationManager.java +++ b/src/main/java/com/tiedup/remake/client/animation/BondageAnimationManager.java @@ -48,8 +48,10 @@ public class BondageAnimationManager { new ConcurrentHashMap<>(); /** Cache of furniture ModifierLayers for NPC entities */ - private static final Map> npcFurnitureLayers = - new ConcurrentHashMap<>(); + private static final Map< + UUID, + ModifierLayer + > npcFurnitureLayers = new ConcurrentHashMap<>(); /** Factory ID for PlayerAnimator item layer (players only) */ private static final ResourceLocation FACTORY_ID = @@ -83,7 +85,8 @@ public class BondageAnimationManager { * *

Uses ConcurrentHashMap for safe access from both client tick and render thread.

*/ - private static final Map furnitureGraceTicks = new ConcurrentHashMap<>(); + private static final Map furnitureGraceTicks = + new ConcurrentHashMap<>(); /** * Initialize the animation system. @@ -119,13 +122,13 @@ public class BondageAnimationManager { LOGGER.info( "BondageAnimationManager: Factories registered — context (pri {}), item (pri {}), furniture (pri {})", - CONTEXT_LAYER_PRIORITY, ITEM_LAYER_PRIORITY, FURNITURE_LAYER_PRIORITY + CONTEXT_LAYER_PRIORITY, + ITEM_LAYER_PRIORITY, + FURNITURE_LAYER_PRIORITY ); } - // ======================================== // PLAY ANIMATION - // ======================================== /** * Play an animation on any entity (player or NPC). @@ -235,7 +238,10 @@ public class BondageAnimationManager { * @param anim The KeyframeAnimation to play * @return true if animation started successfully */ - public static boolean playDirect(LivingEntity entity, KeyframeAnimation anim) { + public static boolean playDirect( + LivingEntity entity, + KeyframeAnimation anim + ) { if (entity == null || anim == null || !entity.level().isClientSide()) { return false; } @@ -255,9 +261,7 @@ public class BondageAnimationManager { return false; } - // ======================================== // STOP ANIMATION - // ======================================== /** * Stop any currently playing animation on an entity. @@ -276,9 +280,7 @@ public class BondageAnimationManager { } } - // ======================================== // LAYER MANAGEMENT - // ======================================== /** * Get the ModifierLayer for an entity (without creating). @@ -398,9 +400,7 @@ public class BondageAnimationManager { return npcLayers.get(player.getUUID()); } - // ======================================== // CONTEXT LAYER (lower priority, for sit/kneel/sneak) - // ======================================== /** * Get the context animation layer for a player from PlayerAnimationAccess. @@ -431,14 +431,13 @@ public class BondageAnimationManager { LivingEntity entity ) { if (entity instanceof IAnimatedPlayer animated) { - return npcContextLayers.computeIfAbsent( - entity.getUUID(), - k -> { - ModifierLayer layer = new ModifierLayer<>(); - animated.getAnimationStack().addAnimLayer(CONTEXT_LAYER_PRIORITY, layer); - return layer; - } - ); + return npcContextLayers.computeIfAbsent(entity.getUUID(), k -> { + ModifierLayer layer = new ModifierLayer<>(); + animated + .getAnimationStack() + .addAnimLayer(CONTEXT_LAYER_PRIORITY, layer); + return layer; + }); } return null; } @@ -496,9 +495,7 @@ public class BondageAnimationManager { } } - // ======================================== // FURNITURE LAYER (highest priority, for seat poses) - // ======================================== /** * Play a furniture animation on the furniture layer (highest priority). @@ -512,8 +509,15 @@ public class BondageAnimationManager { * @param animation the KeyframeAnimation from FurnitureAnimationContext * @return true if animation started successfully */ - public static boolean playFurniture(Player player, KeyframeAnimation animation) { - if (player == null || animation == null || !player.level().isClientSide()) { + public static boolean playFurniture( + Player player, + KeyframeAnimation animation + ) { + if ( + player == null || + animation == null || + !player.level().isClientSide() + ) { return false; } @@ -522,11 +526,17 @@ public class BondageAnimationManager { layer.setAnimation(new KeyframeAnimationPlayer(animation)); // Reset grace ticks since we just started/refreshed the animation furnitureGraceTicks.remove(player.getUUID()); - LOGGER.debug("Playing furniture animation on player: {}", player.getName().getString()); + LOGGER.debug( + "Playing furniture animation on player: {}", + player.getName().getString() + ); return true; } - LOGGER.warn("Furniture layer not available for player: {}", player.getName().getString()); + LOGGER.warn( + "Furniture layer not available for player: {}", + player.getName().getString() + ); return false; } @@ -545,7 +555,10 @@ public class BondageAnimationManager { layer.setAnimation(null); } furnitureGraceTicks.remove(player.getUUID()); - LOGGER.debug("Stopped furniture animation on player: {}", player.getName().getString()); + LOGGER.debug( + "Stopped furniture animation on player: {}", + player.getName().getString() + ); } /** @@ -573,9 +586,11 @@ public class BondageAnimationManager { private static ModifierLayer getFurnitureLayer(Player player) { if (player instanceof AbstractClientPlayer clientPlayer) { try { - ModifierLayer layer = (ModifierLayer) - PlayerAnimationAccess.getPlayerAssociatedData(clientPlayer) - .get(FURNITURE_FACTORY_ID); + ModifierLayer layer = (ModifierLayer< + IAnimation + >) PlayerAnimationAccess.getPlayerAssociatedData( + clientPlayer + ).get(FURNITURE_FACTORY_ID); if (layer != null) { return layer; } @@ -628,17 +643,18 @@ public class BondageAnimationManager { // Player has furniture anim but no seat -- increment grace int ticks = furnitureGraceTicks.merge(uuid, 1, Integer::sum); if (ticks >= FURNITURE_GRACE_TICKS) { - LOGGER.info("Removing stale furniture animation for player {} " - + "(not riding ISeatProvider for {} ticks)", - player.getName().getString(), ticks); + LOGGER.info( + "Removing stale furniture animation for player {} " + + "(not riding ISeatProvider for {} ticks)", + player.getName().getString(), + ticks + ); stopFurniture(player); } } } - // ======================================== // FALLBACK ANIMATION HANDLING - // ======================================== /** * Try to find a fallback animation ID when the requested one doesn't exist. @@ -696,9 +712,7 @@ public class BondageAnimationManager { return null; } - // ======================================== // CLEANUP - // ======================================== /** * Clean up animation layer for an NPC when it's removed. @@ -706,9 +720,8 @@ public class BondageAnimationManager { * @param entityId UUID of the removed entity */ /** All NPC layer caches, for bulk cleanup operations. */ - private static final Map>[] ALL_NPC_CACHES = new Map[] { - npcLayers, npcContextLayers, npcFurnitureLayers - }; + private static final Map>[] ALL_NPC_CACHES = + new Map[] { npcLayers, npcContextLayers, npcFurnitureLayers }; public static void cleanup(UUID entityId) { for (Map> cache : ALL_NPC_CACHES) { @@ -733,5 +746,4 @@ public class BondageAnimationManager { furnitureGraceTicks.clear(); LOGGER.info("Cleared all NPC animation layers"); } - } diff --git a/src/main/java/com/tiedup/remake/client/animation/context/AnimationContext.java b/src/main/java/com/tiedup/remake/client/animation/context/AnimationContext.java index 132b381..eabb165 100644 --- a/src/main/java/com/tiedup/remake/client/animation/context/AnimationContext.java +++ b/src/main/java/com/tiedup/remake/client/animation/context/AnimationContext.java @@ -17,7 +17,6 @@ import net.minecraftforge.api.distmarker.OnlyIn; */ @OnlyIn(Dist.CLIENT) public enum AnimationContext { - STAND_IDLE("stand_idle", false), STAND_WALK("stand_walk", false), STAND_SNEAK("stand_sneak", false), diff --git a/src/main/java/com/tiedup/remake/client/animation/context/AnimationContextResolver.java b/src/main/java/com/tiedup/remake/client/animation/context/AnimationContextResolver.java index ea60996..287f205 100644 --- a/src/main/java/com/tiedup/remake/client/animation/context/AnimationContextResolver.java +++ b/src/main/java/com/tiedup/remake/client/animation/context/AnimationContextResolver.java @@ -50,15 +50,21 @@ public final class AnimationContextResolver { * @param activeStyle the active movement style from client state, or null * @return the resolved animation context, never null */ - public static AnimationContext resolve(Player player, @Nullable PlayerBindState state, - @Nullable MovementStyle activeStyle) { + public static AnimationContext resolve( + Player player, + @Nullable PlayerBindState state, + @Nullable MovementStyle activeStyle + ) { boolean sitting = PetBedClientState.get(player.getUUID()) != 0; boolean struggling = state != null && state.isStruggling(); boolean sneaking = player.isCrouching(); - boolean moving = player.getDeltaMovement().horizontalDistanceSqr() > 1.0E-6; + boolean moving = + player.getDeltaMovement().horizontalDistanceSqr() > 1.0E-6; if (sitting) { - return struggling ? AnimationContext.SIT_STRUGGLE : AnimationContext.SIT_IDLE; + return struggling + ? AnimationContext.SIT_STRUGGLE + : AnimationContext.SIT_IDLE; } if (struggling) { return AnimationContext.STAND_STRUGGLE; @@ -78,12 +84,23 @@ public final class AnimationContextResolver { /** * Map a movement style + moving flag to the appropriate AnimationContext. */ - private static AnimationContext resolveStyleContext(MovementStyle style, boolean moving) { + private static AnimationContext resolveStyleContext( + MovementStyle style, + boolean moving + ) { return switch (style) { - case SHUFFLE -> moving ? AnimationContext.SHUFFLE_WALK : AnimationContext.SHUFFLE_IDLE; - case HOP -> moving ? AnimationContext.HOP_WALK : AnimationContext.HOP_IDLE; - case WADDLE -> moving ? AnimationContext.WADDLE_WALK : AnimationContext.WADDLE_IDLE; - case CRAWL -> moving ? AnimationContext.CRAWL_MOVE : AnimationContext.CRAWL_IDLE; + case SHUFFLE -> moving + ? AnimationContext.SHUFFLE_WALK + : AnimationContext.SHUFFLE_IDLE; + case HOP -> moving + ? AnimationContext.HOP_WALK + : AnimationContext.HOP_IDLE; + case WADDLE -> moving + ? AnimationContext.WADDLE_WALK + : AnimationContext.WADDLE_IDLE; + case CRAWL -> moving + ? AnimationContext.CRAWL_MOVE + : AnimationContext.CRAWL_IDLE; }; } @@ -99,13 +116,18 @@ public final class AnimationContextResolver { boolean sitting = entity.isSitting(); boolean kneeling = entity.isKneeling(); boolean struggling = entity.isStruggling(); - boolean moving = entity.getDeltaMovement().horizontalDistanceSqr() > 1.0E-6; + boolean moving = + entity.getDeltaMovement().horizontalDistanceSqr() > 1.0E-6; if (sitting) { - return struggling ? AnimationContext.SIT_STRUGGLE : AnimationContext.SIT_IDLE; + return struggling + ? AnimationContext.SIT_STRUGGLE + : AnimationContext.SIT_IDLE; } if (kneeling) { - return struggling ? AnimationContext.KNEEL_STRUGGLE : AnimationContext.KNEEL_IDLE; + return struggling + ? AnimationContext.KNEEL_STRUGGLE + : AnimationContext.KNEEL_IDLE; } if (struggling) { return AnimationContext.STAND_STRUGGLE; diff --git a/src/main/java/com/tiedup/remake/client/animation/context/ContextAnimationFactory.java b/src/main/java/com/tiedup/remake/client/animation/context/ContextAnimationFactory.java index f326437..75209b7 100644 --- a/src/main/java/com/tiedup/remake/client/animation/context/ContextAnimationFactory.java +++ b/src/main/java/com/tiedup/remake/client/animation/context/ContextAnimationFactory.java @@ -6,10 +6,10 @@ import dev.kosmx.playerAnim.minecraftApi.PlayerAnimationRegistry; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; -import org.jetbrains.annotations.Nullable; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; /** @@ -42,13 +42,15 @@ public final class ContextAnimationFactory { * Cache keyed by "contextSuffix|ownedPartsHashCode". * Null values are stored as sentinels for missing animations to avoid repeated lookups. */ - private static final Map CACHE = new ConcurrentHashMap<>(); + private static final Map CACHE = + new ConcurrentHashMap<>(); /** * Sentinel set used to track cache keys where the base animation was not found, * so we don't log the same warning repeatedly. */ - private static final Set MISSING_WARNED = ConcurrentHashMap.newKeySet(); + private static final Set MISSING_WARNED = + ConcurrentHashMap.newKeySet(); private ContextAnimationFactory() {} @@ -65,8 +67,14 @@ public final class ContextAnimationFactory { * @return the context animation with disabled parts suppressed, or null if not found */ @Nullable - public static KeyframeAnimation create(AnimationContext context, Set disabledParts) { - String cacheKey = context.getAnimationSuffix() + "|" + String.join(",", new java.util.TreeSet<>(disabledParts)); + public static KeyframeAnimation create( + AnimationContext context, + Set disabledParts + ) { + String cacheKey = + context.getAnimationSuffix() + + "|" + + String.join(",", new java.util.TreeSet<>(disabledParts)); // computeIfAbsent cannot store null values, so we handle the missing case // by checking the MISSING_WARNED set to avoid redundant work. KeyframeAnimation cached = CACHE.get(cacheKey); @@ -77,7 +85,10 @@ public final class ContextAnimationFactory { return null; } - KeyframeAnimation result = buildContextAnimation(context, disabledParts); + KeyframeAnimation result = buildContextAnimation( + context, + disabledParts + ); if (result != null) { CACHE.put(cacheKey, result); } else { @@ -100,8 +111,10 @@ public final class ContextAnimationFactory { * */ @Nullable - private static KeyframeAnimation buildContextAnimation(AnimationContext context, - Set disabledParts) { + private static KeyframeAnimation buildContextAnimation( + AnimationContext context, + Set disabledParts + ) { String suffix = context.getAnimationSuffix(); // Priority 1: GLB-based context animation from ContextGlbRegistry @@ -110,13 +123,17 @@ public final class ContextAnimationFactory { // Priority 2: JSON-based context animation from PlayerAnimationRegistry if (baseAnim == null) { ResourceLocation animId = ResourceLocation.fromNamespaceAndPath( - NAMESPACE, "context_" + suffix + NAMESPACE, + "context_" + suffix ); baseAnim = PlayerAnimationRegistry.getAnimation(animId); } if (baseAnim == null) { - LOGGER.warn("[V2Animation] Context animation not found for suffix: {}", suffix); + LOGGER.warn( + "[V2Animation] Context animation not found for suffix: {}", + suffix + ); return null; } @@ -140,8 +157,10 @@ public final class ContextAnimationFactory { *

Unknown part names are silently ignored -- this can happen if the disabled parts set * includes future bone names not present in the current context animation.

*/ - private static void disableParts(KeyframeAnimation.AnimationBuilder builder, - Set disabledParts) { + private static void disableParts( + KeyframeAnimation.AnimationBuilder builder, + Set disabledParts + ) { for (String partName : disabledParts) { KeyframeAnimation.StateCollection part = builder.getPart(partName); if (part != null) { diff --git a/src/main/java/com/tiedup/remake/client/animation/context/ContextGlbRegistry.java b/src/main/java/com/tiedup/remake/client/animation/context/ContextGlbRegistry.java index 7035dbd..f71559a 100644 --- a/src/main/java/com/tiedup/remake/client/animation/context/ContextGlbRegistry.java +++ b/src/main/java/com/tiedup/remake/client/animation/context/ContextGlbRegistry.java @@ -8,7 +8,6 @@ import java.io.InputStream; import java.util.Collections; import java.util.HashMap; import java.util.Map; -import org.jetbrains.annotations.Nullable; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.resources.Resource; import net.minecraft.server.packs.resources.ResourceManager; @@ -16,6 +15,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.jetbrains.annotations.Nullable; /** * Registry for context animations loaded from GLB files. @@ -70,10 +70,15 @@ public final class ContextGlbRegistry { public static void reload(ResourceManager resourceManager) { Map newRegistry = new HashMap<>(); - Map resources = resourceManager.listResources( - DIRECTORY, loc -> loc.getPath().endsWith(".glb")); + Map resources = + resourceManager.listResources(DIRECTORY, loc -> + loc.getPath().endsWith(".glb") + ); - for (Map.Entry entry : resources.entrySet()) { + for (Map.Entry< + ResourceLocation, + Resource + > entry : resources.entrySet()) { ResourceLocation loc = entry.getKey(); Resource resource = entry.getValue(); @@ -89,15 +94,26 @@ public final class ContextGlbRegistry { KeyframeAnimation anim = GltfPoseConverter.convert(data); newRegistry.put(suffix, anim); - LOGGER.info("[GltfPipeline] Loaded context GLB: '{}' -> suffix '{}'", loc, suffix); + LOGGER.info( + "[GltfPipeline] Loaded context GLB: '{}' -> suffix '{}'", + loc, + suffix + ); } catch (Exception e) { - LOGGER.error("[GltfPipeline] Failed to load context GLB: {}", loc, e); + LOGGER.error( + "[GltfPipeline] Failed to load context GLB: {}", + loc, + e + ); } } // Atomic swap: render thread never sees a partially populated registry REGISTRY = Collections.unmodifiableMap(newRegistry); - LOGGER.info("[ContextGlb] Loaded {} context GLB animations", newRegistry.size()); + LOGGER.info( + "[ContextGlb] Loaded {} context GLB animations", + newRegistry.size() + ); } /** diff --git a/src/main/java/com/tiedup/remake/client/animation/context/GlbAnimationResolver.java b/src/main/java/com/tiedup/remake/client/animation/context/GlbAnimationResolver.java index 73ff8d2..45d9651 100644 --- a/src/main/java/com/tiedup/remake/client/animation/context/GlbAnimationResolver.java +++ b/src/main/java/com/tiedup/remake/client/animation/context/GlbAnimationResolver.java @@ -6,10 +6,10 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ThreadLocalRandom; -import org.jetbrains.annotations.Nullable; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import org.jetbrains.annotations.Nullable; /** * Resolves which named animation to play from a GLB file based on the current @@ -42,9 +42,12 @@ public final class GlbAnimationResolver { * @return parsed GLB data, or null if loading failed */ @Nullable - public static GltfData resolveAnimationData(ResourceLocation itemModelLoc, - @Nullable ResourceLocation animationSource) { - ResourceLocation source = animationSource != null ? animationSource : itemModelLoc; + public static GltfData resolveAnimationData( + ResourceLocation itemModelLoc, + @Nullable ResourceLocation animationSource + ) { + ResourceLocation source = + animationSource != null ? animationSource : itemModelLoc; return GltfCache.get(source); } @@ -66,8 +69,8 @@ public final class GlbAnimationResolver { */ @Nullable public static String resolve(GltfData data, AnimationContext context) { - String prefix = context.getGlbContextPrefix(); // "Sit", "Kneel", "Sneak", "Walk", "" - String variant = context.getGlbVariant(); // "Idle" or "Struggle" + String prefix = context.getGlbContextPrefix(); // "Sit", "Kneel", "Sneak", "Walk", "" + String variant = context.getGlbVariant(); // "Idle" or "Struggle" // 1. Exact match: "FullSitIdle" then "SitIdle" (with variants) String exact = prefix + variant; @@ -146,6 +149,8 @@ public final class GlbAnimationResolver { if (candidates.isEmpty()) return null; if (candidates.size() == 1) return candidates.get(0); - return candidates.get(ThreadLocalRandom.current().nextInt(candidates.size())); + return candidates.get( + ThreadLocalRandom.current().nextInt(candidates.size()) + ); } } diff --git a/src/main/java/com/tiedup/remake/client/animation/context/RegionBoneMapper.java b/src/main/java/com/tiedup/remake/client/animation/context/RegionBoneMapper.java index 4ea84bf..04a6181 100644 --- a/src/main/java/com/tiedup/remake/client/animation/context/RegionBoneMapper.java +++ b/src/main/java/com/tiedup/remake/client/animation/context/RegionBoneMapper.java @@ -6,11 +6,11 @@ import com.tiedup.remake.v2.bondage.datadriven.DataDrivenBondageItem; import com.tiedup.remake.v2.bondage.datadriven.DataDrivenItemDefinition; import com.tiedup.remake.v2.bondage.datadriven.DataDrivenItemRegistry; import java.util.*; -import org.jetbrains.annotations.Nullable; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import org.jetbrains.annotations.Nullable; /** * Maps V2 body regions to PlayerAnimator part names. @@ -29,7 +29,12 @@ public final class RegionBoneMapper { /** All PlayerAnimator part names for the player model. */ public static final Set ALL_PARTS = Set.of( - "head", "body", "rightArm", "leftArm", "rightLeg", "leftLeg" + "head", + "body", + "rightArm", + "leftArm", + "rightLeg", + "leftLeg" ); /** @@ -46,7 +51,6 @@ public final class RegionBoneMapper { * the other item takes precedence (the bone goes to {@code otherParts}).

*/ public record BoneOwnership(Set thisParts, Set otherParts) { - /** * Parts not owned by any item. These are "free" and can be animated * by the winning item IF the GLB contains keyframes for them. @@ -84,20 +88,20 @@ public final class RegionBoneMapper { static { Map> map = new EnumMap<>(BodyRegionV2.class); - map.put(BodyRegionV2.HEAD, Set.of("head")); - map.put(BodyRegionV2.EYES, Set.of("head")); - map.put(BodyRegionV2.EARS, Set.of("head")); - map.put(BodyRegionV2.MOUTH, Set.of("head")); - map.put(BodyRegionV2.NECK, Set.of()); - map.put(BodyRegionV2.TORSO, Set.of("body")); - map.put(BodyRegionV2.ARMS, Set.of("rightArm", "leftArm")); - map.put(BodyRegionV2.HANDS, Set.of("rightArm", "leftArm")); + map.put(BodyRegionV2.HEAD, Set.of("head")); + map.put(BodyRegionV2.EYES, Set.of("head")); + map.put(BodyRegionV2.EARS, Set.of("head")); + map.put(BodyRegionV2.MOUTH, Set.of("head")); + map.put(BodyRegionV2.NECK, Set.of()); + map.put(BodyRegionV2.TORSO, Set.of("body")); + map.put(BodyRegionV2.ARMS, Set.of("rightArm", "leftArm")); + map.put(BodyRegionV2.HANDS, Set.of("rightArm", "leftArm")); map.put(BodyRegionV2.FINGERS, Set.of()); - map.put(BodyRegionV2.WAIST, Set.of("body")); - map.put(BodyRegionV2.LEGS, Set.of("rightLeg", "leftLeg")); - map.put(BodyRegionV2.FEET, Set.of("rightLeg", "leftLeg")); - map.put(BodyRegionV2.TAIL, Set.of()); - map.put(BodyRegionV2.WINGS, Set.of()); + map.put(BodyRegionV2.WAIST, Set.of("body")); + map.put(BodyRegionV2.LEGS, Set.of("rightLeg", "leftLeg")); + map.put(BodyRegionV2.FEET, Set.of("rightLeg", "leftLeg")); + map.put(BodyRegionV2.TAIL, Set.of()); + map.put(BodyRegionV2.WINGS, Set.of()); REGION_TO_PARTS = Collections.unmodifiableMap(map); } @@ -123,7 +127,9 @@ public final class RegionBoneMapper { * @param equipped map from representative region to equipped ItemStack * @return unmodifiable set of owned part name strings */ - public static Set computeOwnedParts(Map equipped) { + public static Set computeOwnedParts( + Map equipped + ) { Set owned = new HashSet<>(); for (Map.Entry entry : equipped.entrySet()) { ItemStack stack = entry.getValue(); @@ -151,14 +157,18 @@ public final class RegionBoneMapper { * @param winningItemStack the ItemStack of the highest-priority V2 item with a GLB model * @return BoneOwnership describing this item's parts vs other items' parts */ - public static BoneOwnership computePerItemParts(Map equipped, - ItemStack winningItemStack) { + public static BoneOwnership computePerItemParts( + Map equipped, + ItemStack winningItemStack + ) { Set thisParts = new HashSet<>(); Set otherParts = new HashSet<>(); // Track which ItemStacks we've already processed to avoid duplicate work // (multiple regions can map to the same ItemStack) - Set processed = Collections.newSetFromMap(new IdentityHashMap<>()); + Set processed = Collections.newSetFromMap( + new IdentityHashMap<>() + ); for (Map.Entry entry : equipped.entrySet()) { ItemStack stack = entry.getValue(); @@ -199,8 +209,11 @@ public final class RegionBoneMapper { * @param winningItem the actual ItemStack reference (for identity comparison in * {@link #computePerItemParts}) */ - public record GlbModelResult(ResourceLocation modelLoc, @Nullable ResourceLocation animSource, - ItemStack winningItem) {} + public record GlbModelResult( + ResourceLocation modelLoc, + @Nullable ResourceLocation animSource, + ItemStack winningItem + ) {} /** * Animation info for a single equipped V2 item. @@ -213,9 +226,13 @@ public final class RegionBoneMapper { * @param animationBones per-animation bone whitelist from the data-driven definition. * Empty map for hardcoded items (no filtering applied). */ - public record V2ItemAnimInfo(ResourceLocation modelLoc, @Nullable ResourceLocation animSource, - Set ownedParts, int posePriority, - Map> animationBones) {} + public record V2ItemAnimInfo( + ResourceLocation modelLoc, + @Nullable ResourceLocation animSource, + Set ownedParts, + int posePriority, + Map> animationBones + ) {} /** * Find the highest-priority V2 item with a GLB model in the equipped map. @@ -230,7 +247,9 @@ public final class RegionBoneMapper { * @return the winning item's model info, or null if no V2 item has a GLB model (V1 fallback) */ @Nullable - public static GlbModelResult resolveWinningItem(Map equipped) { + public static GlbModelResult resolveWinningItem( + Map equipped + ) { ItemStack bestStack = null; ResourceLocation bestModel = null; int bestPriority = Integer.MIN_VALUE; @@ -238,7 +257,10 @@ public final class RegionBoneMapper { ItemStack stack = entry.getValue(); if (stack.getItem() instanceof IV2BondageItem v2Item) { ResourceLocation model = v2Item.getModelLocation(stack); - if (model != null && v2Item.getPosePriority(stack) > bestPriority) { + if ( + model != null && + v2Item.getPosePriority(stack) > bestPriority + ) { bestPriority = v2Item.getPosePriority(stack); bestModel = model; bestStack = stack; @@ -252,7 +274,9 @@ public final class RegionBoneMapper { // (the model's own animations are used). ResourceLocation animSource = null; if (bestStack.getItem() instanceof DataDrivenBondageItem) { - DataDrivenItemDefinition def = DataDrivenItemRegistry.get(bestStack); + DataDrivenItemDefinition def = DataDrivenItemRegistry.get( + bestStack + ); if (def != null) { animSource = def.animationSource(); } @@ -273,13 +297,23 @@ public final class RegionBoneMapper { * @return list of V2ItemAnimInfo, sorted by priority descending. Empty if no V2 items. * The first element (if any) is the free-bone donor. */ - public static List resolveAllV2Items(Map equipped) { - record ItemEntry(ItemStack stack, IV2BondageItem v2Item, ResourceLocation model, - @Nullable ResourceLocation animSource, Set rawParts, int priority, - Map> animationBones) {} + public static List resolveAllV2Items( + Map equipped + ) { + record ItemEntry( + ItemStack stack, + IV2BondageItem v2Item, + ResourceLocation model, + @Nullable ResourceLocation animSource, + Set rawParts, + int priority, + Map> animationBones + ) {} List entries = new ArrayList<>(); - Set seen = Collections.newSetFromMap(new IdentityHashMap<>()); + Set seen = Collections.newSetFromMap( + new IdentityHashMap<>() + ); for (Map.Entry entry : equipped.entrySet()) { ItemStack stack = entry.getValue(); @@ -299,15 +333,26 @@ public final class RegionBoneMapper { ResourceLocation animSource = null; Map> animBones = Map.of(); if (stack.getItem() instanceof DataDrivenBondageItem) { - DataDrivenItemDefinition def = DataDrivenItemRegistry.get(stack); + DataDrivenItemDefinition def = DataDrivenItemRegistry.get( + stack + ); if (def != null) { animSource = def.animationSource(); animBones = def.animationBones(); } } - entries.add(new ItemEntry(stack, v2Item, model, animSource, rawParts, - v2Item.getPosePriority(stack), animBones)); + entries.add( + new ItemEntry( + stack, + v2Item, + model, + animSource, + rawParts, + v2Item.getPosePriority(stack), + animBones + ) + ); } } @@ -323,8 +368,15 @@ public final class RegionBoneMapper { ownedParts.removeAll(claimed); if (ownedParts.isEmpty()) continue; claimed.addAll(ownedParts); - result.add(new V2ItemAnimInfo(e.model(), e.animSource(), - Collections.unmodifiableSet(ownedParts), e.priority(), e.animationBones())); + result.add( + new V2ItemAnimInfo( + e.model(), + e.animSource(), + Collections.unmodifiableSet(ownedParts), + e.priority(), + e.animationBones() + ) + ); } return Collections.unmodifiableList(result); diff --git a/src/main/java/com/tiedup/remake/client/animation/render/DogPoseRenderHandler.java b/src/main/java/com/tiedup/remake/client/animation/render/DogPoseRenderHandler.java index a8222bb..fa799f5 100644 --- a/src/main/java/com/tiedup/remake/client/animation/render/DogPoseRenderHandler.java +++ b/src/main/java/com/tiedup/remake/client/animation/render/DogPoseRenderHandler.java @@ -1,11 +1,11 @@ package com.tiedup.remake.client.animation.render; import com.tiedup.remake.core.TiedUpMod; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.items.base.ItemBind; import com.tiedup.remake.items.base.PoseType; import com.tiedup.remake.state.HumanChairHelper; import com.tiedup.remake.state.PlayerBindState; +import com.tiedup.remake.v2.BodyRegionV2; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import net.minecraft.client.player.AbstractClientPlayer; diff --git a/src/main/java/com/tiedup/remake/client/animation/render/PetBedRenderHandler.java b/src/main/java/com/tiedup/remake/client/animation/render/PetBedRenderHandler.java index 99d4c93..d057531 100644 --- a/src/main/java/com/tiedup/remake/client/animation/render/PetBedRenderHandler.java +++ b/src/main/java/com/tiedup/remake/client/animation/render/PetBedRenderHandler.java @@ -1,12 +1,12 @@ package com.tiedup.remake.client.animation.render; import com.tiedup.remake.client.state.PetBedClientState; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.items.base.ItemBind; import com.tiedup.remake.items.base.PoseType; import com.tiedup.remake.state.HumanChairHelper; import com.tiedup.remake.state.PlayerBindState; +import com.tiedup.remake.v2.BodyRegionV2; import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/com/tiedup/remake/client/animation/render/PlayerArmHideEventHandler.java b/src/main/java/com/tiedup/remake/client/animation/render/PlayerArmHideEventHandler.java index 2d31e6b..e7773f6 100644 --- a/src/main/java/com/tiedup/remake/client/animation/render/PlayerArmHideEventHandler.java +++ b/src/main/java/com/tiedup/remake/client/animation/render/PlayerArmHideEventHandler.java @@ -1,12 +1,12 @@ package com.tiedup.remake.client.animation.render; import com.tiedup.remake.client.renderer.layers.ClothesRenderHelper; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.items.base.ItemBind; import com.tiedup.remake.items.base.PoseType; import com.tiedup.remake.items.clothes.ClothesProperties; import com.tiedup.remake.state.PlayerBindState; +import com.tiedup.remake.v2.BodyRegionV2; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import net.minecraft.client.model.PlayerModel; @@ -48,7 +48,7 @@ public class PlayerArmHideEventHandler { /** * Before player render: * - Hide arms for wrap/latex_sack poses - * - Hide outer layers based on clothes settings (Phase 19) + * - Hide outer layers based on clothes settings */ @SubscribeEvent public static void onRenderPlayerPre(RenderPlayerEvent.Pre event) { @@ -88,7 +88,7 @@ public class PlayerArmHideEventHandler { } } - // === HIDE WEARER LAYERS (clothes settings) - Phase 19 === + // === HIDE WEARER LAYERS (clothes settings) === ItemStack clothes = state.getEquipment(BodyRegionV2.TORSO); if (!clothes.isEmpty()) { ClothesProperties props = @@ -126,7 +126,7 @@ public class PlayerArmHideEventHandler { model.leftSleeve.visible = true; model.rightSleeve.visible = true; - // === RESTORE WEARER LAYERS - Phase 19 === + // === RESTORE WEARER LAYERS === boolean[] savedLayers = storedLayers.remove(player.getId()); if (savedLayers != null) { ClothesRenderHelper.restoreWearerLayers(model, savedLayers); diff --git a/src/main/java/com/tiedup/remake/client/animation/tick/AnimationTickHandler.java b/src/main/java/com/tiedup/remake/client/animation/tick/AnimationTickHandler.java index 3246551..70bc8a2 100644 --- a/src/main/java/com/tiedup/remake/client/animation/tick/AnimationTickHandler.java +++ b/src/main/java/com/tiedup/remake/client/animation/tick/AnimationTickHandler.java @@ -4,6 +4,9 @@ import com.mojang.logging.LogUtils; import com.tiedup.remake.client.animation.AnimationStateRegistry; import com.tiedup.remake.client.animation.BondageAnimationManager; import com.tiedup.remake.client.animation.PendingAnimationManager; +import com.tiedup.remake.client.animation.context.AnimationContext; +import com.tiedup.remake.client.animation.context.AnimationContextResolver; +import com.tiedup.remake.client.animation.context.RegionBoneMapper; import com.tiedup.remake.client.animation.util.AnimationIdBuilder; import com.tiedup.remake.client.events.CellHighlightHandler; import com.tiedup.remake.client.events.LeashProxyClientHandler; @@ -13,15 +16,12 @@ import com.tiedup.remake.client.state.MovementStyleClientState; import com.tiedup.remake.client.state.PetBedClientState; import com.tiedup.remake.items.base.ItemBind; import com.tiedup.remake.items.base.PoseType; +import com.tiedup.remake.state.HumanChairHelper; +import com.tiedup.remake.state.PlayerBindState; import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.v2.bondage.IV2BondageEquipment; import com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper; import com.tiedup.remake.v2.bondage.movement.MovementStyle; -import com.tiedup.remake.client.animation.context.AnimationContext; -import com.tiedup.remake.client.animation.context.AnimationContextResolver; -import com.tiedup.remake.client.animation.context.RegionBoneMapper; -import com.tiedup.remake.state.HumanChairHelper; -import com.tiedup.remake.state.PlayerBindState; import java.util.Map; import java.util.UUID; import net.minecraft.client.Minecraft; @@ -109,8 +109,9 @@ public class AnimationTickHandler { // Check if player has ANY V2 bondage item equipped (not just ARMS). // isTiedUp() only checks ARMS, but items on LEGS, HEAD, etc. also need animation. - boolean isTied = state != null && (state.isTiedUp() - || V2EquipmentHelper.hasAnyEquipment(player)); + boolean isTied = + state != null && + (state.isTiedUp() || V2EquipmentHelper.hasAnyEquipment(player)); boolean wasTied = AnimationStateRegistry.getLastTiedState().getOrDefault(uuid, false); @@ -175,9 +176,11 @@ public class AnimationTickHandler { if (isTied) { // Resolve V2 equipped items - IV2BondageEquipment equipment = V2EquipmentHelper.getEquipment(player); - Map equipped = equipment != null - ? equipment.getAllEquipped() : Map.of(); + IV2BondageEquipment equipment = V2EquipmentHelper.getEquipment( + player + ); + Map equipped = + equipment != null ? equipment.getAllEquipped() : Map.of(); // Resolve ALL V2 items with GLB models and per-item bone ownership java.util.List v2Items = @@ -185,10 +188,22 @@ public class AnimationTickHandler { if (!v2Items.isEmpty()) { // V2 path: multi-item composite animation - java.util.Set allOwnedParts = RegionBoneMapper.computeAllOwnedParts(v2Items); - MovementStyle activeStyle = MovementStyleClientState.get(player.getUUID()); - AnimationContext context = AnimationContextResolver.resolve(player, state, activeStyle); - GltfAnimationApplier.applyMultiItemV2Animation(player, v2Items, context, allOwnedParts); + java.util.Set allOwnedParts = + RegionBoneMapper.computeAllOwnedParts(v2Items); + MovementStyle activeStyle = MovementStyleClientState.get( + player.getUUID() + ); + AnimationContext context = AnimationContextResolver.resolve( + player, + state, + activeStyle + ); + GltfAnimationApplier.applyMultiItemV2Animation( + player, + v2Items, + context, + allOwnedParts + ); // Clear V1 tracking so transition back works AnimationStateRegistry.getLastAnimId().remove(uuid); } else { @@ -197,11 +212,19 @@ public class AnimationTickHandler { GltfAnimationApplier.clearV2Animation(player); } String animId = buildAnimationId(player, state); - String lastId = AnimationStateRegistry.getLastAnimId().get(uuid); + String lastId = AnimationStateRegistry.getLastAnimId().get( + uuid + ); if (!animId.equals(lastId)) { - boolean success = BondageAnimationManager.playAnimation(player, animId); + boolean success = BondageAnimationManager.playAnimation( + player, + animId + ); if (success) { - AnimationStateRegistry.getLastAnimId().put(uuid, animId); + AnimationStateRegistry.getLastAnimId().put( + uuid, + animId + ); } } } @@ -236,8 +259,14 @@ public class AnimationTickHandler { } // Derive bound state from V2 regions (works client-side, synced via capability) - boolean armsBound = V2EquipmentHelper.isRegionOccupied(player, BodyRegionV2.ARMS); - boolean legsBound = V2EquipmentHelper.isRegionOccupied(player, BodyRegionV2.LEGS); + boolean armsBound = V2EquipmentHelper.isRegionOccupied( + player, + BodyRegionV2.ARMS + ); + boolean legsBound = V2EquipmentHelper.isRegionOccupied( + player, + BodyRegionV2.LEGS + ); // V1 fallback: if no V2 regions are set but player is tied, derive from ItemBind NBT if (!armsBound && !legsBound && bind.getItem() instanceof ItemBind) { diff --git a/src/main/java/com/tiedup/remake/client/animation/tick/NpcAnimationTickHandler.java b/src/main/java/com/tiedup/remake/client/animation/tick/NpcAnimationTickHandler.java index 132dc1d..ae0e805 100644 --- a/src/main/java/com/tiedup/remake/client/animation/tick/NpcAnimationTickHandler.java +++ b/src/main/java/com/tiedup/remake/client/animation/tick/NpcAnimationTickHandler.java @@ -15,8 +15,8 @@ import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.v2.bondage.IV2BondageEquipment; import com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; import net.minecraft.client.Minecraft; import net.minecraft.world.entity.Entity; import net.minecraft.world.item.ItemStack; @@ -45,7 +45,8 @@ import net.minecraftforge.fml.common.Mod; public class NpcAnimationTickHandler { /** Track last animation ID per NPC to avoid redundant updates */ - private static final Map lastNpcAnimId = new ConcurrentHashMap<>(); + private static final Map lastNpcAnimId = + new ConcurrentHashMap<>(); /** * Client tick: update animations for all loaded AbstractTiedUpNpc instances. @@ -91,18 +92,31 @@ public class NpcAnimationTickHandler { if (inPose) { // Resolve V2 equipment map - IV2BondageEquipment equipment = V2EquipmentHelper.getEquipment(entity); - Map equipped = equipment != null - ? equipment.getAllEquipped() : Map.of(); - RegionBoneMapper.GlbModelResult glbResult = RegionBoneMapper.resolveWinningItem(equipped); + IV2BondageEquipment equipment = V2EquipmentHelper.getEquipment( + entity + ); + Map equipped = + equipment != null ? equipment.getAllEquipped() : Map.of(); + RegionBoneMapper.GlbModelResult glbResult = + RegionBoneMapper.resolveWinningItem(equipped); if (glbResult != null) { // V2 path: dual-layer animation with per-item bone ownership RegionBoneMapper.BoneOwnership ownership = - RegionBoneMapper.computePerItemParts(equipped, glbResult.winningItem()); - AnimationContext context = AnimationContextResolver.resolveNpc(entity); - GltfAnimationApplier.applyV2Animation(entity, glbResult.modelLoc(), - glbResult.animSource(), context, ownership); + RegionBoneMapper.computePerItemParts( + equipped, + glbResult.winningItem() + ); + AnimationContext context = AnimationContextResolver.resolveNpc( + entity + ); + GltfAnimationApplier.applyV2Animation( + entity, + glbResult.modelLoc(), + glbResult.animSource(), + context, + ownership + ); lastNpcAnimId.remove(uuid); } else { // V1 fallback: JSON-based PlayerAnimator animations @@ -118,7 +132,10 @@ public class NpcAnimationTickHandler { } } } else { - if (lastNpcAnimId.containsKey(uuid) || GltfAnimationApplier.hasActiveState(entity)) { + if ( + lastNpcAnimId.containsKey(uuid) || + GltfAnimationApplier.hasActiveState(entity) + ) { if (GltfAnimationApplier.hasActiveState(entity)) { GltfAnimationApplier.clearV2Animation(entity); } else { @@ -141,7 +158,9 @@ public class NpcAnimationTickHandler { positionPrefix = "kneel"; } - net.minecraft.world.item.ItemStack bind = entity.getEquipment(BodyRegionV2.ARMS); + net.minecraft.world.item.ItemStack bind = entity.getEquipment( + BodyRegionV2.ARMS + ); PoseType poseType = PoseType.STANDARD; boolean hasBind = false; @@ -151,8 +170,14 @@ public class NpcAnimationTickHandler { } // Derive bound state from V2 regions (AbstractTiedUpNpc implements IV2EquipmentHolder) - boolean armsBound = V2EquipmentHelper.isRegionOccupied(entity, BodyRegionV2.ARMS); - boolean legsBound = V2EquipmentHelper.isRegionOccupied(entity, BodyRegionV2.LEGS); + boolean armsBound = V2EquipmentHelper.isRegionOccupied( + entity, + BodyRegionV2.ARMS + ); + boolean legsBound = V2EquipmentHelper.isRegionOccupied( + entity, + BodyRegionV2.LEGS + ); // V1 fallback: if no V2 regions set but NPC has a bind, derive from ItemBind NBT if (!armsBound && !legsBound && bind.getItem() instanceof ItemBind) { diff --git a/src/main/java/com/tiedup/remake/client/animation/util/AnimationIdBuilder.java b/src/main/java/com/tiedup/remake/client/animation/util/AnimationIdBuilder.java index 942d381..d1216b2 100644 --- a/src/main/java/com/tiedup/remake/client/animation/util/AnimationIdBuilder.java +++ b/src/main/java/com/tiedup/remake/client/animation/util/AnimationIdBuilder.java @@ -82,9 +82,7 @@ public final class AnimationIdBuilder { return poseType.getBindTypeName(); } - // ======================================== // Unified Build Method - // ======================================== /** * Build animation ID string for entities. diff --git a/src/main/java/com/tiedup/remake/client/events/BlindfoldRenderEventHandler.java b/src/main/java/com/tiedup/remake/client/events/BlindfoldRenderEventHandler.java index 8c5fab1..98c638f 100644 --- a/src/main/java/com/tiedup/remake/client/events/BlindfoldRenderEventHandler.java +++ b/src/main/java/com/tiedup/remake/client/events/BlindfoldRenderEventHandler.java @@ -18,7 +18,6 @@ import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; /** - * Phase 5: Blindfold Rendering * * Based on the original TiedUp! mod (1.12.2) by Yuti & Marl Velius. * @@ -109,9 +108,7 @@ public class BlindfoldRenderEventHandler { // Set opacity: hardcore forces full opacity, otherwise use config float opacity = hardcore ? 1.0F - : ModConfig.CLIENT.blindfoldOverlayOpacity - .get() - .floatValue(); + : ModConfig.CLIENT.blindfoldOverlayOpacity.get().floatValue(); RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, opacity); RenderSystem.enableBlend(); RenderSystem.defaultBlendFunc(); diff --git a/src/main/java/com/tiedup/remake/client/events/LeashProxyClientHandler.java b/src/main/java/com/tiedup/remake/client/events/LeashProxyClientHandler.java index 15c550f..8a3c237 100644 --- a/src/main/java/com/tiedup/remake/client/events/LeashProxyClientHandler.java +++ b/src/main/java/com/tiedup/remake/client/events/LeashProxyClientHandler.java @@ -1,11 +1,11 @@ package com.tiedup.remake.client.events; import com.tiedup.remake.core.TiedUpMod; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.items.ModItems; import com.tiedup.remake.items.base.BindVariant; import com.tiedup.remake.state.IBondageState; import com.tiedup.remake.util.KidnappedHelper; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.Map; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; diff --git a/src/main/java/com/tiedup/remake/client/events/SelfBondageInputHandler.java b/src/main/java/com/tiedup/remake/client/events/SelfBondageInputHandler.java index e2f633d..a06ba1d 100644 --- a/src/main/java/com/tiedup/remake/client/events/SelfBondageInputHandler.java +++ b/src/main/java/com/tiedup/remake/client/events/SelfBondageInputHandler.java @@ -2,8 +2,8 @@ package com.tiedup.remake.client.events; import com.tiedup.remake.items.base.*; import com.tiedup.remake.network.ModNetwork; -import com.tiedup.remake.v2.bondage.IV2BondageItem; import com.tiedup.remake.network.selfbondage.PacketSelfBondage; +import com.tiedup.remake.v2.bondage.IV2BondageItem; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.world.InteractionHand; diff --git a/src/main/java/com/tiedup/remake/client/gltf/GlbParser.java b/src/main/java/com/tiedup/remake/client/gltf/GlbParser.java index be437dc..a4df960 100644 --- a/src/main/java/com/tiedup/remake/client/gltf/GlbParser.java +++ b/src/main/java/com/tiedup/remake/client/gltf/GlbParser.java @@ -31,7 +31,7 @@ public final class GlbParser { private static final int GLB_MAGIC = 0x46546C67; // "glTF" private static final int GLB_VERSION = 2; private static final int CHUNK_JSON = 0x4E4F534A; // "JSON" - private static final int CHUNK_BIN = 0x004E4942; // "BIN\0" + private static final int CHUNK_BIN = 0x004E4942; // "BIN\0" private GlbParser() {} @@ -43,9 +43,12 @@ public final class GlbParser { * @return parsed GltfData * @throws IOException if the file is malformed or I/O fails */ - public static GltfData parse(InputStream input, String debugName) throws IOException { + public static GltfData parse(InputStream input, String debugName) + throws IOException { byte[] allBytes = input.readAllBytes(); - ByteBuffer buf = ByteBuffer.wrap(allBytes).order(ByteOrder.LITTLE_ENDIAN); + ByteBuffer buf = ByteBuffer.wrap(allBytes).order( + ByteOrder.LITTLE_ENDIAN + ); // -- Header -- int magic = buf.getInt(); @@ -54,7 +57,9 @@ public final class GlbParser { } int version = buf.getInt(); if (version != GLB_VERSION) { - throw new IOException("Unsupported GLB version " + version + " in " + debugName); + throw new IOException( + "Unsupported GLB version " + version + " in " + debugName + ); } int totalLength = buf.getInt(); @@ -105,12 +110,18 @@ public final class GlbParser { for (int j = 0; j < skinJoints.size(); j++) { int nodeIdx = skinJoints.get(j).getAsInt(); JsonObject node = nodes.get(nodeIdx).getAsJsonObject(); - String name = node.has("name") ? node.get("name").getAsString() : "joint_" + j; + String name = node.has("name") + ? node.get("name").getAsString() + : "joint_" + j; if (GltfBoneMapper.isKnownBone(name)) { skinJointRemap[j] = filteredJointNodes.size(); filteredJointNodes.add(nodeIdx); } else { - LOGGER.debug("[GltfPipeline] Skipping non-deforming bone: '{}' (node {})", name, nodeIdx); + LOGGER.debug( + "[GltfPipeline] Skipping non-deforming bone: '{}' (node {})", + name, + nodeIdx + ); } } @@ -134,14 +145,18 @@ public final class GlbParser { int nodeIdx = filteredJointNodes.get(j); JsonObject node = nodes.get(nodeIdx).getAsJsonObject(); - jointNames[j] = node.has("name") ? node.get("name").getAsString() : "joint_" + j; + jointNames[j] = node.has("name") + ? node.get("name").getAsString() + : "joint_" + j; // Rest rotation if (node.has("rotation")) { JsonArray r = node.getAsJsonArray("rotation"); restRotations[j] = new Quaternionf( - r.get(0).getAsFloat(), r.get(1).getAsFloat(), - r.get(2).getAsFloat(), r.get(3).getAsFloat() + r.get(0).getAsFloat(), + r.get(1).getAsFloat(), + r.get(2).getAsFloat(), + r.get(3).getAsFloat() ); } else { restRotations[j] = new Quaternionf(); // identity @@ -151,7 +166,9 @@ public final class GlbParser { if (node.has("translation")) { JsonArray t = node.getAsJsonArray("translation"); restTranslations[j] = new Vector3f( - t.get(0).getAsFloat(), t.get(1).getAsFloat(), t.get(2).getAsFloat() + t.get(0).getAsFloat(), + t.get(1).getAsFloat(), + t.get(2).getAsFloat() ); } else { restTranslations[j] = new Vector3f(); @@ -179,7 +196,12 @@ public final class GlbParser { Matrix4f[] inverseBindMatrices = new Matrix4f[jointCount]; if (skin.has("inverseBindMatrices")) { int ibmAccessor = skin.get("inverseBindMatrices").getAsInt(); - float[] ibmData = GlbParserUtils.readFloatAccessor(accessors, bufferViews, binData, ibmAccessor); + float[] ibmData = GlbParserUtils.readFloatAccessor( + accessors, + bufferViews, + binData, + ibmAccessor + ); for (int origJ = 0; origJ < skinJoints.size(); origJ++) { int newJ = skinJointRemap[origJ]; if (newJ >= 0) { @@ -200,7 +222,9 @@ public final class GlbParser { if (meshes != null) { for (int mi = 0; mi < meshes.size(); mi++) { JsonObject mesh = meshes.get(mi).getAsJsonObject(); - String meshName = mesh.has("name") ? mesh.get("name").getAsString() : ""; + String meshName = mesh.has("name") + ? mesh.get("name").getAsString() + : ""; if (!"Player".equals(meshName)) { targetMeshIdx = mi; } @@ -238,15 +262,27 @@ public final class GlbParser { // -- Read this primitive's vertex data -- float[] primPositions = GlbParserUtils.readFloatAccessor( - accessors, bufferViews, binData, + accessors, + bufferViews, + binData, attributes.get("POSITION").getAsInt() ); float[] primNormals = attributes.has("NORMAL") - ? GlbParserUtils.readFloatAccessor(accessors, bufferViews, binData, attributes.get("NORMAL").getAsInt()) + ? GlbParserUtils.readFloatAccessor( + accessors, + bufferViews, + binData, + attributes.get("NORMAL").getAsInt() + ) : new float[primPositions.length]; float[] primTexCoords = attributes.has("TEXCOORD_0") - ? GlbParserUtils.readFloatAccessor(accessors, bufferViews, binData, attributes.get("TEXCOORD_0").getAsInt()) - : new float[primPositions.length / 3 * 2]; + ? GlbParserUtils.readFloatAccessor( + accessors, + bufferViews, + binData, + attributes.get("TEXCOORD_0").getAsInt() + ) + : new float[(primPositions.length / 3) * 2]; int primVertexCount = primPositions.length / 3; @@ -254,13 +290,16 @@ public final class GlbParser { int[] primIndices; if (primitive.has("indices")) { primIndices = GlbParserUtils.readIntAccessor( - accessors, bufferViews, binData, + accessors, + bufferViews, + binData, primitive.get("indices").getAsInt() ); } else { // Non-indexed: generate sequential indices primIndices = new int[primVertexCount]; - for (int i = 0; i < primVertexCount; i++) primIndices[i] = i; + for (int i = 0; i < primVertexCount; i++) primIndices[i] = + i; } // Offset indices by cumulative vertex count from prior primitives @@ -276,14 +315,19 @@ public final class GlbParser { if (attributes.has("JOINTS_0")) { primJoints = GlbParserUtils.readIntAccessor( - accessors, bufferViews, binData, + accessors, + bufferViews, + binData, attributes.get("JOINTS_0").getAsInt() ); // Remap vertex joint indices from original skin order to filtered order for (int i = 0; i < primJoints.length; i++) { int origIdx = primJoints[i]; if (origIdx >= 0 && origIdx < skinJointRemap.length) { - primJoints[i] = skinJointRemap[origIdx] >= 0 ? skinJointRemap[origIdx] : 0; + primJoints[i] = + skinJointRemap[origIdx] >= 0 + ? skinJointRemap[origIdx] + : 0; } else { primJoints[i] = 0; } @@ -291,7 +335,9 @@ public final class GlbParser { } if (attributes.has("WEIGHTS_0")) { primWeights = GlbParserUtils.readFloatAccessor( - accessors, bufferViews, binData, + accessors, + bufferViews, + binData, attributes.get("WEIGHTS_0").getAsInt() ); } @@ -304,10 +350,18 @@ public final class GlbParser { matName = materialNames[matIdx]; } } - boolean isTintable = matName != null && matName.startsWith("tintable_"); + boolean isTintable = + matName != null && matName.startsWith("tintable_"); String tintChannel = isTintable ? matName : null; - parsedPrimitives.add(new GltfData.Primitive(primIndices, matName, isTintable, tintChannel)); + parsedPrimitives.add( + new GltfData.Primitive( + primIndices, + matName, + isTintable, + tintChannel + ) + ); allPositions.add(primPositions); allNormals.add(primNormals); @@ -327,16 +381,26 @@ public final class GlbParser { // Build union of all primitive indices (for backward-compat indices() accessor) int totalIndices = 0; - for (GltfData.Primitive p : parsedPrimitives) totalIndices += p.indices().length; + for (GltfData.Primitive p : parsedPrimitives) + totalIndices += p.indices().length; indices = new int[totalIndices]; int offset = 0; for (GltfData.Primitive p : parsedPrimitives) { - System.arraycopy(p.indices(), 0, indices, offset, p.indices().length); + System.arraycopy( + p.indices(), + 0, + indices, + offset, + p.indices().length + ); offset += p.indices().length; } } else { // Animation-only GLB: no mesh data - LOGGER.info("[GltfPipeline] No mesh found in '{}' (animation-only GLB)", debugName); + LOGGER.info( + "[GltfPipeline] No mesh found in '{}' (animation-only GLB)", + debugName + ); positions = new float[0]; normals = new float[0]; texCoords = new float[0]; @@ -352,12 +416,23 @@ public final class GlbParser { if (animations != null) { for (int ai = 0; ai < animations.size(); ai++) { JsonObject anim = animations.get(ai).getAsJsonObject(); - String animName = anim.has("name") ? anim.get("name").getAsString() : "animation_" + ai; + String animName = anim.has("name") + ? anim.get("name").getAsString() + : "animation_" + ai; // Strip the "ArmatureName|" prefix if present (Blender convention) if (animName.contains("|")) { - animName = animName.substring(animName.lastIndexOf('|') + 1); + animName = animName.substring( + animName.lastIndexOf('|') + 1 + ); } - GltfData.AnimationClip clip = parseAnimation(anim, accessors, bufferViews, binData, nodeToJoint, jointCount); + GltfData.AnimationClip clip = parseAnimation( + anim, + accessors, + bufferViews, + binData, + nodeToJoint, + jointCount + ); if (clip != null) { allClips.put(animName, clip); } @@ -365,19 +440,39 @@ public final class GlbParser { } // Default animation = first clip (for backward compat) - GltfData.AnimationClip animClip = allClips.isEmpty() ? null : allClips.values().iterator().next(); + GltfData.AnimationClip animClip = allClips.isEmpty() + ? null + : allClips.values().iterator().next(); - LOGGER.info("[GltfPipeline] Parsed '{}': vertices={}, indices={}, joints={}, animations={}", - debugName, vertexCount, indices.length, jointCount, allClips.size()); + LOGGER.info( + "[GltfPipeline] Parsed '{}': vertices={}, indices={}, joints={}, animations={}", + debugName, + vertexCount, + indices.length, + jointCount, + allClips.size() + ); for (String name : allClips.keySet()) { LOGGER.debug("[GltfPipeline] animation: '{}'", name); } for (int j = 0; j < jointCount; j++) { Quaternionf rq = restRotations[j]; Vector3f rt = restTranslations[j]; - LOGGER.debug(String.format("[GltfPipeline] joint[%d] = '%s', parent=%d, restQ=(%.3f,%.3f,%.3f,%.3f) restT=(%.3f,%.3f,%.3f)", - j, jointNames[j], parentJointIndices[j], - rq.x, rq.y, rq.z, rq.w, rt.x, rt.y, rt.z)); + LOGGER.debug( + String.format( + "[GltfPipeline] joint[%d] = '%s', parent=%d, restQ=(%.3f,%.3f,%.3f,%.3f) restT=(%.3f,%.3f,%.3f)", + j, + jointNames[j], + parentJointIndices[j], + rq.x, + rq.y, + rq.z, + rq.w, + rt.x, + rt.y, + rt.z + ) + ); } // Log animation translation channels for default clip (BEFORE MC conversion) @@ -387,16 +482,28 @@ public final class GlbParser { if (j < animTrans.length && animTrans[j] != null) { Vector3f at = animTrans[j][0]; // first frame Vector3f rt = restTranslations[j]; - LOGGER.debug(String.format( - "[GltfPipeline] joint[%d] '%s' has ANIM TRANSLATION: (%.4f,%.4f,%.4f) vs rest (%.4f,%.4f,%.4f) delta=(%.4f,%.4f,%.4f)", - j, jointNames[j], - at.x, at.y, at.z, - rt.x, rt.y, rt.z, - at.x - rt.x, at.y - rt.y, at.z - rt.z)); + LOGGER.debug( + String.format( + "[GltfPipeline] joint[%d] '%s' has ANIM TRANSLATION: (%.4f,%.4f,%.4f) vs rest (%.4f,%.4f,%.4f) delta=(%.4f,%.4f,%.4f)", + j, + jointNames[j], + at.x, + at.y, + at.z, + rt.x, + rt.y, + rt.z, + at.x - rt.x, + at.y - rt.y, + at.z - rt.z + ) + ); } } } else { - LOGGER.debug("[GltfPipeline] Default animation has NO translation channels"); + LOGGER.debug( + "[GltfPipeline] Default animation has NO translation channels" + ); } // Save raw glTF rotations BEFORE coordinate conversion (for pose converter) @@ -409,10 +516,18 @@ public final class GlbParser { // Build raw copies of ALL animation clips (before MC conversion) Map rawAllClips = new LinkedHashMap<>(); - for (Map.Entry entry : allClips.entrySet()) { - rawAllClips.put(entry.getKey(), GlbParserUtils.deepCopyClip(entry.getValue())); + for (Map.Entry< + String, + GltfData.AnimationClip + > entry : allClips.entrySet()) { + rawAllClips.put( + entry.getKey(), + GlbParserUtils.deepCopyClip(entry.getValue()) + ); } - GltfData.AnimationClip rawAnimClip = rawAllClips.isEmpty() ? null : rawAllClips.values().iterator().next(); + GltfData.AnimationClip rawAnimClip = rawAllClips.isEmpty() + ? null + : rawAllClips.values().iterator().next(); // Convert from glTF coordinate system (Y-up, faces +Z) to MC (Y-up, faces -Z) // This is a 180° rotation around Y: negate X and Z for all spatial data @@ -420,22 +535,39 @@ public final class GlbParser { for (GltfData.AnimationClip clip : allClips.values()) { GlbParserUtils.convertAnimationToMinecraftSpace(clip, jointCount); } - convertToMinecraftSpace(positions, normals, restTranslations, restRotations, - inverseBindMatrices, null, jointCount); // pass null — clips already converted above - LOGGER.debug("[GltfPipeline] Converted all data to Minecraft coordinate space"); + convertToMinecraftSpace( + positions, + normals, + restTranslations, + restRotations, + inverseBindMatrices, + null, + jointCount + ); // pass null — clips already converted above + LOGGER.debug( + "[GltfPipeline] Converted all data to Minecraft coordinate space" + ); return new GltfData( - positions, normals, texCoords, - indices, meshJoints, weights, - jointNames, parentJointIndices, + positions, + normals, + texCoords, + indices, + meshJoints, + weights, + jointNames, + parentJointIndices, inverseBindMatrices, - restRotations, restTranslations, + restRotations, + restTranslations, rawRestRotations, rawAnimClip, animClip, - allClips, rawAllClips, + allClips, + rawAllClips, parsedPrimitives, - vertexCount, jointCount + vertexCount, + jointCount ); } @@ -443,9 +575,11 @@ public final class GlbParser { private static GltfData.AnimationClip parseAnimation( JsonObject animation, - JsonArray accessors, JsonArray bufferViews, + JsonArray accessors, + JsonArray bufferViews, ByteBuffer binData, - int[] nodeToJoint, int jointCount + int[] nodeToJoint, + int jointCount ) { JsonArray channels = animation.getAsJsonArray("channels"); JsonArray samplers = animation.getAsJsonArray("samplers"); @@ -465,27 +599,35 @@ public final class GlbParser { String path = target.get("path").getAsString(); int nodeIdx = target.get("node").getAsInt(); - if (nodeIdx >= nodeToJoint.length || nodeToJoint[nodeIdx] < 0) continue; + if ( + nodeIdx >= nodeToJoint.length || nodeToJoint[nodeIdx] < 0 + ) continue; int jointIdx = nodeToJoint[nodeIdx]; int samplerIdx = channel.get("sampler").getAsInt(); JsonObject sampler = samplers.get(samplerIdx).getAsJsonObject(); float[] times = GlbParserUtils.readFloatAccessor( - accessors, bufferViews, binData, + accessors, + bufferViews, + binData, sampler.get("input").getAsInt() ); if ("rotation".equals(path)) { float[] quats = GlbParserUtils.readFloatAccessor( - accessors, bufferViews, binData, + accessors, + bufferViews, + binData, sampler.get("output").getAsInt() ); Quaternionf[] qArr = new Quaternionf[times.length]; for (int i = 0; i < times.length; i++) { qArr[i] = new Quaternionf( - quats[i * 4], quats[i * 4 + 1], - quats[i * 4 + 2], quats[i * 4 + 3] + quats[i * 4], + quats[i * 4 + 1], + quats[i * 4 + 2], + quats[i * 4 + 3] ); } rotJoints.add(jointIdx); @@ -493,13 +635,17 @@ public final class GlbParser { rotValues.add(qArr); } else if ("translation".equals(path)) { float[] vecs = GlbParserUtils.readFloatAccessor( - accessors, bufferViews, binData, + accessors, + bufferViews, + binData, sampler.get("output").getAsInt() ); Vector3f[] tArr = new Vector3f[times.length]; for (int i = 0; i < times.length; i++) { tArr[i] = new Vector3f( - vecs[i * 3], vecs[i * 3 + 1], vecs[i * 3 + 2] + vecs[i * 3], + vecs[i * 3 + 1], + vecs[i * 3 + 2] ); } transJoints.add(jointIdx); @@ -523,7 +669,8 @@ public final class GlbParser { Quaternionf[] vals = rotValues.get(i); rotations[jIdx] = new Quaternionf[frameCount]; for (int f = 0; f < frameCount; f++) { - rotations[jIdx][f] = f < vals.length ? vals[f] : vals[vals.length - 1]; + rotations[jIdx][f] = + f < vals.length ? vals[f] : vals[vals.length - 1]; } } @@ -534,19 +681,27 @@ public final class GlbParser { Vector3f[] vals = transValues.get(i); translations[jIdx] = new Vector3f[frameCount]; for (int f = 0; f < frameCount; f++) { - translations[jIdx][f] = f < vals.length - ? new Vector3f(vals[f]) - : new Vector3f(vals[vals.length - 1]); + translations[jIdx][f] = + f < vals.length + ? new Vector3f(vals[f]) + : new Vector3f(vals[vals.length - 1]); } } // Log translation channels found if (!transJoints.isEmpty()) { - LOGGER.debug("[GltfPipeline] Animation has {} translation channel(s)", - transJoints.size()); + LOGGER.debug( + "[GltfPipeline] Animation has {} translation channel(s)", + transJoints.size() + ); } - return new GltfData.AnimationClip(timestamps, rotations, translations, frameCount); + return new GltfData.AnimationClip( + timestamps, + rotations, + translations, + frameCount + ); } // ---- Coordinate system conversion ---- @@ -562,14 +717,17 @@ public final class GlbParser { * For matrices: M → C * M * C where C = diag(-1, -1, 1, 1) */ private static void convertToMinecraftSpace( - float[] positions, float[] normals, - Vector3f[] restTranslations, Quaternionf[] restRotations, + float[] positions, + float[] normals, + Vector3f[] restTranslations, + Quaternionf[] restRotations, Matrix4f[] inverseBindMatrices, - GltfData.AnimationClip animClip, int jointCount + GltfData.AnimationClip animClip, + int jointCount ) { // Vertex positions: negate X and Y for (int i = 0; i < positions.length; i += 3) { - positions[i] = -positions[i]; // X + positions[i] = -positions[i]; // X positions[i + 1] = -positions[i + 1]; // Y } diff --git a/src/main/java/com/tiedup/remake/client/gltf/GlbParserUtils.java b/src/main/java/com/tiedup/remake/client/gltf/GlbParserUtils.java index e5e791b..0bd3c2e 100644 --- a/src/main/java/com/tiedup/remake/client/gltf/GlbParserUtils.java +++ b/src/main/java/com/tiedup/remake/client/gltf/GlbParserUtils.java @@ -77,8 +77,10 @@ public final class GlbParserUtils { // ---- Accessor reading utilities ---- public static float[] readFloatAccessor( - JsonArray accessors, JsonArray bufferViews, - ByteBuffer binData, int accessorIdx + JsonArray accessors, + JsonArray bufferViews, + ByteBuffer binData, + int accessorIdx ) { JsonObject accessor = accessors.get(accessorIdx).getAsJsonObject(); int count = accessor.get("count").getAsInt(); @@ -88,9 +90,14 @@ public final class GlbParserUtils { int bvIdx = accessor.get("bufferView").getAsInt(); JsonObject bv = bufferViews.get(bvIdx).getAsJsonObject(); - int byteOffset = (bv.has("byteOffset") ? bv.get("byteOffset").getAsInt() : 0) - + (accessor.has("byteOffset") ? accessor.get("byteOffset").getAsInt() : 0); - int byteStride = bv.has("byteStride") ? bv.get("byteStride").getAsInt() : 0; + int byteOffset = + (bv.has("byteOffset") ? bv.get("byteOffset").getAsInt() : 0) + + (accessor.has("byteOffset") + ? accessor.get("byteOffset").getAsInt() + : 0); + int byteStride = bv.has("byteStride") + ? bv.get("byteStride").getAsInt() + : 0; int totalElements = count * components; float[] result = new float[totalElements]; @@ -102,7 +109,10 @@ public final class GlbParserUtils { int pos = byteOffset + i * stride; for (int c = 0; c < components; c++) { binData.position(pos + c * componentSize); - result[i * components + c] = readComponentAsFloat(binData, componentType); + result[i * components + c] = readComponentAsFloat( + binData, + componentType + ); } } @@ -110,8 +120,10 @@ public final class GlbParserUtils { } public static int[] readIntAccessor( - JsonArray accessors, JsonArray bufferViews, - ByteBuffer binData, int accessorIdx + JsonArray accessors, + JsonArray bufferViews, + ByteBuffer binData, + int accessorIdx ) { JsonObject accessor = accessors.get(accessorIdx).getAsJsonObject(); int count = accessor.get("count").getAsInt(); @@ -121,9 +133,14 @@ public final class GlbParserUtils { int bvIdx = accessor.get("bufferView").getAsInt(); JsonObject bv = bufferViews.get(bvIdx).getAsJsonObject(); - int byteOffset = (bv.has("byteOffset") ? bv.get("byteOffset").getAsInt() : 0) - + (accessor.has("byteOffset") ? accessor.get("byteOffset").getAsInt() : 0); - int byteStride = bv.has("byteStride") ? bv.get("byteStride").getAsInt() : 0; + int byteOffset = + (bv.has("byteOffset") ? bv.get("byteOffset").getAsInt() : 0) + + (accessor.has("byteOffset") + ? accessor.get("byteOffset").getAsInt() + : 0); + int byteStride = bv.has("byteStride") + ? bv.get("byteStride").getAsInt() + : 0; int totalElements = count * components; int[] result = new int[totalElements]; @@ -135,22 +152,31 @@ public final class GlbParserUtils { int pos = byteOffset + i * stride; for (int c = 0; c < components; c++) { binData.position(pos + c * componentSize); - result[i * components + c] = readComponentAsInt(binData, componentType); + result[i * components + c] = readComponentAsInt( + binData, + componentType + ); } } return result; } - public static float readComponentAsFloat(ByteBuffer buf, int componentType) { + public static float readComponentAsFloat( + ByteBuffer buf, + int componentType + ) { return switch (componentType) { case FLOAT -> buf.getFloat(); case BYTE -> buf.get() / 127.0f; case UNSIGNED_BYTE -> (buf.get() & 0xFF) / 255.0f; case SHORT -> buf.getShort() / 32767.0f; case UNSIGNED_SHORT -> (buf.getShort() & 0xFFFF) / 65535.0f; - case UNSIGNED_INT -> (buf.getInt() & 0xFFFFFFFFL) / (float) 0xFFFFFFFFL; - default -> throw new IllegalArgumentException("Unknown component type: " + componentType); + case UNSIGNED_INT -> (buf.getInt() & 0xFFFFFFFFL) / + (float) 0xFFFFFFFFL; + default -> throw new IllegalArgumentException( + "Unknown component type: " + componentType + ); }; } @@ -162,7 +188,9 @@ public final class GlbParserUtils { case UNSIGNED_SHORT -> buf.getShort() & 0xFFFF; case UNSIGNED_INT -> buf.getInt(); case FLOAT -> (int) buf.getFloat(); - default -> throw new IllegalArgumentException("Unknown component type: " + componentType); + default -> throw new IllegalArgumentException( + "Unknown component type: " + componentType + ); }; } @@ -173,7 +201,9 @@ public final class GlbParserUtils { case "VEC3" -> 3; case "VEC4" -> 4; case "MAT4" -> 16; - default -> throw new IllegalArgumentException("Unknown accessor type: " + type); + default -> throw new IllegalArgumentException( + "Unknown accessor type: " + type + ); }; } @@ -182,7 +212,9 @@ public final class GlbParserUtils { case BYTE, UNSIGNED_BYTE -> 1; case SHORT, UNSIGNED_SHORT -> 2; case UNSIGNED_INT, FLOAT -> 4; - default -> throw new IllegalArgumentException("Unknown component type: " + componentType); + default -> throw new IllegalArgumentException( + "Unknown component type: " + componentType + ); }; } @@ -191,13 +223,18 @@ public final class GlbParserUtils { /** * Deep-copy an AnimationClip (preserves original data before MC conversion). */ - public static GltfData.AnimationClip deepCopyClip(GltfData.AnimationClip clip) { - Quaternionf[][] rawRotations = new Quaternionf[clip.rotations().length][]; + public static GltfData.AnimationClip deepCopyClip( + GltfData.AnimationClip clip + ) { + Quaternionf[][] rawRotations = + new Quaternionf[clip.rotations().length][]; for (int j = 0; j < clip.rotations().length; j++) { if (clip.rotations()[j] != null) { rawRotations[j] = new Quaternionf[clip.rotations()[j].length]; for (int f = 0; f < clip.rotations()[j].length; f++) { - rawRotations[j][f] = new Quaternionf(clip.rotations()[j][f]); + rawRotations[j][f] = new Quaternionf( + clip.rotations()[j][f] + ); } } } @@ -206,15 +243,20 @@ public final class GlbParserUtils { rawTranslations = new Vector3f[clip.translations().length][]; for (int j = 0; j < clip.translations().length; j++) { if (clip.translations()[j] != null) { - rawTranslations[j] = new Vector3f[clip.translations()[j].length]; + rawTranslations[j] = + new Vector3f[clip.translations()[j].length]; for (int f = 0; f < clip.translations()[j].length; f++) { - rawTranslations[j][f] = new Vector3f(clip.translations()[j][f]); + rawTranslations[j][f] = new Vector3f( + clip.translations()[j][f] + ); } } } } return new GltfData.AnimationClip( - clip.timestamps().clone(), rawRotations, rawTranslations, + clip.timestamps().clone(), + rawRotations, + rawTranslations, clip.frameCount() ); } @@ -225,7 +267,10 @@ public final class GlbParserUtils { * Convert an animation clip's rotations and translations to MC space. * Negate qx/qy for rotations and negate tx/ty for translations. */ - public static void convertAnimationToMinecraftSpace(GltfData.AnimationClip clip, int jointCount) { + public static void convertAnimationToMinecraftSpace( + GltfData.AnimationClip clip, + int jointCount + ) { if (clip == null) return; Quaternionf[][] rotations = clip.rotations(); diff --git a/src/main/java/com/tiedup/remake/client/gltf/GltfAnimationApplier.java b/src/main/java/com/tiedup/remake/client/gltf/GltfAnimationApplier.java index f28ef0c..5d2f4f8 100644 --- a/src/main/java/com/tiedup/remake/client/gltf/GltfAnimationApplier.java +++ b/src/main/java/com/tiedup/remake/client/gltf/GltfAnimationApplier.java @@ -13,7 +13,6 @@ import java.util.Set; import java.util.TreeSet; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; -import org.jetbrains.annotations.Nullable; import net.minecraft.client.Minecraft; import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.resources.ResourceLocation; @@ -22,6 +21,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.jetbrains.annotations.Nullable; /** * V2 Animation Applier -- manages dual-layer animation for V2 bondage items. @@ -59,22 +59,23 @@ public final class GltfAnimationApplier { * Keyed by "animSource#context#ownedPartsHash". * Same GLB + same context + same owned parts = same KeyframeAnimation. */ - private static final Map itemAnimCache = new ConcurrentHashMap<>(); + private static final Map itemAnimCache = + new ConcurrentHashMap<>(); /** * Track which composite state is currently active per entity, to avoid redundant replays. * Keyed by entity UUID, value is "animSource|context|sortedParts". */ - private static final Map activeStateKeys = new ConcurrentHashMap<>(); + private static final Map activeStateKeys = + new ConcurrentHashMap<>(); /** Track cache keys where GLB loading failed, to avoid per-tick retries. */ - private static final Set failedLoadKeys = ConcurrentHashMap.newKeySet(); + private static final Set failedLoadKeys = + ConcurrentHashMap.newKeySet(); private GltfAnimationApplier() {} - // ======================================== // INIT (legacy) - // ======================================== /** * Legacy init method -- called by GltfClientSetup. @@ -84,9 +85,7 @@ public final class GltfAnimationApplier { // No-op: animation layers are managed by BondageAnimationManager } - // ======================================== // V2 DUAL-LAYER API - // ======================================== /** * Apply the full V2 animation state: context layer + item layer. @@ -113,12 +112,17 @@ public final class GltfAnimationApplier { * @param ownership bone ownership: which parts this item owns vs other items * @return true if the item layer animation was applied successfully */ - public static boolean applyV2Animation(LivingEntity entity, ResourceLocation modelLoc, - @Nullable ResourceLocation animationSource, - AnimationContext context, RegionBoneMapper.BoneOwnership ownership) { + public static boolean applyV2Animation( + LivingEntity entity, + ResourceLocation modelLoc, + @Nullable ResourceLocation animationSource, + AnimationContext context, + RegionBoneMapper.BoneOwnership ownership + ) { if (entity == null || modelLoc == null) return false; - ResourceLocation animSource = animationSource != null ? animationSource : modelLoc; + ResourceLocation animSource = + animationSource != null ? animationSource : modelLoc; // Cache key includes both owned and enabled parts for full disambiguation String ownedKey = canonicalPartsKey(ownership.thisParts()); String enabledKey = canonicalPartsKey(ownership.enabledParts()); @@ -135,7 +139,9 @@ public final class GltfAnimationApplier { // Parts owned by ANY item (this or others) are disabled on the context layer. // Only free parts remain enabled on context. KeyframeAnimation contextAnim = ContextAnimationFactory.create( - context, ownership.disabledOnContext()); + context, + ownership.disabledOnContext() + ); if (contextAnim != null) { BondageAnimationManager.playContext(entity, contextAnim); } @@ -151,18 +157,31 @@ public final class GltfAnimationApplier { KeyframeAnimation itemAnim = itemAnimCache.get(itemCacheKey); if (itemAnim == null) { - GltfData animData = GlbAnimationResolver.resolveAnimationData(modelLoc, animationSource); + GltfData animData = GlbAnimationResolver.resolveAnimationData( + modelLoc, + animationSource + ); if (animData == null) { - LOGGER.warn("[GltfPipeline] Failed to load animation GLB: {}", animSource); + LOGGER.warn( + "[GltfPipeline] Failed to load animation GLB: {}", + animSource + ); failedLoadKeys.add(itemCacheKey); activeStateKeys.put(entity.getUUID(), stateKey); return false; } // Resolve which named animation to use (with fallback chain + variant selection) - String glbAnimName = GlbAnimationResolver.resolve(animData, context); + String glbAnimName = GlbAnimationResolver.resolve( + animData, + context + ); // Pass both owned parts and enabled parts (owned + free) for selective enabling itemAnim = GltfPoseConverter.convertSelective( - animData, glbAnimName, ownership.thisParts(), ownership.enabledParts()); + animData, + glbAnimName, + ownership.thisParts(), + ownership.enabledParts() + ); itemAnimCache.put(itemCacheKey, itemAnim); } @@ -185,16 +204,24 @@ public final class GltfAnimationApplier { * @param allOwnedParts union of all owned parts across all items * @return true if the composite animation was applied */ - public static boolean applyMultiItemV2Animation(LivingEntity entity, - List items, - AnimationContext context, Set allOwnedParts) { + public static boolean applyMultiItemV2Animation( + LivingEntity entity, + List items, + AnimationContext context, + Set allOwnedParts + ) { if (entity == null || items.isEmpty()) return false; // Build composite state key StringBuilder keyBuilder = new StringBuilder(); for (RegionBoneMapper.V2ItemAnimInfo item : items) { - ResourceLocation src = item.animSource() != null ? item.animSource() : item.modelLoc(); - keyBuilder.append(src).append(':').append(canonicalPartsKey(item.ownedParts())).append(';'); + ResourceLocation src = + item.animSource() != null ? item.animSource() : item.modelLoc(); + keyBuilder + .append(src) + .append(':') + .append(canonicalPartsKey(item.ownedParts())) + .append(';'); } keyBuilder.append(context.name()); String stateKey = keyBuilder.toString(); @@ -205,7 +232,10 @@ public final class GltfAnimationApplier { } // === Layer 1: Context animation === - KeyframeAnimation contextAnim = ContextAnimationFactory.create(context, allOwnedParts); + KeyframeAnimation contextAnim = ContextAnimationFactory.create( + context, + allOwnedParts + ); if (contextAnim != null) { BondageAnimationManager.playContext(entity, contextAnim); } @@ -222,7 +252,8 @@ public final class GltfAnimationApplier { if (compositeAnim == null) { KeyframeAnimation.AnimationBuilder builder = new KeyframeAnimation.AnimationBuilder( - dev.kosmx.playerAnim.core.data.AnimationFormat.JSON_EMOTECRAFT); + dev.kosmx.playerAnim.core.data.AnimationFormat.JSON_EMOTECRAFT + ); builder.beginTick = 0; builder.endTick = 1; builder.stopTick = 1; @@ -234,15 +265,27 @@ public final class GltfAnimationApplier { for (int i = 0; i < items.size(); i++) { RegionBoneMapper.V2ItemAnimInfo item = items.get(i); - ResourceLocation animSource = item.animSource() != null ? item.animSource() : item.modelLoc(); + ResourceLocation animSource = + item.animSource() != null + ? item.animSource() + : item.modelLoc(); - GltfData animData = GlbAnimationResolver.resolveAnimationData(item.modelLoc(), item.animSource()); + GltfData animData = GlbAnimationResolver.resolveAnimationData( + item.modelLoc(), + item.animSource() + ); if (animData == null) { - LOGGER.warn("[GltfPipeline] Failed to load GLB for multi-item: {}", animSource); + LOGGER.warn( + "[GltfPipeline] Failed to load GLB for multi-item: {}", + animSource + ); continue; } - String glbAnimName = GlbAnimationResolver.resolve(animData, context); + String glbAnimName = GlbAnimationResolver.resolve( + animData, + context + ); GltfData.AnimationClip rawClip; if (glbAnimName != null) { rawClip = animData.getRawAnimation(glbAnimName); @@ -257,7 +300,9 @@ public final class GltfAnimationApplier { // if the item declares per-animation bone filtering. Set effectiveParts = item.ownedParts(); if (glbAnimName != null && !item.animationBones().isEmpty()) { - Set override = item.animationBones().get(glbAnimName); + Set override = item + .animationBones() + .get(glbAnimName); if (override != null) { Set filtered = new HashSet<>(override); filtered.retainAll(item.ownedParts()); @@ -268,11 +313,20 @@ public final class GltfAnimationApplier { } GltfPoseConverter.addBonesToBuilder( - builder, animData, rawClip, effectiveParts); + builder, + animData, + rawClip, + effectiveParts + ); anyLoaded = true; - LOGGER.debug("[GltfPipeline] Multi-item: {} -> owned={}, effective={}, anim={}", - animSource, item.ownedParts(), effectiveParts, glbAnimName); + LOGGER.debug( + "[GltfPipeline] Multi-item: {} -> owned={}, effective={}, anim={}", + animSource, + item.ownedParts(), + effectiveParts, + glbAnimName + ); } if (!anyLoaded) { @@ -284,9 +338,19 @@ public final class GltfAnimationApplier { // Enable only owned parts on the item layer. // Free parts (head, body, etc. not owned by any item) are disabled here // so they pass through to the context layer / vanilla animation. - String[] allPartNames = {"head", "body", "rightArm", "leftArm", "rightLeg", "leftLeg"}; + String[] allPartNames = { + "head", + "body", + "rightArm", + "leftArm", + "rightLeg", + "leftLeg", + }; for (String partName : allPartNames) { - KeyframeAnimation.StateCollection part = getPartByName(builder, partName); + KeyframeAnimation.StateCollection part = getPartByName( + builder, + partName + ); if (part != null) { if (allOwnedParts.contains(partName)) { part.fullyEnablePart(false); @@ -305,9 +369,7 @@ public final class GltfAnimationApplier { return true; } - // ======================================== // CLEAR / QUERY - // ======================================== /** * Clear all V2 animation layers from an entity and remove tracking. @@ -342,9 +404,7 @@ public final class GltfAnimationApplier { activeStateKeys.remove(entityId); } - // ======================================== // CACHE MANAGEMENT - // ======================================== /** * Invalidate all cached item animations and tracking state. @@ -373,9 +433,7 @@ public final class GltfAnimationApplier { ContextAnimationFactory.clearCache(); } - // ======================================== // LEGACY F9 DEBUG TOGGLE - // ======================================== private static boolean debugEnabled = false; @@ -386,19 +444,29 @@ public final class GltfAnimationApplier { */ public static void toggle() { debugEnabled = !debugEnabled; - LOGGER.info("[GltfPipeline] Debug toggle: {}", debugEnabled ? "ON" : "OFF"); + LOGGER.info( + "[GltfPipeline] Debug toggle: {}", + debugEnabled ? "ON" : "OFF" + ); AbstractClientPlayer player = Minecraft.getInstance().player; if (player == null) return; if (debugEnabled) { ResourceLocation modelLoc = ResourceLocation.fromNamespaceAndPath( - "tiedup", "models/gltf/v2/handcuffs/cuffs_prototype.glb" + "tiedup", + "models/gltf/v2/handcuffs/cuffs_prototype.glb" ); Set armParts = Set.of("rightArm", "leftArm"); RegionBoneMapper.BoneOwnership debugOwnership = new RegionBoneMapper.BoneOwnership(armParts, Set.of()); - applyV2Animation(player, modelLoc, null, AnimationContext.STAND_IDLE, debugOwnership); + applyV2Animation( + player, + modelLoc, + null, + AnimationContext.STAND_IDLE, + debugOwnership + ); } else { clearV2Animation(player); } @@ -411,16 +479,17 @@ public final class GltfAnimationApplier { return debugEnabled; } - // ======================================== // INTERNAL - // ======================================== /** * Build cache key for item-layer animations. * Format: "animSource#contextName#sortedParts" */ - private static String buildItemCacheKey(ResourceLocation animSource, - AnimationContext context, String partsKey) { + private static String buildItemCacheKey( + ResourceLocation animSource, + AnimationContext context, + String partsKey + ) { return animSource + "#" + context.name() + "#" + partsKey; } @@ -436,7 +505,9 @@ public final class GltfAnimationApplier { * Look up an {@link KeyframeAnimation.StateCollection} by part name on a builder. */ private static KeyframeAnimation.StateCollection getPartByName( - KeyframeAnimation.AnimationBuilder builder, String name) { + KeyframeAnimation.AnimationBuilder builder, + String name + ) { return switch (name) { case "head" -> builder.head; case "body" -> builder.body; diff --git a/src/main/java/com/tiedup/remake/client/gltf/GltfBoneMapper.java b/src/main/java/com/tiedup/remake/client/gltf/GltfBoneMapper.java index dc8ed95..2982ea0 100644 --- a/src/main/java/com/tiedup/remake/client/gltf/GltfBoneMapper.java +++ b/src/main/java/com/tiedup/remake/client/gltf/GltfBoneMapper.java @@ -20,16 +20,22 @@ public final class GltfBoneMapper { /** Lower bones that represent bend (elbow/knee) */ private static final Set LOWER_BONES = Set.of( - "leftLowerArm", "rightLowerArm", - "leftLowerLeg", "rightLowerLeg" + "leftLowerArm", + "rightLowerArm", + "leftLowerLeg", + "rightLowerLeg" ); /** Maps lower bone name -> corresponding upper bone name */ private static final Map LOWER_TO_UPPER = Map.of( - "leftLowerArm", "leftUpperArm", - "rightLowerArm", "rightUpperArm", - "leftLowerLeg", "leftUpperLeg", - "rightLowerLeg", "rightUpperLeg" + "leftLowerArm", + "leftUpperArm", + "rightLowerArm", + "rightUpperArm", + "leftLowerLeg", + "leftUpperLeg", + "rightLowerLeg", + "rightUpperLeg" ); static { @@ -55,7 +61,10 @@ public final class GltfBoneMapper { * @param boneName glTF bone name * @return the ModelPart, or null if not mapped */ - public static ModelPart getModelPart(HumanoidModel model, String boneName) { + public static ModelPart getModelPart( + HumanoidModel model, + String boneName + ) { String partName = BONE_TO_PART.get(boneName); if (partName == null) return null; diff --git a/src/main/java/com/tiedup/remake/client/gltf/GltfCache.java b/src/main/java/com/tiedup/remake/client/gltf/GltfCache.java index 2f9ee91..2739e56 100644 --- a/src/main/java/com/tiedup/remake/client/gltf/GltfCache.java +++ b/src/main/java/com/tiedup/remake/client/gltf/GltfCache.java @@ -19,7 +19,8 @@ import org.apache.logging.log4j.Logger; public final class GltfCache { private static final Logger LOGGER = LogManager.getLogger("GltfPipeline"); - private static final Map CACHE = new ConcurrentHashMap<>(); + private static final Map CACHE = + new ConcurrentHashMap<>(); private GltfCache() {} diff --git a/src/main/java/com/tiedup/remake/client/gltf/GltfClientSetup.java b/src/main/java/com/tiedup/remake/client/gltf/GltfClientSetup.java index dd36473..4527318 100644 --- a/src/main/java/com/tiedup/remake/client/gltf/GltfClientSetup.java +++ b/src/main/java/com/tiedup/remake/client/gltf/GltfClientSetup.java @@ -8,6 +8,7 @@ import com.tiedup.remake.v2.bondage.datadriven.DataDrivenItemReloadListener; import net.minecraft.client.KeyMapping; import net.minecraft.client.renderer.entity.player.PlayerRenderer; import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.server.packs.resources.SimplePreparableReloadListener; import net.minecraft.util.profiling.ProfilerFiller; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.EntityRenderersEvent; @@ -17,7 +18,6 @@ import net.minecraftforge.event.TickEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; -import net.minecraft.server.packs.resources.SimplePreparableReloadListener; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -59,7 +59,9 @@ public final class GltfClientSetup { } @SubscribeEvent - public static void onRegisterKeybindings(RegisterKeyMappingsEvent event) { + public static void onRegisterKeybindings( + RegisterKeyMappingsEvent event + ) { event.register(TOGGLE_KEY); LOGGER.info("[GltfPipeline] Keybind registered: F9"); } @@ -71,16 +73,24 @@ public final class GltfClientSetup { var defaultRenderer = event.getSkin("default"); if (defaultRenderer instanceof PlayerRenderer playerRenderer) { playerRenderer.addLayer(new GltfRenderLayer(playerRenderer)); - playerRenderer.addLayer(new V2BondageRenderLayer<>(playerRenderer)); - LOGGER.info("[GltfPipeline] Render layers added to 'default' player renderer"); + playerRenderer.addLayer( + new V2BondageRenderLayer<>(playerRenderer) + ); + LOGGER.info( + "[GltfPipeline] Render layers added to 'default' player renderer" + ); } // Add both layers to slim player renderer (Alex) var slimRenderer = event.getSkin("slim"); if (slimRenderer instanceof PlayerRenderer playerRenderer) { playerRenderer.addLayer(new GltfRenderLayer(playerRenderer)); - playerRenderer.addLayer(new V2BondageRenderLayer<>(playerRenderer)); - LOGGER.info("[GltfPipeline] Render layers added to 'slim' player renderer"); + playerRenderer.addLayer( + new V2BondageRenderLayer<>(playerRenderer) + ); + LOGGER.info( + "[GltfPipeline] Render layers added to 'slim' player renderer" + ); } } @@ -89,32 +99,47 @@ public final class GltfClientSetup { * This ensures re-exported GLB models are picked up without restarting the game. */ @SubscribeEvent - public static void onRegisterReloadListeners(RegisterClientReloadListenersEvent event) { - event.registerReloadListener(new SimplePreparableReloadListener() { - @Override - protected Void prepare(ResourceManager resourceManager, ProfilerFiller profiler) { - return null; - } + public static void onRegisterReloadListeners( + RegisterClientReloadListenersEvent event + ) { + event.registerReloadListener( + new SimplePreparableReloadListener() { + @Override + protected Void prepare( + ResourceManager resourceManager, + ProfilerFiller profiler + ) { + return null; + } - @Override - protected void apply(Void nothing, ResourceManager resourceManager, ProfilerFiller profiler) { - GltfCache.clearCache(); - GltfAnimationApplier.invalidateCache(); - GltfMeshRenderer.clearRenderTypeCache(); - // Reload context GLB animations from resource packs FIRST, - // then clear the factory cache so it rebuilds against the - // new GLB registry (prevents stale JSON fallback caching). - ContextGlbRegistry.reload(resourceManager); - ContextAnimationFactory.clearCache(); - com.tiedup.remake.v2.furniture.client.FurnitureGltfCache.clear(); - LOGGER.info("[GltfPipeline] Caches cleared on resource reload"); + @Override + protected void apply( + Void nothing, + ResourceManager resourceManager, + ProfilerFiller profiler + ) { + GltfCache.clearCache(); + GltfAnimationApplier.invalidateCache(); + GltfMeshRenderer.clearRenderTypeCache(); + // Reload context GLB animations from resource packs FIRST, + // then clear the factory cache so it rebuilds against the + // new GLB registry (prevents stale JSON fallback caching). + ContextGlbRegistry.reload(resourceManager); + ContextAnimationFactory.clearCache(); + com.tiedup.remake.v2.furniture.client.FurnitureGltfCache.clear(); + LOGGER.info( + "[GltfPipeline] Caches cleared on resource reload" + ); + } } - }); + ); LOGGER.info("[GltfPipeline] Resource reload listener registered"); // Data-driven bondage item definitions (tiedup_items/*.json) event.registerReloadListener(new DataDrivenItemReloadListener()); - LOGGER.info("[GltfPipeline] Data-driven item reload listener registered"); + LOGGER.info( + "[GltfPipeline] Data-driven item reload listener registered" + ); } } diff --git a/src/main/java/com/tiedup/remake/client/gltf/GltfData.java b/src/main/java/com/tiedup/remake/client/gltf/GltfData.java index f1a4541..7b0c4e3 100644 --- a/src/main/java/com/tiedup/remake/client/gltf/GltfData.java +++ b/src/main/java/com/tiedup/remake/client/gltf/GltfData.java @@ -21,14 +21,14 @@ import org.joml.Vector3f; public final class GltfData { // -- Mesh geometry (flattened arrays) -- - private final float[] positions; // VEC3, length = vertexCount * 3 - private final float[] normals; // VEC3, length = vertexCount * 3 - private final float[] texCoords; // VEC2, length = vertexCount * 2 - private final int[] indices; // triangle indices + private final float[] positions; // VEC3, length = vertexCount * 3 + private final float[] normals; // VEC3, length = vertexCount * 3 + private final float[] texCoords; // VEC2, length = vertexCount * 2 + private final int[] indices; // triangle indices // -- Skinning data (per-vertex, 4 influences) -- - private final int[] joints; // 4 joint indices per vertex, length = vertexCount * 4 - private final float[] weights; // 4 weights per vertex, length = vertexCount * 4 + private final int[] joints; // 4 joint indices per vertex, length = vertexCount * 4 + private final float[] weights; // 4 weights per vertex, length = vertexCount * 4 // -- Bone hierarchy (MC-converted for skinning) -- private final String[] jointNames; @@ -39,6 +39,7 @@ public final class GltfData { // -- Raw glTF rotations (unconverted, for pose conversion) -- private final Quaternionf[] rawGltfRestRotations; + @Nullable private final AnimationClip rawGltfAnimation; @@ -47,8 +48,8 @@ public final class GltfData { private final AnimationClip animation; // -- Multiple named animations -- - private final Map namedAnimations; // MC-converted - private final Map rawNamedAnimations; // raw glTF space + private final Map namedAnimations; // MC-converted + private final Map rawNamedAnimations; // raw glTF space // -- Per-primitive material/tint info -- private final List primitives; @@ -61,18 +62,25 @@ public final class GltfData { * Full constructor with multiple named animations and per-primitive data. */ public GltfData( - float[] positions, float[] normals, float[] texCoords, - int[] indices, int[] joints, float[] weights, - String[] jointNames, int[] parentJointIndices, + float[] positions, + float[] normals, + float[] texCoords, + int[] indices, + int[] joints, + float[] weights, + String[] jointNames, + int[] parentJointIndices, Matrix4f[] inverseBindMatrices, - Quaternionf[] restRotations, Vector3f[] restTranslations, + Quaternionf[] restRotations, + Vector3f[] restTranslations, Quaternionf[] rawGltfRestRotations, @Nullable AnimationClip rawGltfAnimation, @Nullable AnimationClip animation, Map namedAnimations, Map rawNamedAnimations, List primitives, - int vertexCount, int jointCount + int vertexCount, + int jointCount ) { this.positions = positions; this.normals = normals; @@ -88,8 +96,12 @@ public final class GltfData { this.rawGltfRestRotations = rawGltfRestRotations; this.rawGltfAnimation = rawGltfAnimation; this.animation = animation; - this.namedAnimations = Collections.unmodifiableMap(new LinkedHashMap<>(namedAnimations)); - this.rawNamedAnimations = Collections.unmodifiableMap(new LinkedHashMap<>(rawNamedAnimations)); + this.namedAnimations = Collections.unmodifiableMap( + new LinkedHashMap<>(namedAnimations) + ); + this.rawNamedAnimations = Collections.unmodifiableMap( + new LinkedHashMap<>(rawNamedAnimations) + ); this.primitives = List.copyOf(primitives); this.vertexCount = vertexCount; this.jointCount = jointCount; @@ -99,81 +111,175 @@ public final class GltfData { * Legacy constructor for backward compatibility (single animation only). */ public GltfData( - float[] positions, float[] normals, float[] texCoords, - int[] indices, int[] joints, float[] weights, - String[] jointNames, int[] parentJointIndices, + float[] positions, + float[] normals, + float[] texCoords, + int[] indices, + int[] joints, + float[] weights, + String[] jointNames, + int[] parentJointIndices, Matrix4f[] inverseBindMatrices, - Quaternionf[] restRotations, Vector3f[] restTranslations, + Quaternionf[] restRotations, + Vector3f[] restTranslations, Quaternionf[] rawGltfRestRotations, @Nullable AnimationClip rawGltfAnimation, @Nullable AnimationClip animation, - int vertexCount, int jointCount + int vertexCount, + int jointCount ) { - this(positions, normals, texCoords, indices, joints, weights, - jointNames, parentJointIndices, inverseBindMatrices, - restRotations, restTranslations, rawGltfRestRotations, - rawGltfAnimation, animation, - new LinkedHashMap<>(), new LinkedHashMap<>(), + this( + positions, + normals, + texCoords, + indices, + joints, + weights, + jointNames, + parentJointIndices, + inverseBindMatrices, + restRotations, + restTranslations, + rawGltfRestRotations, + rawGltfAnimation, + animation, + new LinkedHashMap<>(), + new LinkedHashMap<>(), List.of(new Primitive(indices, null, false, null)), - vertexCount, jointCount); + vertexCount, + jointCount + ); + } + + public float[] positions() { + return positions; + } + + public float[] normals() { + return normals; + } + + public float[] texCoords() { + return texCoords; + } + + public int[] indices() { + return indices; + } + + public int[] joints() { + return joints; + } + + public float[] weights() { + return weights; + } + + public String[] jointNames() { + return jointNames; + } + + public int[] parentJointIndices() { + return parentJointIndices; + } + + public Matrix4f[] inverseBindMatrices() { + return inverseBindMatrices; + } + + public Quaternionf[] restRotations() { + return restRotations; + } + + public Vector3f[] restTranslations() { + return restTranslations; + } + + public Quaternionf[] rawGltfRestRotations() { + return rawGltfRestRotations; } - public float[] positions() { return positions; } - public float[] normals() { return normals; } - public float[] texCoords() { return texCoords; } - public int[] indices() { return indices; } - public int[] joints() { return joints; } - public float[] weights() { return weights; } - public String[] jointNames() { return jointNames; } - public int[] parentJointIndices() { return parentJointIndices; } - public Matrix4f[] inverseBindMatrices() { return inverseBindMatrices; } - public Quaternionf[] restRotations() { return restRotations; } - public Vector3f[] restTranslations() { return restTranslations; } - public Quaternionf[] rawGltfRestRotations() { return rawGltfRestRotations; } @Nullable - public AnimationClip rawGltfAnimation() { return rawGltfAnimation; } + public AnimationClip rawGltfAnimation() { + return rawGltfAnimation; + } + @Nullable - public AnimationClip animation() { return animation; } - public int vertexCount() { return vertexCount; } - public int jointCount() { return jointCount; } + public AnimationClip animation() { + return animation; + } + + public int vertexCount() { + return vertexCount; + } + + public int jointCount() { + return jointCount; + } /** Per-primitive material and tint metadata. One entry per glTF primitive in the mesh. */ - public List primitives() { return primitives; } + public List primitives() { + return primitives; + } /** All named animations in MC-converted space. Keys are animation names (e.g. "BasicPose", "Struggle"). */ - public Map namedAnimations() { return namedAnimations; } + public Map namedAnimations() { + return namedAnimations; + } /** Get a specific named animation in MC-converted space, or null if not found. */ @Nullable - public AnimationClip getAnimation(String name) { return namedAnimations.get(name); } + public AnimationClip getAnimation(String name) { + return namedAnimations.get(name); + } /** Get a specific named animation in raw glTF space, or null if not found. */ @Nullable - public AnimationClip getRawAnimation(String name) { return rawNamedAnimations.get(name); } + public AnimationClip getRawAnimation(String name) { + return rawNamedAnimations.get(name); + } /** * Animation clip: per-bone timestamps, quaternion rotations, and optional translations. */ public static final class AnimationClip { - private final float[] timestamps; // shared timestamps - private final Quaternionf[][] rotations; // [jointIndex][frameIndex], null if no anim + + private final float[] timestamps; // shared timestamps + private final Quaternionf[][] rotations; // [jointIndex][frameIndex], null if no anim + @Nullable - private final Vector3f[][] translations; // [jointIndex][frameIndex], null if no anim + private final Vector3f[][] translations; // [jointIndex][frameIndex], null if no anim + private final int frameCount; - public AnimationClip(float[] timestamps, Quaternionf[][] rotations, - @Nullable Vector3f[][] translations, int frameCount) { + public AnimationClip( + float[] timestamps, + Quaternionf[][] rotations, + @Nullable Vector3f[][] translations, + int frameCount + ) { this.timestamps = timestamps; this.rotations = rotations; this.translations = translations; this.frameCount = frameCount; } - public float[] timestamps() { return timestamps; } - public Quaternionf[][] rotations() { return rotations; } + public float[] timestamps() { + return timestamps; + } + + public Quaternionf[][] rotations() { + return rotations; + } + @Nullable - public Vector3f[][] translations() { return translations; } - public int frameCount() { return frameCount; } + public Vector3f[][] translations() { + return translations; + } + + public int frameCount() { + return frameCount; + } } /** diff --git a/src/main/java/com/tiedup/remake/client/gltf/GltfLiveBoneReader.java b/src/main/java/com/tiedup/remake/client/gltf/GltfLiveBoneReader.java index 8ebf6d1..85ab2c2 100644 --- a/src/main/java/com/tiedup/remake/client/gltf/GltfLiveBoneReader.java +++ b/src/main/java/com/tiedup/remake/client/gltf/GltfLiveBoneReader.java @@ -60,7 +60,9 @@ public final class GltfLiveBoneReader { * @return array of joint matrices ready for skinning, or null on failure */ public static Matrix4f[] computeJointMatricesFromModel( - HumanoidModel model, GltfData data, LivingEntity entity + HumanoidModel model, + GltfData data, + LivingEntity entity ) { if (model == null || data == null || entity == null) return null; @@ -83,14 +85,19 @@ public final class GltfLiveBoneReader { if (GltfBoneMapper.isLowerBone(boneName)) { // --- Lower bone: reconstruct from bend values --- localRot = computeLowerBoneLocalRotation( - boneName, j, restRotations, emote + boneName, + j, + restRotations, + emote ); } else if (hasUniqueModelPart(boneName)) { // --- Upper bone with a unique ModelPart --- ModelPart part = GltfBoneMapper.getModelPart(model, boneName); if (part != null) { localRot = computeUpperBoneLocalRotation( - part, j, restRotations + part, + j, + restRotations ); } else { // Fallback: use rest rotation @@ -108,14 +115,17 @@ public final class GltfLiveBoneReader { // Compose with parent to get world transform if (parents[j] >= 0 && worldTransforms[parents[j]] != null) { - worldTransforms[j] = new Matrix4f(worldTransforms[parents[j]]).mul(local); + worldTransforms[j] = new Matrix4f( + worldTransforms[parents[j]] + ).mul(local); } else { worldTransforms[j] = new Matrix4f(local); } // Final joint matrix = worldTransform * inverseBindMatrix - jointMatrices[j] = new Matrix4f(worldTransforms[j]) - .mul(data.inverseBindMatrices()[j]); + jointMatrices[j] = new Matrix4f(worldTransforms[j]).mul( + data.inverseBindMatrices()[j] + ); } return jointMatrices; @@ -138,11 +148,16 @@ public final class GltfLiveBoneReader { * the frame relationship. */ private static Quaternionf computeUpperBoneLocalRotation( - ModelPart part, int jointIndex, + ModelPart part, + int jointIndex, Quaternionf[] restRotations ) { // Reconstruct the MC-frame delta from ModelPart euler angles. - Quaternionf delta = new Quaternionf().rotationZYX(part.zRot, part.yRot, part.xRot); + Quaternionf delta = new Quaternionf().rotationZYX( + part.zRot, + part.yRot, + part.xRot + ); // Local rotation = delta applied on top of the local rest rotation. return new Quaternionf(delta).mul(restRotations[jointIndex]); } @@ -160,7 +175,8 @@ public final class GltfLiveBoneReader { * No de-parenting needed — same reasoning as upper bones. */ private static Quaternionf computeLowerBoneLocalRotation( - String boneName, int jointIndex, + String boneName, + int jointIndex, Quaternionf[] restRotations, AnimationApplier emote ) { @@ -183,11 +199,16 @@ public final class GltfLiveBoneReader { float halfAngle = bendValue * 0.5f; float s = (float) Math.sin(halfAngle); Quaternionf bendQuat = new Quaternionf( - ax * s, 0, az * s, (float) Math.cos(halfAngle) + ax * s, + 0, + az * s, + (float) Math.cos(halfAngle) ); // Local rotation = bend delta applied on top of local rest rotation - return new Quaternionf(bendQuat).mul(restRotations[jointIndex]); + return new Quaternionf(bendQuat).mul( + restRotations[jointIndex] + ); } } } @@ -218,12 +239,12 @@ public final class GltfLiveBoneReader { // LivingEntityRenderer's PoseStack transform, which applies to the entire // mesh uniformly. No need to read body rotation into joint matrices. return switch (boneName) { - case "head" -> true; + case "head" -> true; case "leftUpperArm" -> true; - case "rightUpperArm"-> true; + case "rightUpperArm" -> true; case "leftUpperLeg" -> true; - case "rightUpperLeg"-> true; - default -> false; // body, torso, lower bones, unknown + case "rightUpperLeg" -> true; + default -> false; // body, torso, lower bones, unknown }; } @@ -236,8 +257,11 @@ public final class GltfLiveBoneReader { try { return animated.playerAnimator_getAnimation(); } catch (Exception e) { - LOGGER.debug("[GltfPipeline] Could not get AnimationApplier for {}: {}", - entity.getClass().getSimpleName(), e.getMessage()); + LOGGER.debug( + "[GltfPipeline] Could not get AnimationApplier for {}: {}", + entity.getClass().getSimpleName(), + e.getMessage() + ); } } return null; diff --git a/src/main/java/com/tiedup/remake/client/gltf/GltfMeshRenderer.java b/src/main/java/com/tiedup/remake/client/gltf/GltfMeshRenderer.java index dfba4d7..e7a9c5b 100644 --- a/src/main/java/com/tiedup/remake/client/gltf/GltfMeshRenderer.java +++ b/src/main/java/com/tiedup/remake/client/gltf/GltfMeshRenderer.java @@ -25,13 +25,17 @@ import org.joml.Vector4f; public final class GltfMeshRenderer extends RenderStateShard { private static final ResourceLocation WHITE_TEXTURE = - ResourceLocation.fromNamespaceAndPath("tiedup", "models/obj/shared/white.png"); + ResourceLocation.fromNamespaceAndPath( + "tiedup", + "models/obj/shared/white.png" + ); /** Cached default RenderType (white texture). Created once, reused every frame. */ private static RenderType cachedDefaultRenderType; /** Cache for texture-specific RenderTypes, keyed by ResourceLocation. */ - private static final Map RENDER_TYPE_CACHE = new ConcurrentHashMap<>(); + private static final Map RENDER_TYPE_CACHE = + new ConcurrentHashMap<>(); private GltfMeshRenderer() { super("tiedup_gltf_renderer", () -> {}, () -> {}); @@ -61,15 +65,21 @@ public final class GltfMeshRenderer extends RenderStateShard { * @param texture the texture ResourceLocation * @return the cached or newly created RenderType */ - private static RenderType getRenderTypeForTexture(ResourceLocation texture) { - return RENDER_TYPE_CACHE.computeIfAbsent(texture, - GltfMeshRenderer::createTriangleRenderType); + private static RenderType getRenderTypeForTexture( + ResourceLocation texture + ) { + return RENDER_TYPE_CACHE.computeIfAbsent( + texture, + GltfMeshRenderer::createTriangleRenderType + ); } /** * Create a TRIANGLES-mode RenderType for glTF mesh rendering with the given texture. */ - private static RenderType createTriangleRenderType(ResourceLocation texture) { + private static RenderType createTriangleRenderType( + ResourceLocation texture + ) { RenderType.CompositeState state = RenderType.CompositeState.builder() .setShaderState(RENDERTYPE_ENTITY_CUTOUT_NO_CULL_SHADER) .setTextureState( @@ -112,12 +122,22 @@ public final class GltfMeshRenderer extends RenderStateShard { * @param packedOverlay packed overlay value */ public static void renderSkinned( - GltfData data, Matrix4f[] jointMatrices, - PoseStack poseStack, MultiBufferSource buffer, - int packedLight, int packedOverlay + GltfData data, + Matrix4f[] jointMatrices, + PoseStack poseStack, + MultiBufferSource buffer, + int packedLight, + int packedOverlay ) { - renderSkinnedInternal(data, jointMatrices, poseStack, buffer, - packedLight, packedOverlay, getDefaultRenderType()); + renderSkinnedInternal( + data, + jointMatrices, + poseStack, + buffer, + packedLight, + packedOverlay, + getDefaultRenderType() + ); } /** @@ -132,22 +152,35 @@ public final class GltfMeshRenderer extends RenderStateShard { * @param texture the texture to use for rendering */ public static void renderSkinned( - GltfData data, Matrix4f[] jointMatrices, - PoseStack poseStack, MultiBufferSource buffer, - int packedLight, int packedOverlay, + GltfData data, + Matrix4f[] jointMatrices, + PoseStack poseStack, + MultiBufferSource buffer, + int packedLight, + int packedOverlay, ResourceLocation texture ) { - renderSkinnedInternal(data, jointMatrices, poseStack, buffer, - packedLight, packedOverlay, getRenderTypeForTexture(texture)); + renderSkinnedInternal( + data, + jointMatrices, + poseStack, + buffer, + packedLight, + packedOverlay, + getRenderTypeForTexture(texture) + ); } /** * Internal rendering implementation shared by both overloads. */ private static void renderSkinnedInternal( - GltfData data, Matrix4f[] jointMatrices, - PoseStack poseStack, MultiBufferSource buffer, - int packedLight, int packedOverlay, + GltfData data, + Matrix4f[] jointMatrices, + PoseStack poseStack, + MultiBufferSource buffer, + int packedLight, + int packedOverlay, RenderType renderType ) { Matrix4f pose = poseStack.last().pose(); @@ -167,13 +200,22 @@ public final class GltfMeshRenderer extends RenderStateShard { for (int idx : indices) { // Skin this vertex - GltfSkinningEngine.skinVertex(data, idx, jointMatrices, outPos, outNormal, tmpPos, tmpNorm); + GltfSkinningEngine.skinVertex( + data, + idx, + jointMatrices, + outPos, + outNormal, + tmpPos, + tmpNorm + ); // UV coordinates float u = texCoords[idx * 2]; float v = texCoords[idx * 2 + 1]; - vc.vertex(pose, outPos[0], outPos[1], outPos[2]) + vc + .vertex(pose, outPos[0], outPos[1], outPos[2]) .color(255, 255, 255, 255) .uv(u, 1.0f - v) .overlayCoords(packedOverlay) @@ -205,9 +247,12 @@ public final class GltfMeshRenderer extends RenderStateShard { * @param tintColors channel name to RGB int (0xRRGGBB); empty map = white everywhere */ public static void renderSkinnedTinted( - GltfData data, Matrix4f[] jointMatrices, - PoseStack poseStack, MultiBufferSource buffer, - int packedLight, int packedOverlay, + GltfData data, + Matrix4f[] jointMatrices, + PoseStack poseStack, + MultiBufferSource buffer, + int packedLight, + int packedOverlay, RenderType renderType, Map tintColors ) { @@ -226,7 +271,9 @@ public final class GltfMeshRenderer extends RenderStateShard { for (GltfData.Primitive prim : primitives) { // Determine color for this primitive - int r = 255, g = 255, b = 255; + int r = 255, + g = 255, + b = 255; if (prim.tintable() && prim.tintChannel() != null) { Integer colorInt = tintColors.get(prim.tintChannel()); if (colorInt != null) { @@ -237,12 +284,21 @@ public final class GltfMeshRenderer extends RenderStateShard { } for (int idx : prim.indices()) { - GltfSkinningEngine.skinVertex(data, idx, jointMatrices, outPos, outNormal, tmpPos, tmpNorm); + GltfSkinningEngine.skinVertex( + data, + idx, + jointMatrices, + outPos, + outNormal, + tmpPos, + tmpNorm + ); float u = texCoords[idx * 2]; float v = texCoords[idx * 2 + 1]; - vc.vertex(pose, outPos[0], outPos[1], outPos[2]) + vc + .vertex(pose, outPos[0], outPos[1], outPos[2]) .color(r, g, b, 255) .uv(u, 1.0f - v) .overlayCoords(packedOverlay) diff --git a/src/main/java/com/tiedup/remake/client/gltf/GltfPoseConverter.java b/src/main/java/com/tiedup/remake/client/gltf/GltfPoseConverter.java index 3978acf..c35b3eb 100644 --- a/src/main/java/com/tiedup/remake/client/gltf/GltfPoseConverter.java +++ b/src/main/java/com/tiedup/remake/client/gltf/GltfPoseConverter.java @@ -5,11 +5,11 @@ import dev.kosmx.playerAnim.core.data.KeyframeAnimation; import dev.kosmx.playerAnim.core.util.Ease; import java.util.HashSet; import java.util.Set; -import org.jetbrains.annotations.Nullable; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.jetbrains.annotations.Nullable; import org.joml.Quaternionf; import org.joml.Vector3f; @@ -52,10 +52,16 @@ public final class GltfPoseConverter { * @param animationName the name of the animation to convert (e.g. "Struggle", "Idle") * @return a static looping KeyframeAnimation suitable for PlayerAnimator */ - public static KeyframeAnimation convert(GltfData data, String animationName) { + public static KeyframeAnimation convert( + GltfData data, + String animationName + ) { GltfData.AnimationClip rawClip = data.getRawAnimation(animationName); if (rawClip == null) { - LOGGER.warn("[GltfPipeline] Animation '{}' not found, falling back to default", animationName); + LOGGER.warn( + "[GltfPipeline] Animation '{}' not found, falling back to default", + animationName + ); return convert(data); } return convertClip(data, rawClip, "gltf_" + animationName); @@ -76,8 +82,12 @@ public final class GltfPoseConverter { * are only enabled if the GLB has keyframes for them * @return KeyframeAnimation with selective parts active */ - public static KeyframeAnimation convertSelective(GltfData data, @Nullable String animationName, - Set ownedParts, Set enabledParts) { + public static KeyframeAnimation convertSelective( + GltfData data, + @Nullable String animationName, + Set ownedParts, + Set enabledParts + ) { GltfData.AnimationClip rawClip; String animName; if (animationName != null) { @@ -90,7 +100,13 @@ public final class GltfPoseConverter { if (rawClip == null) { rawClip = data.rawGltfAnimation(); } - return convertClipSelective(data, rawClip, animName, ownedParts, enabledParts); + return convertClipSelective( + data, + rawClip, + animName, + ownedParts, + enabledParts + ); } /** @@ -105,10 +121,17 @@ public final class GltfPoseConverter { * @param ownedParts parts the item explicitly owns (always enabled) * @param enabledParts parts the item may animate (owned + free) */ - private static KeyframeAnimation convertClipSelective(GltfData data, GltfData.AnimationClip rawClip, - String animName, Set ownedParts, Set enabledParts) { + private static KeyframeAnimation convertClipSelective( + GltfData data, + GltfData.AnimationClip rawClip, + String animName, + Set ownedParts, + Set enabledParts + ) { KeyframeAnimation.AnimationBuilder builder = - new KeyframeAnimation.AnimationBuilder(AnimationFormat.JSON_EMOTECRAFT); + new KeyframeAnimation.AnimationBuilder( + AnimationFormat.JSON_EMOTECRAFT + ); builder.beginTick = 0; builder.endTick = 1; @@ -129,21 +152,27 @@ public final class GltfPoseConverter { // Check if this joint has explicit animation data (not just rest pose fallback). // A bone counts as explicitly animated if it has rotation OR translation keyframes. - boolean hasExplicitAnim = rawClip != null && ( - (j < rawClip.rotations().length && rawClip.rotations()[j] != null) - || (rawClip.translations() != null - && j < rawClip.translations().length - && rawClip.translations()[j] != null) - ); + boolean hasExplicitAnim = + rawClip != null && + ((j < rawClip.rotations().length && + rawClip.rotations()[j] != null) || + (rawClip.translations() != null && + j < rawClip.translations().length && + rawClip.translations()[j] != null)); - Quaternionf animQ = getRawAnimQuaternion(rawClip, rawRestRotations, j); + Quaternionf animQ = getRawAnimQuaternion( + rawClip, + rawRestRotations, + j + ); Quaternionf restQ = rawRestRotations[j]; // delta_local = inverse(rest_q) * anim_q (in bone-local frame) Quaternionf deltaLocal = new Quaternionf(restQ).invert().mul(animQ); // Convert to PARENT frame: delta_parent = rest * delta_local * inv(rest) - Quaternionf deltaParent = new Quaternionf(restQ).mul(deltaLocal) + Quaternionf deltaParent = new Quaternionf(restQ) + .mul(deltaLocal) .mul(new Quaternionf(restQ).invert()); // Convert from glTF parent frame to MC model-def frame. @@ -168,7 +197,9 @@ public final class GltfPoseConverter { if (GltfBoneMapper.isLowerBone(boneName)) { String upperBone = GltfBoneMapper.getUpperBoneFor(boneName); if (upperBone != null) { - String upperPart = GltfBoneMapper.getAnimPartName(upperBone); + String upperPart = GltfBoneMapper.getAnimPartName( + upperBone + ); if (upperPart != null) { partsWithKeyframes.add(upperPart); } @@ -178,11 +209,21 @@ public final class GltfPoseConverter { } // Selective: enable owned parts always, free parts only if they have keyframes - enableSelectiveParts(builder, ownedParts, enabledParts, partsWithKeyframes); + enableSelectiveParts( + builder, + ownedParts, + enabledParts, + partsWithKeyframes + ); KeyframeAnimation anim = builder.build(); - LOGGER.debug("[GltfPipeline] Converted selective animation '{}' (owned: {}, enabled: {}, withKeyframes: {})", - animName, ownedParts, enabledParts, partsWithKeyframes); + LOGGER.debug( + "[GltfPipeline] Converted selective animation '{}' (owned: {}, enabled: {}, withKeyframes: {})", + animName, + ownedParts, + enabledParts, + partsWithKeyframes + ); return anim; } @@ -200,10 +241,11 @@ public final class GltfPoseConverter { * @return set of part names that received actual keyframe data from the GLB */ public static Set addBonesToBuilder( - KeyframeAnimation.AnimationBuilder builder, - GltfData data, @Nullable GltfData.AnimationClip rawClip, - Set ownedParts) { - + KeyframeAnimation.AnimationBuilder builder, + GltfData data, + @Nullable GltfData.AnimationClip rawClip, + Set ownedParts + ) { String[] jointNames = data.jointNames(); Quaternionf[] rawRestRotations = data.rawGltfRestRotations(); Set partsWithKeyframes = new HashSet<>(); @@ -221,23 +263,33 @@ public final class GltfPoseConverter { if (GltfBoneMapper.isLowerBone(boneName)) { String upperBone = GltfBoneMapper.getUpperBoneFor(boneName); if (upperBone != null) { - String upperPart = GltfBoneMapper.getAnimPartName(upperBone); - if (upperPart == null || !ownedParts.contains(upperPart)) continue; + String upperPart = GltfBoneMapper.getAnimPartName( + upperBone + ); + if ( + upperPart == null || !ownedParts.contains(upperPart) + ) continue; } } - boolean hasExplicitAnim = rawClip != null && ( - (j < rawClip.rotations().length && rawClip.rotations()[j] != null) - || (rawClip.translations() != null - && j < rawClip.translations().length - && rawClip.translations()[j] != null) - ); + boolean hasExplicitAnim = + rawClip != null && + ((j < rawClip.rotations().length && + rawClip.rotations()[j] != null) || + (rawClip.translations() != null && + j < rawClip.translations().length && + rawClip.translations()[j] != null)); - Quaternionf animQ = getRawAnimQuaternion(rawClip, rawRestRotations, j); + Quaternionf animQ = getRawAnimQuaternion( + rawClip, + rawRestRotations, + j + ); Quaternionf restQ = rawRestRotations[j]; Quaternionf deltaLocal = new Quaternionf(restQ).invert().mul(animQ); - Quaternionf deltaParent = new Quaternionf(restQ).mul(deltaLocal) + Quaternionf deltaParent = new Quaternionf(restQ) + .mul(deltaLocal) .mul(new Quaternionf(restQ).invert()); Quaternionf deltaQ = new Quaternionf(deltaParent); @@ -255,8 +307,12 @@ public final class GltfPoseConverter { if (GltfBoneMapper.isLowerBone(boneName)) { String upperBone = GltfBoneMapper.getUpperBoneFor(boneName); if (upperBone != null) { - String upperPart = GltfBoneMapper.getAnimPartName(upperBone); - if (upperPart != null) partsWithKeyframes.add(upperPart); + String upperPart = GltfBoneMapper.getAnimPartName( + upperBone + ); + if (upperPart != null) partsWithKeyframes.add( + upperPart + ); } } } @@ -281,16 +337,25 @@ public final class GltfPoseConverter { * @return a static looping KeyframeAnimation with all parts enabled */ public static KeyframeAnimation convertWithSkeleton( - GltfData skeleton, GltfData.AnimationClip clip, String animName) { + GltfData skeleton, + GltfData.AnimationClip clip, + String animName + ) { return convertClip(skeleton, clip, animName); } /** * Internal: convert a specific raw animation clip to a KeyframeAnimation. */ - private static KeyframeAnimation convertClip(GltfData data, GltfData.AnimationClip rawClip, String animName) { + private static KeyframeAnimation convertClip( + GltfData data, + GltfData.AnimationClip rawClip, + String animName + ) { KeyframeAnimation.AnimationBuilder builder = - new KeyframeAnimation.AnimationBuilder(AnimationFormat.JSON_EMOTECRAFT); + new KeyframeAnimation.AnimationBuilder( + AnimationFormat.JSON_EMOTECRAFT + ); builder.beginTick = 0; builder.endTick = 1; @@ -307,7 +372,11 @@ public final class GltfPoseConverter { if (!GltfBoneMapper.isKnownBone(boneName)) continue; - Quaternionf animQ = getRawAnimQuaternion(rawClip, rawRestRotations, j); + Quaternionf animQ = getRawAnimQuaternion( + rawClip, + rawRestRotations, + j + ); Quaternionf restQ = rawRestRotations[j]; // delta_local = inverse(rest_q) * anim_q (in bone-local frame) @@ -315,7 +384,8 @@ public final class GltfPoseConverter { // Convert to PARENT frame: delta_parent = rest * delta_local * inv(rest) // Simplifies algebraically to: animQ * inv(restQ) - Quaternionf deltaParent = new Quaternionf(restQ).mul(deltaLocal) + Quaternionf deltaParent = new Quaternionf(restQ) + .mul(deltaLocal) .mul(new Quaternionf(restQ).invert()); // Convert from glTF parent frame to MC model-def frame. @@ -324,12 +394,24 @@ public final class GltfPoseConverter { deltaQ.x = -deltaQ.x; deltaQ.y = -deltaQ.y; - LOGGER.debug(String.format( - "[GltfPipeline] Bone '%s': restQ=(%.3f,%.3f,%.3f,%.3f) animQ=(%.3f,%.3f,%.3f,%.3f) deltaQ=(%.3f,%.3f,%.3f,%.3f)", - boneName, - restQ.x, restQ.y, restQ.z, restQ.w, - animQ.x, animQ.y, animQ.z, animQ.w, - deltaQ.x, deltaQ.y, deltaQ.z, deltaQ.w)); + LOGGER.debug( + String.format( + "[GltfPipeline] Bone '%s': restQ=(%.3f,%.3f,%.3f,%.3f) animQ=(%.3f,%.3f,%.3f,%.3f) deltaQ=(%.3f,%.3f,%.3f,%.3f)", + boneName, + restQ.x, + restQ.y, + restQ.z, + restQ.w, + animQ.x, + animQ.y, + animQ.z, + animQ.w, + deltaQ.x, + deltaQ.y, + deltaQ.z, + deltaQ.w + ) + ); if (GltfBoneMapper.isLowerBone(boneName)) { convertLowerBone(builder, boneName, deltaQ); @@ -341,7 +423,10 @@ public final class GltfPoseConverter { builder.fullyEnableParts(); KeyframeAnimation anim = builder.build(); - LOGGER.debug("[GltfPipeline] Converted glTF animation '{}' to KeyframeAnimation", animName); + LOGGER.debug( + "[GltfPipeline] Converted glTF animation '{}' to KeyframeAnimation", + animName + ); return anim; } @@ -350,10 +435,15 @@ public final class GltfPoseConverter { * Falls back to rest rotation if the clip is null or has no data for this joint. */ private static Quaternionf getRawAnimQuaternion( - GltfData.AnimationClip rawClip, Quaternionf[] rawRestRotations, int jointIndex + GltfData.AnimationClip rawClip, + Quaternionf[] rawRestRotations, + int jointIndex ) { - if (rawClip != null && jointIndex < rawClip.rotations().length - && rawClip.rotations()[jointIndex] != null) { + if ( + rawClip != null && + jointIndex < rawClip.rotations().length && + rawClip.rotations()[jointIndex] != null + ) { return rawClip.rotations()[jointIndex][0]; // first frame } return rawRestRotations[jointIndex]; // fallback to rest @@ -361,29 +451,36 @@ public final class GltfPoseConverter { private static void convertUpperBone( KeyframeAnimation.AnimationBuilder builder, - String boneName, Quaternionf deltaQ + String boneName, + Quaternionf deltaQ ) { // Decompose delta quaternion to Euler ZYX // JOML's getEulerAnglesZYX stores: euler.x = X rotation, euler.y = Y rotation, euler.z = Z rotation // (the "ZYX" refers to rotation ORDER, not storage order) Vector3f euler = new Vector3f(); deltaQ.getEulerAnglesZYX(euler); - float pitch = euler.x; // X rotation (pitch) - float yaw = euler.y; // Y rotation (yaw) - float roll = euler.z; // Z rotation (roll) + float pitch = euler.x; // X rotation (pitch) + float yaw = euler.y; // Y rotation (yaw) + float roll = euler.z; // Z rotation (roll) - LOGGER.debug(String.format( - "[GltfPipeline] Upper bone '%s': pitch=%.1f° yaw=%.1f° roll=%.1f°", - boneName, - Math.toDegrees(pitch), - Math.toDegrees(yaw), - Math.toDegrees(roll))); + LOGGER.debug( + String.format( + "[GltfPipeline] Upper bone '%s': pitch=%.1f° yaw=%.1f° roll=%.1f°", + boneName, + Math.toDegrees(pitch), + Math.toDegrees(yaw), + Math.toDegrees(roll) + ) + ); // Get the StateCollection for this body part String animPart = GltfBoneMapper.getAnimPartName(boneName); if (animPart == null) return; - KeyframeAnimation.StateCollection part = getPartByName(builder, animPart); + KeyframeAnimation.StateCollection part = getPartByName( + builder, + animPart + ); if (part == null) return; part.pitch.addKeyFrame(0, pitch, Ease.CONSTANT); @@ -393,12 +490,12 @@ public final class GltfPoseConverter { private static void convertLowerBone( KeyframeAnimation.AnimationBuilder builder, - String boneName, Quaternionf deltaQ + String boneName, + Quaternionf deltaQ ) { // Extract bend angle and axis from the delta quaternion - float angle = 2.0f * (float) Math.acos( - Math.min(1.0, Math.abs(deltaQ.w)) - ); + float angle = + 2.0f * (float) Math.acos(Math.min(1.0, Math.abs(deltaQ.w))); // Determine bend direction from axis float bendDirection = 0.0f; @@ -411,11 +508,14 @@ public final class GltfPoseConverter { angle = -angle; } - LOGGER.debug(String.format( - "[GltfPipeline] Lower bone '%s': bendAngle=%.1f° bendDir=%.1f°", - boneName, - Math.toDegrees(angle), - Math.toDegrees(bendDirection))); + LOGGER.debug( + String.format( + "[GltfPipeline] Lower bone '%s': bendAngle=%.1f° bendDir=%.1f°", + boneName, + Math.toDegrees(angle), + Math.toDegrees(bendDirection) + ) + ); // Apply bend to the upper bone's StateCollection String upperBone = GltfBoneMapper.getUpperBoneFor(boneName); @@ -424,7 +524,10 @@ public final class GltfPoseConverter { String animPart = GltfBoneMapper.getAnimPartName(upperBone); if (animPart == null) return; - KeyframeAnimation.StateCollection part = getPartByName(builder, animPart); + KeyframeAnimation.StateCollection part = getPartByName( + builder, + animPart + ); if (part == null || !part.isBendable) return; part.bend.addKeyFrame(0, angle, Ease.CONSTANT); @@ -432,7 +535,8 @@ public final class GltfPoseConverter { } private static KeyframeAnimation.StateCollection getPartByName( - KeyframeAnimation.AnimationBuilder builder, String name + KeyframeAnimation.AnimationBuilder builder, + String name ) { return switch (name) { case "head" -> builder.head; @@ -461,17 +565,32 @@ public final class GltfPoseConverter { * @param partsWithKeyframes parts that received actual animation data from the GLB */ private static void enableSelectiveParts( - KeyframeAnimation.AnimationBuilder builder, - Set ownedParts, Set enabledParts, - Set partsWithKeyframes) { - String[] allParts = {"head", "body", "rightArm", "leftArm", "rightLeg", "leftLeg"}; + KeyframeAnimation.AnimationBuilder builder, + Set ownedParts, + Set enabledParts, + Set partsWithKeyframes + ) { + String[] allParts = { + "head", + "body", + "rightArm", + "leftArm", + "rightLeg", + "leftLeg", + }; for (String partName : allParts) { - KeyframeAnimation.StateCollection part = getPartByName(builder, partName); + KeyframeAnimation.StateCollection part = getPartByName( + builder, + partName + ); if (part != null) { if (ownedParts.contains(partName)) { // Always enable owned parts — the item controls these bones part.fullyEnablePart(false); - } else if (enabledParts.contains(partName) && partsWithKeyframes.contains(partName)) { + } else if ( + enabledParts.contains(partName) && + partsWithKeyframes.contains(partName) + ) { // Free part WITH keyframes: enable so the GLB animation drives it part.fullyEnablePart(false); } else { diff --git a/src/main/java/com/tiedup/remake/client/gltf/GltfRenderLayer.java b/src/main/java/com/tiedup/remake/client/gltf/GltfRenderLayer.java index 93a278a..fe54166 100644 --- a/src/main/java/com/tiedup/remake/client/gltf/GltfRenderLayer.java +++ b/src/main/java/com/tiedup/remake/client/gltf/GltfRenderLayer.java @@ -24,17 +24,22 @@ import org.joml.Matrix4f; */ @OnlyIn(Dist.CLIENT) public class GltfRenderLayer - extends RenderLayer> { + extends RenderLayer> +{ private static final Logger LOGGER = LogManager.getLogger("GltfPipeline"); private static final ResourceLocation CUFFS_MODEL = ResourceLocation.fromNamespaceAndPath( - "tiedup", "models/gltf/v2/handcuffs/cuffs_prototype.glb" + "tiedup", + "models/gltf/v2/handcuffs/cuffs_prototype.glb" ); public GltfRenderLayer( - RenderLayerParent> renderer + RenderLayerParent< + AbstractClientPlayer, + PlayerModel + > renderer ) { super(renderer); } @@ -71,7 +76,9 @@ public class GltfRenderLayer // Live path: read skeleton from HumanoidModel (after PlayerAnimator) PlayerModel parentModel = this.getParentModel(); Matrix4f[] joints = GltfLiveBoneReader.computeJointMatricesFromModel( - parentModel, data, entity + parentModel, + data, + entity ); if (joints == null) { // Fallback to GLB-internal path if live reading fails @@ -84,10 +91,15 @@ public class GltfRenderLayer poseStack.translate(0, ALIGNMENT_Y, 0); GltfMeshRenderer.renderSkinned( - data, joints, poseStack, buffer, + data, + joints, + poseStack, + buffer, packedLight, - net.minecraft.client.renderer.entity.LivingEntityRenderer - .getOverlayCoords(entity, 0.0f) + net.minecraft.client.renderer.entity.LivingEntityRenderer.getOverlayCoords( + entity, + 0.0f + ) ); poseStack.popPose(); } diff --git a/src/main/java/com/tiedup/remake/client/gltf/GltfSkinningEngine.java b/src/main/java/com/tiedup/remake/client/gltf/GltfSkinningEngine.java index a8078dc..14a8f0b 100644 --- a/src/main/java/com/tiedup/remake/client/gltf/GltfSkinningEngine.java +++ b/src/main/java/com/tiedup/remake/client/gltf/GltfSkinningEngine.java @@ -43,7 +43,9 @@ public final class GltfSkinningEngine { * @return interpolated joint matrices ready for skinning */ public static Matrix4f[] computeJointMatricesAnimated( - GltfData data, GltfData.AnimationClip clip, float time + GltfData data, + GltfData.AnimationClip clip, + float time ) { int jointCount = data.jointCount(); Matrix4f[] jointMatrices = new Matrix4f[jointCount]; @@ -59,14 +61,17 @@ public final class GltfSkinningEngine { // Compose with parent if (parents[j] >= 0 && worldTransforms[parents[j]] != null) { - worldTransforms[j] = new Matrix4f(worldTransforms[parents[j]]).mul(local); + worldTransforms[j] = new Matrix4f( + worldTransforms[parents[j]] + ).mul(local); } else { worldTransforms[j] = new Matrix4f(local); } // Final joint matrix = worldTransform * inverseBindMatrix - jointMatrices[j] = new Matrix4f(worldTransforms[j]) - .mul(data.inverseBindMatrices()[j]); + jointMatrices[j] = new Matrix4f(worldTransforms[j]).mul( + data.inverseBindMatrices()[j] + ); } return jointMatrices; @@ -75,7 +80,10 @@ public final class GltfSkinningEngine { /** * Internal: compute joint matrices from a specific animation clip. */ - private static Matrix4f[] computeJointMatricesFromClip(GltfData data, GltfData.AnimationClip clip) { + private static Matrix4f[] computeJointMatricesFromClip( + GltfData data, + GltfData.AnimationClip clip + ) { int jointCount = data.jointCount(); Matrix4f[] jointMatrices = new Matrix4f[jointCount]; Matrix4f[] worldTransforms = new Matrix4f[jointCount]; @@ -90,14 +98,17 @@ public final class GltfSkinningEngine { // Compose with parent if (parents[j] >= 0 && worldTransforms[parents[j]] != null) { - worldTransforms[j] = new Matrix4f(worldTransforms[parents[j]]).mul(local); + worldTransforms[j] = new Matrix4f( + worldTransforms[parents[j]] + ).mul(local); } else { worldTransforms[j] = new Matrix4f(local); } // Final joint matrix = worldTransform * inverseBindMatrix - jointMatrices[j] = new Matrix4f(worldTransforms[j]) - .mul(data.inverseBindMatrices()[j]); + jointMatrices[j] = new Matrix4f(worldTransforms[j]).mul( + data.inverseBindMatrices()[j] + ); } return jointMatrices; @@ -107,9 +118,16 @@ public final class GltfSkinningEngine { * Get the animation rotation for a joint (MC-converted). * Falls back to rest rotation if no animation. */ - private static Quaternionf getAnimRotation(GltfData data, GltfData.AnimationClip clip, int jointIndex) { - if (clip != null && jointIndex < clip.rotations().length - && clip.rotations()[jointIndex] != null) { + private static Quaternionf getAnimRotation( + GltfData data, + GltfData.AnimationClip clip, + int jointIndex + ) { + if ( + clip != null && + jointIndex < clip.rotations().length && + clip.rotations()[jointIndex] != null + ) { return clip.rotations()[jointIndex][0]; // first frame } return data.restRotations()[jointIndex]; @@ -119,10 +137,17 @@ public final class GltfSkinningEngine { * Get the animation translation for a joint (MC-converted). * Falls back to rest translation if no animation translation exists. */ - private static Vector3f getAnimTranslation(GltfData data, GltfData.AnimationClip clip, int jointIndex) { - if (clip != null && clip.translations() != null - && jointIndex < clip.translations().length - && clip.translations()[jointIndex] != null) { + private static Vector3f getAnimTranslation( + GltfData data, + GltfData.AnimationClip clip, + int jointIndex + ) { + if ( + clip != null && + clip.translations() != null && + jointIndex < clip.translations().length && + clip.translations()[jointIndex] != null + ) { return clip.translations()[jointIndex][0]; // first frame } return data.restTranslations()[jointIndex]; @@ -144,10 +169,16 @@ public final class GltfSkinningEngine { * @return new Quaternionf with the interpolated rotation (never mutates source data) */ private static Quaternionf getInterpolatedRotation( - GltfData data, GltfData.AnimationClip clip, int jointIndex, float time + GltfData data, + GltfData.AnimationClip clip, + int jointIndex, + float time ) { - if (clip == null || jointIndex >= clip.rotations().length - || clip.rotations()[jointIndex] == null) { + if ( + clip == null || + jointIndex >= clip.rotations().length || + clip.rotations()[jointIndex] == null + ) { // No animation data for this joint -- use rest pose (copy to avoid mutation) Quaternionf rest = data.restRotations()[jointIndex]; return new Quaternionf(rest); @@ -187,11 +218,17 @@ public final class GltfSkinningEngine { * @return new Vector3f with the interpolated translation (never mutates source data) */ private static Vector3f getInterpolatedTranslation( - GltfData data, GltfData.AnimationClip clip, int jointIndex, float time + GltfData data, + GltfData.AnimationClip clip, + int jointIndex, + float time ) { - if (clip == null || clip.translations() == null - || jointIndex >= clip.translations().length - || clip.translations()[jointIndex] == null) { + if ( + clip == null || + clip.translations() == null || + jointIndex >= clip.translations().length || + clip.translations()[jointIndex] == null + ) { // No animation data for this joint -- use rest pose (copy to avoid mutation) Vector3f rest = data.restTranslations()[jointIndex]; return new Vector3f(rest); @@ -232,9 +269,13 @@ public final class GltfSkinningEngine { * @param tmpNorm pre-allocated scratch Vector4f for normal transforms */ public static void skinVertex( - GltfData data, int vertexIdx, Matrix4f[] jointMatrices, - float[] outPos, float[] outNormal, - Vector4f tmpPos, Vector4f tmpNorm + GltfData data, + int vertexIdx, + Matrix4f[] jointMatrices, + float[] outPos, + float[] outNormal, + Vector4f tmpPos, + Vector4f tmpNorm ) { float[] positions = data.positions(); float[] normals = data.normals(); @@ -252,8 +293,12 @@ public final class GltfSkinningEngine { float nz = normals[vertexIdx * 3 + 2]; // LBS: v_skinned = Σ(w[i] * jointMatrix[j[i]] * v_rest) - float sx = 0, sy = 0, sz = 0; - float snx = 0, sny = 0, snz = 0; + float sx = 0, + sy = 0, + sz = 0; + float snx = 0, + sny = 0, + snz = 0; for (int i = 0; i < 4; i++) { int ji = joints[vertexIdx * 4 + i]; diff --git a/src/main/java/com/tiedup/remake/client/gui/overlays/ProgressOverlay.java b/src/main/java/com/tiedup/remake/client/gui/overlays/ProgressOverlay.java index 1aeda38..6bcee98 100644 --- a/src/main/java/com/tiedup/remake/client/gui/overlays/ProgressOverlay.java +++ b/src/main/java/com/tiedup/remake/client/gui/overlays/ProgressOverlay.java @@ -20,7 +20,6 @@ import net.minecraftforge.fml.common.Mod; * Overlay that shows a progress bar for tying/untying/struggling actions. * Displayed above the hotbar when an action is in progress. * - * Phase 16: GUI Revamp - Progress bar overlay */ @OnlyIn(Dist.CLIENT) @Mod.EventBusSubscriber(modid = TiedUpMod.MOD_ID, value = Dist.CLIENT) diff --git a/src/main/java/com/tiedup/remake/client/gui/overlays/StatusOverlay.java b/src/main/java/com/tiedup/remake/client/gui/overlays/StatusOverlay.java index 0735640..2b6dc3a 100644 --- a/src/main/java/com/tiedup/remake/client/gui/overlays/StatusOverlay.java +++ b/src/main/java/com/tiedup/remake/client/gui/overlays/StatusOverlay.java @@ -18,7 +18,6 @@ import net.minecraftforge.fml.common.Mod; * Overlay that shows status icons when player is restrained. * Icons appear in top-left corner showing current bondage state. * - * Phase 16: GUI Revamp - Status indicator overlay */ @OnlyIn(Dist.CLIENT) @Mod.EventBusSubscriber(modid = TiedUpMod.MOD_ID, value = Dist.CLIENT) diff --git a/src/main/java/com/tiedup/remake/client/gui/overlays/UntieTooltipOverlay.java b/src/main/java/com/tiedup/remake/client/gui/overlays/UntieTooltipOverlay.java index e74416d..b7dc44b 100644 --- a/src/main/java/com/tiedup/remake/client/gui/overlays/UntieTooltipOverlay.java +++ b/src/main/java/com/tiedup/remake/client/gui/overlays/UntieTooltipOverlay.java @@ -1,10 +1,10 @@ package com.tiedup.remake.client.gui.overlays; import com.tiedup.remake.client.ModKeybindings; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.state.IBondageState; import com.tiedup.remake.util.KidnappedHelper; +import com.tiedup.remake.v2.BodyRegionV2; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.world.entity.Entity; diff --git a/src/main/java/com/tiedup/remake/client/gui/screens/AdjustmentScreen.java b/src/main/java/com/tiedup/remake/client/gui/screens/AdjustmentScreen.java index 9ff667f..27d38d5 100644 --- a/src/main/java/com/tiedup/remake/client/gui/screens/AdjustmentScreen.java +++ b/src/main/java/com/tiedup/remake/client/gui/screens/AdjustmentScreen.java @@ -2,8 +2,8 @@ package com.tiedup.remake.client.gui.screens; import com.tiedup.remake.network.ModNetwork; import com.tiedup.remake.network.item.PacketAdjustItem; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.state.PlayerBindState; +import com.tiedup.remake.v2.BodyRegionV2; import net.minecraft.client.Minecraft; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.LivingEntity; @@ -16,7 +16,6 @@ import net.minecraftforge.api.distmarker.OnlyIn; * Screen for adjusting Y position of the player's own gags and blindfolds. * Shows 3D preview of player with real-time adjustment. * - * Phase 16b: GUI Refactoring - Simplified using BaseAdjustmentScreen */ @OnlyIn(Dist.CLIENT) public class AdjustmentScreen extends BaseAdjustmentScreen { diff --git a/src/main/java/com/tiedup/remake/client/gui/screens/CellManagerScreen.java b/src/main/java/com/tiedup/remake/client/gui/screens/CellManagerScreen.java index 0556832..acef816 100644 --- a/src/main/java/com/tiedup/remake/client/gui/screens/CellManagerScreen.java +++ b/src/main/java/com/tiedup/remake/client/gui/screens/CellManagerScreen.java @@ -9,7 +9,6 @@ import com.tiedup.remake.network.cell.PacketOpenCellManager.CellSyncData; import com.tiedup.remake.network.cell.PacketOpenCellManager.PrisonerInfo; import com.tiedup.remake.network.cell.PacketRenameCell; import java.util.List; -import org.jetbrains.annotations.Nullable; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.Button; @@ -17,6 +16,7 @@ import net.minecraft.client.gui.components.EditBox; import net.minecraft.network.chat.Component; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import org.jetbrains.annotations.Nullable; /** * Screen for managing player-owned cells. diff --git a/src/main/java/com/tiedup/remake/client/gui/screens/CellSelectorScreen.java b/src/main/java/com/tiedup/remake/client/gui/screens/CellSelectorScreen.java index f23cc13..b9568fc 100644 --- a/src/main/java/com/tiedup/remake/client/gui/screens/CellSelectorScreen.java +++ b/src/main/java/com/tiedup/remake/client/gui/screens/CellSelectorScreen.java @@ -8,13 +8,13 @@ import com.tiedup.remake.network.cell.PacketAssignCellToCollar; import com.tiedup.remake.network.cell.PacketOpenCellSelector.CellOption; import java.util.List; import java.util.UUID; -import org.jetbrains.annotations.Nullable; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.Button; import net.minecraft.network.chat.Component; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import org.jetbrains.annotations.Nullable; /** * Modal screen for selecting a cell to assign to a collar. diff --git a/src/main/java/com/tiedup/remake/client/gui/screens/CommandWandScreen.java b/src/main/java/com/tiedup/remake/client/gui/screens/CommandWandScreen.java index 29fdc80..49ba2d6 100644 --- a/src/main/java/com/tiedup/remake/client/gui/screens/CommandWandScreen.java +++ b/src/main/java/com/tiedup/remake/client/gui/screens/CommandWandScreen.java @@ -234,9 +234,7 @@ public class CommandWandScreen extends Screen { addBottomButtons(); } - // ========================================================================= // Status Tab - // ========================================================================= /** Calculate Y position after all rendered status content (needs, mood, cell, home) */ private int getStatusButtonsY(int startY) { @@ -332,9 +330,7 @@ public class CommandWandScreen extends Screen { this.addRenderableWidget(threatenBtn); } - // ========================================================================= // Commands Tab - // ========================================================================= private static final int SECTION_HEADER_H = 16; // header line + text + padding @@ -382,9 +378,7 @@ public class CommandWandScreen extends Screen { ); } - // ========================================================================= // Jobs Tab - // ========================================================================= private void buildJobsTab(int contentX, int contentWidth, int y) { int thirdWidth = (contentWidth - BTN_SPACING * 2) / 3; @@ -463,9 +457,7 @@ public class CommandWandScreen extends Screen { ); } - // ========================================================================= // Bottom Buttons (all tabs) - // ========================================================================= private void addBottomButtons() { int bottomBtnWidth = 90; @@ -506,9 +498,7 @@ public class CommandWandScreen extends Screen { this.addRenderableWidget(stopBtn); } - // ========================================================================= // Button helpers - // ========================================================================= private void addCommandButton(int x, int y, NpcCommand command, int width) { boolean isActive = activeCommand.equals(command.name()); @@ -667,9 +657,7 @@ public class CommandWandScreen extends Screen { this.addRenderableWidget(btn); } - // ========================================================================= // Network actions - // ========================================================================= private void sendCommand(NpcCommand command) { ModNetwork.sendToServer( @@ -692,7 +680,9 @@ public class CommandWandScreen extends Screen { } private void toggleAutoRest() { - ModNetwork.sendToServer(PacketNpcCommand.toggleAutoRest(entityUUID, true)); + ModNetwork.sendToServer( + PacketNpcCommand.toggleAutoRest(entityUUID, true) + ); } private void openInventory() { @@ -728,9 +718,7 @@ public class CommandWandScreen extends Screen { return -1; } - // ========================================================================= // Render - // ========================================================================= @Override public void render( @@ -805,9 +793,7 @@ public class CommandWandScreen extends Screen { super.render(graphics, mouseX, mouseY, partialTick); } - // ========================================================================= // Render: Status Tab - // ========================================================================= private void renderStatusContent( GuiGraphics graphics, @@ -1029,9 +1015,7 @@ public class CommandWandScreen extends Screen { } } - // ========================================================================= // Render: Commands Tab - // ========================================================================= private void renderCommandContent( GuiGraphics graphics, @@ -1059,9 +1043,7 @@ public class CommandWandScreen extends Screen { ); } - // ========================================================================= // Render: Jobs Tab - // ========================================================================= private void renderJobsContent( GuiGraphics graphics, @@ -1119,9 +1101,7 @@ public class CommandWandScreen extends Screen { ); } - // ========================================================================= // Render helpers - // ========================================================================= private void renderSectionHeader( GuiGraphics graphics, diff --git a/src/main/java/com/tiedup/remake/client/gui/screens/ConversationScreen.java b/src/main/java/com/tiedup/remake/client/gui/screens/ConversationScreen.java index 3ad5e17..392c232 100644 --- a/src/main/java/com/tiedup/remake/client/gui/screens/ConversationScreen.java +++ b/src/main/java/com/tiedup/remake/client/gui/screens/ConversationScreen.java @@ -18,8 +18,6 @@ import net.minecraftforge.api.distmarker.OnlyIn; * GUI screen for interactive conversations with NPCs. * Displays available conversation topics with effectiveness indicators. * - * Phase 5: Enhanced Conversation System - * Phase 2: Refactored to extend BaseInteractionScreen * * DISABLED: Conversation system not in use. Kept because PacketEndConversationS2C * references this class in an instanceof check. diff --git a/src/main/java/com/tiedup/remake/client/gui/screens/LockpickMiniGameScreen.java b/src/main/java/com/tiedup/remake/client/gui/screens/LockpickMiniGameScreen.java index b1911a4..85a6174 100644 --- a/src/main/java/com/tiedup/remake/client/gui/screens/LockpickMiniGameScreen.java +++ b/src/main/java/com/tiedup/remake/client/gui/screens/LockpickMiniGameScreen.java @@ -15,7 +15,6 @@ import net.minecraftforge.api.distmarker.OnlyIn; import org.lwjgl.glfw.GLFW; /** - * Phase 2.5: Client-side GUI for Lockpick mini-game (Skyrim-style). * * Features: * - Sweet spot is HIDDEN (uniform gray bar) diff --git a/src/main/java/com/tiedup/remake/client/gui/screens/NpcInventoryScreen.java b/src/main/java/com/tiedup/remake/client/gui/screens/NpcInventoryScreen.java index c946c03..b3d8e4f 100644 --- a/src/main/java/com/tiedup/remake/client/gui/screens/NpcInventoryScreen.java +++ b/src/main/java/com/tiedup/remake/client/gui/screens/NpcInventoryScreen.java @@ -4,13 +4,13 @@ import com.tiedup.remake.client.gui.util.GuiTextureHelper; import com.tiedup.remake.client.gui.widgets.EntityPreviewWidget; import com.tiedup.remake.entities.EntityDamsel; import com.tiedup.remake.entities.NpcInventoryMenu; -import org.jetbrains.annotations.Nullable; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Inventory; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import org.jetbrains.annotations.Nullable; /** * Screen for viewing and managing NPC inventory. diff --git a/src/main/java/com/tiedup/remake/client/gui/screens/PetRequestScreen.java b/src/main/java/com/tiedup/remake/client/gui/screens/PetRequestScreen.java index a68d862..54294e4 100644 --- a/src/main/java/com/tiedup/remake/client/gui/screens/PetRequestScreen.java +++ b/src/main/java/com/tiedup/remake/client/gui/screens/PetRequestScreen.java @@ -22,7 +22,6 @@ import net.minecraftforge.api.distmarker.OnlyIn; * - Ask to be untied * - End conversation * - * Phase 2: Refactored to extend BaseInteractionScreen */ @OnlyIn(Dist.CLIENT) public class PetRequestScreen extends BaseInteractionScreen { diff --git a/src/main/java/com/tiedup/remake/client/gui/screens/RemoteAdjustmentScreen.java b/src/main/java/com/tiedup/remake/client/gui/screens/RemoteAdjustmentScreen.java index cdbe971..1cc0661 100644 --- a/src/main/java/com/tiedup/remake/client/gui/screens/RemoteAdjustmentScreen.java +++ b/src/main/java/com/tiedup/remake/client/gui/screens/RemoteAdjustmentScreen.java @@ -2,8 +2,8 @@ package com.tiedup.remake.client.gui.screens; import com.tiedup.remake.network.ModNetwork; import com.tiedup.remake.network.item.PacketAdjustRemote; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.state.IBondageState; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.UUID; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.LivingEntity; @@ -15,7 +15,6 @@ import net.minecraftforge.api.distmarker.OnlyIn; * Screen for remotely adjusting Y position of a slave's gags and blindfolds. * Similar to AdjustmentScreen but operates on a slave entity. * - * Phase 16b: GUI Refactoring - Simplified using BaseAdjustmentScreen */ @OnlyIn(Dist.CLIENT) public class RemoteAdjustmentScreen extends BaseAdjustmentScreen { diff --git a/src/main/java/com/tiedup/remake/client/gui/screens/SlaveManagementScreen.java b/src/main/java/com/tiedup/remake/client/gui/screens/SlaveManagementScreen.java index dccd36a..e597979 100644 --- a/src/main/java/com/tiedup/remake/client/gui/screens/SlaveManagementScreen.java +++ b/src/main/java/com/tiedup/remake/client/gui/screens/SlaveManagementScreen.java @@ -1,7 +1,6 @@ package com.tiedup.remake.client.gui.screens; import com.tiedup.remake.client.gui.util.GuiColors; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.client.gui.util.GuiLayoutConstants; import com.tiedup.remake.client.gui.widgets.SlaveEntryWidget; import com.tiedup.remake.items.base.ItemCollar; @@ -11,6 +10,7 @@ import com.tiedup.remake.state.IBondageState; import com.tiedup.remake.state.PlayerBindState; import com.tiedup.remake.state.PlayerCaptorManager; import com.tiedup.remake.util.KidnappedHelper; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.HashSet; import java.util.Set; import java.util.UUID; @@ -142,7 +142,9 @@ public class SlaveManagementScreen extends BaseScreen { IBondageState kidnapped = KidnappedHelper.getKidnappedState(entity); if (kidnapped != null && kidnapped.hasCollar()) { - ItemStack collarStack = kidnapped.getEquipment(BodyRegionV2.NECK); + ItemStack collarStack = kidnapped.getEquipment( + BodyRegionV2.NECK + ); if (collarStack.getItem() instanceof ItemCollar collar) { if (collar.isOwner(collarStack, player)) { addSlaveEntry(kidnapped); diff --git a/src/main/java/com/tiedup/remake/client/gui/screens/UnifiedBondageScreen.java b/src/main/java/com/tiedup/remake/client/gui/screens/UnifiedBondageScreen.java index 274eebd..f370c98 100644 --- a/src/main/java/com/tiedup/remake/client/gui/screens/UnifiedBondageScreen.java +++ b/src/main/java/com/tiedup/remake/client/gui/screens/UnifiedBondageScreen.java @@ -33,7 +33,7 @@ public class UnifiedBondageScreen extends BaseScreen { private static final int MODE_MASTER_BG = 0xFF707070; // Full-body view for all tabs (zoom per-tab was too finicky to get right) - private static final float[] TAB_SCALES = { 1.0f, 1.0f, 1.0f, 1.0f, 1.0f }; + private static final float[] TAB_SCALES = { 1.0f, 1.0f, 1.0f, 1.0f, 1.0f }; private static final float[] TAB_OFFSETS = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }; private final ActionPanel.ScreenMode mode; @@ -70,7 +70,10 @@ public class UnifiedBondageScreen extends BaseScreen { this(ActionPanel.ScreenMode.MASTER, target); } - private UnifiedBondageScreen(ActionPanel.ScreenMode mode, LivingEntity target) { + private UnifiedBondageScreen( + ActionPanel.ScreenMode mode, + LivingEntity target + ) { super(Component.translatable("gui.tiedup.unified_bondage")); this.mode = mode; this.targetEntity = target; @@ -78,17 +81,29 @@ public class UnifiedBondageScreen extends BaseScreen { } private LivingEntity getTarget() { - return (mode == ActionPanel.ScreenMode.SELF) ? minecraft.player : targetEntity; + return (mode == ActionPanel.ScreenMode.SELF) + ? minecraft.player + : targetEntity; } @Override protected int getPreferredWidth() { - return GuiLayoutConstants.getResponsiveWidth(this.width, 0.65f, 420, 600); + return GuiLayoutConstants.getResponsiveWidth( + this.width, + 0.65f, + 420, + 600 + ); } @Override protected int getPreferredHeight() { - return GuiLayoutConstants.getResponsiveHeight(this.height, 0.75f, 350, 500); + return GuiLayoutConstants.getResponsiveHeight( + this.height, + 0.75f, + 350, + 500 + ); } @Override @@ -109,7 +124,10 @@ public class UnifiedBondageScreen extends BaseScreen { } } - int contentTop = topPos + GuiLayoutConstants.TITLE_HEIGHT + GuiLayoutConstants.MARGIN_M; + int contentTop = + topPos + + GuiLayoutConstants.TITLE_HEIGHT + + GuiLayoutConstants.MARGIN_M; // === Tab Bar === tabBar = new RegionTabBar(leftPos + 2, contentTop, imageWidth - 4); @@ -119,15 +137,24 @@ public class UnifiedBondageScreen extends BaseScreen { int belowTabs = contentTop + 30; int statusBarHeight = 46; - int mainContentHeight = imageHeight - (belowTabs - topPos) - statusBarHeight - GuiLayoutConstants.MARGIN_S; + int mainContentHeight = + imageHeight - + (belowTabs - topPos) - + statusBarHeight - + GuiLayoutConstants.MARGIN_S; // === Preview (Left, 40%) === - int previewWidth = (int)((imageWidth - GuiLayoutConstants.MARGIN_M * 3) * 0.40f); + int previewWidth = (int) ((imageWidth - + GuiLayoutConstants.MARGIN_M * 3) * + 0.40f); LivingEntity target = getTarget(); if (target != null) { preview = new EntityPreviewWidget( - leftPos + GuiLayoutConstants.MARGIN_M, belowTabs, - previewWidth, mainContentHeight, target + leftPos + GuiLayoutConstants.MARGIN_M, + belowTabs, + previewWidth, + mainContentHeight, + target ); preview.setAutoRotate(true); preview.setAutoRotateSpeed(0.3f); @@ -136,28 +163,42 @@ public class UnifiedBondageScreen extends BaseScreen { } // === Right panel area === - int rightX = leftPos + GuiLayoutConstants.MARGIN_M + previewWidth + GuiLayoutConstants.MARGIN_M; - int rightWidth = imageWidth - (rightX - leftPos) - GuiLayoutConstants.MARGIN_M; + int rightX = + leftPos + + GuiLayoutConstants.MARGIN_M + + previewWidth + + GuiLayoutConstants.MARGIN_M; + int rightWidth = + imageWidth - (rightX - leftPos) - GuiLayoutConstants.MARGIN_M; // Action panel height int actionPanelHeight = 84; - int slotsHeight = mainContentHeight - actionPanelHeight - GuiLayoutConstants.MARGIN_S; + int slotsHeight = + mainContentHeight - actionPanelHeight - GuiLayoutConstants.MARGIN_S; // === Region Slots === buildSlots(rightX, belowTabs, rightWidth, slotsHeight); // === Action Panel === - actionPanel = new ActionPanel(rightX, belowTabs + slotsHeight + GuiLayoutConstants.MARGIN_S, - rightWidth, actionPanelHeight); + actionPanel = new ActionPanel( + rightX, + belowTabs + slotsHeight + GuiLayoutConstants.MARGIN_S, + rightWidth, + actionPanelHeight + ); actionPanel.setMode(mode); actionPanel.setTargetEntity(getTarget()); actionPanel.setKeyInfo(keyUUID, isMasterKey); actionPanel.setOnAdjustRequested(region -> { - if (AdjustmentScreen.canOpen()) minecraft.setScreen(new AdjustmentScreen()); + if (AdjustmentScreen.canOpen()) minecraft.setScreen( + new AdjustmentScreen() + ); }); actionPanel.setOnEquipRequested(this::openPicker); actionPanel.setOnCellAssignRequested(() -> { - if (targetEntityUUID != null) ModNetwork.sendToServer(new PacketRequestCellList(targetEntityUUID)); + if (targetEntityUUID != null) ModNetwork.sendToServer( + new PacketRequestCellList(targetEntityUUID) + ); }); actionPanel.setOnCloseRequested(this::onClose); actionPanel.clearContext(); @@ -165,7 +206,12 @@ public class UnifiedBondageScreen extends BaseScreen { // === Status Bar === int statusY = topPos + imageHeight - statusBarHeight; - statusBar = new StatusBarWidget(leftPos, statusY, imageWidth, statusBarHeight); + statusBar = new StatusBarWidget( + leftPos, + statusY, + imageWidth, + statusBarHeight + ); statusBar.setMode(mode); statusBar.setTargetEntity(getTarget()); statusBar.setOnCloseClicked(this::onClose); @@ -193,7 +239,9 @@ public class UnifiedBondageScreen extends BaseScreen { if (stack.getItem() instanceof ItemKey) { return stack; // Regular key takes priority } - if (masterKeyStack.isEmpty() && stack.is(ModItems.MASTER_KEY.get())) { + if ( + masterKeyStack.isEmpty() && stack.is(ModItems.MASTER_KEY.get()) + ) { masterKeyStack = stack; // Remember master key as fallback } } @@ -212,8 +260,17 @@ public class UnifiedBondageScreen extends BaseScreen { BodyRegionV2 region = regions[i]; int slotY = y + i * slotHeight; - RegionSlotWidget slot = new RegionSlotWidget(x, slotY, width, slotHeight - 2, - region, () -> target != null ? V2EquipmentHelper.getInRegion(target, region) : ItemStack.EMPTY); + RegionSlotWidget slot = new RegionSlotWidget( + x, + slotY, + width, + slotHeight - 2, + region, + () -> + target != null + ? V2EquipmentHelper.getInRegion(target, region) + : ItemStack.EMPTY + ); slot.setOnClick(this::onSlotClicked); slot.setShowEquipButton(true); slot.setOnEquipClick(s -> openPicker(s.getRegion())); @@ -245,15 +302,30 @@ public class UnifiedBondageScreen extends BaseScreen { actionPanel.clearContext(); // Recalculate layout for slots - int contentTop = topPos + GuiLayoutConstants.TITLE_HEIGHT + GuiLayoutConstants.MARGIN_M; + int contentTop = + topPos + + GuiLayoutConstants.TITLE_HEIGHT + + GuiLayoutConstants.MARGIN_M; int belowTabs = contentTop + 30; int statusBarHeight = 46; - int mainContentHeight = imageHeight - (belowTabs - topPos) - statusBarHeight - GuiLayoutConstants.MARGIN_S; - int previewWidth = (int)((imageWidth - GuiLayoutConstants.MARGIN_M * 3) * 0.40f); - int rightX = leftPos + GuiLayoutConstants.MARGIN_M + previewWidth + GuiLayoutConstants.MARGIN_M; - int rightWidth = imageWidth - (rightX - leftPos) - GuiLayoutConstants.MARGIN_M; + int mainContentHeight = + imageHeight - + (belowTabs - topPos) - + statusBarHeight - + GuiLayoutConstants.MARGIN_S; + int previewWidth = (int) ((imageWidth - + GuiLayoutConstants.MARGIN_M * 3) * + 0.40f); + int rightX = + leftPos + + GuiLayoutConstants.MARGIN_M + + previewWidth + + GuiLayoutConstants.MARGIN_M; + int rightWidth = + imageWidth - (rightX - leftPos) - GuiLayoutConstants.MARGIN_M; int actionPanelHeight = 84; - int slotsHeight = mainContentHeight - actionPanelHeight - GuiLayoutConstants.MARGIN_S; + int slotsHeight = + mainContentHeight - actionPanelHeight - GuiLayoutConstants.MARGIN_S; buildSlots(rightX, belowTabs, rightWidth, slotsHeight); autoSelectFirstOccupied(); @@ -284,14 +356,23 @@ public class UnifiedBondageScreen extends BaseScreen { } private void openPicker(BodyRegionV2 region) { - pickerOverlay.open(region, mode == ActionPanel.ScreenMode.SELF, this.width, this.height); + pickerOverlay.open( + region, + mode == ActionPanel.ScreenMode.SELF, + this.width, + this.height + ); } private void onPickerItemSelected(BodyRegionV2 region, int inventorySlot) { if (mode == ActionPanel.ScreenMode.SELF) { - ModNetwork.sendToServer(new PacketV2SelfEquip(region, inventorySlot)); + ModNetwork.sendToServer( + new PacketV2SelfEquip(region, inventorySlot) + ); } else { - ModNetwork.sendToServer(new PacketMasterEquip(targetEntityUUID, region, inventorySlot)); + ModNetwork.sendToServer( + new PacketMasterEquip(targetEntityUUID, region, inventorySlot) + ); } refreshCountdown = 10; // Refresh after server processes } @@ -314,30 +395,65 @@ public class UnifiedBondageScreen extends BaseScreen { } @Override - public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTick) { + public void render( + GuiGraphics graphics, + int mouseX, + int mouseY, + float partialTick + ) { this.renderBackground(graphics); // MC-style raised panel - GuiRenderUtil.drawMCPanel(graphics, leftPos, topPos, imageWidth, imageHeight); + GuiRenderUtil.drawMCPanel( + graphics, + leftPos, + topPos, + imageWidth, + imageHeight + ); // Title (dark text, vanilla style) String titleText = this.title.getString(); if (mode == ActionPanel.ScreenMode.MASTER && targetEntity != null) { titleText += " \u2014 " + targetEntity.getName().getString(); } - GuiRenderUtil.drawCenteredStringNoShadow(graphics, font, titleText, - leftPos + imageWidth / 2, topPos + GuiLayoutConstants.MARGIN_M, TITLE_COLOR); + GuiRenderUtil.drawCenteredStringNoShadow( + graphics, + font, + titleText, + leftPos + imageWidth / 2, + topPos + GuiLayoutConstants.MARGIN_M, + TITLE_COLOR + ); // Mode badge (top-right) — sober gray badge int badgeWidth = 90; - int badgeX = leftPos + imageWidth - badgeWidth - GuiLayoutConstants.MARGIN_M; + int badgeX = + leftPos + imageWidth - badgeWidth - GuiLayoutConstants.MARGIN_M; int badgeY = topPos + GuiLayoutConstants.MARGIN_S; - int badgeBg = mode == ActionPanel.ScreenMode.MASTER ? MODE_MASTER_BG : MODE_SELF_BG; - graphics.fill(badgeX, badgeY, badgeX + badgeWidth, badgeY + 16, badgeBg); - String badgeText = mode == ActionPanel.ScreenMode.MASTER - ? Component.translatable("gui.tiedup.mode.master").getString() - : Component.translatable("gui.tiedup.mode.self").getString(); - GuiRenderUtil.drawCenteredStringNoShadow(graphics, font, badgeText, badgeX + badgeWidth / 2, badgeY + 4, GuiRenderUtil.MC_TEXT_DARK); + int badgeBg = + mode == ActionPanel.ScreenMode.MASTER + ? MODE_MASTER_BG + : MODE_SELF_BG; + graphics.fill( + badgeX, + badgeY, + badgeX + badgeWidth, + badgeY + 16, + badgeBg + ); + String badgeText = + mode == ActionPanel.ScreenMode.MASTER + ? Component.translatable("gui.tiedup.mode.master").getString() + : Component.translatable("gui.tiedup.mode.self").getString(); + GuiRenderUtil.drawCenteredStringNoShadow( + graphics, + font, + badgeText, + badgeX + badgeWidth / 2, + badgeY + 4, + GuiRenderUtil.MC_TEXT_DARK + ); // Render all widgets super.render(graphics, mouseX, mouseY, partialTick); diff --git a/src/main/java/com/tiedup/remake/client/gui/util/GuiColors.java b/src/main/java/com/tiedup/remake/client/gui/util/GuiColors.java index a495bf9..f31189c 100644 --- a/src/main/java/com/tiedup/remake/client/gui/util/GuiColors.java +++ b/src/main/java/com/tiedup/remake/client/gui/util/GuiColors.java @@ -6,7 +6,6 @@ import com.tiedup.remake.v2.BodyRegionV2; * Color constants for TiedUp! GUI elements. * All colors are in ARGB format (0xAARRGGBB). * - * Phase 16: GUI Revamp */ public class GuiColors { @@ -65,7 +64,7 @@ public class GuiColors { */ public static int getRegionColor(BodyRegionV2 region) { return switch (region) { - case HEAD -> 0xFF9C27B0; // Purple + case HEAD -> 0xFF9C27B0; // Purple case EYES -> TYPE_BLINDFOLD; case EARS -> TYPE_EARPLUGS; case MOUTH -> TYPE_GAG; @@ -73,12 +72,12 @@ public class GuiColors { case TORSO -> TYPE_CLOTHES; case ARMS -> TYPE_BIND; case HANDS -> TYPE_MITTENS; - case FINGERS -> 0xFFFFAB91; // Light orange - case WAIST -> 0xFF795548; // Brown - case LEGS -> 0xFF607D8B; // Blue-gray - case FEET -> 0xFF78909C; // Light blue-gray - case TAIL -> 0xFFCE93D8; // Light purple - case WINGS -> 0xFF80DEEA; // Light cyan + case FINGERS -> 0xFFFFAB91; // Light orange + case WAIST -> 0xFF795548; // Brown + case LEGS -> 0xFF607D8B; // Blue-gray + case FEET -> 0xFF78909C; // Light blue-gray + case TAIL -> 0xFFCE93D8; // Light purple + case WINGS -> 0xFF80DEEA; // Light cyan }; } diff --git a/src/main/java/com/tiedup/remake/client/gui/util/GuiRenderUtil.java b/src/main/java/com/tiedup/remake/client/gui/util/GuiRenderUtil.java index eeb28d9..b90b443 100644 --- a/src/main/java/com/tiedup/remake/client/gui/util/GuiRenderUtil.java +++ b/src/main/java/com/tiedup/remake/client/gui/util/GuiRenderUtil.java @@ -12,21 +12,27 @@ import net.minecraftforge.api.distmarker.OnlyIn; public final class GuiRenderUtil { // Vanilla MC 3D border colors - public static final int MC_PANEL_BG = 0xFFC6C6C6; + public static final int MC_PANEL_BG = 0xFFC6C6C6; public static final int MC_HIGHLIGHT_OUTER = 0xFFFFFFFF; public static final int MC_HIGHLIGHT_INNER = 0xFFDBDBDB; - public static final int MC_SHADOW_INNER = 0xFF555555; - public static final int MC_SHADOW_OUTER = 0xFF373737; - public static final int MC_SLOT_BG = 0xFF8B8B8B; - public static final int MC_TEXT_DARK = 0xFF404040; - public static final int MC_TEXT_GRAY = 0xFF555555; + public static final int MC_SHADOW_INNER = 0xFF555555; + public static final int MC_SHADOW_OUTER = 0xFF373737; + public static final int MC_SLOT_BG = 0xFF8B8B8B; + public static final int MC_TEXT_DARK = 0xFF404040; + public static final int MC_TEXT_GRAY = 0xFF555555; private GuiRenderUtil() {} /** * Draw a vanilla MC-style raised panel (light gray with 3D beveled borders). */ - public static void drawMCPanel(GuiGraphics graphics, int x, int y, int width, int height) { + public static void drawMCPanel( + GuiGraphics graphics, + int x, + int y, + int width, + int height + ) { // Fill graphics.fill(x, y, x + width, y + height, MC_PANEL_BG); // Top highlight (outer white, inner light) @@ -36,17 +42,41 @@ public final class GuiRenderUtil { graphics.fill(x, y, x + 1, y + height, MC_HIGHLIGHT_OUTER); graphics.fill(x + 1, y + 1, x + 2, y + height - 1, MC_HIGHLIGHT_INNER); // Bottom shadow - graphics.fill(x, y + height - 1, x + width, y + height, MC_SHADOW_OUTER); - graphics.fill(x + 1, y + height - 2, x + width - 1, y + height - 1, MC_SHADOW_INNER); + graphics.fill( + x, + y + height - 1, + x + width, + y + height, + MC_SHADOW_OUTER + ); + graphics.fill( + x + 1, + y + height - 2, + x + width - 1, + y + height - 1, + MC_SHADOW_INNER + ); // Right shadow graphics.fill(x + width - 1, y, x + width, y + height, MC_SHADOW_OUTER); - graphics.fill(x + width - 2, y + 1, x + width - 1, y + height - 1, MC_SHADOW_INNER); + graphics.fill( + x + width - 2, + y + 1, + x + width - 1, + y + height - 1, + MC_SHADOW_INNER + ); } /** * Draw a vanilla MC-style sunken panel (inverted 3D borders — dark outside, light inside). */ - public static void drawMCSunkenPanel(GuiGraphics graphics, int x, int y, int width, int height) { + public static void drawMCSunkenPanel( + GuiGraphics graphics, + int x, + int y, + int width, + int height + ) { graphics.fill(x, y, x + width, y + height, MC_SLOT_BG); // Top shadow (dark) graphics.fill(x, y, x + width, y + 1, MC_SHADOW_OUTER); @@ -55,39 +85,95 @@ public final class GuiRenderUtil { graphics.fill(x, y, x + 1, y + height, MC_SHADOW_OUTER); graphics.fill(x + 1, y + 1, x + 2, y + height - 1, MC_SHADOW_INNER); // Bottom highlight (light) - graphics.fill(x, y + height - 1, x + width, y + height, MC_HIGHLIGHT_OUTER); - graphics.fill(x + 1, y + height - 2, x + width - 1, y + height - 1, MC_HIGHLIGHT_INNER); + graphics.fill( + x, + y + height - 1, + x + width, + y + height, + MC_HIGHLIGHT_OUTER + ); + graphics.fill( + x + 1, + y + height - 2, + x + width - 1, + y + height - 1, + MC_HIGHLIGHT_INNER + ); // Right highlight (light) - graphics.fill(x + width - 1, y, x + width, y + height, MC_HIGHLIGHT_OUTER); - graphics.fill(x + width - 2, y + 1, x + width - 1, y + height - 1, MC_HIGHLIGHT_INNER); + graphics.fill( + x + width - 1, + y, + x + width, + y + height, + MC_HIGHLIGHT_OUTER + ); + graphics.fill( + x + width - 2, + y + 1, + x + width - 1, + y + height - 1, + MC_HIGHLIGHT_INNER + ); } /** * Draw a vanilla MC-style sunken slot. */ - public static void drawMCSlot(GuiGraphics graphics, int x, int y, int width, int height) { + public static void drawMCSlot( + GuiGraphics graphics, + int x, + int y, + int width, + int height + ) { graphics.fill(x, y, x + width, y + height, MC_SLOT_BG); // Top shadow graphics.fill(x, y, x + width, y + 1, MC_SHADOW_OUTER); // Left shadow graphics.fill(x, y, x + 1, y + height, MC_SHADOW_OUTER); // Bottom highlight - graphics.fill(x, y + height - 1, x + width, y + height, MC_HIGHLIGHT_OUTER); + graphics.fill( + x, + y + height - 1, + x + width, + y + height, + MC_HIGHLIGHT_OUTER + ); // Right highlight - graphics.fill(x + width - 1, y, x + width, y + height, MC_HIGHLIGHT_OUTER); + graphics.fill( + x + width - 1, + y, + x + width, + y + height, + MC_HIGHLIGHT_OUTER + ); } /** * Draw vanilla-style slot hover overlay (white semi-transparent). */ - public static void drawSlotHover(GuiGraphics graphics, int x, int y, int width, int height) { + public static void drawSlotHover( + GuiGraphics graphics, + int x, + int y, + int width, + int height + ) { graphics.fill(x + 1, y + 1, x + width - 1, y + height - 1, 0x80FFFFFF); } /** * Draw a vanilla MC-style button (raised 3D appearance). */ - public static void drawMCButton(GuiGraphics graphics, int x, int y, int width, int height, boolean hovered, boolean enabled) { + public static void drawMCButton( + GuiGraphics graphics, + int x, + int y, + int width, + int height, + boolean hovered, + boolean enabled + ) { int bg = enabled ? (hovered ? 0xFFA0A0A0 : MC_SLOT_BG) : 0xFF606060; graphics.fill(x, y, x + width, y + height, bg); if (enabled) { @@ -96,9 +182,21 @@ public final class GuiRenderUtil { // Left highlight graphics.fill(x, y, x + 1, y + height, MC_HIGHLIGHT_OUTER); // Bottom shadow - graphics.fill(x, y + height - 1, x + width, y + height, MC_SHADOW_OUTER); + graphics.fill( + x, + y + height - 1, + x + width, + y + height, + MC_SHADOW_OUTER + ); // Right shadow - graphics.fill(x + width - 1, y, x + width, y + height, MC_SHADOW_OUTER); + graphics.fill( + x + width - 1, + y, + x + width, + y + height, + MC_SHADOW_OUTER + ); } else { // Flat dark border for disabled graphics.fill(x, y, x + width, y + 1, 0xFF505050); @@ -111,7 +209,13 @@ public final class GuiRenderUtil { /** * Draw a selected slot highlight border (gold/yellow). */ - public static void drawSelectedBorder(GuiGraphics graphics, int x, int y, int width, int height) { + public static void drawSelectedBorder( + GuiGraphics graphics, + int x, + int y, + int width, + int height + ) { int gold = 0xFFFFD700; // Top graphics.fill(x, y, x + width, y + 1, gold); @@ -131,9 +235,23 @@ public final class GuiRenderUtil { * Draw centered text WITHOUT shadow (vanilla drawCenteredString always adds shadow). * Use this for dark text on light MC panels. */ - public static void drawCenteredStringNoShadow(GuiGraphics graphics, net.minecraft.client.gui.Font font, String text, int centerX, int y, int color) { + public static void drawCenteredStringNoShadow( + GuiGraphics graphics, + net.minecraft.client.gui.Font font, + String text, + int centerX, + int y, + int color + ) { int textWidth = font.width(text); - graphics.drawString(font, text, centerX - textWidth / 2, y, color, false); + graphics.drawString( + font, + text, + centerX - textWidth / 2, + y, + color, + false + ); } /** diff --git a/src/main/java/com/tiedup/remake/client/gui/widgets/ActionPanel.java b/src/main/java/com/tiedup/remake/client/gui/widgets/ActionPanel.java index 0cecb32..9bf0801 100644 --- a/src/main/java/com/tiedup/remake/client/gui/widgets/ActionPanel.java +++ b/src/main/java/com/tiedup/remake/client/gui/widgets/ActionPanel.java @@ -43,7 +43,10 @@ import net.minecraftforge.api.distmarker.OnlyIn; @OnlyIn(Dist.CLIENT) public class ActionPanel extends AbstractWidget { - public enum ScreenMode { SELF, MASTER } + public enum ScreenMode { + SELF, + MASTER, + } private record ActionEntry( String labelKey, @@ -86,19 +89,35 @@ public class ActionPanel extends AbstractWidget { super(x, y, width, height, Component.literal("Actions")); } - public void setMode(ScreenMode mode) { this.mode = mode; } + public void setMode(ScreenMode mode) { + this.mode = mode; + } + public void setTargetEntity(LivingEntity entity) { this.targetEntity = entity; this.targetEntityUUID = entity != null ? entity.getUUID() : null; } + public void setKeyInfo(UUID keyUUID, boolean isMasterKey) { this.keyUUID = keyUUID; this.isMasterKey = isMasterKey; } - public void setOnAdjustRequested(Consumer cb) { this.onAdjustRequested = cb; } - public void setOnEquipRequested(Consumer cb) { this.onEquipRequested = cb; } - public void setOnCellAssignRequested(Runnable cb) { this.onCellAssignRequested = cb; } - public void setOnCloseRequested(Runnable cb) { this.onCloseRequested = cb; } + + public void setOnAdjustRequested(Consumer cb) { + this.onAdjustRequested = cb; + } + + public void setOnEquipRequested(Consumer cb) { + this.onEquipRequested = cb; + } + + public void setOnCellAssignRequested(Runnable cb) { + this.onCellAssignRequested = cb; + } + + public void setOnCloseRequested(Runnable cb) { + this.onCloseRequested = cb; + } /** * Update the action panel context. Call when the selected slot changes. @@ -142,7 +161,9 @@ public class ActionPanel extends AbstractWidget { if (stack.getItem() instanceof ItemKey) { return stack; // Regular key takes priority } - if (masterKeyStack.isEmpty() && stack.is(ModItems.MASTER_KEY.get())) { + if ( + masterKeyStack.isEmpty() && stack.is(ModItems.MASTER_KEY.get()) + ) { masterKeyStack = stack; // Remember master key as fallback } } @@ -151,110 +172,214 @@ public class ActionPanel extends AbstractWidget { private void buildSelfActions(Player player) { boolean isEmpty = selectedItem.isEmpty(); - boolean armsOccupied = V2EquipmentHelper.isRegionOccupied(player, BodyRegionV2.ARMS); - boolean handsOccupied = V2EquipmentHelper.isRegionOccupied(player, BodyRegionV2.HANDS); + boolean armsOccupied = V2EquipmentHelper.isRegionOccupied( + player, + BodyRegionV2.ARMS + ); + boolean handsOccupied = V2EquipmentHelper.isRegionOccupied( + player, + BodyRegionV2.HANDS + ); boolean armsFree = !armsOccupied; boolean handsFree = !handsOccupied; boolean isLocked = false; boolean isLockable = false; boolean isJammed = false; - boolean hasMittens = V2EquipmentHelper.isRegionOccupied(player, BodyRegionV2.HANDS); + boolean hasMittens = V2EquipmentHelper.isRegionOccupied( + player, + BodyRegionV2.HANDS + ); if (!isEmpty && selectedItem.getItem() instanceof ILockable lockable) { isLocked = lockable.isLocked(selectedItem); isLockable = lockable.isLockable(selectedItem); isJammed = lockable.isJammed(selectedItem); } - boolean hasLockpick = !ItemLockpick.findLockpickInInventory(player).isEmpty(); + boolean hasLockpick = !ItemLockpick.findLockpickInInventory( + player + ).isEmpty(); boolean hasKnife = !GenericKnife.findKnifeInInventory(player).isEmpty(); ItemStack foundKey = findKeyInInventory(player); boolean hasKey = !foundKey.isEmpty(); - boolean foundKeyIsMaster = hasKey && foundKey.is(ModItems.MASTER_KEY.get()); + boolean foundKeyIsMaster = + hasKey && foundKey.is(ModItems.MASTER_KEY.get()); if (isEmpty) { // Equip action for empty slot - actions.add(new ActionEntry("gui.tiedup.action.equip", true, null, - () -> { if (onEquipRequested != null) onEquipRequested.accept(selectedRegion); })); + actions.add( + new ActionEntry("gui.tiedup.action.equip", true, null, () -> { + if (onEquipRequested != null) onEquipRequested.accept( + selectedRegion + ); + }) + ); return; } // Remove - boolean canRemove = armsFree && handsFree && !isLocked && selectedRegion != BodyRegionV2.ARMS; - String removeReason = isLocked ? "gui.tiedup.reason.locked" : - !armsFree ? "gui.tiedup.reason.arms_bound" : - !handsFree ? "gui.tiedup.reason.hands_bound" : - selectedRegion == BodyRegionV2.ARMS ? "gui.tiedup.reason.use_struggle" : null; - actions.add(new ActionEntry("gui.tiedup.action.remove", canRemove, removeReason, - () -> ModNetwork.sendToServer(new PacketV2SelfRemove(selectedRegion)))); + boolean canRemove = + armsFree && + handsFree && + !isLocked && + selectedRegion != BodyRegionV2.ARMS; + String removeReason = isLocked + ? "gui.tiedup.reason.locked" + : !armsFree + ? "gui.tiedup.reason.arms_bound" + : !handsFree + ? "gui.tiedup.reason.hands_bound" + : selectedRegion == BodyRegionV2.ARMS + ? "gui.tiedup.reason.use_struggle" + : null; + actions.add( + new ActionEntry( + "gui.tiedup.action.remove", + canRemove, + removeReason, + () -> + ModNetwork.sendToServer( + new PacketV2SelfRemove(selectedRegion) + ) + ) + ); // Struggle (locked items only) if (isLocked) { - actions.add(new ActionEntry("gui.tiedup.action.struggle", true, null, - () -> { - ModNetwork.sendToServer(new PacketV2StruggleStart(selectedRegion)); - if (onCloseRequested != null) onCloseRequested.run(); - })); + actions.add( + new ActionEntry( + "gui.tiedup.action.struggle", + true, + null, + () -> { + ModNetwork.sendToServer( + new PacketV2StruggleStart(selectedRegion) + ); + if (onCloseRequested != null) onCloseRequested.run(); + } + ) + ); } // Lockpick if (isLocked) { boolean canPick = hasLockpick && !hasMittens && !isJammed; - String pickReason = !hasLockpick ? "gui.tiedup.reason.no_lockpick" : - hasMittens ? "gui.tiedup.reason.mittens" : - isJammed ? "gui.tiedup.reason.jammed" : null; - actions.add(new ActionEntry("gui.tiedup.action.lockpick", canPick, pickReason, - () -> { - ModNetwork.sendToServer(new PacketLockpickMiniGameStart(selectedRegion)); - if (onCloseRequested != null) onCloseRequested.run(); - })); + String pickReason = !hasLockpick + ? "gui.tiedup.reason.no_lockpick" + : hasMittens + ? "gui.tiedup.reason.mittens" + : isJammed + ? "gui.tiedup.reason.jammed" + : null; + actions.add( + new ActionEntry( + "gui.tiedup.action.lockpick", + canPick, + pickReason, + () -> { + ModNetwork.sendToServer( + new PacketLockpickMiniGameStart(selectedRegion) + ); + if (onCloseRequested != null) onCloseRequested.run(); + } + ) + ); } // Cut if (isLocked) { boolean canCut = hasKnife && !hasMittens; - String cutReason = !hasKnife ? "gui.tiedup.reason.no_knife" : - hasMittens ? "gui.tiedup.reason.mittens" : null; - actions.add(new ActionEntry("gui.tiedup.action.cut", canCut, cutReason, - () -> { - ModNetwork.sendToServer(new PacketSetKnifeCutTarget(selectedRegion)); - if (onCloseRequested != null) onCloseRequested.run(); - })); + String cutReason = !hasKnife + ? "gui.tiedup.reason.no_knife" + : hasMittens + ? "gui.tiedup.reason.mittens" + : null; + actions.add( + new ActionEntry( + "gui.tiedup.action.cut", + canCut, + cutReason, + () -> { + ModNetwork.sendToServer( + new PacketSetKnifeCutTarget(selectedRegion) + ); + if (onCloseRequested != null) onCloseRequested.run(); + } + ) + ); } // Adjust (MOUTH, EYES only) - if (selectedRegion == BodyRegionV2.MOUTH || selectedRegion == BodyRegionV2.EYES) { - actions.add(new ActionEntry("gui.tiedup.action.adjust", true, null, - () -> { if (onAdjustRequested != null) onAdjustRequested.accept(selectedRegion); })); + if ( + selectedRegion == BodyRegionV2.MOUTH || + selectedRegion == BodyRegionV2.EYES + ) { + actions.add( + new ActionEntry("gui.tiedup.action.adjust", true, null, () -> { + if (onAdjustRequested != null) onAdjustRequested.accept( + selectedRegion + ); + }) + ); } // Lock (self, with key, arms free) if (isLockable && !isLocked) { boolean canLock = hasKey && armsFree; - String lockReason = !hasKey ? "gui.tiedup.reason.no_key" : - !armsFree ? "gui.tiedup.reason.arms_bound" : null; - actions.add(new ActionEntry("gui.tiedup.action.lock", canLock, lockReason, - () -> ModNetwork.sendToServer(new PacketV2SelfLock(selectedRegion)))); + String lockReason = !hasKey + ? "gui.tiedup.reason.no_key" + : !armsFree + ? "gui.tiedup.reason.arms_bound" + : null; + actions.add( + new ActionEntry( + "gui.tiedup.action.lock", + canLock, + lockReason, + () -> + ModNetwork.sendToServer( + new PacketV2SelfLock(selectedRegion) + ) + ) + ); } // Unlock (self, with matching key, arms free) if (isLocked) { boolean keyMatches = false; - if (hasKey && selectedItem.getItem() instanceof ILockable lockable) { + if ( + hasKey && selectedItem.getItem() instanceof ILockable lockable + ) { if (foundKeyIsMaster) { keyMatches = true; // Master key matches all locks } else if (foundKey.getItem() instanceof ItemKey itemKey) { - UUID lockKeyUUID = lockable.getLockedByKeyUUID(selectedItem); + UUID lockKeyUUID = lockable.getLockedByKeyUUID( + selectedItem + ); UUID foundKeyUUID = itemKey.getKeyUUID(foundKey); - keyMatches = lockKeyUUID == null || lockKeyUUID.equals(foundKeyUUID); + keyMatches = + lockKeyUUID == null || lockKeyUUID.equals(foundKeyUUID); } } boolean canUnlock = hasKey && armsFree && keyMatches; - String unlockReason = !hasKey ? "gui.tiedup.reason.no_key" : - !armsFree ? "gui.tiedup.reason.arms_bound" : - !keyMatches ? "gui.tiedup.reason.wrong_key" : null; - actions.add(new ActionEntry("gui.tiedup.action.unlock", canUnlock, unlockReason, - () -> ModNetwork.sendToServer(new PacketV2SelfUnlock(selectedRegion)))); + String unlockReason = !hasKey + ? "gui.tiedup.reason.no_key" + : !armsFree + ? "gui.tiedup.reason.arms_bound" + : !keyMatches + ? "gui.tiedup.reason.wrong_key" + : null; + actions.add( + new ActionEntry( + "gui.tiedup.action.unlock", + canUnlock, + unlockReason, + () -> + ModNetwork.sendToServer( + new PacketV2SelfUnlock(selectedRegion) + ) + ) + ); } } @@ -269,71 +394,169 @@ public class ActionPanel extends AbstractWidget { } if (isEmpty) { - actions.add(new ActionEntry("gui.tiedup.action.equip", true, null, - () -> { if (onEquipRequested != null) onEquipRequested.accept(selectedRegion); })); + actions.add( + new ActionEntry("gui.tiedup.action.equip", true, null, () -> { + if (onEquipRequested != null) onEquipRequested.accept( + selectedRegion + ); + }) + ); return; } // Remove - actions.add(new ActionEntry("gui.tiedup.action.remove", !isLocked, - isLocked ? "gui.tiedup.reason.locked" : null, - () -> ModNetwork.sendToServer(new PacketSlaveItemManage( - targetEntityUUID, selectedRegion, PacketSlaveItemManage.Action.REMOVE, keyUUID, isMasterKey)))); + actions.add( + new ActionEntry( + "gui.tiedup.action.remove", + !isLocked, + isLocked ? "gui.tiedup.reason.locked" : null, + () -> + ModNetwork.sendToServer( + new PacketSlaveItemManage( + targetEntityUUID, + selectedRegion, + PacketSlaveItemManage.Action.REMOVE, + keyUUID, + isMasterKey + ) + ) + ) + ); // Lock if (isLockable && !isLocked) { - actions.add(new ActionEntry("gui.tiedup.action.lock", true, null, - () -> ModNetwork.sendToServer(new PacketSlaveItemManage( - targetEntityUUID, selectedRegion, PacketSlaveItemManage.Action.LOCK, keyUUID, isMasterKey)))); + actions.add( + new ActionEntry("gui.tiedup.action.lock", true, null, () -> + ModNetwork.sendToServer( + new PacketSlaveItemManage( + targetEntityUUID, + selectedRegion, + PacketSlaveItemManage.Action.LOCK, + keyUUID, + isMasterKey + ) + ) + ) + ); } // Unlock if (isLocked) { - actions.add(new ActionEntry("gui.tiedup.action.unlock", true, null, - () -> ModNetwork.sendToServer(new PacketSlaveItemManage( - targetEntityUUID, selectedRegion, PacketSlaveItemManage.Action.UNLOCK, keyUUID, isMasterKey)))); + actions.add( + new ActionEntry("gui.tiedup.action.unlock", true, null, () -> + ModNetwork.sendToServer( + new PacketSlaveItemManage( + targetEntityUUID, + selectedRegion, + PacketSlaveItemManage.Action.UNLOCK, + keyUUID, + isMasterKey + ) + ) + ) + ); } // Adjust (MOUTH, EYES) - if (selectedRegion == BodyRegionV2.MOUTH || selectedRegion == BodyRegionV2.EYES) { - actions.add(new ActionEntry("gui.tiedup.action.adjust", true, null, - () -> { if (onAdjustRequested != null) onAdjustRequested.accept(selectedRegion); })); + if ( + selectedRegion == BodyRegionV2.MOUTH || + selectedRegion == BodyRegionV2.EYES + ) { + actions.add( + new ActionEntry("gui.tiedup.action.adjust", true, null, () -> { + if (onAdjustRequested != null) onAdjustRequested.accept( + selectedRegion + ); + }) + ); } // Bondage Service toggle (NECK collar only, prison configured) - if (selectedRegion == BodyRegionV2.NECK && selectedItem.getItem() instanceof ItemCollar collar) { + if ( + selectedRegion == BodyRegionV2.NECK && + selectedItem.getItem() instanceof ItemCollar collar + ) { if (collar.hasCellAssigned(selectedItem)) { - boolean svcEnabled = collar.isBondageServiceEnabled(selectedItem); - String svcKey = svcEnabled ? "gui.tiedup.action.svc_off" : "gui.tiedup.action.svc_on"; - actions.add(new ActionEntry(svcKey, true, null, - () -> ModNetwork.sendToServer(new PacketSlaveItemManage( - targetEntityUUID, selectedRegion, - PacketSlaveItemManage.Action.TOGGLE_BONDAGE_SERVICE, keyUUID, isMasterKey)))); + boolean svcEnabled = collar.isBondageServiceEnabled( + selectedItem + ); + String svcKey = svcEnabled + ? "gui.tiedup.action.svc_off" + : "gui.tiedup.action.svc_on"; + actions.add( + new ActionEntry(svcKey, true, null, () -> + ModNetwork.sendToServer( + new PacketSlaveItemManage( + targetEntityUUID, + selectedRegion, + PacketSlaveItemManage.Action.TOGGLE_BONDAGE_SERVICE, + keyUUID, + isMasterKey + ) + ) + ) + ); } // Cell assign - actions.add(new ActionEntry("gui.tiedup.action.cell_assign", true, null, - () -> { if (onCellAssignRequested != null) onCellAssignRequested.run(); })); + actions.add( + new ActionEntry( + "gui.tiedup.action.cell_assign", + true, + null, + () -> { + if ( + onCellAssignRequested != null + ) onCellAssignRequested.run(); + } + ) + ); } } @Override - protected void renderWidget(GuiGraphics graphics, int mouseX, int mouseY, float partialTick) { + protected void renderWidget( + GuiGraphics graphics, + int mouseX, + int mouseY, + float partialTick + ) { Minecraft mc = Minecraft.getInstance(); // MC-style sunken panel background - GuiRenderUtil.drawMCSunkenPanel(graphics, getX(), getY(), width, height); + GuiRenderUtil.drawMCSunkenPanel( + graphics, + getX(), + getY(), + width, + height + ); // Title String title; if (selectedRegion == null) { - title = Component.translatable("gui.tiedup.action.no_selection").getString(); + title = Component.translatable( + "gui.tiedup.action.no_selection" + ).getString(); } else if (selectedItem.isEmpty()) { - title = Component.translatable("gui.tiedup.action.title_empty", - Component.translatable("gui.tiedup.region." + selectedRegion.name().toLowerCase())).getString(); + title = Component.translatable( + "gui.tiedup.action.title_empty", + Component.translatable( + "gui.tiedup.region." + selectedRegion.name().toLowerCase() + ) + ).getString(); } else { - title = (mode == ScreenMode.MASTER ? "\u265B " : "") + selectedItem.getHoverName().getString(); + title = + (mode == ScreenMode.MASTER ? "\u265B " : "") + + selectedItem.getHoverName().getString(); } - graphics.drawString(mc.font, title, getX() + PADDING, getY() + PADDING, TITLE_COLOR, false); + graphics.drawString( + mc.font, + title, + getX() + PADDING, + getY() + PADDING, + TITLE_COLOR, + false + ); // Action buttons grid (MC-style buttons) hoveredIndex = -1; @@ -347,14 +570,27 @@ public class ActionPanel extends AbstractWidget { int btnX = startX + col * (BUTTON_WIDTH + BUTTON_SPACING); int btnY = startY + row * (BUTTON_HEIGHT + 4); - boolean hovered = mouseX >= btnX && mouseX < btnX + BUTTON_WIDTH - && mouseY >= btnY && mouseY < btnY + BUTTON_HEIGHT; + boolean hovered = + mouseX >= btnX && + mouseX < btnX + BUTTON_WIDTH && + mouseY >= btnY && + mouseY < btnY + BUTTON_HEIGHT; if (hovered) hoveredIndex = i; int textColor = action.enabled() ? TEXT_ENABLED : TEXT_DISABLED; - GuiRenderUtil.drawMCButton(graphics, btnX, btnY, BUTTON_WIDTH, BUTTON_HEIGHT, hovered, action.enabled()); + GuiRenderUtil.drawMCButton( + graphics, + btnX, + btnY, + BUTTON_WIDTH, + BUTTON_HEIGHT, + hovered, + action.enabled() + ); - String label = Component.translatable(action.labelKey()).getString(); + String label = Component.translatable( + action.labelKey() + ).getString(); int textX = btnX + (BUTTON_WIDTH - mc.font.width(label)) / 2; int textY = btnY + (BUTTON_HEIGHT - mc.font.lineHeight) / 2; graphics.drawString(mc.font, label, textX, textY, textColor, false); @@ -363,10 +599,16 @@ public class ActionPanel extends AbstractWidget { // Tooltip for disabled button if (hoveredIndex >= 0 && hoveredIndex < actions.size()) { ActionEntry hoverAction = actions.get(hoveredIndex); - if (!hoverAction.enabled() && hoverAction.disabledReasonKey() != null) { - graphics.renderTooltip(mc.font, + if ( + !hoverAction.enabled() && + hoverAction.disabledReasonKey() != null + ) { + graphics.renderTooltip( + mc.font, Component.translatable(hoverAction.disabledReasonKey()), - mouseX, mouseY); + mouseX, + mouseY + ); } } } @@ -386,8 +628,12 @@ public class ActionPanel extends AbstractWidget { int btnX = startX + col * (BUTTON_WIDTH + BUTTON_SPACING); int btnY = startY + row * (BUTTON_HEIGHT + 4); - if (mouseX >= btnX && mouseX < btnX + BUTTON_WIDTH - && mouseY >= btnY && mouseY < btnY + BUTTON_HEIGHT) { + if ( + mouseX >= btnX && + mouseX < btnX + BUTTON_WIDTH && + mouseY >= btnY && + mouseY < btnY + BUTTON_HEIGHT + ) { if (action.enabled() && action.onClick() != null) { action.onClick().run(); playDownSound(mc.getSoundManager()); @@ -401,6 +647,9 @@ public class ActionPanel extends AbstractWidget { @Override protected void updateWidgetNarration(NarrationElementOutput output) { - output.add(NarratedElementType.TITLE, Component.translatable("gui.tiedup.action_panel")); + output.add( + NarratedElementType.TITLE, + Component.translatable("gui.tiedup.action_panel") + ); } } diff --git a/src/main/java/com/tiedup/remake/client/gui/widgets/AdjustmentSlider.java b/src/main/java/com/tiedup/remake/client/gui/widgets/AdjustmentSlider.java index 4597850..4e8fbe1 100644 --- a/src/main/java/com/tiedup/remake/client/gui/widgets/AdjustmentSlider.java +++ b/src/main/java/com/tiedup/remake/client/gui/widgets/AdjustmentSlider.java @@ -19,7 +19,6 @@ import net.minecraftforge.api.distmarker.OnlyIn; * Vertical slider widget for adjusting Y position of items. * Displays current value and supports mouse drag and scroll wheel. * - * Phase 16b: GUI Refactoring - Fixed alignment and layout */ @OnlyIn(Dist.CLIENT) public class AdjustmentSlider extends AbstractWidget { diff --git a/src/main/java/com/tiedup/remake/client/gui/widgets/CellListRenderer.java b/src/main/java/com/tiedup/remake/client/gui/widgets/CellListRenderer.java index 196857d..dee4f14 100644 --- a/src/main/java/com/tiedup/remake/client/gui/widgets/CellListRenderer.java +++ b/src/main/java/com/tiedup/remake/client/gui/widgets/CellListRenderer.java @@ -39,16 +39,14 @@ public final class CellListRenderer { ) { graphics.drawCenteredString( font, - Component.translatable(noItemsKey) - .withStyle(ChatFormatting.GRAY), + Component.translatable(noItemsKey).withStyle(ChatFormatting.GRAY), centerX, startY + 20, GuiColors.TEXT_DISABLED ); graphics.drawCenteredString( font, - Component.translatable(hintKey) - .withStyle(ChatFormatting.ITALIC), + Component.translatable(hintKey).withStyle(ChatFormatting.ITALIC), centerX, startY + 35, GuiColors.TEXT_DISABLED diff --git a/src/main/java/com/tiedup/remake/client/gui/widgets/EntityPreviewWidget.java b/src/main/java/com/tiedup/remake/client/gui/widgets/EntityPreviewWidget.java index 3100cf7..ff23948 100644 --- a/src/main/java/com/tiedup/remake/client/gui/widgets/EntityPreviewWidget.java +++ b/src/main/java/com/tiedup/remake/client/gui/widgets/EntityPreviewWidget.java @@ -18,7 +18,6 @@ import org.joml.Quaternionf; * Widget that displays a 3D preview of a LivingEntity. * Supports mouse drag rotation and optional auto-rotation. * - * Phase 16: GUI Revamp - Reusable entity preview widget */ @OnlyIn(Dist.CLIENT) public class EntityPreviewWidget extends AbstractWidget { diff --git a/src/main/java/com/tiedup/remake/client/gui/widgets/ItemPickerOverlay.java b/src/main/java/com/tiedup/remake/client/gui/widgets/ItemPickerOverlay.java index 4622f9b..833b3c8 100644 --- a/src/main/java/com/tiedup/remake/client/gui/widgets/ItemPickerOverlay.java +++ b/src/main/java/com/tiedup/remake/client/gui/widgets/ItemPickerOverlay.java @@ -56,14 +56,27 @@ public class ItemPickerOverlay extends AbstractWidget { this.visible = false; } - public void setOnItemSelected(BiConsumer cb) { this.onItemSelected = cb; } - public void setOnCancelled(Runnable cb) { this.onCancelled = cb; } - public boolean isOverlayVisible() { return visible; } + public void setOnItemSelected(BiConsumer cb) { + this.onItemSelected = cb; + } + + public void setOnCancelled(Runnable cb) { + this.onCancelled = cb; + } + + public boolean isOverlayVisible() { + return visible; + } /** * Open the picker overlay for a specific region. */ - public void open(BodyRegionV2 region, boolean selfMode, int screenWidth, int screenHeight) { + public void open( + BodyRegionV2 region, + boolean selfMode, + int screenWidth, + int screenHeight + ) { this.targetRegion = region; this.isSelfMode = selfMode; this.screenWidth = screenWidth; @@ -89,23 +102,45 @@ public class ItemPickerOverlay extends AbstractWidget { for (int i = 0; i < player.getInventory().getContainerSize(); i++) { ItemStack stack = player.getInventory().getItem(i); if (stack.isEmpty()) continue; - if (!(stack.getItem() instanceof IV2BondageItem bondageItem)) continue; - if (!bondageItem.getOccupiedRegions(stack).contains(targetRegion)) continue; + if ( + !(stack.getItem() instanceof IV2BondageItem bondageItem) + ) continue; + if ( + !bondageItem.getOccupiedRegions(stack).contains(targetRegion) + ) continue; entries.add(new PickerEntry(stack, i)); } } // Panel bounds (centered on screen) - private int getPanelWidth() { return Math.min(280, screenWidth - 40); } + private int getPanelWidth() { + return Math.min(280, screenWidth - 40); + } + private int getPanelHeight() { - int contentH = entries.size() * ENTRY_HEIGHT + CANCEL_BTN_HEIGHT + PADDING * 3 + 20; + int contentH = + entries.size() * ENTRY_HEIGHT + + CANCEL_BTN_HEIGHT + + PADDING * 3 + + 20; return Math.min(contentH, screenHeight - 60); } - private int getPanelX() { return (screenWidth - getPanelWidth()) / 2; } - private int getPanelY() { return (screenHeight - getPanelHeight()) / 2; } + + private int getPanelX() { + return (screenWidth - getPanelWidth()) / 2; + } + + private int getPanelY() { + return (screenHeight - getPanelHeight()) / 2; + } @Override - protected void renderWidget(GuiGraphics graphics, int mouseX, int mouseY, float partialTick) { + protected void renderWidget( + GuiGraphics graphics, + int mouseX, + int mouseY, + float partialTick + ) { if (!visible) return; Minecraft mc = Minecraft.getInstance(); @@ -121,13 +156,30 @@ public class ItemPickerOverlay extends AbstractWidget { GuiRenderUtil.drawMCPanel(graphics, panelX, panelY, panelW, panelH); // Title (dark text, vanilla style) - String title = Component.translatable("gui.tiedup.picker.title", - Component.translatable("gui.tiedup.region." + targetRegion.name().toLowerCase())).getString(); - graphics.drawString(mc.font, title, panelX + PADDING, panelY + PADDING, GuiRenderUtil.MC_TEXT_DARK, false); + String title = Component.translatable( + "gui.tiedup.picker.title", + Component.translatable( + "gui.tiedup.region." + targetRegion.name().toLowerCase() + ) + ).getString(); + graphics.drawString( + mc.font, + title, + panelX + PADDING, + panelY + PADDING, + GuiRenderUtil.MC_TEXT_DARK, + false + ); // Entries int listY = panelY + PADDING + mc.font.lineHeight + 8; - int maxVisible = (panelH - PADDING * 3 - mc.font.lineHeight - 8 - CANCEL_BTN_HEIGHT) / ENTRY_HEIGHT; + int maxVisible = + (panelH - + PADDING * 3 - + mc.font.lineHeight - + 8 - + CANCEL_BTN_HEIGHT) / + ENTRY_HEIGHT; for (int i = 0; i < Math.min(entries.size(), maxVisible); i++) { int idx = i + scrollOffset; @@ -137,56 +189,123 @@ public class ItemPickerOverlay extends AbstractWidget { int entryX = panelX + PADDING; int entryW = panelW - PADDING * 2; - boolean hovered = mouseX >= entryX && mouseX < entryX + entryW - && mouseY >= entryY && mouseY < entryY + ENTRY_HEIGHT; + boolean hovered = + mouseX >= entryX && + mouseX < entryX + entryW && + mouseY >= entryY && + mouseY < entryY + ENTRY_HEIGHT; boolean isArmsWarning = (armsWarningSlot == entry.inventorySlot); // MC-style slot for each entry - GuiRenderUtil.drawMCSlot(graphics, entryX, entryY, entryW, ENTRY_HEIGHT - 2); + GuiRenderUtil.drawMCSlot( + graphics, + entryX, + entryY, + entryW, + ENTRY_HEIGHT - 2 + ); // Gold border for ARMS warning confirmation if (isArmsWarning) { - GuiRenderUtil.drawSelectedBorder(graphics, entryX, entryY, entryW, ENTRY_HEIGHT - 2); + GuiRenderUtil.drawSelectedBorder( + graphics, + entryX, + entryY, + entryW, + ENTRY_HEIGHT - 2 + ); } // Vanilla hover overlay (white semi-transparent) if (hovered && !isArmsWarning) { - GuiRenderUtil.drawSlotHover(graphics, entryX, entryY, entryW, ENTRY_HEIGHT - 2); + GuiRenderUtil.drawSlotHover( + graphics, + entryX, + entryY, + entryW, + ENTRY_HEIGHT - 2 + ); } // Item icon (16x16) - graphics.renderItem(entry.stack, entryX + 4, entryY + (ENTRY_HEIGHT - 18) / 2); + graphics.renderItem( + entry.stack, + entryX + 4, + entryY + (ENTRY_HEIGHT - 18) / 2 + ); // Item name String name = entry.stack.getHoverName().getString(); - graphics.drawString(mc.font, name, entryX + 24, entryY + (ENTRY_HEIGHT - mc.font.lineHeight) / 2, - GuiRenderUtil.MC_TEXT_DARK, false); + graphics.drawString( + mc.font, + name, + entryX + 24, + entryY + (ENTRY_HEIGHT - mc.font.lineHeight) / 2, + GuiRenderUtil.MC_TEXT_DARK, + false + ); } // ARMS warning text if (armsWarningSlot >= 0) { - String warning = Component.translatable("gui.tiedup.picker.arms_warning").getString(); - int warningY = listY + Math.min(entries.size(), maxVisible) * ENTRY_HEIGHT + 2; - graphics.drawString(mc.font, warning, panelX + PADDING, warningY, WARNING_COLOR, false); + String warning = Component.translatable( + "gui.tiedup.picker.arms_warning" + ).getString(); + int warningY = + listY + Math.min(entries.size(), maxVisible) * ENTRY_HEIGHT + 2; + graphics.drawString( + mc.font, + warning, + panelX + PADDING, + warningY, + WARNING_COLOR, + false + ); } // Empty state if (entries.isEmpty()) { - String empty = Component.translatable("gui.tiedup.picker.empty").getString(); - GuiRenderUtil.drawCenteredStringNoShadow(graphics, mc.font, empty, - panelX + panelW / 2, listY + 20, GuiRenderUtil.MC_TEXT_GRAY); + String empty = Component.translatable( + "gui.tiedup.picker.empty" + ).getString(); + GuiRenderUtil.drawCenteredStringNoShadow( + graphics, + mc.font, + empty, + panelX + panelW / 2, + listY + 20, + GuiRenderUtil.MC_TEXT_GRAY + ); } // Cancel button (MC-style) int cancelX = panelX + (panelW - CANCEL_BTN_WIDTH) / 2; int cancelY = panelY + panelH - CANCEL_BTN_HEIGHT - PADDING; - boolean cancelHovered = mouseX >= cancelX && mouseX < cancelX + CANCEL_BTN_WIDTH - && mouseY >= cancelY && mouseY < cancelY + CANCEL_BTN_HEIGHT; - GuiRenderUtil.drawMCButton(graphics, cancelX, cancelY, CANCEL_BTN_WIDTH, CANCEL_BTN_HEIGHT, cancelHovered, true); - String cancelText = Component.translatable("gui.tiedup.cancel").getString(); - GuiRenderUtil.drawCenteredStringNoShadow(graphics, mc.font, cancelText, - cancelX + CANCEL_BTN_WIDTH / 2, cancelY + (CANCEL_BTN_HEIGHT - mc.font.lineHeight) / 2, - GuiRenderUtil.MC_TEXT_DARK); + boolean cancelHovered = + mouseX >= cancelX && + mouseX < cancelX + CANCEL_BTN_WIDTH && + mouseY >= cancelY && + mouseY < cancelY + CANCEL_BTN_HEIGHT; + GuiRenderUtil.drawMCButton( + graphics, + cancelX, + cancelY, + CANCEL_BTN_WIDTH, + CANCEL_BTN_HEIGHT, + cancelHovered, + true + ); + String cancelText = Component.translatable( + "gui.tiedup.cancel" + ).getString(); + GuiRenderUtil.drawCenteredStringNoShadow( + graphics, + mc.font, + cancelText, + cancelX + CANCEL_BTN_WIDTH / 2, + cancelY + (CANCEL_BTN_HEIGHT - mc.font.lineHeight) / 2, + GuiRenderUtil.MC_TEXT_DARK + ); } @Override @@ -202,8 +321,12 @@ public class ItemPickerOverlay extends AbstractWidget { // Cancel button int cancelX = panelX + (panelW - CANCEL_BTN_WIDTH) / 2; int cancelY = panelY + panelH - CANCEL_BTN_HEIGHT - PADDING; - if (mouseX >= cancelX && mouseX < cancelX + CANCEL_BTN_WIDTH - && mouseY >= cancelY && mouseY < cancelY + CANCEL_BTN_HEIGHT) { + if ( + mouseX >= cancelX && + mouseX < cancelX + CANCEL_BTN_WIDTH && + mouseY >= cancelY && + mouseY < cancelY + CANCEL_BTN_HEIGHT + ) { close(); if (onCancelled != null) onCancelled.run(); return true; @@ -211,7 +334,13 @@ public class ItemPickerOverlay extends AbstractWidget { // Entry clicks int listY = panelY + PADDING + mc.font.lineHeight + 8; - int maxVisible = (panelH - PADDING * 3 - mc.font.lineHeight - 8 - CANCEL_BTN_HEIGHT) / ENTRY_HEIGHT; + int maxVisible = + (panelH - + PADDING * 3 - + mc.font.lineHeight - + 8 - + CANCEL_BTN_HEIGHT) / + ENTRY_HEIGHT; for (int i = 0; i < Math.min(entries.size(), maxVisible); i++) { int idx = i + scrollOffset; @@ -221,21 +350,30 @@ public class ItemPickerOverlay extends AbstractWidget { int entryX = panelX + PADDING; int entryW = panelW - PADDING * 2; - if (mouseX >= entryX && mouseX < entryX + entryW - && mouseY >= entryY && mouseY < entryY + ENTRY_HEIGHT) { - + if ( + mouseX >= entryX && + mouseX < entryX + entryW && + mouseY >= entryY && + mouseY < entryY + ENTRY_HEIGHT + ) { // ARMS self-equip warning: double-click confirmation if (isSelfMode && targetRegion == BodyRegionV2.ARMS) { if (armsWarningSlot == entry.inventorySlot) { // Second click — confirm - if (onItemSelected != null) onItemSelected.accept(targetRegion, entry.inventorySlot); + if (onItemSelected != null) onItemSelected.accept( + targetRegion, + entry.inventorySlot + ); close(); } else { // First click — show warning armsWarningSlot = entry.inventorySlot; } } else { - if (onItemSelected != null) onItemSelected.accept(targetRegion, entry.inventorySlot); + if (onItemSelected != null) onItemSelected.accept( + targetRegion, + entry.inventorySlot + ); close(); } playDownSound(mc.getSoundManager()); @@ -244,8 +382,12 @@ public class ItemPickerOverlay extends AbstractWidget { } // Click outside panel = cancel - if (mouseX < panelX || mouseX > panelX + panelW - || mouseY < panelY || mouseY > panelY + panelH) { + if ( + mouseX < panelX || + mouseX > panelX + panelW || + mouseY < panelY || + mouseY > panelY + panelH + ) { close(); if (onCancelled != null) onCancelled.run(); return true; @@ -258,9 +400,18 @@ public class ItemPickerOverlay extends AbstractWidget { public boolean mouseScrolled(double mouseX, double mouseY, double delta) { if (!visible) return false; int panelH = getPanelHeight(); - int maxVisible = (panelH - PADDING * 3 - Minecraft.getInstance().font.lineHeight - 8 - CANCEL_BTN_HEIGHT) / ENTRY_HEIGHT; + int maxVisible = + (panelH - + PADDING * 3 - + Minecraft.getInstance().font.lineHeight - + 8 - + CANCEL_BTN_HEIGHT) / + ENTRY_HEIGHT; int maxScroll = Math.max(0, entries.size() - maxVisible); - scrollOffset = Math.max(0, Math.min(maxScroll, scrollOffset - (int) delta)); + scrollOffset = Math.max( + 0, + Math.min(maxScroll, scrollOffset - (int) delta) + ); return true; } @@ -268,7 +419,8 @@ public class ItemPickerOverlay extends AbstractWidget { public boolean keyPressed(int keyCode, int scanCode, int modifiers) { if (!visible) return false; // ESC closes overlay - if (keyCode == 256) { // GLFW_KEY_ESCAPE + if (keyCode == 256) { + // GLFW_KEY_ESCAPE close(); if (onCancelled != null) onCancelled.run(); return true; @@ -278,7 +430,17 @@ public class ItemPickerOverlay extends AbstractWidget { @Override protected void updateWidgetNarration(NarrationElementOutput output) { - output.add(NarratedElementType.TITLE, Component.translatable("gui.tiedup.picker.title", - targetRegion != null ? Component.translatable("gui.tiedup.region." + targetRegion.name().toLowerCase()) : "")); + output.add( + NarratedElementType.TITLE, + Component.translatable( + "gui.tiedup.picker.title", + targetRegion != null + ? Component.translatable( + "gui.tiedup.region." + + targetRegion.name().toLowerCase() + ) + : "" + ) + ); } } diff --git a/src/main/java/com/tiedup/remake/client/gui/widgets/RegionSlotWidget.java b/src/main/java/com/tiedup/remake/client/gui/widgets/RegionSlotWidget.java index e4ee49b..d725c42 100644 --- a/src/main/java/com/tiedup/remake/client/gui/widgets/RegionSlotWidget.java +++ b/src/main/java/com/tiedup/remake/client/gui/widgets/RegionSlotWidget.java @@ -231,8 +231,12 @@ public class RegionSlotWidget extends AbstractWidget { if (!showEquipButton || !itemGetter.get().isEmpty()) return false; int bx = getEquipButtonX(); int by = getEquipButtonY(); - return mouseX >= bx && mouseX < bx + EQUIP_BUTTON_WIDTH - && mouseY >= by && mouseY < by + EQUIP_BUTTON_HEIGHT; + return ( + mouseX >= bx && + mouseX < bx + EQUIP_BUTTON_WIDTH && + mouseY >= by && + mouseY < by + EQUIP_BUTTON_HEIGHT + ); } @Override @@ -249,19 +253,32 @@ public class RegionSlotWidget extends AbstractWidget { boolean adjustHovered = isAdjustButtonHovered(mouseX, mouseY); boolean removeHovered = isRemoveButtonHovered(mouseX, mouseY); boolean equipHovered = isEquipButtonHovered(mouseX, mouseY); - boolean anyButtonHovered = adjustHovered || removeHovered || equipHovered; + boolean anyButtonHovered = + adjustHovered || removeHovered || equipHovered; // MC-style sunken slot background GuiRenderUtil.drawMCSlot(graphics, getX(), getY(), width, height); // Selected: gold highlight border on top of the slot if (selected) { - GuiRenderUtil.drawSelectedBorder(graphics, getX(), getY(), width, height); + GuiRenderUtil.drawSelectedBorder( + graphics, + getX(), + getY(), + width, + height + ); } // Hover overlay (vanilla white semi-transparent) if (hovered && !anyButtonHovered && !selected) { - GuiRenderUtil.drawSlotHover(graphics, getX(), getY(), width, height); + GuiRenderUtil.drawSlotHover( + graphics, + getX(), + getY(), + width, + height + ); } // Region icon (uniform dark gray square) @@ -325,22 +342,43 @@ public class RegionSlotWidget extends AbstractWidget { ); // Resistance bar (for items that implement IHasResistance) - if (hasItem && stack.getItem() instanceof IHasResistance resistanceItem) { + if ( + hasItem && stack.getItem() instanceof IHasResistance resistanceItem + ) { Player player = mc.player; if (player != null) { - int current = resistanceItem.getCurrentResistance(stack, player); + int current = resistanceItem.getCurrentResistance( + stack, + player + ); int base = resistanceItem.getBaseResistance(player); if (base > 0) { - float ratio = Math.max(0f, Math.min(1f, (float) current / base)); + float ratio = Math.max( + 0f, + Math.min(1f, (float) current / base) + ); int barX = getX() + width - RESISTANCE_BAR_WIDTH - PADDING; - int barY = getY() + height - RESISTANCE_BAR_HEIGHT - PADDING; + int barY = + getY() + height - RESISTANCE_BAR_HEIGHT - PADDING; // Sunken bar background - graphics.fill(barX, barY, barX + RESISTANCE_BAR_WIDTH, barY + RESISTANCE_BAR_HEIGHT, 0xFF373737); + graphics.fill( + barX, + barY, + barX + RESISTANCE_BAR_WIDTH, + barY + RESISTANCE_BAR_HEIGHT, + 0xFF373737 + ); // Colored fill: red below 30%, green otherwise int fillColor = (ratio < 0.30f) ? 0xFFFF4444 : 0xFF44CC44; int fillWidth = Math.round(RESISTANCE_BAR_WIDTH * ratio); if (fillWidth > 0) { - graphics.fill(barX, barY, barX + fillWidth, barY + RESISTANCE_BAR_HEIGHT, fillColor); + graphics.fill( + barX, + barY, + barX + fillWidth, + barY + RESISTANCE_BAR_HEIGHT, + fillColor + ); } } } @@ -350,8 +388,18 @@ public class RegionSlotWidget extends AbstractWidget { if (!hasItem && showEquipButton) { int bx = getEquipButtonX(); int by = getEquipButtonY(); - GuiRenderUtil.drawMCButton(graphics, bx, by, EQUIP_BUTTON_WIDTH, EQUIP_BUTTON_HEIGHT, equipHovered, true); - String equipLabel = Component.translatable("gui.tiedup.equip").getString(); + GuiRenderUtil.drawMCButton( + graphics, + bx, + by, + EQUIP_BUTTON_WIDTH, + EQUIP_BUTTON_HEIGHT, + equipHovered, + true + ); + String equipLabel = Component.translatable( + "gui.tiedup.equip" + ).getString(); GuiRenderUtil.drawCenteredStringNoShadow( graphics, mc.font, @@ -366,7 +414,15 @@ public class RegionSlotWidget extends AbstractWidget { if (showAdjustButton && hasItem) { int buttonX = getAdjustButtonX(); int buttonY = getY() + (height - ADJUST_BUTTON_SIZE) / 2; - GuiRenderUtil.drawMCButton(graphics, buttonX, buttonY, ADJUST_BUTTON_SIZE, ADJUST_BUTTON_SIZE, adjustHovered, true); + GuiRenderUtil.drawMCButton( + graphics, + buttonX, + buttonY, + ADJUST_BUTTON_SIZE, + ADJUST_BUTTON_SIZE, + adjustHovered, + true + ); // Gear icon placeholder GuiRenderUtil.drawCenteredStringNoShadow( @@ -383,10 +439,23 @@ public class RegionSlotWidget extends AbstractWidget { if (showRemoveButton && hasItem) { int buttonX = getRemoveButtonX(); int buttonY = getY() + (height - REMOVE_BUTTON_SIZE) / 2; - GuiRenderUtil.drawMCButton(graphics, buttonX, buttonY, REMOVE_BUTTON_SIZE, REMOVE_BUTTON_SIZE, removeHovered, true); + GuiRenderUtil.drawMCButton( + graphics, + buttonX, + buttonY, + REMOVE_BUTTON_SIZE, + REMOVE_BUTTON_SIZE, + removeHovered, + true + ); // Red-tinted overlay - graphics.fill(buttonX + 1, buttonY + 1, buttonX + REMOVE_BUTTON_SIZE - 1, buttonY + REMOVE_BUTTON_SIZE - 1, - removeHovered ? 0x40FF0000 : 0x20FF0000); + graphics.fill( + buttonX + 1, + buttonY + 1, + buttonX + REMOVE_BUTTON_SIZE - 1, + buttonY + REMOVE_BUTTON_SIZE - 1, + removeHovered ? 0x40FF0000 : 0x20FF0000 + ); // X icon GuiRenderUtil.drawCenteredStringNoShadow( diff --git a/src/main/java/com/tiedup/remake/client/gui/widgets/RegionTabBar.java b/src/main/java/com/tiedup/remake/client/gui/widgets/RegionTabBar.java index 875b78d..4da5b23 100644 --- a/src/main/java/com/tiedup/remake/client/gui/widgets/RegionTabBar.java +++ b/src/main/java/com/tiedup/remake/client/gui/widgets/RegionTabBar.java @@ -26,11 +26,31 @@ public class RegionTabBar extends AbstractWidget { * Body zone tabs grouping the 14 BodyRegionV2 values. */ public enum BodyTab { - HEAD("gui.tiedup.tab.head", BodyRegionV2.HEAD, BodyRegionV2.EYES, BodyRegionV2.EARS, BodyRegionV2.MOUTH), + HEAD( + "gui.tiedup.tab.head", + BodyRegionV2.HEAD, + BodyRegionV2.EYES, + BodyRegionV2.EARS, + BodyRegionV2.MOUTH + ), UPPER("gui.tiedup.tab.upper", BodyRegionV2.NECK, BodyRegionV2.TORSO), - ARMS("gui.tiedup.tab.arms", BodyRegionV2.ARMS, BodyRegionV2.HANDS, BodyRegionV2.FINGERS), - LOWER("gui.tiedup.tab.lower", BodyRegionV2.WAIST, BodyRegionV2.LEGS, BodyRegionV2.FEET), - SPECIAL("gui.tiedup.tab.special", BodyRegionV2.TAIL, BodyRegionV2.WINGS); + ARMS( + "gui.tiedup.tab.arms", + BodyRegionV2.ARMS, + BodyRegionV2.HANDS, + BodyRegionV2.FINGERS + ), + LOWER( + "gui.tiedup.tab.lower", + BodyRegionV2.WAIST, + BodyRegionV2.LEGS, + BodyRegionV2.FEET + ), + SPECIAL( + "gui.tiedup.tab.special", + BodyRegionV2.TAIL, + BodyRegionV2.WINGS + ); private final String translationKey; private final Set regions; @@ -41,13 +61,20 @@ public class RegionTabBar extends AbstractWidget { for (BodyRegionV2 r : regions) this.regions.add(r); } - public String getTranslationKey() { return translationKey; } - public Set getRegions() { return regions; } + public String getTranslationKey() { + return translationKey; + } + + public Set getRegions() { + return regions; + } /** Check if any region in this tab has an equipped item on the entity. */ public boolean hasEquippedItems(LivingEntity entity) { for (BodyRegionV2 region : regions) { - if (V2EquipmentHelper.isRegionOccupied(entity, region)) return true; + if ( + V2EquipmentHelper.isRegionOccupied(entity, region) + ) return true; } return false; } @@ -59,10 +86,10 @@ public class RegionTabBar extends AbstractWidget { private static final int DOT_RADIUS = 3; // Colors (vanilla MC style) - private static final int BG_ACTIVE = 0xFFC6C6C6; // Same as main panel - private static final int BG_INACTIVE = 0xFF8B8B8B; // Darker, slot-like - private static final int BG_HOVER = 0xFFA0A0A0; // Between active and inactive - private static final int TEXT_ACTIVE = 0xFF404040; // Dark text + private static final int BG_ACTIVE = 0xFFC6C6C6; // Same as main panel + private static final int BG_INACTIVE = 0xFF8B8B8B; // Darker, slot-like + private static final int BG_HOVER = 0xFFA0A0A0; // Between active and inactive + private static final int TEXT_ACTIVE = 0xFF404040; // Dark text private static final int TEXT_INACTIVE = 0xFF555555; // Gray text private static final int BAR_BG = 0xFFA0A0A0; @@ -74,9 +101,17 @@ public class RegionTabBar extends AbstractWidget { super(x, y, width, TAB_HEIGHT, Component.literal("Tab Bar")); } - public void setOnTabChanged(Consumer callback) { this.onTabChanged = callback; } - public void setTargetEntity(LivingEntity entity) { this.targetEntity = entity; } - public BodyTab getActiveTab() { return activeTab; } + public void setOnTabChanged(Consumer callback) { + this.onTabChanged = callback; + } + + public void setTargetEntity(LivingEntity entity) { + this.targetEntity = entity; + } + + public BodyTab getActiveTab() { + return activeTab; + } public void setActiveTab(BodyTab tab) { if (this.activeTab != tab) { @@ -86,7 +121,12 @@ public class RegionTabBar extends AbstractWidget { } @Override - protected void renderWidget(GuiGraphics graphics, int mouseX, int mouseY, float partialTick) { + protected void renderWidget( + GuiGraphics graphics, + int mouseX, + int mouseY, + float partialTick + ) { Minecraft mc = Minecraft.getInstance(); // Background bar @@ -99,34 +139,89 @@ public class RegionTabBar extends AbstractWidget { BodyTab tab = tabs[i]; int tabX = getX() + i * (tabWidth + TAB_SPACING); boolean isActive = (tab == activeTab); - boolean isHovered = mouseX >= tabX && mouseX < tabX + tabWidth - && mouseY >= getY() && mouseY < getY() + height; + boolean isHovered = + mouseX >= tabX && + mouseX < tabX + tabWidth && + mouseY >= getY() && + mouseY < getY() + height; - int bgColor = isActive ? BG_ACTIVE : (isHovered ? BG_HOVER : BG_INACTIVE); - graphics.fill(tabX, getY(), tabX + tabWidth, getY() + height, bgColor); + int bgColor = isActive + ? BG_ACTIVE + : (isHovered ? BG_HOVER : BG_INACTIVE); + graphics.fill( + tabX, + getY(), + tabX + tabWidth, + getY() + height, + bgColor + ); if (isActive) { // Active tab: raised 3D look, no bottom border (connects to panel below) // Top highlight - graphics.fill(tabX, getY(), tabX + tabWidth, getY() + 1, GuiRenderUtil.MC_HIGHLIGHT_OUTER); + graphics.fill( + tabX, + getY(), + tabX + tabWidth, + getY() + 1, + GuiRenderUtil.MC_HIGHLIGHT_OUTER + ); // Left highlight - graphics.fill(tabX, getY(), tabX + 1, getY() + height, GuiRenderUtil.MC_HIGHLIGHT_OUTER); + graphics.fill( + tabX, + getY(), + tabX + 1, + getY() + height, + GuiRenderUtil.MC_HIGHLIGHT_OUTER + ); // Right shadow - graphics.fill(tabX + tabWidth - 1, getY(), tabX + tabWidth, getY() + height, GuiRenderUtil.MC_SHADOW_OUTER); + graphics.fill( + tabX + tabWidth - 1, + getY(), + tabX + tabWidth, + getY() + height, + GuiRenderUtil.MC_SHADOW_OUTER + ); } else { // Inactive tab: full 3D sunken borders // Top shadow - graphics.fill(tabX, getY(), tabX + tabWidth, getY() + 1, GuiRenderUtil.MC_SHADOW_OUTER); + graphics.fill( + tabX, + getY(), + tabX + tabWidth, + getY() + 1, + GuiRenderUtil.MC_SHADOW_OUTER + ); // Left shadow - graphics.fill(tabX, getY(), tabX + 1, getY() + height, GuiRenderUtil.MC_SHADOW_OUTER); + graphics.fill( + tabX, + getY(), + tabX + 1, + getY() + height, + GuiRenderUtil.MC_SHADOW_OUTER + ); // Bottom highlight - graphics.fill(tabX, getY() + height - 1, tabX + tabWidth, getY() + height, GuiRenderUtil.MC_HIGHLIGHT_OUTER); + graphics.fill( + tabX, + getY() + height - 1, + tabX + tabWidth, + getY() + height, + GuiRenderUtil.MC_HIGHLIGHT_OUTER + ); // Right highlight - graphics.fill(tabX + tabWidth - 1, getY(), tabX + tabWidth, getY() + height, GuiRenderUtil.MC_HIGHLIGHT_OUTER); + graphics.fill( + tabX + tabWidth - 1, + getY(), + tabX + tabWidth, + getY() + height, + GuiRenderUtil.MC_HIGHLIGHT_OUTER + ); } // Tab label - String label = Component.translatable(tab.getTranslationKey()).getString(); + String label = Component.translatable( + tab.getTranslationKey() + ).getString(); int textColor = isActive ? TEXT_ACTIVE : TEXT_INACTIVE; int textX = tabX + (tabWidth - mc.font.width(label)) / 2; int textY = getY() + (height - mc.font.lineHeight) / 2; @@ -136,8 +231,13 @@ public class RegionTabBar extends AbstractWidget { if (targetEntity != null && tab.hasEquippedItems(targetEntity)) { int dotX = tabX + tabWidth - DOT_RADIUS - 4; int dotY = getY() + 4; - graphics.fill(dotX - DOT_RADIUS, dotY - DOT_RADIUS, - dotX + DOT_RADIUS, dotY + DOT_RADIUS, 0xFFCCCCCC); + graphics.fill( + dotX - DOT_RADIUS, + dotY - DOT_RADIUS, + dotX + DOT_RADIUS, + dotY + DOT_RADIUS, + 0xFFCCCCCC + ); } } } @@ -162,8 +262,12 @@ public class RegionTabBar extends AbstractWidget { @Override protected void updateWidgetNarration(NarrationElementOutput output) { - output.add(NarratedElementType.TITLE, - Component.translatable("gui.tiedup.tab_bar", - Component.translatable(activeTab.getTranslationKey()))); + output.add( + NarratedElementType.TITLE, + Component.translatable( + "gui.tiedup.tab_bar", + Component.translatable(activeTab.getTranslationKey()) + ) + ); } } diff --git a/src/main/java/com/tiedup/remake/client/gui/widgets/SlaveEntryWidget.java b/src/main/java/com/tiedup/remake/client/gui/widgets/SlaveEntryWidget.java index 634403c..86c610c 100644 --- a/src/main/java/com/tiedup/remake/client/gui/widgets/SlaveEntryWidget.java +++ b/src/main/java/com/tiedup/remake/client/gui/widgets/SlaveEntryWidget.java @@ -1,13 +1,13 @@ package com.tiedup.remake.client.gui.widgets; import static com.tiedup.remake.client.gui.util.GuiLayoutConstants.*; -import com.tiedup.remake.v2.BodyRegionV2; import com.google.common.collect.ImmutableList; import com.tiedup.remake.client.gui.util.GuiColors; import com.tiedup.remake.items.ItemGpsCollar; import com.tiedup.remake.items.base.ItemCollar; import com.tiedup.remake.state.IBondageState; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; diff --git a/src/main/java/com/tiedup/remake/client/gui/widgets/StatusBarWidget.java b/src/main/java/com/tiedup/remake/client/gui/widgets/StatusBarWidget.java index 50dbd24..2804f46 100644 --- a/src/main/java/com/tiedup/remake/client/gui/widgets/StatusBarWidget.java +++ b/src/main/java/com/tiedup/remake/client/gui/widgets/StatusBarWidget.java @@ -43,18 +43,37 @@ public class StatusBarWidget extends AbstractWidget { super(x, y, width, height, Component.literal("Status Bar")); } - public void setMode(ActionPanel.ScreenMode mode) { this.mode = mode; } - public void setTargetEntity(LivingEntity entity) { this.targetEntity = entity; } - public void setOnCloseClicked(Runnable cb) { this.onCloseClicked = cb; } + public void setMode(ActionPanel.ScreenMode mode) { + this.mode = mode; + } + + public void setTargetEntity(LivingEntity entity) { + this.targetEntity = entity; + } + + public void setOnCloseClicked(Runnable cb) { + this.onCloseClicked = cb; + } @Override - protected void renderWidget(GuiGraphics graphics, int mouseX, int mouseY, float partialTick) { + protected void renderWidget( + GuiGraphics graphics, + int mouseX, + int mouseY, + float partialTick + ) { Minecraft mc = Minecraft.getInstance(); Player player = mc.player; if (player == null) return; // MC-style sunken inset panel (slightly darker than main) - GuiRenderUtil.drawMCSunkenPanel(graphics, getX(), getY(), width, height); + GuiRenderUtil.drawMCSunkenPanel( + graphics, + getX(), + getY(), + width, + height + ); int textY1 = getY() + PADDING; int textY2 = textY1 + mc.font.lineHeight + 2; @@ -68,46 +87,104 @@ public class StatusBarWidget extends AbstractWidget { // Close button (right side, MC-style button) int closeBtnX = getX() + width - CLOSE_BTN_WIDTH - PADDING; int closeBtnY = getY() + (height - CLOSE_BTN_HEIGHT) / 2; - boolean closeHovered = mouseX >= closeBtnX && mouseX < closeBtnX + CLOSE_BTN_WIDTH - && mouseY >= closeBtnY && mouseY < closeBtnY + CLOSE_BTN_HEIGHT; - GuiRenderUtil.drawMCButton(graphics, closeBtnX, closeBtnY, CLOSE_BTN_WIDTH, CLOSE_BTN_HEIGHT, closeHovered, true); - String closeText = Component.translatable("gui.tiedup.close_esc").getString(); - GuiRenderUtil.drawCenteredStringNoShadow(graphics, mc.font, closeText, - closeBtnX + CLOSE_BTN_WIDTH / 2, closeBtnY + (CLOSE_BTN_HEIGHT - mc.font.lineHeight) / 2, - GuiRenderUtil.MC_TEXT_DARK); + boolean closeHovered = + mouseX >= closeBtnX && + mouseX < closeBtnX + CLOSE_BTN_WIDTH && + mouseY >= closeBtnY && + mouseY < closeBtnY + CLOSE_BTN_HEIGHT; + GuiRenderUtil.drawMCButton( + graphics, + closeBtnX, + closeBtnY, + CLOSE_BTN_WIDTH, + CLOSE_BTN_HEIGHT, + closeHovered, + true + ); + String closeText = Component.translatable( + "gui.tiedup.close_esc" + ).getString(); + GuiRenderUtil.drawCenteredStringNoShadow( + graphics, + mc.font, + closeText, + closeBtnX + CLOSE_BTN_WIDTH / 2, + closeBtnY + (CLOSE_BTN_HEIGHT - mc.font.lineHeight) / 2, + GuiRenderUtil.MC_TEXT_DARK + ); } - private void renderSelfStatus(GuiGraphics graphics, Player player, int y1, int y2) { + private void renderSelfStatus( + GuiGraphics graphics, + Player player, + int y1, + int y2 + ) { Minecraft mc = Minecraft.getInstance(); int x = getX() + PADDING; // Tool status line 1 ItemStack lockpick = ItemLockpick.findLockpickInInventory(player); String pickText = lockpick.isEmpty() - ? Component.translatable("gui.tiedup.status.no_lockpick").getString() - : Component.translatable("gui.tiedup.status.lockpick_uses", - lockpick.getMaxDamage() - lockpick.getDamageValue()).getString(); - graphics.drawString(mc.font, pickText, x, y1, GuiRenderUtil.MC_TEXT_DARK, false); + ? Component.translatable( + "gui.tiedup.status.no_lockpick" + ).getString() + : Component.translatable( + "gui.tiedup.status.lockpick_uses", + lockpick.getMaxDamage() - lockpick.getDamageValue() + ).getString(); + graphics.drawString( + mc.font, + pickText, + x, + y1, + GuiRenderUtil.MC_TEXT_DARK, + false + ); ItemStack knife = GenericKnife.findKnifeInInventory(player); String knifeText = knife.isEmpty() ? Component.translatable("gui.tiedup.status.no_knife").getString() - : Component.translatable("gui.tiedup.status.knife_uses", - knife.getMaxDamage() - knife.getDamageValue()).getString(); - graphics.drawString(mc.font, knifeText, x + 150, y1, GuiRenderUtil.MC_TEXT_DARK, false); + : Component.translatable( + "gui.tiedup.status.knife_uses", + knife.getMaxDamage() - knife.getDamageValue() + ).getString(); + graphics.drawString( + mc.font, + knifeText, + x + 150, + y1, + GuiRenderUtil.MC_TEXT_DARK, + false + ); // Arms resistance line 2 - ItemStack armsBind = V2EquipmentHelper.getInRegion(player, BodyRegionV2.ARMS); - if (!armsBind.isEmpty() && armsBind.getItem() instanceof IHasResistance res) { + ItemStack armsBind = V2EquipmentHelper.getInRegion( + player, + BodyRegionV2.ARMS + ); + if ( + !armsBind.isEmpty() && + armsBind.getItem() instanceof IHasResistance res + ) { int curr = res.getCurrentResistance(armsBind, player); int max = res.getBaseResistance(player); - String resText = Component.translatable("gui.tiedup.status.arms_resistance", curr, max).getString(); + String resText = Component.translatable( + "gui.tiedup.status.arms_resistance", + curr, + max + ).getString(); int color = curr < max * 0.3 ? GuiColors.ERROR : GuiColors.SUCCESS; graphics.drawString(mc.font, resText, x, y2, color, false); } } - private void renderMasterStatus(GuiGraphics graphics, Player player, int y1, int y2) { + private void renderMasterStatus( + GuiGraphics graphics, + Player player, + int y1, + int y2 + ) { Minecraft mc = Minecraft.getInstance(); int x = getX() + PADDING; @@ -127,18 +204,38 @@ public class StatusBarWidget extends AbstractWidget { String keyText; if (keyStack.isEmpty()) { - keyText = Component.translatable("gui.tiedup.status.no_key").getString(); + keyText = Component.translatable( + "gui.tiedup.status.no_key" + ).getString(); } else { - keyText = Component.translatable("gui.tiedup.status.key_info", - keyStack.getHoverName().getString()).getString(); + keyText = Component.translatable( + "gui.tiedup.status.key_info", + keyStack.getHoverName().getString() + ).getString(); } - graphics.drawString(mc.font, keyText, x, y1, GuiRenderUtil.MC_TEXT_DARK, false); + graphics.drawString( + mc.font, + keyText, + x, + y1, + GuiRenderUtil.MC_TEXT_DARK, + false + ); // Target info if (targetEntity != null) { - String targetText = Component.translatable("gui.tiedup.status.target_info", - targetEntity.getName().getString()).getString(); - graphics.drawString(mc.font, targetText, x, y2, GuiRenderUtil.MC_TEXT_DARK, false); + String targetText = Component.translatable( + "gui.tiedup.status.target_info", + targetEntity.getName().getString() + ).getString(); + graphics.drawString( + mc.font, + targetText, + x, + y2, + GuiRenderUtil.MC_TEXT_DARK, + false + ); } } @@ -148,8 +245,12 @@ public class StatusBarWidget extends AbstractWidget { int closeBtnX = getX() + width - CLOSE_BTN_WIDTH - PADDING; int closeBtnY = getY() + (height - CLOSE_BTN_HEIGHT) / 2; - if (mouseX >= closeBtnX && mouseX < closeBtnX + CLOSE_BTN_WIDTH - && mouseY >= closeBtnY && mouseY < closeBtnY + CLOSE_BTN_HEIGHT) { + if ( + mouseX >= closeBtnX && + mouseX < closeBtnX + CLOSE_BTN_WIDTH && + mouseY >= closeBtnY && + mouseY < closeBtnY + CLOSE_BTN_HEIGHT + ) { if (onCloseClicked != null) onCloseClicked.run(); playDownSound(Minecraft.getInstance().getSoundManager()); return true; @@ -159,6 +260,9 @@ public class StatusBarWidget extends AbstractWidget { @Override protected void updateWidgetNarration(NarrationElementOutput output) { - output.add(NarratedElementType.TITLE, Component.translatable("gui.tiedup.status_bar")); + output.add( + NarratedElementType.TITLE, + Component.translatable("gui.tiedup.status_bar") + ); } } diff --git a/src/main/java/com/tiedup/remake/client/model/DamselModel.java b/src/main/java/com/tiedup/remake/client/model/DamselModel.java index 19e81c0..9668e95 100644 --- a/src/main/java/com/tiedup/remake/client/model/DamselModel.java +++ b/src/main/java/com/tiedup/remake/client/model/DamselModel.java @@ -9,11 +9,11 @@ import com.tiedup.remake.entities.AbstractTiedUpNpc; import com.tiedup.remake.entities.EntityKidnapperArcher; import com.tiedup.remake.entities.EntityMaster; import com.tiedup.remake.entities.ai.master.MasterState; -import com.tiedup.remake.v2.BodyRegionV2; -import com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper; import com.tiedup.remake.items.base.ItemBind; import com.tiedup.remake.items.base.PoseType; import com.tiedup.remake.items.clothes.GenericClothes; +import com.tiedup.remake.v2.BodyRegionV2; +import com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper; import dev.kosmx.playerAnim.core.impl.AnimationProcessor; import dev.kosmx.playerAnim.core.util.SetableSupplier; import dev.kosmx.playerAnim.impl.Helper; @@ -33,8 +33,6 @@ import org.slf4j.Logger; /** * Model for AbstractTiedUpNpc - Humanoid female NPC. * - * Phase 14.2.3: Rendering system - * Phase 19: Extends PlayerModel for full layer support (hat, jacket, sleeves, pants) * * Features: * - Extends PlayerModel for player-like rendering with outer layers @@ -151,9 +149,7 @@ public class DamselModel } } - // ======================================== // IMutableModel Implementation - // ======================================== @Override public void setEmoteSupplier(SetableSupplier supplier) { @@ -174,8 +170,6 @@ public class DamselModel * - Tied up: Arms behind back, legs frozen (or variant pose based on bind type) * - Free: Normal humanoid animations * - * Phase 15: Different poses for different bind types (straitjacket, wrap, latex_sack) - * Phase 15.1: Hide arms for wrap/latex_sack (matching original mod) * * @param entity AbstractTiedUpNpc instance * @param limbSwing Limb swing animation value @@ -193,7 +187,6 @@ public class DamselModel float netHeadYaw, float headPitch ) { - // Phase 18: Handle archer arm poses BEFORE super call // Only show bow animation when in ranged mode (has active shooting target) if (entity instanceof EntityKidnapperArcher archer) { if (archer.isInRangedMode()) { @@ -222,7 +215,7 @@ public class DamselModel // Arms this.leftArm.visible = true; this.rightArm.visible = true; - // Outer layers (Phase 19) + // Outer layers this.hat.visible = true; this.jacket.visible = true; this.leftSleeve.visible = true; @@ -302,7 +295,7 @@ public class DamselModel ); } - // Sync outer layers to their parents (Phase 19) + // Sync outer layers to their parents this.hat.copyFrom(this.head); this.jacket.copyFrom(this.body); this.leftSleeve.copyFrom(this.leftArm); @@ -320,10 +313,18 @@ public class DamselModel } // Derive bound state from V2 regions (AbstractTiedUpNpc implements IV2EquipmentHolder) - boolean armsBound = V2EquipmentHelper.isRegionOccupied(entity, BodyRegionV2.ARMS); - boolean legsBound = V2EquipmentHelper.isRegionOccupied(entity, BodyRegionV2.LEGS); + boolean armsBound = V2EquipmentHelper.isRegionOccupied( + entity, + BodyRegionV2.ARMS + ); + boolean legsBound = V2EquipmentHelper.isRegionOccupied( + entity, + BodyRegionV2.LEGS + ); - if (!armsBound && !legsBound && bind.getItem() instanceof ItemBind) { + if ( + !armsBound && !legsBound && bind.getItem() instanceof ItemBind + ) { armsBound = ItemBind.hasArmsBound(bind); legsBound = ItemBind.hasLegsBound(bind); } @@ -374,7 +375,6 @@ public class DamselModel this.rightPants.copyFrom(this.rightLeg); } - // Phase 19: Hide wearer's outer layers based on clothes settings // This MUST happen after super.setupAnim() which can reset visibility hideWearerLayersForClothes(entity); } diff --git a/src/main/java/com/tiedup/remake/client/renderer/DamselRenderer.java b/src/main/java/com/tiedup/remake/client/renderer/DamselRenderer.java index 8b4577a..ff34b73 100644 --- a/src/main/java/com/tiedup/remake/client/renderer/DamselRenderer.java +++ b/src/main/java/com/tiedup/remake/client/renderer/DamselRenderer.java @@ -44,7 +44,6 @@ public class DamselRenderer /** * Create renderer. * - * Phase 19: Uses vanilla ModelLayers.PLAYER for full layer support (jacket, sleeves, pants). */ public DamselRenderer(EntityRendererProvider.Context context) { super( @@ -86,14 +85,15 @@ public class DamselRenderer } // Add V2 bondage render layer (GLB-based V2 equipment rendering) - this.addLayer(new com.tiedup.remake.v2.bondage.client.V2BondageRenderLayer<>(this)); + this.addLayer( + new com.tiedup.remake.v2.bondage.client.V2BondageRenderLayer<>(this) + ); } /** * Render the entity. * Uses entity's hasSlimArms() for model selection. * - * Phase 19: Wearer layer hiding is now handled in DamselModel.setupAnim() * to ensure it happens after visibility resets. * * DOG pose: X rotation is applied in setupRotations() AFTER Y rotation, diff --git a/src/main/java/com/tiedup/remake/client/renderer/KidnapBombRenderer.java b/src/main/java/com/tiedup/remake/client/renderer/KidnapBombRenderer.java index e03fa5d..8ee8aef 100644 --- a/src/main/java/com/tiedup/remake/client/renderer/KidnapBombRenderer.java +++ b/src/main/java/com/tiedup/remake/client/renderer/KidnapBombRenderer.java @@ -16,7 +16,6 @@ import net.minecraft.util.Mth; /** * Renderer for EntityKidnapBomb. * - * Phase 16: Blocks * * Renders the primed kidnap bomb using our custom block texture. */ diff --git a/src/main/java/com/tiedup/remake/client/renderer/RopeArrowRenderer.java b/src/main/java/com/tiedup/remake/client/renderer/RopeArrowRenderer.java index 9718eb1..7244f27 100644 --- a/src/main/java/com/tiedup/remake/client/renderer/RopeArrowRenderer.java +++ b/src/main/java/com/tiedup/remake/client/renderer/RopeArrowRenderer.java @@ -9,7 +9,6 @@ import net.minecraftforge.api.distmarker.OnlyIn; /** * Renderer for EntityRopeArrow. - * Phase 15: Uses vanilla arrow texture for simplicity. */ @OnlyIn(Dist.CLIENT) public class RopeArrowRenderer extends ArrowRenderer { diff --git a/src/main/java/com/tiedup/remake/client/renderer/layers/ClothesRenderHelper.java b/src/main/java/com/tiedup/remake/client/renderer/layers/ClothesRenderHelper.java index 42309c2..7d1566a 100644 --- a/src/main/java/com/tiedup/remake/client/renderer/layers/ClothesRenderHelper.java +++ b/src/main/java/com/tiedup/remake/client/renderer/layers/ClothesRenderHelper.java @@ -8,7 +8,6 @@ import com.tiedup.remake.items.clothes.ClothesProperties; import com.tiedup.remake.items.clothes.GenericClothes; import java.util.EnumSet; import java.util.UUID; -import org.jetbrains.annotations.Nullable; import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.model.PlayerModel; import net.minecraft.client.player.AbstractClientPlayer; @@ -19,6 +18,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import org.jetbrains.annotations.Nullable; /** * Helper class for rendering clothes with dynamic textures. diff --git a/src/main/java/com/tiedup/remake/client/state/ClothesClientCache.java b/src/main/java/com/tiedup/remake/client/state/ClothesClientCache.java index c169c38..d62c8d1 100644 --- a/src/main/java/com/tiedup/remake/client/state/ClothesClientCache.java +++ b/src/main/java/com/tiedup/remake/client/state/ClothesClientCache.java @@ -5,9 +5,9 @@ import java.util.EnumSet; import java.util.Map; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; -import org.jetbrains.annotations.Nullable; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import org.jetbrains.annotations.Nullable; /** * Client-side cache for storing clothes configuration of remote players. diff --git a/src/main/java/com/tiedup/remake/client/state/CollarRegistryClient.java b/src/main/java/com/tiedup/remake/client/state/CollarRegistryClient.java index 37509bc..cd0d810 100644 --- a/src/main/java/com/tiedup/remake/client/state/CollarRegistryClient.java +++ b/src/main/java/com/tiedup/remake/client/state/CollarRegistryClient.java @@ -15,7 +15,6 @@ import net.minecraftforge.api.distmarker.OnlyIn; * * Used by SlaveManagementScreen to display owned slaves without spatial queries. * - * Phase 17: Terminology Refactoring - Global Collar Registry */ @OnlyIn(Dist.CLIENT) public class CollarRegistryClient { diff --git a/src/main/java/com/tiedup/remake/client/state/MovementStyleClientState.java b/src/main/java/com/tiedup/remake/client/state/MovementStyleClientState.java index b855af3..3d36fd8 100644 --- a/src/main/java/com/tiedup/remake/client/state/MovementStyleClientState.java +++ b/src/main/java/com/tiedup/remake/client/state/MovementStyleClientState.java @@ -21,7 +21,8 @@ import org.jetbrains.annotations.Nullable; @OnlyIn(Dist.CLIENT) public class MovementStyleClientState { - private static final Map styles = new ConcurrentHashMap<>(); + private static final Map styles = + new ConcurrentHashMap<>(); /** * Set the active movement style for a player. diff --git a/src/main/java/com/tiedup/remake/client/texture/DynamicOnlineTexture.java b/src/main/java/com/tiedup/remake/client/texture/DynamicOnlineTexture.java index 2aa9323..431bdd5 100644 --- a/src/main/java/com/tiedup/remake/client/texture/DynamicOnlineTexture.java +++ b/src/main/java/com/tiedup/remake/client/texture/DynamicOnlineTexture.java @@ -3,10 +3,10 @@ package com.tiedup.remake.client.texture; import com.mojang.blaze3d.platform.NativeImage; import com.mojang.blaze3d.systems.RenderSystem; import com.tiedup.remake.core.TiedUpMod; -import org.jetbrains.annotations.Nullable; import net.minecraft.client.renderer.texture.DynamicTexture; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import org.jetbrains.annotations.Nullable; /** * Handles a dynamically loaded online texture for clothes. diff --git a/src/main/java/com/tiedup/remake/client/texture/DynamicTextureManager.java b/src/main/java/com/tiedup/remake/client/texture/DynamicTextureManager.java index 1f2d2e2..9e3fcb5 100644 --- a/src/main/java/com/tiedup/remake/client/texture/DynamicTextureManager.java +++ b/src/main/java/com/tiedup/remake/client/texture/DynamicTextureManager.java @@ -16,12 +16,12 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; import java.util.concurrent.Executors; -import org.jetbrains.annotations.Nullable; import javax.imageio.ImageIO; import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import org.jetbrains.annotations.Nullable; /** * Manager for dynamically loaded online textures. diff --git a/src/main/java/com/tiedup/remake/commands/BountyCommand.java b/src/main/java/com/tiedup/remake/commands/BountyCommand.java index 53cd1f6..7a9dc66 100644 --- a/src/main/java/com/tiedup/remake/commands/BountyCommand.java +++ b/src/main/java/com/tiedup/remake/commands/BountyCommand.java @@ -5,10 +5,10 @@ import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.tiedup.remake.bounty.Bounty; import com.tiedup.remake.bounty.BountyManager; +import com.tiedup.remake.core.SettingsAccessor; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.state.IBondageState; import com.tiedup.remake.util.KidnappedHelper; -import com.tiedup.remake.core.SettingsAccessor; import java.util.Optional; import net.minecraft.ChatFormatting; import net.minecraft.commands.CommandSourceStack; @@ -21,7 +21,6 @@ import net.minecraft.world.item.ItemStack; /** * Command: /bounty * - * Phase 17: Bounty System * * Creates a bounty on a target player using the held item as reward. * diff --git a/src/main/java/com/tiedup/remake/commands/CollarCommand.java b/src/main/java/com/tiedup/remake/commands/CollarCommand.java index 3cd246f..fc26120 100644 --- a/src/main/java/com/tiedup/remake/commands/CollarCommand.java +++ b/src/main/java/com/tiedup/remake/commands/CollarCommand.java @@ -1,7 +1,6 @@ package com.tiedup.remake.commands; import com.mojang.brigadier.CommandDispatcher; -import com.tiedup.remake.v2.BodyRegionV2; import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.context.CommandContext; @@ -12,6 +11,7 @@ import com.tiedup.remake.items.base.ItemCollar; import com.tiedup.remake.state.PlayerBindState; import com.tiedup.remake.util.teleport.Position; import com.tiedup.remake.util.teleport.TeleportHelper; +import com.tiedup.remake.v2.BodyRegionV2; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.commands.arguments.EntityArgument; @@ -21,7 +21,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; /** - * Collar management commands for Phase 18. + * Collar management commands. * * Commands: * /collar claim - Claim ownership of a player's collar diff --git a/src/main/java/com/tiedup/remake/commands/CommandHelper.java b/src/main/java/com/tiedup/remake/commands/CommandHelper.java index e825d14..bf55d64 100644 --- a/src/main/java/com/tiedup/remake/commands/CommandHelper.java +++ b/src/main/java/com/tiedup/remake/commands/CommandHelper.java @@ -83,7 +83,9 @@ public final class CommandHelper { com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper.sync(player); // Sync bind state - PacketSyncBindState statePacket = PacketSyncBindState.fromPlayer(player); + PacketSyncBindState statePacket = PacketSyncBindState.fromPlayer( + player + ); if (statePacket != null) { ModNetwork.sendToPlayer(statePacket, player); } diff --git a/src/main/java/com/tiedup/remake/commands/KeyCommand.java b/src/main/java/com/tiedup/remake/commands/KeyCommand.java index 2100481..7b4988c 100644 --- a/src/main/java/com/tiedup/remake/commands/KeyCommand.java +++ b/src/main/java/com/tiedup/remake/commands/KeyCommand.java @@ -14,7 +14,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; /** - * Key management commands for Phase 18. + * Key management commands. * * Commands: * /key claim - Claim the key you're holding diff --git a/src/main/java/com/tiedup/remake/commands/KidnapSetCommand.java b/src/main/java/com/tiedup/remake/commands/KidnapSetCommand.java index f49a8b8..d555007 100644 --- a/src/main/java/com/tiedup/remake/commands/KidnapSetCommand.java +++ b/src/main/java/com/tiedup/remake/commands/KidnapSetCommand.java @@ -17,7 +17,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; /** - * Utility commands for Phase 18. + * Utility commands. * * Commands: * /kidnapset - Get a starter kit of mod items diff --git a/src/main/java/com/tiedup/remake/commands/NPCCommand.java b/src/main/java/com/tiedup/remake/commands/NPCCommand.java index 0ef417a..88d0251 100644 --- a/src/main/java/com/tiedup/remake/commands/NPCCommand.java +++ b/src/main/java/com/tiedup/remake/commands/NPCCommand.java @@ -1,7 +1,6 @@ package com.tiedup.remake.commands; import com.mojang.brigadier.CommandDispatcher; -import com.tiedup.remake.v2.BodyRegionV2; import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; @@ -13,6 +12,7 @@ import com.tiedup.remake.items.base.BlindfoldVariant; import com.tiedup.remake.items.base.EarplugsVariant; import com.tiedup.remake.items.base.GagVariant; import com.tiedup.remake.state.IBondageState; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.List; import java.util.Optional; import net.minecraft.commands.CommandSourceStack; @@ -27,7 +27,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.AABB; /** - * NPC management commands for Phase 18. + * NPC management commands. * * Commands: * /npc spawn kidnapper [player] - Spawn a kidnapper at location @@ -432,8 +432,7 @@ public class NPCCommand { var entities = level.getEntitiesOfClass( net.minecraft.world.entity.LivingEntity.class, player.getBoundingBox().inflate(radius), - e -> - e instanceof com.tiedup.remake.entities.AbstractTiedUpNpc + e -> e instanceof com.tiedup.remake.entities.AbstractTiedUpNpc ); for (var entity : entities) { @@ -457,9 +456,7 @@ public class NPCCommand { return String.format("(%.1f, %.1f, %.1f)", x, y, z); } - // ======================================== // NPC Bondage Commands (from DamselTestCommand) - // ======================================== /** * Find the nearest mod NPC (Damsel or Kidnapper) within 10 blocks. @@ -508,7 +505,10 @@ public class NPCCommand { return 0; } - npc.equip(BodyRegionV2.ARMS, new ItemStack(ModItems.getBind(BindVariant.ROPES))); + npc.equip( + BodyRegionV2.ARMS, + new ItemStack(ModItems.getBind(BindVariant.ROPES)) + ); context .getSource() .sendSuccess( @@ -536,7 +536,10 @@ public class NPCCommand { return 0; } - npc.equip(BodyRegionV2.MOUTH, new ItemStack(ModItems.getGag(GagVariant.CLOTH_GAG))); + npc.equip( + BodyRegionV2.MOUTH, + new ItemStack(ModItems.getGag(GagVariant.CLOTH_GAG)) + ); context .getSource() .sendSuccess( @@ -566,7 +569,8 @@ public class NPCCommand { return 0; } - npc.equip(BodyRegionV2.EYES, + npc.equip( + BodyRegionV2.EYES, new ItemStack(ModItems.getBlindfold(BlindfoldVariant.CLASSIC)) ); context @@ -599,7 +603,10 @@ public class NPCCommand { return 0; } - npc.equip(BodyRegionV2.NECK, new ItemStack(ModItems.CLASSIC_COLLAR.get())); + npc.equip( + BodyRegionV2.NECK, + new ItemStack(ModItems.CLASSIC_COLLAR.get()) + ); context .getSource() .sendSuccess( @@ -644,7 +651,10 @@ public class NPCCommand { } // Apply full bondage using AbstractTiedUpNpc method - if (npc instanceof com.tiedup.remake.entities.AbstractTiedUpNpc npcEntity) { + if ( + npc instanceof + com.tiedup.remake.entities.AbstractTiedUpNpc npcEntity + ) { npcEntity.applyBondage( new ItemStack(ModItems.getBind(BindVariant.ROPES)), new ItemStack(ModItems.getGag(GagVariant.CLOTH_GAG)), diff --git a/src/main/java/com/tiedup/remake/commands/SocialCommand.java b/src/main/java/com/tiedup/remake/commands/SocialCommand.java index cbb072c..0dabe6c 100644 --- a/src/main/java/com/tiedup/remake/commands/SocialCommand.java +++ b/src/main/java/com/tiedup/remake/commands/SocialCommand.java @@ -20,7 +20,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.phys.AABB; /** - * Social and RP commands for Phase 18. + * Social and RP commands. * * Commands: * /blockplayer - Block a player from interacting with you @@ -147,9 +147,7 @@ public class SocialCommand { return Commands.literal("talkinfo").executes(SocialCommand::talkInfo); } - // ======================================== // Block System - // ======================================== private static int blockPlayer(CommandContext context) throws CommandSyntaxException { @@ -284,9 +282,7 @@ public class SocialCommand { return SocialData.get(level).isBlocked(blocker, blocked); } - // ======================================== // RP Commands - // ======================================== private static int noRP(CommandContext context) throws CommandSyntaxException { @@ -443,9 +439,7 @@ public class SocialCommand { return 1; } - // ======================================== // Talk Area - // ======================================== private static int setTalkArea( CommandContext context, diff --git a/src/main/java/com/tiedup/remake/commands/subcommands/BondageSubCommand.java b/src/main/java/com/tiedup/remake/commands/subcommands/BondageSubCommand.java index 3f3f8ce..96f85a6 100644 --- a/src/main/java/com/tiedup/remake/commands/subcommands/BondageSubCommand.java +++ b/src/main/java/com/tiedup/remake/commands/subcommands/BondageSubCommand.java @@ -9,8 +9,8 @@ import com.tiedup.remake.commands.CommandHelper; import com.tiedup.remake.core.SystemMessageManager; import com.tiedup.remake.items.ModItems; import com.tiedup.remake.items.base.AdjustmentHelper; -import com.tiedup.remake.items.base.BlindfoldVariant; import com.tiedup.remake.items.base.BindVariant; +import com.tiedup.remake.items.base.BlindfoldVariant; import com.tiedup.remake.items.base.EarplugsVariant; import com.tiedup.remake.items.base.GagVariant; import com.tiedup.remake.items.base.ItemCollar; @@ -32,14 +32,18 @@ import net.minecraft.world.item.ItemStack; @SuppressWarnings("null") public class BondageSubCommand { - public static void register(LiteralArgumentBuilder root) { + public static void register( + LiteralArgumentBuilder root + ) { // /tiedup tie root.then( Commands.literal("tie") .requires(CommandHelper.REQUIRES_OP) .then( - Commands.argument("player", EntityArgument.player()) - .executes(BondageSubCommand::tie) + Commands.argument( + "player", + EntityArgument.player() + ).executes(BondageSubCommand::tie) ) ); // /tiedup untie @@ -47,8 +51,10 @@ public class BondageSubCommand { Commands.literal("untie") .requires(CommandHelper.REQUIRES_OP) .then( - Commands.argument("player", EntityArgument.player()) - .executes(BondageSubCommand::untie) + Commands.argument( + "player", + EntityArgument.player() + ).executes(BondageSubCommand::untie) ) ); // /tiedup gag @@ -56,8 +62,10 @@ public class BondageSubCommand { Commands.literal("gag") .requires(CommandHelper.REQUIRES_OP) .then( - Commands.argument("player", EntityArgument.player()) - .executes(BondageSubCommand::gag) + Commands.argument( + "player", + EntityArgument.player() + ).executes(BondageSubCommand::gag) ) ); // /tiedup ungag @@ -65,8 +73,10 @@ public class BondageSubCommand { Commands.literal("ungag") .requires(CommandHelper.REQUIRES_OP) .then( - Commands.argument("player", EntityArgument.player()) - .executes(BondageSubCommand::ungag) + Commands.argument( + "player", + EntityArgument.player() + ).executes(BondageSubCommand::ungag) ) ); // /tiedup blindfold @@ -74,8 +84,10 @@ public class BondageSubCommand { Commands.literal("blindfold") .requires(CommandHelper.REQUIRES_OP) .then( - Commands.argument("player", EntityArgument.player()) - .executes(BondageSubCommand::blindfold) + Commands.argument( + "player", + EntityArgument.player() + ).executes(BondageSubCommand::blindfold) ) ); // /tiedup unblind @@ -83,8 +95,10 @@ public class BondageSubCommand { Commands.literal("unblind") .requires(CommandHelper.REQUIRES_OP) .then( - Commands.argument("player", EntityArgument.player()) - .executes(BondageSubCommand::unblind) + Commands.argument( + "player", + EntityArgument.player() + ).executes(BondageSubCommand::unblind) ) ); // /tiedup collar @@ -92,8 +106,10 @@ public class BondageSubCommand { Commands.literal("collar") .requires(CommandHelper.REQUIRES_OP) .then( - Commands.argument("player", EntityArgument.player()) - .executes(BondageSubCommand::collar) + Commands.argument( + "player", + EntityArgument.player() + ).executes(BondageSubCommand::collar) ) ); // /tiedup takecollar @@ -101,8 +117,10 @@ public class BondageSubCommand { Commands.literal("takecollar") .requires(CommandHelper.REQUIRES_OP) .then( - Commands.argument("player", EntityArgument.player()) - .executes(BondageSubCommand::takecollar) + Commands.argument( + "player", + EntityArgument.player() + ).executes(BondageSubCommand::takecollar) ) ); // /tiedup takeearplugs @@ -110,8 +128,10 @@ public class BondageSubCommand { Commands.literal("takeearplugs") .requires(CommandHelper.REQUIRES_OP) .then( - Commands.argument("player", EntityArgument.player()) - .executes(BondageSubCommand::takeearplugs) + Commands.argument( + "player", + EntityArgument.player() + ).executes(BondageSubCommand::takeearplugs) ) ); // /tiedup putearplugs @@ -119,8 +139,10 @@ public class BondageSubCommand { Commands.literal("putearplugs") .requires(CommandHelper.REQUIRES_OP) .then( - Commands.argument("player", EntityArgument.player()) - .executes(BondageSubCommand::putearplugs) + Commands.argument( + "player", + EntityArgument.player() + ).executes(BondageSubCommand::putearplugs) ) ); // /tiedup takeclothes @@ -128,8 +150,10 @@ public class BondageSubCommand { Commands.literal("takeclothes") .requires(CommandHelper.REQUIRES_OP) .then( - Commands.argument("player", EntityArgument.player()) - .executes(BondageSubCommand::takeclothes) + Commands.argument( + "player", + EntityArgument.player() + ).executes(BondageSubCommand::takeclothes) ) ); // /tiedup putclothes @@ -137,8 +161,10 @@ public class BondageSubCommand { Commands.literal("putclothes") .requires(CommandHelper.REQUIRES_OP) .then( - Commands.argument("player", EntityArgument.player()) - .executes(BondageSubCommand::putclothes) + Commands.argument( + "player", + EntityArgument.player() + ).executes(BondageSubCommand::putclothes) ) ); // /tiedup fullyrestrain @@ -146,8 +172,10 @@ public class BondageSubCommand { Commands.literal("fullyrestrain") .requires(CommandHelper.REQUIRES_OP) .then( - Commands.argument("player", EntityArgument.player()) - .executes(BondageSubCommand::fullyrestrain) + Commands.argument( + "player", + EntityArgument.player() + ).executes(BondageSubCommand::fullyrestrain) ) ); // /tiedup enslave @@ -155,8 +183,10 @@ public class BondageSubCommand { Commands.literal("enslave") .requires(CommandHelper.REQUIRES_OP) .then( - Commands.argument("player", EntityArgument.player()) - .executes(BondageSubCommand::enslave) + Commands.argument( + "player", + EntityArgument.player() + ).executes(BondageSubCommand::enslave) ) ); // /tiedup free @@ -164,8 +194,10 @@ public class BondageSubCommand { Commands.literal("free") .requires(CommandHelper.REQUIRES_OP) .then( - Commands.argument("player", EntityArgument.player()) - .executes(BondageSubCommand::free) + Commands.argument( + "player", + EntityArgument.player() + ).executes(BondageSubCommand::free) ) ); // /tiedup adjust @@ -173,29 +205,26 @@ public class BondageSubCommand { Commands.literal("adjust") .requires(CommandHelper.REQUIRES_OP) .then( - Commands.argument("player", EntityArgument.player()) - .then( - Commands.argument("type", StringArgumentType.word()) - .suggests((ctx, builder) -> { - builder.suggest("gag"); - builder.suggest("blindfold"); - builder.suggest("all"); - return builder.buildFuture(); - }) - .then( - Commands.argument( - "value", - FloatArgumentType.floatArg(-4.0f, 4.0f) - ).executes(BondageSubCommand::adjust) - ) - ) + Commands.argument("player", EntityArgument.player()).then( + Commands.argument("type", StringArgumentType.word()) + .suggests((ctx, builder) -> { + builder.suggest("gag"); + builder.suggest("blindfold"); + builder.suggest("all"); + return builder.buildFuture(); + }) + .then( + Commands.argument( + "value", + FloatArgumentType.floatArg(-4.0f, 4.0f) + ).executes(BondageSubCommand::adjust) + ) + ) ) ); } - // ======================================== // Command Implementations - // ======================================== /** * /tiedup tie @@ -582,7 +611,9 @@ public class BondageSubCommand { boolean adjustedBlindfold = false; if (type.equals("gag") || type.equals("all")) { - ItemStack gag = state.getEquipment(com.tiedup.remake.v2.BodyRegionV2.MOUTH); + ItemStack gag = state.getEquipment( + com.tiedup.remake.v2.BodyRegionV2.MOUTH + ); if (!gag.isEmpty()) { AdjustmentHelper.setAdjustment(gag, value); adjustedGag = true; @@ -590,7 +621,9 @@ public class BondageSubCommand { } if (type.equals("blindfold") || type.equals("all")) { - ItemStack blindfold = state.getEquipment(com.tiedup.remake.v2.BodyRegionV2.EYES); + ItemStack blindfold = state.getEquipment( + com.tiedup.remake.v2.BodyRegionV2.EYES + ); if (!blindfold.isEmpty()) { AdjustmentHelper.setAdjustment(blindfold, value); adjustedBlindfold = true; diff --git a/src/main/java/com/tiedup/remake/commands/subcommands/DebtSubCommand.java b/src/main/java/com/tiedup/remake/commands/subcommands/DebtSubCommand.java index 6a4dbb3..3f6f280 100644 --- a/src/main/java/com/tiedup/remake/commands/subcommands/DebtSubCommand.java +++ b/src/main/java/com/tiedup/remake/commands/subcommands/DebtSubCommand.java @@ -21,7 +21,9 @@ import net.minecraft.server.level.ServerPlayer; @SuppressWarnings("null") public class DebtSubCommand { - public static void register(LiteralArgumentBuilder root) { + public static void register( + LiteralArgumentBuilder root + ) { // /tiedup debt [set|add|remove ] root.then( Commands.literal("debt") @@ -61,9 +63,7 @@ public class DebtSubCommand { ); } - // ======================================== // Command Implementations - // ======================================== private static int debtShow(CommandContext context) throws CommandSyntaxException { diff --git a/src/main/java/com/tiedup/remake/commands/subcommands/InventorySubCommand.java b/src/main/java/com/tiedup/remake/commands/subcommands/InventorySubCommand.java index 5692875..eadf51d 100644 --- a/src/main/java/com/tiedup/remake/commands/subcommands/InventorySubCommand.java +++ b/src/main/java/com/tiedup/remake/commands/subcommands/InventorySubCommand.java @@ -20,21 +20,23 @@ import net.minecraft.server.level.ServerPlayer; @SuppressWarnings("null") public class InventorySubCommand { - public static void register(LiteralArgumentBuilder root) { + public static void register( + LiteralArgumentBuilder root + ) { // /tiedup returnstuff root.then( Commands.literal("returnstuff") .requires(CommandHelper.REQUIRES_OP) .then( - Commands.argument("player", EntityArgument.player()) - .executes(InventorySubCommand::returnstuff) + Commands.argument( + "player", + EntityArgument.player() + ).executes(InventorySubCommand::returnstuff) ) ); } - // ======================================== // Command Implementations - // ======================================== /** * /tiedup returnstuff diff --git a/src/main/java/com/tiedup/remake/commands/subcommands/MasterTestSubCommand.java b/src/main/java/com/tiedup/remake/commands/subcommands/MasterTestSubCommand.java index 0221b80..67808cf 100644 --- a/src/main/java/com/tiedup/remake/commands/subcommands/MasterTestSubCommand.java +++ b/src/main/java/com/tiedup/remake/commands/subcommands/MasterTestSubCommand.java @@ -23,7 +23,9 @@ import net.minecraft.world.entity.MobSpawnType; @SuppressWarnings("null") public class MasterTestSubCommand { - public static void register(LiteralArgumentBuilder root) { + public static void register( + LiteralArgumentBuilder root + ) { // /tiedup mastertest root.then( Commands.literal("mastertest") @@ -53,9 +55,7 @@ public class MasterTestSubCommand { ); } - // ======================================== // Command Implementations - // ======================================== /** * /tiedup mastertest @@ -95,7 +95,10 @@ public class MasterTestSubCommand { master.setPetPlayer(player); master.putPetCollar(player); - CommandHelper.syncPlayerState(player, PlayerBindState.getInstance(player)); + CommandHelper.syncPlayerState( + player, + PlayerBindState.getInstance(player) + ); String masterName = master.getNpcName(); if (masterName == null || masterName.isEmpty()) masterName = "Master"; @@ -138,7 +141,10 @@ public class MasterTestSubCommand { if (!master.hasPet()) { master.setPetPlayer(player); master.putPetCollar(player); - CommandHelper.syncPlayerState(player, PlayerBindState.getInstance(player)); + CommandHelper.syncPlayerState( + player, + PlayerBindState.getInstance(player) + ); } master.setMasterState(MasterState.HUMAN_CHAIR); @@ -195,7 +201,10 @@ public class MasterTestSubCommand { if (!master.hasPet()) { master.setPetPlayer(player); master.putPetCollar(player); - CommandHelper.syncPlayerState(player, PlayerBindState.getInstance(player)); + CommandHelper.syncPlayerState( + player, + PlayerBindState.getInstance(player) + ); } master.setMasterState(targetState); diff --git a/src/main/java/com/tiedup/remake/commands/subcommands/TestAnimSubCommand.java b/src/main/java/com/tiedup/remake/commands/subcommands/TestAnimSubCommand.java index e522249..9f095f4 100644 --- a/src/main/java/com/tiedup/remake/commands/subcommands/TestAnimSubCommand.java +++ b/src/main/java/com/tiedup/remake/commands/subcommands/TestAnimSubCommand.java @@ -20,7 +20,9 @@ import net.minecraft.server.level.ServerPlayer; @SuppressWarnings("null") public class TestAnimSubCommand { - public static void register(LiteralArgumentBuilder root) { + public static void register( + LiteralArgumentBuilder root + ) { // /tiedup testanim [player] // /tiedup testanim stop [player] root.then( @@ -30,34 +32,36 @@ public class TestAnimSubCommand { Commands.literal("stop") .executes(ctx -> testAnimStop(ctx, null)) .then( - Commands.argument("player", EntityArgument.player()) - .executes(ctx -> - testAnimStop( - ctx, - EntityArgument.getPlayer(ctx, "player") - ) + Commands.argument( + "player", + EntityArgument.player() + ).executes(ctx -> + testAnimStop( + ctx, + EntityArgument.getPlayer(ctx, "player") ) + ) ) ) .then( Commands.argument("animId", StringArgumentType.string()) .executes(ctx -> testAnim(ctx, null)) .then( - Commands.argument("player", EntityArgument.player()) - .executes(ctx -> - testAnim( - ctx, - EntityArgument.getPlayer(ctx, "player") - ) + Commands.argument( + "player", + EntityArgument.player() + ).executes(ctx -> + testAnim( + ctx, + EntityArgument.getPlayer(ctx, "player") ) + ) ) ) ); } - // ======================================== // Command Implementations - // ======================================== /** * /tiedup testanim [player] diff --git a/src/main/java/com/tiedup/remake/compat/mca/MCABondageManager.java b/src/main/java/com/tiedup/remake/compat/mca/MCABondageManager.java index 3baef59..9b8e485 100644 --- a/src/main/java/com/tiedup/remake/compat/mca/MCABondageManager.java +++ b/src/main/java/com/tiedup/remake/compat/mca/MCABondageManager.java @@ -10,10 +10,10 @@ import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.state.IRestrainable; import java.util.Map; import java.util.WeakHashMap; -import org.jetbrains.annotations.Nullable; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.Nullable; /** * Central coordinator for all MCA-TiedUp integration. @@ -48,9 +48,7 @@ public class MCABondageManager { return INSTANCE; } - // ======================================== // LIFECYCLE EVENTS - // ======================================== /** Dialogue broadcast radius in blocks */ private static final double DIALOGUE_RADIUS = 16.0; @@ -290,9 +288,7 @@ public class MCABondageManager { syncBondageState(villager); } - // ======================================== // AI CONTROL - // ======================================== /** * Get or create AI controller for villager. @@ -354,9 +350,7 @@ public class MCABondageManager { return getAILevel(villager) != MCABondageAILevel.NONE; } - // ======================================== // SYNC - // ======================================== /** * Sync all bondage state to tracking clients. @@ -403,9 +397,7 @@ public class MCABondageManager { }); } - // ======================================== // QUERIES - // ======================================== /** * Get IRestrainable adapter for MCA villager. @@ -430,9 +422,7 @@ public class MCABondageManager { return aiControllers.containsKey(living); } - // ======================================== // CLEANUP - // ======================================== /** * Remove all tracking for a villager. diff --git a/src/main/java/com/tiedup/remake/compat/mca/ai/MCABondageAIController.java b/src/main/java/com/tiedup/remake/compat/mca/ai/MCABondageAIController.java index 1892360..e359e6c 100644 --- a/src/main/java/com/tiedup/remake/compat/mca/ai/MCABondageAIController.java +++ b/src/main/java/com/tiedup/remake/compat/mca/ai/MCABondageAIController.java @@ -90,9 +90,7 @@ public class MCABondageAIController { personality != null ? personality : MCAPersonality.UNKNOWN; } - // ======================================== // LEVEL MANAGEMENT - // ======================================== /** * Recalculate and apply appropriate AI level based on current state. @@ -215,9 +213,7 @@ public class MCABondageAIController { } } - // ======================================== // SPEED REDUCTION - // ======================================== private void applySpeedReduction() { LivingEntity villager = villagerRef.get(); @@ -248,9 +244,7 @@ public class MCABondageAIController { ); } - // ======================================== // GOAL INJECTION (MODIFIED LEVEL) - // ======================================== private void injectBondageGoals() { LivingEntity villager = villagerRef.get(); @@ -326,9 +320,7 @@ public class MCABondageAIController { ); } - // ======================================== // FULL AI OVERRIDE - // ======================================== private void backupAndClearGoals() { LivingEntity villager = villagerRef.get(); @@ -399,9 +391,7 @@ public class MCABondageAIController { ); } - // ======================================== // MCA BRAIN CONTROL - // ======================================== /** * Suspend MCA's brain activities (for OVERRIDE level). @@ -503,9 +493,7 @@ public class MCABondageAIController { mcaBrainSuspended = false; } - // ======================================== // CLEANUP - // ======================================== /** * Clean up all AI modifications. diff --git a/src/main/java/com/tiedup/remake/compat/mca/capability/MCAKidnappedAdapter.java b/src/main/java/com/tiedup/remake/compat/mca/capability/MCAKidnappedAdapter.java index 3158dfe..cd2c349 100644 --- a/src/main/java/com/tiedup/remake/compat/mca/capability/MCAKidnappedAdapter.java +++ b/src/main/java/com/tiedup/remake/compat/mca/capability/MCAKidnappedAdapter.java @@ -7,14 +7,14 @@ import com.tiedup.remake.items.base.IHasGaggingEffect; import com.tiedup.remake.items.base.IHasResistance; import com.tiedup.remake.items.base.ILockable; import com.tiedup.remake.items.base.ItemBind; +import com.tiedup.remake.state.ICaptor; import com.tiedup.remake.state.IRestrainable; import com.tiedup.remake.state.IRestrainableEntity; -import com.tiedup.remake.v2.BodyRegionV2; -import com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper; -import com.tiedup.remake.state.ICaptor; import com.tiedup.remake.state.PlayerBindState; import com.tiedup.remake.util.tasks.ItemTask; import com.tiedup.remake.util.teleport.Position; +import com.tiedup.remake.v2.BodyRegionV2; +import com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper; import java.util.UUID; import javax.annotation.Nullable; import net.minecraft.server.level.ServerLevel; @@ -46,9 +46,7 @@ public class MCAKidnappedAdapter implements IRestrainable { this.cap = cap; } - // ======================================== // 1. CAPTURE LIFECYCLE - // ======================================== @Override public boolean getCapturedBy(ICaptor captor) { @@ -114,9 +112,7 @@ public class MCAKidnappedAdapter implements IRestrainable { getCapturedBy(newCaptor); } - // ======================================== // 2. STATE QUERIES - CAPTURE - // ======================================== @Override public boolean isEnslavable() { @@ -214,9 +210,7 @@ public class MCAKidnappedAdapter implements IRestrainable { return null; } - // ======================================== // 3. STATE QUERIES - BONDAGE EQUIPMENT - // ======================================== @Override public boolean isTiedUp() { @@ -301,9 +295,7 @@ public class MCAKidnappedAdapter implements IRestrainable { return false; } - // ======================================== // 4. EQUIPMENT MANAGEMENT - PUT ON - // ======================================== public void putBindOn(ItemStack bind) { cap.setBind(bind); @@ -357,9 +349,7 @@ public class MCAKidnappedAdapter implements IRestrainable { checkMittensAfterApply(); } - // ======================================== // 5. EQUIPMENT MANAGEMENT - UNEQUIP (V2) - // ======================================== @Override public ItemStack unequip(BodyRegionV2 region) { @@ -395,7 +385,9 @@ public class MCAKidnappedAdapter implements IRestrainable { ItemStack current = cap.getGag(); if (current.isEmpty()) yield ItemStack.EMPTY; cap.setGag(ItemStack.EMPTY); - MCABondageManager.getInstance().onSensoryRestrictionChanged(entity); + MCABondageManager.getInstance().onSensoryRestrictionChanged( + entity + ); syncToClients(); yield current; } @@ -403,7 +395,9 @@ public class MCAKidnappedAdapter implements IRestrainable { ItemStack current = cap.getBlindfold(); if (current.isEmpty()) yield ItemStack.EMPTY; cap.setBlindfold(ItemStack.EMPTY); - MCABondageManager.getInstance().onSensoryRestrictionChanged(entity); + MCABondageManager.getInstance().onSensoryRestrictionChanged( + entity + ); syncToClients(); yield current; } @@ -425,9 +419,7 @@ public class MCAKidnappedAdapter implements IRestrainable { }; } - // ======================================== // 5b. EQUIPMENT MANAGEMENT - TAKE OFF (local helpers) - // ======================================== public ItemStack takeBindOff() { ItemStack current = cap.getBind(); @@ -509,9 +501,7 @@ public class MCAKidnappedAdapter implements IRestrainable { return current; } - // ======================================== // V2 Region-Based Equipment Access - // ======================================== @Override public ItemStack getEquipment(BodyRegionV2 region) { @@ -537,16 +527,19 @@ public class MCAKidnappedAdapter implements IRestrainable { case NECK -> putCollarOn(stack); case TORSO -> putClothesOn(stack); case HANDS -> putMittensOn(stack); - default -> {} + default -> { + } } } - // ======================================== // 7. EQUIPMENT MANAGEMENT - REPLACE (V2 region-based) - // ======================================== @Override - public ItemStack replaceEquipment(BodyRegionV2 region, ItemStack newStack, boolean force) { + public ItemStack replaceEquipment( + BodyRegionV2 region, + ItemStack newStack, + boolean force + ) { return switch (region) { case ARMS -> { ItemStack old = cap.getBind(); @@ -580,7 +573,9 @@ public class MCAKidnappedAdapter implements IRestrainable { if (!force && isLocked(old, false)) yield ItemStack.EMPTY; cap.setCollar(newStack); if (newStack.getItem() instanceof IHasResistance resistance) { - cap.setCollarResistance(resistance.getBaseResistance(entity)); + cap.setCollarResistance( + resistance.getBaseResistance(entity) + ); } yield old; } @@ -599,9 +594,7 @@ public class MCAKidnappedAdapter implements IRestrainable { }; } - // ======================================== // 8. BULK OPERATIONS - // ======================================== @Override public void applyBondage( @@ -694,9 +687,7 @@ public class MCAKidnappedAdapter implements IRestrainable { return count; } - // ======================================== // 9. CLOTHES PERMISSION SYSTEM - // ======================================== @Override public boolean canTakeOffClothes(Player player) { @@ -714,9 +705,7 @@ public class MCAKidnappedAdapter implements IRestrainable { return true; } - // ======================================== // 10. SPECIAL INTERACTIONS - // ======================================== @Override public void tighten(Player tightener) { @@ -777,9 +766,7 @@ public class MCAKidnappedAdapter implements IRestrainable { } } - // ======================================== // 11. POST-APPLY CALLBACKS - // ======================================== /** * Sync bondage state to tracking clients. @@ -819,9 +806,7 @@ public class MCAKidnappedAdapter implements IRestrainable { syncToClients(); } - // ======================================== // 12. DEATH & LIFECYCLE - // ======================================== @Override public boolean onDeathKidnapped(Level world) { @@ -835,9 +820,7 @@ public class MCAKidnappedAdapter implements IRestrainable { return true; } - // ======================================== // 13. UTILITY & METADATA - // ======================================== @Override public UUID getKidnappedUniqueId() { @@ -893,9 +876,7 @@ public class MCAKidnappedAdapter implements IRestrainable { } } - // ======================================== // 14.5. RESISTANCE SYSTEM - // ======================================== @Override public int getCurrentBindResistance() { @@ -917,9 +898,7 @@ public class MCAKidnappedAdapter implements IRestrainable { cap.setCollarResistance(resistance); } - // ======================================== // 15. ENTITY REFERENCE - // ======================================== @Override public LivingEntity asLivingEntity() { diff --git a/src/main/java/com/tiedup/remake/compat/mca/capability/MCAKidnappedCapability.java b/src/main/java/com/tiedup/remake/compat/mca/capability/MCAKidnappedCapability.java index 7228145..2470c8c 100644 --- a/src/main/java/com/tiedup/remake/compat/mca/capability/MCAKidnappedCapability.java +++ b/src/main/java/com/tiedup/remake/compat/mca/capability/MCAKidnappedCapability.java @@ -1,8 +1,8 @@ package com.tiedup.remake.compat.mca.capability; import com.tiedup.remake.compat.mca.personality.TiedUpTrait; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.util.tasks.ItemTask; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.UUID; import javax.annotation.Nullable; import net.minecraft.nbt.CompoundTag; @@ -20,9 +20,7 @@ import net.minecraftforge.common.util.INBTSerializable; */ public class MCAKidnappedCapability implements INBTSerializable { - // ======================================== // BONDAGE EQUIPMENT SLOTS - // ======================================== private ItemStack bind = ItemStack.EMPTY; private ItemStack gag = ItemStack.EMPTY; @@ -32,9 +30,7 @@ public class MCAKidnappedCapability implements INBTSerializable { private ItemStack clothes = ItemStack.EMPTY; private ItemStack mittens = ItemStack.EMPTY; - // ======================================== // CAPTURE STATE - // ======================================== /** UUID of the captor entity (null if not captured) */ @Nullable @@ -47,23 +43,17 @@ public class MCAKidnappedCapability implements INBTSerializable { @Nullable private ItemTask salePrice = null; - // ======================================== // RESISTANCE VALUES - // ======================================== private int bindResistance = 0; private int collarResistance = 0; - // ======================================== // TIEDUP TRAIT - // ======================================== /** TiedUp-specific trait (MASO, REBELLIOUS, etc.) */ private TiedUpTrait trait = TiedUpTrait.NONE; - // ======================================== // EQUIPMENT GETTERS - // ======================================== public ItemStack getBind() { return bind; @@ -109,9 +99,7 @@ public class MCAKidnappedCapability implements INBTSerializable { }; } - // ======================================== // EQUIPMENT SETTERS - // ======================================== public void setBind(ItemStack stack) { this.bind = stack.copy(); @@ -153,7 +141,8 @@ public class MCAKidnappedCapability implements INBTSerializable { case NECK -> setCollar(stack); case TORSO -> setClothes(stack); case HANDS -> setMittens(stack); - default -> {} // Unsupported region — no-op + default -> { + } // Unsupported region — no-op } } @@ -166,9 +155,7 @@ public class MCAKidnappedCapability implements INBTSerializable { return old; } - // ======================================== // STATE QUERIES - // ======================================== public boolean hasBind() { return !bind.isEmpty(); @@ -198,9 +185,7 @@ public class MCAKidnappedCapability implements INBTSerializable { return !mittens.isEmpty(); } - // ======================================== // CAPTURE STATE - // ======================================== @Nullable public UUID getCaptorUUID() { @@ -232,9 +217,7 @@ public class MCAKidnappedCapability implements INBTSerializable { this.salePrice = price; } - // ======================================== // RESISTANCE - // ======================================== public int getBindResistance() { return bindResistance; @@ -252,9 +235,7 @@ public class MCAKidnappedCapability implements INBTSerializable { this.collarResistance = Math.max(0, resistance); } - // ======================================== // TIEDUP TRAIT - // ======================================== public TiedUpTrait getTrait() { return trait; @@ -264,9 +245,7 @@ public class MCAKidnappedCapability implements INBTSerializable { this.trait = trait != null ? trait : TiedUpTrait.NONE; } - // ======================================== // CLEAR ALL - // ======================================== /** * Clear all bondage equipment. @@ -295,9 +274,7 @@ public class MCAKidnappedCapability implements INBTSerializable { // trait is NOT cleared - it persists } - // ======================================== // NBT SERIALIZATION - // ======================================== private static final String TAG_BIND = "Bind"; private static final String TAG_GAG = "Gag"; diff --git a/src/main/java/com/tiedup/remake/compat/mca/dialogue/MCADialogueManager.java b/src/main/java/com/tiedup/remake/compat/mca/dialogue/MCADialogueManager.java index e232fc1..914d879 100644 --- a/src/main/java/com/tiedup/remake/compat/mca/dialogue/MCADialogueManager.java +++ b/src/main/java/com/tiedup/remake/compat/mca/dialogue/MCADialogueManager.java @@ -24,9 +24,7 @@ public class MCADialogueManager { private static final Random RANDOM = new Random(); - // ======================================== // BEING TIED DIALOGUES - // ======================================== /** * Get dialogue when being tied up. @@ -151,9 +149,7 @@ public class MCADialogueManager { }; } - // ======================================== // TIED IDLE DIALOGUES - // ======================================== /** * Get dialogue for idle state while tied. @@ -232,9 +228,7 @@ public class MCADialogueManager { }; } - // ======================================== // STRUGGLE DIALOGUES - // ======================================== /** * Get dialogue for struggling. @@ -294,9 +288,7 @@ public class MCADialogueManager { } } - // ======================================== // FREED DIALOGUES - // ======================================== /** * Get dialogue for being freed. @@ -336,9 +328,7 @@ public class MCADialogueManager { }; } - // ======================================== // COLLAR DIALOGUES - // ======================================== /** * Get dialogue for collar being put on. @@ -376,9 +366,7 @@ public class MCADialogueManager { }; } - // ======================================== // BROADCAST HELPER - // ======================================== /** * Broadcast a dialogue message from a villager to nearby players. @@ -412,9 +400,7 @@ public class MCADialogueManager { }); } - // ======================================== // UTILITY - // ======================================== private static String pickRandom(String... options) { return options[RANDOM.nextInt(options.length)]; diff --git a/src/main/java/com/tiedup/remake/compat/mca/event/MCACompatEvents.java b/src/main/java/com/tiedup/remake/compat/mca/event/MCACompatEvents.java index 2514dc9..3de34fb 100644 --- a/src/main/java/com/tiedup/remake/compat/mca/event/MCACompatEvents.java +++ b/src/main/java/com/tiedup/remake/compat/mca/event/MCACompatEvents.java @@ -1,16 +1,16 @@ package com.tiedup.remake.compat.mca.event; import com.tiedup.remake.compat.mca.MCACompat; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.compat.mca.capability.MCAKidnappedProvider; +import com.tiedup.remake.core.SettingsAccessor; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.items.ItemKey; import com.tiedup.remake.items.ItemMasterKey; -import com.tiedup.remake.v2.bondage.IV2BondageItem; import com.tiedup.remake.state.IBondageState; import com.tiedup.remake.tasks.UntyingPlayerTask; import com.tiedup.remake.util.KidnappedHelper; -import com.tiedup.remake.core.SettingsAccessor; +import com.tiedup.remake.v2.BodyRegionV2; +import com.tiedup.remake.v2.bondage.IV2BondageItem; import java.util.HashMap; import java.util.Map; import java.util.UUID; diff --git a/src/main/java/com/tiedup/remake/compat/mca/personality/MCAMoodManager.java b/src/main/java/com/tiedup/remake/compat/mca/personality/MCAMoodManager.java index c1d81d8..dc03452 100644 --- a/src/main/java/com/tiedup/remake/compat/mca/personality/MCAMoodManager.java +++ b/src/main/java/com/tiedup/remake/compat/mca/personality/MCAMoodManager.java @@ -34,9 +34,7 @@ public class MCAMoodManager { private MCAMoodManager() {} - // ======================================== // EVENT HANDLERS - // ======================================== /** * Called when villager is tied up. @@ -232,9 +230,7 @@ public class MCAMoodManager { modifyMood(entity, moodChange); } - // ======================================== // REFLECTION-BASED MOOD ACCESS - // ======================================== /** * Modify mood using MCA's modifyMoodValue method via reflection. diff --git a/src/main/java/com/tiedup/remake/compat/mca/personality/MCAPersonalityManager.java b/src/main/java/com/tiedup/remake/compat/mca/personality/MCAPersonalityManager.java index 15133a6..2f3b4fc 100644 --- a/src/main/java/com/tiedup/remake/compat/mca/personality/MCAPersonalityManager.java +++ b/src/main/java/com/tiedup/remake/compat/mca/personality/MCAPersonalityManager.java @@ -6,8 +6,8 @@ import com.tiedup.remake.core.TiedUpMod; import java.lang.reflect.Method; import java.util.Map; import java.util.WeakHashMap; -import org.jetbrains.annotations.Nullable; import net.minecraft.world.entity.LivingEntity; +import org.jetbrains.annotations.Nullable; /** * Manages MCA personality and TiedUp trait access for villagers. @@ -37,9 +37,7 @@ public class MCAPersonalityManager { private MCAPersonalityManager() {} - // ======================================== // MCA PERSONALITY ACCESS (Reflection) - // ======================================== /** * Get the MCA personality for a villager. @@ -146,9 +144,7 @@ public class MCAPersonalityManager { } } - // ======================================== // TIEDUP TRAIT ACCESS (Capability) - // ======================================== /** * Get the TiedUp trait for a villager. @@ -191,9 +187,7 @@ public class MCAPersonalityManager { }); } - // ======================================== // COMBINED CALCULATIONS - // ======================================== /** * Get combined struggle multiplier (personality * trait). @@ -230,9 +224,7 @@ public class MCAPersonalityManager { return getCombinedMoodTied(entity) > 0; } - // ======================================== // CACHE MANAGEMENT - // ======================================== /** * Clear personality cache for an entity. diff --git a/src/main/java/com/tiedup/remake/compat/wildfire/render/WildfireDamselLayer.java b/src/main/java/com/tiedup/remake/compat/wildfire/render/WildfireDamselLayer.java index 070ddee..7f4843d 100644 --- a/src/main/java/com/tiedup/remake/compat/wildfire/render/WildfireDamselLayer.java +++ b/src/main/java/com/tiedup/remake/compat/wildfire/render/WildfireDamselLayer.java @@ -1,7 +1,6 @@ package com.tiedup.remake.compat.wildfire.render; import com.mojang.blaze3d.systems.RenderSystem; -import com.tiedup.remake.v2.BodyRegionV2; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.tiedup.remake.compat.wildfire.WildfireCompat; @@ -10,6 +9,7 @@ import com.tiedup.remake.entities.EntityDamsel; import com.tiedup.remake.entities.KidnapperItemSelector; import com.tiedup.remake.state.IBondageState; import com.tiedup.remake.util.KidnappedHelper; +import com.tiedup.remake.v2.BodyRegionV2; import com.wildfire.api.IGenderArmor; import com.wildfire.main.Breasts; import com.wildfire.main.GenderPlayer; @@ -895,7 +895,9 @@ public class WildfireDamselLayer< */ private ItemStack getBondageBindItem(T entity) { // For NPCs (AbstractTiedUpNpc and subclasses) - if (entity instanceof com.tiedup.remake.entities.AbstractTiedUpNpc npc) { + if ( + entity instanceof com.tiedup.remake.entities.AbstractTiedUpNpc npc + ) { return npc.getEquipment(BodyRegionV2.ARMS); } diff --git a/src/main/java/com/tiedup/remake/core/ModConfig.java b/src/main/java/com/tiedup/remake/core/ModConfig.java index 1f68afc..3ad722c 100644 --- a/src/main/java/com/tiedup/remake/core/ModConfig.java +++ b/src/main/java/com/tiedup/remake/core/ModConfig.java @@ -42,7 +42,7 @@ public class ModConfig { public final ForgeConfigSpec.IntValue struggleMaxDecrease; public final ForgeConfigSpec.IntValue struggleCollarRandomShock; - // === Phase 2: Mini-Game Settings === + // === Mini-Game Settings === public final ForgeConfigSpec.BooleanValue struggleMiniGameEnabled; public final ForgeConfigSpec.BooleanValue lockpickMiniGameEnabled; public final ForgeConfigSpec.IntValue kidnapperDetectionRadius; @@ -135,37 +135,37 @@ public class ModConfig { public final ForgeConfigSpec.IntValue dialogueRadius; public final ForgeConfigSpec.IntValue dialogueCooldown; - // === Kidnapper Lairs (Phase 4) === + // === Kidnapper Lairs === public final ForgeConfigSpec.BooleanValue enableLairs; public final ForgeConfigSpec.DoubleValue lairDensity; - // === Kidnapper Capture (Phase 4) === + // === Kidnapper Capture === public final ForgeConfigSpec.BooleanValue transportToLair; public final ForgeConfigSpec.BooleanValue confiscateInventory; - // === Kidnapper Ransom (Phase 4) === + // === Kidnapper Ransom === public final ForgeConfigSpec.BooleanValue enableRansom; public final ForgeConfigSpec.IntValue ransomAmount; public final ForgeConfigSpec.ConfigValue ransomItem; public final ForgeConfigSpec.IntValue ransomTimeoutMinutes; - // === Kidnapper Timeout (Phase 4) === + // === Kidnapper Timeout === public final ForgeConfigSpec.IntValue maxCaptivityMinutes; public final ForgeConfigSpec.BooleanValue releaseWithInventory; public final ForgeConfigSpec.IntValue laborRestSeconds; - // === Kidnapper Struggle (Phase 4) === + // === Kidnapper Struggle === public final ForgeConfigSpec.BooleanValue struggleMakesNoise; - // === Kidnapper AI (Phase 4) === + // === Kidnapper AI === public final ForgeConfigSpec.BooleanValue enablePunishment; - // === Kidnapper Abandon (Phase 4) === + // === Kidnapper Abandon === public final ForgeConfigSpec.IntValue abandonTeleportRadius; public final ForgeConfigSpec.BooleanValue abandonKeepsBlindfold; public final ForgeConfigSpec.BooleanValue abandonKeepsBinds; - // === Kidnapper Solo Mode (Phase 4) === + // === Kidnapper Solo Mode === public final ForgeConfigSpec.BooleanValue enableSoloFallback; public final ForgeConfigSpec.DoubleValue soloKeepChance; public final ForgeConfigSpec.DoubleValue soloAbandonChance; @@ -180,7 +180,7 @@ public class ModConfig { public final ForgeConfigSpec.IntValue masterMinDistractionDuration; public final ForgeConfigSpec.IntValue masterMaxDistractionDuration; - // === Cells (Phase 4) === + // === Cells === public final ForgeConfigSpec.IntValue cellMaxWallDistance; public final ForgeConfigSpec.IntValue maxPrisonersPerCell; public final ForgeConfigSpec.BooleanValue deleteMarkerOnCellDelete; @@ -459,7 +459,7 @@ public class ModConfig { .defineInRange("dialogueCooldown", 100, 20, 1200); builder.pop(); - // === KIDNAPPER CONFIGURATION (Phase 4) === + // === KIDNAPPER CONFIGURATION === builder.push("KidnapperAdvanced"); builder.push("Lairs"); @@ -673,7 +673,7 @@ public class ModConfig { List > textureHostWhitelist; - // Cell Rendering (Phase 4) + // Cell Rendering public final ForgeConfigSpec.BooleanValue showCellHighlights; public final ForgeConfigSpec.IntValue highlightRenderDistance; diff --git a/src/main/java/com/tiedup/remake/core/SettingsAccessor.java b/src/main/java/com/tiedup/remake/core/SettingsAccessor.java index 8395f51..6ad2bd4 100644 --- a/src/main/java/com/tiedup/remake/core/SettingsAccessor.java +++ b/src/main/java/com/tiedup/remake/core/SettingsAccessor.java @@ -4,9 +4,9 @@ import com.tiedup.remake.entities.skins.Gender; import com.tiedup.remake.util.ModGameRules; import java.util.Map; import java.util.function.Supplier; -import org.jetbrains.annotations.Nullable; import net.minecraft.world.level.GameRules; import net.minecraftforge.common.ForgeConfigSpec; +import org.jetbrains.annotations.Nullable; /** * Centralized accessor for mod settings that resolves the GameRules vs ModConfig priority. @@ -42,7 +42,9 @@ public class SettingsAccessor { * @return true if kidnappers should spawn */ public static boolean doKidnappersSpawn(@Nullable GameRules rules) { - if (rules != null) return rules.getBoolean(ModGameRules.KIDNAPPERS_SPAWN); + if (rules != null) return rules.getBoolean( + ModGameRules.KIDNAPPERS_SPAWN + ); return safeGet(() -> ModConfig.SERVER.kidnappersSpawn.get(), true); } @@ -68,7 +70,9 @@ public class SettingsAccessor { * @return spawn rate percentage */ public static int getKidnapperSpawnRate(@Nullable GameRules rules) { - if (rules != null) return rules.getInt(ModGameRules.KIDNAPPER_SPAWN_RATE); + if (rules != null) return rules.getInt( + ModGameRules.KIDNAPPER_SPAWN_RATE + ); return safeGet(() -> ModConfig.SERVER.kidnapperSpawnRate.get(), 70); } @@ -80,8 +84,13 @@ public class SettingsAccessor { * @return spawn rate percentage */ public static int getKidnapperArcherSpawnRate(@Nullable GameRules rules) { - if (rules != null) return rules.getInt(ModGameRules.KIDNAPPER_ARCHER_SPAWN_RATE); - return safeGet(() -> ModConfig.SERVER.kidnapperArcherSpawnRate.get(), 70); + if (rules != null) return rules.getInt( + ModGameRules.KIDNAPPER_ARCHER_SPAWN_RATE + ); + return safeGet( + () -> ModConfig.SERVER.kidnapperArcherSpawnRate.get(), + 70 + ); } /** @@ -92,8 +101,13 @@ public class SettingsAccessor { * @return spawn rate percentage */ public static int getKidnapperEliteSpawnRate(@Nullable GameRules rules) { - if (rules != null) return rules.getInt(ModGameRules.KIDNAPPER_ELITE_SPAWN_RATE); - return safeGet(() -> ModConfig.SERVER.kidnapperEliteSpawnRate.get(), 70); + if (rules != null) return rules.getInt( + ModGameRules.KIDNAPPER_ELITE_SPAWN_RATE + ); + return safeGet( + () -> ModConfig.SERVER.kidnapperEliteSpawnRate.get(), + 70 + ); } /** @@ -104,8 +118,13 @@ public class SettingsAccessor { * @return spawn rate percentage */ public static int getKidnapperMerchantSpawnRate(@Nullable GameRules rules) { - if (rules != null) return rules.getInt(ModGameRules.KIDNAPPER_MERCHANT_SPAWN_RATE); - return safeGet(() -> ModConfig.SERVER.kidnapperMerchantSpawnRate.get(), 70); + if (rules != null) return rules.getInt( + ModGameRules.KIDNAPPER_MERCHANT_SPAWN_RATE + ); + return safeGet( + () -> ModConfig.SERVER.kidnapperMerchantSpawnRate.get(), + 70 + ); } /** @@ -150,17 +169,20 @@ public class SettingsAccessor { */ public static int getBindResistance(String bindType) { String key = normalizeBindKey(bindType); - return safeGet(() -> { - if (ModConfig.SERVER == null) { + return safeGet( + () -> { + if (ModConfig.SERVER == null) { + return 100; + } + Map resistances = + ModConfig.SERVER.bindResistances; + if (resistances != null && resistances.containsKey(key)) { + return resistances.get(key).get(); + } return 100; - } - Map resistances = - ModConfig.SERVER.bindResistances; - if (resistances != null && resistances.containsKey(key)) { - return resistances.get(key).get(); - } - return 100; - }, 100); + }, + 100 + ); } /** @@ -171,12 +193,15 @@ public class SettingsAccessor { */ public static int getPadlockResistance(@Nullable GameRules rules) { if (rules != null) return rules.getInt(ModGameRules.PADLOCK_RESISTANCE); - return safeGet(() -> { - if (ModConfig.SERVER == null) { - return 250; - } - return ModConfig.SERVER.padlockResistance.get(); - }, 250); + return safeGet( + () -> { + if (ModConfig.SERVER == null) { + return 250; + } + return ModConfig.SERVER.padlockResistance.get(); + }, + 250 + ); } /** @@ -196,18 +221,15 @@ public class SettingsAccessor { return switch (bindType.toLowerCase()) { // Plural -> singular case "ropes" -> "rope"; - // Aliases that share another type's resistance case "shibari" -> "rope"; case "leather_straps", "medical_straps", "dogbinder" -> "armbinder"; case "beam_cuffs" -> "chain"; case "choke_collar" -> "collar"; - // Registry name -> config key rename case "vine_seed" -> "vine"; case "web_bind" -> "web"; case "duct_tape" -> "tape"; - // Already a valid config key (rope, chain, armbinder, wrap, // straitjacket, latex_sack, ribbon, vine, web, slime, tape, // gag, blindfold, collar) @@ -235,7 +257,9 @@ public class SettingsAccessor { * @return Probability percentage */ public static int getProbabilityStruggle(@Nullable GameRules rules) { - if (rules != null) return rules.getInt(ModGameRules.PROBABILITY_STRUGGLE); + if (rules != null) return rules.getInt( + ModGameRules.PROBABILITY_STRUGGLE + ); return safeGet(() -> ModConfig.SERVER.struggleProbability.get(), 40); } @@ -246,7 +270,9 @@ public class SettingsAccessor { * @return Minimum decrease amount (default 1) */ public static int getStruggleMinDecrease(@Nullable GameRules rules) { - if (rules != null) return rules.getInt(ModGameRules.STRUGGLE_MIN_DECREASE); + if (rules != null) return rules.getInt( + ModGameRules.STRUGGLE_MIN_DECREASE + ); return safeGet(() -> ModConfig.SERVER.struggleMinDecrease.get(), 1); } @@ -257,7 +283,9 @@ public class SettingsAccessor { * @return Maximum decrease amount (default 10) */ public static int getStruggleMaxDecrease(@Nullable GameRules rules) { - if (rules != null) return rules.getInt(ModGameRules.STRUGGLE_MAX_DECREASE); + if (rules != null) return rules.getInt( + ModGameRules.STRUGGLE_MAX_DECREASE + ); return safeGet(() -> ModConfig.SERVER.struggleMaxDecrease.get(), 10); } @@ -279,8 +307,13 @@ public class SettingsAccessor { * @return Shock probability percentage (default 20) */ public static int getStruggleCollarRandomShock(@Nullable GameRules rules) { - if (rules != null) return rules.getInt(ModGameRules.STRUGGLE_COLLAR_RANDOM_SHOCK); - return safeGet(() -> ModConfig.SERVER.struggleCollarRandomShock.get(), 20); + if (rules != null) return rules.getInt( + ModGameRules.STRUGGLE_COLLAR_RANDOM_SHOCK + ); + return safeGet( + () -> ModConfig.SERVER.struggleCollarRandomShock.get(), + 20 + ); } /** @@ -291,7 +324,9 @@ public class SettingsAccessor { * @return Ticks per resistance (default 20 = 1 per second) */ public static int getStruggleContinuousRate(@Nullable GameRules rules) { - if (rules != null) return rules.getInt(ModGameRules.STRUGGLE_CONTINUOUS_RATE); + if (rules != null) return rules.getInt( + ModGameRules.STRUGGLE_CONTINUOUS_RATE + ); return 20; } @@ -315,7 +350,9 @@ public class SettingsAccessor { * @return Duration in seconds (default 10) */ public static int getUntyingPlayerTime(@Nullable GameRules rules) { - if (rules != null) return rules.getInt(ModGameRules.UNTYING_PLAYER_TIME); + if (rules != null) return rules.getInt( + ModGameRules.UNTYING_PLAYER_TIME + ); return safeGet(() -> ModConfig.SERVER.untyingTime.get(), 10); } @@ -328,7 +365,9 @@ public class SettingsAccessor { * @return true if enslavement is enabled */ public static boolean isEnslavementEnabled(@Nullable GameRules rules) { - if (rules != null) return rules.getBoolean(ModGameRules.ENSLAVEMENT_ENABLED); + if (rules != null) return rules.getBoolean( + ModGameRules.ENSLAVEMENT_ENABLED + ); return safeGet(() -> ModConfig.SERVER.enslavementEnabled.get(), true); } @@ -363,7 +402,9 @@ public class SettingsAccessor { * @return Radius in blocks (default 5) */ public static int getBountyDeliveryRadius(@Nullable GameRules rules) { - if (rules != null) return rules.getInt(ModGameRules.BOUNTY_DELIVERY_RADIUS); + if (rules != null) return rules.getInt( + ModGameRules.BOUNTY_DELIVERY_RADIUS + ); return safeGet(() -> ModConfig.SERVER.bountyDeliveryRadius.get(), 5); } @@ -390,7 +431,9 @@ public class SettingsAccessor { * @return true if NPCs can struggle against restraints */ public static boolean isNpcStruggleEnabled(@Nullable GameRules rules) { - if (rules != null) return rules.getBoolean(ModGameRules.NPC_STRUGGLE_ENABLED); + if (rules != null) return rules.getBoolean( + ModGameRules.NPC_STRUGGLE_ENABLED + ); return true; } @@ -403,7 +446,9 @@ public class SettingsAccessor { * @return Base interval in ticks (default 6000 = 5 minutes) */ public static int getNpcStruggleInterval(@Nullable GameRules rules) { - if (rules != null) return rules.getInt(ModGameRules.NPC_STRUGGLE_INTERVAL); + if (rules != null) return rules.getInt( + ModGameRules.NPC_STRUGGLE_INTERVAL + ); return 6000; } @@ -416,8 +461,13 @@ public class SettingsAccessor { * @return Radius in blocks (default 50, range 1-200) */ public static int getShockerControllerRadius(@Nullable GameRules rules) { - if (rules != null) return rules.getInt(ModGameRules.SHOCKER_CONTROLLER_BASE_RADIUS); - return safeGet(() -> ModConfig.SERVER.shockerControllerRadius.get(), 50); + if (rules != null) return rules.getInt( + ModGameRules.SHOCKER_CONTROLLER_BASE_RADIUS + ); + return safeGet( + () -> ModConfig.SERVER.shockerControllerRadius.get(), + 50 + ); } // ==================== Gameplay Settings ==================== @@ -430,7 +480,9 @@ public class SettingsAccessor { * @return true if proximity chat is enabled for gagged players */ public static boolean isGagTalkProximityEnabled(@Nullable GameRules rules) { - if (rules != null) return rules.getBoolean(ModGameRules.GAG_TALK_PROXIMITY); + if (rules != null) return rules.getBoolean( + ModGameRules.GAG_TALK_PROXIMITY + ); return safeGet(() -> ModConfig.SERVER.gagTalkProximity.get(), true); } @@ -445,16 +497,19 @@ public class SettingsAccessor { * @param rules GameRules from the current world, or null if unavailable * @return null for both genders, Gender.FEMALE, or Gender.MALE */ - public static @Nullable Gender getPreferredSpawnGender(@Nullable GameRules rules) { + public static @Nullable Gender getPreferredSpawnGender( + @Nullable GameRules rules + ) { if (rules != null) { int mode = rules.getInt(ModGameRules.SPAWN_GENDER_MODE); if (mode == 1) return Gender.FEMALE; if (mode == 2) return Gender.MALE; // mode == 0 or invalid: fall through to ModConfig } - ModConfig.ServerConfig.SpawnGenderMode configMode = - safeGet(() -> ModConfig.SERVER.spawnGenderMode.get(), - ModConfig.ServerConfig.SpawnGenderMode.BOTH); + ModConfig.ServerConfig.SpawnGenderMode configMode = safeGet( + () -> ModConfig.SERVER.spawnGenderMode.get(), + ModConfig.ServerConfig.SpawnGenderMode.BOTH + ); return switch (configMode) { case FEMALE_ONLY -> Gender.FEMALE; case MALE_ONLY -> Gender.MALE; @@ -471,7 +526,10 @@ public class SettingsAccessor { * @return Duration in ticks (default 200 = 10 seconds) */ public static int getChloroformDuration() { - return safeGet(() -> ModConfig.SERVER.chloroformEffectDuration.get(), 200); + return safeGet( + () -> ModConfig.SERVER.chloroformEffectDuration.get(), + 200 + ); } // ==================== Helpers ==================== diff --git a/src/main/java/com/tiedup/remake/core/SystemMessageManager.java b/src/main/java/com/tiedup/remake/core/SystemMessageManager.java index 775607f..f790e62 100644 --- a/src/main/java/com/tiedup/remake/core/SystemMessageManager.java +++ b/src/main/java/com/tiedup/remake/core/SystemMessageManager.java @@ -25,9 +25,7 @@ import net.minecraft.world.entity.player.Player; */ public class SystemMessageManager { - // ======================================== // MESSAGE CATEGORIES - // ======================================== /** * Categories for system messages. @@ -140,9 +138,7 @@ public class SystemMessageManager { ERROR, // Generic error } - // ======================================== // MESSAGE TEMPLATES - // ======================================== /** * Get the raw message template for a category. @@ -373,9 +369,7 @@ public class SystemMessageManager { }; } - // ======================================== // SEND METHODS - TO SINGLE PLAYER - // ======================================== /** * Send a system message to a player's action bar. @@ -529,9 +523,7 @@ public class SystemMessageManager { sendToPlayer(player, message, getCategoryColor(category)); } - // ======================================== // SEND METHODS - TO NEARBY PLAYERS - // ======================================== /** * Send a system message to all players within radius. @@ -603,9 +595,7 @@ public class SystemMessageManager { } } - // ======================================== // CONVENIENCE METHODS - // ======================================== /** * Send "X is tying you up!" to target. @@ -716,9 +706,7 @@ public class SystemMessageManager { ); } - // ======================================== // UTILITY - // ======================================== /** * Get display name for an entity. diff --git a/src/main/java/com/tiedup/remake/core/TiedUpMod.java b/src/main/java/com/tiedup/remake/core/TiedUpMod.java index ccdc41f..9fcd3ab 100644 --- a/src/main/java/com/tiedup/remake/core/TiedUpMod.java +++ b/src/main/java/com/tiedup/remake/core/TiedUpMod.java @@ -48,7 +48,6 @@ public class TiedUpMod { // Register items ModItems.ITEMS.register(modEventBus); - // Phase 16: Register blocks and block entities com.tiedup.remake.blocks.ModBlocks.BLOCKS.register(modEventBus); com.tiedup.remake.blocks.ModBlocks.BLOCK_ITEMS.register(modEventBus); com.tiedup.remake.blocks.entity.ModBlockEntities.BLOCK_ENTITIES.register( @@ -74,7 +73,6 @@ public class TiedUpMod { // Register creative tabs ModCreativeTabs.CREATIVE_MODE_TABS.register(modEventBus); - // Phase 8: Register entities ModEntities.ENTITIES.register(modEventBus); // Register menu types (vanilla containers) @@ -106,7 +104,6 @@ public class TiedUpMod { ModConfig.CLIENT_SPEC ); - // Phase 6: Register custom GameRules ModGameRules.register(); // Register the commonSetup method for modloading @@ -128,11 +125,9 @@ public class TiedUpMod { LOGGER.info("TiedUp! Common setup"); LOGGER.info("Registered {} items", ModItems.ITEMS.getEntries().size()); - // Phase 1: Data-Driven Skin System // Skin loading moved to SkinReloadListener (registered via AddReloadListenerEvent) // This allows skins to be loaded from datapacks and reloaded with /reload - // Phase 14.3.5: Initialize SaleLoader and JobLoader com.tiedup.remake.util.tasks.SaleLoader.init(); com.tiedup.remake.util.tasks.JobLoader.init(); @@ -219,8 +214,6 @@ public class TiedUpMod { /** * Register entity renderers. - * Phase 14.2.3: EntityDamsel needs a renderer. - * Phase 14.3: EntityKidnapper uses DamselRenderer. */ @SubscribeEvent public static void onRegisterRenderers( @@ -232,21 +225,18 @@ public class TiedUpMod { ); LOGGER.info("Registered entity renderer for EntityDamsel"); - // Phase 1: EntityDamselShiny renderer (reuses DamselRenderer) event.registerEntityRenderer( ModEntities.DAMSEL_SHINY.get(), com.tiedup.remake.client.renderer.DamselRenderer::new ); LOGGER.info("Registered entity renderer for EntityDamselShiny"); - // Phase 14.3: EntityKidnapper renderer (reuses DamselRenderer) event.registerEntityRenderer( ModEntities.KIDNAPPER.get(), com.tiedup.remake.client.renderer.DamselRenderer::new ); LOGGER.info("Registered entity renderer for EntityKidnapper"); - // Phase 14.3.6: EntityKidnapperElite renderer (reuses DamselRenderer) event.registerEntityRenderer( ModEntities.KIDNAPPER_ELITE.get(), com.tiedup.remake.client.renderer.DamselRenderer::new @@ -262,7 +252,6 @@ public class TiedUpMod { "Registered entity renderer for EntityKidnapperMerchant" ); - // Phase 18: EntityKidnapperArcher renderer (reuses DamselRenderer) event.registerEntityRenderer( ModEntities.KIDNAPPER_ARCHER.get(), com.tiedup.remake.client.renderer.DamselRenderer::new @@ -297,14 +286,12 @@ public class TiedUpMod { ); LOGGER.info("Registered entity renderer for EntityLaborGuard"); - // Phase 15: EntityRopeArrow renderer event.registerEntityRenderer( ModEntities.ROPE_ARROW.get(), com.tiedup.remake.client.renderer.RopeArrowRenderer::new ); LOGGER.info("Registered entity renderer for EntityRopeArrow"); - // Phase 16: EntityKidnapBomb renderer (custom renderer with our texture) event.registerEntityRenderer( ModEntities.KIDNAP_BOMB_ENTITY.get(), com.tiedup.remake.client.renderer.KidnapBombRenderer::new @@ -321,11 +308,11 @@ public class TiedUpMod { // Furniture entity renderer (data-driven GLB mesh rendering) event.registerEntityRenderer( ModEntities.FURNITURE.get(), - com.tiedup.remake.v2.furniture.client.FurnitureEntityRenderer::new + com.tiedup.remake.v2.furniture.client + .FurnitureEntityRenderer::new ); LOGGER.info("Registered entity renderer for EntityFurniture"); - // Phase 16: TrappedChest uses vanilla ChestRenderer event.registerBlockEntityRenderer( com.tiedup.remake.blocks.entity.ModBlockEntities.TRAPPED_CHEST.get(), net.minecraft.client.renderer.blockentity.ChestRenderer::new @@ -335,8 +322,6 @@ public class TiedUpMod { /** * Register layer definitions. - * Phase 11: Register the HD bondage model layer. - * Phase 14.2.3: Register EntityDamsel model layers. */ @SubscribeEvent public static void onRegisterLayerDefinitions( @@ -354,16 +339,12 @@ public class TiedUpMod { ); LOGGER.info("Registered BondageLayerDefinitions (normal + slim)"); - // Phase 19: EntityDamsel now uses vanilla ModelLayers.PLAYER / PLAYER_SLIM // No custom layer registration needed - DamselModel extends PlayerModel - LOGGER.info( - "EntityDamsel uses vanilla PLAYER model layers (Phase 19)" - ); + LOGGER.info("EntityDamsel uses vanilla PLAYER model layers"); } /** * Add render layers to entity renderers. - * Phase 11: Add BondageItemRenderLayer to PlayerRenderer. * * Uses LOW priority to ensure bondage layers are added AFTER Wildfire's * breast layers (which use default NORMAL priority). This ensures bondage @@ -470,8 +451,6 @@ public class TiedUpMod { /** * Register entity attributes. - * Phase 14.2: EntityDamsel needs attributes. - * Phase 14.3: EntityKidnapper and Elite variants. */ @SubscribeEvent public static void onEntityAttributeCreation( @@ -483,21 +462,18 @@ public class TiedUpMod { ); LOGGER.info("Registered entity attributes for EntityDamsel"); - // Phase 1: EntityDamselShiny attributes event.put( ModEntities.DAMSEL_SHINY.get(), com.tiedup.remake.entities.EntityDamselShiny.createAttributes().build() ); LOGGER.info("Registered entity attributes for EntityDamselShiny"); - // Phase 14.3: EntityKidnapper attributes event.put( ModEntities.KIDNAPPER.get(), com.tiedup.remake.entities.EntityKidnapper.createAttributes().build() ); LOGGER.info("Registered entity attributes for EntityKidnapper"); - // Phase 14.3.6: EntityKidnapperElite attributes event.put( ModEntities.KIDNAPPER_ELITE.get(), com.tiedup.remake.entities.EntityKidnapperElite.createAttributes().build() @@ -515,7 +491,6 @@ public class TiedUpMod { "Registered entity attributes for EntityKidnapperMerchant" ); - // Phase 18: EntityKidnapperArcher attributes event.put( ModEntities.KIDNAPPER_ARCHER.get(), com.tiedup.remake.entities.EntityKidnapperArcher.createAttributes().build() @@ -567,7 +542,6 @@ public class TiedUpMod { /** * Register reload listeners for data-driven systems. * - * Phase 1: Data-Driven Skin System * - SkinReloadListener loads skin definitions from JSON files * - Triggers on server start and /reload command * @@ -604,9 +578,9 @@ public class TiedUpMod { event.addListener( new com.tiedup.remake.v2.furniture.FurnitureServerReloadListener() ); - LOGGER.info("Registered FurnitureServerReloadListener for data-driven furniture definitions"); + LOGGER.info( + "Registered FurnitureServerReloadListener for data-driven furniture definitions" + ); } } - - // NOTE: Blindfold rendering moved to BlindfoldRenderEventHandler.java (Phase 5) } diff --git a/src/main/java/com/tiedup/remake/dialogue/DialogueBridge.java b/src/main/java/com/tiedup/remake/dialogue/DialogueBridge.java index 6a5e410..3d6feb9 100644 --- a/src/main/java/com/tiedup/remake/dialogue/DialogueBridge.java +++ b/src/main/java/com/tiedup/remake/dialogue/DialogueBridge.java @@ -8,9 +8,9 @@ import com.tiedup.remake.entities.KidnapperTheme; import com.tiedup.remake.personality.PersonalityState; import com.tiedup.remake.personality.PersonalityType; import com.tiedup.remake.util.MessageDispatcher; -import org.jetbrains.annotations.Nullable; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; +import org.jetbrains.annotations.Nullable; /** * Bridge between the legacy EntityDialogueManager and the new DialogueManager. @@ -221,9 +221,7 @@ public class DialogueBridge { return DialogueManager.getDialogue(dialogueId, context); } - // =========================================== // UNIVERSAL SPEAKER METHODS (IDialogueSpeaker) - // =========================================== /** * Build a DialogueContext from any IDialogueSpeaker. diff --git a/src/main/java/com/tiedup/remake/dialogue/DialogueContext.java b/src/main/java/com/tiedup/remake/dialogue/DialogueContext.java index e6edf98..e406f5d 100644 --- a/src/main/java/com/tiedup/remake/dialogue/DialogueContext.java +++ b/src/main/java/com/tiedup/remake/dialogue/DialogueContext.java @@ -1,9 +1,9 @@ package com.tiedup.remake.dialogue; import com.tiedup.remake.personality.PersonalityType; -import org.jetbrains.annotations.Nullable; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; +import org.jetbrains.annotations.Nullable; /** * Context information for dialogue selection. diff --git a/src/main/java/com/tiedup/remake/dialogue/DialogueLoader.java b/src/main/java/com/tiedup/remake/dialogue/DialogueLoader.java index 1311f78..b357cc0 100644 --- a/src/main/java/com/tiedup/remake/dialogue/DialogueLoader.java +++ b/src/main/java/com/tiedup/remake/dialogue/DialogueLoader.java @@ -15,10 +15,10 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; -import org.jetbrains.annotations.Nullable; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.resources.Resource; import net.minecraft.server.packs.resources.ResourceManager; +import org.jetbrains.annotations.Nullable; /** * Loads dialogue entries from JSON files. @@ -55,12 +55,10 @@ public class DialogueLoader { "fear", "reaction", "environment", - // Phase 12: New dialogue categories "discipline", "home", "leash", "resentment", - // Phase 14: Personality hints and conversations "personality", "conversation", // Master NPC dialogues diff --git a/src/main/java/com/tiedup/remake/dialogue/DialogueManager.java b/src/main/java/com/tiedup/remake/dialogue/DialogueManager.java index f4d258d..c63c752 100644 --- a/src/main/java/com/tiedup/remake/dialogue/DialogueManager.java +++ b/src/main/java/com/tiedup/remake/dialogue/DialogueManager.java @@ -7,8 +7,8 @@ import java.util.EnumMap; import java.util.List; import java.util.Map; import java.util.Random; -import org.jetbrains.annotations.Nullable; import net.minecraft.server.packs.resources.ResourceManager; +import org.jetbrains.annotations.Nullable; /** * Central manager for the data-driven dialogue system. diff --git a/src/main/java/com/tiedup/remake/dialogue/DialogueTriggerSystem.java b/src/main/java/com/tiedup/remake/dialogue/DialogueTriggerSystem.java index 166200c..41fbbd0 100644 --- a/src/main/java/com/tiedup/remake/dialogue/DialogueTriggerSystem.java +++ b/src/main/java/com/tiedup/remake/dialogue/DialogueTriggerSystem.java @@ -4,14 +4,14 @@ import com.tiedup.remake.entities.EntityDamsel; import com.tiedup.remake.personality.NpcCommand; import com.tiedup.remake.personality.NpcNeeds; import com.tiedup.remake.personality.PersonalityState; -import org.jetbrains.annotations.Nullable; import net.minecraft.world.entity.player.Player; +import org.jetbrains.annotations.Nullable; /** * System for selecting proactive dialogues based on NPC state. * Makes NPCs feel alive by having them speak about their needs, mood, and environment. * - * Personality System Phase 4: Living NPCs + * Personality System Living NPCs */ public class DialogueTriggerSystem { diff --git a/src/main/java/com/tiedup/remake/dialogue/EntityDialogueManager.java b/src/main/java/com/tiedup/remake/dialogue/EntityDialogueManager.java index acc5e40..22cab1b 100644 --- a/src/main/java/com/tiedup/remake/dialogue/EntityDialogueManager.java +++ b/src/main/java/com/tiedup/remake/dialogue/EntityDialogueManager.java @@ -10,7 +10,6 @@ import net.minecraft.world.entity.player.Player; /** * Complete dialogue system for EntityDamsel and EntityKidnapper. * - * Phase 14.3: Centralized NPC dialogue management * * Features: * - Multiple dialogue variants per action category @@ -21,9 +20,7 @@ import net.minecraft.world.entity.player.Player; */ public class EntityDialogueManager { - // ======================================== // DIALOGUE CATEGORIES - // ======================================== /** * Dialogue categories for different NPC actions. @@ -110,9 +107,7 @@ public class EntityDialogueManager { PERSONALITY_HINT_SADIST, // Hint for SADIST personality (kidnappers) } - // ======================================== // DIALOGUE RETRIEVAL (Data-Driven Only) - // ======================================== /** * Get random dialogue for a category using the data-driven system. @@ -183,9 +178,7 @@ public class EntityDialogueManager { return getDialogue(category); } - // ======================================== // MESSAGE SENDING METHODS - // ======================================== /** * Send a dialogue message to a specific player. @@ -416,9 +409,7 @@ public class EntityDialogueManager { } } - // ======================================== // CONVENIENCE METHODS - // ======================================== /** * Make entity say something to their target (if player). @@ -472,9 +463,7 @@ public class EntityDialogueManager { } } - // ======================================== // COMPOUND MESSAGES - // ======================================== /** * Get a dialogue for job assignment with item name. @@ -547,9 +536,7 @@ public class EntityDialogueManager { ); } - // ======================================== // PERSONALITY SYSTEM HELPERS - // ======================================== /** * Get personality hint dialogue based on personality type name. diff --git a/src/main/java/com/tiedup/remake/dialogue/GagTalkManager.java b/src/main/java/com/tiedup/remake/dialogue/GagTalkManager.java index 0d732ce..b822fa5 100644 --- a/src/main/java/com/tiedup/remake/dialogue/GagTalkManager.java +++ b/src/main/java/com/tiedup/remake/dialogue/GagTalkManager.java @@ -18,7 +18,6 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; /** - * Phase 16: GagTalk System V4 - Realistic phonetic transformation * *

Features: *

    @@ -415,9 +414,7 @@ public class GagTalkManager { }; } - // ======================================== // SUFFOCATION & CRITICAL FAILURE HELPERS - // ======================================== /** * Apply suffocation effects if message is too long. @@ -490,9 +487,7 @@ public class GagTalkManager { return null; } - // ======================================== // MCA INTEGRATION METHODS - // ======================================== /** * Transform a message to gagged speech without side effects. diff --git a/src/main/java/com/tiedup/remake/dialogue/IDialogueSpeaker.java b/src/main/java/com/tiedup/remake/dialogue/IDialogueSpeaker.java index 59125db..5bf3a16 100644 --- a/src/main/java/com/tiedup/remake/dialogue/IDialogueSpeaker.java +++ b/src/main/java/com/tiedup/remake/dialogue/IDialogueSpeaker.java @@ -1,9 +1,9 @@ package com.tiedup.remake.dialogue; import com.tiedup.remake.personality.PersonalityType; -import org.jetbrains.annotations.Nullable; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; +import org.jetbrains.annotations.Nullable; /** * Interface for entities that can speak dialogue. diff --git a/src/main/java/com/tiedup/remake/dialogue/KidnapperDialogueTriggerSystem.java b/src/main/java/com/tiedup/remake/dialogue/KidnapperDialogueTriggerSystem.java index e727831..4283331 100644 --- a/src/main/java/com/tiedup/remake/dialogue/KidnapperDialogueTriggerSystem.java +++ b/src/main/java/com/tiedup/remake/dialogue/KidnapperDialogueTriggerSystem.java @@ -2,8 +2,8 @@ package com.tiedup.remake.dialogue; import com.tiedup.remake.entities.EntityKidnapper; import com.tiedup.remake.entities.ai.kidnapper.KidnapperState; -import org.jetbrains.annotations.Nullable; import net.minecraft.world.entity.player.Player; +import org.jetbrains.annotations.Nullable; /** * Proactive dialogue trigger system for Kidnappers. diff --git a/src/main/java/com/tiedup/remake/dialogue/conversation/ConversationManager.java b/src/main/java/com/tiedup/remake/dialogue/conversation/ConversationManager.java index df2b27a..2f3883a 100644 --- a/src/main/java/com/tiedup/remake/dialogue/conversation/ConversationManager.java +++ b/src/main/java/com/tiedup/remake/dialogue/conversation/ConversationManager.java @@ -16,18 +16,17 @@ import java.util.Map; import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; -import org.jetbrains.annotations.Nullable; import net.minecraft.resources.ResourceKey; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; /** * Manages interactive conversations between players and NPCs. * Handles topic availability, dialogue retrieval, conversation state, * cooldowns, refusals, and topic effects. * - * Phase 5: Enhanced Conversation System */ public class ConversationManager { @@ -344,7 +343,10 @@ public class ConversationManager { } // Apply effects for action topics - if (speaker.asEntity() instanceof EntityDamsel damsel && NpcTypeHelper.isDamselOnly(speaker.asEntity())) { + if ( + speaker.asEntity() instanceof EntityDamsel damsel && + NpcTypeHelper.isDamselOnly(speaker.asEntity()) + ) { applyTopicEffects(damsel, player, topic); } diff --git a/src/main/java/com/tiedup/remake/dialogue/conversation/ConversationRefusalReason.java b/src/main/java/com/tiedup/remake/dialogue/conversation/ConversationRefusalReason.java index 96e996d..87a0526 100644 --- a/src/main/java/com/tiedup/remake/dialogue/conversation/ConversationRefusalReason.java +++ b/src/main/java/com/tiedup/remake/dialogue/conversation/ConversationRefusalReason.java @@ -4,7 +4,6 @@ package com.tiedup.remake.dialogue.conversation; * Reasons why an NPC might refuse to engage in conversation. * Each reason has a corresponding dialogue ID for personality-specific responses. * - * Phase 5: Enhanced Conversation System */ public enum ConversationRefusalReason { /** No refusal - NPC will talk */ diff --git a/src/main/java/com/tiedup/remake/dialogue/conversation/ConversationTopic.java b/src/main/java/com/tiedup/remake/dialogue/conversation/ConversationTopic.java index 1d2f630..f126836 100644 --- a/src/main/java/com/tiedup/remake/dialogue/conversation/ConversationTopic.java +++ b/src/main/java/com/tiedup/remake/dialogue/conversation/ConversationTopic.java @@ -9,7 +9,6 @@ import java.util.Set; * Simplified conversation topics for interactive dialogue. * 8 core topics with significant effects, organized in 2 categories. * - * Phase 5: Enhanced Conversation System */ public enum ConversationTopic { // === ACTIONS (Always visible) === diff --git a/src/main/java/com/tiedup/remake/dialogue/conversation/PetRequestManager.java b/src/main/java/com/tiedup/remake/dialogue/conversation/PetRequestManager.java index 1d88830..85c0770 100644 --- a/src/main/java/com/tiedup/remake/dialogue/conversation/PetRequestManager.java +++ b/src/main/java/com/tiedup/remake/dialogue/conversation/PetRequestManager.java @@ -1,7 +1,6 @@ package com.tiedup.remake.dialogue.conversation; import com.tiedup.remake.core.TiedUpMod; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.dialogue.DialogueBridge; import com.tiedup.remake.entities.EntityMaster; import com.tiedup.remake.entities.ai.master.MasterPlaceBlockGoal; @@ -11,6 +10,7 @@ import com.tiedup.remake.items.base.BindVariant; import com.tiedup.remake.network.ModNetwork; import com.tiedup.remake.network.master.PacketOpenPetRequestMenu; import com.tiedup.remake.state.PlayerBindState; +import com.tiedup.remake.v2.BodyRegionV2; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; @@ -58,10 +58,7 @@ public class PetRequestManager { // Send packet to open GUI on client ModNetwork.sendToPlayer( - new PacketOpenPetRequestMenu( - master.getId(), - master.getNpcName() - ), + new PacketOpenPetRequestMenu(master.getId(), master.getNpcName()), pet ); diff --git a/src/main/java/com/tiedup/remake/dialogue/conversation/TopicEffect.java b/src/main/java/com/tiedup/remake/dialogue/conversation/TopicEffect.java index 7a46002..1e51018 100644 --- a/src/main/java/com/tiedup/remake/dialogue/conversation/TopicEffect.java +++ b/src/main/java/com/tiedup/remake/dialogue/conversation/TopicEffect.java @@ -6,7 +6,6 @@ import com.tiedup.remake.personality.PersonalityType; * Represents the effects of a conversation topic on an NPC's state. * Effects are applied with personality modifiers. * - * Phase 5: Enhanced Conversation System */ public record TopicEffect( /** Mood change (-20 to +20) */ diff --git a/src/main/java/com/tiedup/remake/dispenser/ClothesDispenseBehavior.java b/src/main/java/com/tiedup/remake/dispenser/ClothesDispenseBehavior.java index 4e1a1d5..768a1eb 100644 --- a/src/main/java/com/tiedup/remake/dispenser/ClothesDispenseBehavior.java +++ b/src/main/java/com/tiedup/remake/dispenser/ClothesDispenseBehavior.java @@ -1,8 +1,8 @@ package com.tiedup.remake.dispenser; import com.tiedup.remake.items.clothes.GenericClothes; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.state.IBondageState; +import com.tiedup.remake.v2.BodyRegionV2; import net.minecraft.world.item.ItemStack; /** diff --git a/src/main/java/com/tiedup/remake/dispenser/GenericBondageDispenseBehavior.java b/src/main/java/com/tiedup/remake/dispenser/GenericBondageDispenseBehavior.java index 1df9ef6..c97b45a 100644 --- a/src/main/java/com/tiedup/remake/dispenser/GenericBondageDispenseBehavior.java +++ b/src/main/java/com/tiedup/remake/dispenser/GenericBondageDispenseBehavior.java @@ -49,9 +49,7 @@ public class GenericBondageDispenseBehavior } } - // ======================================== // Factory Methods - // ======================================== public static GenericBondageDispenseBehavior forBind() { return new GenericBondageDispenseBehavior( diff --git a/src/main/java/com/tiedup/remake/entities/AbstractTiedUpNpc.java b/src/main/java/com/tiedup/remake/entities/AbstractTiedUpNpc.java index c6da331..ded0b0d 100644 --- a/src/main/java/com/tiedup/remake/entities/AbstractTiedUpNpc.java +++ b/src/main/java/com/tiedup/remake/entities/AbstractTiedUpNpc.java @@ -5,14 +5,14 @@ import com.tiedup.remake.entities.damsel.components.*; import com.tiedup.remake.entities.skins.Gender; import com.tiedup.remake.items.base.ILockable; import com.tiedup.remake.items.base.ItemCollar; +import com.tiedup.remake.state.ICaptor; import com.tiedup.remake.state.IRestrainable; import com.tiedup.remake.state.IRestrainableEntity; -import com.tiedup.remake.state.ICaptor; import com.tiedup.remake.util.tasks.ItemTask; import com.tiedup.remake.util.teleport.Position; import com.tiedup.remake.util.teleport.TeleportHelper; -import com.tiedup.remake.v2.bondage.IV2BondageEquipment; import com.tiedup.remake.v2.BodyRegionV2; +import com.tiedup.remake.v2.bondage.IV2BondageEquipment; import com.tiedup.remake.v2.bondage.IV2EquipmentHolder; import dev.kosmx.playerAnim.api.layered.AnimationStack; import dev.kosmx.playerAnim.api.layered.IAnimation; @@ -35,7 +35,6 @@ import net.minecraft.world.level.Level; /** * AbstractTiedUpNpc - Base class for all TiedUp! humanoid NPCs. * - * Phase 3 of anti-spaghetti audit: Extracts shared NPC functionality from EntityDamsel * so that EntityKidnapper can extend this directly (instead of incorrectly extending EntityDamsel). * *

    Shared functionality:

    @@ -73,9 +72,7 @@ public abstract class AbstractTiedUpNpc IV2EquipmentHolder { - // ======================================== // DATA SYNC (Client-Server) - Shared across all NPC types - // ======================================== /** * NPC's custom name. @@ -168,9 +165,7 @@ public abstract class AbstractTiedUpNpc EntityDataSerializers.ITEM_STACK ); - // ======================================== // COMPONENTS (shared across all NPC types) - // ======================================== /** * Manages inventory, equipment, and feeding. @@ -198,11 +193,12 @@ public abstract class AbstractTiedUpNpc */ private DamselAnimationController animationController; - // ======================================== // CONSTRUCTOR - // ======================================== - public AbstractTiedUpNpc(EntityType type, Level level) { + public AbstractTiedUpNpc( + EntityType type, + Level level + ) { super(type, level); this.setCanPickUpLoot(false); @@ -263,9 +259,7 @@ public abstract class AbstractTiedUpNpc return new com.tiedup.remake.entities.damsel.hosts.AnimationHost(this); } - // ======================================== // ABSTRACT METHODS - Subclasses must implement - // ======================================== /** * Get the skin texture for this entity. @@ -288,9 +282,7 @@ public abstract class AbstractTiedUpNpc @Override public abstract com.tiedup.remake.dialogue.SpeakerType getSpeakerType(); - // ======================================== // ENTITY INITIALIZATION - // ======================================== @Override protected void defineSynchedData() { @@ -313,16 +305,18 @@ public abstract class AbstractTiedUpNpc super.onSyncedDataUpdated(key); // Epic 4B: Deserialize V2 equipment on client when synced data changes if (DATA_V2_EQUIPMENT.equals(key)) { - if (this.v2Equipment != null && this.level() != null && this.level().isClientSide) { + if ( + this.v2Equipment != null && + this.level() != null && + this.level().isClientSide + ) { CompoundTag tag = this.entityData.get(DATA_V2_EQUIPMENT); this.v2Equipment.deserializeNBT(tag); } } } - // ======================================== // DESPAWN PROTECTION - // ======================================== /** * Prevent NPCs from despawning. @@ -347,9 +341,7 @@ public abstract class AbstractTiedUpNpc return true; // Always save to disk } - // ======================================== // TICK - PERIODIC UPDATES - // ======================================== @Override public void tick() { @@ -385,9 +377,7 @@ public abstract class AbstractTiedUpNpc // Default: no-op } - // ======================================== // BEHAVIORAL FLAGS (overridable by subclasses) - // ======================================== /** * Check if this entity can call for help when captured. @@ -409,9 +399,7 @@ public abstract class AbstractTiedUpNpc return true; } - // ======================================== // POSE STATE - // ======================================== /** * Check if NPC is currently sitting. @@ -496,9 +484,7 @@ public abstract class AbstractTiedUpNpc this.entityData.set(DATA_STRUGGLING, struggling); } - // ======================================== // NAME SYSTEM - // ======================================== /** * Get NPC's custom name. @@ -534,9 +520,7 @@ public abstract class AbstractTiedUpNpc setNpcName(name); } - // ======================================== // GENDER / SLIM ARMS - // ======================================== /** * Check if this NPC uses slim arms model. @@ -567,9 +551,7 @@ public abstract class AbstractTiedUpNpc return Gender.fromName(this.entityData.get(DATA_GENDER)); } - // ======================================== // EQUIPMENT SLOTS (Delegated to DamselInventoryManager) - // ======================================== @Override public ItemStack getItemBySlot(EquipmentSlot slot) { @@ -601,9 +583,7 @@ public abstract class AbstractTiedUpNpc this.inventoryManager.setMainHandItem(stack); } - // ======================================== // IRestrainable - BONDAGE STATE QUERIES (Delegated to DamselBondageManager) - // ======================================== @Override public boolean isTiedUp() { @@ -652,9 +632,7 @@ public abstract class AbstractTiedUpNpc return bondageManager.isBoundAndGagged(); } - // ======================================== // V2 Region-Based Equipment Access (Delegated to DamselBondageManager) - // ======================================== @Override public ItemStack getEquipment(BodyRegionV2 region) { @@ -666,9 +644,7 @@ public abstract class AbstractTiedUpNpc bondageManager.equip(region, stack); } - // ======================================== // IRestrainable - EQUIPMENT UNEQUIP (Delegated to DamselBondageManager) - // ======================================== @Override public ItemStack unequip(BodyRegionV2 region) { @@ -680,9 +656,7 @@ public abstract class AbstractTiedUpNpc return bondageManager.forceUnequip(region); } - // ======================================== // IRestrainable - ENSLAVEMENT - // ======================================== @Override public boolean isCaptive() { @@ -743,9 +717,7 @@ public abstract class AbstractTiedUpNpc bondageManager.free(transportState); } - // ======================================== // IRestrainable - UTILITY (Delegated to DamselBondageManager) - // ======================================== @Override public UUID getKidnappedUniqueId() { @@ -767,9 +739,7 @@ public abstract class AbstractTiedUpNpc bondageManager.kidnappedDropItem(stack); } - // ======================================== // IRestrainable - STATE QUERIES (Advanced) (Delegated to DamselBondageManager) - // ======================================== @Override public boolean canBeTiedUp() { @@ -853,18 +823,18 @@ public abstract class AbstractTiedUpNpc return false; } - // ======================================== // IRestrainable - REPLACE (Delegated to DamselBondageManager) - // ======================================== @Override - public ItemStack replaceEquipment(BodyRegionV2 region, ItemStack newStack, boolean force) { + public ItemStack replaceEquipment( + BodyRegionV2 region, + ItemStack newStack, + boolean force + ) { return bondageManager.replaceEquipment(region, newStack, force); } - // ======================================== // IRestrainable - BULK OPERATIONS (Delegated to DamselBondageManager) - // ======================================== @Override public void applyBondage( @@ -875,7 +845,14 @@ public abstract class AbstractTiedUpNpc ItemStack collar, ItemStack clothes ) { - bondageManager.applyBondage(bind, gag, blindfold, earplugs, collar, clothes); + bondageManager.applyBondage( + bind, + gag, + blindfold, + earplugs, + collar, + clothes + ); } @Override @@ -903,8 +880,15 @@ public abstract class AbstractTiedUpNpc boolean dropCollar, boolean dropClothes ) { - bondageManager.dropBondageItems(drop, dropBind, dropGag, dropBlindfold, - dropEarplugs, dropCollar, dropClothes); + bondageManager.dropBondageItems( + drop, + dropBind, + dropGag, + dropBlindfold, + dropEarplugs, + dropCollar, + dropClothes + ); } @Override @@ -917,9 +901,7 @@ public abstract class AbstractTiedUpNpc return bondageManager.getBondageItemsWhichCanBeRemovedCount(); } - // ======================================== // IRestrainable - PERMISSIONS (Delegated to DamselBondageManager) - // ======================================== @Override public boolean canTakeOffClothes(Player player) { @@ -936,9 +918,7 @@ public abstract class AbstractTiedUpNpc return bondageManager.canChangeClothes(); } - // ======================================== // IRestrainable - SPECIAL INTERACTIONS (Delegated to DamselBondageManager) - // ======================================== @Override public void tighten(Player tightener) { @@ -965,18 +945,14 @@ public abstract class AbstractTiedUpNpc bondageManager.takeBondageItemBy(taker, slotIndex); } - // ======================================== // IRestrainable - CAPTIVITY TRANSFER (Delegated to DamselBondageManager) - // ======================================== @Override public void transferCaptivityTo(ICaptor newCaptor) { bondageManager.transferCaptivityTo(newCaptor); } - // ======================================== // IRestrainable - METADATA - // ======================================== @Override public String getNameFromCollar() { @@ -998,9 +974,7 @@ public abstract class AbstractTiedUpNpc return null; } - // ======================================== // IRestrainable - TELEPORT / DEATH - // ======================================== @Override public void teleportToPosition(Position position) { @@ -1091,9 +1065,7 @@ public abstract class AbstractTiedUpNpc } } - // ======================================== // IV2EquipmentHolder IMPLEMENTATION (Epic 4B) - // ======================================== @Override public IV2BondageEquipment getV2Equipment() { @@ -1113,9 +1085,7 @@ public abstract class AbstractTiedUpNpc syncV2Equipment(); } - // ======================================== // SHOCK COLLAR CHECK - // ======================================== /** * Check if this NPC has a shock collar equipped. @@ -1131,9 +1101,7 @@ public abstract class AbstractTiedUpNpc ); } - // ======================================== // BONDAGE SERVICE (delegated to BondageManager) - // ======================================== /** * Check if bondage service is enabled for this NPC. @@ -1149,9 +1117,7 @@ public abstract class AbstractTiedUpNpc return bondageManager.getBondageServiceMessage(); } - // ======================================== // COMPONENT ACCESSORS - // ======================================== /** * Get inventory manager component. @@ -1174,9 +1140,7 @@ public abstract class AbstractTiedUpNpc return animationController; } - // ======================================== // LEASH ATTACHMENT POINT - // ======================================== /** * Override leash offset to attach at neck level instead of eye level. @@ -1193,9 +1157,7 @@ public abstract class AbstractTiedUpNpc ); } - // ======================================== // IANIMATEDPLAYER INTERFACE (PlayerAnimator) - // ======================================== /** * Get the animation stack for this entity. @@ -1249,9 +1211,7 @@ public abstract class AbstractTiedUpNpc return animationController.playerAnimator_setAnimation(id, animation); } - // ======================================== // IDIALOGUESPEAKER PARTIAL IMPLEMENTATION - // ======================================== /** * Get the name displayed in dialogue chat messages. @@ -1277,9 +1237,7 @@ public abstract class AbstractTiedUpNpc return isGagged(); } - // ======================================== // NBT PERSISTENCE (shared portion) - // ======================================== /** * Save shared NPC data to NBT. diff --git a/src/main/java/com/tiedup/remake/entities/BondageServiceHandler.java b/src/main/java/com/tiedup/remake/entities/BondageServiceHandler.java index fb63f3c..689871b 100644 --- a/src/main/java/com/tiedup/remake/entities/BondageServiceHandler.java +++ b/src/main/java/com/tiedup/remake/entities/BondageServiceHandler.java @@ -1,7 +1,6 @@ package com.tiedup.remake.entities; import com.tiedup.remake.core.SystemMessageManager; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.items.ModItems; import com.tiedup.remake.items.base.BindVariant; import com.tiedup.remake.items.base.GagVariant; @@ -10,6 +9,7 @@ import com.tiedup.remake.state.PlayerBindState; import com.tiedup.remake.util.MessageDispatcher; import com.tiedup.remake.util.teleport.Position; import com.tiedup.remake.util.time.Timer; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.HashMap; import java.util.Map; import java.util.UUID; @@ -147,8 +147,14 @@ public class BondageServiceHandler { PlayerBindState state = PlayerBindState.getInstance(player); if (state != null) { // Apply bondage - state.equip(BodyRegionV2.ARMS, new ItemStack(ModItems.getBind(BindVariant.ROPES))); - state.equip(BodyRegionV2.MOUTH, new ItemStack(ModItems.getGag(GagVariant.BALL_GAG))); + state.equip( + BodyRegionV2.ARMS, + new ItemStack(ModItems.getBind(BindVariant.ROPES)) + ); + state.equip( + BodyRegionV2.MOUTH, + new ItemStack(ModItems.getGag(GagVariant.BALL_GAG)) + ); // Teleport to cell state.teleportToPosition(cellPosition); diff --git a/src/main/java/com/tiedup/remake/entities/DamselRewardTracker.java b/src/main/java/com/tiedup/remake/entities/DamselRewardTracker.java index 1957333..0bf8a97 100644 --- a/src/main/java/com/tiedup/remake/entities/DamselRewardTracker.java +++ b/src/main/java/com/tiedup/remake/entities/DamselRewardTracker.java @@ -4,13 +4,13 @@ import com.tiedup.remake.core.ModConfig; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.dialogue.EntityDialogueManager; import java.util.UUID; -import org.jetbrains.annotations.Nullable; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; +import org.jetbrains.annotations.Nullable; /** * Tracks savior and reward state for EntityDamsel. @@ -43,9 +43,7 @@ public class DamselRewardTracker { this.damsel = damsel; } - // ======================================== // SAVIOR GETTERS/SETTERS - // ======================================== /** * Set the player who rescued this damsel. @@ -76,9 +74,7 @@ public class DamselRewardTracker { return this.saviorUUID; } - // ======================================== // ANTI-ABUSE TRACKING - // ======================================== /** * Set the player who tied this damsel (for reward anti-abuse). @@ -113,9 +109,7 @@ public class DamselRewardTracker { this.tiedByUUID = null; } - // ======================================== // REWARD LOGIC - // ======================================== /** * Reward the player who rescued this damsel. @@ -196,9 +190,7 @@ public class DamselRewardTracker { ); } - // ======================================== // NBT PERSISTENCE - // ======================================== /** * Save reward tracker state to NBT. diff --git a/src/main/java/com/tiedup/remake/entities/DamselVariant.java b/src/main/java/com/tiedup/remake/entities/DamselVariant.java index 554831e..c8c17e3 100644 --- a/src/main/java/com/tiedup/remake/entities/DamselVariant.java +++ b/src/main/java/com/tiedup/remake/entities/DamselVariant.java @@ -7,7 +7,6 @@ import net.minecraft.resources.ResourceLocation; /** * Represents a damsel skin variant with metadata. * - * Phase 14.2: Modernized skin system for EntityDamsel * Simplified: All skins from damsel folder, no guest distinction. * * @param id Unique identifier (e.g., "dam_mob_1", "anastasia") diff --git a/src/main/java/com/tiedup/remake/entities/EntityDamsel.java b/src/main/java/com/tiedup/remake/entities/EntityDamsel.java index e46f2e9..790a3ac 100644 --- a/src/main/java/com/tiedup/remake/entities/EntityDamsel.java +++ b/src/main/java/com/tiedup/remake/entities/EntityDamsel.java @@ -1,13 +1,13 @@ package com.tiedup.remake.entities; import com.tiedup.remake.core.SettingsAccessor; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.entities.damsel.components.*; import com.tiedup.remake.entities.skins.DamselSkinManager; import com.tiedup.remake.entities.skins.Gender; import com.tiedup.remake.items.base.ItemCollar; import com.tiedup.remake.state.ICaptor; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.UUID; import javax.annotation.Nullable; import net.minecraft.ChatFormatting; @@ -28,7 +28,6 @@ import net.minecraft.world.level.Level; /** * EntityDamsel - Capturable female NPC with full bondage support. * - * Phase 3 audit: Now extends AbstractTiedUpNpc instead of PathfinderMob. * All shared NPC functionality (bondage, equipment, animation, pose, name, gender) * has been extracted to AbstractTiedUpNpc. * @@ -45,13 +44,10 @@ import net.minecraft.world.level.Level; */ public class EntityDamsel extends AbstractTiedUpNpc - implements - net.minecraft.world.MenuProvider + implements net.minecraft.world.MenuProvider { - // ======================================== // DAMSEL-SPECIFIC DATA SYNC - // ======================================== /** * Personality type name (e.g., "TIMID", "FIERCE"). @@ -73,46 +69,39 @@ public class EntityDamsel EntityDataSerializers.STRING ); - // ======================================== // DAMSEL-SPECIFIC COMPONENTS - // ======================================== /** * Manages visual appearance (variant, skin, gender, name, slim arms). - * Phase 1 component extraction. */ private final DamselAppearance appearance; /** * Manages all personality-related systems. - * Phase 6: Extracted from EntityDamsel (~700 lines) */ private DamselPersonalitySystem personalitySystem; /** * Manages all AI-related systems. - * Phase 5: Extracted from EntityDamsel (~450 lines) */ private DamselAIController aiController; /** * Manages all dialogue-related systems. - * Phase 4: Extracted from EntityDamsel (~180 lines) */ private DamselDialogueHandler dialogueHandler; /** * Orchestrates NBT serialization for all components. - * Phase 8: Final refactoring phase. */ private DamselDataSerializer serializer; /** Tracks savior and reward state */ - private final DamselRewardTracker rewardTracker = new DamselRewardTracker(this); + private final DamselRewardTracker rewardTracker = new DamselRewardTracker( + this + ); - // ======================================== // CONSTRUCTOR - // ======================================== @Override protected IBondageHost createBondageHost() { @@ -121,31 +110,26 @@ public class EntityDamsel public EntityDamsel(EntityType type, Level level) { super(type, level); - - // Phase 1: Initialize appearance component this.appearance = new DamselAppearance(this); - // Phase 6: Initialize personality component this.personalitySystem = new DamselPersonalitySystem( this, - new com.tiedup.remake.entities.damsel.hosts.PersonalityTickContextHost(this) + new com.tiedup.remake.entities.damsel.hosts.PersonalityTickContextHost( + this + ) ); - // Phase 5: Initialize AI controller component this.aiController = new DamselAIController( this, new com.tiedup.remake.entities.damsel.hosts.AIHost(this) ); - // Phase 3: Initialize animation controller component // (already done in AbstractTiedUpNpc constructor) - // Phase 4: Initialize dialogue handler component this.dialogueHandler = new DamselDialogueHandler( new com.tiedup.remake.entities.damsel.hosts.DialogueHost(this) ); - // Phase 8: Initialize data serializer this.serializer = new DamselDataSerializer(this); // CRITICAL: Register AI goals now that aiController is initialized @@ -153,9 +137,7 @@ public class EntityDamsel this.registerGoals(); } - // ======================================== // ENTITY INITIALIZATION - // ======================================== @Override protected void defineSynchedData() { @@ -168,7 +150,6 @@ public class EntityDamsel @Override public void onSyncedDataUpdated(EntityDataAccessor key) { super.onSyncedDataUpdated(key); - // Phase 1: Invalidate variant cache when variant ID changes (from server sync) if (DATA_VARIANT_ID.equals(key)) { this.appearance.invalidateVariantCache(); } @@ -178,13 +159,13 @@ public class EntityDamsel public void onAddedToWorld() { super.onAddedToWorld(); - // Phase 1: Server-side only: Select deterministic variant based on UUID on spawn if ( !this.level().isClientSide && this.appearance.getVariantId().isEmpty() ) { Gender preferredGender = SettingsAccessor.getPreferredSpawnGender( - this.level().getGameRules()); + this.level().getGameRules() + ); DamselVariant variant = DamselSkinManager.CORE.getVariantForEntity( this.getUUID(), @@ -209,7 +190,6 @@ public class EntityDamsel /** * Register all AI goals for this entity. - * Phase 5: Delegated to DamselAIController component. * * CRITICAL: This method is called by Mob constructor BEFORE our constructor finishes. * We must null-check aiController and defer goal registration until after initialization. @@ -245,9 +225,7 @@ public class EntityDamsel .add(Attributes.FOLLOW_RANGE, 60.0); } - // ======================================== // TICK (damsel-specific extensions) - // ======================================== /** * Damsel-specific tick logic. @@ -255,28 +233,20 @@ public class EntityDamsel */ @Override protected void tickSubclass() { - // Phase 5: Call for help when being led as captive aiController.tickCallForHelp(); - // Phase 5: Leash traction system (teleport if stuck) aiController.tickLeashTraction(); - // Phase 6: Personality system tick (needs decay, mood updates) personalitySystem.tickPersonality(); - // Phase 6: Idle dialogue system personalitySystem.tickIdleDialogue(); - // Phase 6: Approach detection (player enters radius) personalitySystem.tickApproachDetection(); - // Phase 6: Environmental dialogue (weather, time) personalitySystem.tickEnvironmentDialogue(); } - // ======================================== // VARIANT SYSTEM (Delegated to DamselAppearance) - // ======================================== @Nullable public DamselVariant getVariant() { @@ -291,19 +261,15 @@ public class EntityDamsel return this.appearance.getVariantId(); } - // ======================================== // SKIN TEXTURE (ISkinnedEntity implementation) - // ======================================== @Override public ResourceLocation getSkinTexture() { return this.appearance.getSkinTexture(); } - // ======================================== // NAME SYSTEM OVERRIDE // (DamselAppearance also sets custom name visible, delegate to it) - // ======================================== @Override public String getNpcName() { @@ -315,10 +281,8 @@ public class EntityDamsel this.appearance.setNpcName(name); } - // ======================================== // GENDER/SLIMARMS OVERRIDE // (DamselAppearance manages these for damsels) - // ======================================== @Override public boolean hasSlimArms() { @@ -335,9 +299,7 @@ public class EntityDamsel return this.appearance.getGender(); } - // ======================================== // COMPONENT ACCESSORS - // ======================================== public DamselAppearance getAppearance() { return appearance; @@ -351,9 +313,7 @@ public class EntityDamsel return rewardTracker; } - // ======================================== // NBT PERSISTENCE (damsel-specific) - // ======================================== @Override public void addAdditionalSaveData(CompoundTag tag) { @@ -367,9 +327,7 @@ public class EntityDamsel serializer.load(tag); } - // ======================================== // BONDAGE SERVICE OVERRIDES - // ======================================== /** * Override hurt to intercept player attacks for bondage service. @@ -398,13 +356,13 @@ public class EntityDamsel return super.getDisplayName(); } - // ======================================== // DIALOGUE SYSTEM - // ======================================== public void talkTo(Player player, String message) { com.tiedup.remake.dialogue.EntityDialogueManager.talkTo( - this, player, message + this, + player, + message ); } @@ -413,13 +371,17 @@ public class EntityDamsel com.tiedup.remake.dialogue.EntityDialogueManager.DialogueCategory category ) { com.tiedup.remake.dialogue.EntityDialogueManager.talkTo( - this, player, category + this, + player, + category ); } public void actionTo(Player player, String action) { com.tiedup.remake.dialogue.EntityDialogueManager.actionTo( - this, player, action + this, + player, + action ); } @@ -428,13 +390,17 @@ public class EntityDamsel com.tiedup.remake.dialogue.EntityDialogueManager.DialogueCategory category ) { com.tiedup.remake.dialogue.EntityDialogueManager.actionTo( - this, player, category + this, + player, + category ); } public void talkToPlayersInRadius(String message, int radius) { com.tiedup.remake.dialogue.EntityDialogueManager.talkToNearby( - this, message, radius + this, + message, + radius ); } @@ -443,7 +409,9 @@ public class EntityDamsel int radius ) { com.tiedup.remake.dialogue.EntityDialogueManager.talkToNearby( - this, category, radius + this, + category, + radius ); } @@ -451,12 +419,17 @@ public class EntityDamsel com.tiedup.remake.dialogue.EntityDialogueManager.DialogueCategory category, int radius ) { - return dialogueHandler.talkToPlayersInRadiusWithCooldown(category, radius); + return dialogueHandler.talkToPlayersInRadiusWithCooldown( + category, + radius + ); } public void actionToPlayersInRadius(String action, int radius) { com.tiedup.remake.dialogue.EntityDialogueManager.actionToNearby( - this, action, radius + this, + action, + radius ); } @@ -465,13 +438,13 @@ public class EntityDamsel int radius ) { com.tiedup.remake.dialogue.EntityDialogueManager.actionToNearby( - this, category, radius + this, + category, + radius ); } - // ======================================== // SAVIOR & REWARD SYSTEM - // ======================================== public void setSavior(@Nullable Player player) { rewardTracker.setSavior(player); @@ -507,9 +480,7 @@ public class EntityDamsel rewardTracker.rewardSavior(savior); } - // ======================================== // PERSONALITY SYSTEM ACCESS - // ======================================== @Nullable public com.tiedup.remake.personality.PersonalityState getPersonalityState() { @@ -536,9 +507,7 @@ public class EntityDamsel return personalitySystem.getActiveCommand(); } - // ======================================== // ANTI-FLEE SYSTEM - // ======================================== public long getLastWhipTime() { return personalitySystem.getLastWhipTime(); @@ -548,9 +517,7 @@ public class EntityDamsel personalitySystem.setLastWhipTime(time); } - // ======================================== // COMMAND SYSTEM - // ======================================== public boolean giveCommand( Player commander, @@ -564,7 +531,9 @@ public class EntityDamsel if (!collarItem.getOwners(collar).contains(commander.getUUID())) { if (!this.isGagged()) { com.tiedup.remake.dialogue.EntityDialogueManager.talkByDialogueId( - this, commander, "command.reject.not_master" + this, + commander, + "command.reject.not_master" ); } return false; @@ -573,14 +542,17 @@ public class EntityDamsel if (this.personalitySystem.getPersonalityState() != null) { if ( !this.personalitySystem.getPersonalityState().willObeyCommand( - commander, command + commander, + command ) ) { return false; } this.personalitySystem.getPersonalityState().setActiveCommand( - command, commander.getUUID(), targetPos + command, + commander.getUUID(), + targetPos ); personalitySystem.syncPersonalityData(); return true; @@ -600,7 +572,9 @@ public class EntityDamsel targetPos2 != null && this.personalitySystem.getPersonalityState() != null ) { - this.personalitySystem.getPersonalityState().setCommandTarget2(targetPos2); + this.personalitySystem.getPersonalityState().setCommandTarget2( + targetPos2 + ); personalitySystem.syncPersonalityData(); } return success; @@ -613,9 +587,7 @@ public class EntityDamsel } } - // ======================================== // NPC INVENTORY ACCESS - // ======================================== public net.minecraft.core.NonNullList getNpcInventory() { return this.getInventoryManager().getNpcInventory(); @@ -646,20 +618,17 @@ public class EntityDamsel ); } - // ======================================== // DIRECT FEEDING SYSTEM - // ======================================== public boolean feedByPlayer(Player player, ItemStack foodStack) { return this.getInventoryManager().feedByPlayer( - player, foodStack, + player, + foodStack, this.personalitySystem.getPersonalityState() ); } - // ======================================== // INTERACTION - // ======================================== @Override protected net.minecraft.world.InteractionResult mobInteract( @@ -671,7 +640,9 @@ public class EntityDamsel // Check if holding edible item if (heldItem.getItem().isEdible()) { if (!this.hasCollar()) { - if (player instanceof net.minecraft.server.level.ServerPlayer sp) { + if ( + player instanceof net.minecraft.server.level.ServerPlayer sp + ) { sp.displayClientMessage( Component.literal( "This NPC needs a collar before you can feed them." @@ -684,10 +655,14 @@ public class EntityDamsel ItemStack collar = this.getEquipment(BodyRegionV2.NECK); if (collar.getItem() instanceof ItemCollar collarItem) { if (!collarItem.isOwner(collar, player)) { - if (player instanceof net.minecraft.server.level.ServerPlayer sp) { + if ( + player instanceof + net.minecraft.server.level.ServerPlayer sp + ) { sp.displayClientMessage( - Component.literal("You don't own this NPC's collar.") - .withStyle(ChatFormatting.RED), + Component.literal( + "You don't own this NPC's collar." + ).withStyle(ChatFormatting.RED), true ); } @@ -696,10 +671,13 @@ public class EntityDamsel if (this.feedByPlayer(player, heldItem)) { return net.minecraft.world.InteractionResult.SUCCESS; } - if (player instanceof net.minecraft.server.level.ServerPlayer sp) { + if ( + player instanceof net.minecraft.server.level.ServerPlayer sp + ) { sp.displayClientMessage( - Component.literal("This NPC can't eat that right now.") - .withStyle(ChatFormatting.RED), + Component.literal( + "This NPC can't eat that right now." + ).withStyle(ChatFormatting.RED), true ); } @@ -718,11 +696,13 @@ public class EntityDamsel if (collar.getItem() instanceof ItemCollar collarItem) { if ( collarItem.isOwner(collar, player) && - player instanceof net.minecraft.server.level.ServerPlayer serverPlayer + player instanceof + net.minecraft.server.level.ServerPlayer serverPlayer ) { if ( com.tiedup.remake.dialogue.conversation.ConversationManager.openConversation( - this, serverPlayer + this, + serverPlayer ) ) { return net.minecraft.world.InteractionResult.SUCCESS; @@ -751,9 +731,7 @@ public class EntityDamsel return super.mobInteract(player, hand); } - // ======================================== // MENU PROVIDER - // ======================================== @Override @javax.annotation.Nullable @@ -763,19 +741,20 @@ public class EntityDamsel Player player ) { return this.getInventoryManager().createMenu( - containerId, playerInventory, player + containerId, + playerInventory, + player ); } - // ======================================== // LIFECYCLE - DEATH - // ======================================== @Override public void die(DamageSource damageSource) { if ( !this.level().isClientSide && - this.level() instanceof net.minecraft.server.level.ServerLevel serverLevel + this.level() instanceof + net.minecraft.server.level.ServerLevel serverLevel ) { UUID uuid = this.getUUID(); @@ -785,14 +764,18 @@ public class EntityDamsel com.tiedup.remake.prison.PrisonerManager manager = com.tiedup.remake.prison.PrisonerManager.get(serverLevel); - com.tiedup.remake.prison.PrisonerState state = manager.getState(uuid); + com.tiedup.remake.prison.PrisonerState state = manager.getState( + uuid + ); if ( state == com.tiedup.remake.prison.PrisonerState.IMPRISONED || state == com.tiedup.remake.prison.PrisonerState.WORKING ) { com.tiedup.remake.prison.service.PrisonerService.get().escape( - serverLevel, uuid, "player_death" + serverLevel, + uuid, + "player_death" ); } @@ -804,9 +787,7 @@ public class EntityDamsel super.die(damageSource); } - // ======================================== // IDIALOGUESPEAKER - Personality-specific methods - // ======================================== @Override public com.tiedup.remake.dialogue.SpeakerType getSpeakerType() { diff --git a/src/main/java/com/tiedup/remake/entities/EntityDamselShiny.java b/src/main/java/com/tiedup/remake/entities/EntityDamselShiny.java index 1f579dd..cce0b24 100644 --- a/src/main/java/com/tiedup/remake/entities/EntityDamselShiny.java +++ b/src/main/java/com/tiedup/remake/entities/EntityDamselShiny.java @@ -20,7 +20,6 @@ import net.minecraft.world.level.Level; /** * Shiny Damsel - Rare, faster damsel variant. * - * Phase 1: Data-Driven Skin System - Shiny Damsels * * Differences from regular EntityDamsel: * - Much faster movement speed (0.35 vs 0.25) @@ -31,9 +30,7 @@ import net.minecraft.world.level.Level; */ public class EntityDamselShiny extends EntityDamsel { - // ======================================== // DATA SYNC - // ======================================== /** * Shiny variant name (for skin selection). @@ -44,16 +41,12 @@ public class EntityDamselShiny extends EntityDamsel { EntityDataSerializers.STRING ); - // ======================================== // STATE - // ======================================== @Nullable private DamselVariant shinyVariant; - // ======================================== // CONSTRUCTOR - // ======================================== public EntityDamselShiny( EntityType type, @@ -62,9 +55,7 @@ public class EntityDamselShiny extends EntityDamsel { super(type, level); } - // ======================================== // ATTRIBUTES - // ======================================== /** * Create shiny damsel attributes. @@ -77,9 +68,7 @@ public class EntityDamselShiny extends EntityDamsel { .add(Attributes.KNOCKBACK_RESISTANCE, 0.1); } - // ======================================== // DATA SYNC - // ======================================== @Override protected void defineSynchedData() { @@ -96,9 +85,7 @@ public class EntityDamselShiny extends EntityDamsel { } } - // ======================================== // INITIALIZATION - // ======================================== @Override public void onAddedToWorld() { @@ -109,7 +96,8 @@ public class EntityDamselShiny extends EntityDamsel { !this.level().isClientSide && this.getShinyVariantName().isEmpty() ) { Gender preferredGender = SettingsAccessor.getPreferredSpawnGender( - this.level().getGameRules()); + this.level().getGameRules() + ); DamselVariant variant = ShinyDamselSkinManager.CORE.getVariantForEntity( @@ -125,9 +113,7 @@ public class EntityDamselShiny extends EntityDamsel { } } - // ======================================== // SHINY VARIANT - // ======================================== /** * Get current shiny variant. @@ -216,9 +202,7 @@ public class EntityDamselShiny extends EntityDamsel { ); } - // ======================================== // DISPLAY - // ======================================== @Override public Component getDisplayName() { @@ -239,9 +223,7 @@ public class EntityDamselShiny extends EntityDamsel { return result; } - // ======================================== // OVERRIDES - // ======================================== /** * Shiny damsels don't use the standard variant system. @@ -253,9 +235,7 @@ public class EntityDamselShiny extends EntityDamsel { // Name is set in setShinyVariant() } - // ======================================== // NBT PERSISTENCE - // ======================================== @Override public void addAdditionalSaveData(net.minecraft.nbt.CompoundTag tag) { @@ -280,9 +260,7 @@ public class EntityDamselShiny extends EntityDamsel { } } - // ======================================== // PARTICLE EFFECTS - // ======================================== @Override public void tick() { diff --git a/src/main/java/com/tiedup/remake/entities/EntityKidnapBomb.java b/src/main/java/com/tiedup/remake/entities/EntityKidnapBomb.java index f77d86f..bb651b1 100644 --- a/src/main/java/com/tiedup/remake/entities/EntityKidnapBomb.java +++ b/src/main/java/com/tiedup/remake/entities/EntityKidnapBomb.java @@ -2,8 +2,8 @@ package com.tiedup.remake.entities; import com.tiedup.remake.blocks.entity.KidnapBombBlockEntity; import com.tiedup.remake.core.ModConfig; -import com.tiedup.remake.util.KidnapExplosion; import com.tiedup.remake.core.SettingsAccessor; +import com.tiedup.remake.util.KidnapExplosion; import javax.annotation.Nullable; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; @@ -18,7 +18,6 @@ import net.minecraft.world.level.Level; /** * Kidnap Bomb Entity - Primed TNT that applies bondage on explosion. * - * Phase 16: Blocks * * When the fuse runs out, instead of a destructive explosion, * it applies stored bondage items to all entities in radius. @@ -155,9 +154,7 @@ public class EntityKidnapBomb extends PrimedTnt { ); } - // ======================================== // NBT SERIALIZATION - // ======================================== @Override protected void addAdditionalSaveData(CompoundTag tag) { diff --git a/src/main/java/com/tiedup/remake/entities/EntityKidnapper.java b/src/main/java/com/tiedup/remake/entities/EntityKidnapper.java index d4f2fc1..21d8129 100644 --- a/src/main/java/com/tiedup/remake/entities/EntityKidnapper.java +++ b/src/main/java/com/tiedup/remake/entities/EntityKidnapper.java @@ -1,7 +1,6 @@ package com.tiedup.remake.entities; import com.tiedup.remake.cells.CellDataV2; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.cells.CellRegistryV2; import com.tiedup.remake.core.SettingsAccessor; import com.tiedup.remake.core.TiedUpMod; @@ -16,12 +15,13 @@ import com.tiedup.remake.items.ModItems; import com.tiedup.remake.items.base.ItemCollar; import com.tiedup.remake.personality.PersonalityType; import com.tiedup.remake.state.IBondageState; -import com.tiedup.remake.state.IRestrainable; import com.tiedup.remake.state.ICaptor; +import com.tiedup.remake.state.IRestrainable; import com.tiedup.remake.util.KidnappedHelper; import com.tiedup.remake.util.tasks.ItemTask; import com.tiedup.remake.util.tasks.SaleLoader; import com.tiedup.remake.util.teleport.Position; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -49,7 +49,6 @@ import net.minecraft.world.phys.AABB; /** * EntityKidnapper - Aggressive NPC that captures and enslaves players. * - * Phase 14.3: Modern implementation for 1.20.1 * Based on original EntityKidnapper.java (~700 lines) * *

    Key Differences from EntityDamsel:

    @@ -88,9 +87,7 @@ public class EntityKidnapper implements ICaptor, IDialogueSpeaker { - // ======================================== // CAPTIVE PRIORITY (for prisoner replacement) - // ======================================== /** * Priority levels for captives when replacing prisoners in cells. @@ -132,12 +129,9 @@ public class EntityKidnapper } } - // ======================================== // DATA SYNC (Client-Server) - // ======================================== /** - * Phase 17: Whether kidnapper currently has a captive. * Synced to client for rendering (e.g., holding leash). */ private static final EntityDataAccessor DATA_HAS_CAPTIVE = @@ -186,9 +180,7 @@ public class EntityKidnapper EntityDataSerializers.STRING ); - // ======================================== // SERVER-SIDE STATE - // ======================================== /** Appearance manager for skin variants, themes, and item selection. */ private final com.tiedup.remake.entities.kidnapper.components.KidnapperAppearance appearance; @@ -248,13 +240,9 @@ public class EntityKidnapper /** Data serializer for NBT persistence. */ private final com.tiedup.remake.entities.kidnapper.components.KidnapperDataSerializer dataSerializer; - // ======================================== - // AI STATE SYSTEM (Phase 3) - // ======================================== + // AI STATE SYSTEM - // ======================================== // ABSTRACT METHOD IMPLEMENTATIONS (from AbstractTiedUpNpc) - // ======================================== @Override protected com.tiedup.remake.entities.damsel.components.IBondageHost createBondageHost() { @@ -268,9 +256,7 @@ public class EntityKidnapper // contract but is not called for kidnappers. } - // ======================================== // CONSTRUCTOR - // ======================================== public EntityKidnapper( EntityType type, @@ -369,9 +355,7 @@ public class EntityKidnapper this.getNavigation().setMaxVisitedNodesMultiplier(2.0f); } - // ======================================== // ATTRIBUTES - // ======================================== /** * Create kidnapper attributes. @@ -387,14 +371,12 @@ public class EntityKidnapper .add(Attributes.ATTACK_DAMAGE, 6.0); // Default: 6.0 } - // ======================================== // DATA SYNC - // ======================================== @Override protected void defineSynchedData() { super.defineSynchedData(); - this.entityData.define(DATA_HAS_CAPTIVE, false); // Phase 17: renamed + this.entityData.define(DATA_HAS_CAPTIVE, false); this.entityData.define(DATA_KIDNAPPING_MODE, false); this.entityData.define(DATA_KIDNAPPER_VARIANT_ID, ""); this.entityData.define(DATA_THEME, ""); @@ -432,9 +414,7 @@ public class EntityKidnapper return appearance.getKidnapperVariantId(); } - // ======================================== // VARIANT SYSTEM - Virtual methods for subclasses - // ======================================== /** * Lookup a variant by ID from the appropriate skin manager. @@ -452,7 +432,8 @@ public class EntityKidnapper */ public KidnapperVariant computeVariantForEntity(UUID entityUUID) { Gender preferredGender = SettingsAccessor.getPreferredSpawnGender( - this.level() != null ? this.level().getGameRules() : null); + this.level() != null ? this.level().getGameRules() : null + ); return KidnapperSkinManager.CORE.getVariantForEntity( entityUUID, preferredGender @@ -567,9 +548,7 @@ public class EntityKidnapper } } - // ======================================== // AI GOALS - // ======================================== @Override protected void registerGoals() { @@ -588,9 +567,7 @@ public class EntityKidnapper aiManager.registerGoals(); } - // ======================================== // TICK - // ======================================== @Override protected void tickSubclass() { @@ -601,9 +578,7 @@ public class EntityKidnapper KidnapperDialogueTriggerSystem.tick(this, this.tickCount); } - // ======================================== - // I_KIDNAPPER IMPLEMENTATION (Phase 17: slave→captive) - // ======================================== + // I_KIDNAPPER IMPLEMENTATION (slave→captive) // C6-V2: ICaptor now takes IBondageState; KidnapperCaptiveManager still uses // IRestrainable internally (needed for ISaleable access in sale goals). @@ -612,26 +587,36 @@ public class EntityKidnapper @Override public void addCaptive(IBondageState captive) { - if (captive instanceof IRestrainable r) { captiveManager.addCaptive(r); } - else { logBridgeWarning("addCaptive", captive); } + if (captive instanceof IRestrainable r) { + captiveManager.addCaptive(r); + } else { + logBridgeWarning("addCaptive", captive); + } } @Override public void removeCaptive(IBondageState captive, boolean transportState) { - if (captive instanceof IRestrainable r) { captiveManager.removeCaptive(r, transportState); } - else { logBridgeWarning("removeCaptive", captive); } + if (captive instanceof IRestrainable r) { + captiveManager.removeCaptive(r, transportState); + } else { + logBridgeWarning("removeCaptive", captive); + } } @Override public boolean canCapture(IBondageState captive) { - if (captive instanceof IRestrainable r) return captiveManager.canCapture(r); + if ( + captive instanceof IRestrainable r + ) return captiveManager.canCapture(r); logBridgeWarning("canCapture", captive); return false; } @Override public boolean canRelease(IBondageState captive) { - if (captive instanceof IRestrainable r) return captiveManager.canRelease(r); + if ( + captive instanceof IRestrainable r + ) return captiveManager.canRelease(r); logBridgeWarning("canRelease", captive); return false; } @@ -648,24 +633,37 @@ public class EntityKidnapper @Override public void onCaptiveLogout(IBondageState captive) { - if (captive instanceof IRestrainable r) { captiveManager.onCaptiveLogout(r); } - else { logBridgeWarning("onCaptiveLogout", captive); } + if (captive instanceof IRestrainable r) { + captiveManager.onCaptiveLogout(r); + } else { + logBridgeWarning("onCaptiveLogout", captive); + } } @Override public void onCaptiveReleased(IBondageState captive) { - if (captive instanceof IRestrainable r) { captiveManager.onCaptiveReleased(r); } - else { logBridgeWarning("onCaptiveReleased", captive); } + if (captive instanceof IRestrainable r) { + captiveManager.onCaptiveReleased(r); + } else { + logBridgeWarning("onCaptiveReleased", captive); + } } @Override public void onCaptiveStruggle(IBondageState captive) { - if (captive instanceof IRestrainable r) { captiveManager.onCaptiveStruggle(r); } - else { logBridgeWarning("onCaptiveStruggle", captive); } + if (captive instanceof IRestrainable r) { + captiveManager.onCaptiveStruggle(r); + } else { + logBridgeWarning("onCaptiveStruggle", captive); + } } private void logBridgeWarning(String method, IBondageState captive) { - TiedUpMod.LOGGER.error("[EntityKidnapper] {} called with non-IRestrainable: {}", method, captive.getClass().getSimpleName()); + TiedUpMod.LOGGER.error( + "[EntityKidnapper] {} called with non-IRestrainable: {}", + method, + captive.getClass().getSimpleName() + ); } @Override @@ -678,9 +676,7 @@ public class EntityKidnapper return captiveManager.getEntity(); } - // ======================================== // TARGET MANAGEMENT - // ======================================== /** * Get current hunt target. @@ -742,9 +738,7 @@ public class EntityKidnapper return targetSelector.getClosestSuitableTarget(radius); } - // ======================================== // KIDNAPPING MODE (Collar-based) - Delegates to KidnapperCollarConfig - // ======================================== /** * Check if kidnapping mode is enabled via collar. @@ -799,9 +793,7 @@ public class EntityKidnapper ); } - // ======================================== // CAPTURE MECHANICS - Delegates to KidnapperCaptureEquipment - // ======================================== /** * Get bind item to use for capture. @@ -864,12 +856,9 @@ public class EntityKidnapper captureEquipment.clearHeldItems(); } - // ======================================== - // CAPTIVE STATE (Phase 17: slave→captive) - // ======================================== + // CAPTIVE STATE (slave→captive) /** - * Phase 17: Get current captive. */ @Nullable public IRestrainable getCaptive() { @@ -877,15 +866,12 @@ public class EntityKidnapper } /** - * Phase 17: Transfer all captives to another captor. */ public void transferAllCaptivesTo(ICaptor newCaptor) { captiveManager.transferAllCaptivesTo(newCaptor); } - // ======================================== // OVERRIDES - // ======================================== @Override public void equip(BodyRegionV2 region, ItemStack stack) { @@ -933,7 +919,6 @@ public class EntityKidnapper } /** - * Phase 17: Override die() to free captives when kidnapper is killed. * This ensures players attached via leash are properly released. */ @Override @@ -1078,7 +1063,6 @@ public class EntityKidnapper } /** - * Phase 17: Override remove() to handle chunk unload gracefully. * Free captives when the NPC is removed from the world. */ @Override @@ -1091,9 +1075,7 @@ public class EntityKidnapper super.remove(reason); } - // ======================================== // CAPTURE TIMING (Overridable for Elite) - // ======================================== /** * Get the time in ticks to tie up a target. @@ -1115,9 +1097,7 @@ public class EntityKidnapper return 20; } - // ======================================== // JOB SYSTEM - Delegates to KidnapperJobManager - // ======================================== /** * Check if waiting for worker to complete job. @@ -1178,19 +1158,15 @@ public class EntityKidnapper jobManager.clearCurrentJob(); } - // ======================================== - // SALE SYSTEM (Phase 14.3.5, Phase 17: slave→captive) - // ======================================== + // SALE SYSTEM /** - * Phase 17: Check if currently selling captive. */ public boolean isSellingCaptive() { return saleManager.isSellingCaptive(); } /** - * Phase 17: Put current captive for sale at a random price. * Uses SaleLoader to get a random price. * Price is multiplied for valuable captives: * - Players: 2x base price @@ -1203,7 +1179,6 @@ public class EntityKidnapper } /** - * Phase 17: Put current captive for sale at a specific price. * * @param price The price to sell at * @return true if sale started successfully @@ -1219,9 +1194,7 @@ public class EntityKidnapper saleManager.cancelSale(); } - // ======================================== - // SOLO MODE FALLBACK (Phase 4) - // ======================================== + // SOLO MODE FALLBACK /** * Keep the captive when no buyers are available (solo mode). @@ -1241,7 +1214,6 @@ public class EntityKidnapper } /** - * Phase 17: Complete sale and transfer captive to buyer. * * @param buyer The ICaptor buying the captive * @return true if sale completed successfully @@ -1250,9 +1222,7 @@ public class EntityKidnapper return saleManager.completeSale(buyer); } - // ======================================== // GET OUT STATE - // ======================================== public boolean isGetOutState() { return this.getOutState; @@ -1276,9 +1246,7 @@ public class EntityKidnapper this.dogwalking = dogwalking; } - // ======================================== // NBT PERSISTENCE - // ======================================== @Override public void addAdditionalSaveData(CompoundTag tag) { @@ -1342,9 +1310,7 @@ public class EntityKidnapper } } - // ======================================== // ESCAPE TRACKING METHODS - // ======================================== /** * Called when a captive escapes from this kidnapper. @@ -1374,9 +1340,7 @@ public class EntityKidnapper aggressionSystem.clearEscapedTarget(); } - // ======================================== // FIGHT BACK SYSTEM METHODS - // ======================================== /** * Get the last entity that attacked this kidnapper. @@ -1488,9 +1452,7 @@ public class EntityKidnapper captiveManager.tick(); } - // ======================================== - // AI STATE SYSTEM (Phase 3) - // ======================================== + // AI STATE SYSTEM /** * Get the current behavioral state. @@ -1562,9 +1524,7 @@ public class EntityKidnapper campManager.setHunter(hunter); } - // ======================================== // ROBBED IMMUNITY METHODS - // ======================================== /** * Grant robbed immunity to a player. @@ -1595,9 +1555,7 @@ public class EntityKidnapper aggressionSystem.clearRobbedImmunity(playerUUID); } - // ======================================== // COMPONENT ACCESSORS - // ======================================== /** * Get the aggression system component (for TargetHost). @@ -1709,9 +1667,7 @@ public class EntityKidnapper return null; } - // ======================================== // TARGET PURSUIT CHECK - // ======================================== /** * Check if a target is already being pursued by another kidnapper. @@ -1839,9 +1795,7 @@ public class EntityKidnapper return cellManager.getNearbyPatrolMarkers(radius); } - // ======================================== // DISPLAY - // ======================================== @Override public Component getDisplayName() { @@ -1851,9 +1805,7 @@ public class EntityKidnapper ); // Red } - // ======================================== // LEASH HOLDER POSITION - // ======================================== /** * Override to position leash at right hand instead of chest. @@ -1870,13 +1822,9 @@ public class EntityKidnapper return captiveManager.getRopeHoldPosition(partialTicks); } - // ======================================== // DIALOGUE SPEAKER IMPLEMENTATION - // ======================================== - // ======================================== // DIALOGUE CONVENIENCE METHODS - // ======================================== /** * Talk to a specific player using a message string. @@ -1898,7 +1846,10 @@ public class EntityKidnapper ) { if (player == null || category == null) return; if (this.level().isClientSide()) return; - String message = com.tiedup.remake.dialogue.EntityDialogueManager.getDialogue(category); + String message = + com.tiedup.remake.dialogue.EntityDialogueManager.getDialogue( + category + ); com.tiedup.remake.util.MessageDispatcher.talkTo(this, player, message); } @@ -1909,7 +1860,11 @@ public class EntityKidnapper public void talkToPlayersInRadius(String message, int radius) { if (message == null) return; if (this.level().isClientSide()) return; - com.tiedup.remake.util.MessageDispatcher.talkToNearby(this, message, (double) radius); + com.tiedup.remake.util.MessageDispatcher.talkToNearby( + this, + message, + (double) radius + ); } /** @@ -1922,8 +1877,15 @@ public class EntityKidnapper ) { if (category == null) return; if (this.level().isClientSide()) return; - String message = com.tiedup.remake.dialogue.EntityDialogueManager.getDialogue(category); - com.tiedup.remake.util.MessageDispatcher.talkToNearby(this, message, (double) radius); + String message = + com.tiedup.remake.dialogue.EntityDialogueManager.getDialogue( + category + ); + com.tiedup.remake.util.MessageDispatcher.talkToNearby( + this, + message, + (double) radius + ); } /** @@ -1946,7 +1908,10 @@ public class EntityKidnapper ) { if (player == null || category == null) return; if (this.level().isClientSide()) return; - String action = com.tiedup.remake.dialogue.EntityDialogueManager.getDialogue(category); + String action = + com.tiedup.remake.dialogue.EntityDialogueManager.getDialogue( + category + ); com.tiedup.remake.util.MessageDispatcher.actionTo(this, player, action); } @@ -2047,9 +2012,7 @@ public class EntityKidnapper } } - // ======================================== // STOLEN ITEMS (Thief Goal) - // ======================================== /** * Add an item to the stolen items list. @@ -2061,9 +2024,7 @@ public class EntityKidnapper } } - // ======================================== // COLLAR KEYS (Capture Goal) - // ======================================== /** * Add a collar key to be stored on this kidnapper. diff --git a/src/main/java/com/tiedup/remake/entities/EntityKidnapperArcher.java b/src/main/java/com/tiedup/remake/entities/EntityKidnapperArcher.java index 07ea02a..34b0dde 100644 --- a/src/main/java/com/tiedup/remake/entities/EntityKidnapperArcher.java +++ b/src/main/java/com/tiedup/remake/entities/EntityKidnapperArcher.java @@ -30,7 +30,6 @@ import net.minecraft.world.level.Level; /** * Archer Kidnapper - Ranged kidnapper that attacks with rope arrows. * - * Phase 18: Archer Kidnappers * * Differences from regular EntityKidnapper: * - Attacks from range with rope arrows @@ -48,9 +47,7 @@ public class EntityKidnapperArcher implements RangedAttackMob { - // ======================================== // CONSTANTS - // ======================================== public static final double ARCHER_MAX_HEALTH = 15.0D; public static final double ARCHER_MOVEMENT_SPEED = 0.30D; @@ -62,9 +59,7 @@ public class EntityKidnapperArcher public static final float ARROW_VELOCITY = 1.6F; public static final float ARROW_INACCURACY = 2.0F; - // ======================================== // DATA SYNC (Archer-specific) - // ======================================== /** * Whether the archer is currently aiming (for bow draw animation). @@ -85,16 +80,12 @@ public class EntityKidnapperArcher EntityDataSerializers.BOOLEAN ); - // ======================================== // STATE - // ======================================== /** Ticks the archer has been charging the bow */ private int aimingTicks; - // ======================================== // HIT TRACKING (for cumulative bind chance) - // ======================================== /** Maximum bind chance (100%) */ public static final int ARCHER_MAX_BIND_CHANCE = 100; @@ -102,9 +93,7 @@ public class EntityKidnapperArcher /** Track hit counts per target UUID */ private final Map targetHitCounts = new HashMap<>(); - // ======================================== // CONSTRUCTOR - // ======================================== public EntityKidnapperArcher( EntityType type, @@ -115,9 +104,7 @@ public class EntityKidnapperArcher this.setLeftHanded(false); } - // ======================================== // ATTRIBUTES - // ======================================== /** * Create archer kidnapper attributes. @@ -132,9 +119,7 @@ public class EntityKidnapperArcher .add(Attributes.ATTACK_DAMAGE, ARCHER_ATTACK_DAMAGE); } - // ======================================== // DATA SYNC - // ======================================== @Override protected void defineSynchedData() { @@ -143,9 +128,7 @@ public class EntityKidnapperArcher this.entityData.define(DATA_IN_RANGED_MODE, false); } - // ======================================== // VARIANT SYSTEM - Override virtual methods - // ======================================== @Override public KidnapperVariant lookupVariantById(String variantId) { @@ -155,7 +138,8 @@ public class EntityKidnapperArcher @Override public KidnapperVariant computeVariantForEntity(UUID entityUUID) { Gender preferredGender = SettingsAccessor.getPreferredSpawnGender( - this.level() != null ? this.level().getGameRules() : null); + this.level() != null ? this.level().getGameRules() : null + ); return ArcherKidnapperSkinManager.CORE.getVariantForEntity( entityUUID, preferredGender @@ -184,9 +168,7 @@ public class EntityKidnapperArcher return "ArcherVariantName"; } - // ======================================== // AI GOALS - // ======================================== @Override protected void registerGoals() { @@ -202,9 +184,7 @@ public class EntityKidnapperArcher ); } - // ======================================== // INITIALIZATION - // ======================================== @Override public void onAddedToWorld() { @@ -223,9 +203,7 @@ public class EntityKidnapperArcher } } - // ======================================== // RANGED ATTACK MOB INTERFACE - // ======================================== /** * Called by the ranged goal to perform the actual attack. @@ -270,9 +248,7 @@ public class EntityKidnapperArcher ); } - // ======================================== // AIMING STATE (for animation) - // ======================================== /** * Set whether the archer is currently aiming. @@ -350,9 +326,7 @@ public class EntityKidnapperArcher return UseAnim.NONE; } - // ======================================== // HIT TRACKING METHODS - // ======================================== /** * Get the current bind chance for a target. @@ -396,9 +370,7 @@ public class EntityKidnapperArcher targetHitCounts.clear(); } - // ======================================== // DISPLAY - // ======================================== @Override public Component getDisplayName() { @@ -407,9 +379,7 @@ public class EntityKidnapperArcher ); } - // ======================================== // OVERRIDES - // ======================================== /** * Archers take slightly longer to capture up close. @@ -443,9 +413,7 @@ public class EntityKidnapperArcher return mainHand.getItem() instanceof BowItem; } - // ======================================== // BOW RESTORATION - // ======================================== /** * Override clearHeldItems to restore the bow. @@ -471,9 +439,7 @@ public class EntityKidnapperArcher ); } - // ======================================== // DIALOGUE SPEAKER (Archer-specific) - // ======================================== @Override public SpeakerType getSpeakerType() { diff --git a/src/main/java/com/tiedup/remake/entities/EntityKidnapperElite.java b/src/main/java/com/tiedup/remake/entities/EntityKidnapperElite.java index b78d1be..73ac483 100644 --- a/src/main/java/com/tiedup/remake/entities/EntityKidnapperElite.java +++ b/src/main/java/com/tiedup/remake/entities/EntityKidnapperElite.java @@ -16,7 +16,6 @@ import net.minecraft.world.level.Level; /** * Elite Kidnapper - Rare, faster, more dangerous kidnapper variant. * - * Phase 14.3.6: Elite Kidnappers * * Differences from regular EntityKidnapper: * - Faster movement speed (0.35 vs 0.27) @@ -31,9 +30,7 @@ import net.minecraft.world.level.Level; */ public class EntityKidnapperElite extends EntityKidnapper { - // ======================================== // CONSTANTS - // ======================================== public static final double ELITE_MAX_HEALTH = 40.0D; public static final double ELITE_MOVEMENT_SPEED = 0.35D; @@ -43,9 +40,7 @@ public class EntityKidnapperElite extends EntityKidnapper { public static final int ELITE_CAPTURE_TIME_TICKS = 10; public static final int ELITE_NAME_COLOR = 0xAA0000; - // ======================================== // CONSTRUCTOR - // ======================================== public EntityKidnapperElite( EntityType type, @@ -54,9 +49,7 @@ public class EntityKidnapperElite extends EntityKidnapper { super(type, level); } - // ======================================== // ATTRIBUTES - // ======================================== /** * Create elite kidnapper attributes. @@ -71,9 +64,7 @@ public class EntityKidnapperElite extends EntityKidnapper { .add(Attributes.ATTACK_DAMAGE, ELITE_ATTACK_DAMAGE); } - // ======================================== // VARIANT SYSTEM - Override virtual methods - // ======================================== @Override public KidnapperVariant lookupVariantById(String variantId) { @@ -83,7 +74,8 @@ public class EntityKidnapperElite extends EntityKidnapper { @Override public KidnapperVariant computeVariantForEntity(UUID entityUUID) { Gender preferredGender = SettingsAccessor.getPreferredSpawnGender( - this.level() != null ? this.level().getGameRules() : null); + this.level() != null ? this.level().getGameRules() : null + ); return EliteKidnapperSkinManager.CORE.getVariantForEntity( entityUUID, preferredGender @@ -112,9 +104,7 @@ public class EntityKidnapperElite extends EntityKidnapper { return "EliteVariantName"; } - // ======================================== // CAPTURE TIMING (Faster for Elite) - // ======================================== /** * Elite kidnappers tie up targets in half the time. @@ -132,9 +122,7 @@ public class EntityKidnapperElite extends EntityKidnapper { return ELITE_CAPTURE_TIME_TICKS; } - // ======================================== // DISPLAY - // ======================================== @Override public Component getDisplayName() { @@ -143,9 +131,7 @@ public class EntityKidnapperElite extends EntityKidnapper { ); } - // ======================================== // OVERRIDES - // ======================================== /** * Elite kidnappers use higher item probabilities. @@ -160,9 +146,7 @@ public class EntityKidnapperElite extends EntityKidnapper { return KidnapperItemSelector.selectForEliteKidnapper(); } - // ======================================== // DIALOGUE SPEAKER (Elite-specific) - // ======================================== @Override public SpeakerType getSpeakerType() { diff --git a/src/main/java/com/tiedup/remake/entities/EntityKidnapperMerchant.java b/src/main/java/com/tiedup/remake/entities/EntityKidnapperMerchant.java index 6aefd80..edb0e86 100644 --- a/src/main/java/com/tiedup/remake/entities/EntityKidnapperMerchant.java +++ b/src/main/java/com/tiedup/remake/entities/EntityKidnapperMerchant.java @@ -1,7 +1,6 @@ package com.tiedup.remake.entities; import static com.tiedup.remake.util.GameConstants.*; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.core.ModConfig; import com.tiedup.remake.core.SettingsAccessor; @@ -18,6 +17,7 @@ import com.tiedup.remake.personality.PersonalityType; import com.tiedup.remake.state.IBondageState; import com.tiedup.remake.state.ICaptor; import com.tiedup.remake.util.MessageDispatcher; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; @@ -61,9 +61,7 @@ import net.minecraft.world.level.Level; */ public class EntityKidnapperMerchant extends EntityKidnapperElite { - // ======================================== // MERCHANT STATE - // ======================================== public enum MerchantState { MERCHANT(0), @@ -84,9 +82,7 @@ public class EntityKidnapperMerchant extends EntityKidnapperElite { } } - // ======================================== // DATA SYNC - // ======================================== private static final EntityDataAccessor DATA_MERCHANT_STATE = SynchedEntityData.defineId( @@ -94,9 +90,7 @@ public class EntityKidnapperMerchant extends EntityKidnapperElite { EntityDataSerializers.INT ); - // ======================================== // STATE (Server-side only) - // ======================================== private MerchantState currentState = MerchantState.MERCHANT; private List trades = new ArrayList<>(); @@ -116,9 +110,7 @@ public class EntityKidnapperMerchant extends EntityKidnapperElite { private static final ConcurrentHashMap playerToMerchant = new ConcurrentHashMap<>(); - // ======================================== // CONSTRUCTOR - // ======================================== public EntityKidnapperMerchant( EntityType type, @@ -127,9 +119,7 @@ public class EntityKidnapperMerchant extends EntityKidnapperElite { super(type, level); } - // ======================================== // ATTRIBUTES (Same as Elite) - // ======================================== public static AttributeSupplier.Builder createAttributes() { return Mob.createMobAttributes() @@ -140,9 +130,7 @@ public class EntityKidnapperMerchant extends EntityKidnapperElite { .add(Attributes.ATTACK_DAMAGE, 8.0D); // Same as Elite } - // ======================================== // DATA SYNC - // ======================================== @Override protected void defineSynchedData() { @@ -153,9 +141,7 @@ public class EntityKidnapperMerchant extends EntityKidnapperElite { ); } - // ======================================== // INITIALIZATION - // ======================================== @Override public void onAddedToWorld() { @@ -201,9 +187,7 @@ public class EntityKidnapperMerchant extends EntityKidnapperElite { } } - // ======================================== // AI GOALS (Conditional) - // ======================================== @Override protected void registerGoals() { @@ -305,9 +289,7 @@ public class EntityKidnapperMerchant extends EntityKidnapperElite { this.goalSelector.addGoal(14, new OpenDoorGoal(this, false)); } - // ======================================== // STATE TRANSITIONS - // ======================================== @Override public boolean hurt(DamageSource source, float amount) { @@ -332,8 +314,16 @@ public class EntityKidnapperMerchant extends EntityKidnapperElite { */ @Override public void equip(BodyRegionV2 region, ItemStack stack) { - if (region == BodyRegionV2.ARMS || region == BodyRegionV2.MOUTH || region == BodyRegionV2.EYES) { - if (!level().isClientSide && currentState == MerchantState.MERCHANT && !stack.isEmpty()) { + if ( + region == BodyRegionV2.ARMS || + region == BodyRegionV2.MOUTH || + region == BodyRegionV2.EYES + ) { + if ( + !level().isClientSide && + currentState == MerchantState.MERCHANT && + !stack.isEmpty() + ) { LivingEntity attacker = findNearbyAttacker(); if (attacker != null) { transitionToHostile(attacker); @@ -471,9 +461,7 @@ public class EntityKidnapperMerchant extends EntityKidnapperElite { ); } - // ======================================== // VARIANT SYSTEM - Override virtual methods - // ======================================== @Override public KidnapperVariant lookupVariantById(String variantId) { @@ -483,7 +471,8 @@ public class EntityKidnapperMerchant extends EntityKidnapperElite { @Override public KidnapperVariant computeVariantForEntity(UUID entityUUID) { Gender preferredGender = SettingsAccessor.getPreferredSpawnGender( - this.level() != null ? this.level().getGameRules() : null); + this.level() != null ? this.level().getGameRules() : null + ); return MerchantKidnapperSkinManager.CORE.getVariantForEntity( entityUUID, preferredGender @@ -512,9 +501,7 @@ public class EntityKidnapperMerchant extends EntityKidnapperElite { return "MerchantVariantName"; } - // ======================================== // DISPLAY - // ======================================== /** * Override getDisplayName to use customName when in merchant mode. @@ -530,9 +517,7 @@ public class EntityKidnapperMerchant extends EntityKidnapperElite { return super.getDisplayName(); } - // ======================================== // SALE OVERRIDE (Track sold attacker) - // ======================================== @Override public boolean completeSale(ICaptor buyer) { @@ -543,19 +528,13 @@ public class EntityKidnapperMerchant extends EntityKidnapperElite { return super.completeSale(buyer); } - // ======================================== // TRADE GENERATION - // ======================================== private void generateRandomTrades() { - // ======================================== // GUARANTEED UTILITIES (always available) - // ======================================== addGuaranteedUtilities(); - // ======================================== // RANDOM TRADES - // ======================================== int min = ModConfig.SERVER.merchantMinTrades.get(); int max = ModConfig.SERVER.merchantMaxTrades.get(); int count = min + this.random.nextInt(Math.max(1, max - min + 1)); @@ -799,9 +778,7 @@ public class EntityKidnapperMerchant extends EntityKidnapperElite { return 1; } - // ======================================== // NBT PERSISTENCE - // ======================================== @Override public void addAdditionalSaveData(CompoundTag tag) { @@ -859,9 +836,7 @@ public class EntityKidnapperMerchant extends EntityKidnapperElite { } } - // ======================================== // PUBLIC ACCESSORS - // ======================================== public boolean isHostile() { return currentState == MerchantState.HOSTILE; @@ -924,9 +899,7 @@ public class EntityKidnapperMerchant extends EntityKidnapperElite { return playerToMerchant.get(playerUUID); } - // ======================================== // UTILITY - // ======================================== @Override public void clearHeldItems() { @@ -944,9 +917,7 @@ public class EntityKidnapperMerchant extends EntityKidnapperElite { MessageDispatcher.talkToNearby(this, message, radius); } - // ======================================== // DIALOGUE SPEAKER (Merchant-specific) - // ======================================== @Override public SpeakerType getSpeakerType() { diff --git a/src/main/java/com/tiedup/remake/entities/EntityMaid.java b/src/main/java/com/tiedup/remake/entities/EntityMaid.java index e59a27b..e467321 100644 --- a/src/main/java/com/tiedup/remake/entities/EntityMaid.java +++ b/src/main/java/com/tiedup/remake/entities/EntityMaid.java @@ -5,8 +5,6 @@ import com.tiedup.remake.cells.CampOwnership; import com.tiedup.remake.cells.CellRegistryV2; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.dialogue.SpeakerType; -import com.tiedup.remake.entities.maid.components.MaidPrisonInteraction; -import com.tiedup.remake.entities.maid.components.MaidTraderLink; import com.tiedup.remake.entities.ai.maid.MaidCollectRansomGoal; import com.tiedup.remake.entities.ai.maid.MaidDefendTraderGoal; import com.tiedup.remake.entities.ai.maid.MaidDeliverCaptiveGoal; @@ -19,6 +17,8 @@ import com.tiedup.remake.entities.ai.maid.goals.MaidIdleGoal; // Prison system v2 goals import com.tiedup.remake.entities.ai.maid.goals.MaidInitPrisonerGoal; import com.tiedup.remake.entities.ai.maid.goals.MaidReturnGoal; +import com.tiedup.remake.entities.maid.components.MaidPrisonInteraction; +import com.tiedup.remake.entities.maid.components.MaidTraderLink; import com.tiedup.remake.entities.skins.Gender; import com.tiedup.remake.entities.skins.MaidSkinManager; import com.tiedup.remake.personality.PersonalityType; @@ -70,9 +70,7 @@ import net.minecraft.world.phys.Vec3; */ public class EntityMaid extends EntityKidnapperElite { - // ======================================== // CONSTANTS - // ======================================== public static final double MAID_MAX_HEALTH = 60.0D; public static final double MAID_MOVEMENT_SPEED = 0.28D; // Reduced from 0.40 - more natural pace @@ -82,9 +80,7 @@ public class EntityMaid extends EntityKidnapperElite { public static final int MAID_CAPTURE_TIME_TICKS = 5; // Ultra fast public static final int MAID_NAME_COLOR = 0xFF69B4; // Hot Pink - // ======================================== // DATA SYNC - // ======================================== private static final EntityDataAccessor DATA_MAID_STATE = SynchedEntityData.defineId( @@ -92,9 +88,7 @@ public class EntityMaid extends EntityKidnapperElite { EntityDataSerializers.STRING ); - // ======================================== // STATE - // ======================================== /** Trader link component — manages master trader lookup, caching, and linking */ private final MaidTraderLink traderLink; @@ -117,9 +111,7 @@ public class EntityMaid extends EntityKidnapperElite { @Nullable private BlockPos collectTarget; - // ======================================== // CONSTRUCTOR - // ======================================== public EntityMaid(EntityType type, Level level) { super(type, level); @@ -135,9 +127,7 @@ public class EntityMaid extends EntityKidnapperElite { } } - // ======================================== // ATTRIBUTES - // ======================================== public static AttributeSupplier.Builder createAttributes() { return Mob.createMobAttributes() @@ -148,9 +138,7 @@ public class EntityMaid extends EntityKidnapperElite { .add(Attributes.ATTACK_DAMAGE, MAID_ATTACK_DAMAGE); } - // ======================================== // DATA SYNC - // ======================================== @Override protected void defineSynchedData() { @@ -158,9 +146,7 @@ public class EntityMaid extends EntityKidnapperElite { this.entityData.define(DATA_MAID_STATE, MaidState.IDLE.name()); } - // ======================================== // AI GOALS - // ======================================== @Override protected void registerGoals() { @@ -208,7 +194,6 @@ public class EntityMaid extends EntityKidnapperElite { // Priority 8: Idle behavior (monitor workers, patrol) this.goalSelector.addGoal(8, new MaidIdleGoal(this)); - // FUTURE: Maid command goals require personality system (EntityDamsel-only). // These were non-functional before (Maids have no PersonalityState). // Proper fix: Create MaidCommandGoals that use collar owner instead. // DamselAIController.registerCommandGoals(this.goalSelector, this, 9); @@ -229,9 +214,7 @@ public class EntityMaid extends EntityKidnapperElite { ); } - // ======================================== // STATE MANAGEMENT - // ======================================== public MaidState getMaidState() { return currentState; @@ -257,9 +240,7 @@ public class EntityMaid extends EntityKidnapperElite { return currentState == MaidState.FREE; } - // ======================================== // MASTER TRADER (facades to MaidTraderLink) - // ======================================== @Nullable public UUID getMasterTraderUUID() { @@ -296,9 +277,7 @@ public class EntityMaid extends EntityKidnapperElite { return traderLink; } - // ======================================== // STUCK DETECTION - // ======================================== /** Last recorded position for stuck detection */ private transient Vec3 stuckCheckPos = Vec3.ZERO; @@ -315,9 +294,7 @@ public class EntityMaid extends EntityKidnapperElite { /** Minimum distance to consider moved (blocks) */ private static final double STUCK_MOVE_THRESHOLD = 2.0; - // ======================================== // TICK - // ======================================== @Override public void tick() { @@ -521,9 +498,7 @@ public class EntityMaid extends EntityKidnapperElite { super.remove(reason); } - // ======================================== // CAPTURE DETECTION - // ======================================== /** * Check if maid has been captured and removed from camp. @@ -598,9 +573,7 @@ public class EntityMaid extends EntityKidnapperElite { this.setTarget(null); } - // ======================================== // ORDER HANDLING - // ======================================== /** * Start delivering a captive to a buyer. @@ -748,9 +721,7 @@ public class EntityMaid extends EntityKidnapperElite { // ever reset it back to IDLE. } - // ======================================== // PLAYER INTERACTION - MANUAL CHECK-IN - // ======================================== @Override protected InteractionResult mobInteract( @@ -780,9 +751,13 @@ public class EntityMaid extends EntityKidnapperElite { LaborRecord laborRecord = manager.getLaborRecord( player.getUUID() ); - InteractionResult result = prisonInteraction.handlePrisonerInteract( - serverPlayer, manager, record, laborRecord - ); + InteractionResult result = + prisonInteraction.handlePrisonerInteract( + serverPlayer, + manager, + record, + laborRecord + ); if (result != null) { return result; } @@ -791,9 +766,7 @@ public class EntityMaid extends EntityKidnapperElite { return super.mobInteract(player, hand); } - // ======================================== // TARGETING - // ======================================== @Override public boolean isSuitableTarget( @@ -814,9 +787,7 @@ public class EntityMaid extends EntityKidnapperElite { return entity == this.getLastAttacker(); } - // ======================================== // CAPTURE TIMING (Ultra fast) - // ======================================== @Override public int getCaptureBindTime() { @@ -828,9 +799,7 @@ public class EntityMaid extends EntityKidnapperElite { return MAID_CAPTURE_TIME_TICKS; } - // ======================================== // VARIANT SYSTEM - // ======================================== @Override public KidnapperVariant lookupVariantById(String variantId) { @@ -873,9 +842,7 @@ public class EntityMaid extends EntityKidnapperElite { } } - // ======================================== // DISPLAY - // ======================================== @Override public Component getDisplayName() { @@ -885,9 +852,7 @@ public class EntityMaid extends EntityKidnapperElite { ); } - // ======================================== // NBT PERSISTENCE - // ======================================== @Override public void addAdditionalSaveData(CompoundTag tag) { @@ -939,9 +904,7 @@ public class EntityMaid extends EntityKidnapperElite { // NOTE: Labor states are now loaded from CampOwnership, not here } - // ======================================== // GETTERS FOR AI GOALS - // ======================================== @Nullable public UUID getTargetCaptiveUUID() { @@ -958,9 +921,7 @@ public class EntityMaid extends EntityKidnapperElite { return collectTarget; } - // ======================================== // PRISONER STATE ACCESS (facades to MaidPrisonInteraction) - // ======================================== /** * Get the prison interaction component. @@ -988,9 +949,7 @@ public class EntityMaid extends EntityKidnapperElite { return prisonInteraction.getPrisonerManager(); } - // ======================================== // STRUGGLE DETECTION (facades to MaidPrisonInteraction) - // ======================================== public void onStruggleDetected(ServerPlayer prisoner) { prisonInteraction.onStruggleDetected(prisoner); @@ -1005,9 +964,7 @@ public class EntityMaid extends EntityKidnapperElite { prisonInteraction.clearStrugglePunishmentTarget(); } - // ======================================== // DIALOGUE SPEAKER (Maid-specific) - // ======================================== @Override public SpeakerType getSpeakerType() { diff --git a/src/main/java/com/tiedup/remake/entities/EntityMaster.java b/src/main/java/com/tiedup/remake/entities/EntityMaster.java index c723905..0c52da9 100644 --- a/src/main/java/com/tiedup/remake/entities/EntityMaster.java +++ b/src/main/java/com/tiedup/remake/entities/EntityMaster.java @@ -10,13 +10,13 @@ import com.tiedup.remake.entities.master.components.MasterStateManager; import com.tiedup.remake.entities.master.components.MasterTaskManager; import com.tiedup.remake.entities.skins.Gender; import com.tiedup.remake.entities.skins.MasterSkinManager; -import com.tiedup.remake.v2.BodyRegionV2; -import com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper; import com.tiedup.remake.minigame.ContinuousStruggleMiniGameState; import com.tiedup.remake.minigame.StruggleSessionManager; import com.tiedup.remake.network.ModNetwork; import com.tiedup.remake.network.master.PacketMasterStateSync; import com.tiedup.remake.state.PlayerBindState; +import com.tiedup.remake.v2.BodyRegionV2; +import com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper; import java.util.UUID; import javax.annotation.Nullable; import net.minecraft.nbt.CompoundTag; @@ -58,9 +58,7 @@ import net.minecraft.world.level.Level; */ public class EntityMaster extends EntityKidnapperElite { - // ======================================== // CONSTANTS - // ======================================== public static final double MASTER_MAX_HEALTH = 150.0D; public static final double MASTER_MOVEMENT_SPEED = 0.30D; @@ -85,9 +83,7 @@ public class EntityMaster extends EntityKidnapperElite { private static final String NBT_PLACED_BLOCK_POS = "PlacedBlockPos"; private static final String NBT_DOGWALK_MASTER_LEADS = "DogwalkMasterLeads"; - // ======================================== // DATA SYNC - // ======================================== /** Current state synced to client */ private static final EntityDataAccessor DATA_MASTER_STATE = @@ -103,9 +99,7 @@ public class EntityMaster extends EntityKidnapperElite { EntityDataSerializers.BOOLEAN ); - // ======================================== // COMPONENTS - // ======================================== /** State manager for master behavioral states */ private final MasterStateManager stateManager; @@ -146,9 +140,7 @@ public class EntityMaster extends EntityKidnapperElite { /** Whether the next punishment is an attack punishment (dual: choke + physical restraint) */ private boolean pendingAttackPunishment = false; - // ======================================== // CONSTRUCTOR - // ======================================== public EntityMaster(EntityType type, Level level) { super(type, level); @@ -160,9 +152,7 @@ public class EntityMaster extends EntityKidnapperElite { this.taskManager = new MasterTaskManager(this); } - // ======================================== // ATTRIBUTES - // ======================================== /** * Create master attributes. @@ -178,9 +168,7 @@ public class EntityMaster extends EntityKidnapperElite { .add(Attributes.ARMOR, MASTER_ARMOR); } - // ======================================== // DATA SYNC - // ======================================== @Override protected void defineSynchedData() { @@ -237,9 +225,7 @@ public class EntityMaster extends EntityKidnapperElite { return this.entityData.get(DATA_DISTRACTED); } - // ======================================== // SELLING KIDNAPPER (for approach/purchase) - // ======================================== /** * Set the kidnapper that is selling a player to this Master. @@ -280,9 +266,7 @@ public class EntityMaster extends EntityKidnapperElite { this.sellingKidnapper = null; } - // ======================================== // AI GOALS - // ======================================== @Override protected void registerGoals() { @@ -326,7 +310,6 @@ public class EntityMaster extends EntityKidnapperElite { // FollowPlayer (MOVE+LOOK) at prio 3 was blocking all prio 4-7 goals! this.goalSelector.addGoal(8, new MasterFollowPlayerGoal(this)); - // FUTURE: Master command goals require personality system (EntityDamsel-only). // These were non-functional before (Masters have no PersonalityState). // Proper fix: Create MasterCommandGoals that use collar owner instead. // DamselAIController.registerCommandGoals(this.goalSelector, this, 9); @@ -341,9 +324,7 @@ public class EntityMaster extends EntityKidnapperElite { // Note: No target goals - Master doesn't hunt, only follows their pet } - // ======================================== // VARIANT SYSTEM OVERRIDES - // ======================================== @Override public KidnapperVariant lookupVariantById(String variantId) { @@ -353,7 +334,8 @@ public class EntityMaster extends EntityKidnapperElite { @Override public KidnapperVariant computeVariantForEntity(UUID entityUUID) { Gender preferredGender = SettingsAccessor.getPreferredSpawnGender( - this.level() != null ? this.level().getGameRules() : null); + this.level() != null ? this.level().getGameRules() : null + ); return MasterSkinManager.CORE.getVariantForEntity( entityUUID, preferredGender @@ -375,9 +357,7 @@ public class EntityMaster extends EntityKidnapperElite { return NBT_MASTER_VARIANT; } - // ======================================== // PLAYER INTERACTION - // ======================================== /** * Handle player right-click interaction. @@ -486,9 +466,7 @@ public class EntityMaster extends EntityKidnapperElite { return super.mobInteract(player, hand); } - // ======================================== // DISPLAY - // ======================================== @Override public Component getDisplayName() { @@ -538,9 +516,7 @@ public class EntityMaster extends EntityKidnapperElite { return Math.max(0, Math.min(100, mood)); } - // ======================================== // TICK - // ======================================== @Override public void tick() { @@ -637,11 +613,11 @@ public class EntityMaster extends EntityKidnapperElite { } /** @see MasterPetManager#resetCollarResistance(ServerPlayer) */ - private void resetCollarResistance(ServerPlayer pet) { petManager.resetCollarResistance(pet); } + private void resetCollarResistance(ServerPlayer pet) { + petManager.resetCollarResistance(pet); + } - // ======================================== // COMBAT - DAMAGE REDUCTION - // ======================================== @Override public boolean hurt(DamageSource source, float amount) { @@ -764,16 +740,18 @@ public class EntityMaster extends EntityKidnapperElite { super.die(source); } - // ======================================== // PET MANAGEMENT (delegates to MasterPetManager) - // ======================================== /** Get the pet manager component. */ - public MasterPetManager getPetManager() { return petManager; } + public MasterPetManager getPetManager() { + return petManager; + } /** @see MasterPetManager#getPetPlayer() */ @Nullable - public ServerPlayer getPetPlayer() { return petManager.getPetPlayer(); } + public ServerPlayer getPetPlayer() { + return petManager.getPetPlayer(); + } /** @see MasterPetManager#setPetPlayer(ServerPlayer) */ public void setPetPlayer(ServerPlayer player) { @@ -782,14 +760,16 @@ public class EntityMaster extends EntityKidnapperElite { } /** @see MasterPetManager#hasPet() */ - public boolean hasPet() { return petManager.hasPet(); } + public boolean hasPet() { + return petManager.hasPet(); + } /** @see MasterPetManager#isPetPlayer(Player) */ - public boolean isPetPlayer(Player player) { return petManager.isPetPlayer(player); } + public boolean isPetPlayer(Player player) { + return petManager.isPetPlayer(player); + } - // ======================================== // GOAL ACCESSORS - // ======================================== /** * Get the place block goal for triggering feeding/resting. @@ -807,9 +787,7 @@ public class EntityMaster extends EntityKidnapperElite { return dogwalkGoal; } - // ======================================== // DOGWALK MODE - // ======================================== /** * Set dogwalk mode. @@ -830,39 +808,55 @@ public class EntityMaster extends EntityKidnapperElite { return dogwalkMasterLeads; } - // ======================================== // TASK MANAGEMENT (delegates to MasterTaskManager) - // ======================================== /** Get the task manager component. */ - public MasterTaskManager getTaskManager() { return taskManager; } + public MasterTaskManager getTaskManager() { + return taskManager; + } /** @see MasterTaskManager#hasActiveTask() */ - public boolean hasActiveTask() { return taskManager.hasActiveTask(); } + public boolean hasActiveTask() { + return taskManager.hasActiveTask(); + } /** @see MasterTaskManager#getCurrentTask() */ @Nullable - public PetTask getCurrentTask() { return taskManager.getCurrentTask(); } + public PetTask getCurrentTask() { + return taskManager.getCurrentTask(); + } /** @see MasterTaskManager#setActiveTask(PetTask) */ - public void setActiveTask(PetTask task) { taskManager.setActiveTask(task); } + public void setActiveTask(PetTask task) { + taskManager.setActiveTask(task); + } /** @see MasterTaskManager#clearActiveTask() */ - public void clearActiveTask() { taskManager.clearActiveTask(); } + public void clearActiveTask() { + taskManager.clearActiveTask(); + } /** @see MasterTaskManager#getTaskStartPosition() */ @Nullable - public net.minecraft.world.phys.Vec3 getTaskStartPosition() { return taskManager.getTaskStartPosition(); } + public net.minecraft.world.phys.Vec3 getTaskStartPosition() { + return taskManager.getTaskStartPosition(); + } /** @see MasterTaskManager#setTaskStartPosition(net.minecraft.world.phys.Vec3) */ - public void setTaskStartPosition(net.minecraft.world.phys.Vec3 position) { taskManager.setTaskStartPosition(position); } + public void setTaskStartPosition(net.minecraft.world.phys.Vec3 position) { + taskManager.setTaskStartPosition(position); + } /** @see MasterTaskManager#getRequestedItem() */ @Nullable - public net.minecraft.world.item.Item getRequestedItem() { return taskManager.getRequestedItem(); } + public net.minecraft.world.item.Item getRequestedItem() { + return taskManager.getRequestedItem(); + } /** @see MasterTaskManager#setRequestedItem(net.minecraft.world.item.Item) */ - public void setRequestedItem(net.minecraft.world.item.Item item) { taskManager.setRequestedItem(item); } + public void setRequestedItem(net.minecraft.world.item.Item item) { + taskManager.setRequestedItem(item); + } /** * Get the task assign goal for force assignment. @@ -872,41 +866,51 @@ public class EntityMaster extends EntityKidnapperElite { return taskAssignGoal; } - // ======================================== // LEASH MANAGEMENT (delegates to MasterPetManager) - // ======================================== /** @see MasterPetManager#attachLeashToPet() */ - public void attachLeashToPet() { petManager.attachLeashToPet(); } + public void attachLeashToPet() { + petManager.attachLeashToPet(); + } /** @see MasterPetManager#detachLeashFromPet() */ - public void detachLeashFromPet() { petManager.detachLeashFromPet(); } + public void detachLeashFromPet() { + petManager.detachLeashFromPet(); + } /** @see MasterPetManager#isPetLeashed() */ - public boolean isPetLeashed() { return petManager.isPetLeashed(); } + public boolean isPetLeashed() { + return petManager.isPetLeashed(); + } - // ======================================== // ENGAGEMENT CADENCE (delegates to MasterTaskManager) - // ======================================== /** @see MasterTaskManager#markEngagement() */ - public void markEngagement() { taskManager.markEngagement(); } + public void markEngagement() { + taskManager.markEngagement(); + } /** @see MasterTaskManager#getEngagementMultiplier() */ - public float getEngagementMultiplier() { return taskManager.getEngagementMultiplier(); } + public float getEngagementMultiplier() { + return taskManager.getEngagementMultiplier(); + } - // ======================================== // COLD SHOULDER (delegates to MasterTaskManager) - // ======================================== /** @see MasterTaskManager#isGivingColdShoulder() */ - public boolean isGivingColdShoulder() { return taskManager.isGivingColdShoulder(); } + public boolean isGivingColdShoulder() { + return taskManager.isGivingColdShoulder(); + } /** @see MasterTaskManager#startColdShoulder(int) */ - public void startColdShoulder(int durationTicks) { taskManager.startColdShoulder(durationTicks); } + public void startColdShoulder(int durationTicks) { + taskManager.startColdShoulder(durationTicks); + } /** @see MasterPetManager#putPetCollar(ServerPlayer) */ - public void putPetCollar(ServerPlayer player) { petManager.putPetCollar(player); } + public void putPetCollar(ServerPlayer player) { + petManager.putPetCollar(player); + } /** @see MasterPetManager#freePet(ServerPlayer) */ public void freePet(ServerPlayer player) { @@ -929,7 +933,9 @@ public class EntityMaster extends EntityKidnapperElite { } /** @see MasterPetManager#syncDataToCollar(ServerPlayer) */ - private void syncDataToCollar(ServerPlayer pet) { petManager.syncDataToCollar(pet); } + private void syncDataToCollar(ServerPlayer pet) { + petManager.syncDataToCollar(pet); + } /** * Get master UUID from player's pet collar. @@ -949,9 +955,7 @@ public class EntityMaster extends EntityKidnapperElite { return null; } - // ======================================== // STATE ACCESSORS - // ======================================== public MasterStateManager getStateManager() { return stateManager; @@ -982,9 +986,7 @@ public class EntityMaster extends EntityKidnapperElite { return pending; } - // ======================================== // NBT SERIALIZATION - // ======================================== @Override public void addAdditionalSaveData(CompoundTag tag) { @@ -1114,9 +1116,7 @@ public class EntityMaster extends EntityKidnapperElite { super.remove(reason); } - // ======================================== // STATE HOST IMPLEMENTATION - // ======================================== private class MasterStateHost implements IMasterStateHost { @@ -1153,9 +1153,7 @@ public class EntityMaster extends EntityKidnapperElite { } } - // ======================================== // BODY ROTATION OVERRIDE - // ======================================== @Override protected float tickHeadTurn(float yRot, float animStep) { @@ -1171,9 +1169,7 @@ public class EntityMaster extends EntityKidnapperElite { return super.tickHeadTurn(yRot, animStep); } - // ======================================== // COLLISION OVERRIDE - // ======================================== @Override public boolean isPushable() { diff --git a/src/main/java/com/tiedup/remake/entities/EntityRopeArrow.java b/src/main/java/com/tiedup/remake/entities/EntityRopeArrow.java index 00e37ad..5640e32 100644 --- a/src/main/java/com/tiedup/remake/entities/EntityRopeArrow.java +++ b/src/main/java/com/tiedup/remake/entities/EntityRopeArrow.java @@ -1,11 +1,11 @@ package com.tiedup.remake.entities; import com.tiedup.remake.core.ModConfig; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.items.ModItems; import com.tiedup.remake.state.IBondageState; import com.tiedup.remake.util.KidnappedHelper; +import com.tiedup.remake.v2.BodyRegionV2; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.projectile.AbstractArrow; @@ -16,7 +16,6 @@ import net.minecraft.world.phys.EntityHitResult; /** * Rope Arrow Entity - Arrow that binds targets on hit. * - * Phase 15: Rope Arrow implementation * * Behavior: * - When hitting an entity, has a chance to bind them @@ -55,7 +54,9 @@ public class EntityRopeArrow extends AbstractArrow { if (result.getEntity() instanceof LivingEntity target) { // Check if target can be kidnapped - IBondageState targetState = KidnappedHelper.getKidnappedState(target); + IBondageState targetState = KidnappedHelper.getKidnappedState( + target + ); if (targetState == null) { TiedUpMod.LOGGER.debug( "[EntityRopeArrow] Target {} cannot be bound (not IBondageState)", diff --git a/src/main/java/com/tiedup/remake/entities/EntitySlaveTrader.java b/src/main/java/com/tiedup/remake/entities/EntitySlaveTrader.java index 6f26b37..7e57e97 100644 --- a/src/main/java/com/tiedup/remake/entities/EntitySlaveTrader.java +++ b/src/main/java/com/tiedup/remake/entities/EntitySlaveTrader.java @@ -64,9 +64,7 @@ import net.minecraft.world.level.Level; */ public class EntitySlaveTrader extends EntityKidnapperElite { - // ======================================== // CONSTANTS - // ======================================== public static final double TRADER_MAX_HEALTH = 50.0D; public static final double TRADER_MOVEMENT_SPEED = 0.30D; @@ -75,9 +73,7 @@ public class EntitySlaveTrader extends EntityKidnapperElite { public static final double TRADER_ATTACK_DAMAGE = 10.0D; public static final int TRADER_NAME_COLOR = 0xFFD700; // Gold - // ======================================== // STATE - // ======================================== /** UUID of the maid that serves this trader */ @Nullable @@ -107,9 +103,7 @@ public class EntitySlaveTrader extends EntityKidnapperElite { private int hostileCooldownTicks = 0; private static final int HOSTILE_DURATION_TICKS = 600; // 30 seconds max hostility - // ======================================== // CONSTRUCTOR - // ======================================== public EntitySlaveTrader( EntityType type, @@ -118,9 +112,7 @@ public class EntitySlaveTrader extends EntityKidnapperElite { super(type, level); } - // ======================================== // ATTRIBUTES - // ======================================== public static AttributeSupplier.Builder createAttributes() { return Mob.createMobAttributes() @@ -131,9 +123,7 @@ public class EntitySlaveTrader extends EntityKidnapperElite { .add(Attributes.ATTACK_DAMAGE, TRADER_ATTACK_DAMAGE); } - // ======================================== // AI GOALS - // ======================================== @Override protected void registerGoals() { @@ -151,7 +141,6 @@ public class EntitySlaveTrader extends EntityKidnapperElite { // Priority 5: Idle/patrol behavior this.goalSelector.addGoal(5, new TraderIdleGoal(this)); - // FUTURE: Trader command goals require personality system (EntityDamsel-only). // These were non-functional before (Traders have no PersonalityState). // Proper fix: Create TraderCommandGoals that use collar owner instead. // DamselAIController.registerCommandGoals(this.goalSelector, this, 6); @@ -172,9 +161,7 @@ public class EntitySlaveTrader extends EntityKidnapperElite { ); } - // ======================================== // INTERACTION - // ======================================== @Override public InteractionResult mobInteract(Player player, InteractionHand hand) { @@ -249,11 +236,7 @@ public class EntitySlaveTrader extends EntityKidnapperElite { // Send packet to open screen ModNetwork.sendToPlayer( - new PacketOpenTraderScreen( - this.getId(), - this.getNpcName(), - offers - ), + new PacketOpenTraderScreen(this.getId(), this.getNpcName(), offers), player ); } @@ -319,9 +302,8 @@ public class EntitySlaveTrader extends EntityKidnapperElite { continue; } - IRestrainable kidnappedState = KidnappedHelper.getKidnappedState( - captiveEntity - ); + IRestrainable kidnappedState = + KidnappedHelper.getKidnappedState(captiveEntity); if (kidnappedState == null || !kidnappedState.isForSell()) { continue; } @@ -355,9 +337,7 @@ public class EntitySlaveTrader extends EntityKidnapperElite { // Uses EntityKidnapper.hasTokenInInventory(player) - inherited from parent - // ======================================== // TARGETING - Trader doesn't capture - // ======================================== @Override public void setTarget(@Nullable LivingEntity target) { @@ -386,9 +366,7 @@ public class EntitySlaveTrader extends EntityKidnapperElite { return entity == this.getLastAttacker(); } - // ======================================== // MAID & CAMP MANAGEMENT - // ======================================== @Nullable public UUID getMaidUUID() { @@ -461,9 +439,7 @@ public class EntitySlaveTrader extends EntityKidnapperElite { } } - // ======================================== // DEATH HANDLING - // ======================================== /** Guard against double-cleanup (die() triggers remove(KILLED)) */ private boolean cleanedUp = false; @@ -509,9 +485,7 @@ public class EntitySlaveTrader extends EntityKidnapperElite { super.remove(reason); } - // ======================================== // VARIANT SYSTEM - // ======================================== @Override public KidnapperVariant lookupVariantById(String variantId) { @@ -554,9 +528,7 @@ public class EntitySlaveTrader extends EntityKidnapperElite { } } - // ======================================== // DISPLAY - // ======================================== @Override public Component getDisplayName() { @@ -565,9 +537,7 @@ public class EntitySlaveTrader extends EntityKidnapperElite { ); } - // ======================================== // NBT PERSISTENCE - // ======================================== @Override public void addAdditionalSaveData(CompoundTag tag) { @@ -615,9 +585,7 @@ public class EntitySlaveTrader extends EntityKidnapperElite { } } - // ======================================== // CAPTURE DETECTION - // ======================================== /** * Check if trader has been captured and removed from camp. @@ -761,9 +729,7 @@ public class EntitySlaveTrader extends EntityKidnapperElite { } } - // ======================================== // STRUGGLE DETECTION - // ======================================== /** Target prisoner to approach after catching them struggling */ @Nullable @@ -874,9 +840,7 @@ public class EntitySlaveTrader extends EntityKidnapperElite { this.strugglePunishmentTarget = null; } - // ======================================== // DIALOGUE SPEAKER (Trader-specific) - // ======================================== @Override public SpeakerType getSpeakerType() { diff --git a/src/main/java/com/tiedup/remake/entities/KidnapperCaptureEquipment.java b/src/main/java/com/tiedup/remake/entities/KidnapperCaptureEquipment.java index 61a48a3..243b53d 100644 --- a/src/main/java/com/tiedup/remake/entities/KidnapperCaptureEquipment.java +++ b/src/main/java/com/tiedup/remake/entities/KidnapperCaptureEquipment.java @@ -3,9 +3,9 @@ package com.tiedup.remake.entities; import com.tiedup.remake.items.ModItems; import com.tiedup.remake.items.base.BindVariant; import com.tiedup.remake.v2.bondage.IV2BondageItem; -import org.jetbrains.annotations.Nullable; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.Nullable; /** * Manages capture equipment for EntityKidnapper. @@ -31,9 +31,7 @@ public class KidnapperCaptureEquipment { this.kidnapper = kidnapper; } - // ======================================== // ITEM GETTERS - // ======================================== /** * Get bind item to use for capture. @@ -43,7 +41,9 @@ public class KidnapperCaptureEquipment { */ public ItemStack getBindItem() { ItemStack mainHand = kidnapper.getMainHandItem(); - if (!mainHand.isEmpty() && mainHand.getItem() instanceof IV2BondageItem) { + if ( + !mainHand.isEmpty() && mainHand.getItem() instanceof IV2BondageItem + ) { return mainHand; } return new ItemStack(ModItems.getBind(BindVariant.ROPES)); @@ -117,9 +117,7 @@ public class KidnapperCaptureEquipment { return new ItemStack(ModItems.SHOCK_COLLAR.get()); } - // ======================================== // HELD ITEM MANAGEMENT - // ======================================== /** * Equip themed bind and gag items before capture. diff --git a/src/main/java/com/tiedup/remake/entities/KidnapperCollarConfig.java b/src/main/java/com/tiedup/remake/entities/KidnapperCollarConfig.java index 556e7ef..0dc88a4 100644 --- a/src/main/java/com/tiedup/remake/entities/KidnapperCollarConfig.java +++ b/src/main/java/com/tiedup/remake/entities/KidnapperCollarConfig.java @@ -1,14 +1,14 @@ package com.tiedup.remake.entities; import com.tiedup.remake.items.base.ItemCollar; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.util.teleport.Position; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.List; import java.util.UUID; -import org.jetbrains.annotations.Nullable; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.Nullable; /** * Helper class to access collar configuration for EntityKidnapper. @@ -31,9 +31,7 @@ public class KidnapperCollarConfig { this.kidnapper = kidnapper; } - // ======================================== // COLLAR ITEM ACCESS - // ======================================== /** * Get the collar item if equipped. @@ -57,9 +55,7 @@ public class KidnapperCollarConfig { return kidnapper.getEquipment(BodyRegionV2.NECK); } - // ======================================== // KIDNAPPING MODE - // ======================================== /** * Check if kidnapping mode is enabled via collar. @@ -85,9 +81,7 @@ public class KidnapperCollarConfig { return itemCollar.isKidnappingModeReady(getCollarStack()); } - // ======================================== // POSITION GETTERS - // ======================================== /** * Get cell ID from collar. @@ -110,9 +104,7 @@ public class KidnapperCollarConfig { return itemCollar.hasCellAssigned(getCollarStack()); } - // ======================================== // BEHAVIOR FLAGS - // ======================================== /** * Check if should warn masters after capturing slave. @@ -134,9 +126,7 @@ public class KidnapperCollarConfig { return itemCollar.shouldTieToPole(getCollarStack()); } - // ======================================== // BLACKLIST/WHITELIST - // ======================================== /** * Check if player is valid target for kidnapping mode. diff --git a/src/main/java/com/tiedup/remake/entities/KidnapperItemSelector.java b/src/main/java/com/tiedup/remake/entities/KidnapperItemSelector.java index 65ef3bb..90b459f 100644 --- a/src/main/java/com/tiedup/remake/entities/KidnapperItemSelector.java +++ b/src/main/java/com/tiedup/remake/entities/KidnapperItemSelector.java @@ -3,9 +3,9 @@ package com.tiedup.remake.entities; import com.tiedup.remake.items.ModItems; import com.tiedup.remake.items.base.*; import java.util.Random; -import org.jetbrains.annotations.Nullable; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.Nullable; /** * Helper class for selecting themed items for kidnappers. @@ -233,9 +233,7 @@ public class KidnapperItemSelector { ); } - // ========================================= // ITEM CREATION METHODS - // ========================================= /** * Create a bind ItemStack with optional color. @@ -305,9 +303,7 @@ public class KidnapperItemSelector { return new ItemStack(ModItems.getEarplugs(EarplugsVariant.CLASSIC)); } - // ========================================= // COLOR METHODS - // ========================================= /** NBT key for CustomModelData (used for model overrides) */ public static final String NBT_CUSTOM_MODEL_DATA = "CustomModelData"; @@ -352,9 +348,7 @@ public class KidnapperItemSelector { return color != null ? "_" + color.getName() : ""; } - // ========================================= // COLOR VALIDATION - // ========================================= /** * Get a random color that has a texture for the given bind variant. diff --git a/src/main/java/com/tiedup/remake/entities/KidnapperJobManager.java b/src/main/java/com/tiedup/remake/entities/KidnapperJobManager.java index e7b7ef7..7d2499b 100644 --- a/src/main/java/com/tiedup/remake/entities/KidnapperJobManager.java +++ b/src/main/java/com/tiedup/remake/entities/KidnapperJobManager.java @@ -1,21 +1,21 @@ package com.tiedup.remake.entities; import com.tiedup.remake.core.TiedUpMod; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.items.ModItems; import com.tiedup.remake.items.base.ItemCollar; import com.tiedup.remake.state.CollarRegistry; import com.tiedup.remake.state.IBondageState; import com.tiedup.remake.util.tasks.ItemTask; import com.tiedup.remake.util.tasks.JobLoader; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.UUID; -import org.jetbrains.annotations.Nullable; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.Nullable; /** * Manages the job system for EntityKidnapper. @@ -47,9 +47,7 @@ public class KidnapperJobManager { this.kidnapper = kidnapper; } - // ======================================== // STATE QUERIES - // ======================================== /** * Check if waiting for worker to complete job. @@ -95,9 +93,7 @@ public class KidnapperJobManager { return kidnapper.level().getPlayerByUUID(this.jobWorkerUUID); } - // ======================================== // JOB ASSIGNMENT - // ======================================== /** * Assign a job to the kidnapper's current captive. @@ -222,9 +218,7 @@ public class KidnapperJobManager { } } - // ======================================== // COLLAR REGISTRY - // ======================================== /** * Register a job collar in the CollarRegistry. @@ -286,9 +280,7 @@ public class KidnapperJobManager { ); } - // ======================================== // NBT PERSISTENCE - // ======================================== /** * Save job manager state to NBT. diff --git a/src/main/java/com/tiedup/remake/entities/LeashProxyEntity.java b/src/main/java/com/tiedup/remake/entities/LeashProxyEntity.java index 91cc4ac..9600210 100644 --- a/src/main/java/com/tiedup/remake/entities/LeashProxyEntity.java +++ b/src/main/java/com/tiedup/remake/entities/LeashProxyEntity.java @@ -1,10 +1,10 @@ package com.tiedup.remake.entities; import com.tiedup.remake.items.ModItems; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.items.base.BindVariant; import com.tiedup.remake.state.IBondageState; import com.tiedup.remake.util.KidnappedHelper; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.Objects; import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.server.MinecraftServer; diff --git a/src/main/java/com/tiedup/remake/entities/ModEntities.java b/src/main/java/com/tiedup/remake/entities/ModEntities.java index 0e85996..46047dd 100644 --- a/src/main/java/com/tiedup/remake/entities/ModEntities.java +++ b/src/main/java/com/tiedup/remake/entities/ModEntities.java @@ -9,10 +9,6 @@ import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; /** - * Phase 8: Master-Slave Relationships - * Phase 14.2: EntityDamsel NPC - * Phase 14.3: EntityKidnapper NPC - * Phase 14.3.6: EntityKidnapperElite NPC * * Registry for custom entities added by the TiedUp mod. * @@ -22,7 +18,7 @@ import net.minecraftforge.registries.RegistryObject; * - EntityKidnapperElite: Rare, faster kidnapper variant * - LeashProxyEntity: Invisible turtle for player leashing (via mixin) * - * Future Entities (Phase 14.4+): + * Future Entities: * - EntityBondageFurniture: Furniture for bondage scenes * * @see EntityDamsel @@ -42,7 +38,6 @@ public class ModEntities { /** * Damsel Entity * - * Phase 14.2: Capturable NPC with full bondage support * * Purpose: * - Capturable female NPCs that can be restrained and enslaved @@ -73,7 +68,6 @@ public class ModEntities { /** * Shiny Damsel Entity * - * Phase 1: Data-Driven Skin System - Shiny Damsels * * Purpose: * - Rare variant of regular Damsel @@ -104,7 +98,6 @@ public class ModEntities { /** * Kidnapper Entity * - * Phase 14.3: Aggressive NPC that captures and enslaves players * * Purpose: * - Hunts and captures players @@ -134,7 +127,6 @@ public class ModEntities { /** * Elite Kidnapper Entity * - * Phase 14.3.6: Rare, faster, more dangerous kidnapper variant * * Purpose: * - Rare spawn (elite version of kidnapper) @@ -204,7 +196,6 @@ public class ModEntities { /** * Archer Kidnapper Entity * - * Phase 18: Ranged kidnapper that attacks with rope arrows * * Purpose: * - Attacks from range with rope arrows @@ -235,7 +226,6 @@ public class ModEntities { /** * Rope Arrow Entity * - * Phase 15: Arrow projectile that binds targets on hit * * Purpose: * - Ranged restraint tool @@ -265,7 +255,6 @@ public class ModEntities { /** * Kidnap Bomb Entity * - * Phase 16: Primed TNT that applies bondage on explosion * * Purpose: * - TNT that applies bondage instead of destruction @@ -463,7 +452,10 @@ public class ModEntities { */ public static final RegistryObject> FURNITURE = ENTITIES.register("furniture", () -> - EntityType.Builder.of(EntityFurniture::new, MobCategory.MISC) + EntityType.Builder.of( + EntityFurniture::new, + MobCategory.MISC + ) .sized(3.0F, 3.0F) .clientTrackingRange(64) .updateInterval(20) diff --git a/src/main/java/com/tiedup/remake/entities/NpcTypeHelper.java b/src/main/java/com/tiedup/remake/entities/NpcTypeHelper.java index 7d2d70d..d2535fa 100644 --- a/src/main/java/com/tiedup/remake/entities/NpcTypeHelper.java +++ b/src/main/java/com/tiedup/remake/entities/NpcTypeHelper.java @@ -13,6 +13,7 @@ import net.minecraft.world.entity.Entity; * └── EntityKidnapper (+ Elite, Archer, Merchant, Maid, Master, SlaveTrader) */ public final class NpcTypeHelper { + private NpcTypeHelper() {} /** True for EntityDamsel and its non-kidnapper subtypes (DamselShiny, LaborGuard) */ diff --git a/src/main/java/com/tiedup/remake/entities/ai/StuckDetector.java b/src/main/java/com/tiedup/remake/entities/ai/StuckDetector.java index 2e96b9a..5b23074 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/StuckDetector.java +++ b/src/main/java/com/tiedup/remake/entities/ai/StuckDetector.java @@ -3,10 +3,10 @@ package com.tiedup.remake.entities.ai; import com.tiedup.remake.util.KidnapperAIHelper; import java.util.ArrayList; import java.util.List; -import org.jetbrains.annotations.Nullable; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Mob; +import org.jetbrains.annotations.Nullable; /** * Reusable stuck detection for kidnapper AI goals. diff --git a/src/main/java/com/tiedup/remake/entities/ai/damsel/DamselFleeFromPlayerGoal.java b/src/main/java/com/tiedup/remake/entities/ai/damsel/DamselFleeFromPlayerGoal.java index 05ca2fa..cb16241 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/damsel/DamselFleeFromPlayerGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/damsel/DamselFleeFromPlayerGoal.java @@ -16,7 +16,6 @@ import net.minecraft.world.phys.Vec3; /** * AI Goal: Damsel flees from nearby players and kidnappers. * - * Phase 14.2: Based on original EntityAIAvoidKidnapper * *

    Behavior:

    *
      @@ -138,9 +137,7 @@ public class DamselFleeFromPlayerGoal extends Goal { .getEntitiesOfClass( EntityKidnapper.class, searchBox, - k -> - k.isAlive() && - damsel.distanceTo(k) <= maxDistance + k -> k.isAlive() && damsel.distanceTo(k) <= maxDistance ); if (!kidnappers.isEmpty()) { diff --git a/src/main/java/com/tiedup/remake/entities/ai/damsel/DamselPanicGoal.java b/src/main/java/com/tiedup/remake/entities/ai/damsel/DamselPanicGoal.java index 49e1d33..2ab0eb3 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/damsel/DamselPanicGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/damsel/DamselPanicGoal.java @@ -7,7 +7,6 @@ import net.minecraft.world.entity.ai.goal.PanicGoal; /** * AI Goal: Damsel panics and flees when hurt. * - * Phase 14.2: Based on original EntityAIPanicTiedUp * *

      Behavior:

      *
        diff --git a/src/main/java/com/tiedup/remake/entities/ai/damsel/DamselWanderGoal.java b/src/main/java/com/tiedup/remake/entities/ai/damsel/DamselWanderGoal.java index 2ddb9a7..1922085 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/damsel/DamselWanderGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/damsel/DamselWanderGoal.java @@ -6,7 +6,6 @@ import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal; /** * AI Goal: Damsel wanders randomly when not restrained. * - * Phase 14.2: Based on original EntityAIWanderExceptWhenTiedUp * *

        Behavior:

        *
          diff --git a/src/main/java/com/tiedup/remake/entities/ai/damsel/DamselWatchPlayerGoal.java b/src/main/java/com/tiedup/remake/entities/ai/damsel/DamselWatchPlayerGoal.java index bfba6b6..2efe2d1 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/damsel/DamselWatchPlayerGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/damsel/DamselWatchPlayerGoal.java @@ -8,7 +8,6 @@ import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; /** * AI Goal: Damsel watches nearby players. * - * Phase 14.2: Based on original EntityAIWatchClosestBlindfolded * *

          Behavior:

          *
            diff --git a/src/main/java/com/tiedup/remake/entities/ai/kidnapper/AbstractKidnapperFleeGoal.java b/src/main/java/com/tiedup/remake/entities/ai/kidnapper/AbstractKidnapperFleeGoal.java index 2a59afd..63dcb4b 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/kidnapper/AbstractKidnapperFleeGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/kidnapper/AbstractKidnapperFleeGoal.java @@ -13,7 +13,6 @@ import net.minecraft.world.level.Level; /** * Abstract base class for kidnapper flee goals. * - * Phase 3: Refactoring - Consolidates common flee behavior * * Subclasses: * - KidnapperFleeSafeGoal: Flee without slave diff --git a/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperAlertGoal.java b/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperAlertGoal.java index 74bb596..b4ce21b 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperAlertGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperAlertGoal.java @@ -14,7 +14,6 @@ import net.minecraft.world.entity.ai.goal.Goal; /** * AI Goal for EntityKidnapper to actively search for an escaped prisoner. * - * Phase 3: Kidnapper Revamp - Advanced AI * * This goal: * 1. Activates when kidnapper is in ALERT state with a valid alertTarget diff --git a/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperArcherRangedGoal.java b/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperArcherRangedGoal.java index e037e28..d454c77 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperArcherRangedGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperArcherRangedGoal.java @@ -15,7 +15,6 @@ import net.minecraft.world.phys.Vec3; /** * AI Goal for EntityKidnapperArcher to attack targets from range. * - * Phase 18: Archer Kidnappers * * This goal: * 1. Finds targets within bow range (10-25 blocks) diff --git a/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperBringToCellGoal.java b/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperBringToCellGoal.java index 0207368..43b2550 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperBringToCellGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperBringToCellGoal.java @@ -1,7 +1,6 @@ package com.tiedup.remake.entities.ai.kidnapper; import com.tiedup.remake.cells.CampOwnership; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.cells.CellDataV2; import com.tiedup.remake.cells.CellRegistryV2; import com.tiedup.remake.cells.ConfiscatedInventoryRegistry; @@ -20,6 +19,7 @@ import com.tiedup.remake.state.IRestrainable; import com.tiedup.remake.util.KidnappedHelper; import com.tiedup.remake.util.KidnapperAIHelper; import com.tiedup.remake.util.teleport.TeleportHelper; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.ArrayList; import java.util.EnumSet; import java.util.List; @@ -1117,7 +1117,6 @@ public class KidnapperBringToCellGoal extends Goal { } /** - * Phase 2: Confiscate the player's inventory and store in LOOT chest. */ private void confiscateInventory( ServerPlayer player, diff --git a/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperCaptureGoal.java b/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperCaptureGoal.java index 9483226..ff9437b 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperCaptureGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperCaptureGoal.java @@ -1,7 +1,6 @@ package com.tiedup.remake.entities.ai.kidnapper; import com.tiedup.remake.core.SystemMessageManager; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.dialogue.EntityDialogueManager; import com.tiedup.remake.dialogue.EntityDialogueManager.DialogueCategory; @@ -17,6 +16,7 @@ import com.tiedup.remake.prison.PrisonerState; import com.tiedup.remake.state.IBondageState; import com.tiedup.remake.util.KidnappedHelper; import com.tiedup.remake.util.KidnapperAIHelper; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.EnumSet; import java.util.HashMap; import java.util.Map; @@ -32,7 +32,6 @@ import net.minecraft.world.item.ItemStack; /** * AI Goal for EntityKidnapper to capture and enslave targets. * - * Phase 14.3.3: Capture mechanics AI * * This goal: * 1. Moves towards the target @@ -231,7 +230,6 @@ public class KidnapperCaptureGoal extends Goal { return false; } - // Phase 17: Stop if target was already captured by someone else IBondageState state = KidnappedHelper.getKidnappedState(this.target); if (state != null && state.isCaptive()) { TiedUpMod.LOGGER.debug( diff --git a/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperDecideNextActionGoal.java b/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperDecideNextActionGoal.java index 48c9de7..bd5710c 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperDecideNextActionGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperDecideNextActionGoal.java @@ -1,6 +1,5 @@ package com.tiedup.remake.entities.ai.kidnapper; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.cells.CampOwnership; import com.tiedup.remake.cells.CellDataV2; import com.tiedup.remake.cells.CellRegistryV2; @@ -11,6 +10,7 @@ import com.tiedup.remake.dialogue.EntityDialogueManager.DialogueCategory; import com.tiedup.remake.entities.EntityKidnapper; import com.tiedup.remake.prison.service.PrisonerService; import com.tiedup.remake.state.IBondageState; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.ArrayList; import java.util.EnumSet; import java.util.List; @@ -25,7 +25,6 @@ import net.minecraft.world.item.ItemStack; /** * AI Goal for EntityKidnapper to decide what to do after capturing a slave. * - * Phase 14.3.5: Decision system * * This goal activates when: * - Kidnapper has a slave diff --git a/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperFindTargetGoal.java b/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperFindTargetGoal.java index 5f06cd7..9563f2c 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperFindTargetGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperFindTargetGoal.java @@ -8,7 +8,6 @@ import net.minecraft.world.entity.ai.goal.Goal; /** * AI Goal for EntityKidnapper to find suitable targets. * - * Phase 14.3.2: Target acquisition AI * * This goal: * 1. Searches for nearby players and damsels within range diff --git a/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperFleeSafeGoal.java b/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperFleeSafeGoal.java index d36262c..a0ba6a6 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperFleeSafeGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperFleeSafeGoal.java @@ -6,7 +6,6 @@ import com.tiedup.remake.entities.EntityKidnapper; /** * AI Goal for EntityKidnapper to flee to safety without a slave. * - * Phase 14.3.5: Flee behavior without slave * * This goal activates when: * - Kidnapper does NOT have a slave diff --git a/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperFleeWithCaptiveGoal.java b/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperFleeWithCaptiveGoal.java index b962ebf..70afd74 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperFleeWithCaptiveGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperFleeWithCaptiveGoal.java @@ -13,7 +13,6 @@ import net.minecraft.world.item.ItemStack; /** * AI Goal for EntityKidnapper to flee while carrying a captive. * - * Phase 14.3.5: Flee behavior with captive * * This goal activates when: * - Kidnapper has a captive diff --git a/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperPatrolGoal.java b/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperPatrolGoal.java index 552f81f..236c81c 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperPatrolGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperPatrolGoal.java @@ -17,7 +17,6 @@ import net.minecraft.world.phys.Vec3; /** * AI Goal for EntityKidnapper to patrol around their home area. * - * Phase 14.3.4: Patrol behavior for kidnappers * * This goal: * 1. Activates when kidnapper has no target and no slave diff --git a/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperPunishGoal.java b/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperPunishGoal.java index 4b84f6a..eb2009f 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperPunishGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperPunishGoal.java @@ -12,7 +12,6 @@ import net.minecraft.world.entity.ai.goal.Goal; /** * AI Goal for EntityKidnapper to punish a recaptured prisoner. * - * Phase 3: Kidnapper Revamp - Advanced AI * * This goal: * 1. Activates when kidnapper is in PUNISH state with a captive diff --git a/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperState.java b/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperState.java index 2c0e13a..c928f94 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperState.java +++ b/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperState.java @@ -3,7 +3,6 @@ package com.tiedup.remake.entities.ai.kidnapper; /** * Enum defining the behavioral states of a Kidnapper entity. * - * Phase 3: Kidnapper Revamp - Advanced AI States * * These states drive the kidnapper's AI decision-making and help * coordinate behavior between multiple kidnappers. diff --git a/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperWaitForBuyerGoal.java b/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperWaitForBuyerGoal.java index 37257de..691890e 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperWaitForBuyerGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperWaitForBuyerGoal.java @@ -22,7 +22,6 @@ import net.minecraft.world.entity.player.Player; /** * AI Goal for EntityKidnapper to wait for a buyer when selling a slave. * - * Phase 14.3.5: Sale system * * This goal activates when: * - Kidnapper has a slave diff --git a/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperWaitForJobGoal.java b/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperWaitForJobGoal.java index 8e94513..8c3750f 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperWaitForJobGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperWaitForJobGoal.java @@ -1,6 +1,5 @@ package com.tiedup.remake.entities.ai.kidnapper; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.core.SystemMessageManager; import com.tiedup.remake.core.SystemMessageManager.MessageCategory; import com.tiedup.remake.core.TiedUpMod; @@ -12,6 +11,7 @@ import com.tiedup.remake.prison.PrisonerRecord; import com.tiedup.remake.state.IRestrainable; import com.tiedup.remake.util.KidnappedHelper; import com.tiedup.remake.util.tasks.ItemTask; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.EnumSet; import java.util.List; import net.minecraft.world.entity.ai.goal.Goal; @@ -21,7 +21,6 @@ import net.minecraft.world.item.ItemStack; /** * AI Goal for EntityKidnapper to wait for a worker to complete a job. * - * Phase 14.3.5: Job system * * This goal activates when: * - Kidnapper has assigned a job (isWaitingForJobToBeCompleted) diff --git a/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperWalkPrisonerGoal.java b/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperWalkPrisonerGoal.java index 8d4b961..a0c5534 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperWalkPrisonerGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/kidnapper/KidnapperWalkPrisonerGoal.java @@ -1,7 +1,6 @@ package com.tiedup.remake.entities.ai.kidnapper; import com.tiedup.remake.cells.CellDataV2; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.cells.CellRegistryV2; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.dialogue.DialogueBridge; @@ -14,6 +13,7 @@ import com.tiedup.remake.items.base.BindVariant; import com.tiedup.remake.state.IBondageState; import com.tiedup.remake.util.KidnappedHelper; import com.tiedup.remake.util.KidnapperAIHelper; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.ArrayList; import java.util.EnumSet; import java.util.List; @@ -701,7 +701,10 @@ public class KidnapperWalkPrisonerGoal extends Goal { } // Find the prisoner - IBondageState prisoner = findPrisoner(serverLevel, this.walkedPrisonerId); + IBondageState prisoner = findPrisoner( + serverLevel, + this.walkedPrisonerId + ); if (prisoner == null || !prisoner.asLivingEntity().isAlive()) { // Prisoner died or disappeared - abort TiedUpMod.LOGGER.debug( diff --git a/src/main/java/com/tiedup/remake/entities/ai/maid/MaidCollectRansomGoal.java b/src/main/java/com/tiedup/remake/entities/ai/maid/MaidCollectRansomGoal.java index e5363a8..e0823a2 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/maid/MaidCollectRansomGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/maid/MaidCollectRansomGoal.java @@ -143,16 +143,13 @@ public class MaidCollectRansomGoal extends Goal { collectTicks++; if (!itemsCollected) { - // Phase 1: Go to collect target and collect items tickCollectPhase(target); } else { - // Phase 2: Return to trader tickReturnPhase(); } } /** - * Phase 1: Walk to target and collect items. */ private void tickCollectPhase(BlockPos target) { // Look at target @@ -194,7 +191,6 @@ public class MaidCollectRansomGoal extends Goal { } /** - * Phase 2: Return to trader with collected items. */ private void tickReturnPhase() { // Refresh trader reference if null diff --git a/src/main/java/com/tiedup/remake/entities/ai/maid/MaidDeliverCaptiveGoal.java b/src/main/java/com/tiedup/remake/entities/ai/maid/MaidDeliverCaptiveGoal.java index 5f03327..4b642db 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/maid/MaidDeliverCaptiveGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/maid/MaidDeliverCaptiveGoal.java @@ -1,10 +1,10 @@ package com.tiedup.remake.entities.ai.maid; import com.tiedup.remake.core.TiedUpMod; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.entities.EntityMaid; import com.tiedup.remake.state.IRestrainable; import com.tiedup.remake.util.KidnappedHelper; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.EnumSet; import java.util.UUID; import net.minecraft.server.level.ServerLevel; diff --git a/src/main/java/com/tiedup/remake/entities/ai/maid/goals/MaidAssignTaskGoal.java b/src/main/java/com/tiedup/remake/entities/ai/maid/goals/MaidAssignTaskGoal.java index 160abd0..15e6ae7 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/maid/goals/MaidAssignTaskGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/maid/goals/MaidAssignTaskGoal.java @@ -1,7 +1,6 @@ package com.tiedup.remake.entities.ai.maid.goals; import com.tiedup.remake.cells.CellDataV2; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.cells.CellRegistryV2; import com.tiedup.remake.core.ModConfig; import com.tiedup.remake.core.TiedUpMod; @@ -15,6 +14,7 @@ import com.tiedup.remake.prison.PrisonerState; import com.tiedup.remake.prison.RansomRecord; import com.tiedup.remake.state.IBondageState; import com.tiedup.remake.util.KidnappedHelper; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.EnumSet; import java.util.Set; import java.util.UUID; @@ -274,7 +274,9 @@ public class MaidAssignTaskGoal extends Goal { // 7. Free kidnapped state and remove all restraints IBondageState cap = KidnappedHelper.getKidnappedState(prisoner); if (cap != null) { - net.minecraft.world.item.ItemStack collar = cap.getEquipment(BodyRegionV2.NECK); + net.minecraft.world.item.ItemStack collar = cap.getEquipment( + BodyRegionV2.NECK + ); if (!collar.isEmpty()) { com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper.unequipFromRegion( prisoner, diff --git a/src/main/java/com/tiedup/remake/entities/ai/maid/goals/MaidReturnGoal.java b/src/main/java/com/tiedup/remake/entities/ai/maid/goals/MaidReturnGoal.java index 2ff8d5c..5d31ded 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/maid/goals/MaidReturnGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/maid/goals/MaidReturnGoal.java @@ -1,7 +1,6 @@ package com.tiedup.remake.entities.ai.maid.goals; import com.tiedup.remake.cells.CellDataV2; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.cells.CellRegistryV2; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.entities.EntityMaid; @@ -19,6 +18,7 @@ import com.tiedup.remake.state.ICaptor; import com.tiedup.remake.util.KidnappedHelper; import com.tiedup.remake.util.KidnapperAIHelper; import com.tiedup.remake.util.MessageDispatcher; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.ArrayList; import java.util.EnumSet; import java.util.List; @@ -213,7 +213,6 @@ public class MaidReturnGoal extends Goal { } /** - * Phase 1: Walk toward prisoner. When close enough, leash them. */ private void tickApproachPrisoner( ServerLevel level, @@ -244,7 +243,6 @@ public class MaidReturnGoal extends Goal { } /** - * Phase 2: Walk to cell with leashed prisoner following. * Uses WaypointNavigator if path waypoints are defined, else vanilla pathfinding. */ private void tickWalkToCell(ServerLevel level, ServerPlayer prisoner) { @@ -338,7 +336,8 @@ public class MaidReturnGoal extends Goal { } } else { // Fallback: use basic rope if no snapshot - cap.equip(BodyRegionV2.ARMS, + cap.equip( + BodyRegionV2.ARMS, new ItemStack( com.tiedup.remake.items.ModItems.getBind( com.tiedup.remake.items.base.BindVariant.ROPES @@ -651,7 +650,9 @@ public class MaidReturnGoal extends Goal { IBondageState cap = KidnappedHelper.getKidnappedState(prisoner); if (cap != null) { // Remove collar (force=true to bypass lock) - net.minecraft.world.item.ItemStack collar = cap.getEquipment(BodyRegionV2.NECK); + net.minecraft.world.item.ItemStack collar = cap.getEquipment( + BodyRegionV2.NECK + ); if (!collar.isEmpty()) { com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper.unequipFromRegion( prisoner, diff --git a/src/main/java/com/tiedup/remake/entities/ai/master/MasterBuyPlayerGoal.java b/src/main/java/com/tiedup/remake/entities/ai/master/MasterBuyPlayerGoal.java index 781757b..d561f3e 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/master/MasterBuyPlayerGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/master/MasterBuyPlayerGoal.java @@ -1,11 +1,11 @@ package com.tiedup.remake.entities.ai.master; import com.tiedup.remake.core.TiedUpMod; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.dialogue.DialogueBridge; import com.tiedup.remake.entities.EntityKidnapper; import com.tiedup.remake.entities.EntityMaster; import com.tiedup.remake.state.IRestrainable; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.EnumSet; import java.util.List; import net.minecraft.server.level.ServerPlayer; @@ -157,9 +157,7 @@ public class MasterBuyPlayerGoal extends Goal { TiedUpMod.LOGGER.debug( "[MasterBuyPlayerGoal] {} approaching {} to buy player", master.getNpcName(), - targetKidnapper != null - ? targetKidnapper.getNpcName() - : "unknown" + targetKidnapper != null ? targetKidnapper.getNpcName() : "unknown" ); } @@ -484,19 +482,29 @@ public class MasterBuyPlayerGoal extends Goal { // Manually remove each region EXCEPT neck (collar) and torso (clothes) com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper.unequipFromRegion( - player, com.tiedup.remake.v2.BodyRegionV2.ARMS, true + player, + com.tiedup.remake.v2.BodyRegionV2.ARMS, + true ); com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper.unequipFromRegion( - player, com.tiedup.remake.v2.BodyRegionV2.MOUTH, true + player, + com.tiedup.remake.v2.BodyRegionV2.MOUTH, + true ); com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper.unequipFromRegion( - player, com.tiedup.remake.v2.BodyRegionV2.EYES, true + player, + com.tiedup.remake.v2.BodyRegionV2.EYES, + true ); com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper.unequipFromRegion( - player, com.tiedup.remake.v2.BodyRegionV2.EARS, true + player, + com.tiedup.remake.v2.BodyRegionV2.EARS, + true ); com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper.unequipFromRegion( - player, com.tiedup.remake.v2.BodyRegionV2.HANDS, true + player, + com.tiedup.remake.v2.BodyRegionV2.HANDS, + true ); // V1 speed reduction handled by MovementStyleManager (V2 tick-based). diff --git a/src/main/java/com/tiedup/remake/entities/ai/master/MasterDogwalkGoal.java b/src/main/java/com/tiedup/remake/entities/ai/master/MasterDogwalkGoal.java index 9802772..7bac706 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/master/MasterDogwalkGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/master/MasterDogwalkGoal.java @@ -1,11 +1,11 @@ package com.tiedup.remake.entities.ai.master; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.dialogue.DialogueBridge; import com.tiedup.remake.entities.EntityMaster; import com.tiedup.remake.state.IPlayerLeashAccess; import com.tiedup.remake.state.PlayerBindState; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.EnumSet; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerPlayer; diff --git a/src/main/java/com/tiedup/remake/entities/ai/master/MasterHumanChairGoal.java b/src/main/java/com/tiedup/remake/entities/ai/master/MasterHumanChairGoal.java index 03c6a5a..37f0716 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/master/MasterHumanChairGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/master/MasterHumanChairGoal.java @@ -1,13 +1,13 @@ package com.tiedup.remake.entities.ai.master; import com.tiedup.remake.core.TiedUpMod; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.dialogue.DialogueBridge; import com.tiedup.remake.entities.EntityMaster; import com.tiedup.remake.items.ModItems; import com.tiedup.remake.items.base.BindVariant; import com.tiedup.remake.state.HumanChairHelper; import com.tiedup.remake.state.PlayerBindState; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.EnumSet; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerPlayer; @@ -156,9 +156,7 @@ public class MasterHumanChairGoal extends Goal { } } - // ======================================== // PHASE: APPROACHING - // ======================================== private void tickApproaching(ServerPlayer pet) { master.getLookControl().setLookAt(pet, 30.0F, 30.0F); @@ -177,9 +175,7 @@ public class MasterHumanChairGoal extends Goal { } } - // ======================================== // PHASE: SETTLING - // ======================================== private void tickSettling(ServerPlayer pet) { master.getLookControl().setLookAt(pet, 30.0F, 30.0F); @@ -224,9 +220,7 @@ public class MasterHumanChairGoal extends Goal { } } - // ======================================== // PHASE: SITTING - // ======================================== private void tickSitting(ServerPlayer pet) { phaseTimer++; @@ -281,9 +275,7 @@ public class MasterHumanChairGoal extends Goal { } } - // ======================================== // IDLE BEHAVIORS DURING SITTING - // ======================================== private void tickIdleBehavior(ServerPlayer pet) { // Periodically look at nearby entities or comment @@ -356,9 +348,7 @@ public class MasterHumanChairGoal extends Goal { } } - // ======================================== // POSITIONING - // ======================================== /** * Position master on pet's back, facing sideways (perpendicular). @@ -390,9 +380,7 @@ public class MasterHumanChairGoal extends Goal { master.setDeltaMovement(0, 0, 0); } - // ======================================== // POSE MANAGEMENT - // ======================================== /** * Apply the human chair pose to the pet: diff --git a/src/main/java/com/tiedup/remake/entities/ai/master/MasterPlaceBlockGoal.java b/src/main/java/com/tiedup/remake/entities/ai/master/MasterPlaceBlockGoal.java index 3f1136d..57f8427 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/master/MasterPlaceBlockGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/master/MasterPlaceBlockGoal.java @@ -403,9 +403,7 @@ public class MasterPlaceBlockGoal extends Goal { } } - // ======================================== // FIX: NBT PERSISTENCE FOR PLACED BLOCKS - // ======================================== /** * Get the currently placed block position (for NBT saving). diff --git a/src/main/java/com/tiedup/remake/entities/ai/master/MasterRandomEventGoal.java b/src/main/java/com/tiedup/remake/entities/ai/master/MasterRandomEventGoal.java index 3e2be87..bec353d 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/master/MasterRandomEventGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/master/MasterRandomEventGoal.java @@ -360,18 +360,15 @@ public class MasterRandomEventGoal extends Goal { this.currentEvent = null; } - // ======================================== // STATIC CLEANUP METHODS - // ======================================== /** All body regions that can have temporary master event items */ - private static final List TEMP_ITEM_CLEANUP_REGIONS = - List.of( - BodyRegionV2.ARMS, - BodyRegionV2.EYES, - BodyRegionV2.MOUTH, - BodyRegionV2.HANDS - ); + private static final List TEMP_ITEM_CLEANUP_REGIONS = List.of( + BodyRegionV2.ARMS, + BodyRegionV2.EYES, + BodyRegionV2.MOUTH, + BodyRegionV2.HANDS + ); /** * Check and cleanup any expired temporary master event items on a player. diff --git a/src/main/java/com/tiedup/remake/entities/ai/master/MasterTaskAssignGoal.java b/src/main/java/com/tiedup/remake/entities/ai/master/MasterTaskAssignGoal.java index 4874049..33f6a91 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/master/MasterTaskAssignGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/master/MasterTaskAssignGoal.java @@ -374,9 +374,7 @@ public class MasterTaskAssignGoal extends Goal { master.setMasterState(MasterState.TASK_ASSIGN); } - // ======================================== // DEMAND TASK - INVENTORY SCANNING - // ======================================== /** * Scan pet's inventory and find the most valuable item to demand. diff --git a/src/main/java/com/tiedup/remake/entities/ai/master/MasterTaskWatchGoal.java b/src/main/java/com/tiedup/remake/entities/ai/master/MasterTaskWatchGoal.java index ea0789a..444d754 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/master/MasterTaskWatchGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/master/MasterTaskWatchGoal.java @@ -1,12 +1,12 @@ package com.tiedup.remake.entities.ai.master; import com.tiedup.remake.core.TiedUpMod; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.dialogue.DialogueBridge; import com.tiedup.remake.entities.EntityMaster; import com.tiedup.remake.items.ItemChokeCollar; import com.tiedup.remake.state.PlayerBindState; import com.tiedup.remake.util.MessageDispatcher; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.EnumSet; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; diff --git a/src/main/java/com/tiedup/remake/entities/ai/personality/AbstractNpcJobGoal.java b/src/main/java/com/tiedup/remake/entities/ai/personality/AbstractNpcJobGoal.java index f16ddf2..848bae2 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/personality/AbstractNpcJobGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/personality/AbstractNpcJobGoal.java @@ -52,8 +52,11 @@ public abstract class AbstractNpcJobGoal extends Goal { protected final EntityDamsel npc; protected final double speedModifier; - @Nullable protected BlockPos chestPos; - @Nullable protected Player master; + @Nullable + protected BlockPos chestPos; + + @Nullable + protected Player master; protected List heldItems = new ArrayList<>(); protected int phase; @@ -188,7 +191,12 @@ public abstract class AbstractNpcJobGoal extends Goal { onStop(); if (!heldItems.isEmpty() && chestPos != null) { - NpcGoalHelper.storeItemsInChest(npc, npc.level(), chestPos, heldItems); + NpcGoalHelper.storeItemsInChest( + npc, + npc.level(), + chestPos, + heldItems + ); } this.chestPos = null; @@ -217,7 +225,10 @@ public abstract class AbstractNpcJobGoal extends Goal { private void tickScanning() { if (--this.scanTimer <= 0) { - float efficiency = NpcGoalHelper.getJobEfficiency(npc, getCommand()); + float efficiency = NpcGoalHelper.getJobEfficiency( + npc, + getCommand() + ); this.scanTimer = (int) (SCAN_INTERVAL / efficiency); // Check if we need to store items first @@ -253,19 +264,26 @@ public abstract class AbstractNpcJobGoal extends Goal { // Move towards chest if (--this.pathRecalcTimer <= 0) { this.pathRecalcTimer = 10; - npc.getNavigation().moveTo( - chestPos.getX() + 0.5, - chestPos.getY(), - chestPos.getZ() + 0.5, - speedModifier - ); + npc + .getNavigation() + .moveTo( + chestPos.getX() + 0.5, + chestPos.getY(), + chestPos.getZ() + 0.5, + speedModifier + ); } // Check if close enough to store double dist = npc.blockPosition().distSqr(chestPos); double interactDist = getInteractDistance(); if (dist <= interactDist * interactDist) { - NpcGoalHelper.storeItemsInChest(npc, npc.level(), chestPos, heldItems); + NpcGoalHelper.storeItemsInChest( + npc, + npc.level(), + chestPos, + heldItems + ); heldItems.clear(); this.phase = PHASE_SCANNING; this.scanTimer = 0; diff --git a/src/main/java/com/tiedup/remake/entities/ai/personality/NpcFarmCommandGoal.java b/src/main/java/com/tiedup/remake/entities/ai/personality/NpcFarmCommandGoal.java index d88947f..92d8880 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/personality/NpcFarmCommandGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/personality/NpcFarmCommandGoal.java @@ -101,7 +101,9 @@ public class NpcFarmCommandGoal extends AbstractNpcJobGoal { speakJobIdleDialogue(); this.jobIdleTalkCooldown = JOB_IDLE_TALK_MIN + - npc.getRandom().nextInt(JOB_IDLE_TALK_MAX - JOB_IDLE_TALK_MIN); + npc + .getRandom() + .nextInt(JOB_IDLE_TALK_MAX - JOB_IDLE_TALK_MIN); } } } @@ -136,12 +138,14 @@ public class NpcFarmCommandGoal extends AbstractNpcJobGoal { // Move towards crop if (--this.pathRecalcTimer <= 0) { this.pathRecalcTimer = 10; - npc.getNavigation().moveTo( - targetCrop.getX() + 0.5, - targetCrop.getY(), - targetCrop.getZ() + 0.5, - speedModifier - ); + npc + .getNavigation() + .moveTo( + targetCrop.getX() + 0.5, + targetCrop.getY(), + targetCrop.getZ() + 0.5, + speedModifier + ); } // Check if close enough to harvest @@ -186,8 +190,14 @@ public class NpcFarmCommandGoal extends AbstractNpcJobGoal { } // Apply yield bonus from experience - float yieldMult = NpcGoalHelper.getJobYieldMultiplier(npc, NpcCommand.FARM); - if (yieldMult > 1.0f && npc.getRandom().nextFloat() < (yieldMult - 1.0f)) { + float yieldMult = NpcGoalHelper.getJobYieldMultiplier( + npc, + NpcCommand.FARM + ); + if ( + yieldMult > 1.0f && + npc.getRandom().nextFloat() < (yieldMult - 1.0f) + ) { if (!drops.isEmpty()) { ItemStack bonusDrop = drops .get(npc.getRandom().nextInt(drops.size())) @@ -209,14 +219,23 @@ public class NpcFarmCommandGoal extends AbstractNpcJobGoal { } // Sound effect - level.playSound(null, targetCrop, SoundEvents.CROP_BREAK, SoundSource.BLOCKS, 1.0f, 1.0f); + level.playSound( + null, + targetCrop, + SoundEvents.CROP_BREAK, + SoundSource.BLOCKS, + 1.0f, + 1.0f + ); // Look at the crop - npc.getLookControl().setLookAt( - targetCrop.getX() + 0.5, - targetCrop.getY() + 0.5, - targetCrop.getZ() + 0.5 - ); + npc + .getLookControl() + .setLookAt( + targetCrop.getX() + 0.5, + targetCrop.getY() + 0.5, + targetCrop.getZ() + 0.5 + ); harvestCooldown = 10; @@ -245,13 +264,19 @@ public class NpcFarmCommandGoal extends AbstractNpcJobGoal { if (player == null) return; String dialogueId = - com.tiedup.remake.dialogue.DialogueTriggerSystem.selectProactiveDialogue(npc); + com.tiedup.remake.dialogue.DialogueTriggerSystem.selectProactiveDialogue( + npc + ); if (dialogueId == null || dialogueId.startsWith("idle.")) { dialogueId = "jobs.idle.farm"; } - com.tiedup.remake.dialogue.EntityDialogueManager.talkByDialogueId(npc, player, dialogueId); + com.tiedup.remake.dialogue.EntityDialogueManager.talkByDialogueId( + npc, + player, + dialogueId + ); } @Nullable @@ -321,7 +346,9 @@ public class NpcFarmCommandGoal extends AbstractNpcJobGoal { @Nullable private BlockState getCropStateForSeed(ItemStack seed) { if (seed.is(Items.WHEAT_SEEDS)) return Blocks.WHEAT.defaultBlockState(); - if (seed.is(Items.BEETROOT_SEEDS)) return Blocks.BEETROOTS.defaultBlockState(); + if ( + seed.is(Items.BEETROOT_SEEDS) + ) return Blocks.BEETROOTS.defaultBlockState(); if (seed.is(Items.CARROT)) return Blocks.CARROTS.defaultBlockState(); if (seed.is(Items.POTATO)) return Blocks.POTATOES.defaultBlockState(); return null; diff --git a/src/main/java/com/tiedup/remake/entities/ai/personality/NpcFishCommandGoal.java b/src/main/java/com/tiedup/remake/entities/ai/personality/NpcFishCommandGoal.java index ec11bde..dad3c70 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/personality/NpcFishCommandGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/personality/NpcFishCommandGoal.java @@ -125,19 +125,23 @@ public class NpcFishCommandGoal extends AbstractNpcJobGoal { this.pathRecalcTimer = 10; BlockPos adjacentPos = findAdjacentSolidBlock(waterPos); if (adjacentPos != null) { - npc.getNavigation().moveTo( - adjacentPos.getX() + 0.5, - adjacentPos.getY(), - adjacentPos.getZ() + 0.5, - speedModifier - ); + npc + .getNavigation() + .moveTo( + adjacentPos.getX() + 0.5, + adjacentPos.getY(), + adjacentPos.getZ() + 0.5, + speedModifier + ); } else { - npc.getNavigation().moveTo( - waterPos.getX() + 0.5, - waterPos.getY() + 1, - waterPos.getZ() + 0.5, - speedModifier - ); + npc + .getNavigation() + .moveTo( + waterPos.getX() + 0.5, + waterPos.getY() + 1, + waterPos.getZ() + 0.5, + speedModifier + ); } } @@ -156,11 +160,13 @@ public class NpcFishCommandGoal extends AbstractNpcJobGoal { } // Look at water while preparing to cast - npc.getLookControl().setLookAt( - waterPos.getX() + 0.5, - waterPos.getY() + 0.5, - waterPos.getZ() + 0.5 - ); + npc + .getLookControl() + .setLookAt( + waterPos.getX() + 0.5, + waterPos.getY() + 0.5, + waterPos.getZ() + 0.5 + ); if (--this.castDelay > 0) { return; @@ -178,7 +184,9 @@ public class NpcFishCommandGoal extends AbstractNpcJobGoal { // Cast sound level.playSound( null, - npc.getX(), npc.getY(), npc.getZ(), + npc.getX(), + npc.getY(), + npc.getZ(), SoundEvents.FISHING_BOBBER_THROW, SoundSource.NEUTRAL, 0.5f, @@ -197,11 +205,13 @@ public class NpcFishCommandGoal extends AbstractNpcJobGoal { } // Look at bobber while waiting - npc.getLookControl().setLookAt( - activeBobber.getX(), - activeBobber.getY(), - activeBobber.getZ() - ); + npc + .getLookControl() + .setLookAt( + activeBobber.getX(), + activeBobber.getY(), + activeBobber.getZ() + ); if (activeBobber.isBiting()) { this.phase = PHASE_REELING; @@ -223,8 +233,13 @@ public class NpcFishCommandGoal extends AbstractNpcJobGoal { } // Apply yield bonus - float yieldMult = NpcGoalHelper.getJobYieldMultiplier(npc, NpcCommand.FISH); - if (yieldMult > 1.0f && npc.getRandom().nextFloat() < (yieldMult - 1.0f)) { + float yieldMult = NpcGoalHelper.getJobYieldMultiplier( + npc, + NpcCommand.FISH + ); + if ( + yieldMult > 1.0f && npc.getRandom().nextFloat() < (yieldMult - 1.0f) + ) { if (!loot.isEmpty()) { ItemStack bonusDrop = loot .get(npc.getRandom().nextInt(loot.size())) @@ -237,10 +252,13 @@ public class NpcFishCommandGoal extends AbstractNpcJobGoal { // Reel sound level.playSound( null, - npc.getX(), npc.getY(), npc.getZ(), + npc.getX(), + npc.getY(), + npc.getZ(), SoundEvents.FISHING_BOBBER_RETRIEVE, SoundSource.NEUTRAL, - 1.0f, 1.0f + 1.0f, + 1.0f ); // Drain rest @@ -281,10 +299,14 @@ public class NpcFishCommandGoal extends AbstractNpcJobGoal { .getLootTable(BuiltInLootTables.FISHING); float experienceLuck = - NpcGoalHelper.getJobYieldMultiplier(npc, NpcCommand.FISH) - 1.0f; + NpcGoalHelper.getJobYieldMultiplier(npc, NpcCommand.FISH) - + 1.0f; LootParams params = new LootParams.Builder(serverLevel) - .withParameter(LootContextParams.ORIGIN, new Vec3(npc.getX(), npc.getY(), npc.getZ())) + .withParameter( + LootContextParams.ORIGIN, + new Vec3(npc.getX(), npc.getY(), npc.getZ()) + ) .withParameter(LootContextParams.THIS_ENTITY, npc) .withLuck(experienceLuck) .create(LootContextParamSets.FISHING); @@ -342,7 +364,9 @@ public class NpcFishCommandGoal extends AbstractNpcJobGoal { chestPos.getZ() + z ); - if (level.getBlockState(mutable).getBlock() == Blocks.WATER) { + if ( + level.getBlockState(mutable).getBlock() == Blocks.WATER + ) { double dist = npc.blockPosition().distSqr(mutable); if (dist < nearestDist) { nearest = mutable.immutable(); @@ -369,7 +393,9 @@ public class NpcFishCommandGoal extends AbstractNpcJobGoal { for (BlockPos adjacent : offsets) { if ( level.getBlockState(adjacent).isAir() && - level.getBlockState(adjacent.below()).isSolidRender(level, adjacent.below()) + level + .getBlockState(adjacent.below()) + .isSolidRender(level, adjacent.below()) ) { return adjacent; } diff --git a/src/main/java/com/tiedup/remake/entities/ai/personality/NpcFollowCommandGoal.java b/src/main/java/com/tiedup/remake/entities/ai/personality/NpcFollowCommandGoal.java index b00582d..33a29f3 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/personality/NpcFollowCommandGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/personality/NpcFollowCommandGoal.java @@ -1,10 +1,10 @@ package com.tiedup.remake.entities.ai.personality; import com.tiedup.remake.entities.EntityDamsel; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.items.base.ItemBind; import com.tiedup.remake.personality.NpcCommand; import com.tiedup.remake.personality.ToolMode; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.EnumSet; import java.util.List; import javax.annotation.Nullable; @@ -506,9 +506,7 @@ public class NpcFollowCommandGoal extends Goal { if (dist <= ATTACK_RANGE) { // Try to capture using bind item ItemStack bindItem = npc.getMainHandItem(); - if ( - bindItem.getItem() instanceof ItemBind - ) { + if (bindItem.getItem() instanceof ItemBind) { // Apply bind to target captureTarget.equip(BodyRegionV2.ARMS, bindItem.copy()); diff --git a/src/main/java/com/tiedup/remake/entities/ai/personality/NpcGoalHelper.java b/src/main/java/com/tiedup/remake/entities/ai/personality/NpcGoalHelper.java index e6a03b9..50a0a70 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/personality/NpcGoalHelper.java +++ b/src/main/java/com/tiedup/remake/entities/ai/personality/NpcGoalHelper.java @@ -7,7 +7,6 @@ import com.tiedup.remake.personality.NpcCommand; import com.tiedup.remake.personality.PersonalityState; import java.util.List; import java.util.UUID; -import org.jetbrains.annotations.Nullable; import net.minecraft.core.BlockPos; import net.minecraft.core.NonNullList; import net.minecraft.server.level.ServerLevel; @@ -19,6 +18,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.ChestBlock; import net.minecraft.world.level.block.entity.ChestBlockEntity; +import org.jetbrains.annotations.Nullable; /** * Utility methods shared by NPC command goals. diff --git a/src/main/java/com/tiedup/remake/entities/ai/personality/NpcGuardCommandGoal.java b/src/main/java/com/tiedup/remake/entities/ai/personality/NpcGuardCommandGoal.java index d1375dd..0f44bb5 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/personality/NpcGuardCommandGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/personality/NpcGuardCommandGoal.java @@ -1,11 +1,11 @@ package com.tiedup.remake.entities.ai.personality; import com.tiedup.remake.entities.EntityDamsel; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.items.base.ItemBind; import com.tiedup.remake.items.base.ItemCollar; import com.tiedup.remake.personality.NpcCommand; import com.tiedup.remake.personality.PersonalityState; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.EnumSet; import java.util.List; import java.util.UUID; @@ -426,9 +426,7 @@ public class NpcGuardCommandGoal extends Goal { NonNullList inventory = npc.getNpcInventory(); for (int i = 0; i < inventory.size(); i++) { ItemStack stack = inventory.get(i); - if ( - stack.getItem() instanceof ItemBind - ) { + if (stack.getItem() instanceof ItemBind) { // Apply bind to slave slave.equip(BodyRegionV2.ARMS, stack.copy()); stack.shrink(1); diff --git a/src/main/java/com/tiedup/remake/entities/ai/personality/NpcIdleCommandGoal.java b/src/main/java/com/tiedup/remake/entities/ai/personality/NpcIdleCommandGoal.java index ef910d7..eda1ef8 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/personality/NpcIdleCommandGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/personality/NpcIdleCommandGoal.java @@ -26,7 +26,7 @@ import net.minecraft.world.entity.player.Player; * *

            Also handles idle dialogue and XP awards.

            * - * Personality System Phase 5: Living Jobs + * Personality System Living Jobs */ public class NpcIdleCommandGoal extends Goal { diff --git a/src/main/java/com/tiedup/remake/entities/ai/personality/NpcStruggleGoal.java b/src/main/java/com/tiedup/remake/entities/ai/personality/NpcStruggleGoal.java index babd254..ced4324 100644 --- a/src/main/java/com/tiedup/remake/entities/ai/personality/NpcStruggleGoal.java +++ b/src/main/java/com/tiedup/remake/entities/ai/personality/NpcStruggleGoal.java @@ -1,12 +1,12 @@ package com.tiedup.remake.entities.ai.personality; +import com.tiedup.remake.core.SettingsAccessor; import com.tiedup.remake.entities.EntityDamsel; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.items.base.IHasResistance; import com.tiedup.remake.personality.PersonalityState; import com.tiedup.remake.personality.PersonalityType; -import com.tiedup.remake.core.SettingsAccessor; import com.tiedup.remake.util.TiedUpSounds; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.EnumSet; import java.util.List; import java.util.UUID; @@ -66,7 +66,9 @@ public class NpcStruggleGoal extends Goal { @Override public boolean canUse() { // Check game rule - if (!SettingsAccessor.isNpcStruggleEnabled(npc.level().getGameRules())) { + if ( + !SettingsAccessor.isNpcStruggleEnabled(npc.level().getGameRules()) + ) { return false; } @@ -275,7 +277,9 @@ public class NpcStruggleGoal extends Goal { * Get the base struggle interval from game rules. */ private int getBaseInterval() { - return SettingsAccessor.getNpcStruggleInterval(npc.level().getGameRules()); + return SettingsAccessor.getNpcStruggleInterval( + npc.level().getGameRules() + ); } /** diff --git a/src/main/java/com/tiedup/remake/entities/armorstand/ArmorStandBondageClientCache.java b/src/main/java/com/tiedup/remake/entities/armorstand/ArmorStandBondageClientCache.java index ed1ad05..240cfb2 100644 --- a/src/main/java/com/tiedup/remake/entities/armorstand/ArmorStandBondageClientCache.java +++ b/src/main/java/com/tiedup/remake/entities/armorstand/ArmorStandBondageClientCache.java @@ -29,8 +29,9 @@ public class ArmorStandBondageClientCache { */ public static class BondageData { - private final EnumMap items = - new EnumMap<>(BodyRegionV2.class); + private final EnumMap items = new EnumMap<>( + BodyRegionV2.class + ); public ItemStack getItem(BodyRegionV2 region) { return items.getOrDefault(region, ItemStack.EMPTY); diff --git a/src/main/java/com/tiedup/remake/entities/armorstand/ArmorStandBondageHelper.java b/src/main/java/com/tiedup/remake/entities/armorstand/ArmorStandBondageHelper.java index 58a1f49..8e8a2a1 100644 --- a/src/main/java/com/tiedup/remake/entities/armorstand/ArmorStandBondageHelper.java +++ b/src/main/java/com/tiedup/remake/entities/armorstand/ArmorStandBondageHelper.java @@ -3,13 +3,12 @@ package com.tiedup.remake.entities.armorstand; import com.tiedup.remake.items.base.ItemBind; import com.tiedup.remake.items.base.PoseType; import com.tiedup.remake.v2.BodyRegionV2; +import java.util.Map; import net.minecraft.core.Rotations; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.decoration.ArmorStand; import net.minecraft.world.item.ItemStack; -import java.util.Map; - /** * Helper class for storing and retrieving bondage items on armor stands. * Uses NBT storage in the armor stand's persistent data. @@ -34,7 +33,7 @@ public class ArmorStandBondageHelper { BodyRegionV2.EARS, BodyRegionV2.NECK, BodyRegionV2.TORSO, - BodyRegionV2.HANDS + BodyRegionV2.HANDS, }; /** @@ -42,13 +41,20 @@ public class ArmorStandBondageHelper { * Used as fallback when reading old armor stand data. */ private static final Map LEGACY_KEYS = Map.of( - "bind", BodyRegionV2.ARMS, - "gag", BodyRegionV2.MOUTH, - "blindfold", BodyRegionV2.EYES, - "earplugs", BodyRegionV2.EARS, - "collar", BodyRegionV2.NECK, - "clothes", BodyRegionV2.TORSO, - "mittens", BodyRegionV2.HANDS + "bind", + BodyRegionV2.ARMS, + "gag", + BodyRegionV2.MOUTH, + "blindfold", + BodyRegionV2.EYES, + "earplugs", + BodyRegionV2.EARS, + "collar", + BodyRegionV2.NECK, + "clothes", + BodyRegionV2.TORSO, + "mittens", + BodyRegionV2.HANDS ); /** @@ -78,7 +84,10 @@ public class ArmorStandBondageHelper { // Fallback: try legacy V1 key for (Map.Entry entry : LEGACY_KEYS.entrySet()) { - if (entry.getValue() == region && bondageTag.contains(entry.getKey())) { + if ( + entry.getValue() == region && + bondageTag.contains(entry.getKey()) + ) { return ItemStack.of(bondageTag.getCompound(entry.getKey())); } } diff --git a/src/main/java/com/tiedup/remake/entities/armorstand/ArmorStandInteractionHandler.java b/src/main/java/com/tiedup/remake/entities/armorstand/ArmorStandInteractionHandler.java index 8c14619..5223744 100644 --- a/src/main/java/com/tiedup/remake/entities/armorstand/ArmorStandInteractionHandler.java +++ b/src/main/java/com/tiedup/remake/entities/armorstand/ArmorStandInteractionHandler.java @@ -1,10 +1,10 @@ package com.tiedup.remake.entities.armorstand; import com.tiedup.remake.core.TiedUpMod; -import com.tiedup.remake.v2.bondage.IV2BondageItem; import com.tiedup.remake.network.ModNetwork; import com.tiedup.remake.network.armorstand.PacketSyncArmorStandBondage; import com.tiedup.remake.v2.BodyRegionV2; +import com.tiedup.remake.v2.bondage.IV2BondageItem; import java.util.Set; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionResult; @@ -61,7 +61,9 @@ public class ArmorStandInteractionHandler { // Try to equip bondage item if (heldItem.getItem() instanceof IV2BondageItem bondageItem) { // Use primary region (first occupied region) - Set regions = bondageItem.getOccupiedRegions(heldItem); + Set regions = bondageItem.getOccupiedRegions( + heldItem + ); if (regions.isEmpty()) return; // Data-driven item with missing definition BodyRegionV2 region = regions.iterator().next(); diff --git a/src/main/java/com/tiedup/remake/entities/damsel/components/DamselAIController.java b/src/main/java/com/tiedup/remake/entities/damsel/components/DamselAIController.java index f89633c..d9fa23b 100644 --- a/src/main/java/com/tiedup/remake/entities/damsel/components/DamselAIController.java +++ b/src/main/java/com/tiedup/remake/entities/damsel/components/DamselAIController.java @@ -22,16 +22,13 @@ import net.minecraft.world.level.Level; * - Call for help system (captive calling for rescue) * - Leash traction system (prevents stuck while leashed) * - * Phase 5: Extracted from EntityDamsel.java (~450 lines, 5 methods) */ public class DamselAIController { private final EntityDamsel entity; private final IAIHost host; - // ======================================== // CALL FOR HELP SYSTEM - // ======================================== /** Cooldown between call for help messages */ private int callForHelpCooldown = 0; @@ -45,9 +42,7 @@ public class DamselAIController { /** Maximum cooldown for call for help (10 seconds) */ private static final int CALL_FOR_HELP_COOLDOWN_MAX = 200; - // ======================================== // LEASH TRACTION SYSTEM - // ======================================== /** Counter for how long NPC has been stuck while leashed */ private int leashStuckCounter = 0; @@ -76,18 +71,14 @@ public class DamselAIController { /** FIX: Force ramp factor - gradual increase based on distance */ private static final double LEASH_FORCE_RAMP = 0.05; - // ======================================== // CONSTRUCTOR - // ======================================== public DamselAIController(EntityDamsel entity, IAIHost host) { this.entity = entity; this.host = host; } - // ======================================== // AI GOALS REGISTRATION - // ======================================== /** * Register all AI goals for this entity. @@ -154,9 +145,7 @@ public class DamselAIController { goalSelector.addGoal(7, new OpenDoorGoal(entity, false)); } - // ======================================== // COMMAND GOALS UTILITY - // ======================================== /** * Register all NPC command goals on a goal selector. @@ -193,9 +182,7 @@ public class DamselAIController { goalSelector.addGoal(priority, new NpcSortCommandGoal(entity, 1.0)); } - // ======================================== // CALL FOR HELP SYSTEM - // ======================================== /** * Periodically call for help to nearby players when being led as a captive. @@ -282,9 +269,7 @@ public class DamselAIController { } } - // ======================================== // LEASH TRACTION SYSTEM - // ======================================== /** * Tick leash traction system for NPCs. diff --git a/src/main/java/com/tiedup/remake/entities/damsel/components/DamselAnimationController.java b/src/main/java/com/tiedup/remake/entities/damsel/components/DamselAnimationController.java index fca96c4..0b2dc49 100644 --- a/src/main/java/com/tiedup/remake/entities/damsel/components/DamselAnimationController.java +++ b/src/main/java/com/tiedup/remake/entities/damsel/components/DamselAnimationController.java @@ -6,8 +6,8 @@ import dev.kosmx.playerAnim.api.layered.IAnimation; import dev.kosmx.playerAnim.impl.animation.AnimationApplier; import java.util.HashMap; import java.util.Map; -import org.jetbrains.annotations.Nullable; import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.Nullable; /** * Manages all animation-related systems for EntityDamsel: @@ -16,15 +16,12 @@ import net.minecraft.resources.ResourceLocation; * - Pose management (sitting, kneeling, dog, struggling, trembling) * - Dog pose rotation smoothing * - * Phase 3: Extracted from EntityDamsel.java (~220 lines, 14 methods) */ public class DamselAnimationController { private final IAnimationHost host; - // ======================================== // ANIMATION SYSTEM - // ======================================== /** Animation stack for PlayerAnimator mod */ private final AnimationStack animationStack = new AnimationStack(); @@ -38,9 +35,7 @@ public class DamselAnimationController { private final Map storedAnimations = new HashMap<>(); - // ======================================== // DOG POSE ROTATION SMOOTHING - // ======================================== /** Rotation smoother for DOG pose (prevents sudden spinning) */ private final RotationSmoother dogPoseRotationSmoother = @@ -49,17 +44,13 @@ public class DamselAnimationController { /** Track DOG pose state for transition detection */ private boolean wasInDogPose = false; - // ======================================== // CONSTRUCTOR - // ======================================== public DamselAnimationController(IAnimationHost host) { this.host = host; } - // ======================================== // TICK LOGIC - // ======================================== /** * Tick animation systems BEFORE super.tick(). @@ -126,9 +117,7 @@ public class DamselAnimationController { return false; // Server-side, continue with tick logic } - // ======================================== // IANIMATEDPLAYER INTERFACE - // ======================================== /** * Get the animation stack. @@ -184,9 +173,7 @@ public class DamselAnimationController { return this.storedAnimations.put(id, animation); } - // ======================================== // POSE MANAGEMENT - // ======================================== /** * Check if NPC is currently sitting. diff --git a/src/main/java/com/tiedup/remake/entities/damsel/components/DamselAppearance.java b/src/main/java/com/tiedup/remake/entities/damsel/components/DamselAppearance.java index c833d4b..ff18eb7 100644 --- a/src/main/java/com/tiedup/remake/entities/damsel/components/DamselAppearance.java +++ b/src/main/java/com/tiedup/remake/entities/damsel/components/DamselAppearance.java @@ -4,10 +4,10 @@ import com.tiedup.remake.entities.DamselVariant; import com.tiedup.remake.entities.EntityDamsel; import com.tiedup.remake.entities.skins.DamselSkinManager; import com.tiedup.remake.entities.skins.Gender; -import org.jetbrains.annotations.Nullable; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.Nullable; /** * Manages the visual appearance of a Damsel NPC. @@ -18,7 +18,6 @@ import net.minecraft.resources.ResourceLocation; * - Slim arms flag * - Custom name * - * Phase 1 of EntityDamsel refactoring (8 phases total). */ public class DamselAppearance { @@ -44,9 +43,7 @@ public class DamselAppearance { this.entity = entity; } - // ======================================== // VARIANT SYSTEM - // ======================================== /** * Get the current variant. @@ -113,9 +110,7 @@ public class DamselAppearance { this.variant = null; } - // ======================================== // SLIM ARMS - // ======================================== /** * Check if this damsel uses slim arms model. @@ -133,9 +128,7 @@ public class DamselAppearance { this.entity.getEntityData().set(EntityDamsel.DATA_SLIM_ARMS, slimArms); } - // ======================================== // GENDER - // ======================================== public void setGender(Gender gender) { this.entity.getEntityData().set( @@ -150,9 +143,7 @@ public class DamselAppearance { ); } - // ======================================== // SKIN TEXTURE - // ======================================== /** * Get the skin texture for this entity. @@ -170,9 +161,7 @@ public class DamselAppearance { return DEFAULT_DAMSEL_TEXTURE; } - // ======================================== // NAME SYSTEM - // ======================================== /** * Get NPC's custom name. @@ -193,9 +182,7 @@ public class DamselAppearance { this.entity.setCustomNameVisible(true); } - // ======================================== // NBT SERIALIZATION - // ======================================== /** * Save appearance data to NBT tag. diff --git a/src/main/java/com/tiedup/remake/entities/damsel/components/DamselBondageManager.java b/src/main/java/com/tiedup/remake/entities/damsel/components/DamselBondageManager.java index 1a82af0..351c61e 100644 --- a/src/main/java/com/tiedup/remake/entities/damsel/components/DamselBondageManager.java +++ b/src/main/java/com/tiedup/remake/entities/damsel/components/DamselBondageManager.java @@ -4,14 +4,14 @@ import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.entities.AbstractTiedUpNpc; import com.tiedup.remake.entities.BondageServiceHandler; import com.tiedup.remake.items.base.ItemCollar; +import com.tiedup.remake.state.ICaptor; import com.tiedup.remake.state.IRestrainable; import com.tiedup.remake.state.IRestrainableEntity; -import com.tiedup.remake.v2.BodyRegionV2; -import com.tiedup.remake.state.ICaptor; import com.tiedup.remake.util.RestraintEffectUtils; import com.tiedup.remake.util.tasks.ItemTask; import com.tiedup.remake.util.teleport.Position; import com.tiedup.remake.util.teleport.TeleportHelper; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.UUID; import javax.annotation.Nullable; import net.minecraft.nbt.CompoundTag; @@ -38,9 +38,7 @@ import net.minecraft.world.level.Level; */ public class DamselBondageManager implements IRestrainable { - // ======================================== // FIELDS - // ======================================== private final AbstractTiedUpNpc entity; private final IBondageHost host; @@ -52,9 +50,7 @@ public class DamselBondageManager implements IRestrainable { private boolean forSale; private ItemTask salePrice; - // ======================================== // CONSTRUCTOR - // ======================================== public DamselBondageManager(AbstractTiedUpNpc entity, IBondageHost host) { this.entity = entity; @@ -66,9 +62,7 @@ public class DamselBondageManager implements IRestrainable { this.salePrice = null; } - // ======================================== // SUB-COMPONENT ACCESS - // ======================================== /** Expose equipment sub-component for direct access where needed. */ public NpcEquipmentManager getEquipmentManager() { @@ -80,27 +74,83 @@ public class DamselBondageManager implements IRestrainable { return captivity; } - // ======================================== // IBondageState DELEGATION -> equipment - // ======================================== - @Override public boolean isTiedUp() { return equipment.isTiedUp(); } - @Override public boolean isGagged() { return equipment.isGagged(); } - @Override public boolean isBlindfolded() { return equipment.isBlindfolded(); } - @Override public boolean hasEarplugs() { return equipment.hasEarplugs(); } - @Override public boolean hasCollar() { return equipment.hasCollar(); } - @Override public boolean hasClothes() { return equipment.hasClothes(); } - @Override public boolean hasMittens() { return equipment.hasMittens(); } - @Override public boolean isBoundAndGagged() { return equipment.isBoundAndGagged(); } - @Override public boolean hasGaggingEffect() { return equipment.hasGaggingEffect(); } - @Override public boolean hasBlindingEffect() { return equipment.hasBlindingEffect(); } - @Override public boolean hasKnives() { return equipment.hasKnives(); } - @Override public boolean hasClothesWithSmallArms() { return equipment.hasClothesWithSmallArms(); } - @Override public boolean hasLockedCollar() { return equipment.hasLockedCollar(); } - @Override public boolean hasNamedCollar() { return equipment.hasNamedCollar(); } + @Override + public boolean isTiedUp() { + return equipment.isTiedUp(); + } + + @Override + public boolean isGagged() { + return equipment.isGagged(); + } + + @Override + public boolean isBlindfolded() { + return equipment.isBlindfolded(); + } + + @Override + public boolean hasEarplugs() { + return equipment.hasEarplugs(); + } + + @Override + public boolean hasCollar() { + return equipment.hasCollar(); + } + + @Override + public boolean hasClothes() { + return equipment.hasClothes(); + } + + @Override + public boolean hasMittens() { + return equipment.hasMittens(); + } + + @Override + public boolean isBoundAndGagged() { + return equipment.isBoundAndGagged(); + } + + @Override + public boolean hasGaggingEffect() { + return equipment.hasGaggingEffect(); + } + + @Override + public boolean hasBlindingEffect() { + return equipment.hasBlindingEffect(); + } + + @Override + public boolean hasKnives() { + return equipment.hasKnives(); + } + + @Override + public boolean hasClothesWithSmallArms() { + return equipment.hasClothesWithSmallArms(); + } + + @Override + public boolean hasLockedCollar() { + return equipment.hasLockedCollar(); + } + + @Override + public boolean hasNamedCollar() { + return equipment.hasNamedCollar(); + } // V2 region-based equipment access - @Override public ItemStack getEquipment(BodyRegionV2 region) { return equipment.getInRegion(region); } + @Override + public ItemStack getEquipment(BodyRegionV2 region) { + return equipment.getInRegion(region); + } @Override public void equip(BodyRegionV2 region, ItemStack stack) { @@ -112,18 +162,39 @@ public class DamselBondageManager implements IRestrainable { case NECK -> equipment.putCollarOn(stack); case TORSO -> equipment.putClothesOn(stack); case HANDS -> equipment.putMittensOn(stack); - default -> {} + default -> { + } } } // Equipment putters (local delegates — no longer in interface, but still called by legacy code) - public void putBindOn(ItemStack bind) { equipment.putBindOn(bind); } - public void putGagOn(ItemStack gag) { equipment.putGagOn(gag); } - public void putBlindfoldOn(ItemStack blindfold) { equipment.putBlindfoldOn(blindfold); } - public void putEarplugsOn(ItemStack earplugs) { equipment.putEarplugsOn(earplugs); } - public void putCollarOn(ItemStack collar) { equipment.putCollarOn(collar); } - public void putClothesOn(ItemStack clothes) { equipment.putClothesOn(clothes); } - public void putMittensOn(ItemStack mittens) { equipment.putMittensOn(mittens); } + public void putBindOn(ItemStack bind) { + equipment.putBindOn(bind); + } + + public void putGagOn(ItemStack gag) { + equipment.putGagOn(gag); + } + + public void putBlindfoldOn(ItemStack blindfold) { + equipment.putBlindfoldOn(blindfold); + } + + public void putEarplugsOn(ItemStack earplugs) { + equipment.putEarplugsOn(earplugs); + } + + public void putCollarOn(ItemStack collar) { + equipment.putCollarOn(collar); + } + + public void putClothesOn(ItemStack clothes) { + equipment.putClothesOn(clothes); + } + + public void putMittensOn(ItemStack mittens) { + equipment.putMittensOn(mittens); + } // Equipment removers (V2 region-based) @Override @@ -149,18 +220,45 @@ public class DamselBondageManager implements IRestrainable { } // Legacy equipment removers (local delegates for internal use) - public ItemStack takeBindOff() { return equipment.takeBindOff(); } - public ItemStack takeGagOff() { return equipment.takeGagOff(); } - public ItemStack takeBlindfoldOff() { return equipment.takeBlindfoldOff(); } - public ItemStack takeEarplugsOff() { return equipment.takeEarplugsOff(); } - public ItemStack takeCollarOff() { return equipment.takeCollarOff(); } - public ItemStack takeCollarOff(boolean force) { return equipment.takeCollarOff(force); } - public ItemStack takeClothesOff() { return equipment.takeClothesOff(); } - public ItemStack takeMittensOff() { return equipment.takeMittensOff(); } + public ItemStack takeBindOff() { + return equipment.takeBindOff(); + } + + public ItemStack takeGagOff() { + return equipment.takeGagOff(); + } + + public ItemStack takeBlindfoldOff() { + return equipment.takeBlindfoldOff(); + } + + public ItemStack takeEarplugsOff() { + return equipment.takeEarplugsOff(); + } + + public ItemStack takeCollarOff() { + return equipment.takeCollarOff(); + } + + public ItemStack takeCollarOff(boolean force) { + return equipment.takeCollarOff(force); + } + + public ItemStack takeClothesOff() { + return equipment.takeClothesOff(); + } + + public ItemStack takeMittensOff() { + return equipment.takeMittensOff(); + } // Equipment replacer (V2 region-based) @Override - public ItemStack replaceEquipment(BodyRegionV2 region, ItemStack newStack, boolean force) { + public ItemStack replaceEquipment( + BodyRegionV2 region, + ItemStack newStack, + boolean force + ) { return switch (region) { case ARMS -> equipment.replaceBind(newStack, force); case MOUTH -> equipment.replaceGag(newStack, force); @@ -176,67 +274,181 @@ public class DamselBondageManager implements IRestrainable { // Bulk operations @Override public void applyBondage( - ItemStack bind, ItemStack gag, ItemStack blindfold, - ItemStack earplugs, ItemStack collar, ItemStack clothes + ItemStack bind, + ItemStack gag, + ItemStack blindfold, + ItemStack earplugs, + ItemStack collar, + ItemStack clothes ) { equipment.applyBondage(bind, gag, blindfold, earplugs, collar, clothes); } - @Override public void dropBondageItems(boolean drop) { equipment.dropBondageItems(drop); } - @Override public void dropBondageItems(boolean drop, boolean dropBind) { equipment.dropBondageItems(drop, dropBind); } @Override - public void dropBondageItems( - boolean drop, boolean dropBind, boolean dropGag, - boolean dropBlindfold, boolean dropEarplugs, - boolean dropCollar, boolean dropClothes - ) { - equipment.dropBondageItems(drop, dropBind, dropGag, dropBlindfold, - dropEarplugs, dropCollar, dropClothes); + public void dropBondageItems(boolean drop) { + equipment.dropBondageItems(drop); } - @Override public void dropClothes() { equipment.dropClothes(); } - @Override public int getBondageItemsWhichCanBeRemovedCount() { return equipment.getBondageItemsWhichCanBeRemovedCount(); } - @Override public boolean canBeTiedUp() { return equipment.canBeTiedUp(); } + @Override + public void dropBondageItems(boolean drop, boolean dropBind) { + equipment.dropBondageItems(drop, dropBind); + } + + @Override + public void dropBondageItems( + boolean drop, + boolean dropBind, + boolean dropGag, + boolean dropBlindfold, + boolean dropEarplugs, + boolean dropCollar, + boolean dropClothes + ) { + equipment.dropBondageItems( + drop, + dropBind, + dropGag, + dropBlindfold, + dropEarplugs, + dropCollar, + dropClothes + ); + } + + @Override + public void dropClothes() { + equipment.dropClothes(); + } + + @Override + public int getBondageItemsWhichCanBeRemovedCount() { + return equipment.getBondageItemsWhichCanBeRemovedCount(); + } + + @Override + public boolean canBeTiedUp() { + return equipment.canBeTiedUp(); + } // Permissions - @Override public boolean canTakeOffClothes(Player player) { return equipment.canTakeOffClothes(player); } - @Override public boolean canChangeClothes(Player player) { return equipment.canChangeClothes(player); } - @Override public boolean canChangeClothes() { return equipment.canChangeClothes(); } + @Override + public boolean canTakeOffClothes(Player player) { + return equipment.canTakeOffClothes(player); + } + + @Override + public boolean canChangeClothes(Player player) { + return equipment.canChangeClothes(player); + } + + @Override + public boolean canChangeClothes() { + return equipment.canChangeClothes(); + } // ICoercible DELEGATION -> equipment - @Override public void tighten(Player tightener) { equipment.tighten(tightener); } - @Override public void applyChloroform(int duration) { equipment.applyChloroform(duration); } - @Override public void shockKidnapped() { equipment.shockKidnapped(); } - @Override public void shockKidnapped(String messageAddon, float damage) { equipment.shockKidnapped(messageAddon, damage); } - @Override public void takeBondageItemBy(IRestrainableEntity taker, int slotIndex) { equipment.takeBondageItemBy(taker, slotIndex); } + @Override + public void tighten(Player tightener) { + equipment.tighten(tightener); + } + + @Override + public void applyChloroform(int duration) { + equipment.applyChloroform(duration); + } + + @Override + public void shockKidnapped() { + equipment.shockKidnapped(); + } + + @Override + public void shockKidnapped(String messageAddon, float damage) { + equipment.shockKidnapped(messageAddon, damage); + } + + @Override + public void takeBondageItemBy(IRestrainableEntity taker, int slotIndex) { + equipment.takeBondageItemBy(taker, slotIndex); + } - // ======================================== // ICapturable DELEGATION -> captivity - // ======================================== - @Override public boolean isCaptive() { return captivity.isCaptive(); } - @Override public boolean isEnslavable() { return captivity.isEnslavable(); } - @Override public ICaptor getCaptor() { return captivity.getCaptor(); } - @Override public boolean getCapturedBy(ICaptor newCaptor) { return captivity.getCapturedBy(newCaptor); } - @Override public void free() { captivity.free(); } - @Override public void free(boolean transportState) { captivity.free(transportState); } - @Override public void transferCaptivityTo(ICaptor newCaptor) { captivity.transferCaptivityTo(newCaptor); } - @Override public boolean isTiedToPole() { return captivity.isTiedToPole(); } - @Override public boolean tieToClosestPole(int searchRadius) { return captivity.tieToClosestPole(searchRadius); } - @Override public boolean canBeKidnappedByEvents() { return captivity.canBeKidnappedByEvents(); } - @Override @Nullable public Entity getTransport() { return null; } // NPCs use vanilla leash directly + @Override + public boolean isCaptive() { + return captivity.isCaptive(); + } + + @Override + public boolean isEnslavable() { + return captivity.isEnslavable(); + } + + @Override + public ICaptor getCaptor() { + return captivity.getCaptor(); + } + + @Override + public boolean getCapturedBy(ICaptor newCaptor) { + return captivity.getCapturedBy(newCaptor); + } + + @Override + public void free() { + captivity.free(); + } + + @Override + public void free(boolean transportState) { + captivity.free(transportState); + } + + @Override + public void transferCaptivityTo(ICaptor newCaptor) { + captivity.transferCaptivityTo(newCaptor); + } + + @Override + public boolean isTiedToPole() { + return captivity.isTiedToPole(); + } + + @Override + public boolean tieToClosestPole(int searchRadius) { + return captivity.tieToClosestPole(searchRadius); + } + + @Override + public boolean canBeKidnappedByEvents() { + return captivity.canBeKidnappedByEvents(); + } + + @Override + @Nullable + public Entity getTransport() { + return null; + } // NPCs use vanilla leash directly // Public methods not on IRestrainable but used externally - public void clearCaptor() { captivity.clearCaptor(); } - public boolean forceCapturedBy(ICaptor newCaptor) { return captivity.forceCapturedBy(newCaptor); } - public void restoreCaptorFromUUID() { captivity.restoreCaptorFromUUID(); } + public void clearCaptor() { + captivity.clearCaptor(); + } + + public boolean forceCapturedBy(ICaptor newCaptor) { + return captivity.forceCapturedBy(newCaptor); + } + + public void restoreCaptorFromUUID() { + captivity.restoreCaptorFromUUID(); + } // Collar owner check (public, used by AbstractTiedUpNpc) - public boolean isCollarOwner(Player player) { return equipment.isCollarOwner(player); } + public boolean isCollarOwner(Player player) { + return equipment.isCollarOwner(player); + } - // ======================================== // ISaleable -- INLINE (4 methods, 2 fields) - // ======================================== @Override public boolean isForSell() { @@ -276,9 +488,7 @@ public class DamselBondageManager implements IRestrainable { salePrice = null; } - // ======================================== // IRestrainableEntity -- IDENTITY (stays in facade) - // ======================================== @Override public LivingEntity asLivingEntity() { @@ -320,9 +530,7 @@ public class DamselBondageManager implements IRestrainable { TeleportHelper.teleportEntity(entity, position); } - // ======================================== // CROSS-CUTTING METHODS (stay in facade) - // ======================================== /** * Untie: crosses both equipment and captivity domains. @@ -402,9 +610,7 @@ public class DamselBondageManager implements IRestrainable { return true; } - // ======================================== // BONDAGE SERVICE DELEGATION - // ======================================== public boolean isBondageServiceEnabled() { return bondageService.isEnabled(); @@ -432,9 +638,7 @@ public class DamselBondageManager implements IRestrainable { return true; } - // ======================================== // PERSISTENCE ORCHESTRATION - // ======================================== /** * Save bondage state to NBT. diff --git a/src/main/java/com/tiedup/remake/entities/damsel/components/DamselDataSerializer.java b/src/main/java/com/tiedup/remake/entities/damsel/components/DamselDataSerializer.java index 9e44c9e..6cdda59 100644 --- a/src/main/java/com/tiedup/remake/entities/damsel/components/DamselDataSerializer.java +++ b/src/main/java/com/tiedup/remake/entities/damsel/components/DamselDataSerializer.java @@ -7,7 +7,6 @@ import net.minecraft.nbt.CompoundTag; * Orchestrates NBT serialization/deserialization for all EntityDamsel components. * Provides a single entry point for save/load operations. * - * Phase 8: Final refactoring phase - NBT orchestration. */ public class DamselDataSerializer { @@ -24,12 +23,10 @@ public class DamselDataSerializer { * @param tag NBT compound tag to write to */ public void save(CompoundTag tag) { - // Phase 1: Appearance (variant, gender, name, slim arms) entity.getAppearance().saveToTag(tag); // Bondage + Inventory are now saved by AbstractTiedUpNpc.addAdditionalSaveData() - // Phase 6: Personality (traits, needs, relationships, commands) entity.getPersonalitySystem().saveToTag(tag); // Reward tracker (savior, rewards) @@ -43,12 +40,10 @@ public class DamselDataSerializer { * @param tag NBT compound tag to read from */ public void load(CompoundTag tag) { - // Phase 1: Appearance (variant, gender, name, slim arms) entity.getAppearance().loadFromTag(tag); // Bondage + Inventory are now loaded by AbstractTiedUpNpc.readAdditionalSaveData() - // Phase 6: Personality (traits, needs, relationships, commands) entity.getPersonalitySystem().loadFromTag(tag); // Reward tracker (savior, rewards) diff --git a/src/main/java/com/tiedup/remake/entities/damsel/components/DamselDialogueHandler.java b/src/main/java/com/tiedup/remake/entities/damsel/components/DamselDialogueHandler.java index 2a6494b..eaf8955 100644 --- a/src/main/java/com/tiedup/remake/entities/damsel/components/DamselDialogueHandler.java +++ b/src/main/java/com/tiedup/remake/entities/damsel/components/DamselDialogueHandler.java @@ -13,7 +13,6 @@ import net.minecraft.world.entity.player.Player; * - Radius-based dialogue (talkToPlayersInRadius, actionToPlayersInRadius) * - Cooldown management for dialogue categories * - * Phase 4: Extracted from EntityDamsel.java (~180 lines, 9 methods) */ public class DamselDialogueHandler { @@ -27,9 +26,7 @@ public class DamselDialogueHandler { this.host = host; } - // ======================================== // DIRECT DIALOGUE - // ======================================== /** * Send a direct message to a player. @@ -67,9 +64,7 @@ public class DamselDialogueHandler { EntityDialogueManager.actionTo(host.getEntity(), player, category); } - // ======================================== // RADIUS-BASED DIALOGUE - // ======================================== /** * Send a message to all players within radius. diff --git a/src/main/java/com/tiedup/remake/entities/damsel/components/DamselInventoryManager.java b/src/main/java/com/tiedup/remake/entities/damsel/components/DamselInventoryManager.java index 933f12f..4d21677 100644 --- a/src/main/java/com/tiedup/remake/entities/damsel/components/DamselInventoryManager.java +++ b/src/main/java/com/tiedup/remake/entities/damsel/components/DamselInventoryManager.java @@ -32,7 +32,6 @@ import net.minecraft.world.level.block.entity.ChestBlockEntity; * - Feeding system (auto-eat, player feeding) * - MenuProvider (GUI access) * - * Phase 2 of EntityDamsel refactoring (8 phases total). */ public class DamselInventoryManager { @@ -62,9 +61,7 @@ public class DamselInventoryManager { this.armorInventory = NonNullList.withSize(4, ItemStack.EMPTY); } - // ======================================== // EQUIPMENT SLOTS - // ======================================== /** * Get item in equipment slot. @@ -116,7 +113,9 @@ public class DamselInventoryManager { * Implements Mob.getMainHandItem(). */ public ItemStack getMainHandItem() { - return this.entity.getEntityData().get(AbstractTiedUpNpc.DATA_MAIN_HAND); + return this.entity.getEntityData().get( + AbstractTiedUpNpc.DATA_MAIN_HAND + ); } /** @@ -125,12 +124,13 @@ public class DamselInventoryManager { * @param stack Item to hold */ public void setMainHandItem(ItemStack stack) { - this.entity.getEntityData().set(AbstractTiedUpNpc.DATA_MAIN_HAND, stack); + this.entity.getEntityData().set( + AbstractTiedUpNpc.DATA_MAIN_HAND, + stack + ); } - // ======================================== // NPC INVENTORY - // ======================================== /** * Get the NPC's carry inventory. @@ -178,9 +178,7 @@ public class DamselInventoryManager { this.npcInventorySize = newSize; } - // ======================================== // FEEDING SYSTEM - // ======================================== /** * Check if the NPC has any edible item in their inventory. @@ -376,7 +374,10 @@ public class DamselInventoryManager { ? "action.feed.starving" : "action.feed"; // Cast safe: feedByPlayer is only called from EntityDamsel which IS an EntityDamsel - if (this.entity instanceof com.tiedup.remake.entities.EntityDamsel damsel) { + if ( + this.entity instanceof + com.tiedup.remake.entities.EntityDamsel damsel + ) { com.tiedup.remake.dialogue.EntityDialogueManager.talkByDialogueId( damsel, player, @@ -387,9 +388,7 @@ public class DamselInventoryManager { return true; } - // ======================================== // MENU PROVIDER - // ======================================== /** * Create inventory menu for player access. @@ -415,9 +414,7 @@ public class DamselInventoryManager { ); } - // ======================================== // NBT SERIALIZATION - // ======================================== /** * Save inventory data to NBT tag. diff --git a/src/main/java/com/tiedup/remake/entities/damsel/components/DamselPersonalitySystem.java b/src/main/java/com/tiedup/remake/entities/damsel/components/DamselPersonalitySystem.java index a94c18b..aeff9f9 100644 --- a/src/main/java/com/tiedup/remake/entities/damsel/components/DamselPersonalitySystem.java +++ b/src/main/java/com/tiedup/remake/entities/damsel/components/DamselPersonalitySystem.java @@ -1,18 +1,18 @@ package com.tiedup.remake.entities.damsel.components; import com.tiedup.remake.core.TiedUpMod; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.dialogue.EntityDialogueManager; import com.tiedup.remake.items.base.ItemCollar; import com.tiedup.remake.personality.*; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.*; -import org.jetbrains.annotations.Nullable; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.ai.attributes.AttributeInstance; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.Nullable; /** * Manages all personality-related systems for EntityDamsel: @@ -21,16 +21,13 @@ import net.minecraft.world.item.ItemStack; * - Rest/fatigue modifiers * - Command execution * - * Phase 6: Extracted from EntityDamsel.java (~700 lines, 22 methods) */ public class DamselPersonalitySystem { private final com.tiedup.remake.entities.EntityDamsel entity; private final IPersonalityTickContext context; - // ======================================== // DIALOGUE SYSTEM CONSTANTS - // ======================================== /** Minimum cooldown between idle dialogues (4 minutes). */ private static final int IDLE_DIALOGUE_COOLDOWN_MIN = 4800; @@ -47,9 +44,7 @@ public class DamselPersonalitySystem { /** Approach detection radius (blocks). */ private static final double APPROACH_RADIUS = 5.0; - // ======================================== // REST SYSTEM CONSTANTS - // ======================================== /** UUID for rest-based speed modifier. */ private static final UUID REST_SPEED_MODIFIER_UUID = UUID.fromString( @@ -64,9 +59,7 @@ public class DamselPersonalitySystem { /** Ticks between rest modifier updates (1 second). */ private static final int REST_MODIFIER_UPDATE_INTERVAL = 20; - // ======================================== // PERSONALITY STATE - // ======================================== /** * Complete personality state including: @@ -82,9 +75,7 @@ public class DamselPersonalitySystem { @Nullable private PersonalityState personalityState; - // ======================================== // DIALOGUE COOLDOWNS - // ======================================== /** Cooldown for idle dialogue (in ticks). */ private int idleDialogueCooldown = 0; @@ -107,9 +98,7 @@ public class DamselPersonalitySystem { Long > dialogueCooldowns = new HashMap<>(); - // ======================================== // REST SYSTEM MODIFIERS - // ======================================== /** Last applied speed modifier from rest system */ private float lastRestSpeedMod = 0.0f; @@ -117,9 +106,7 @@ public class DamselPersonalitySystem { /** Last applied damage modifier from rest system */ private float lastRestDamageMod = 0.0f; - // ======================================== // ANTI-FLEE SYSTEM - // ======================================== /** * World time when last whipped. @@ -127,9 +114,7 @@ public class DamselPersonalitySystem { */ private long lastWhipTime = 0; - // ======================================== // CONSTRUCTOR - // ======================================== public DamselPersonalitySystem( com.tiedup.remake.entities.EntityDamsel entity, @@ -139,9 +124,7 @@ public class DamselPersonalitySystem { this.context = context; } - // ======================================== // INITIALIZATION & SYNC - // ======================================== /** * Initialize personality state with random generation. @@ -184,9 +167,7 @@ public class DamselPersonalitySystem { } } - // ======================================== // TICK LOGIC - // ======================================== /** * Main personality tick - delegates to PersonalityState and handles side effects. @@ -336,9 +317,7 @@ public class DamselPersonalitySystem { } } - // ======================================== // DIALOGUE SYSTEMS - // ======================================== /** * Tick idle dialogue system (random chatter). @@ -554,9 +533,7 @@ public class DamselPersonalitySystem { } } - // ======================================== // PUBLIC PERSONALITY API - // ======================================== /** * Get the personality state (lazy-init on server side). @@ -643,9 +620,7 @@ public class DamselPersonalitySystem { this.lastWhipTime = time; } - // ======================================== // NBT PERSISTENCE - // ======================================== /** * Save personality data to NBT. diff --git a/src/main/java/com/tiedup/remake/entities/damsel/components/IAIHost.java b/src/main/java/com/tiedup/remake/entities/damsel/components/IAIHost.java index 6ebf90c..67d53ec 100644 --- a/src/main/java/com/tiedup/remake/entities/damsel/components/IAIHost.java +++ b/src/main/java/com/tiedup/remake/entities/damsel/components/IAIHost.java @@ -10,12 +10,9 @@ import net.minecraft.world.phys.Vec3; * Interface for AI controller callbacks to EntityDamsel. * Provides access to entity state and methods needed by AI systems. * - * Phase 5: Created for DamselAIController component. */ public interface IAIHost { - // ======================================== // BASIC ENTITY ACCESS - // ======================================== /** * Get the entity's level/world. @@ -42,9 +39,7 @@ public interface IAIHost { */ AABB getBoundingBox(); - // ======================================== // LEASH SYSTEM ACCESS - // ======================================== /** * Check if entity is leashed. @@ -101,9 +96,7 @@ public interface IAIHost { */ double getZ(); - // ======================================== // COMPONENT ACCESS - // ======================================== /** * Get bondage manager component. @@ -115,9 +108,7 @@ public interface IAIHost { */ DamselPersonalitySystem getPersonalitySystem(); - // ======================================== // BONDAGE STATE QUERIES (delegated) - // ======================================== /** * Check if entity is tied up. diff --git a/src/main/java/com/tiedup/remake/entities/damsel/components/IAnimationHost.java b/src/main/java/com/tiedup/remake/entities/damsel/components/IAnimationHost.java index 4320896..b7b451e 100644 --- a/src/main/java/com/tiedup/remake/entities/damsel/components/IAnimationHost.java +++ b/src/main/java/com/tiedup/remake/entities/damsel/components/IAnimationHost.java @@ -6,21 +6,16 @@ import net.minecraft.world.level.Level; * Interface for animation controller callbacks to EntityDamsel. * Provides access to entity state and methods needed by animation systems. * - * Phase 3: Created for DamselAnimationController component. */ public interface IAnimationHost { - // ======================================== // LEVEL ACCESS - // ======================================== /** * Get the entity's level/world. */ Level level(); - // ======================================== // BODY ROTATION ACCESS - // ======================================== /** * Get current body rotation Y. @@ -42,9 +37,7 @@ public interface IAnimationHost { */ void setYBodyRotO(float rot); - // ======================================== // POSE STATE QUERIES - // ======================================== /** * Check if entity is in "dog pose" (hogtied with armbinder). diff --git a/src/main/java/com/tiedup/remake/entities/damsel/components/IBondageHost.java b/src/main/java/com/tiedup/remake/entities/damsel/components/IBondageHost.java index c808bbe..a4991b0 100644 --- a/src/main/java/com/tiedup/remake/entities/damsel/components/IBondageHost.java +++ b/src/main/java/com/tiedup/remake/entities/damsel/components/IBondageHost.java @@ -13,7 +13,6 @@ import net.minecraft.world.level.Level; * This prevents circular dependencies while allowing the bondage component * to access necessary host entity functionality. * - * Phase 7: Created for DamselBondageManager extraction. */ public interface IBondageHost { /** diff --git a/src/main/java/com/tiedup/remake/entities/damsel/components/IDialogueHost.java b/src/main/java/com/tiedup/remake/entities/damsel/components/IDialogueHost.java index 28eac52..618fa20 100644 --- a/src/main/java/com/tiedup/remake/entities/damsel/components/IDialogueHost.java +++ b/src/main/java/com/tiedup/remake/entities/damsel/components/IDialogueHost.java @@ -9,7 +9,6 @@ import net.minecraft.world.phys.AABB; * Interface for dialogue handler callbacks to EntityDamsel. * Provides access to entity state and methods needed by dialogue systems. * - * Phase 4: Created for DamselDialogueHandler component. */ public interface IDialogueHost { /** diff --git a/src/main/java/com/tiedup/remake/entities/damsel/components/IPersonalityTickContext.java b/src/main/java/com/tiedup/remake/entities/damsel/components/IPersonalityTickContext.java index 30ecca0..c430e6f 100644 --- a/src/main/java/com/tiedup/remake/entities/damsel/components/IPersonalityTickContext.java +++ b/src/main/java/com/tiedup/remake/entities/damsel/components/IPersonalityTickContext.java @@ -13,7 +13,6 @@ import net.minecraft.world.phys.Vec3; * This prevents circular dependencies while allowing the personality component * to access necessary host entity functionality. * - * Phase 6: Created for DamselPersonalitySystem extraction. */ public interface IPersonalityTickContext { /** diff --git a/src/main/java/com/tiedup/remake/entities/damsel/components/NpcCaptivityManager.java b/src/main/java/com/tiedup/remake/entities/damsel/components/NpcCaptivityManager.java index 05af612..5b8bc8c 100644 --- a/src/main/java/com/tiedup/remake/entities/damsel/components/NpcCaptivityManager.java +++ b/src/main/java/com/tiedup/remake/entities/damsel/components/NpcCaptivityManager.java @@ -19,9 +19,7 @@ import net.minecraft.world.item.ItemStack; */ public class NpcCaptivityManager { - // ======================================== // FIELDS - // ======================================== private final AbstractTiedUpNpc entity; private final IBondageHost host; @@ -33,9 +31,7 @@ public class NpcCaptivityManager { /** Pending captor UUID for restoration after world load */ private UUID pendingCaptorUUID; - // ======================================== // CONSTRUCTOR - // ======================================== public NpcCaptivityManager( AbstractTiedUpNpc entity, @@ -47,9 +43,7 @@ public class NpcCaptivityManager { this.equipment = equipment; } - // ======================================== // CAPTIVITY STATE - // ======================================== public boolean isCaptive() { return entity.isLeashed(); @@ -72,9 +66,7 @@ public class NpcCaptivityManager { this.captor = null; } - // ======================================== // CAPTURE LIFECYCLE - // ======================================== public boolean getCapturedBy(ICaptor newCaptor) { if (newCaptor == null || !isEnslavable()) { @@ -191,9 +183,7 @@ public class NpcCaptivityManager { ); } - // ======================================== // POLE / LEASH - // ======================================== public boolean isTiedToPole() { Entity leashHolder = entity.getLeashHolder(); @@ -211,9 +201,7 @@ public class NpcCaptivityManager { return !isCaptive() && !equipment.hasCollar(); } - // ======================================== // CAPTOR RESTORATION - // ======================================== /** * Attempt to restore captor from pending UUID. @@ -246,8 +234,7 @@ public class NpcCaptivityManager { .level() .players()) { if (player.getUUID().equals(pendingCaptorUUID)) { - PlayerBindState bindState = - PlayerBindState.getInstance(player); + PlayerBindState bindState = PlayerBindState.getInstance(player); if (bindState != null) { ICaptor kidnapper = bindState.getCaptorManager(); if (kidnapper != null) { @@ -266,9 +253,7 @@ public class NpcCaptivityManager { } } - // ======================================== // PERSISTENCE - // ======================================== /** * Save captivity-related state to NBT. @@ -291,9 +276,7 @@ public class NpcCaptivityManager { } } - // ======================================== // INTERNAL - // ======================================== /** * Get the facade IRestrainable reference for canCapture() calls. diff --git a/src/main/java/com/tiedup/remake/entities/damsel/components/NpcEquipmentManager.java b/src/main/java/com/tiedup/remake/entities/damsel/components/NpcEquipmentManager.java index db5eda6..e13007d 100644 --- a/src/main/java/com/tiedup/remake/entities/damsel/components/NpcEquipmentManager.java +++ b/src/main/java/com/tiedup/remake/entities/damsel/components/NpcEquipmentManager.java @@ -28,36 +28,37 @@ import net.minecraft.world.item.ItemStack; */ public class NpcEquipmentManager { - // ======================================== // FIELDS - // ======================================== private final AbstractTiedUpNpc entity; private final IBondageHost host; /** Maps legacy V1 NBT key names to V2 body regions for migration. */ static final Map V1_TO_V2 = Map.of( - "Bind", BodyRegionV2.ARMS, - "Gag", BodyRegionV2.MOUTH, - "Blindfold", BodyRegionV2.EYES, - "Earplugs", BodyRegionV2.EARS, - "Collar", BodyRegionV2.NECK, - "Clothes", BodyRegionV2.TORSO, - "Mittens", BodyRegionV2.HANDS + "Bind", + BodyRegionV2.ARMS, + "Gag", + BodyRegionV2.MOUTH, + "Blindfold", + BodyRegionV2.EYES, + "Earplugs", + BodyRegionV2.EARS, + "Collar", + BodyRegionV2.NECK, + "Clothes", + BodyRegionV2.TORSO, + "Mittens", + BodyRegionV2.HANDS ); - // ======================================== // CONSTRUCTOR - // ======================================== public NpcEquipmentManager(AbstractTiedUpNpc entity, IBondageHost host) { this.entity = entity; this.host = host; } - // ======================================== // V2 EQUIPMENT HELPERS - // ======================================== /** Get the V2 equipment storage from the parent entity, cast to concrete type. */ V2BondageEquipment getEquipment() { @@ -74,9 +75,7 @@ public class NpcEquipmentManager { entity.syncV2Equipment(); } - // ======================================== // STATE QUERIES (14 methods) - // ======================================== public boolean isTiedUp() { return getEquipment().isRegionOccupied(BodyRegionV2.ARMS); @@ -152,9 +151,7 @@ public class NpcEquipmentManager { return collar.hasCustomHoverName(); } - // ======================================== // EQUIPMENT GETTERS (7 methods) - // ======================================== public ItemStack getCurrentBind() { return getEquipment().getInRegion(BodyRegionV2.ARMS); @@ -184,9 +181,7 @@ public class NpcEquipmentManager { return getEquipment().getInRegion(BodyRegionV2.HANDS); } - // ======================================== // EQUIPMENT PUTTERS (7 methods) - // ======================================== public void putBindOn(ItemStack bind) { if (bind.isEmpty()) return; @@ -217,10 +212,7 @@ public class NpcEquipmentManager { ); } - TiedUpMod.LOGGER.debug( - "[EntityDamsel] {} tied up", - host.getNpcName() - ); + TiedUpMod.LOGGER.debug("[EntityDamsel] {} tied up", host.getNpcName()); } public void putGagOn(ItemStack gag) { @@ -233,10 +225,7 @@ public class NpcEquipmentManager { bondageItem.onEquipped(gag, entity); } - TiedUpMod.LOGGER.debug( - "[EntityDamsel] {} gagged", - host.getNpcName() - ); + TiedUpMod.LOGGER.debug("[EntityDamsel] {} gagged", host.getNpcName()); } public void putBlindfoldOn(ItemStack blindfold) { @@ -284,10 +273,7 @@ public class NpcEquipmentManager { // Play lock sound TiedUpSounds.playLockSound(entity); - TiedUpMod.LOGGER.debug( - "[EntityDamsel] {} collared", - host.getNpcName() - ); + TiedUpMod.LOGGER.debug("[EntityDamsel] {} collared", host.getNpcName()); } public void putClothesOn(ItemStack clothes) { @@ -322,9 +308,7 @@ public class NpcEquipmentManager { ); } - // ======================================== // EQUIPMENT REMOVERS (8 methods + 1 force-remove) - // ======================================== /** * Force-remove the item from a region, bypassing ILockable lock checks. @@ -353,7 +337,10 @@ public class NpcEquipmentManager { // Region-specific side effects if (region == BodyRegionV2.ARMS) { RestraintEffectUtils.removeBindSpeedReduction(entity); - TiedUpMod.LOGGER.debug("[EntityDamsel] {} force-untied", host.getNpcName()); + TiedUpMod.LOGGER.debug( + "[EntityDamsel] {} force-untied", + host.getNpcName() + ); } return current; @@ -381,10 +368,7 @@ public class NpcEquipmentManager { // Remove speed reduction RestraintEffectUtils.removeBindSpeedReduction(entity); - TiedUpMod.LOGGER.debug( - "[EntityDamsel] {} untied", - host.getNpcName() - ); + TiedUpMod.LOGGER.debug("[EntityDamsel] {} untied", host.getNpcName()); return current; } @@ -516,9 +500,7 @@ public class NpcEquipmentManager { return current; } - // ======================================== // EQUIPMENT REPLACERS (14 methods) - // ======================================== public ItemStack replaceBind(ItemStack newBind) { ItemStack oldBind = takeBindOff(); @@ -572,7 +554,9 @@ public class NpcEquipmentManager { if (!oldBlindfold.isEmpty() || !newBlindfold.isEmpty()) { if (force && !oldBlindfold.isEmpty()) { getEquipment().setInRegion(BodyRegionV2.EYES, ItemStack.EMPTY); - if (oldBlindfold.getItem() instanceof IV2BondageItem bondageItem) { + if ( + oldBlindfold.getItem() instanceof IV2BondageItem bondageItem + ) { bondageItem.onUnequipped(oldBlindfold, entity); } } @@ -592,7 +576,9 @@ public class NpcEquipmentManager { if (!oldEarplugs.isEmpty() || !newEarplugs.isEmpty()) { if (force && !oldEarplugs.isEmpty()) { getEquipment().setInRegion(BodyRegionV2.EARS, ItemStack.EMPTY); - if (oldEarplugs.getItem() instanceof IV2BondageItem bondageItem) { + if ( + oldEarplugs.getItem() instanceof IV2BondageItem bondageItem + ) { bondageItem.onUnequipped(oldEarplugs, entity); } } @@ -634,7 +620,9 @@ public class NpcEquipmentManager { if (!oldMittens.isEmpty() || !newMittens.isEmpty()) { if (force && !oldMittens.isEmpty()) { getEquipment().setInRegion(BodyRegionV2.HANDS, ItemStack.EMPTY); - if (oldMittens.getItem() instanceof IV2BondageItem bondageItem) { + if ( + oldMittens.getItem() instanceof IV2BondageItem bondageItem + ) { bondageItem.onUnequipped(oldMittens, entity); } } @@ -643,9 +631,7 @@ public class NpcEquipmentManager { return oldMittens; } - // ======================================== // BULK OPERATIONS - // ======================================== public void applyBondage( ItemStack bind, @@ -738,24 +724,28 @@ public class NpcEquipmentManager { int count = 0; if (!getCurrentBind().isEmpty() && !isLocked(getCurrentBind())) count++; if (!getCurrentGag().isEmpty() && !isLocked(getCurrentGag())) count++; - if (!getCurrentBlindfold().isEmpty() && !isLocked(getCurrentBlindfold())) count++; - if (!getCurrentEarplugs().isEmpty() && !isLocked(getCurrentEarplugs())) count++; - if (!getCurrentCollar().isEmpty() && !isLocked(getCurrentCollar())) count++; - if (!getCurrentClothes().isEmpty() && !isLocked(getCurrentClothes())) count++; + if ( + !getCurrentBlindfold().isEmpty() && !isLocked(getCurrentBlindfold()) + ) count++; + if ( + !getCurrentEarplugs().isEmpty() && !isLocked(getCurrentEarplugs()) + ) count++; + if ( + !getCurrentCollar().isEmpty() && !isLocked(getCurrentCollar()) + ) count++; + if ( + !getCurrentClothes().isEmpty() && !isLocked(getCurrentClothes()) + ) count++; return count; } - // ======================================== // ADVANCED QUERIES - // ======================================== public boolean canBeTiedUp() { return !isTiedUp(); } - // ======================================== // PERMISSIONS - // ======================================== public boolean canTakeOffClothes(Player player) { return true; // NPCs don't have permission restrictions @@ -769,9 +759,7 @@ public class NpcEquipmentManager { return true; } - // ======================================== // COLLAR OWNER CHECK - // ======================================== /** * Check if a player is an owner of this NPC's collar. @@ -784,9 +772,7 @@ public class NpcEquipmentManager { return collarItem.isOwner(collar, player); } - // ======================================== // COERCION - // ======================================== public void tighten(Player tightener) { if (!isTiedUp()) return; @@ -851,9 +837,7 @@ public class NpcEquipmentManager { } } - // ======================================== // INTERNAL - UNLOCK ALL - // ======================================== /** * Unlock all locked bondage items on this entity. @@ -862,8 +846,11 @@ public class NpcEquipmentManager { */ public void unlockAllItems() { BodyRegionV2[] regions = { - BodyRegionV2.ARMS, BodyRegionV2.MOUTH, BodyRegionV2.EYES, - BodyRegionV2.EARS, BodyRegionV2.NECK + BodyRegionV2.ARMS, + BodyRegionV2.MOUTH, + BodyRegionV2.EYES, + BodyRegionV2.EARS, + BodyRegionV2.NECK, }; boolean changed = false; for (BodyRegionV2 region : regions) { @@ -890,9 +877,7 @@ public class NpcEquipmentManager { syncToEntityData(); } - // ======================================== // PERSISTENCE - // ======================================== /** * Save equipment-related state to NBT. @@ -914,7 +899,9 @@ public class NpcEquipmentManager { // Legacy V1 migration: load individual item keys into V2 regions for (Map.Entry entry : V1_TO_V2.entrySet()) { if (tag.contains(entry.getKey(), Tag.TAG_COMPOUND)) { - ItemStack stack = ItemStack.of(tag.getCompound(entry.getKey())); + ItemStack stack = ItemStack.of( + tag.getCompound(entry.getKey()) + ); if (!stack.isEmpty()) { getEquipment().setInRegion(entry.getValue(), stack); } @@ -924,9 +911,7 @@ public class NpcEquipmentManager { syncToEntityData(); } - // ======================================== // PRIVATE HELPERS - // ======================================== /** * Check if an item is locked (convenience -- no force parameter). diff --git a/src/main/java/com/tiedup/remake/entities/damsel/hosts/AIHost.java b/src/main/java/com/tiedup/remake/entities/damsel/hosts/AIHost.java index 26e5856..3aeb96d 100644 --- a/src/main/java/com/tiedup/remake/entities/damsel/hosts/AIHost.java +++ b/src/main/java/com/tiedup/remake/entities/damsel/hosts/AIHost.java @@ -15,7 +15,6 @@ import net.minecraft.world.phys.Vec3; * Host implementation for AIController callbacks. * Extracted from EntityDamsel inner class for better organization. * - * Phase 9: Extracted from EntityDamsel.AIHostImpl */ public class AIHost implements IAIHost { @@ -25,9 +24,7 @@ public class AIHost implements IAIHost { this.entity = entity; } - // ======================================== // BASIC ENTITY ACCESS - // ======================================== @Override public Level level() { @@ -54,9 +51,7 @@ public class AIHost implements IAIHost { return entity.getBoundingBox(); } - // ======================================== // LEASH SYSTEM ACCESS - // ======================================== @Override public boolean isLeashed() { @@ -113,9 +108,7 @@ public class AIHost implements IAIHost { return entity.getZ(); } - // ======================================== // COMPONENT ACCESS - // ======================================== @Override public DamselBondageManager getBondageManager() { @@ -127,9 +120,7 @@ public class AIHost implements IAIHost { return entity.getPersonalitySystem(); } - // ======================================== // BONDAGE STATE QUERIES (delegated) - // ======================================== @Override public boolean isTiedUp() { diff --git a/src/main/java/com/tiedup/remake/entities/damsel/hosts/AnimationHost.java b/src/main/java/com/tiedup/remake/entities/damsel/hosts/AnimationHost.java index 705ee73..c93a6fe 100644 --- a/src/main/java/com/tiedup/remake/entities/damsel/hosts/AnimationHost.java +++ b/src/main/java/com/tiedup/remake/entities/damsel/hosts/AnimationHost.java @@ -8,8 +8,6 @@ import net.minecraft.world.level.Level; * Host implementation for AnimationController callbacks. * Extracted from EntityDamsel inner class for better organization. * - * Phase 9: Extracted from EntityDamsel.AnimationHostImpl - * Phase 3 audit: Updated to use AbstractTiedUpNpc */ public class AnimationHost implements IAnimationHost { @@ -76,6 +74,8 @@ public class AnimationHost implements IAnimationHost { @Override public void setStrugglingToData(boolean struggling) { - entity.getEntityData().set(AbstractTiedUpNpc.DATA_STRUGGLING, struggling); + entity + .getEntityData() + .set(AbstractTiedUpNpc.DATA_STRUGGLING, struggling); } } diff --git a/src/main/java/com/tiedup/remake/entities/damsel/hosts/BondageHost.java b/src/main/java/com/tiedup/remake/entities/damsel/hosts/BondageHost.java index eb67ca2..2b61e1d 100644 --- a/src/main/java/com/tiedup/remake/entities/damsel/hosts/BondageHost.java +++ b/src/main/java/com/tiedup/remake/entities/damsel/hosts/BondageHost.java @@ -16,7 +16,6 @@ import net.minecraft.world.level.Level; * Host implementation for BondageManager callbacks. * Extracted from EntityDamsel inner class for better organization. * - * Phase 9: Extracted from EntityDamsel.BondageHostImpl */ public class BondageHost implements IBondageHost { diff --git a/src/main/java/com/tiedup/remake/entities/damsel/hosts/DialogueHost.java b/src/main/java/com/tiedup/remake/entities/damsel/hosts/DialogueHost.java index 5fd2bc6..728c75a 100644 --- a/src/main/java/com/tiedup/remake/entities/damsel/hosts/DialogueHost.java +++ b/src/main/java/com/tiedup/remake/entities/damsel/hosts/DialogueHost.java @@ -11,7 +11,6 @@ import net.minecraft.world.phys.AABB; * Host implementation for DialogueHandler callbacks. * Extracted from EntityDamsel inner class for better organization. * - * Phase 9: Extracted from EntityDamsel.DialogueHostImpl */ public class DialogueHost implements IDialogueHost { diff --git a/src/main/java/com/tiedup/remake/entities/damsel/hosts/PersonalityTickContextHost.java b/src/main/java/com/tiedup/remake/entities/damsel/hosts/PersonalityTickContextHost.java index 86bb395..b90a69a 100644 --- a/src/main/java/com/tiedup/remake/entities/damsel/hosts/PersonalityTickContextHost.java +++ b/src/main/java/com/tiedup/remake/entities/damsel/hosts/PersonalityTickContextHost.java @@ -1,12 +1,12 @@ package com.tiedup.remake.entities.damsel.hosts; import com.tiedup.remake.dialogue.EntityDialogueManager; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.entities.EntityDamsel; import com.tiedup.remake.entities.damsel.components.DamselAppearance; import com.tiedup.remake.entities.damsel.components.DamselBondageManager; import com.tiedup.remake.entities.damsel.components.DamselInventoryManager; import com.tiedup.remake.entities.damsel.components.IPersonalityTickContext; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.UUID; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.Entity; @@ -19,7 +19,6 @@ import net.minecraft.world.phys.Vec3; * Host implementation for PersonalitySystem callbacks. * Extracted from EntityDamsel inner class for better organization. * - * Phase 9: Extracted from EntityDamsel.PersonalityTickContextImpl */ public class PersonalityTickContextHost implements IPersonalityTickContext { diff --git a/src/main/java/com/tiedup/remake/entities/kidnapper/components/IAIHost.java b/src/main/java/com/tiedup/remake/entities/kidnapper/components/IAIHost.java index 1aeda5d..41d9e45 100644 --- a/src/main/java/com/tiedup/remake/entities/kidnapper/components/IAIHost.java +++ b/src/main/java/com/tiedup/remake/entities/kidnapper/components/IAIHost.java @@ -5,22 +5,20 @@ import com.tiedup.remake.entities.ai.kidnapper.KidnapperState; import com.tiedup.remake.state.IBondageState; import java.util.List; import java.util.UUID; -import org.jetbrains.annotations.Nullable; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.goal.GoalSelector; import net.minecraft.world.entity.ai.navigation.PathNavigation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; /** * Host interface for KidnapperAIManager callbacks. * Provides access to entity properties and components needed for AI goal registration. */ public interface IAIHost { - // ======================================== // NAVIGATION & BASIC - // ======================================== /** * Get the entity's navigation system. @@ -37,9 +35,7 @@ public interface IAIHost { */ Level getLevel(); - // ======================================== // STATE MANAGEMENT - // ======================================== /** * Get the current behavioral state. @@ -51,9 +47,7 @@ public interface IAIHost { */ void setCurrentState(KidnapperState state); - // ======================================== // TARGET MANAGEMENT - // ======================================== /** * Get the current hunt target. @@ -87,9 +81,7 @@ public interface IAIHost { @Nullable LivingEntity getClosestSuitableTarget(int radius); - // ======================================== // CAPTIVE MANAGEMENT - // ======================================== /** * Get the current captive. @@ -102,9 +94,7 @@ public interface IAIHost { */ boolean hasCaptives(); - // ======================================== // AGGRESSION SYSTEM - // ======================================== /** * Get the last entity that attacked this kidnapper. @@ -118,9 +108,7 @@ public interface IAIHost { @Nullable LivingEntity getEscapedTarget(); - // ======================================== // ALERT SYSTEM - // ======================================== /** * Get the alert target (escapee being searched for). @@ -133,9 +121,7 @@ public interface IAIHost { */ void setAlertTarget(@Nullable LivingEntity target); - // ======================================== // CAMP SYSTEM - // ======================================== /** * Get the associated structure UUID for this kidnapper. @@ -148,9 +134,7 @@ public interface IAIHost { */ boolean isHunter(); - // ======================================== // CELL SYSTEM - // ======================================== /** * Get all nearby cells that have prisoners in them. @@ -162,9 +146,7 @@ public interface IAIHost { */ List getNearbyPatrolMarkers(int radius); - // ======================================== // SALE & JOB SYSTEM - // ======================================== /** * Check if currently selling captive. @@ -176,9 +158,7 @@ public interface IAIHost { */ boolean isWaitingForJobToBeCompleted(); - // ======================================== // COLLAR CONFIG - // ======================================== /** * Check if kidnapping mode is fully ready (enabled + prison set). @@ -191,9 +171,7 @@ public interface IAIHost { @Nullable UUID getCellIdFromCollar(); - // ======================================== // CAPTURE EQUIPMENT - // ======================================== /** * Equip themed bind and gag items before capture. @@ -210,9 +188,7 @@ public interface IAIHost { */ ItemStack getGagItem(); - // ======================================== // STATE FLAGS - // ======================================== /** * Check if in "get out" state (flee behavior). diff --git a/src/main/java/com/tiedup/remake/entities/kidnapper/components/IAggressionHost.java b/src/main/java/com/tiedup/remake/entities/kidnapper/components/IAggressionHost.java index 85849fd..a733b63 100644 --- a/src/main/java/com/tiedup/remake/entities/kidnapper/components/IAggressionHost.java +++ b/src/main/java/com/tiedup/remake/entities/kidnapper/components/IAggressionHost.java @@ -1,7 +1,7 @@ package com.tiedup.remake.entities.kidnapper.components; -import org.jetbrains.annotations.Nullable; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; /** * Host interface for KidnapperAggressionSystem callbacks. diff --git a/src/main/java/com/tiedup/remake/entities/kidnapper/components/IAppearanceHost.java b/src/main/java/com/tiedup/remake/entities/kidnapper/components/IAppearanceHost.java index da46cab..a7fb65c 100644 --- a/src/main/java/com/tiedup/remake/entities/kidnapper/components/IAppearanceHost.java +++ b/src/main/java/com/tiedup/remake/entities/kidnapper/components/IAppearanceHost.java @@ -2,10 +2,10 @@ package com.tiedup.remake.entities.kidnapper.components; import com.tiedup.remake.entities.skins.Gender; import java.util.UUID; -import org.jetbrains.annotations.Nullable; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.util.RandomSource; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; /** * Host interface for KidnapperAppearance callbacks. diff --git a/src/main/java/com/tiedup/remake/entities/kidnapper/components/ICaptiveHost.java b/src/main/java/com/tiedup/remake/entities/kidnapper/components/ICaptiveHost.java index 91913fa..d2adcaf 100644 --- a/src/main/java/com/tiedup/remake/entities/kidnapper/components/ICaptiveHost.java +++ b/src/main/java/com/tiedup/remake/entities/kidnapper/components/ICaptiveHost.java @@ -2,12 +2,12 @@ package com.tiedup.remake.entities.kidnapper.components; import com.tiedup.remake.entities.ai.kidnapper.KidnapperState; import java.util.UUID; -import org.jetbrains.annotations.Nullable; import net.minecraft.core.BlockPos; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.Nullable; /** * Host interface for KidnapperCaptiveManager callbacks. diff --git a/src/main/java/com/tiedup/remake/entities/kidnapper/components/ICellHost.java b/src/main/java/com/tiedup/remake/entities/kidnapper/components/ICellHost.java index f0e6a6d..c026fa9 100644 --- a/src/main/java/com/tiedup/remake/entities/kidnapper/components/ICellHost.java +++ b/src/main/java/com/tiedup/remake/entities/kidnapper/components/ICellHost.java @@ -2,10 +2,10 @@ package com.tiedup.remake.entities.kidnapper.components; import com.tiedup.remake.entities.ai.kidnapper.KidnapperState; import java.util.UUID; -import org.jetbrains.annotations.Nullable; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.ai.navigation.PathNavigation; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; /** * Host interface for KidnapperCellManager callbacks. diff --git a/src/main/java/com/tiedup/remake/entities/kidnapper/components/IDataSerializerHost.java b/src/main/java/com/tiedup/remake/entities/kidnapper/components/IDataSerializerHost.java index 8afa708..78c43f5 100644 --- a/src/main/java/com/tiedup/remake/entities/kidnapper/components/IDataSerializerHost.java +++ b/src/main/java/com/tiedup/remake/entities/kidnapper/components/IDataSerializerHost.java @@ -10,18 +10,14 @@ import net.minecraft.network.syncher.EntityDataAccessor; * Provides access to entity data and components for NBT persistence. */ public interface IDataSerializerHost { - // ======================================== // ENTITY ACCESS - // ======================================== /** * Get the entity instance. */ EntityKidnapper getEntity(); - // ======================================== // ENTITY DATA ACCESS - // ======================================== /** * Get entity data value. @@ -33,9 +29,7 @@ public interface IDataSerializerHost { */ void setEntityData(EntityDataAccessor accessor, T value); - // ======================================== // STATE FLAGS - // ======================================== /** * Check if in "get out" state. @@ -47,9 +41,7 @@ public interface IDataSerializerHost { */ void setGetOutState(boolean state); - // ======================================== // COMPONENT ACCESS - // ======================================== /** * Get appearance manager. diff --git a/src/main/java/com/tiedup/remake/entities/kidnapper/components/ISaleHost.java b/src/main/java/com/tiedup/remake/entities/kidnapper/components/ISaleHost.java index e562923..1752ff8 100644 --- a/src/main/java/com/tiedup/remake/entities/kidnapper/components/ISaleHost.java +++ b/src/main/java/com/tiedup/remake/entities/kidnapper/components/ISaleHost.java @@ -1,8 +1,8 @@ package com.tiedup.remake.entities.kidnapper.components; import com.tiedup.remake.state.IRestrainable; -import org.jetbrains.annotations.Nullable; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; /** * Host interface for KidnapperSaleManager callbacks. diff --git a/src/main/java/com/tiedup/remake/entities/kidnapper/components/ITargetHost.java b/src/main/java/com/tiedup/remake/entities/kidnapper/components/ITargetHost.java index 7f0f831..92c7e4e 100644 --- a/src/main/java/com/tiedup/remake/entities/kidnapper/components/ITargetHost.java +++ b/src/main/java/com/tiedup/remake/entities/kidnapper/components/ITargetHost.java @@ -3,12 +3,12 @@ package com.tiedup.remake.entities.kidnapper.components; import com.tiedup.remake.entities.KidnapperCollarConfig; import com.tiedup.remake.entities.KidnapperJobManager; import java.util.UUID; -import org.jetbrains.annotations.Nullable; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.navigation.PathNavigation; import net.minecraft.world.entity.ai.sensing.Sensing; import net.minecraft.world.level.Level; import net.minecraft.world.phys.AABB; +import org.jetbrains.annotations.Nullable; /** * Host interface for KidnapperTargetSelector callbacks. diff --git a/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperAIManager.java b/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperAIManager.java index c21db91..87f43e0 100644 --- a/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperAIManager.java +++ b/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperAIManager.java @@ -8,7 +8,6 @@ import net.minecraft.world.entity.player.Player; /** * KidnapperAIManager - Manages AI goal registration. - * Phase 3.2: AI management component (~79 lines). * * Handles: * - Registering all 20 AI goals with priorities @@ -18,9 +17,7 @@ import net.minecraft.world.entity.player.Player; */ public class KidnapperAIManager { - // ======================================== // FIELDS - // ======================================== /** Entity reference (needed for goal constructors) */ private final EntityKidnapper entity; @@ -28,18 +25,14 @@ public class KidnapperAIManager { /** Host callbacks */ private final IAIHost host; - // ======================================== // CONSTRUCTOR - // ======================================== public KidnapperAIManager(EntityKidnapper entity, IAIHost host) { this.entity = entity; this.host = host; } - // ======================================== // AI GOAL REGISTRATION - // ======================================== /** * Register all AI goals for the kidnapper. @@ -106,7 +99,7 @@ public class KidnapperAIManager { host.getGoalSelector().addGoal(7, new KidnapperGuardGoal(this.entity)); // Priority 7: Thief behavior for wild kidnappers (steal items and flee) - // BUG FIX (Phase 2): DISABLED - Integrated into DecideNextActionGoal + // BUG FIX: DISABLED - Integrated into DecideNextActionGoal // Problem: ThiefGoal (P7) never executed because DecideNextActionGoal (P6) // finished first and changed state (sell/job), blocking ThiefGoal activation. // Solution: Integrated theft as a 3rd option (30% chance) in DecideNextActionGoal. diff --git a/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperAggressionSystem.java b/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperAggressionSystem.java index 3ff3c49..77c335c 100644 --- a/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperAggressionSystem.java +++ b/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperAggressionSystem.java @@ -6,12 +6,11 @@ import com.tiedup.remake.state.IBondageState; import java.util.HashMap; import java.util.Map; import java.util.UUID; -import org.jetbrains.annotations.Nullable; import net.minecraft.world.entity.LivingEntity; +import org.jetbrains.annotations.Nullable; /** * KidnapperAggressionSystem - Manages aggression tracking and immunity. - * Phase 1.3: Aggression management component (151 lines). * * Handles three aggression subsystems: * 1. **Escaped Target Memory** - Remember escapees for pursuit (30 seconds) @@ -22,9 +21,7 @@ import net.minecraft.world.entity.LivingEntity; */ public class KidnapperAggressionSystem { - // ======================================== // CONSTANTS - // ======================================== /** How long to remember an escaped target (30 seconds = 600 ticks) */ private static final long ESCAPED_TARGET_MEMORY = 600; @@ -35,9 +32,7 @@ public class KidnapperAggressionSystem { /** How long to remember last attacker for fight-back (5 seconds = 100 ticks) */ private static final int FIGHT_BACK_MEMORY = 100; - // ======================================== // FIELDS - // ======================================== /** Host callbacks */ private final IAggressionHost host; @@ -65,17 +60,13 @@ public class KidnapperAggressionSystem { */ private final Map robbedImmunity = new HashMap<>(); - // ======================================== // CONSTRUCTOR - // ======================================== public KidnapperAggressionSystem(IAggressionHost host) { this.host = host; } - // ======================================== // ESCAPED TARGET SYSTEM - // ======================================== /** * Called when a captive escapes from this kidnapper. @@ -150,9 +141,7 @@ public class KidnapperAggressionSystem { this.escapedTargetTime = 0; } - // ======================================== // FIGHT BACK SYSTEM - // ======================================== /** * Get the last entity that attacked this kidnapper. @@ -185,9 +174,7 @@ public class KidnapperAggressionSystem { this.lastAttackTime = (int) getCurrentTick(); } - // ======================================== // ROBBERY IMMUNITY SYSTEM - // ======================================== /** * Grant robbery immunity to a player for 2 minutes. @@ -245,9 +232,7 @@ public class KidnapperAggressionSystem { this.robbedImmunity.clear(); } - // ======================================== // HELPER METHODS - // ======================================== /** * Get current game tick from world. @@ -259,9 +244,7 @@ public class KidnapperAggressionSystem { return 0; } - // ======================================== // NBT SERIALIZATION - // ======================================== /** * Save aggression data to NBT. diff --git a/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperAlertManager.java b/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperAlertManager.java index e61bcb3..30aba20 100644 --- a/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperAlertManager.java +++ b/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperAlertManager.java @@ -4,13 +4,12 @@ import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.entities.EntityKidnapper; import com.tiedup.remake.entities.ai.kidnapper.KidnapperState; import java.util.List; -import org.jetbrains.annotations.Nullable; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.LivingEntity; +import org.jetbrains.annotations.Nullable; /** * KidnapperAlertManager - Manages alert system between kidnappers. - * Phase 2.1: Alert management component (~75 lines). * * Handles: * - Broadcasting alerts about escaped captives to nearby kidnappers @@ -22,9 +21,7 @@ import net.minecraft.world.entity.LivingEntity; */ public class KidnapperAlertManager { - // ======================================== // CONSTANTS - // ======================================== /** Cooldown duration before receiving another alert (5 seconds = 100 ticks) */ private static final int ALERT_COOLDOWN_DURATION = 100; @@ -33,9 +30,7 @@ public class KidnapperAlertManager { private static final double BROADCAST_RADIUS_HORIZONTAL = 50.0; private static final double BROADCAST_RADIUS_VERTICAL = 20.0; - // ======================================== // FIELDS - // ======================================== /** Host callbacks */ private final IAlertHost host; @@ -50,18 +45,14 @@ public class KidnapperAlertManager { /** Cooldown before receiving another alert broadcast (in ticks) */ private int alertCooldown = 0; - // ======================================== // CONSTRUCTOR - // ======================================== public KidnapperAlertManager(EntityKidnapper entity, IAlertHost host) { this.entity = entity; this.host = host; } - // ======================================== // ALERT TARGET TRACKING - // ======================================== /** * Get the current alert target. @@ -82,9 +73,7 @@ public class KidnapperAlertManager { this.alertTarget = target; } - // ======================================== // ALERT BROADCASTING - // ======================================== /** * Broadcast an alert about an escaped captive to nearby kidnappers. @@ -127,9 +116,7 @@ public class KidnapperAlertManager { } } - // ======================================== // ALERT RECEIVING - // ======================================== /** * Receive an alert broadcast from another kidnapper. @@ -170,9 +157,7 @@ public class KidnapperAlertManager { ); } - // ======================================== // TICK PROCESSING - // ======================================== /** * Called each tick to update alert system state. @@ -185,9 +170,7 @@ public class KidnapperAlertManager { } } - // ======================================== // NBT SERIALIZATION - // ======================================== /** * Save alert data to NBT. diff --git a/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperAppearance.java b/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperAppearance.java index 4470d45..808459a 100644 --- a/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperAppearance.java +++ b/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperAppearance.java @@ -9,15 +9,14 @@ import com.tiedup.remake.entities.skins.Gender; import com.tiedup.remake.entities.skins.KidnapperSkinManager; import com.tiedup.remake.items.base.ItemColor; import java.util.UUID; -import org.jetbrains.annotations.Nullable; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.Nullable; /** * KidnapperAppearance - Manages visual appearance and item selection. - * Phase 1.2: Appearance management component (~220 lines). * * Handles: * - Kidnapper skin variants (texture selection) @@ -30,9 +29,7 @@ import net.minecraft.world.item.ItemStack; */ public class KidnapperAppearance { - // ======================================== // FIELDS - // ======================================== /** Parent entity for accessing static data accessors */ private final EntityKidnapper entity; @@ -61,9 +58,7 @@ public class KidnapperAppearance { @Nullable private KidnapperItemSelector.SelectionResult itemSelection; - // ======================================== // CONSTRUCTOR - // ======================================== public KidnapperAppearance( EntityKidnapper entity, @@ -79,9 +74,7 @@ public class KidnapperAppearance { this.dataThemeColor = dataThemeColor; } - // ======================================== // VARIANT SYSTEM - // ======================================== /** * Set kidnapper variant and name. @@ -201,9 +194,7 @@ public class KidnapperAppearance { this.kidnapperVariant = null; } - // ======================================== // INITIALIZATION - // ======================================== /** * Initialize variant and theme when entity is first added to world. @@ -262,9 +253,7 @@ public class KidnapperAppearance { return entity.selectItemsForKidnapper(); } - // ======================================== // THEME & ITEM SELECTION - // ======================================== /** * Get current theme (lazy load from synced data if needed). @@ -308,9 +297,7 @@ public class KidnapperAppearance { return this.itemSelection; } - // ======================================== // NBT SERIALIZATION - // ======================================== /** * Save appearance data to NBT. diff --git a/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperCampManager.java b/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperCampManager.java index 3da432e..e6b3229 100644 --- a/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperCampManager.java +++ b/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperCampManager.java @@ -6,7 +6,6 @@ import org.jetbrains.annotations.Nullable; /** * KidnapperCampManager - Manages camp/structure association. - * Phase 1.4: Camp management component (67 lines). * * Handles: * - Structure UUID tracking (which camp this kidnapper belongs to) @@ -16,9 +15,7 @@ import org.jetbrains.annotations.Nullable; */ public class KidnapperCampManager { - // ======================================== // FIELDS - // ======================================== /** Host callbacks */ private final ICampHost host; @@ -35,17 +32,13 @@ public class KidnapperCampManager { */ private boolean isHunter = false; - // ======================================== // CONSTRUCTOR - // ======================================== public KidnapperCampManager(ICampHost host) { this.host = host; } - // ======================================== // STRUCTURE ASSOCIATION - // ======================================== /** * Get the associated structure UUID for this kidnapper. @@ -77,9 +70,7 @@ public class KidnapperCampManager { this.associatedStructure = structureId; } - // ======================================== // HUNTER ROLE - // ======================================== /** * Check if this kidnapper is a "hunter" that patrols far from camp. @@ -99,9 +90,7 @@ public class KidnapperCampManager { this.isHunter = hunter; } - // ======================================== // NBT SERIALIZATION - // ======================================== /** * Save camp data to NBT. diff --git a/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperCaptiveManager.java b/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperCaptiveManager.java index f9759ac..0143e9e 100644 --- a/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperCaptiveManager.java +++ b/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperCaptiveManager.java @@ -1,7 +1,6 @@ package com.tiedup.remake.entities.kidnapper.components; import com.tiedup.remake.cells.CellDataV2; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.core.ModConfig; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.dialogue.EntityDialogueManager; @@ -11,13 +10,13 @@ import com.tiedup.remake.items.base.ItemCollar; import com.tiedup.remake.prison.PrisonerManager; import com.tiedup.remake.prison.PrisonerRecord; import com.tiedup.remake.prison.PrisonerState; -import com.tiedup.remake.state.IRestrainable; import com.tiedup.remake.state.ICaptor; +import com.tiedup.remake.state.IRestrainable; import com.tiedup.remake.util.KidnappedHelper; import com.tiedup.remake.util.RestraintApplicator; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.Random; import java.util.UUID; -import org.jetbrains.annotations.Nullable; import net.minecraft.core.BlockPos; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.server.level.ServerLevel; @@ -26,10 +25,10 @@ import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.Nullable; /** * KidnapperCaptiveManager - Manages captive lifecycle and ICaptor implementation. - * Phase 3.1: Captive management component (~400 lines) - CRITICAL. * * Handles: * - ICaptor interface implementation (10 methods) @@ -46,9 +45,7 @@ import net.minecraft.world.phys.Vec3; */ public class KidnapperCaptiveManager { - // ======================================== // FIELDS - // ======================================== /** Host callbacks */ private final ICaptiveHost host; @@ -80,9 +77,7 @@ public class KidnapperCaptiveManager { @Nullable private LivingEntity strugglePunishmentTarget; - // ======================================== // CONSTRUCTOR - // ======================================== public KidnapperCaptiveManager( EntityKidnapper entity, @@ -94,9 +89,7 @@ public class KidnapperCaptiveManager { this.dataHasCaptive = dataHasCaptive; } - // ======================================== // I_KIDNAPPER IMPLEMENTATION - // ======================================== /** * Add a captive to this kidnapper. @@ -315,9 +308,7 @@ public class KidnapperCaptiveManager { return this.entity; } - // ======================================== // CAPTIVE ACCESS - // ======================================== /** * Get the current captive. @@ -352,9 +343,7 @@ public class KidnapperCaptiveManager { this.allowCaptiveTransferFlag = false; } - // ======================================== // UUID RESTORATION (CRITICAL) - // ======================================== /** * Restore captive reference from UUID after chunk/server reload. @@ -492,9 +481,7 @@ public class KidnapperCaptiveManager { } } - // ======================================== // LIFECYCLE HOOKS - // ======================================== /** * Called when kidnapper gets bound/tied up. @@ -593,9 +580,7 @@ public class KidnapperCaptiveManager { removeCaptive(this.currentCaptive, transportState); } - // ======================================== // SOLO MODE FALLBACK - // ======================================== /** * Keep captive (solo mode fallback when no buyers available). @@ -722,9 +707,7 @@ public class KidnapperCaptiveManager { return host.blockPosition(); } - // ======================================== // PUNISHMENT SYSTEM - // ======================================== /** Maximum distance to HEAR struggle (through bars, no line of sight needed) */ private static final double STRUGGLE_HEARING_RANGE = 6.0; @@ -916,9 +899,7 @@ public class KidnapperCaptiveManager { this.strugglePunishmentTarget = null; } - // ======================================== // LEASH PHYSICS (VISUAL) - // ======================================== /** * Get the position where the rope/leash is held. @@ -952,9 +933,7 @@ public class KidnapperCaptiveManager { return new Vec3(x + offsetX, y + heightOffset, z + offsetZ); } - // ======================================== // NBT SERIALIZATION - // ======================================== /** * Save captive manager data to NBT. diff --git a/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperCellManager.java b/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperCellManager.java index 2e331c9..31bc99d 100644 --- a/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperCellManager.java +++ b/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperCellManager.java @@ -9,14 +9,13 @@ import com.tiedup.remake.entities.ai.kidnapper.KidnapperState; import java.util.ArrayList; import java.util.List; import java.util.UUID; -import org.jetbrains.annotations.Nullable; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.block.entity.BlockEntity; +import org.jetbrains.annotations.Nullable; /** * KidnapperCellManager - Manages cell-related queries and interactions. - * Phase 2.3: Cell management component (~125 lines). * * Handles: * - Finding cells containing specific prisoners @@ -29,24 +28,18 @@ import net.minecraft.world.level.block.entity.BlockEntity; */ public class KidnapperCellManager { - // ======================================== // FIELDS - // ======================================== /** Host callbacks */ private final ICellHost host; - // ======================================== // CONSTRUCTOR - // ======================================== public KidnapperCellManager(ICellHost host) { this.host = host; } - // ======================================== // CELL QUERIES - // ======================================== /** * Find the cell containing a specific prisoner. @@ -84,9 +77,7 @@ public class KidnapperCellManager { return result; } - // ======================================== // CELL BOUNDARY DETECTION - // ======================================== /** * Check if a position is inside a cell's boundaries. @@ -134,9 +125,7 @@ public class KidnapperCellManager { ); } - // ======================================== // PATROL MARKERS - // ======================================== /** * Get all patrol markers from nearby cells. @@ -182,9 +171,7 @@ public class KidnapperCellManager { return result; } - // ======================================== // CELL BREACH RESPONSE - // ======================================== /** * Called when a cell wall is breached (broken). @@ -245,9 +232,7 @@ public class KidnapperCellManager { } } - // ======================================== // NBT SERIALIZATION - // ======================================== /** * Save cell manager data to NBT. diff --git a/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperDataSerializer.java b/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperDataSerializer.java index 9cf214b..3a1ecae 100644 --- a/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperDataSerializer.java +++ b/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperDataSerializer.java @@ -5,7 +5,6 @@ import net.minecraft.network.syncher.EntityDataAccessor; /** * KidnapperDataSerializer - Manages NBT serialization and deserialization. - * Phase 4.1: Data serialization component (~65 lines). * * Handles: * - Orchestrating component save/load (appearance, aggression, captive, state, camp, job) @@ -16,9 +15,7 @@ import net.minecraft.network.syncher.EntityDataAccessor; */ public class KidnapperDataSerializer { - // ======================================== // FIELDS - // ======================================== /** Host callbacks */ private final IDataSerializerHost host; @@ -26,9 +23,7 @@ public class KidnapperDataSerializer { /** Entity data accessor for kidnapping mode */ private final EntityDataAccessor dataKidnappingMode; - // ======================================== // CONSTRUCTOR - // ======================================== public KidnapperDataSerializer( IDataSerializerHost host, @@ -38,9 +33,7 @@ public class KidnapperDataSerializer { this.dataKidnappingMode = dataKidnappingMode; } - // ======================================== // NBT SERIALIZATION - // ======================================== /** * Save all data to NBT. diff --git a/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperSaleManager.java b/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperSaleManager.java index 184944e..d6a340b 100644 --- a/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperSaleManager.java +++ b/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperSaleManager.java @@ -14,7 +14,6 @@ import net.minecraft.world.entity.player.Player; /** * KidnapperSaleManager - Manages NPC sale transactions. - * Phase 2.4: Sale management component (~115 lines). * * Handles: * - Initiating sales with price calculation (player/shiny multipliers) @@ -27,24 +26,18 @@ import net.minecraft.world.entity.player.Player; */ public class KidnapperSaleManager { - // ======================================== // FIELDS - // ======================================== /** Host callbacks */ private final ISaleHost host; - // ======================================== // CONSTRUCTOR - // ======================================== public KidnapperSaleManager(ISaleHost host) { this.host = host; } - // ======================================== // SALE STATUS - // ======================================== /** * Check if currently selling a captive. @@ -55,9 +48,7 @@ public class KidnapperSaleManager { return host.hasCaptives() && host.getCaptive().isForSell(); } - // ======================================== // START SALE - // ======================================== /** * Start selling the current captive with auto-calculated price. @@ -139,9 +130,7 @@ public class KidnapperSaleManager { return true; } - // ======================================== // CANCEL SALE - // ======================================== /** * Cancel the current sale. @@ -153,9 +142,7 @@ public class KidnapperSaleManager { } } - // ======================================== // COMPLETE SALE - // ======================================== /** * Complete a sale by transferring the captive to the buyer. @@ -204,9 +191,7 @@ public class KidnapperSaleManager { return true; } - // ======================================== // NBT SERIALIZATION - // ======================================== /** * Save sale manager data to NBT. diff --git a/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperStateManager.java b/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperStateManager.java index 4e6db76..0dff186 100644 --- a/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperStateManager.java +++ b/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperStateManager.java @@ -5,7 +5,6 @@ import com.tiedup.remake.entities.ai.kidnapper.KidnapperState; /** * KidnapperStateManager - Manages the behavioral state of a kidnapper. - * Phase 1.1: Simple state management component (26 lines). * * Handles the current KidnapperState enum (IDLE, HUNT, CAPTURE, etc.) * with debug logging for state transitions. @@ -14,9 +13,7 @@ import com.tiedup.remake.entities.ai.kidnapper.KidnapperState; */ public class KidnapperStateManager { - // ======================================== // FIELDS - // ======================================== /** Host callbacks for logging */ private final IStateHost host; @@ -24,17 +21,13 @@ public class KidnapperStateManager { /** Current behavioral state */ private KidnapperState currentState = KidnapperState.IDLE; - // ======================================== // CONSTRUCTOR - // ======================================== public KidnapperStateManager(IStateHost host) { this.host = host; } - // ======================================== // STATE MANAGEMENT - // ======================================== /** * Get the current behavioral state. @@ -62,9 +55,7 @@ public class KidnapperStateManager { } } - // ======================================== // NBT SERIALIZATION - // ======================================== /** * Get the NBT key for this component. diff --git a/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperTargetSelector.java b/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperTargetSelector.java index 06d1dd0..4f9f659 100644 --- a/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperTargetSelector.java +++ b/src/main/java/com/tiedup/remake/entities/kidnapper/components/KidnapperTargetSelector.java @@ -1,7 +1,6 @@ package com.tiedup.remake.entities.kidnapper.components; import com.tiedup.remake.cells.CampOwnership; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.compat.mca.MCACompat; import com.tiedup.remake.entities.EntityDamsel; import com.tiedup.remake.entities.EntityKidnapper; @@ -13,18 +12,18 @@ import com.tiedup.remake.prison.PrisonerManager; import com.tiedup.remake.prison.PrisonerRecord; import com.tiedup.remake.state.IBondageState; import com.tiedup.remake.util.KidnappedHelper; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.List; import java.util.UUID; -import org.jetbrains.annotations.Nullable; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.AABB; +import org.jetbrains.annotations.Nullable; /** * KidnapperTargetSelector - Manages target selection and validation logic. - * Phase 2.2: Target selection component (~286 lines) - CRITICAL. * * Handles: * - isSuitableTarget() - Complex targeting logic with 8 categories of checks @@ -39,9 +38,7 @@ import net.minecraft.world.phys.AABB; */ public class KidnapperTargetSelector { - // ======================================== // FIELDS - // ======================================== /** Host callbacks */ private final ITargetHost host; @@ -53,18 +50,14 @@ public class KidnapperTargetSelector { @Nullable private LivingEntity currentTarget; - // ======================================== // CONSTRUCTOR - // ======================================== public KidnapperTargetSelector(EntityKidnapper entity, ITargetHost host) { this.entity = entity; this.host = host; } - // ======================================== // TARGET TRACKING - // ======================================== /** * Get the current target being pursued. @@ -85,9 +78,7 @@ public class KidnapperTargetSelector { this.currentTarget = target; } - // ======================================== // TARGET SUITABILITY (CRITICAL METHOD) - // ======================================== /** * Check if an entity is a suitable target for capture. @@ -273,9 +264,7 @@ public class KidnapperTargetSelector { return true; } - // ======================================== // CHASE VALIDATION - // ======================================== /** * Check if target is still valid during active chase. @@ -351,9 +340,7 @@ public class KidnapperTargetSelector { return true; } - // ======================================== // COMPETITION DETECTION - // ======================================== /** * Check if another kidnapper is already effectively pursuing this target. @@ -418,9 +405,7 @@ public class KidnapperTargetSelector { return false; } - // ======================================== // PROXIMITY TARGETING - // ======================================== /** * Find the closest suitable target within a given radius. @@ -473,9 +458,7 @@ public class KidnapperTargetSelector { return null; } - // ======================================== // DISTANCE HELPERS - // ======================================== /** * Check if close to current target (within 2 blocks). @@ -498,9 +481,7 @@ public class KidnapperTargetSelector { return host.distanceTo(this.currentTarget) > radius; } - // ======================================== // HELPER METHODS - // ======================================== /** * Check if a player has a protection token in their inventory. @@ -519,9 +500,7 @@ public class KidnapperTargetSelector { return false; } - // ======================================== // NBT SERIALIZATION - // ======================================== /** * Save target selector data to NBT. diff --git a/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/AIHost.java b/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/AIHost.java index ae5b2ac..023641f 100644 --- a/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/AIHost.java +++ b/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/AIHost.java @@ -27,9 +27,7 @@ public class AIHost implements IAIHost { this.entity = entity; } - // ======================================== // NAVIGATION & BASIC - // ======================================== @Override public PathNavigation getNavigation() { @@ -46,9 +44,7 @@ public class AIHost implements IAIHost { return entity.level(); } - // ======================================== // STATE MANAGEMENT - // ======================================== @Override public KidnapperState getCurrentState() { @@ -60,9 +56,7 @@ public class AIHost implements IAIHost { entity.setCurrentState(state); } - // ======================================== // TARGET MANAGEMENT - // ======================================== @Override @Nullable @@ -96,9 +90,7 @@ public class AIHost implements IAIHost { return entity.getClosestSuitableTarget(radius); } - // ======================================== // CAPTIVE MANAGEMENT - // ======================================== @Override @Nullable @@ -112,9 +104,7 @@ public class AIHost implements IAIHost { return entity.hasCaptives(); } - // ======================================== // AGGRESSION SYSTEM - // ======================================== @Override @Nullable @@ -128,9 +118,7 @@ public class AIHost implements IAIHost { return entity.getEscapedTarget(); } - // ======================================== // ALERT SYSTEM - // ======================================== @Override @Nullable @@ -143,9 +131,7 @@ public class AIHost implements IAIHost { entity.setAlertTarget(target); } - // ======================================== // CAMP SYSTEM - // ======================================== @Override @Nullable @@ -158,9 +144,7 @@ public class AIHost implements IAIHost { return entity.isHunter(); } - // ======================================== // CELL SYSTEM - // ======================================== @Override public List getNearbyCellsWithPrisoners() { @@ -172,9 +156,7 @@ public class AIHost implements IAIHost { return entity.getNearbyPatrolMarkers(radius); } - // ======================================== // SALE & JOB SYSTEM - // ======================================== @Override public boolean isSellingCaptive() { @@ -186,9 +168,7 @@ public class AIHost implements IAIHost { return entity.isWaitingForJobToBeCompleted(); } - // ======================================== // COLLAR CONFIG - // ======================================== @Override public boolean isKidnappingModeReady() { @@ -201,9 +181,7 @@ public class AIHost implements IAIHost { return entity.getCellIdFromCollar(); } - // ======================================== // CAPTURE EQUIPMENT - // ======================================== @Override public void setUpHeldItems() { @@ -220,9 +198,7 @@ public class AIHost implements IAIHost { return entity.getGagItem(); } - // ======================================== // STATE FLAGS - // ======================================== @Override public boolean isGetOutState() { diff --git a/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/AggressionHost.java b/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/AggressionHost.java index 973eebe..9b8a429 100644 --- a/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/AggressionHost.java +++ b/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/AggressionHost.java @@ -3,12 +3,11 @@ package com.tiedup.remake.entities.kidnapper.hosts; import com.tiedup.remake.dialogue.EntityDialogueManager; import com.tiedup.remake.entities.EntityKidnapper; import com.tiedup.remake.entities.kidnapper.components.IAggressionHost; -import org.jetbrains.annotations.Nullable; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; /** * Host implementation for AggressionSystem callbacks. - * Phase 1.3: Provides access to entity properties for aggression tracking. */ public class AggressionHost implements IAggressionHost { diff --git a/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/AppearanceHost.java b/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/AppearanceHost.java index 494b83c..4211942 100644 --- a/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/AppearanceHost.java +++ b/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/AppearanceHost.java @@ -4,14 +4,13 @@ import com.tiedup.remake.entities.EntityKidnapper; import com.tiedup.remake.entities.kidnapper.components.IAppearanceHost; import com.tiedup.remake.entities.skins.Gender; import java.util.UUID; -import org.jetbrains.annotations.Nullable; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.util.RandomSource; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; /** * Host implementation for AppearanceManager callbacks. - * Phase 1.2: Provides access to entity properties needed for appearance management. */ public class AppearanceHost implements IAppearanceHost { diff --git a/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/BondageHost.java b/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/BondageHost.java index 688ab07..861b436 100644 --- a/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/BondageHost.java +++ b/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/BondageHost.java @@ -15,7 +15,6 @@ import net.minecraft.world.level.Level; /** * Host implementation for BondageManager callbacks specific to EntityKidnapper. * - * Phase 3 (AbstractTiedUpNpc migration): Created so EntityKidnapper can provide * its own IBondageHost instead of inheriting EntityDamsel's BondageHost. * * Key differences from the Damsel BondageHost: diff --git a/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/CampHost.java b/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/CampHost.java index 9e329fd..b74743c 100644 --- a/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/CampHost.java +++ b/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/CampHost.java @@ -6,7 +6,6 @@ import net.minecraft.util.RandomSource; /** * Host implementation for CampManager callbacks. - * Phase 1.4: Provides random source and name for camp assignment. */ public class CampHost implements ICampHost { diff --git a/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/CaptiveHost.java b/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/CaptiveHost.java index 35e225c..8a57efb 100644 --- a/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/CaptiveHost.java +++ b/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/CaptiveHost.java @@ -8,12 +8,12 @@ import com.tiedup.remake.entities.kidnapper.components.ICaptiveHost; import com.tiedup.remake.entities.kidnapper.components.KidnapperAggressionSystem; import com.tiedup.remake.entities.kidnapper.components.KidnapperAlertManager; import java.util.UUID; -import org.jetbrains.annotations.Nullable; import net.minecraft.core.BlockPos; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.Nullable; /** * Host implementation for KidnapperCaptiveManager callbacks. diff --git a/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/CellHost.java b/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/CellHost.java index fe3cdf2..ca7969a 100644 --- a/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/CellHost.java +++ b/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/CellHost.java @@ -4,10 +4,10 @@ import com.tiedup.remake.entities.EntityKidnapper; import com.tiedup.remake.entities.ai.kidnapper.KidnapperState; import com.tiedup.remake.entities.kidnapper.components.ICellHost; import java.util.UUID; -import org.jetbrains.annotations.Nullable; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.ai.navigation.PathNavigation; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; /** * Host implementation for KidnapperCellManager callbacks. diff --git a/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/DataSerializerHost.java b/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/DataSerializerHost.java index c3e41ad..dc52615 100644 --- a/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/DataSerializerHost.java +++ b/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/DataSerializerHost.java @@ -17,18 +17,14 @@ public class DataSerializerHost implements IDataSerializerHost { this.entity = entity; } - // ======================================== // ENTITY ACCESS - // ======================================== @Override public EntityKidnapper getEntity() { return entity; } - // ======================================== // ENTITY DATA ACCESS - // ======================================== @Override public T getEntityData(EntityDataAccessor accessor) { @@ -40,9 +36,7 @@ public class DataSerializerHost implements IDataSerializerHost { entity.getEntityData().set(accessor, value); } - // ======================================== // STATE FLAGS - // ======================================== @Override public boolean isGetOutState() { @@ -54,9 +48,7 @@ public class DataSerializerHost implements IDataSerializerHost { entity.setGetOutState(state); } - // ======================================== // COMPONENT ACCESS - // ======================================== @Override public KidnapperAppearance getAppearance() { diff --git a/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/SaleHost.java b/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/SaleHost.java index c2118e0..dfd3c9e 100644 --- a/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/SaleHost.java +++ b/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/SaleHost.java @@ -3,8 +3,8 @@ package com.tiedup.remake.entities.kidnapper.hosts; import com.tiedup.remake.entities.EntityKidnapper; import com.tiedup.remake.entities.kidnapper.components.ISaleHost; import com.tiedup.remake.state.IRestrainable; -import org.jetbrains.annotations.Nullable; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; /** * Host implementation for KidnapperSaleManager callbacks. diff --git a/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/StateHost.java b/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/StateHost.java index 528d2e9..f0e1abd 100644 --- a/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/StateHost.java +++ b/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/StateHost.java @@ -5,7 +5,6 @@ import com.tiedup.remake.entities.kidnapper.components.IStateHost; /** * Host implementation for StateManager callbacks. - * Phase 1.1: Simple host providing name access for logging. */ public class StateHost implements IStateHost { diff --git a/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/TargetHost.java b/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/TargetHost.java index c873dc9..7464031 100644 --- a/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/TargetHost.java +++ b/src/main/java/com/tiedup/remake/entities/kidnapper/hosts/TargetHost.java @@ -6,12 +6,12 @@ import com.tiedup.remake.entities.KidnapperJobManager; import com.tiedup.remake.entities.kidnapper.components.ITargetHost; import com.tiedup.remake.entities.kidnapper.components.KidnapperAggressionSystem; import java.util.UUID; -import org.jetbrains.annotations.Nullable; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.navigation.PathNavigation; import net.minecraft.world.entity.ai.sensing.Sensing; import net.minecraft.world.level.Level; import net.minecraft.world.phys.AABB; +import org.jetbrains.annotations.Nullable; /** * Host implementation for KidnapperTargetSelector callbacks. diff --git a/src/main/java/com/tiedup/remake/entities/maid/components/MaidPrisonInteraction.java b/src/main/java/com/tiedup/remake/entities/maid/components/MaidPrisonInteraction.java index 2a97c8a..36a4ccb 100644 --- a/src/main/java/com/tiedup/remake/entities/maid/components/MaidPrisonInteraction.java +++ b/src/main/java/com/tiedup/remake/entities/maid/components/MaidPrisonInteraction.java @@ -42,9 +42,7 @@ import net.minecraft.world.entity.player.Player; */ public class MaidPrisonInteraction { - // ======================================== // CONSTANTS - // ======================================== /** Maximum distance to HEAR struggle (through bars, no line of sight needed) */ private static final double STRUGGLE_HEARING_RANGE = 6.0; @@ -52,9 +50,7 @@ public class MaidPrisonInteraction { /** Maximum distance to SEE struggle (requires line of sight) */ private static final double STRUGGLE_VISION_RANGE = 15.0; - // ======================================== // STATE - // ======================================== private final EntityMaid maid; @@ -62,17 +58,13 @@ public class MaidPrisonInteraction { @Nullable private ServerPlayer strugglePunishmentTarget; - // ======================================== // CONSTRUCTOR - // ======================================== public MaidPrisonInteraction(EntityMaid maid) { this.maid = maid; } - // ======================================== // PLAYER INTERACTION DISPATCH - // ======================================== /** * Handle prisoner-specific interactions when a player right-clicks the maid. @@ -98,7 +90,8 @@ public class MaidPrisonInteraction { if ( state == PrisonerState.IMPRISONED && laborRecord != null && - laborRecord.getPhase() == LaborRecord.WorkPhase.PENDING_EXTRACTION && + laborRecord.getPhase() == + LaborRecord.WorkPhase.PENDING_EXTRACTION && serverPlayer.isShiftKeyDown() ) { handleManualExtraction(serverPlayer, manager, laborRecord); @@ -131,9 +124,7 @@ public class MaidPrisonInteraction { return null; // Not handled } - // ======================================== // MANUAL EXTRACTION - // ======================================== /** * Manually extract prisoner from stuck PENDING state. @@ -155,10 +146,14 @@ public class MaidPrisonInteraction { // Save bondage state to laborRecord and remove restraints for labor CompoundTag bondageSnapshot = - com.tiedup.remake.prison.service.BondageService.get().saveSnapshot(cap); + com.tiedup.remake.prison.service.BondageService.get().saveSnapshot( + cap + ); laborRecord.setBondageSnapshot(bondageSnapshot); manager.setLaborRecord(player.getUUID(), laborRecord); - com.tiedup.remake.prison.service.BondageService.get().removeForLabor(cap); + com.tiedup.remake.prison.service.BondageService.get().removeForLabor( + cap + ); task.giveEquipment(player); @@ -181,9 +176,7 @@ public class MaidPrisonInteraction { ); } - // ======================================== // MANUAL CHECK-IN - // ======================================== /** * Handle manual check-in when a working player completes their task early. @@ -225,9 +218,7 @@ public class MaidPrisonInteraction { ); } - // ======================================== // STATUS DISPLAY - // ======================================== /** * Show labor status to prisoner. @@ -299,9 +290,7 @@ public class MaidPrisonInteraction { } } - // ======================================== // PRISONER RECORD ACCESS - // ======================================== /** * Get the prisoner records for prisoners in this maid's camp. @@ -365,9 +354,7 @@ public class MaidPrisonInteraction { return PrisonerManager.get(serverLevel); } - // ======================================== // STRUGGLE DETECTION - // ======================================== /** * Called when a prisoner is detected struggling nearby. @@ -479,9 +466,7 @@ public class MaidPrisonInteraction { this.strugglePunishmentTarget = null; } - // ======================================== // HELPERS - // ======================================== /** * Say a message to a specific player via the maid. diff --git a/src/main/java/com/tiedup/remake/entities/maid/components/MaidTraderLink.java b/src/main/java/com/tiedup/remake/entities/maid/components/MaidTraderLink.java index 3140b96..a00b0d0 100644 --- a/src/main/java/com/tiedup/remake/entities/maid/components/MaidTraderLink.java +++ b/src/main/java/com/tiedup/remake/entities/maid/components/MaidTraderLink.java @@ -26,9 +26,7 @@ import net.minecraft.world.phys.AABB; */ public class MaidTraderLink { - // ======================================== // CONSTANTS - // ======================================== /** Search interval in ticks (2 seconds) */ private static final int TRADER_SEARCH_INTERVAL = 40; @@ -39,9 +37,7 @@ public class MaidTraderLink { /** Maximum attempts to establish link before giving up */ private static final int MAX_LINK_ATTEMPTS = 12; // 1 minute total - // ======================================== // STATE - // ======================================== private final EntityMaid maid; @@ -62,17 +58,13 @@ public class MaidTraderLink { /** Current link attempt count */ private transient int linkAttemptCount = 0; - // ======================================== // CONSTRUCTOR - // ======================================== public MaidTraderLink(EntityMaid maid) { this.maid = maid; } - // ======================================== // ACCESSORS - // ======================================== @Nullable public UUID getMasterTraderUUID() { @@ -92,9 +84,7 @@ public class MaidTraderLink { this.cachedTrader = null; } - // ======================================== // TRADER LOOKUP - // ======================================== /** * Get the master trader entity. @@ -141,9 +131,7 @@ public class MaidTraderLink { return searchTraderViaCampOwnership(serverLevel); } - // ======================================== // CAMP UUID - // ======================================== /** * Get the camp UUID this maid belongs to. @@ -159,9 +147,7 @@ public class MaidTraderLink { return camp != null ? camp.getCampId() : null; } - // ======================================== // SEARCH STRATEGIES - // ======================================== /** * Search for trader using CampOwnership registry and area search. @@ -245,9 +231,7 @@ public class MaidTraderLink { return null; } - // ======================================== // LINK ESTABLISHMENT - // ======================================== /** * Periodically attempt to establish link to master trader if not linked. @@ -395,9 +379,7 @@ public class MaidTraderLink { ); } - // ======================================== // NBT PERSISTENCE - // ======================================== /** * Save trader link data to NBT. diff --git a/src/main/java/com/tiedup/remake/entities/master/components/MasterPetManager.java b/src/main/java/com/tiedup/remake/entities/master/components/MasterPetManager.java index 12f9b47..61d4541 100644 --- a/src/main/java/com/tiedup/remake/entities/master/components/MasterPetManager.java +++ b/src/main/java/com/tiedup/remake/entities/master/components/MasterPetManager.java @@ -45,18 +45,17 @@ public class MasterPetManager { /** State manager holding the pet UUID */ private final MasterStateManager stateManager; - // ======================================== // CONSTRUCTOR - // ======================================== - public MasterPetManager(EntityMaster master, MasterStateManager stateManager) { + public MasterPetManager( + EntityMaster master, + MasterStateManager stateManager + ) { this.master = master; this.stateManager = stateManager; } - // ======================================== // PET PLAYER RESOLUTION - // ======================================== /** * Get the pet player entity from the server. @@ -106,9 +105,7 @@ public class MasterPetManager { return petUUID != null && petUUID.equals(player.getUUID()); } - // ======================================== // PET COLLAR - // ======================================== /** * Put a pet collar on the player. @@ -141,7 +138,9 @@ public class MasterPetManager { // Set NBT flag for pet play mode chokeCollar.getOrCreateTag().putBoolean("petPlayMode", true); - chokeCollar.getOrCreateTag().putUUID("masterUUID", master.getUUID()); + chokeCollar + .getOrCreateTag() + .putUUID("masterUUID", master.getUUID()); } // Replace any existing collar (force removal) with the choke collar @@ -196,16 +195,12 @@ public class MasterPetManager { // Send message to player player.sendSystemMessage( Component.literal( - "You are free! Your master " + - master.getNpcName() + - " is gone." + "You are free! Your master " + master.getNpcName() + " is gone." ).withStyle(Style.EMPTY.withColor(0x00FF00)) ); } - // ======================================== // COLLAR SYNC & RESISTANCE - // ======================================== /** * Synchronize Master data to the pet's collar NBT. @@ -256,13 +251,13 @@ public class MasterPetManager { } // End the struggle session - StruggleSessionManager.getInstance() - .endContinuousStruggleSession(pet.getUUID(), false); + StruggleSessionManager.getInstance().endContinuousStruggleSession( + pet.getUUID(), + false + ); } - // ======================================== // LEASH MANAGEMENT - // ======================================== /** * Attach a leash from the pet player to this Master. diff --git a/src/main/java/com/tiedup/remake/entities/master/components/MasterStateManager.java b/src/main/java/com/tiedup/remake/entities/master/components/MasterStateManager.java index 78a1be2..7d84885 100644 --- a/src/main/java/com/tiedup/remake/entities/master/components/MasterStateManager.java +++ b/src/main/java/com/tiedup/remake/entities/master/components/MasterStateManager.java @@ -17,9 +17,7 @@ import net.minecraft.server.level.ServerPlayer; */ public class MasterStateManager { - // ======================================== // CONSTANTS - // ======================================== /** Minimum time between distractions (ticks) - 2 minutes */ private static final int MIN_DISTRACTION_INTERVAL = 2400; @@ -33,9 +31,7 @@ public class MasterStateManager { /** Maximum distraction duration (ticks) - 60 seconds */ private static final int MAX_DISTRACTION_DURATION = 1200; - // ======================================== // FIELDS - // ======================================== /** Host callbacks for logging and events */ private final IMasterStateHost host; @@ -61,17 +57,13 @@ public class MasterStateManager { /** Random for distraction timing */ private final Random random = new Random(); - // ======================================== // CONSTRUCTOR - // ======================================== public MasterStateManager(IMasterStateHost host) { this.host = host; } - // ======================================== // STATE MANAGEMENT - // ======================================== /** * Get the current behavioral state. @@ -119,9 +111,7 @@ public class MasterStateManager { return currentState.allowsSafeStruggle(); } - // ======================================== // PET PLAYER MANAGEMENT - // ======================================== /** * Set the UUID of the pet player owned by this master. @@ -167,9 +157,7 @@ public class MasterStateManager { this.petPlayerUUID = null; } - // ======================================== // DISTRACTION SYSTEM - // ======================================== /** * Initialize or reset the distraction timer. @@ -302,9 +290,7 @@ public class MasterStateManager { } } - // ======================================== // STRUGGLE DETECTION - // ======================================== /** * Called when a struggle attempt is detected. @@ -331,9 +317,7 @@ public class MasterStateManager { return true; } - // ======================================== // NBT SERIALIZATION - // ======================================== /** * Get the state name for NBT serialization. diff --git a/src/main/java/com/tiedup/remake/entities/master/components/MasterTaskManager.java b/src/main/java/com/tiedup/remake/entities/master/components/MasterTaskManager.java index 02e632f..70fd068 100644 --- a/src/main/java/com/tiedup/remake/entities/master/components/MasterTaskManager.java +++ b/src/main/java/com/tiedup/remake/entities/master/components/MasterTaskManager.java @@ -27,9 +27,7 @@ import net.minecraftforge.registries.ForgeRegistries; */ public class MasterTaskManager { - // ======================================== // CONSTANTS - // ======================================== /** Engagement cadence: minimum gap between actions (30s) */ private static final int MIN_ENGAGEMENT_GAP = 600; @@ -44,9 +42,7 @@ public class MasterTaskManager { private static final String NBT_LAST_ENGAGEMENT = "LastEngagementTime"; private static final String NBT_COLD_SHOULDER_UNTIL = "ColdShoulderUntil"; - // ======================================== // FIELDS - // ======================================== /** Back-reference to the owning entity */ private final EntityMaster master; @@ -69,17 +65,13 @@ public class MasterTaskManager { /** Game time until cold shoulder ends (0 = not active) */ private long coldShoulderUntil = 0; - // ======================================== // CONSTRUCTOR - // ======================================== public MasterTaskManager(EntityMaster master) { this.master = master; } - // ======================================== // TASK MANAGEMENT - // ======================================== /** * Check if there is an active task. @@ -208,9 +200,7 @@ public class MasterTaskManager { return false; } - // ======================================== // ENGAGEMENT CADENCE SYSTEM - // ======================================== /** * Mark that an engagement action just occurred. @@ -231,9 +221,7 @@ public class MasterTaskManager { return 1.0f; } - // ======================================== // COLD SHOULDER - // ======================================== /** * Check if the master is giving the cold shoulder (ignoring pet). @@ -253,9 +241,7 @@ public class MasterTaskManager { coldShoulderUntil = master.level().getGameTime() + durationTicks; } - // ======================================== // NBT SERIALIZATION - // ======================================== /** * Save task manager state to NBT. @@ -270,7 +256,9 @@ public class MasterTaskManager { tag.putDouble(NBT_TASK_START_POS + "Z", taskStartPosition.z); } if (requestedItem != null) { - ResourceLocation requestedItemKey = ForgeRegistries.ITEMS.getKey(requestedItem); + ResourceLocation requestedItemKey = ForgeRegistries.ITEMS.getKey( + requestedItem + ); if (requestedItemKey != null) { tag.putString(NBT_REQUESTED_ITEM, requestedItemKey.toString()); } else { diff --git a/src/main/java/com/tiedup/remake/entities/skins/EntitySkinRegistry.java b/src/main/java/com/tiedup/remake/entities/skins/EntitySkinRegistry.java index 9886053..9b58df6 100644 --- a/src/main/java/com/tiedup/remake/entities/skins/EntitySkinRegistry.java +++ b/src/main/java/com/tiedup/remake/entities/skins/EntitySkinRegistry.java @@ -10,7 +10,6 @@ import net.minecraft.util.RandomSource; * Each entity type (kidnapper, damsel, etc.) has its own registry instance. * Skins are loaded from JSON files and stored here for quick access. * - * Phase 1: Data-Driven Skin System */ public class EntitySkinRegistry { diff --git a/src/main/java/com/tiedup/remake/entities/skins/MaidSkinManager.java b/src/main/java/com/tiedup/remake/entities/skins/MaidSkinManager.java index 4e0fd12..5956dfa 100644 --- a/src/main/java/com/tiedup/remake/entities/skins/MaidSkinManager.java +++ b/src/main/java/com/tiedup/remake/entities/skins/MaidSkinManager.java @@ -40,7 +40,6 @@ public class MaidSkinManager { CORE.registerVariant(createMaidVariant("maid_default", true, "Maid")); CORE.registerVariant(createMaidVariant("maid_classic", true, "Sakura")); - // FUTURE: Add more named maid variants here (requires artist skin assets) // CORE.registerVariant(createMaidVariant("maid_gothic", true, "Gothic Maid")); // CORE.registerVariant(createMaidVariant("maid_french", true, "Marie")); } diff --git a/src/main/java/com/tiedup/remake/entities/skins/SkinDefinition.java b/src/main/java/com/tiedup/remake/entities/skins/SkinDefinition.java index 58858d7..f238d08 100644 --- a/src/main/java/com/tiedup/remake/entities/skins/SkinDefinition.java +++ b/src/main/java/com/tiedup/remake/entities/skins/SkinDefinition.java @@ -13,7 +13,6 @@ import net.minecraft.util.GsonHelper; * This record holds the skin metadata loaded from JSON files in datapacks. * Each entity type (kidnapper, damsel, etc.) has its own skin definitions. * - * Phase 1: Data-Driven Skin System */ public record SkinDefinition( String id, diff --git a/src/main/java/com/tiedup/remake/entities/skins/SkinLoader.java b/src/main/java/com/tiedup/remake/entities/skins/SkinLoader.java index 719f420..b4fadb5 100644 --- a/src/main/java/com/tiedup/remake/entities/skins/SkinLoader.java +++ b/src/main/java/com/tiedup/remake/entities/skins/SkinLoader.java @@ -19,7 +19,6 @@ import net.minecraft.server.packs.resources.ResourceManager; * * Called on server startup and /reload command via SkinReloadListener. * - * Phase 1: Data-Driven Skin System */ public class SkinLoader { diff --git a/src/main/java/com/tiedup/remake/entities/skins/SkinReloadListener.java b/src/main/java/com/tiedup/remake/entities/skins/SkinReloadListener.java index 8ed51d8..5abc57a 100644 --- a/src/main/java/com/tiedup/remake/entities/skins/SkinReloadListener.java +++ b/src/main/java/com/tiedup/remake/entities/skins/SkinReloadListener.java @@ -16,7 +16,6 @@ import net.minecraft.util.profiling.ProfilerFiller; * * Registered via AddReloadListenerEvent in TiedUpMod. * - * Phase 1: Data-Driven Skin System */ public class SkinReloadListener implements PreparableReloadListener { diff --git a/src/main/java/com/tiedup/remake/entities/skins/TraderSkinManager.java b/src/main/java/com/tiedup/remake/entities/skins/TraderSkinManager.java index 19c8ddb..27fc895 100644 --- a/src/main/java/com/tiedup/remake/entities/skins/TraderSkinManager.java +++ b/src/main/java/com/tiedup/remake/entities/skins/TraderSkinManager.java @@ -44,7 +44,6 @@ public class TraderSkinManager { createTraderVariant("trader_noble", true, "Lady Noble") ); - // FUTURE: Add more named trader variants here (requires artist skin assets) // CORE.registerVariant(createTraderVariant("trader_merchant", true, "The Merchant")); // CORE.registerVariant(createTraderVariant("trader_queen", true, "Queen of Chains")); } diff --git a/src/main/java/com/tiedup/remake/events/camp/CampManagementHandler.java b/src/main/java/com/tiedup/remake/events/camp/CampManagementHandler.java index 3466f2b..b6f550b 100644 --- a/src/main/java/com/tiedup/remake/events/camp/CampManagementHandler.java +++ b/src/main/java/com/tiedup/remake/events/camp/CampManagementHandler.java @@ -67,9 +67,8 @@ public class CampManagementHandler { long currentTime = level.getGameTime(); // Get camps that need maid respawn - List campsNeedingMaid = CampMaidManager.getCampsNeedingMaidRespawn( - currentTime, level - ); + List campsNeedingMaid = + CampMaidManager.getCampsNeedingMaidRespawn(currentTime, level); for (UUID campId : campsNeedingMaid) { spawnNewMaidForCamp(level, ownership, campId); diff --git a/src/main/java/com/tiedup/remake/events/captivity/ForcedSeatingHandler.java b/src/main/java/com/tiedup/remake/events/captivity/ForcedSeatingHandler.java index 104f542..b7ff387 100644 --- a/src/main/java/com/tiedup/remake/events/captivity/ForcedSeatingHandler.java +++ b/src/main/java/com/tiedup/remake/events/captivity/ForcedSeatingHandler.java @@ -91,7 +91,9 @@ public class ForcedSeatingHandler { Entity target = event.getTarget(); // Furniture handles its own seating — skip forced seating logic - if (target instanceof com.tiedup.remake.v2.furniture.ISeatProvider) return; + if ( + target instanceof com.tiedup.remake.v2.furniture.ISeatProvider + ) return; // Only process if Force Seat keybind is pressed if (!isForceSeatPressed(owner)) return; @@ -227,7 +229,10 @@ public class ForcedSeatingHandler { } // Furniture manages its own dismount via removePassenger() - if (vehicle instanceof com.tiedup.remake.v2.furniture.ISeatProvider) { + if ( + vehicle instanceof + com.tiedup.remake.v2.furniture.ISeatProvider + ) { return; } diff --git a/src/main/java/com/tiedup/remake/events/captivity/PlayerEnslavementHandler.java b/src/main/java/com/tiedup/remake/events/captivity/PlayerEnslavementHandler.java index 5faf9f1..4078620 100644 --- a/src/main/java/com/tiedup/remake/events/captivity/PlayerEnslavementHandler.java +++ b/src/main/java/com/tiedup/remake/events/captivity/PlayerEnslavementHandler.java @@ -1,14 +1,14 @@ package com.tiedup.remake.events.captivity; +import com.tiedup.remake.core.SettingsAccessor; import com.tiedup.remake.core.TiedUpMod; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.entities.LeashProxyEntity; import com.tiedup.remake.items.base.ItemCollar; -import com.tiedup.remake.state.IPlayerLeashAccess; import com.tiedup.remake.state.IBondageState; +import com.tiedup.remake.state.IPlayerLeashAccess; import com.tiedup.remake.state.PlayerBindState; import com.tiedup.remake.util.KidnappedHelper; -import com.tiedup.remake.core.SettingsAccessor; +import com.tiedup.remake.v2.BodyRegionV2; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -110,7 +110,11 @@ public class PlayerEnslavementHandler { } // Check if enslavement is enabled - if (!SettingsAccessor.isEnslavementEnabled(master.level().getGameRules())) { + if ( + !SettingsAccessor.isEnslavementEnabled( + master.level().getGameRules() + ) + ) { return; } @@ -132,16 +136,16 @@ public class PlayerEnslavementHandler { ItemStack heldItem = master.getItemInHand(event.getHand()); - // ======================================== // Scenario 1: Enslavement with Lead - // ======================================== if (heldItem.is(Items.LEAD)) { // Check if target is enslavable (using IBondageState) if (!slaveKidnappedState.isEnslavable()) { // Exception: collar owner can capture even if not tied boolean canCapture = false; if (slaveKidnappedState.hasCollar()) { - ItemStack collar = slaveKidnappedState.getEquipment(BodyRegionV2.NECK); + ItemStack collar = slaveKidnappedState.getEquipment( + BodyRegionV2.NECK + ); if (collar.getItem() instanceof ItemCollar collarItem) { if ( collarItem @@ -161,7 +165,6 @@ public class PlayerEnslavementHandler { } } - // Phase 17: Check if not already captured (Player-specific check) if (slaveState.isCaptive()) { TiedUpMod.LOGGER.debug( "[PlayerEnslavementHandler] {} is already captured", @@ -191,14 +194,10 @@ public class PlayerEnslavementHandler { ); } } - // ======================================== // Scenario 2: Freeing with Empty Hand - // ======================================== else if (heldItem.isEmpty()) { - // Phase 17: isSlave → isCaptive if (!slaveState.isCaptive()) return; - // Phase 17: getMaster → getCaptor, getSlaveHolderManager → getCaptorManager if (slaveState.getCaptor() != masterState.getCaptorManager()) { TiedUpMod.LOGGER.debug( "[PlayerEnslavementHandler] {} tried to free {} but is not the captor", @@ -221,7 +220,6 @@ public class PlayerEnslavementHandler { /** * Periodic check for enslaved players. * - * Phase 14.1.5: Remains PlayerBindState-specific (enslavement system is Player-only) */ @SubscribeEvent public static void onPlayerTick(TickEvent.PlayerTickEvent event) { @@ -233,11 +231,9 @@ public class PlayerEnslavementHandler { PlayerBindState state = PlayerBindState.getInstance(player); if (state == null) return; - // Phase 17: isSlave → isCaptive, checkStillSlave → checkStillCaptive if (state.isCaptive()) { state.checkStillCaptive(); } - // Phase 17: getSlaveHolderManager → getCaptorManager, cleanupInvalidSlaves → cleanupInvalidCaptives state.getCaptorManager().cleanupInvalidCaptives(); } } diff --git a/src/main/java/com/tiedup/remake/events/interaction/DialogueTickHandler.java b/src/main/java/com/tiedup/remake/events/interaction/DialogueTickHandler.java index efaad72..977eb25 100644 --- a/src/main/java/com/tiedup/remake/events/interaction/DialogueTickHandler.java +++ b/src/main/java/com/tiedup/remake/events/interaction/DialogueTickHandler.java @@ -17,7 +17,6 @@ import net.minecraftforge.fml.common.Mod; /** * Server tick handler for dialogue and conversation system maintenance. * - * Phase 14: Conversation System * * Handles: * - Cleanup of stale/abandoned conversations diff --git a/src/main/java/com/tiedup/remake/events/interaction/KidnapperInteractionEventHandler.java b/src/main/java/com/tiedup/remake/events/interaction/KidnapperInteractionEventHandler.java index 11bdd43..a5926b4 100644 --- a/src/main/java/com/tiedup/remake/events/interaction/KidnapperInteractionEventHandler.java +++ b/src/main/java/com/tiedup/remake/events/interaction/KidnapperInteractionEventHandler.java @@ -4,8 +4,8 @@ import com.tiedup.remake.core.SystemMessageManager; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.dialogue.EntityDialogueManager.DialogueCategory; import com.tiedup.remake.entities.EntityKidnapper; -import com.tiedup.remake.state.IRestrainable; import com.tiedup.remake.state.ICaptor; +import com.tiedup.remake.state.IRestrainable; import com.tiedup.remake.state.PlayerBindState; import com.tiedup.remake.util.tasks.ItemTask; import net.minecraft.ChatFormatting; @@ -20,7 +20,6 @@ import net.minecraftforge.fml.common.Mod; /** * Event handler for player interactions with EntityKidnapper. * - * Phase 14.3.5: Sale system interactions * * Handles: * - Right-click on kidnapper selling slave to buy @@ -121,7 +120,6 @@ public class KidnapperInteractionEventHandler { return; } - // Phase 17: getSlaveHolderManager → getCaptorManager ICaptor buyerKidnapper = bindState.getCaptorManager(); if (buyerKidnapper == null) { TiedUpMod.LOGGER.error( diff --git a/src/main/java/com/tiedup/remake/events/lifecycle/CapabilityEventHandler.java b/src/main/java/com/tiedup/remake/events/lifecycle/CapabilityEventHandler.java index 68e562b..2734b25 100644 --- a/src/main/java/com/tiedup/remake/events/lifecycle/CapabilityEventHandler.java +++ b/src/main/java/com/tiedup/remake/events/lifecycle/CapabilityEventHandler.java @@ -44,7 +44,8 @@ public class CapabilityEventHandler { } // V2 bondage equipment capability - V2BondageEquipmentProvider v2Provider = new V2BondageEquipmentProvider(); + V2BondageEquipmentProvider v2Provider = + new V2BondageEquipmentProvider(); event.addCapability(V2_BONDAGE_EQUIPMENT_ID, v2Provider); event.addListener(v2Provider::invalidate); } @@ -71,7 +72,9 @@ public class CapabilityEventHandler { Player newPlayer = event.getEntity(); if (event.isWasDeath()) { - boolean keepInventory = oldPlayer.level().getGameRules() + boolean keepInventory = oldPlayer + .level() + .getGameRules() .getBoolean(GameRules.RULE_KEEPINVENTORY); // === V2 Death Handling === @@ -81,15 +84,22 @@ public class CapabilityEventHandler { if (keepInventory) { // keepInventory: serialize/deserialize round-trip newPlayer - .getCapability(V2BondageEquipmentProvider.V2_BONDAGE_EQUIPMENT) + .getCapability( + V2BondageEquipmentProvider.V2_BONDAGE_EQUIPMENT + ) .ifPresent(newV2 -> { CompoundTag saved = oldV2.serializeNBT(); newV2.deserializeNBT(saved); // Fire onEquipped for each item on the new player - for (Map.Entry entry - : newV2.getAllEquipped().entrySet()) { + for (Map.Entry< + BodyRegionV2, + ItemStack + > entry : newV2.getAllEquipped().entrySet()) { ItemStack stack = entry.getValue(); - if (stack.getItem() instanceof IV2BondageItem v2Item) { + if ( + stack.getItem() instanceof + IV2BondageItem v2Item + ) { v2Item.onEquipped(stack, newPlayer); } } @@ -99,10 +109,13 @@ public class CapabilityEventHandler { }); } else { // No keepInventory: fire onUnequipped for each V2 item - for (Map.Entry entry - : oldV2.getAllEquipped().entrySet()) { + for (Map.Entry entry : oldV2 + .getAllEquipped() + .entrySet()) { ItemStack stack = entry.getValue(); - if (stack.getItem() instanceof IV2BondageItem v2Item) { + if ( + stack.getItem() instanceof IV2BondageItem v2Item + ) { v2Item.onUnequipped(stack, oldPlayer); } } @@ -124,15 +137,20 @@ public class CapabilityEventHandler { .getCapability(V2BondageEquipmentProvider.V2_BONDAGE_EQUIPMENT) .ifPresent(oldV2 -> { newPlayer - .getCapability(V2BondageEquipmentProvider.V2_BONDAGE_EQUIPMENT) + .getCapability( + V2BondageEquipmentProvider.V2_BONDAGE_EQUIPMENT + ) .ifPresent(newV2 -> { CompoundTag saved = oldV2.serializeNBT(); newV2.deserializeNBT(saved); // Fire onEquipped for each item on the new player - for (Map.Entry entry - : newV2.getAllEquipped().entrySet()) { + for (Map.Entry entry : newV2 + .getAllEquipped() + .entrySet()) { ItemStack stack = entry.getValue(); - if (stack.getItem() instanceof IV2BondageItem v2Item) { + if ( + stack.getItem() instanceof IV2BondageItem v2Item + ) { v2Item.onEquipped(stack, newPlayer); } } diff --git a/src/main/java/com/tiedup/remake/events/lifecycle/PlayerDisconnectHandler.java b/src/main/java/com/tiedup/remake/events/lifecycle/PlayerDisconnectHandler.java index fe500e6..2b8001f 100644 --- a/src/main/java/com/tiedup/remake/events/lifecycle/PlayerDisconnectHandler.java +++ b/src/main/java/com/tiedup/remake/events/lifecycle/PlayerDisconnectHandler.java @@ -74,7 +74,9 @@ public class PlayerDisconnectHandler { com.tiedup.remake.v2.blocks.PetBedManager.onPlayerDisconnect(playerId); // Clean up active conversations - com.tiedup.remake.dialogue.conversation.ConversationManager.cleanupPlayer(playerId); + com.tiedup.remake.dialogue.conversation.ConversationManager.cleanupPlayer( + playerId + ); // Clean up cell selection mode com.tiedup.remake.cells.CellSelectionManager.cleanup(playerId); diff --git a/src/main/java/com/tiedup/remake/events/lifecycle/PlayerLifecycleHandler.java b/src/main/java/com/tiedup/remake/events/lifecycle/PlayerLifecycleHandler.java index 3bdc07f..9f41e8b 100644 --- a/src/main/java/com/tiedup/remake/events/lifecycle/PlayerLifecycleHandler.java +++ b/src/main/java/com/tiedup/remake/events/lifecycle/PlayerLifecycleHandler.java @@ -1,12 +1,12 @@ package com.tiedup.remake.events.lifecycle; -import com.tiedup.remake.v2.BodyRegionV2; -import com.tiedup.remake.v2.bondage.capability.V2BondageEquipmentProvider; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.entities.EntityMaster; import com.tiedup.remake.entities.ModEntities; import com.tiedup.remake.state.IPlayerLeashAccess; import com.tiedup.remake.state.PlayerBindState; +import com.tiedup.remake.v2.BodyRegionV2; +import com.tiedup.remake.v2.bondage.capability.V2BondageEquipmentProvider; import java.util.UUID; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; @@ -45,7 +45,6 @@ public class PlayerLifecycleHandler { PlayerBindState state = PlayerBindState.getInstance(player); if (state == null) return; - // Phase 17: CASE 1: This player is a Captor - free all their captives if (state.getCaptorManager().hasCaptives()) { TiedUpMod.LOGGER.info( "[Lifecycle] Captor {} disconnected. Freeing all captives.", @@ -65,7 +64,9 @@ public class PlayerLifecycleHandler { if (holder instanceof LeashFenceKnotEntity fenceKnot) { BlockPos polePos = fenceKnot.getPos(); player - .getCapability(V2BondageEquipmentProvider.V2_BONDAGE_EQUIPMENT) + .getCapability( + V2BondageEquipmentProvider.V2_BONDAGE_EQUIPMENT + ) .ifPresent(cap -> { cap.savePoleLeash(polePos, player.level().dimension()); TiedUpMod.LOGGER.info( @@ -84,7 +85,9 @@ public class PlayerLifecycleHandler { .getEntity() .getUUID(); player - .getCapability(V2BondageEquipmentProvider.V2_BONDAGE_EQUIPMENT) + .getCapability( + V2BondageEquipmentProvider.V2_BONDAGE_EQUIPMENT + ) .ifPresent(cap -> { cap.saveCaptorUUID(captorUUID); TiedUpMod.LOGGER.info( @@ -145,9 +148,7 @@ public class PlayerLifecycleHandler { } } - // ======================================== // MASTER PERSISTENCE CONSTANTS - // ======================================== private static final String NBT_MASTER_DATA = "TiedUp_MasterPersistence"; private static final String NBT_MASTER_HAS_MASTER = "HasMaster"; @@ -155,9 +156,7 @@ public class PlayerLifecycleHandler { private static final String NBT_MASTER_STATE = "MasterState"; private static final String NBT_MASTER_NAME = "MasterName"; - // ======================================== // MASTER DISCONNECT HANDLING - // ======================================== /** * Handle Master entity when pet player disconnects. @@ -254,9 +253,7 @@ public class PlayerLifecycleHandler { persistentData.put(NBT_MASTER_DATA, masterData); } - // ======================================== // MASTER RECONNECT HANDLING - // ======================================== /** * Handle Master restoration when pet player reconnects. diff --git a/src/main/java/com/tiedup/remake/events/lifecycle/PlayerStateEventHandler.java b/src/main/java/com/tiedup/remake/events/lifecycle/PlayerStateEventHandler.java index 6d6bec8..8117699 100644 --- a/src/main/java/com/tiedup/remake/events/lifecycle/PlayerStateEventHandler.java +++ b/src/main/java/com/tiedup/remake/events/lifecycle/PlayerStateEventHandler.java @@ -1,11 +1,9 @@ package com.tiedup.remake.events.lifecycle; -import com.tiedup.remake.events.restriction.BondageItemRestrictionHandler; -import com.tiedup.remake.v2.BodyRegionV2; -import com.tiedup.remake.v2.bondage.capability.V2BondageEquipmentProvider; import com.tiedup.remake.cells.CampOwnership; import com.tiedup.remake.cells.CellRegistryV2; import com.tiedup.remake.core.TiedUpMod; +import com.tiedup.remake.events.restriction.BondageItemRestrictionHandler; import com.tiedup.remake.labor.LaborTask; import com.tiedup.remake.network.ModNetwork; import com.tiedup.remake.network.labor.PacketSyncLaborProgress; @@ -16,6 +14,8 @@ import com.tiedup.remake.prison.PrisonerRecord; import com.tiedup.remake.prison.PrisonerState; import com.tiedup.remake.state.IPlayerLeashAccess; import com.tiedup.remake.state.PlayerBindState; +import com.tiedup.remake.v2.BodyRegionV2; +import com.tiedup.remake.v2.bondage.capability.V2BondageEquipmentProvider; import java.util.Set; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; diff --git a/src/main/java/com/tiedup/remake/events/restriction/BondageItemRestrictionHandler.java b/src/main/java/com/tiedup/remake/events/restriction/BondageItemRestrictionHandler.java index ab9ca70..a4b404b 100644 --- a/src/main/java/com/tiedup/remake/events/restriction/BondageItemRestrictionHandler.java +++ b/src/main/java/com/tiedup/remake/events/restriction/BondageItemRestrictionHandler.java @@ -1,17 +1,17 @@ package com.tiedup.remake.events.restriction; +import com.tiedup.remake.core.SystemMessageManager; +import com.tiedup.remake.core.SystemMessageManager.MessageCategory; import com.tiedup.remake.core.TiedUpMod; +import com.tiedup.remake.dialogue.EntityDialogueManager; +import com.tiedup.remake.dialogue.EntityDialogueManager.DialogueCategory; import com.tiedup.remake.entities.EntityKidnapper; import com.tiedup.remake.items.ItemLockpick; import com.tiedup.remake.items.base.IKnife; import com.tiedup.remake.state.IBondageState; import com.tiedup.remake.state.IRestrainable; -import com.tiedup.remake.dialogue.EntityDialogueManager; -import com.tiedup.remake.dialogue.EntityDialogueManager.DialogueCategory; -import com.tiedup.remake.util.KidnappedHelper; -import com.tiedup.remake.core.SystemMessageManager; -import com.tiedup.remake.core.SystemMessageManager.MessageCategory; import com.tiedup.remake.util.GameConstants; +import com.tiedup.remake.util.KidnappedHelper; import java.util.HashMap; import java.util.Map; import java.util.UUID; @@ -29,9 +29,9 @@ import net.minecraft.world.level.block.TrapDoorBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; import net.minecraftforge.event.TickEvent; +import net.minecraftforge.event.entity.living.LivingEntityUseItemEvent; import net.minecraftforge.event.entity.living.LivingEvent; import net.minecraftforge.event.entity.living.LivingHurtEvent; -import net.minecraftforge.event.entity.living.LivingEntityUseItemEvent; import net.minecraftforge.event.entity.player.AttackEntityEvent; import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; @@ -43,7 +43,6 @@ import net.minecraftforge.fml.common.Mod; /** * Unified event handler for all bondage item restrictions. * - * Phase 14.4+: Centralized restriction system * Leg Binding: Separate arm/leg restrictions * * This handler manages restrictions based on equipped bondage items: @@ -90,9 +89,7 @@ public class BondageItemRestrictionHandler { Map > messageCooldowns = new HashMap<>(); - // ======================================== // MOVEMENT RESTRICTIONS - // ======================================== /** * Movement restrictions per tick (throttled to every 5 ticks). @@ -135,9 +132,11 @@ public class BondageItemRestrictionHandler { // === SWIM SPEED RESTRICTION === if (player.isInWater() && player.isSwimming()) { Vec3 motion = player.getDeltaMovement(); - player.setDeltaMovement(motion.scale( - com.tiedup.remake.core.ModConfig.SERVER.tiedSwimSpeedMultiplier.get() - )); + player.setDeltaMovement( + motion.scale( + com.tiedup.remake.core.ModConfig.SERVER.tiedSwimSpeedMultiplier.get() + ) + ); } } @@ -160,9 +159,7 @@ public class BondageItemRestrictionHandler { sendRestrictionMessage(player, MessageCategory.NO_ELYTRA); } - // ======================================== // INTERACTION RESTRICTIONS - // ======================================== /** * Block breaking restrictions. @@ -334,10 +331,7 @@ public class BondageItemRestrictionHandler { event.setCanceled(true); // Kidnapper responds with dialogue - kidnapper.talkTo( - player, - DialogueCategory.ATTACK_SLAVE - ); + kidnapper.talkTo(player, DialogueCategory.ATTACK_SLAVE); // Shock the captive/worker IRestrainable playerState = KidnappedHelper.getKidnappedState( @@ -426,12 +420,16 @@ public class BondageItemRestrictionHandler { if (event.getAmount() <= 0) return; // Find if this player has a nearby Master who owns them - var masters = pet.level().getEntitiesOfClass( - com.tiedup.remake.entities.EntityMaster.class, - pet.getBoundingBox().inflate(32.0), - m -> m.isAlive() && m.hasPet() - && pet.getUUID().equals(m.getStateManager().getPetPlayerUUID()) - ); + var masters = pet + .level() + .getEntitiesOfClass( + com.tiedup.remake.entities.EntityMaster.class, + pet.getBoundingBox().inflate(32.0), + m -> + m.isAlive() && + m.hasPet() && + pet.getUUID().equals(m.getStateManager().getPetPlayerUUID()) + ); for (var master : masters) { master.onPetHurt(event.getSource(), event.getAmount()); @@ -483,9 +481,7 @@ public class BondageItemRestrictionHandler { } } - // ======================================== // HELPER METHODS - // ======================================== /** * Check if a block interaction should be allowed when tied. diff --git a/src/main/java/com/tiedup/remake/events/restriction/LaborToolProtectionHandler.java b/src/main/java/com/tiedup/remake/events/restriction/LaborToolProtectionHandler.java index e4e4e8a..baffc57 100644 --- a/src/main/java/com/tiedup/remake/events/restriction/LaborToolProtectionHandler.java +++ b/src/main/java/com/tiedup/remake/events/restriction/LaborToolProtectionHandler.java @@ -7,7 +7,6 @@ import com.tiedup.remake.prison.PrisonerManager; import java.util.HashMap; import java.util.Map; import java.util.UUID; -import org.jetbrains.annotations.Nullable; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; @@ -20,6 +19,7 @@ import net.minecraftforge.event.entity.item.ItemTossEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; +import org.jetbrains.annotations.Nullable; /** * Event handler for labor tool protection. diff --git a/src/main/java/com/tiedup/remake/events/restriction/PetPlayRestrictionHandler.java b/src/main/java/com/tiedup/remake/events/restriction/PetPlayRestrictionHandler.java index b864ffd..46dd127 100644 --- a/src/main/java/com/tiedup/remake/events/restriction/PetPlayRestrictionHandler.java +++ b/src/main/java/com/tiedup/remake/events/restriction/PetPlayRestrictionHandler.java @@ -1,10 +1,10 @@ package com.tiedup.remake.events.restriction; import com.tiedup.remake.core.TiedUpMod; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.entities.EntityMaster; import com.tiedup.remake.items.ItemChokeCollar; import com.tiedup.remake.state.PlayerBindState; +import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.v2.blocks.PetBedManager; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; @@ -50,9 +50,7 @@ public class PetPlayRestrictionHandler { private static final java.util.Map lastMessageTime = new java.util.HashMap<>(); - // ======================================== // EATING RESTRICTION - // ======================================== /** * Prevent pet play players from eating food from hand. @@ -156,9 +154,7 @@ public class PetPlayRestrictionHandler { // Pet bed interaction (carpet placeholder) - handled in sleep event } - // ======================================== // SLEEPING RESTRICTION - // ======================================== /** * Prevent pet play players from sleeping in normal beds. @@ -264,9 +260,7 @@ public class PetPlayRestrictionHandler { return null; } - // ======================================== // CHOKE COLLAR EFFECT - // ======================================== /** * Apply choke collar effect on player tick. @@ -318,9 +312,7 @@ public class PetPlayRestrictionHandler { } } - // ======================================== // UTILITY - // ======================================== /** * BUG FIX: Clean up player data to prevent memory leak. diff --git a/src/main/java/com/tiedup/remake/events/restriction/RestraintTaskTickHandler.java b/src/main/java/com/tiedup/remake/events/restriction/RestraintTaskTickHandler.java index d80a568..b65339b 100644 --- a/src/main/java/com/tiedup/remake/events/restriction/RestraintTaskTickHandler.java +++ b/src/main/java/com/tiedup/remake/events/restriction/RestraintTaskTickHandler.java @@ -1,7 +1,7 @@ package com.tiedup.remake.events.restriction; +import com.tiedup.remake.core.SettingsAccessor; import com.tiedup.remake.core.TiedUpMod; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.entities.EntityKidnapper; import com.tiedup.remake.items.base.ItemCollar; import com.tiedup.remake.minigame.StruggleSessionManager; @@ -15,7 +15,7 @@ import com.tiedup.remake.tasks.UntyingPlayerTask; import com.tiedup.remake.tasks.UntyingTask; import com.tiedup.remake.util.GameConstants; import com.tiedup.remake.util.KidnappedHelper; -import com.tiedup.remake.core.SettingsAccessor; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.List; import java.util.UUID; import net.minecraft.network.chat.Component; @@ -228,7 +228,6 @@ public class RestraintTaskTickHandler { return; } - // Phase 13: Auto-shock collar logic (Player-specific feature) if (playerState != null) { playerState.checkAutoShockCollar(); } @@ -284,9 +283,7 @@ public class RestraintTaskTickHandler { return; } - // ======================================== // SECURITY: Distance and line-of-sight validation - // ======================================== double maxUntieDistance = 4.0; // Max distance to untie (blocks) double distance = helper.distanceTo(targetEntity); if (distance > maxUntieDistance) { @@ -310,7 +307,10 @@ public class RestraintTaskTickHandler { } // Check for Kidnapper fight back - block untying if Kidnapper is nearby - if (targetEntity instanceof com.tiedup.remake.entities.AbstractTiedUpNpc npc) { + if ( + targetEntity instanceof + com.tiedup.remake.entities.AbstractTiedUpNpc npc + ) { if ( npc.getCaptor() instanceof EntityKidnapper kidnapper && kidnapper.isAlive() @@ -413,9 +413,11 @@ public class RestraintTaskTickHandler { // Get untying duration (default: 10 seconds) int untyingSeconds = getUntyingDuration(helper); - // Phase 11: Check collar ownership for TiedUp NPCs // Non-owners take 3x longer and trigger alert to owners - if (targetEntity instanceof com.tiedup.remake.entities.AbstractTiedUpNpc npc) { + if ( + targetEntity instanceof + com.tiedup.remake.entities.AbstractTiedUpNpc npc + ) { if (!npc.isCollarOwner(helper)) { // Non-owner: triple the untying time untyingSeconds *= 3; @@ -513,7 +515,9 @@ public class RestraintTaskTickHandler { * @return Duration in seconds (default: 10) */ private static int getUntyingDuration(Player player) { - return SettingsAccessor.getUntyingPlayerTime(player.level().getGameRules()); + return SettingsAccessor.getUntyingPlayerTime( + player.level().getGameRules() + ); } // ========== FORCE FEEDING MECHANIC ========== @@ -627,7 +631,6 @@ public class RestraintTaskTickHandler { /** * Alert all collar owners that someone is trying to free their slave. - * Phase 11: Multiplayer protection system * * @param slave The slave being freed * @param liberator The player trying to free them diff --git a/src/main/java/com/tiedup/remake/events/system/AnvilEventHandler.java b/src/main/java/com/tiedup/remake/events/system/AnvilEventHandler.java index d8cfa13..68e9a88 100644 --- a/src/main/java/com/tiedup/remake/events/system/AnvilEventHandler.java +++ b/src/main/java/com/tiedup/remake/events/system/AnvilEventHandler.java @@ -11,7 +11,6 @@ import net.minecraftforge.fml.common.Mod; /** * Event handler for anvil-based padlock attachment. * - * Phase 20: Padlock via Anvil * * Allows combining a bondage item (ILockable) with a Padlock in the anvil * to make the item "lockable". A lockable item can then be locked with a Key. diff --git a/src/main/java/com/tiedup/remake/events/system/BountyDeliveryHandler.java b/src/main/java/com/tiedup/remake/events/system/BountyDeliveryHandler.java index 5e08442..12c1e2c 100644 --- a/src/main/java/com/tiedup/remake/events/system/BountyDeliveryHandler.java +++ b/src/main/java/com/tiedup/remake/events/system/BountyDeliveryHandler.java @@ -2,12 +2,12 @@ package com.tiedup.remake.events.system; import com.tiedup.remake.bounty.Bounty; import com.tiedup.remake.bounty.BountyManager; +import com.tiedup.remake.core.SettingsAccessor; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.state.IBondageState; import com.tiedup.remake.state.PlayerBindState; import com.tiedup.remake.state.PlayerCaptorManager; import com.tiedup.remake.util.KidnappedHelper; -import com.tiedup.remake.core.SettingsAccessor; import java.util.List; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.LivingEntity; @@ -20,7 +20,6 @@ import net.minecraftforge.fml.common.Mod; /** * Handles bounty delivery detection and player login events. * - * Phase 17: Bounty System * * Detects when: * - A hunter brings a captive near the bounty client diff --git a/src/main/java/com/tiedup/remake/events/system/CellV2EventHandler.java b/src/main/java/com/tiedup/remake/events/system/CellV2EventHandler.java index b70dac6..11aa9ec 100644 --- a/src/main/java/com/tiedup/remake/events/system/CellV2EventHandler.java +++ b/src/main/java/com/tiedup/remake/events/system/CellV2EventHandler.java @@ -24,7 +24,7 @@ import net.minecraftforge.fml.common.Mod; import net.minecraftforge.registries.ForgeRegistries; /** - * Central event handler for Cell System V2 Phase 2. + * Central event handler for Cell System V2. * * Handles: * - Selection mode (block click capture for Set Spawn/Delivery/Disguise) diff --git a/src/main/java/com/tiedup/remake/events/system/ChatEventHandler.java b/src/main/java/com/tiedup/remake/events/system/ChatEventHandler.java index 989e205..8420334 100644 --- a/src/main/java/com/tiedup/remake/events/system/ChatEventHandler.java +++ b/src/main/java/com/tiedup/remake/events/system/ChatEventHandler.java @@ -5,12 +5,12 @@ import com.tiedup.remake.core.SystemMessageManager; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.dialogue.GagTalkManager; import com.tiedup.remake.items.base.ItemGag; -import com.tiedup.remake.v2.BodyRegionV2; -import com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper; import com.tiedup.remake.state.IBondageState; import com.tiedup.remake.util.GagMaterial; import com.tiedup.remake.util.KidnappedHelper; import com.tiedup.remake.util.TiedUpUtils; +import com.tiedup.remake.v2.BodyRegionV2; +import com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper; import java.util.List; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; @@ -25,7 +25,6 @@ import net.minecraftforge.fml.common.Mod; * ChatEventHandler - Intercepts chat messages to apply gag effects. * Evolution: Implements proximity-based chat for gagged players. * - * Phase 14.1.5: Refactored to use IBondageState interface * * Security fix: Now blocks communication commands (/msg, /tell, etc.) when gagged * to prevent gag bypass exploit @@ -70,8 +69,10 @@ public class ChatEventHandler { ); // 2. Proximity Chat Logic - boolean useProximity = SettingsAccessor.isGagTalkProximityEnabled( - player.level().getGameRules()); + boolean useProximity = + SettingsAccessor.isGagTalkProximityEnabled( + player.level().getGameRules() + ); if (useProximity) { // Cancel global and send to nearby @@ -84,7 +85,6 @@ public class ChatEventHandler { double range = material.getTalkRange(); - // Phase 14.2: Use TiedUpUtils for proximity and earplugs filtering List nearbyPlayers = TiedUpUtils.getPlayersAround( player.level(), diff --git a/src/main/java/com/tiedup/remake/events/system/MiniGameTickHandler.java b/src/main/java/com/tiedup/remake/events/system/MiniGameTickHandler.java index 8ee2e00..e16c27a 100644 --- a/src/main/java/com/tiedup/remake/events/system/MiniGameTickHandler.java +++ b/src/main/java/com/tiedup/remake/events/system/MiniGameTickHandler.java @@ -30,7 +30,10 @@ public class MiniGameTickHandler { long currentTick = event.getServer().getTickCount(); // Tick continuous struggle sessions every tick - StruggleSessionManager.getInstance().tickContinuousSessions(event.getServer(), currentTick); + StruggleSessionManager.getInstance().tickContinuousSessions( + event.getServer(), + currentTick + ); // Cleanup expired sessions periodically StruggleSessionManager.getInstance().tickCleanup(currentTick); diff --git a/src/main/java/com/tiedup/remake/items/GenericKnife.java b/src/main/java/com/tiedup/remake/items/GenericKnife.java index 0dff818..aac49d0 100644 --- a/src/main/java/com/tiedup/remake/items/GenericKnife.java +++ b/src/main/java/com/tiedup/remake/items/GenericKnife.java @@ -352,10 +352,7 @@ public class GenericKnife extends Item implements IKnife { return; } - ItemStack accessory = V2EquipmentHelper.getInRegion( - player, - target - ); + ItemStack accessory = V2EquipmentHelper.getInRegion(player, target); if (accessory.isEmpty()) { // Target doesn't exist state.clearKnifeCutTarget(); diff --git a/src/main/java/com/tiedup/remake/items/GenericMittens.java b/src/main/java/com/tiedup/remake/items/GenericMittens.java index f101e71..5b25a61 100644 --- a/src/main/java/com/tiedup/remake/items/GenericMittens.java +++ b/src/main/java/com/tiedup/remake/items/GenericMittens.java @@ -9,7 +9,6 @@ import net.minecraft.world.item.Item; * * Factory pattern: All mittens variants are created using this single class. * - * Phase 14.4: Mittens system - blocks hand interactions when equipped. */ public class GenericMittens extends ItemMittens { diff --git a/src/main/java/com/tiedup/remake/items/ItemChloroformBottle.java b/src/main/java/com/tiedup/remake/items/ItemChloroformBottle.java index b103a48..f188ae5 100644 --- a/src/main/java/com/tiedup/remake/items/ItemChloroformBottle.java +++ b/src/main/java/com/tiedup/remake/items/ItemChloroformBottle.java @@ -17,7 +17,6 @@ import net.minecraft.world.level.Level; * Chloroform Bottle - Used to soak rags for knocking out targets * Has limited durability. * - * Phase 15: Full chloroform system implementation * * Usage: * - Hold chloroform bottle in main hand, rag in offhand diff --git a/src/main/java/com/tiedup/remake/items/ItemChokeCollar.java b/src/main/java/com/tiedup/remake/items/ItemChokeCollar.java index 95d2943..b586381 100644 --- a/src/main/java/com/tiedup/remake/items/ItemChokeCollar.java +++ b/src/main/java/com/tiedup/remake/items/ItemChokeCollar.java @@ -135,9 +135,7 @@ public class ItemChokeCollar extends ItemCollar implements IHas3DModelConfig { return false; } - // ======================================== // 3D Model Support - // ======================================== @Override public boolean uses3DModel() { diff --git a/src/main/java/com/tiedup/remake/items/ItemClassicCollar.java b/src/main/java/com/tiedup/remake/items/ItemClassicCollar.java index c80a778..3fc120e 100644 --- a/src/main/java/com/tiedup/remake/items/ItemClassicCollar.java +++ b/src/main/java/com/tiedup/remake/items/ItemClassicCollar.java @@ -8,7 +8,6 @@ import net.minecraft.world.item.Item; * Standard collar for marking ownership. * * Based on original ItemCollar from 1.12.2 - * Phase 1: No ownership system yet, just a basic wearable collar * Note: Collars have maxStackSize of 1 (unique items) */ public class ItemClassicCollar extends ItemCollar { diff --git a/src/main/java/com/tiedup/remake/items/ItemCommandWand.java b/src/main/java/com/tiedup/remake/items/ItemCommandWand.java index 0abc6f7..ac70562 100644 --- a/src/main/java/com/tiedup/remake/items/ItemCommandWand.java +++ b/src/main/java/com/tiedup/remake/items/ItemCommandWand.java @@ -1,7 +1,6 @@ package com.tiedup.remake.items; import com.tiedup.remake.cells.CellDataV2; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.cells.CellRegistryV2; import com.tiedup.remake.core.SystemMessageManager; import com.tiedup.remake.core.TiedUpMod; @@ -14,6 +13,7 @@ import com.tiedup.remake.personality.JobExperience; import com.tiedup.remake.personality.NpcCommand; import com.tiedup.remake.personality.NpcNeeds; import com.tiedup.remake.personality.PersonalityState; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.List; import javax.annotation.Nullable; import net.minecraft.ChatFormatting; diff --git a/src/main/java/com/tiedup/remake/items/ItemDebugWand.java b/src/main/java/com/tiedup/remake/items/ItemDebugWand.java index e45113b..cb099ea 100644 --- a/src/main/java/com/tiedup/remake/items/ItemDebugWand.java +++ b/src/main/java/com/tiedup/remake/items/ItemDebugWand.java @@ -129,9 +129,10 @@ public class ItemDebugWand extends Item { ) { player.displayClientMessage(Component.literal(""), false); // Blank line player.displayClientMessage( - Component.literal( - "=== " + damsel.getNpcName() + " ===" - ).withStyle(ChatFormatting.GOLD, ChatFormatting.BOLD), + Component.literal("=== " + damsel.getNpcName() + " ===").withStyle( + ChatFormatting.GOLD, + ChatFormatting.BOLD + ), false ); diff --git a/src/main/java/com/tiedup/remake/items/ItemGpsCollar.java b/src/main/java/com/tiedup/remake/items/ItemGpsCollar.java index 9a01fb8..5396c5e 100644 --- a/src/main/java/com/tiedup/remake/items/ItemGpsCollar.java +++ b/src/main/java/com/tiedup/remake/items/ItemGpsCollar.java @@ -253,7 +253,6 @@ public class ItemGpsCollar extends ItemShockCollar { } /** - * Phase 14.1.4: Reset auto-shock timer when GPS collar is removed. */ @Override public void onUnequipped(ItemStack stack, LivingEntity entity) { diff --git a/src/main/java/com/tiedup/remake/items/ItemGpsLocator.java b/src/main/java/com/tiedup/remake/items/ItemGpsLocator.java index 745e325..dd77a54 100644 --- a/src/main/java/com/tiedup/remake/items/ItemGpsLocator.java +++ b/src/main/java/com/tiedup/remake/items/ItemGpsLocator.java @@ -1,11 +1,11 @@ package com.tiedup.remake.items; import com.tiedup.remake.core.SystemMessageManager; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.items.base.ItemCollar; import com.tiedup.remake.items.base.ItemOwnerTarget; import com.tiedup.remake.state.IBondageState; import com.tiedup.remake.util.KidnappedHelper; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.List; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; @@ -88,7 +88,9 @@ public class ItemGpsLocator extends ItemOwnerTarget { target ); if (targetState != null && targetState.hasCollar()) { - ItemStack collarStack = targetState.getEquipment(BodyRegionV2.NECK); + ItemStack collarStack = targetState.getEquipment( + BodyRegionV2.NECK + ); if ( collarStack.getItem() instanceof ItemGpsCollar collarItem @@ -162,7 +164,6 @@ public class ItemGpsLocator extends ItemOwnerTarget { } /** - * Phase 14.1.5: Refactored to support IBondageState (LivingEntity + NPCs) */ @Override public InteractionResult interactLivingEntity( diff --git a/src/main/java/com/tiedup/remake/items/ItemHood.java b/src/main/java/com/tiedup/remake/items/ItemHood.java index 42f0b8d..96802b8 100644 --- a/src/main/java/com/tiedup/remake/items/ItemHood.java +++ b/src/main/java/com/tiedup/remake/items/ItemHood.java @@ -9,7 +9,6 @@ import net.minecraft.world.item.Item; * Hood - Covers the head completely * Combines blindfold effect with gagging effect. * - * Phase 15: Combo item (BLINDFOLD slot + gag effect) * Extends ItemBlindfold for slot behavior, implements IHasGaggingEffect for speech muffling. */ public class ItemHood extends ItemBlindfold implements IHasGaggingEffect { diff --git a/src/main/java/com/tiedup/remake/items/ItemKey.java b/src/main/java/com/tiedup/remake/items/ItemKey.java index ddd4a54..71c441c 100644 --- a/src/main/java/com/tiedup/remake/items/ItemKey.java +++ b/src/main/java/com/tiedup/remake/items/ItemKey.java @@ -1,10 +1,10 @@ package com.tiedup.remake.items; import com.tiedup.remake.core.SystemMessageManager; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.items.base.ItemOwnerTarget; import com.tiedup.remake.state.IBondageState; import com.tiedup.remake.util.KidnappedHelper; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.List; import java.util.UUID; import net.minecraft.ChatFormatting; @@ -24,7 +24,7 @@ import org.jetbrains.annotations.Nullable; /** * Collar Key - Used to lock/unlock bondage items via the Slave Management GUI. * - *

            Phase 20: Key-Lock System

            + *

            Key-Lock System

            *
              *
            • Linking: Right-click a player wearing a collar to link (claim) the key to them.
            • *
            • Management: Opens SlaveItemManagementScreen to lock/unlock individual items.
            • @@ -40,7 +40,7 @@ public class ItemKey extends ItemOwnerTarget { super(new net.minecraft.world.item.Item.Properties().durability(64)); } - // ========== Phase 20: Key UUID System ========== + // ========== Key UUID System ========== /** * Get the unique UUID for this key. @@ -124,8 +124,6 @@ public class ItemKey extends ItemOwnerTarget { * Logic for interacting with entities wearing collars. * Opens the Slave Item Management GUI to lock/unlock individual items. * - * Phase 14.1.5: Refactored to support IBondageState (LivingEntity + NPCs) - * Phase 20: Opens GUI instead of direct toggle */ @Override public InteractionResult interactLivingEntity( @@ -234,7 +232,9 @@ public class ItemKey extends ItemOwnerTarget { net.minecraft.world.entity.LivingEntity target ) { net.minecraft.client.Minecraft.getInstance().setScreen( - new com.tiedup.remake.client.gui.screens.UnifiedBondageScreen(target) + new com.tiedup.remake.client.gui.screens.UnifiedBondageScreen( + target + ) ); } diff --git a/src/main/java/com/tiedup/remake/items/ItemLockpick.java b/src/main/java/com/tiedup/remake/items/ItemLockpick.java index 2a182c3..6318095 100644 --- a/src/main/java/com/tiedup/remake/items/ItemLockpick.java +++ b/src/main/java/com/tiedup/remake/items/ItemLockpick.java @@ -27,7 +27,6 @@ import org.jetbrains.annotations.Nullable; /** * Lockpick item for picking locks on bondage restraints. * - * Phase 21: Revamped Lockpick System * * Behavior: * - 25% chance of success per attempt diff --git a/src/main/java/com/tiedup/remake/items/ItemMasterKey.java b/src/main/java/com/tiedup/remake/items/ItemMasterKey.java index b15923b..36ed5cc 100644 --- a/src/main/java/com/tiedup/remake/items/ItemMasterKey.java +++ b/src/main/java/com/tiedup/remake/items/ItemMasterKey.java @@ -1,12 +1,12 @@ package com.tiedup.remake.items; import com.tiedup.remake.core.SystemMessageManager; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.items.base.ILockable; import com.tiedup.remake.state.IBondageState; import com.tiedup.remake.util.KidnappedHelper; import com.tiedup.remake.util.TiedUpSounds; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.UUID; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; @@ -21,8 +21,6 @@ import net.minecraftforge.api.distmarker.OnlyIn; /** * Master Key - Universal key that opens any padlock. * - * Phase 15: Full master key implementation - * Phase 20: Opens SlaveItemManagementScreen in master mode * * Behavior: * - Right-click: Opens Slave Management GUI (can unlock any lock) @@ -124,7 +122,9 @@ public class ItemMasterKey extends Item { net.minecraft.world.entity.LivingEntity target ) { net.minecraft.client.Minecraft.getInstance().setScreen( - new com.tiedup.remake.client.gui.screens.UnifiedBondageScreen(target) + new com.tiedup.remake.client.gui.screens.UnifiedBondageScreen( + target + ) ); } diff --git a/src/main/java/com/tiedup/remake/items/ItemMedicalGag.java b/src/main/java/com/tiedup/remake/items/ItemMedicalGag.java index 5cca5a7..f4e84a6 100644 --- a/src/main/java/com/tiedup/remake/items/ItemMedicalGag.java +++ b/src/main/java/com/tiedup/remake/items/ItemMedicalGag.java @@ -9,7 +9,6 @@ import net.minecraft.world.item.Item; * Medical Gag - Full face medical restraint * Combines gag effect with blinding effect. * - * Phase 15: Combo item (GAG slot + blinding effect) * Extends ItemGag for slot behavior, implements IHasBlindingEffect for vision obstruction. */ public class ItemMedicalGag extends ItemGag implements IHasBlindingEffect { diff --git a/src/main/java/com/tiedup/remake/items/ItemPaddle.java b/src/main/java/com/tiedup/remake/items/ItemPaddle.java index 1528652..14fb7bc 100644 --- a/src/main/java/com/tiedup/remake/items/ItemPaddle.java +++ b/src/main/java/com/tiedup/remake/items/ItemPaddle.java @@ -16,7 +16,6 @@ import net.minecraft.world.item.ItemStack; /** * Paddle - Tool for disciplining NPCs (gentle discipline). * - * Phase 7: Basic paddle * Refactored: Tighten moved to keybind, paddle now only does discipline on NPCs */ public class ItemPaddle extends Item { @@ -54,7 +53,9 @@ public class ItemPaddle extends Item { } // NPC discipline - visual/sound feedback only (no personality effect) - if (target instanceof com.tiedup.remake.entities.AbstractTiedUpNpc npc) { + if ( + target instanceof com.tiedup.remake.entities.AbstractTiedUpNpc npc + ) { // Visual feedback - gentler than whip TiedUpSounds.playSlapSound(target); if (player.level() instanceof ServerLevel serverLevel) { diff --git a/src/main/java/com/tiedup/remake/items/ItemPadlock.java b/src/main/java/com/tiedup/remake/items/ItemPadlock.java index 7af9388..34921c1 100644 --- a/src/main/java/com/tiedup/remake/items/ItemPadlock.java +++ b/src/main/java/com/tiedup/remake/items/ItemPadlock.java @@ -12,7 +12,6 @@ import org.jetbrains.annotations.Nullable; /** * Padlock - Used to make bondage items lockable. * - * Phase 20: Anvil-based padlock attachment * * Usage: * - Combine with a bondage item (ILockable) in an Anvil diff --git a/src/main/java/com/tiedup/remake/items/ItemRag.java b/src/main/java/com/tiedup/remake/items/ItemRag.java index 1bca9b5..c419ef5 100644 --- a/src/main/java/com/tiedup/remake/items/ItemRag.java +++ b/src/main/java/com/tiedup/remake/items/ItemRag.java @@ -28,7 +28,6 @@ import org.jetbrains.annotations.Nullable; * Rag - Can be soaked in chloroform to knock out targets * Has wet/dry state managed via NBT. * - * Phase 15: Full chloroform system implementation * * Usage: * 1. Hold chloroform bottle, rag in offhand, right-click → rag becomes wet diff --git a/src/main/java/com/tiedup/remake/items/ItemRopeArrow.java b/src/main/java/com/tiedup/remake/items/ItemRopeArrow.java index 1e76de6..af10a40 100644 --- a/src/main/java/com/tiedup/remake/items/ItemRopeArrow.java +++ b/src/main/java/com/tiedup/remake/items/ItemRopeArrow.java @@ -11,7 +11,6 @@ import net.minecraft.world.level.Level; * Rope Arrow - Arrow that ties up targets on hit * When fired from a bow and hits an entity, it has 75% chance to bind them. * - * Phase 15: Full rope arrow implementation * * Behavior: * - Works like regular arrows for firing diff --git a/src/main/java/com/tiedup/remake/items/ItemShockCollarAuto.java b/src/main/java/com/tiedup/remake/items/ItemShockCollarAuto.java index d43c8ec..07eb8a4 100644 --- a/src/main/java/com/tiedup/remake/items/ItemShockCollarAuto.java +++ b/src/main/java/com/tiedup/remake/items/ItemShockCollarAuto.java @@ -8,7 +8,6 @@ import net.minecraft.world.item.ItemStack; /** * Automatic Shock Collar - Shocks the wearer at regular intervals. * - * Phase 14.1.5: Refactored to support IRestrainable (LivingEntity + NPCs) * *

              Mechanics:

              *
                @@ -39,7 +38,6 @@ public class ItemShockCollarAuto extends ItemShockCollar { /** * Ensures the internal shock timer is cleaned up when the item is removed. * - * Phase 14.1.5: Refactored to support IRestrainable (LivingEntity + NPCs) */ @Override public void onUnequipped(ItemStack stack, LivingEntity entity) { diff --git a/src/main/java/com/tiedup/remake/items/ItemShockerController.java b/src/main/java/com/tiedup/remake/items/ItemShockerController.java index a39e677..696f13c 100644 --- a/src/main/java/com/tiedup/remake/items/ItemShockerController.java +++ b/src/main/java/com/tiedup/remake/items/ItemShockerController.java @@ -1,13 +1,13 @@ package com.tiedup.remake.items; import com.tiedup.remake.core.ModSounds; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.core.SystemMessageManager; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.items.base.ItemCollar; import com.tiedup.remake.items.base.ItemOwnerTarget; import com.tiedup.remake.state.IRestrainable; import com.tiedup.remake.util.KidnappedHelper; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -73,7 +73,9 @@ public class ItemShockerController extends ItemOwnerTarget { KidnappedHelper.getKidnappedState(target); if (targetState != null && targetState.hasCollar()) { isDisconnected = false; - ItemStack collar = targetState.getEquipment(BodyRegionV2.NECK); + ItemStack collar = targetState.getEquipment( + BodyRegionV2.NECK + ); if ( collar.getItem() instanceof ItemCollar collarItem && @@ -260,7 +262,6 @@ public class ItemShockerController extends ItemOwnerTarget { } /** - * Phase 14.1.5: Refactored to support IRestrainable (LivingEntity + NPCs) */ @Override public InteractionResult interactLivingEntity( @@ -308,7 +309,6 @@ public class ItemShockerController extends ItemOwnerTarget { } /** - * Phase 14.1.5: New method to support LivingEntity (Players + NPCs) * Returns all kidnappable entities in range wearing shock collars owned by the shocker owner or in public mode. */ private List getNearbyKidnappedTargets( @@ -371,7 +371,9 @@ public class ItemShockerController extends ItemOwnerTarget { CompoundTag tag = stack.getTag(); return (tag != null && tag.contains(NBT_RADIUS)) ? tag.getInt(NBT_RADIUS) - : com.tiedup.remake.core.SettingsAccessor.getShockerControllerRadius(null); + : com.tiedup.remake.core.SettingsAccessor.getShockerControllerRadius( + null + ); } public void setRadius(ItemStack stack, int radius) { diff --git a/src/main/java/com/tiedup/remake/items/ItemWhip.java b/src/main/java/com/tiedup/remake/items/ItemWhip.java index 54b2cf4..1f952a3 100644 --- a/src/main/java/com/tiedup/remake/items/ItemWhip.java +++ b/src/main/java/com/tiedup/remake/items/ItemWhip.java @@ -22,7 +22,6 @@ import net.minecraft.world.item.ItemStack; * Whip - Tool for discipline * Right-click a tied entity to deal damage and decrease their resistance. * - * Phase 15: Full whip mechanics implementation * * Effects: * - Deals damage (configurable) @@ -161,8 +160,13 @@ public class ItemWhip extends Item { // Resistance is stored in bind item NBT, so we must sync inventory // Without this, client still shows old resistance value in UI // Sync V2 equipment (resistance NBT changed on the stored ItemStack) - if (player instanceof net.minecraft.server.level.ServerPlayer serverPlayer) { - com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper.sync(serverPlayer); + if ( + player instanceof + net.minecraft.server.level.ServerPlayer serverPlayer + ) { + com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper.sync( + serverPlayer + ); } TiedUpMod.LOGGER.debug( diff --git a/src/main/java/com/tiedup/remake/items/ModCreativeTabs.java b/src/main/java/com/tiedup/remake/items/ModCreativeTabs.java index 1b6ead0..62a1318 100644 --- a/src/main/java/com/tiedup/remake/items/ModCreativeTabs.java +++ b/src/main/java/com/tiedup/remake/items/ModCreativeTabs.java @@ -192,21 +192,25 @@ public class ModCreativeTabs { output.accept(V2Items.PET_CAGE.get()); // ========== V2 BONDAGE ITEMS ========== - output.accept(com.tiedup.remake.v2.bondage.V2BondageItems.V2_HANDCUFFS.get()); + output.accept( + com.tiedup.remake.v2.bondage.V2BondageItems.V2_HANDCUFFS.get() + ); // ========== DATA-DRIVEN BONDAGE ITEMS ========== - for (com.tiedup.remake.v2.bondage.datadriven.DataDrivenItemDefinition def : - com.tiedup.remake.v2.bondage.datadriven.DataDrivenItemRegistry.getAll()) { + for (com.tiedup.remake.v2.bondage.datadriven.DataDrivenItemDefinition def : com.tiedup.remake.v2.bondage.datadriven.DataDrivenItemRegistry.getAll()) { output.accept( - com.tiedup.remake.v2.bondage.datadriven.DataDrivenBondageItem.createStack(def.id()) + com.tiedup.remake.v2.bondage.datadriven.DataDrivenBondageItem.createStack( + def.id() + ) ); } // ========== FURNITURE PLACER ITEMS ========== - for (com.tiedup.remake.v2.furniture.FurnitureDefinition def : - com.tiedup.remake.v2.furniture.FurnitureRegistry.getAll()) { + for (com.tiedup.remake.v2.furniture.FurnitureDefinition def : com.tiedup.remake.v2.furniture.FurnitureRegistry.getAll()) { output.accept( - com.tiedup.remake.v2.furniture.FurniturePlacerItem.createStack(def.id()) + com.tiedup.remake.v2.furniture.FurniturePlacerItem.createStack( + def.id() + ) ); } }) diff --git a/src/main/java/com/tiedup/remake/items/ModItems.java b/src/main/java/com/tiedup/remake/items/ModItems.java index 9fdc040..abb8a60 100644 --- a/src/main/java/com/tiedup/remake/items/ModItems.java +++ b/src/main/java/com/tiedup/remake/items/ModItems.java @@ -79,7 +79,6 @@ public class ModItems { /** * All mittens items (1 variant via MittensVariant enum) - * Phase 14.4: Blocks hand interactions when equipped */ public static final Map> MITTENS = registerAllMittens(); @@ -183,7 +182,6 @@ public class ModItems { ItemKey::new ); - // Phase 20: Lockpick for picking locks without keys public static final RegistryObject LOCKPICK = ITEMS.register( "lockpick", ItemLockpick::new diff --git a/src/main/java/com/tiedup/remake/items/base/BindVariant.java b/src/main/java/com/tiedup/remake/items/base/BindVariant.java index 12dee31..400b378 100644 --- a/src/main/java/com/tiedup/remake/items/base/BindVariant.java +++ b/src/main/java/com/tiedup/remake/items/base/BindVariant.java @@ -53,7 +53,9 @@ public enum BindVariant { * Delegates to {@link com.tiedup.remake.core.SettingsAccessor#getBindResistance(String)}. */ public int getResistance() { - return com.tiedup.remake.core.SettingsAccessor.getBindResistance(registryName); + return com.tiedup.remake.core.SettingsAccessor.getBindResistance( + registryName + ); } public PoseType getPoseType() { diff --git a/src/main/java/com/tiedup/remake/items/base/IHasResistance.java b/src/main/java/com/tiedup/remake/items/base/IHasResistance.java index 133eb86..7f26455 100644 --- a/src/main/java/com/tiedup/remake/items/base/IHasResistance.java +++ b/src/main/java/com/tiedup/remake/items/base/IHasResistance.java @@ -33,9 +33,7 @@ import net.minecraft.world.item.ItemStack; * @see SettingsAccessor */ public interface IHasResistance { - // ======================================== // NBT KEYS - // ======================================== /** NBT key for storing current resistance value (camelCase standard) */ String NBT_CURRENT_RESISTANCE = "currentResistance"; @@ -46,9 +44,7 @@ public interface IHasResistance { /** NBT key for storing whether item can be struggled out of */ String NBT_CAN_STRUGGLE = "canBeStruggledOut"; - // ======================================== // ABSTRACT METHODS (must implement) - // ======================================== /** * Get the item name/ID for resistance config lookup. @@ -74,9 +70,7 @@ public interface IHasResistance { */ void notifyStruggle(LivingEntity entity); - // ======================================== // DEFAULT METHODS (NBT handling) - // ======================================== /** * Get the base resistance from config via SettingsAccessor. diff --git a/src/main/java/com/tiedup/remake/items/base/ILockable.java b/src/main/java/com/tiedup/remake/items/base/ILockable.java index f089d86..f1b84e5 100644 --- a/src/main/java/com/tiedup/remake/items/base/ILockable.java +++ b/src/main/java/com/tiedup/remake/items/base/ILockable.java @@ -234,7 +234,9 @@ public interface ILockable { * @return Lock resistance value (default: 250, configurable) */ default int getLockResistance() { - return com.tiedup.remake.core.SettingsAccessor.getPadlockResistance(null); + return com.tiedup.remake.core.SettingsAccessor.getPadlockResistance( + null + ); } /** diff --git a/src/main/java/com/tiedup/remake/items/base/ItemBind.java b/src/main/java/com/tiedup/remake/items/base/ItemBind.java index 0df1f3a..5745ed8 100644 --- a/src/main/java/com/tiedup/remake/items/base/ItemBind.java +++ b/src/main/java/com/tiedup/remake/items/base/ItemBind.java @@ -1,17 +1,17 @@ package com.tiedup.remake.items.base; +import com.tiedup.remake.core.SettingsAccessor; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.network.ModNetwork; import com.tiedup.remake.network.action.PacketTying; import com.tiedup.remake.state.IBondageState; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.state.PlayerBindState; import com.tiedup.remake.tasks.TyingPlayerTask; import com.tiedup.remake.tasks.TyingTask; import com.tiedup.remake.util.KidnappedHelper; -import com.tiedup.remake.core.SettingsAccessor; import com.tiedup.remake.util.RestraintEffectUtils; import com.tiedup.remake.util.TiedUpSounds; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.List; import java.util.UUID; import net.minecraft.ChatFormatting; @@ -36,13 +36,10 @@ import org.jetbrains.annotations.Nullable; * These items restrain a player's movement and actions when equipped. * *

                Implements {@link IHasResistance} for the struggle/escape system. - *

                Implements {@link ILockable} for the padlock system (Phase 15). + *

                Implements {@link ILockable} for the padlock system. * * Based on original ItemBind from 1.12.2 * - * Phase 5: Movement speed reduction implemented - * Phase 7: Resistance system implemented via IHasResistance - * Phase 15: Added ILockable interface for padlock support */ public abstract class ItemBind extends Item @@ -68,12 +65,20 @@ public abstract class ItemBind private static final String MODE_FULL = BIND_MODE_FULL; private static final String MODE_ARMS = "arms"; private static final String MODE_LEGS = "legs"; - private static final String[] MODE_CYCLE = {MODE_FULL, MODE_ARMS, MODE_LEGS}; - private static final java.util.Map MODE_TRANSLATION_KEYS = java.util.Map.of( - MODE_FULL, "tiedup.bindmode.full", - MODE_ARMS, "tiedup.bindmode.arms", - MODE_LEGS, "tiedup.bindmode.legs" - ); + private static final String[] MODE_CYCLE = { + MODE_FULL, + MODE_ARMS, + MODE_LEGS, + }; + private static final java.util.Map MODE_TRANSLATION_KEYS = + java.util.Map.of( + MODE_FULL, + "tiedup.bindmode.full", + MODE_ARMS, + "tiedup.bindmode.arms", + MODE_LEGS, + "tiedup.bindmode.legs" + ); /** * Get the bind mode ID string from the stack's NBT. @@ -85,7 +90,11 @@ public abstract class ItemBind CompoundTag tag = stack.getTag(); if (tag == null || !tag.contains(NBT_BIND_MODE)) return MODE_FULL; String value = tag.getString(NBT_BIND_MODE); - if (MODE_FULL.equals(value) || MODE_ARMS.equals(value) || MODE_LEGS.equals(value)) { + if ( + MODE_FULL.equals(value) || + MODE_ARMS.equals(value) || + MODE_LEGS.equals(value) + ) { return value; } return MODE_FULL; @@ -135,7 +144,10 @@ public abstract class ItemBind * @return the i18n key for the mode */ public static String getBindModeTranslationKey(ItemStack stack) { - return MODE_TRANSLATION_KEYS.getOrDefault(getBindModeId(stack), "tiedup.bindmode.full"); + return MODE_TRANSLATION_KEYS.getOrDefault( + getBindModeId(stack), + "tiedup.bindmode.full" + ); } /** @@ -221,7 +233,6 @@ public abstract class ItemBind * Called when the bind is equipped on an entity. * Applies movement speed reduction only if legs are bound. * - * Phase 14.1.5: Refactored to support IBondageState (LivingEntity + NPCs) * Leg Binding: Speed reduction conditional on mode * Based on original ItemBind.onEquipped() (1.12.2) */ @@ -247,9 +258,13 @@ public abstract class ItemBind // still need the legacy RestraintEffectUtils speed modifier. PoseType poseType = getPoseType(); boolean fullImmobilization = - poseType == PoseType.WRAP || poseType == PoseType.LATEX_SACK; + poseType == PoseType.WRAP || + poseType == PoseType.LATEX_SACK; - RestraintEffectUtils.applyBindSpeedReduction(entity, fullImmobilization); + RestraintEffectUtils.applyBindSpeedReduction( + entity, + fullImmobilization + ); TiedUpMod.LOGGER.debug( "[ItemBind] Applied bind (mode={}, pose={}) to NPC {} - speed reduced (full={})", modeId, @@ -270,9 +285,7 @@ public abstract class ItemBind /** * Called when the bind is unequipped from an entity. * Restores normal movement speed for all entities. - * Phase 7: Resets resistance for next use. * - * Phase 14.1.5: Refactored to support IBondageState (LivingEntity + NPCs) * Based on original ItemBind.onUnequipped() (1.12.2) */ @Override @@ -285,23 +298,23 @@ public abstract class ItemBind RestraintEffectUtils.removeBindSpeedReduction(entity); } - // Phase 7: Reset resistance for next use (uses IHasResistance default method) IHasResistance.super.resetCurrentResistance(stack); TiedUpMod.LOGGER.debug( "[ItemBind] Removed bind from {} - speed {} resistance reset", entity.getName().getString(), - entity instanceof Player ? "delegated to MovementStyleManager," : "restored," + entity instanceof Player + ? "delegated to MovementStyleManager," + : "restored," ); } - // ========== Phase 6: Tying Interaction ========== + // ========== Tying Interaction ========== /** * Called when player right-clicks another entity with this bind item. * Starts or continues a tying task to tie up the target entity. * - * Phase 14.2: Unified to support IBondageState (Player + NPCs) * - Players: Uses tying task with progress bar * - NPCs: Instant bind (no tying mini-game) * @@ -325,14 +338,15 @@ public abstract class ItemBind return InteractionResult.SUCCESS; } - // Phase 14.2: Use KidnappedHelper to support both Players and NPCs IBondageState targetState = KidnappedHelper.getKidnappedState(target); if (targetState == null) { return InteractionResult.PASS; // Target cannot be restrained } // Get kidnapper state (player using the item) - IBondageState kidnapperState = KidnappedHelper.getKidnappedState(player); + IBondageState kidnapperState = KidnappedHelper.getKidnappedState( + player + ); if (kidnapperState == null) { return InteractionResult.FAIL; } @@ -345,7 +359,11 @@ public abstract class ItemBind // No bind in hand - can't swap, just pass return InteractionResult.PASS; } - ItemStack oldBind = targetState.replaceEquipment(BodyRegionV2.ARMS, stack.copy(), false); + ItemStack oldBind = targetState.replaceEquipment( + BodyRegionV2.ARMS, + stack.copy(), + false + ); if (!oldBind.isEmpty()) { stack.shrink(1); targetState.kidnappedDropItem(oldBind); @@ -359,7 +377,6 @@ public abstract class ItemBind return InteractionResult.PASS; } - // Phase 7 FIX: Can't tie others if you're tied yourself if (kidnapperState.isTiedUp()) { TiedUpMod.LOGGER.debug( "[ItemBind] {} tried to tie but is tied themselves", @@ -368,9 +385,7 @@ public abstract class ItemBind return InteractionResult.PASS; } - // ======================================== // SECURITY: Distance and line-of-sight validation (skip for self-tying) - // ======================================== boolean isSelfTying = player.equals(target); if (!isSelfTying) { double maxTieDistance = 4.0; // Max distance to tie (blocks) @@ -396,13 +411,11 @@ public abstract class ItemBind } } - // Phase 14.2.6: Unified tying for both Players and NPCs return handleTying(stack, player, target, targetState); } /** * Handle tying any target entity (Player or NPC). - * Phase 14.2.6: Unified tying system for all IBondageState entities. * * Uses progress-based system: * - update() marks the tick as active @@ -547,16 +560,17 @@ public abstract class ItemBind /** * Get the tying duration in seconds from GameRule. - * Phase 6: Reads from custom GameRule "tyingPlayerTime" * * @param player The player (for accessing world/GameRules) * @return Duration in seconds (default: 5) */ private int getTyingDuration(Player player) { - return SettingsAccessor.getTyingPlayerTime(player.level().getGameRules()); + return SettingsAccessor.getTyingPlayerTime( + player.level().getGameRules() + ); } - // ========== Phase 7: Resistance System (via IHasResistance) ========== + // ========== Resistance System (via IHasResistance) ========== /** * Get the item name for GameRule lookup. @@ -566,7 +580,7 @@ public abstract class ItemBind */ public abstract String getItemName(); - // ========== Phase 15: Pose System ========== + // ========== Pose System ========== /** * Get the pose type for this bind item. diff --git a/src/main/java/com/tiedup/remake/items/base/ItemBlindfold.java b/src/main/java/com/tiedup/remake/items/base/ItemBlindfold.java index 627f02b..f3d2371 100644 --- a/src/main/java/com/tiedup/remake/items/base/ItemBlindfold.java +++ b/src/main/java/com/tiedup/remake/items/base/ItemBlindfold.java @@ -1,8 +1,8 @@ package com.tiedup.remake.items.base; import com.tiedup.remake.core.SystemMessageManager; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.util.EquipmentInteractionHelper; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.List; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; @@ -21,8 +21,6 @@ import org.jetbrains.annotations.Nullable; * * Based on original ItemBlindfold from 1.12.2 * - * Phase 1: Basic implementation without rendering effects (added in Phase 5) - * Phase 8.5: Added interactLivingEntity for equipment on tied players */ public abstract class ItemBlindfold extends Item @@ -75,7 +73,8 @@ public abstract class ItemBlindfold target, state -> state.isBlindfolded(), (state, item) -> state.equip(BodyRegionV2.EYES, item), - (state, item) -> state.replaceEquipment(BodyRegionV2.EYES, item, false), + (state, item) -> + state.replaceEquipment(BodyRegionV2.EYES, item, false), (p, t) -> SystemMessageManager.sendToTarget( p, diff --git a/src/main/java/com/tiedup/remake/items/base/ItemCollar.java b/src/main/java/com/tiedup/remake/items/base/ItemCollar.java index 8505c67..d026488 100644 --- a/src/main/java/com/tiedup/remake/items/base/ItemCollar.java +++ b/src/main/java/com/tiedup/remake/items/base/ItemCollar.java @@ -1,14 +1,14 @@ package com.tiedup.remake.items.base; +import com.tiedup.remake.core.SettingsAccessor; import com.tiedup.remake.core.SystemMessageManager; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.network.sync.SyncManager; import com.tiedup.remake.state.CollarRegistry; import com.tiedup.remake.state.IBondageState; import com.tiedup.remake.util.KidnappedHelper; -import com.tiedup.remake.core.SettingsAccessor; import com.tiedup.remake.util.teleport.Position; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -34,10 +34,6 @@ import org.jetbrains.annotations.Nullable; * * Based on original ItemCollar from 1.12.2 * - * Phase 1: Basic implementation - * Phase 8: Add ownership system, locking, and resistance - * Phase 14: Add GPS/shock features for special collars - * Phase 14.1.6: Implements ILockable interface for lock safety * * Note: Collars have maxStackSize of 1 (unique items) */ @@ -63,7 +59,7 @@ public abstract class ItemCollar private static final String NBT_BONDAGE_SERVICE = "bondageservice"; private static final String NBT_SERVICE_SENTENCE = "servicesentence"; - // NBT Keys - Blacklist/Whitelist (Phase 14.4) + // NBT Keys - Blacklist/Whitelist private static final String NBT_BLACKLIST = "blacklist"; private static final String NBT_WHITELIST = "whitelist"; @@ -246,15 +242,10 @@ public abstract class ItemCollar return false; } - // ======================================== - // Phase 8.5: Interactive Equipment - // ======================================== - /** * Called when player right-clicks another entity with this collar. * Allows putting collar on tied-up entities (Players and NPCs) and adds the player as owner. * - * Phase 14.1.5: Refactored to support IBondageState (LivingEntity + NPCs) * Based on original ItemCollar.itemInteractionForEntity() * * @param stack The item stack @@ -286,7 +277,6 @@ public abstract class ItemCollar return InteractionResult.PASS; } - // Phase 8: Add player as owner if not already ItemStack newCollar = stack.copy(); if (!isOwner(newCollar, player)) { addOwner(newCollar, player); @@ -297,7 +287,6 @@ public abstract class ItemCollar targetState.equip(BodyRegionV2.NECK, newCollar); stack.shrink(1); - // Phase 17: Register in CollarRegistry registerCollarInRegistry(target, newCollar, player); // Send screen message to target @@ -359,12 +348,15 @@ public abstract class ItemCollar } // Old collar not locked - replace it - ItemStack replacedCollar = targetState.replaceEquipment(BodyRegionV2.NECK, newCollar, false); + ItemStack replacedCollar = targetState.replaceEquipment( + BodyRegionV2.NECK, + newCollar, + false + ); if (replacedCollar != null) { stack.shrink(1); targetState.kidnappedDropItem(replacedCollar); - // Phase 17: Update CollarRegistry (unregister old, register new) unregisterCollarFromRegistry(target); registerCollarInRegistry(target, newCollar, player); @@ -394,10 +386,6 @@ public abstract class ItemCollar return InteractionResult.PASS; } - // ======================================== - // Phase 8: Ownership System - // ======================================== - /** * Add an owner to this collar. * Owners are stored as UUID + name pairs in NBT. @@ -534,10 +522,6 @@ public abstract class ItemCollar return !getOwners(stack).isEmpty(); } - // ======================================== - // Phase 14.4: Blacklist/Whitelist System - // ======================================== - /** * Add a player to this collar's blacklist. * Blacklisted players will not be targeted when kidnapping mode is active. @@ -726,15 +710,10 @@ public abstract class ItemCollar return result; } - // ======================================== - // Phase 8: Locking System - // ======================================== - /** * Check if this collar is locked. * Locked collars cannot be removed normally. * - * Phase 14.1.6: Now part of ILockable interface * * @param stack The collar ItemStack * @return true if locked @@ -751,7 +730,6 @@ public abstract class ItemCollar /** * Set the locked state of this collar. * - * Phase 14.1.6: Changed return type from void to ItemStack (ILockable interface) * * @param stack The collar ItemStack * @param locked true to lock, false to unlock @@ -771,7 +749,6 @@ public abstract class ItemCollar * Check if this collar can be locked. * By default, all collars are lockable. * - * Phase 14.1.6: Added for ILockable interface * * @param stack The collar ItemStack * @return true if lockable (can accept a padlock) @@ -793,7 +770,6 @@ public abstract class ItemCollar /** * Set whether this collar can be locked (lockable state). * - * Phase 14.1.6: Added for ILockable interface * * @param stack The collar ItemStack * @param state true to make lockable, false to prevent locking @@ -812,7 +788,6 @@ public abstract class ItemCollar * Check if the padlock should be dropped when unlocking. * Collars have a built-in lock mechanism, so no padlock to drop. * - * Phase 20: Collars are inherently lockable, no external padlock needed. * * @return false (no padlock to drop for collars) */ @@ -821,7 +796,7 @@ public abstract class ItemCollar return false; } - // ========== Phase 20: Key-Lock System ========== + // ========== Key-Lock System ========== /** * Get the UUID of the key that locked this collar. @@ -859,14 +834,9 @@ public abstract class ItemCollar } } - // ======================================== - // Phase 8: Resistance System (like ItemBind Phase 7) - // ======================================== - /** * Get the base resistance for this collar from config. * - * Phase 14.1.5: Refactored to support LivingEntity * BUG-003 fix: Now reads from SettingsAccessor (config) instead of GameRules * * @param entity The entity (kept for API compatibility) @@ -880,7 +850,6 @@ public abstract class ItemCollar * Get the current resistance of this collar. * Returns base resistance if not yet set. * - * Phase 14.1.5: Refactored to support LivingEntity * * @param stack The collar ItemStack * @param entity The entity (for GameRules lookup) @@ -929,7 +898,6 @@ public abstract class ItemCollar /** * Reset the current resistance to base value. * - * Phase 14.1.5: Refactored to support LivingEntity * * @param stack The collar ItemStack * @param entity The entity (for GameRules lookup) @@ -972,9 +940,7 @@ public abstract class ItemCollar .putBoolean(NBT_CAN_BE_STRUGGLED_OUT, canStruggle); } - // ======================================== // Cell ID (Assigned Cell) - // ======================================== /** * Get the assigned cell ID from this collar. @@ -1025,9 +991,7 @@ public abstract class ItemCollar return getCellId(stack) != null; } - // ======================================== // Kidnapping Mode - // ======================================== /** * Check if kidnapping mode is enabled. @@ -1075,9 +1039,7 @@ public abstract class ItemCollar return hasCellAssigned(stack); } - // ======================================== // Tie to Pole (Auto-tie slave in cell) - // ======================================== /** * Check if slave should be auto-tied to nearest pole in prison. @@ -1108,9 +1070,7 @@ public abstract class ItemCollar stack.getOrCreateTag().putBoolean(NBT_TIE_TO_POLE, enabled); } - // ======================================== // Warn Masters - // ======================================== /** * Check if owners should be warned when slave is captured. @@ -1145,9 +1105,7 @@ public abstract class ItemCollar stack.getOrCreateTag().putBoolean(NBT_WARN_MASTERS, enabled); } - // ======================================== // Bondage Service - // ======================================== /** * Check if bondage service is enabled on this collar. @@ -1216,10 +1174,6 @@ public abstract class ItemCollar } } - // ======================================== - // Phase 17: CollarRegistry Integration - // ======================================== - /** * Register a collar in the global CollarRegistry. * Called when a collar is put on an entity. @@ -1310,9 +1264,7 @@ public abstract class ItemCollar ); } - // ======================================== // ESCAPE DETECTION: Collar Removal Alert - // ======================================== /** * Alert nearby kidnappers when a collar is forcibly removed. @@ -1418,9 +1370,7 @@ public abstract class ItemCollar } } - // ======================================== // LIFECYCLE HOOKS - // ======================================== /** * Called when a collar is unequipped from an entity. @@ -1444,9 +1394,7 @@ public abstract class ItemCollar onCollarRemoved(entity, true); } - // ======================================== // TEXTURE SUBFOLDER - // ======================================== /** * Get the texture subfolder for collar items. diff --git a/src/main/java/com/tiedup/remake/items/base/ItemEarplugs.java b/src/main/java/com/tiedup/remake/items/base/ItemEarplugs.java index caf68b5..9e7ef97 100644 --- a/src/main/java/com/tiedup/remake/items/base/ItemEarplugs.java +++ b/src/main/java/com/tiedup/remake/items/base/ItemEarplugs.java @@ -1,9 +1,9 @@ package com.tiedup.remake.items.base; import com.tiedup.remake.core.SystemMessageManager; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.util.EquipmentInteractionHelper; import com.tiedup.remake.util.TiedUpSounds; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.List; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; @@ -22,7 +22,6 @@ import org.jetbrains.annotations.Nullable; * * Based on original ItemEarplugs from 1.12.2 * - * Phase 8.5: Basic implementation + equipment mechanics * Phase future: Sound blocking effect */ public abstract class ItemEarplugs @@ -67,7 +66,8 @@ public abstract class ItemEarplugs target, state -> state.hasEarplugs(), (state, item) -> state.equip(BodyRegionV2.EARS, item), - (state, item) -> state.replaceEquipment(BodyRegionV2.EARS, item, false), + (state, item) -> + state.replaceEquipment(BodyRegionV2.EARS, item, false), (p, t) -> SystemMessageManager.sendToTarget( p, diff --git a/src/main/java/com/tiedup/remake/items/base/ItemGag.java b/src/main/java/com/tiedup/remake/items/base/ItemGag.java index b42e485..a7eee05 100644 --- a/src/main/java/com/tiedup/remake/items/base/ItemGag.java +++ b/src/main/java/com/tiedup/remake/items/base/ItemGag.java @@ -1,9 +1,9 @@ package com.tiedup.remake.items.base; import com.tiedup.remake.core.SystemMessageManager; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.util.EquipmentInteractionHelper; import com.tiedup.remake.util.GagMaterial; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.List; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; @@ -23,9 +23,6 @@ import org.jetbrains.annotations.Nullable; * * Based on original ItemGag from 1.12.2 * - * Phase 1: Basic implementation without gag talk or adjustment (added later) - * Phase 8.5: Added interactLivingEntity for equipment on tied players - * Phase 12: Added GagTalk material system */ public abstract class ItemGag extends Item @@ -85,7 +82,8 @@ public abstract class ItemGag target, state -> state.isGagged(), (state, item) -> state.equip(BodyRegionV2.MOUTH, item), - (state, item) -> state.replaceEquipment(BodyRegionV2.MOUTH, item, false), + (state, item) -> + state.replaceEquipment(BodyRegionV2.MOUTH, item, false), SystemMessageManager::sendGagged, "ItemGag" ); diff --git a/src/main/java/com/tiedup/remake/items/base/ItemMittens.java b/src/main/java/com/tiedup/remake/items/base/ItemMittens.java index 995f579..7616782 100644 --- a/src/main/java/com/tiedup/remake/items/base/ItemMittens.java +++ b/src/main/java/com/tiedup/remake/items/base/ItemMittens.java @@ -1,8 +1,8 @@ package com.tiedup.remake.items.base; import com.tiedup.remake.core.SystemMessageManager; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.util.EquipmentInteractionHelper; +import com.tiedup.remake.v2.BodyRegionV2; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.LivingEntity; @@ -14,7 +14,6 @@ import net.minecraft.world.item.ItemStack; * Base class for mittens items. * These items block hand interactions (mining, placing, using items) when equipped. * - * Phase 14.4: Mittens system * * Restrictions when wearing mittens: * - Cannot mine/break blocks @@ -57,7 +56,8 @@ public abstract class ItemMittens target, state -> state.hasMittens(), (state, item) -> state.equip(BodyRegionV2.HANDS, item), - (state, item) -> state.replaceEquipment(BodyRegionV2.HANDS, item, false), + (state, item) -> + state.replaceEquipment(BodyRegionV2.HANDS, item, false), (p, t) -> SystemMessageManager.sendToTarget( p, diff --git a/src/main/java/com/tiedup/remake/items/base/ItemOwnerTarget.java b/src/main/java/com/tiedup/remake/items/base/ItemOwnerTarget.java index 052650c..2c4be8e 100644 --- a/src/main/java/com/tiedup/remake/items/base/ItemOwnerTarget.java +++ b/src/main/java/com/tiedup/remake/items/base/ItemOwnerTarget.java @@ -144,24 +144,32 @@ public abstract class ItemOwnerTarget extends Item { /** * Check if a player instance matches the item's current target. */ - // ===================================================== // TOOLTIP HELPERS - // ===================================================== /** * Appends the "Owner: ..." or "Unclaimed (...)" tooltip line. * @param unclaimedHint text shown when unclaimed (e.g. "Right-click a player") */ - protected void appendOwnerTooltip(ItemStack stack, List tooltip, String unclaimedHint) { + protected void appendOwnerTooltip( + ItemStack stack, + List tooltip, + String unclaimedHint + ) { if (hasOwner(stack)) { tooltip.add( Component.literal("Owner: ") .withStyle(ChatFormatting.GOLD) - .append(Component.literal(getOwnerName(stack)).withStyle(ChatFormatting.WHITE)) + .append( + Component.literal(getOwnerName(stack)).withStyle( + ChatFormatting.WHITE + ) + ) ); } else { tooltip.add( - Component.literal("Unclaimed (" + unclaimedHint + ")").withStyle(ChatFormatting.GRAY) + Component.literal( + "Unclaimed (" + unclaimedHint + ")" + ).withStyle(ChatFormatting.GRAY) ); } } @@ -171,16 +179,30 @@ public abstract class ItemOwnerTarget extends Item { * the collar nickname if available. * @return display name, possibly "Nickname (RealName)" if collar has a nickname */ - protected String resolveTargetDisplayName(ItemStack stack, @Nullable Level level) { + protected String resolveTargetDisplayName( + ItemStack stack, + @Nullable Level level + ) { String displayName = getTargetName(stack); if (level != null && hasTarget(stack)) { Player target = level.getPlayerByUUID(getTargetId(stack)); if (target != null) { - IBondageState targetState = KidnappedHelper.getKidnappedState(target); + IBondageState targetState = KidnappedHelper.getKidnappedState( + target + ); if (targetState != null && targetState.hasCollar()) { - ItemStack collar = targetState.getEquipment(BodyRegionV2.NECK); - if (collar.getItem() instanceof ItemCollar collarItem && collarItem.hasNickname(collar)) { - displayName = collarItem.getNickname(collar) + " (" + displayName + ")"; + ItemStack collar = targetState.getEquipment( + BodyRegionV2.NECK + ); + if ( + collar.getItem() instanceof ItemCollar collarItem && + collarItem.hasNickname(collar) + ) { + displayName = + collarItem.getNickname(collar) + + " (" + + displayName + + ")"; } } } diff --git a/src/main/java/com/tiedup/remake/items/base/MittensVariant.java b/src/main/java/com/tiedup/remake/items/base/MittensVariant.java index 1918265..686d286 100644 --- a/src/main/java/com/tiedup/remake/items/base/MittensVariant.java +++ b/src/main/java/com/tiedup/remake/items/base/MittensVariant.java @@ -4,7 +4,7 @@ package com.tiedup.remake.items.base; * Enum defining all mittens variants. * Used by GenericMittens to create mittens items via factory pattern. * - *

                Phase 14.4: Mittens system - blocks hand interactions when equipped. + *

                Mittens system - blocks hand interactions when equipped. * *

                Issue #12 fix: Added textureSubfolder to eliminate string checks in renderers. */ diff --git a/src/main/java/com/tiedup/remake/items/base/PoseType.java b/src/main/java/com/tiedup/remake/items/base/PoseType.java index fa76ad3..fb9003a 100644 --- a/src/main/java/com/tiedup/remake/items/base/PoseType.java +++ b/src/main/java/com/tiedup/remake/items/base/PoseType.java @@ -5,7 +5,6 @@ package com.tiedup.remake.items.base; * Each pose type has a corresponding animation file for players * and pose method in BondagePoseHelper for NPCs. * - * Phase 15: Pose system for different bind types */ public enum PoseType { /** Standard tied pose - arms behind back, legs frozen */ diff --git a/src/main/java/com/tiedup/remake/items/clothes/GenericClothes.java b/src/main/java/com/tiedup/remake/items/clothes/GenericClothes.java index 8410c02..706083a 100644 --- a/src/main/java/com/tiedup/remake/items/clothes/GenericClothes.java +++ b/src/main/java/com/tiedup/remake/items/clothes/GenericClothes.java @@ -138,7 +138,9 @@ public class GenericClothes extends Item implements ILockable, IV2BondageItem { else { ItemStack clothesCopy = stack.copyWithCount(1); ItemStack oldClothes = targetState.replaceEquipment( - BodyRegionV2.TORSO, clothesCopy, false + BodyRegionV2.TORSO, + clothesCopy, + false ); if (!oldClothes.isEmpty()) { stack.shrink(1); diff --git a/src/main/java/com/tiedup/remake/labor/LaborTask.java b/src/main/java/com/tiedup/remake/labor/LaborTask.java index e78d5b4..3e43547 100644 --- a/src/main/java/com/tiedup/remake/labor/LaborTask.java +++ b/src/main/java/com/tiedup/remake/labor/LaborTask.java @@ -3,7 +3,6 @@ package com.tiedup.remake.labor; import java.util.ArrayList; import java.util.List; import java.util.UUID; -import org.jetbrains.annotations.Nullable; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; @@ -12,6 +11,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.Nullable; /** * Unified "Bring X Items" labor task. diff --git a/src/main/java/com/tiedup/remake/labor/LaborTaskGenerator.java b/src/main/java/com/tiedup/remake/labor/LaborTaskGenerator.java index 7d8f16c..c9f864f 100644 --- a/src/main/java/com/tiedup/remake/labor/LaborTaskGenerator.java +++ b/src/main/java/com/tiedup/remake/labor/LaborTaskGenerator.java @@ -2,12 +2,12 @@ package com.tiedup.remake.labor; import java.util.List; import java.util.Map; -import org.jetbrains.annotations.Nullable; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.RandomSource; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; +import org.jetbrains.annotations.Nullable; /** * Generator for random labor tasks. diff --git a/src/main/java/com/tiedup/remake/minigame/LockpickMiniGameState.java b/src/main/java/com/tiedup/remake/minigame/LockpickMiniGameState.java index 630eb06..782cac7 100644 --- a/src/main/java/com/tiedup/remake/minigame/LockpickMiniGameState.java +++ b/src/main/java/com/tiedup/remake/minigame/LockpickMiniGameState.java @@ -4,7 +4,6 @@ import java.util.Random; import java.util.UUID; /** - * Phase 2: Server-side state for a Lockpick mini-game session. * * Tracks: * - Session UUID (anti-cheat) diff --git a/src/main/java/com/tiedup/remake/minigame/MiniGameSessionManager.java b/src/main/java/com/tiedup/remake/minigame/MiniGameSessionManager.java index fc8a4f7..763085c 100644 --- a/src/main/java/com/tiedup/remake/minigame/MiniGameSessionManager.java +++ b/src/main/java/com/tiedup/remake/minigame/MiniGameSessionManager.java @@ -41,7 +41,9 @@ public class MiniGameSessionManager { * Get count of active sessions across both sub-managers (for debugging). */ public int getActiveSessionCount() { - return LockpickSessionManager.getInstance().getActiveSessionCount() - + StruggleSessionManager.getInstance().getActiveSessionCount(); + return ( + LockpickSessionManager.getInstance().getActiveSessionCount() + + StruggleSessionManager.getInstance().getActiveSessionCount() + ); } } diff --git a/src/main/java/com/tiedup/remake/minigame/StruggleSessionManager.java b/src/main/java/com/tiedup/remake/minigame/StruggleSessionManager.java index 5439932..c628c41 100644 --- a/src/main/java/com/tiedup/remake/minigame/StruggleSessionManager.java +++ b/src/main/java/com/tiedup/remake/minigame/StruggleSessionManager.java @@ -4,14 +4,14 @@ import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.items.ItemShockCollar; import com.tiedup.remake.items.base.ItemBind; import com.tiedup.remake.items.base.ItemCollar; -import com.tiedup.remake.v2.BodyRegionV2; -import com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper; import com.tiedup.remake.minigame.ContinuousStruggleMiniGameState.TickResult; import com.tiedup.remake.minigame.ContinuousStruggleMiniGameState.UpdateType; import com.tiedup.remake.network.ModNetwork; import com.tiedup.remake.network.minigame.PacketContinuousStruggleState; import com.tiedup.remake.network.sync.SyncManager; import com.tiedup.remake.state.PlayerBindState; +import com.tiedup.remake.v2.BodyRegionV2; +import com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -52,13 +52,13 @@ public class StruggleSessionManager { * Index: 0=ARMS, 1=MOUTH, 2=EYES, 3=EARS, 4=NECK, 5=TORSO, 6=HANDS. */ private static final BodyRegionV2[] SLOT_TO_REGION = { - BodyRegionV2.ARMS, // 0 = BIND - BodyRegionV2.MOUTH, // 1 = GAG - BodyRegionV2.EYES, // 2 = BLINDFOLD - BodyRegionV2.EARS, // 3 = EARPLUGS - BodyRegionV2.NECK, // 4 = COLLAR - BodyRegionV2.TORSO, // 5 = CLOTHES - BodyRegionV2.HANDS, // 6 = MITTENS + BodyRegionV2.ARMS, // 0 = BIND + BodyRegionV2.MOUTH, // 1 = GAG + BodyRegionV2.EYES, // 2 = BLINDFOLD + BodyRegionV2.EARS, // 3 = EARPLUGS + BodyRegionV2.NECK, // 4 = COLLAR + BodyRegionV2.TORSO, // 5 = CLOTHES + BodyRegionV2.HANDS, // 6 = MITTENS }; private StruggleSessionManager() {} @@ -277,7 +277,9 @@ public class StruggleSessionManager { UUID playerId = player.getUUID(); // Reject if an active session already exists - ContinuousStruggleMiniGameState existing = continuousSessions.get(playerId); + ContinuousStruggleMiniGameState existing = continuousSessions.get( + playerId + ); if (existing != null) { TiedUpMod.LOGGER.debug( "[StruggleSessionManager] Rejected furniture session: active session already exists for {}", @@ -319,13 +321,30 @@ public class StruggleSessionManager { // Play struggle loop sound from furniture definition (plays once on start; // true looping sound would require client-side sound management -- future scope) - net.minecraft.world.entity.Entity furnitureEntity = player.level().getEntity(furnitureEntityId); - if (furnitureEntity instanceof com.tiedup.remake.v2.furniture.EntityFurniture furniture) { - com.tiedup.remake.v2.furniture.FurnitureDefinition def = furniture.getDefinition(); + net.minecraft.world.entity.Entity furnitureEntity = player + .level() + .getEntity(furnitureEntityId); + if ( + furnitureEntity instanceof + com.tiedup.remake.v2.furniture.EntityFurniture furniture + ) { + com.tiedup.remake.v2.furniture.FurnitureDefinition def = + furniture.getDefinition(); if (def != null && def.feedback().struggleLoopSound() != null) { - player.level().playSound(null, player.getX(), player.getY(), player.getZ(), - net.minecraft.sounds.SoundEvent.createVariableRangeEvent(def.feedback().struggleLoopSound()), - SoundSource.PLAYERS, 0.6f, 1.0f); + player + .level() + .playSound( + null, + player.getX(), + player.getY(), + player.getZ(), + net.minecraft.sounds.SoundEvent.createVariableRangeEvent( + def.feedback().struggleLoopSound() + ), + SoundSource.PLAYERS, + 0.6f, + 1.0f + ); } } @@ -481,7 +500,9 @@ public class StruggleSessionManager { // Check kidnapper notification if (session.shouldNotifyKidnappers(currentTick)) { - GuardNotificationHelper.notifyNearbyKidnappersOfStruggle(player); + GuardNotificationHelper.notifyNearbyKidnappersOfStruggle( + player + ); } // Play struggle sound periodically @@ -516,7 +537,10 @@ public class StruggleSessionManager { * Check if shock collar check is applicable for this player. */ private boolean shouldCheckShockCollar(ServerPlayer player) { - ItemStack collar = V2EquipmentHelper.getInRegion(player, BodyRegionV2.NECK); + ItemStack collar = V2EquipmentHelper.getInRegion( + player, + BodyRegionV2.NECK + ); if (collar.isEmpty()) return false; // Only shock collars can trigger during struggle @@ -562,8 +586,10 @@ public class StruggleSessionManager { com.tiedup.remake.v2.BodyRegionV2 region = session.getTargetRegion(); ItemStack stack = - com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper - .getInRegion(player, region); + com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper.getInRegion( + player, + region + ); if (stack.isEmpty()) return; if ( @@ -584,10 +610,17 @@ public class StruggleSessionManager { if (session.isAccessoryStruggle()) { // Handle accessory resistance update (V1 path -- slot index is legacy ordinal) Integer slotIndex = session.getTargetSlot(); - if (slotIndex == null || slotIndex < 0 || slotIndex >= SLOT_TO_REGION.length) return; + if ( + slotIndex == null || + slotIndex < 0 || + slotIndex >= SLOT_TO_REGION.length + ) return; BodyRegionV2 region = SLOT_TO_REGION[slotIndex]; - ItemStack accessoryStack = V2EquipmentHelper.getInRegion(player, region); + ItemStack accessoryStack = V2EquipmentHelper.getInRegion( + player, + region + ); if (accessoryStack.isEmpty()) return; if ( @@ -606,7 +639,10 @@ public class StruggleSessionManager { } // Update bind resistance - ItemStack bindStack = V2EquipmentHelper.getInRegion(player, BodyRegionV2.ARMS); + ItemStack bindStack = V2EquipmentHelper.getInRegion( + player, + BodyRegionV2.ARMS + ); if ( bindStack.isEmpty() || !(bindStack.getItem() instanceof ItemBind bind) @@ -648,15 +684,23 @@ public class StruggleSessionManager { session.getTargetRegion(); // BUG-001 fix: break lock before unequip (consistent with V1 accessory escape) ItemStack stackInRegion = - com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper - .getInRegion(player, region); - if (!stackInRegion.isEmpty() - && stackInRegion.getItem() instanceof com.tiedup.remake.items.base.ILockable lockable) { + com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper.getInRegion( + player, + region + ); + if ( + !stackInRegion.isEmpty() && + stackInRegion.getItem() instanceof + com.tiedup.remake.items.base.ILockable lockable + ) { lockable.breakLock(stackInRegion); } ItemStack removed = - com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper - .unequipFromRegion(player, region, true); + com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper.unequipFromRegion( + player, + region, + true + ); if (!removed.isEmpty()) { if (!player.getInventory().add(removed)) { player.drop(removed, false); @@ -678,9 +722,16 @@ public class StruggleSessionManager { } else { // Handle accessory escape (V1 path -- slot index is legacy ordinal) Integer slotIndex = session.getTargetSlot(); - if (slotIndex != null && slotIndex >= 0 && slotIndex < SLOT_TO_REGION.length) { + if ( + slotIndex != null && + slotIndex >= 0 && + slotIndex < SLOT_TO_REGION.length + ) { BodyRegionV2 region = SLOT_TO_REGION[slotIndex]; - ItemStack accessoryStack = V2EquipmentHelper.getInRegion(player, region); + ItemStack accessoryStack = V2EquipmentHelper.getInRegion( + player, + region + ); if (!accessoryStack.isEmpty()) { // Break the lock on the accessory if ( @@ -691,7 +742,9 @@ public class StruggleSessionManager { } // Remove the accessory from the region and drop it ItemStack removed = V2EquipmentHelper.unequipFromRegion( - player, region, true + player, + region, + true ); if (!removed.isEmpty()) { // Drop the item at player's feet @@ -716,7 +769,9 @@ public class StruggleSessionManager { int furnitureEntityId = session.getFurnitureEntityId(); String seatId = session.getFurnitureSeatId(); - net.minecraft.world.entity.Entity entity = player.level().getEntity(furnitureEntityId); + net.minecraft.world.entity.Entity entity = player + .level() + .getEntity(furnitureEntityId); if (entity == null || entity.isRemoved()) { TiedUpMod.LOGGER.warn( "[StruggleSessionManager] Furniture entity {} no longer exists for escape", @@ -727,7 +782,10 @@ public class StruggleSessionManager { return; } - if (!(entity instanceof com.tiedup.remake.v2.furniture.ISeatProvider provider)) { + if ( + !(entity instanceof + com.tiedup.remake.v2.furniture.ISeatProvider provider) + ) { TiedUpMod.LOGGER.warn( "[StruggleSessionManager] Entity {} is not an ISeatProvider", furnitureEntityId @@ -740,38 +798,57 @@ public class StruggleSessionManager { provider.setSeatLocked(seatId, false); // Clear persistent data tag (reconnection system) - net.minecraft.nbt.CompoundTag persistentData = player.getPersistentData(); + net.minecraft.nbt.CompoundTag persistentData = + player.getPersistentData(); persistentData.remove("tiedup_locked_furniture"); // Dismount the player player.stopRiding(); // Play escape sound: prefer furniture-specific sound, fall back to CHAIN_BREAK - net.minecraft.sounds.SoundEvent escapeSound = net.minecraft.sounds.SoundEvents.CHAIN_BREAK; - if (entity instanceof com.tiedup.remake.v2.furniture.EntityFurniture furniture) { - com.tiedup.remake.v2.furniture.FurnitureDefinition def = furniture.getDefinition(); + net.minecraft.sounds.SoundEvent escapeSound = + net.minecraft.sounds.SoundEvents.CHAIN_BREAK; + if ( + entity instanceof + com.tiedup.remake.v2.furniture.EntityFurniture furniture + ) { + com.tiedup.remake.v2.furniture.FurnitureDefinition def = + furniture.getDefinition(); if (def != null && def.feedback().escapeSound() != null) { - escapeSound = net.minecraft.sounds.SoundEvent.createVariableRangeEvent( - def.feedback().escapeSound() - ); + escapeSound = + net.minecraft.sounds.SoundEvent.createVariableRangeEvent( + def.feedback().escapeSound() + ); } } - player.serverLevel().playSound( - null, - player.getX(), player.getY(), player.getZ(), - escapeSound, - net.minecraft.sounds.SoundSource.PLAYERS, - 1.0f, 1.0f - ); + player + .serverLevel() + .playSound( + null, + player.getX(), + player.getY(), + player.getZ(), + escapeSound, + net.minecraft.sounds.SoundSource.PLAYERS, + 1.0f, + 1.0f + ); // Broadcast updated furniture state to all tracking clients - if (entity instanceof com.tiedup.remake.v2.furniture.EntityFurniture furniture) { - com.tiedup.remake.v2.furniture.network.PacketSyncFurnitureState.sendToTracking(furniture); + if ( + entity instanceof + com.tiedup.remake.v2.furniture.EntityFurniture furniture + ) { + com.tiedup.remake.v2.furniture.network.PacketSyncFurnitureState.sendToTracking( + furniture + ); } TiedUpMod.LOGGER.info( "[StruggleSessionManager] {} escaped furniture {} seat '{}'", - player.getName().getString(), furnitureEntityId, seatId + player.getName().getString(), + furnitureEntityId, + seatId ); } diff --git a/src/main/java/com/tiedup/remake/mixin/MixinLivingEntityBodyRot.java b/src/main/java/com/tiedup/remake/mixin/MixinLivingEntityBodyRot.java index bb419e6..5eca9ff 100644 --- a/src/main/java/com/tiedup/remake/mixin/MixinLivingEntityBodyRot.java +++ b/src/main/java/com/tiedup/remake/mixin/MixinLivingEntityBodyRot.java @@ -1,8 +1,8 @@ package com.tiedup.remake.mixin; import com.tiedup.remake.state.HumanChairHelper; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.state.PlayerBindState; +import com.tiedup.remake.v2.BodyRegionV2; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/com/tiedup/remake/mixin/MixinMCAMessenger.java b/src/main/java/com/tiedup/remake/mixin/MixinMCAMessenger.java index 79ff7c7..318905c 100644 --- a/src/main/java/com/tiedup/remake/mixin/MixinMCAMessenger.java +++ b/src/main/java/com/tiedup/remake/mixin/MixinMCAMessenger.java @@ -1,10 +1,10 @@ package com.tiedup.remake.mixin; import com.tiedup.remake.compat.mca.MCACompat; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.dialogue.GagTalkManager; import com.tiedup.remake.state.IBondageState; +import com.tiedup.remake.v2.BodyRegionV2; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.entity.LivingEntity; diff --git a/src/main/java/com/tiedup/remake/mixin/MixinMCAOpenAIChatAI.java b/src/main/java/com/tiedup/remake/mixin/MixinMCAOpenAIChatAI.java index 16c5eb3..c705f71 100644 --- a/src/main/java/com/tiedup/remake/mixin/MixinMCAOpenAIChatAI.java +++ b/src/main/java/com/tiedup/remake/mixin/MixinMCAOpenAIChatAI.java @@ -1,11 +1,11 @@ package com.tiedup.remake.mixin; import com.tiedup.remake.compat.mca.MCACompat; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.compat.mca.ai.chatai.TiedUpModule; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.dialogue.GagTalkManager; import com.tiedup.remake.state.IBondageState; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.List; import java.util.Optional; import net.minecraft.world.entity.LivingEntity; diff --git a/src/main/java/com/tiedup/remake/mixin/MixinMCAVillagerInteraction.java b/src/main/java/com/tiedup/remake/mixin/MixinMCAVillagerInteraction.java index cc76847..b25ef92 100644 --- a/src/main/java/com/tiedup/remake/mixin/MixinMCAVillagerInteraction.java +++ b/src/main/java/com/tiedup/remake/mixin/MixinMCAVillagerInteraction.java @@ -1,13 +1,13 @@ package com.tiedup.remake.mixin; import com.tiedup.remake.compat.mca.MCACompat; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.items.ItemKey; import com.tiedup.remake.items.ItemMasterKey; -import com.tiedup.remake.v2.bondage.IV2BondageItem; import com.tiedup.remake.items.base.ItemCollar; import com.tiedup.remake.state.IBondageState; +import com.tiedup.remake.v2.BodyRegionV2; +import com.tiedup.remake.v2.bondage.IV2BondageItem; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.Mob; diff --git a/src/main/java/com/tiedup/remake/mixin/MixinMCAVillagerLeash.java b/src/main/java/com/tiedup/remake/mixin/MixinMCAVillagerLeash.java index 79d3b7a..a6d11d6 100644 --- a/src/main/java/com/tiedup/remake/mixin/MixinMCAVillagerLeash.java +++ b/src/main/java/com/tiedup/remake/mixin/MixinMCAVillagerLeash.java @@ -1,9 +1,9 @@ package com.tiedup.remake.mixin; import com.tiedup.remake.compat.mca.MCACompat; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.items.base.ItemCollar; import com.tiedup.remake.state.IBondageState; +import com.tiedup.remake.v2.BodyRegionV2; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.player.Player; diff --git a/src/main/java/com/tiedup/remake/mixin/client/MixinCamera.java b/src/main/java/com/tiedup/remake/mixin/client/MixinCamera.java index ee030c2..c7a94a9 100644 --- a/src/main/java/com/tiedup/remake/mixin/client/MixinCamera.java +++ b/src/main/java/com/tiedup/remake/mixin/client/MixinCamera.java @@ -1,10 +1,10 @@ package com.tiedup.remake.mixin.client; import com.tiedup.remake.items.base.ItemBind; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.items.base.PoseType; import com.tiedup.remake.state.HumanChairHelper; import com.tiedup.remake.state.PlayerBindState; +import com.tiedup.remake.v2.BodyRegionV2; import net.minecraft.client.Camera; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; diff --git a/src/main/java/com/tiedup/remake/mixin/client/MixinPlayerModel.java b/src/main/java/com/tiedup/remake/mixin/client/MixinPlayerModel.java index 9c6e79c..9e3153a 100644 --- a/src/main/java/com/tiedup/remake/mixin/client/MixinPlayerModel.java +++ b/src/main/java/com/tiedup/remake/mixin/client/MixinPlayerModel.java @@ -1,11 +1,11 @@ package com.tiedup.remake.mixin.client; import com.tiedup.remake.client.animation.render.DogPoseRenderHandler; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.client.animation.util.DogPoseHelper; import com.tiedup.remake.items.base.ItemBind; import com.tiedup.remake.items.base.PoseType; import com.tiedup.remake.state.PlayerBindState; +import com.tiedup.remake.v2.BodyRegionV2; import net.minecraft.client.model.PlayerModel; import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.world.entity.LivingEntity; diff --git a/src/main/java/com/tiedup/remake/mixin/client/MixinVillagerEntityBaseModelMCA.java b/src/main/java/com/tiedup/remake/mixin/client/MixinVillagerEntityBaseModelMCA.java index 8842535..044abe1 100644 --- a/src/main/java/com/tiedup/remake/mixin/client/MixinVillagerEntityBaseModelMCA.java +++ b/src/main/java/com/tiedup/remake/mixin/client/MixinVillagerEntityBaseModelMCA.java @@ -6,9 +6,9 @@ import com.tiedup.remake.client.animation.util.AnimationIdBuilder; import com.tiedup.remake.compat.mca.MCACompat; import com.tiedup.remake.items.base.ItemBind; import com.tiedup.remake.items.base.PoseType; +import com.tiedup.remake.state.IBondageState; import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper; -import com.tiedup.remake.state.IBondageState; import dev.kosmx.playerAnim.impl.IAnimatedPlayer; import dev.kosmx.playerAnim.impl.animation.AnimationApplier; import java.util.UUID; @@ -85,8 +85,14 @@ public class MixinVillagerEntityBaseModelMCA { } // Derive bound state from V2 regions, fallback to V1 bind mode NBT - boolean armsBound = V2EquipmentHelper.isRegionOccupied(villager, BodyRegionV2.ARMS); - boolean legsBound = V2EquipmentHelper.isRegionOccupied(villager, BodyRegionV2.LEGS); + boolean armsBound = V2EquipmentHelper.isRegionOccupied( + villager, + BodyRegionV2.ARMS + ); + boolean legsBound = V2EquipmentHelper.isRegionOccupied( + villager, + BodyRegionV2.LEGS + ); if (!armsBound && !legsBound && bind.getItem() instanceof ItemBind) { armsBound = ItemBind.hasArmsBound(bind); @@ -186,7 +192,12 @@ public class MixinVillagerEntityBaseModelMCA { } } else { // Fallback: entity doesn't support PlayerAnimator, use static poses - StaticPoseApplier.applyStaticPose(model, poseType, armsBound, legsBound); + StaticPoseApplier.applyStaticPose( + model, + poseType, + armsBound, + legsBound + ); } // Hide arms for WRAP/LATEX_SACK poses (like DamselModel does) diff --git a/src/main/java/com/tiedup/remake/mixin/client/MixinVillagerEntityMCAAnimated.java b/src/main/java/com/tiedup/remake/mixin/client/MixinVillagerEntityMCAAnimated.java index c9f92ba..ab78c6e 100644 --- a/src/main/java/com/tiedup/remake/mixin/client/MixinVillagerEntityMCAAnimated.java +++ b/src/main/java/com/tiedup/remake/mixin/client/MixinVillagerEntityMCAAnimated.java @@ -86,9 +86,7 @@ public abstract class MixinVillagerEntityMCAAnimated } } - // ======================================== // IAnimatedPlayer Implementation - // ======================================== @Override public AnimationStack getAnimationStack() { diff --git a/src/main/java/com/tiedup/remake/network/ModNetwork.java b/src/main/java/com/tiedup/remake/network/ModNetwork.java index 4a38bc8..f6fddfa 100644 --- a/src/main/java/com/tiedup/remake/network/ModNetwork.java +++ b/src/main/java/com/tiedup/remake/network/ModNetwork.java @@ -111,111 +111,486 @@ public class ModNetwork { */ public static void register() { // Sync (S2C) - reg(PacketSyncBindState.class, PacketSyncBindState::encode, PacketSyncBindState::decode, PacketSyncBindState::handle); - reg(PacketSyncStruggleState.class, PacketSyncStruggleState::encode, PacketSyncStruggleState::decode, PacketSyncStruggleState::handle); - reg(PacketSyncEnslavement.class, PacketSyncEnslavement::encode, PacketSyncEnslavement::decode, PacketSyncEnslavement::handle); - reg(PacketSyncLeashProxy.class, PacketSyncLeashProxy::encode, PacketSyncLeashProxy::decode, PacketSyncLeashProxy::handle); - reg(PacketSyncCollarRegistry.class, PacketSyncCollarRegistry::encode, PacketSyncCollarRegistry::decode, PacketSyncCollarRegistry::handle); - reg(PacketSyncClothesConfig.class, PacketSyncClothesConfig::encode, PacketSyncClothesConfig::decode, PacketSyncClothesConfig::handle); - reg(PacketSyncPetBedState.class, PacketSyncPetBedState::encode, PacketSyncPetBedState::decode, PacketSyncPetBedState::handle); - reg(PacketSyncCellData.class, PacketSyncCellData::encode, PacketSyncCellData::decode, PacketSyncCellData::handle); - reg(PacketSyncLaborProgress.class, PacketSyncLaborProgress::encode, PacketSyncLaborProgress::decode, PacketSyncLaborProgress::handle); - reg(PacketSyncArmorStandBondage.class, PacketSyncArmorStandBondage::encode, PacketSyncArmorStandBondage::decode, PacketSyncArmorStandBondage::handle); - reg(PacketPlayTestAnimation.class, PacketPlayTestAnimation::encode, PacketPlayTestAnimation::decode, PacketPlayTestAnimation::handle); - reg(PacketSyncMCABondage.class, PacketSyncMCABondage::encode, PacketSyncMCABondage::decode, PacketSyncMCABondage::handle); + reg( + PacketSyncBindState.class, + PacketSyncBindState::encode, + PacketSyncBindState::decode, + PacketSyncBindState::handle + ); + reg( + PacketSyncStruggleState.class, + PacketSyncStruggleState::encode, + PacketSyncStruggleState::decode, + PacketSyncStruggleState::handle + ); + reg( + PacketSyncEnslavement.class, + PacketSyncEnslavement::encode, + PacketSyncEnslavement::decode, + PacketSyncEnslavement::handle + ); + reg( + PacketSyncLeashProxy.class, + PacketSyncLeashProxy::encode, + PacketSyncLeashProxy::decode, + PacketSyncLeashProxy::handle + ); + reg( + PacketSyncCollarRegistry.class, + PacketSyncCollarRegistry::encode, + PacketSyncCollarRegistry::decode, + PacketSyncCollarRegistry::handle + ); + reg( + PacketSyncClothesConfig.class, + PacketSyncClothesConfig::encode, + PacketSyncClothesConfig::decode, + PacketSyncClothesConfig::handle + ); + reg( + PacketSyncPetBedState.class, + PacketSyncPetBedState::encode, + PacketSyncPetBedState::decode, + PacketSyncPetBedState::handle + ); + reg( + PacketSyncCellData.class, + PacketSyncCellData::encode, + PacketSyncCellData::decode, + PacketSyncCellData::handle + ); + reg( + PacketSyncLaborProgress.class, + PacketSyncLaborProgress::encode, + PacketSyncLaborProgress::decode, + PacketSyncLaborProgress::handle + ); + reg( + PacketSyncArmorStandBondage.class, + PacketSyncArmorStandBondage::encode, + PacketSyncArmorStandBondage::decode, + PacketSyncArmorStandBondage::handle + ); + reg( + PacketPlayTestAnimation.class, + PacketPlayTestAnimation::encode, + PacketPlayTestAnimation::decode, + PacketPlayTestAnimation::handle + ); + reg( + PacketSyncMCABondage.class, + PacketSyncMCABondage::encode, + PacketSyncMCABondage::decode, + PacketSyncMCABondage::handle + ); // Actions (bidirectional) - reg(PacketTying.class, PacketTying::encode, PacketTying::decode, PacketTying::handle); - reg(PacketUntying.class, PacketUntying::encode, PacketUntying::decode, PacketUntying::handle); - reg(PacketForceFeeding.class, PacketForceFeeding::encode, PacketForceFeeding::decode, PacketForceFeeding::handle); - reg(PacketStruggle.class, PacketStruggle::encode, PacketStruggle::decode, PacketStruggle::handle); - reg(PacketTighten.class, PacketTighten::encode, PacketTighten::decode, PacketTighten::handle); - reg(PacketSetKnifeCutTarget.class, PacketSetKnifeCutTarget::encode, PacketSetKnifeCutTarget::decode, PacketSetKnifeCutTarget::handle); - reg(PacketSelfBondage.class, PacketSelfBondage::encode, PacketSelfBondage::decode, PacketSelfBondage::handle); - reg(PacketForceSeatModifier.class, PacketForceSeatModifier::encode, PacketForceSeatModifier::decode, PacketForceSeatModifier::handle); + reg( + PacketTying.class, + PacketTying::encode, + PacketTying::decode, + PacketTying::handle + ); + reg( + PacketUntying.class, + PacketUntying::encode, + PacketUntying::decode, + PacketUntying::handle + ); + reg( + PacketForceFeeding.class, + PacketForceFeeding::encode, + PacketForceFeeding::decode, + PacketForceFeeding::handle + ); + reg( + PacketStruggle.class, + PacketStruggle::encode, + PacketStruggle::decode, + PacketStruggle::handle + ); + reg( + PacketTighten.class, + PacketTighten::encode, + PacketTighten::decode, + PacketTighten::handle + ); + reg( + PacketSetKnifeCutTarget.class, + PacketSetKnifeCutTarget::encode, + PacketSetKnifeCutTarget::decode, + PacketSetKnifeCutTarget::handle + ); + reg( + PacketSelfBondage.class, + PacketSelfBondage::encode, + PacketSelfBondage::decode, + PacketSelfBondage::handle + ); + reg( + PacketForceSeatModifier.class, + PacketForceSeatModifier::encode, + PacketForceSeatModifier::decode, + PacketForceSeatModifier::handle + ); // Items (C2S) - reg(PacketAdjustItem.class, PacketAdjustItem::encode, PacketAdjustItem::decode, PacketAdjustItem::handle); - reg(PacketAdjustRemote.class, PacketAdjustRemote::encode, PacketAdjustRemote::decode, PacketAdjustRemote::handle); + reg( + PacketAdjustItem.class, + PacketAdjustItem::encode, + PacketAdjustItem::decode, + PacketAdjustItem::handle + ); + reg( + PacketAdjustRemote.class, + PacketAdjustRemote::encode, + PacketAdjustRemote::decode, + PacketAdjustRemote::handle + ); // Slave management - reg(PacketSlaveAction.class, PacketSlaveAction::encode, PacketSlaveAction::decode, PacketSlaveAction::handle); - reg(PacketSlaveItemManage.class, PacketSlaveItemManage::encode, PacketSlaveItemManage::decode, PacketSlaveItemManage::handle); - reg(PacketSlaveBeingFreed.class, PacketSlaveBeingFreed::encode, PacketSlaveBeingFreed::decode, PacketSlaveBeingFreed::handle); + reg( + PacketSlaveAction.class, + PacketSlaveAction::encode, + PacketSlaveAction::decode, + PacketSlaveAction::handle + ); + reg( + PacketSlaveItemManage.class, + PacketSlaveItemManage::encode, + PacketSlaveItemManage::decode, + PacketSlaveItemManage::handle + ); + reg( + PacketSlaveBeingFreed.class, + PacketSlaveBeingFreed::encode, + PacketSlaveBeingFreed::decode, + PacketSlaveBeingFreed::handle + ); // NPC commands - reg(PacketNpcCommand.class, PacketNpcCommand::encode, PacketNpcCommand::decode, PacketNpcCommand::handle); - reg(PacketOpenCommandWandScreen.class, PacketOpenCommandWandScreen::encode, PacketOpenCommandWandScreen::decode, PacketOpenCommandWandScreen::handle); - reg(PacketRequestNpcInventory.class, PacketRequestNpcInventory::encode, PacketRequestNpcInventory::decode, PacketRequestNpcInventory::handle); - reg(PacketDisciplineAction.class, PacketDisciplineAction::encode, PacketDisciplineAction::decode, PacketDisciplineAction::handle); + reg( + PacketNpcCommand.class, + PacketNpcCommand::encode, + PacketNpcCommand::decode, + PacketNpcCommand::handle + ); + reg( + PacketOpenCommandWandScreen.class, + PacketOpenCommandWandScreen::encode, + PacketOpenCommandWandScreen::decode, + PacketOpenCommandWandScreen::handle + ); + reg( + PacketRequestNpcInventory.class, + PacketRequestNpcInventory::encode, + PacketRequestNpcInventory::decode, + PacketRequestNpcInventory::handle + ); + reg( + PacketDisciplineAction.class, + PacketDisciplineAction::encode, + PacketDisciplineAction::decode, + PacketDisciplineAction::handle + ); // Bounty - reg(PacketRequestBounties.class, PacketRequestBounties::encode, PacketRequestBounties::decode, PacketRequestBounties::handle); - reg(PacketSendBounties.class, PacketSendBounties::encode, PacketSendBounties::decode, PacketSendBounties::handle); - reg(PacketDeleteBounty.class, PacketDeleteBounty::encode, PacketDeleteBounty::decode, PacketDeleteBounty::handle); + reg( + PacketRequestBounties.class, + PacketRequestBounties::encode, + PacketRequestBounties::decode, + PacketRequestBounties::handle + ); + reg( + PacketSendBounties.class, + PacketSendBounties::encode, + PacketSendBounties::decode, + PacketSendBounties::handle + ); + reg( + PacketDeleteBounty.class, + PacketDeleteBounty::encode, + PacketDeleteBounty::decode, + PacketDeleteBounty::handle + ); // Struggle mini-game - reg(PacketContinuousStruggleState.class, PacketContinuousStruggleState::encode, PacketContinuousStruggleState::decode, PacketContinuousStruggleState::handle); - reg(PacketContinuousStruggleHold.class, PacketContinuousStruggleHold::encode, PacketContinuousStruggleHold::decode, PacketContinuousStruggleHold::handle); - reg(PacketContinuousStruggleStop.class, PacketContinuousStruggleStop::encode, PacketContinuousStruggleStop::decode, PacketContinuousStruggleStop::handle); + reg( + PacketContinuousStruggleState.class, + PacketContinuousStruggleState::encode, + PacketContinuousStruggleState::decode, + PacketContinuousStruggleState::handle + ); + reg( + PacketContinuousStruggleHold.class, + PacketContinuousStruggleHold::encode, + PacketContinuousStruggleHold::decode, + PacketContinuousStruggleHold::handle + ); + reg( + PacketContinuousStruggleStop.class, + PacketContinuousStruggleStop::encode, + PacketContinuousStruggleStop::decode, + PacketContinuousStruggleStop::handle + ); // Lockpick mini-game - reg(PacketLockpickMiniGameStart.class, PacketLockpickMiniGameStart::encode, PacketLockpickMiniGameStart::decode, PacketLockpickMiniGameStart::handle); - reg(PacketLockpickMiniGameState.class, PacketLockpickMiniGameState::encode, PacketLockpickMiniGameState::decode, PacketLockpickMiniGameState::handle); - reg(PacketLockpickMiniGameMove.class, PacketLockpickMiniGameMove::encode, PacketLockpickMiniGameMove::decode, PacketLockpickMiniGameMove::handle); - reg(PacketLockpickAttempt.class, PacketLockpickAttempt::encode, PacketLockpickAttempt::decode, PacketLockpickAttempt::handle); - reg(PacketLockpickMiniGameResult.class, PacketLockpickMiniGameResult::encode, PacketLockpickMiniGameResult::decode, PacketLockpickMiniGameResult::handle); + reg( + PacketLockpickMiniGameStart.class, + PacketLockpickMiniGameStart::encode, + PacketLockpickMiniGameStart::decode, + PacketLockpickMiniGameStart::handle + ); + reg( + PacketLockpickMiniGameState.class, + PacketLockpickMiniGameState::encode, + PacketLockpickMiniGameState::decode, + PacketLockpickMiniGameState::handle + ); + reg( + PacketLockpickMiniGameMove.class, + PacketLockpickMiniGameMove::encode, + PacketLockpickMiniGameMove::decode, + PacketLockpickMiniGameMove::handle + ); + reg( + PacketLockpickAttempt.class, + PacketLockpickAttempt::encode, + PacketLockpickAttempt::decode, + PacketLockpickAttempt::handle + ); + reg( + PacketLockpickMiniGameResult.class, + PacketLockpickMiniGameResult::encode, + PacketLockpickMiniGameResult::decode, + PacketLockpickMiniGameResult::handle + ); // Merchant trading - reg(PacketOpenMerchantScreen.class, PacketOpenMerchantScreen::encode, PacketOpenMerchantScreen::decode, PacketOpenMerchantScreen::handle); - reg(PacketPurchaseTrade.class, PacketPurchaseTrade::encode, PacketPurchaseTrade::decode, PacketPurchaseTrade::handle); - reg(PacketCloseMerchantScreen.class, PacketCloseMerchantScreen::encode, PacketCloseMerchantScreen::decode, PacketCloseMerchantScreen::handle); + reg( + PacketOpenMerchantScreen.class, + PacketOpenMerchantScreen::encode, + PacketOpenMerchantScreen::decode, + PacketOpenMerchantScreen::handle + ); + reg( + PacketPurchaseTrade.class, + PacketPurchaseTrade::encode, + PacketPurchaseTrade::decode, + PacketPurchaseTrade::handle + ); + reg( + PacketCloseMerchantScreen.class, + PacketCloseMerchantScreen::encode, + PacketCloseMerchantScreen::decode, + PacketCloseMerchantScreen::handle + ); // Slave trader - reg(PacketOpenTraderScreen.class, PacketOpenTraderScreen::encode, PacketOpenTraderScreen::decode, PacketOpenTraderScreen::handle); - reg(PacketBuyCaptive.class, PacketBuyCaptive::encode, PacketBuyCaptive::decode, PacketBuyCaptive::handle); + reg( + PacketOpenTraderScreen.class, + PacketOpenTraderScreen::encode, + PacketOpenTraderScreen::decode, + PacketOpenTraderScreen::handle + ); + reg( + PacketBuyCaptive.class, + PacketBuyCaptive::encode, + PacketBuyCaptive::decode, + PacketBuyCaptive::handle + ); // Cell management - reg(PacketOpenCellManager.class, PacketOpenCellManager::encode, PacketOpenCellManager::decode, PacketOpenCellManager::handle); - reg(PacketCellAction.class, PacketCellAction::encode, PacketCellAction::decode, PacketCellAction::handle); - reg(PacketRenameCell.class, PacketRenameCell::encode, PacketRenameCell::decode, PacketRenameCell::handle); - reg(PacketAssignCellToCollar.class, PacketAssignCellToCollar::encode, PacketAssignCellToCollar::decode, PacketAssignCellToCollar::handle); - reg(PacketRequestCellList.class, PacketRequestCellList::encode, PacketRequestCellList::decode, PacketRequestCellList::handle); - reg(PacketOpenCellSelector.class, PacketOpenCellSelector::encode, PacketOpenCellSelector::decode, PacketOpenCellSelector::handle); - reg(PacketOpenCoreMenu.class, PacketOpenCoreMenu::encode, PacketOpenCoreMenu::decode, (msg, ctx) -> msg.handle(ctx)); - reg(PacketCoreMenuAction.class, PacketCoreMenuAction::encode, PacketCoreMenuAction::decode, PacketCoreMenuAction::handle); + reg( + PacketOpenCellManager.class, + PacketOpenCellManager::encode, + PacketOpenCellManager::decode, + PacketOpenCellManager::handle + ); + reg( + PacketCellAction.class, + PacketCellAction::encode, + PacketCellAction::decode, + PacketCellAction::handle + ); + reg( + PacketRenameCell.class, + PacketRenameCell::encode, + PacketRenameCell::decode, + PacketRenameCell::handle + ); + reg( + PacketAssignCellToCollar.class, + PacketAssignCellToCollar::encode, + PacketAssignCellToCollar::decode, + PacketAssignCellToCollar::handle + ); + reg( + PacketRequestCellList.class, + PacketRequestCellList::encode, + PacketRequestCellList::decode, + PacketRequestCellList::handle + ); + reg( + PacketOpenCellSelector.class, + PacketOpenCellSelector::encode, + PacketOpenCellSelector::decode, + PacketOpenCellSelector::handle + ); + reg( + PacketOpenCoreMenu.class, + PacketOpenCoreMenu::encode, + PacketOpenCoreMenu::decode, + (msg, ctx) -> msg.handle(ctx) + ); + reg( + PacketCoreMenuAction.class, + PacketCoreMenuAction::encode, + PacketCoreMenuAction::decode, + PacketCoreMenuAction::handle + ); // Conversation - reg(PacketOpenConversation.class, PacketOpenConversation::encode, PacketOpenConversation::decode, PacketOpenConversation::handle); - reg(PacketSelectTopic.class, PacketSelectTopic::encode, PacketSelectTopic::decode, PacketSelectTopic::handle); - reg(PacketEndConversationC2S.class, PacketEndConversationC2S::encode, PacketEndConversationC2S::decode, PacketEndConversationC2S::handle); - reg(PacketEndConversationS2C.class, PacketEndConversationS2C::encode, PacketEndConversationS2C::decode, PacketEndConversationS2C::handle); - reg(PacketRequestConversation.class, PacketRequestConversation::encode, PacketRequestConversation::decode, PacketRequestConversation::handle); + reg( + PacketOpenConversation.class, + PacketOpenConversation::encode, + PacketOpenConversation::decode, + PacketOpenConversation::handle + ); + reg( + PacketSelectTopic.class, + PacketSelectTopic::encode, + PacketSelectTopic::decode, + PacketSelectTopic::handle + ); + reg( + PacketEndConversationC2S.class, + PacketEndConversationC2S::encode, + PacketEndConversationC2S::decode, + PacketEndConversationC2S::handle + ); + reg( + PacketEndConversationS2C.class, + PacketEndConversationS2C::encode, + PacketEndConversationS2C::decode, + PacketEndConversationS2C::handle + ); + reg( + PacketRequestConversation.class, + PacketRequestConversation::encode, + PacketRequestConversation::decode, + PacketRequestConversation::handle + ); // Master / pet - reg(PacketMasterStateSync.class, PacketMasterStateSync::encode, PacketMasterStateSync::decode, PacketMasterStateSync::handle); - reg(PacketOpenPetRequestMenu.class, PacketOpenPetRequestMenu::encode, PacketOpenPetRequestMenu::decode, PacketOpenPetRequestMenu::handle); - reg(PacketPetRequest.class, PacketPetRequest::encode, PacketPetRequest::decode, PacketPetRequest::handle); + reg( + PacketMasterStateSync.class, + PacketMasterStateSync::encode, + PacketMasterStateSync::decode, + PacketMasterStateSync::handle + ); + reg( + PacketOpenPetRequestMenu.class, + PacketOpenPetRequestMenu::encode, + PacketOpenPetRequestMenu::decode, + PacketOpenPetRequestMenu::handle + ); + reg( + PacketPetRequest.class, + PacketPetRequest::encode, + PacketPetRequest::decode, + PacketPetRequest::handle + ); // V2 bondage equipment - reg(PacketSyncV2Equipment.class, PacketSyncV2Equipment::encode, PacketSyncV2Equipment::decode, PacketSyncV2Equipment::handle); - reg(PacketV2SelfRemove.class, PacketV2SelfRemove::encode, PacketV2SelfRemove::decode, PacketV2SelfRemove::handle); - reg(PacketV2StruggleStart.class, PacketV2StruggleStart::encode, PacketV2StruggleStart::decode, PacketV2StruggleStart::handle); - reg(PacketV2LockToggle.class, PacketV2LockToggle::encode, PacketV2LockToggle::decode, PacketV2LockToggle::handle); - reg(PacketV2SelfEquip.class, PacketV2SelfEquip::encode, PacketV2SelfEquip::decode, PacketV2SelfEquip::handle); - reg(PacketV2SelfLock.class, PacketV2SelfLock::encode, PacketV2SelfLock::decode, PacketV2SelfLock::handle); - reg(PacketV2SelfUnlock.class, PacketV2SelfUnlock::encode, PacketV2SelfUnlock::decode, PacketV2SelfUnlock::handle); - reg(PacketMasterEquip.class, PacketMasterEquip::encode, PacketMasterEquip::decode, PacketMasterEquip::handle); + reg( + PacketSyncV2Equipment.class, + PacketSyncV2Equipment::encode, + PacketSyncV2Equipment::decode, + PacketSyncV2Equipment::handle + ); + reg( + PacketV2SelfRemove.class, + PacketV2SelfRemove::encode, + PacketV2SelfRemove::decode, + PacketV2SelfRemove::handle + ); + reg( + PacketV2StruggleStart.class, + PacketV2StruggleStart::encode, + PacketV2StruggleStart::decode, + PacketV2StruggleStart::handle + ); + reg( + PacketV2LockToggle.class, + PacketV2LockToggle::encode, + PacketV2LockToggle::decode, + PacketV2LockToggle::handle + ); + reg( + PacketV2SelfEquip.class, + PacketV2SelfEquip::encode, + PacketV2SelfEquip::decode, + PacketV2SelfEquip::handle + ); + reg( + PacketV2SelfLock.class, + PacketV2SelfLock::encode, + PacketV2SelfLock::decode, + PacketV2SelfLock::handle + ); + reg( + PacketV2SelfUnlock.class, + PacketV2SelfUnlock::encode, + PacketV2SelfUnlock::decode, + PacketV2SelfUnlock::handle + ); + reg( + PacketMasterEquip.class, + PacketMasterEquip::encode, + PacketMasterEquip::decode, + PacketMasterEquip::handle + ); // Furniture - reg(PacketSyncFurnitureState.class, PacketSyncFurnitureState::encode, PacketSyncFurnitureState::decode, PacketSyncFurnitureState::handle); - reg(PacketSyncFurnitureDefinitions.class, PacketSyncFurnitureDefinitions::encode, PacketSyncFurnitureDefinitions::decode, PacketSyncFurnitureDefinitions::handle); - reg(PacketFurnitureLock.class, PacketFurnitureLock::encode, PacketFurnitureLock::decode, PacketFurnitureLock::handle); - reg(PacketFurnitureForcemount.class, PacketFurnitureForcemount::encode, PacketFurnitureForcemount::decode, PacketFurnitureForcemount::handle); - reg(PacketFurnitureEscape.class, PacketFurnitureEscape::encode, PacketFurnitureEscape::decode, PacketFurnitureEscape::handle); + reg( + PacketSyncFurnitureState.class, + PacketSyncFurnitureState::encode, + PacketSyncFurnitureState::decode, + PacketSyncFurnitureState::handle + ); + reg( + PacketSyncFurnitureDefinitions.class, + PacketSyncFurnitureDefinitions::encode, + PacketSyncFurnitureDefinitions::decode, + PacketSyncFurnitureDefinitions::handle + ); + reg( + PacketFurnitureLock.class, + PacketFurnitureLock::encode, + PacketFurnitureLock::decode, + PacketFurnitureLock::handle + ); + reg( + PacketFurnitureForcemount.class, + PacketFurnitureForcemount::encode, + PacketFurnitureForcemount::decode, + PacketFurnitureForcemount::handle + ); + reg( + PacketFurnitureEscape.class, + PacketFurnitureEscape::encode, + PacketFurnitureEscape::decode, + PacketFurnitureEscape::handle + ); // Movement style - reg(PacketSyncMovementStyle.class, PacketSyncMovementStyle::encode, PacketSyncMovementStyle::decode, PacketSyncMovementStyle::handle); + reg( + PacketSyncMovementStyle.class, + PacketSyncMovementStyle::encode, + PacketSyncMovementStyle::decode, + PacketSyncMovementStyle::handle + ); TiedUpMod.LOGGER.info("Registered {} network packets", packetId); } diff --git a/src/main/java/com/tiedup/remake/network/NetworkEventHandler.java b/src/main/java/com/tiedup/remake/network/NetworkEventHandler.java index 659d1fa..90a3449 100644 --- a/src/main/java/com/tiedup/remake/network/NetworkEventHandler.java +++ b/src/main/java/com/tiedup/remake/network/NetworkEventHandler.java @@ -77,7 +77,8 @@ public class NetworkEventHandler { // Sync tracked player's V2 equipment to the tracker (so they see the bondage layers) com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper.syncTo( - trackedPlayer, tracker + trackedPlayer, + tracker ); // Also sync state flags @@ -182,7 +183,7 @@ public class NetworkEventHandler { * 1. The player's own inventory to themselves * 2. The player's inventory to all other players (so they see the new player) * 3. All other players' inventories to the new player (so they see everyone) - * 4. The player's collar registry (Phase 17) + * 4. The player's collar registry */ @SubscribeEvent public static void onPlayerLoggedIn(PlayerEvent.PlayerLoggedInEvent event) { @@ -192,11 +193,12 @@ public class NetworkEventHandler { SyncManager.syncAll(player); SyncManager.syncAllPlayersTo(player); - // Phase 17: Sync collar registry to this player syncCollarRegistry(player); // Sync furniture definitions - com.tiedup.remake.v2.furniture.network.PacketSyncFurnitureDefinitions.sendToPlayer(player); + com.tiedup.remake.v2.furniture.network.PacketSyncFurnitureDefinitions.sendToPlayer( + player + ); // Check for furniture reconnection (player was locked in a seat and disconnected) handleFurnitureReconnection(player); @@ -247,9 +249,14 @@ public class NetworkEventHandler { CompoundTag tag = persistentData.getCompound("tiedup_locked_furniture"); // Read stored data - if (!tag.contains("x") || !tag.contains("y") || !tag.contains("z") - || !tag.contains("dim") || !tag.contains("furniture_uuid") - || !tag.contains("seat_id")) { + if ( + !tag.contains("x") || + !tag.contains("y") || + !tag.contains("z") || + !tag.contains("dim") || + !tag.contains("furniture_uuid") || + !tag.contains("seat_id") + ) { TiedUpMod.LOGGER.warn( "[Network] Malformed furniture reconnection tag for {}, removing", player.getName().getString() @@ -272,7 +279,8 @@ public class NetworkEventHandler { } catch (IllegalArgumentException e) { TiedUpMod.LOGGER.warn( "[Network] Invalid furniture UUID '{}' in reconnection tag for {}, removing", - furnitureUuidStr, player.getName().getString() + furnitureUuidStr, + player.getName().getString() ); persistentData.remove("tiedup_locked_furniture"); return; @@ -314,18 +322,30 @@ public class NetworkEventHandler { // Search for the furniture entity near the stored position Entity furniture = findFurnitureEntity( - targetLevel, furniturePos, furnitureUuid + targetLevel, + furniturePos, + furnitureUuid ); - if (furniture == null || !(furniture instanceof ISeatProvider provider)) { + if ( + furniture == null || + !(furniture instanceof ISeatProvider provider) + ) { TiedUpMod.LOGGER.info( - "[Network] Furniture entity {} not found at {} for reconnection of {}. " - + "Teleporting player to last furniture position.", - furnitureUuidStr, furniturePos, + "[Network] Furniture entity {} not found at {} for reconnection of {}. " + + "Teleporting player to last furniture position.", + furnitureUuidStr, + furniturePos, player.getName().getString() ); // Teleport to furniture position to prevent "disconnect to escape" - teleportPlayerTo(player, targetLevel, x + 0.5, y, z + 0.5); + teleportPlayerTo( + player, + targetLevel, + x + 0.5, + y, + z + 0.5 + ); persistentData.remove("tiedup_locked_furniture"); return; } @@ -334,17 +354,25 @@ public class NetworkEventHandler { if (!provider.isSeatLocked(seatId)) { TiedUpMod.LOGGER.info( "[Network] Seat '{}' is no longer locked on furniture {}. Freeing {}.", - seatId, furnitureUuidStr, player.getName().getString() + seatId, + furnitureUuidStr, + player.getName().getString() ); persistentData.remove("tiedup_locked_furniture"); return; } // Teleport to furniture dimension/position if needed - if (player.level() != targetLevel || player.distanceToSqr(furniture) > 25.0) { + if ( + player.level() != targetLevel || + player.distanceToSqr(furniture) > 25.0 + ) { teleportPlayerTo( - player, targetLevel, - furniture.getX(), furniture.getY(), furniture.getZ() + player, + targetLevel, + furniture.getX(), + furniture.getY(), + furniture.getZ() ); } @@ -355,16 +383,21 @@ public class NetworkEventHandler { TiedUpMod.LOGGER.info( "[Network] Re-mounted {} in furniture {} seat '{}'", player.getName().getString(), - furnitureUuidStr, seatId + furnitureUuidStr, + seatId ); } else { TiedUpMod.LOGGER.warn( "[Network] Failed to re-mount {} in furniture {}. Teleporting to position.", - player.getName().getString(), furnitureUuidStr + player.getName().getString(), + furnitureUuidStr ); teleportPlayerTo( - player, (ServerLevel) furniture.level(), - furniture.getX(), furniture.getY(), furniture.getZ() + player, + (ServerLevel) furniture.level(), + furniture.getX(), + furniture.getY(), + furniture.getZ() ); persistentData.remove("tiedup_locked_furniture"); } @@ -384,15 +417,25 @@ public class NetworkEventHandler { private static void teleportPlayerTo( ServerPlayer player, ServerLevel targetLevel, - double x, double y, double z + double x, + double y, + double z ) { if (player.serverLevel() == targetLevel) { player.teleportTo(x, y, z); } else { // Cross-dimension: use the project's TeleportHelper for correct handling com.tiedup.remake.util.teleport.Position pos = - new com.tiedup.remake.util.teleport.Position(x, y, z, targetLevel.dimension()); - com.tiedup.remake.util.teleport.TeleportHelper.teleportEntity(player, pos); + new com.tiedup.remake.util.teleport.Position( + x, + y, + z, + targetLevel.dimension() + ); + com.tiedup.remake.util.teleport.TeleportHelper.teleportEntity( + player, + pos + ); } } @@ -415,7 +458,8 @@ public class NetworkEventHandler { // but entity positions can drift slightly due to floating point) AABB searchBox = new AABB(pos).inflate(2.0); java.util.List entities = level.getEntitiesOfClass( - EntityFurniture.class, searchBox, + EntityFurniture.class, + searchBox, e -> e.isAlive() && !e.isRemoved() ); @@ -431,9 +475,11 @@ public class NetworkEventHandler { for (EntityFurniture entity : entities) { if (entity.blockPosition().equals(pos)) { TiedUpMod.LOGGER.debug( - "[Network] Furniture UUID mismatch but position matches at {}. " - + "Using entity {} instead of expected {}.", - pos, entity.getUUID(), expectedUuid + "[Network] Furniture UUID mismatch but position matches at {}. " + + "Using entity {} instead of expected {}.", + pos, + entity.getUUID(), + expectedUuid ); return entity; } diff --git a/src/main/java/com/tiedup/remake/network/action/PacketStruggle.java b/src/main/java/com/tiedup/remake/network/action/PacketStruggle.java index e7c2e9f..5cec524 100644 --- a/src/main/java/com/tiedup/remake/network/action/PacketStruggle.java +++ b/src/main/java/com/tiedup/remake/network/action/PacketStruggle.java @@ -8,7 +8,6 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraftforge.network.NetworkEvent; /** - * Phase 7: Packet for struggling (Client to Server). * * Based on original PacketStruggleServer from 1.12.2 * diff --git a/src/main/java/com/tiedup/remake/network/action/PacketTighten.java b/src/main/java/com/tiedup/remake/network/action/PacketTighten.java index 9a98503..820898b 100644 --- a/src/main/java/com/tiedup/remake/network/action/PacketTighten.java +++ b/src/main/java/com/tiedup/remake/network/action/PacketTighten.java @@ -1,12 +1,12 @@ package com.tiedup.remake.network.action; import com.tiedup.remake.core.TiedUpMod; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.network.PacketRateLimiter; -import com.tiedup.remake.state.IRestrainable; import com.tiedup.remake.state.ICaptor; +import com.tiedup.remake.state.IRestrainable; import com.tiedup.remake.state.PlayerBindState; import com.tiedup.remake.util.KidnappedHelper; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.List; import java.util.function.Supplier; import net.minecraft.network.FriendlyByteBuf; @@ -18,7 +18,6 @@ import net.minecraft.world.phys.Vec3; import net.minecraftforge.network.NetworkEvent; /** - * Phase 7: Packet for tightening binds (Client to Server). * * Based on original PacketTightenBinds from 1.12.2 * diff --git a/src/main/java/com/tiedup/remake/network/base/AbstractProgressPacket.java b/src/main/java/com/tiedup/remake/network/base/AbstractProgressPacket.java index 96faa05..1439874 100644 --- a/src/main/java/com/tiedup/remake/network/base/AbstractProgressPacket.java +++ b/src/main/java/com/tiedup/remake/network/base/AbstractProgressPacket.java @@ -9,7 +9,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; /** - * Phase 2 Refactoring: Abstract base class for progress packets. * * Eliminates code duplication between PacketTying and PacketUntying. * Both packets share identical structure for encoding/decoding/handling, diff --git a/src/main/java/com/tiedup/remake/network/bounty/PacketDeleteBounty.java b/src/main/java/com/tiedup/remake/network/bounty/PacketDeleteBounty.java index 6d3427a..570b6da 100644 --- a/src/main/java/com/tiedup/remake/network/bounty/PacketDeleteBounty.java +++ b/src/main/java/com/tiedup/remake/network/bounty/PacketDeleteBounty.java @@ -12,7 +12,6 @@ import net.minecraftforge.network.NetworkEvent; /** * Packet: Client requests to delete/cancel a bounty. * - * Phase 17: Bounty System * * Only the bounty client or an admin can delete. * If client deletes, reward is returned. diff --git a/src/main/java/com/tiedup/remake/network/bounty/PacketRequestBounties.java b/src/main/java/com/tiedup/remake/network/bounty/PacketRequestBounties.java index 5a6de2b..e7c2285 100644 --- a/src/main/java/com/tiedup/remake/network/bounty/PacketRequestBounties.java +++ b/src/main/java/com/tiedup/remake/network/bounty/PacketRequestBounties.java @@ -13,7 +13,6 @@ import net.minecraftforge.network.NetworkEvent; /** * Packet: Client requests bounty list from server. * - * Phase 17: Bounty System * * Flow: Client → Server → PacketSendBounties → Client */ diff --git a/src/main/java/com/tiedup/remake/network/bounty/PacketSendBounties.java b/src/main/java/com/tiedup/remake/network/bounty/PacketSendBounties.java index 0633c0f..163a2e3 100644 --- a/src/main/java/com/tiedup/remake/network/bounty/PacketSendBounties.java +++ b/src/main/java/com/tiedup/remake/network/bounty/PacketSendBounties.java @@ -16,7 +16,6 @@ import net.minecraftforge.network.NetworkEvent; /** * Packet: Server sends bounty list to client. * - * Phase 17: Bounty System * * Flow: Server → Client (opens BountyListScreen) */ diff --git a/src/main/java/com/tiedup/remake/network/cell/PacketAssignCellToCollar.java b/src/main/java/com/tiedup/remake/network/cell/PacketAssignCellToCollar.java index 20c1515..1094b8a 100644 --- a/src/main/java/com/tiedup/remake/network/cell/PacketAssignCellToCollar.java +++ b/src/main/java/com/tiedup/remake/network/cell/PacketAssignCellToCollar.java @@ -1,7 +1,6 @@ package com.tiedup.remake.network.cell; import com.tiedup.remake.cells.CellDataV2; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.cells.CellRegistryV2; import com.tiedup.remake.core.SystemMessageManager; import com.tiedup.remake.core.TiedUpMod; @@ -12,6 +11,7 @@ import com.tiedup.remake.network.sync.SyncManager; import com.tiedup.remake.personality.PersonalityState; import com.tiedup.remake.state.IBondageState; import com.tiedup.remake.util.KidnappedHelper; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.UUID; import java.util.function.Supplier; import net.minecraft.network.FriendlyByteBuf; diff --git a/src/main/java/com/tiedup/remake/network/cell/PacketOpenCellManager.java b/src/main/java/com/tiedup/remake/network/cell/PacketOpenCellManager.java index ec7120d..83a08a3 100644 --- a/src/main/java/com/tiedup/remake/network/cell/PacketOpenCellManager.java +++ b/src/main/java/com/tiedup/remake/network/cell/PacketOpenCellManager.java @@ -194,8 +194,10 @@ public class PacketOpenCellManager extends AbstractClientPacket { @OnlyIn(Dist.CLIENT) private static class ClientHandler { + private static void handle(PacketOpenCellManager pkt) { - net.minecraft.client.Minecraft mc = net.minecraft.client.Minecraft.getInstance(); + net.minecraft.client.Minecraft mc = + net.minecraft.client.Minecraft.getInstance(); if (mc.player == null) return; TiedUpMod.LOGGER.info( @@ -204,7 +206,12 @@ public class PacketOpenCellManager extends AbstractClientPacket { pkt.isOperator ); - mc.setScreen(new com.tiedup.remake.client.gui.screens.CellManagerScreen(pkt.cells, pkt.isOperator)); + mc.setScreen( + new com.tiedup.remake.client.gui.screens.CellManagerScreen( + pkt.cells, + pkt.isOperator + ) + ); } } diff --git a/src/main/java/com/tiedup/remake/network/cell/PacketOpenCellSelector.java b/src/main/java/com/tiedup/remake/network/cell/PacketOpenCellSelector.java index c5fbe04..d7c8848 100644 --- a/src/main/java/com/tiedup/remake/network/cell/PacketOpenCellSelector.java +++ b/src/main/java/com/tiedup/remake/network/cell/PacketOpenCellSelector.java @@ -88,8 +88,10 @@ public class PacketOpenCellSelector extends AbstractClientPacket { @OnlyIn(Dist.CLIENT) private static class ClientHandler { + private static void handle(PacketOpenCellSelector pkt) { - net.minecraft.client.Minecraft mc = net.minecraft.client.Minecraft.getInstance(); + net.minecraft.client.Minecraft mc = + net.minecraft.client.Minecraft.getInstance(); if (mc.player == null) return; TiedUpMod.LOGGER.info( @@ -98,7 +100,12 @@ public class PacketOpenCellSelector extends AbstractClientPacket { pkt.targetEntityUUID.toString().substring(0, 8) ); - mc.setScreen(new com.tiedup.remake.client.gui.screens.CellSelectorScreen(pkt.targetEntityUUID, pkt.cells)); + mc.setScreen( + new com.tiedup.remake.client.gui.screens.CellSelectorScreen( + pkt.targetEntityUUID, + pkt.cells + ) + ); } } diff --git a/src/main/java/com/tiedup/remake/network/cell/PacketOpenCoreMenu.java b/src/main/java/com/tiedup/remake/network/cell/PacketOpenCoreMenu.java index 749a353..bbf9f14 100644 --- a/src/main/java/com/tiedup/remake/network/cell/PacketOpenCoreMenu.java +++ b/src/main/java/com/tiedup/remake/network/cell/PacketOpenCoreMenu.java @@ -104,6 +104,7 @@ public class PacketOpenCoreMenu extends AbstractClientPacket { @OnlyIn(Dist.CLIENT) private static class ClientHandler { + private static void handle(PacketOpenCoreMenu pkt) { net.minecraft.client.Minecraft.getInstance().setScreen( new com.tiedup.remake.client.gui.screens.CellCoreScreen( diff --git a/src/main/java/com/tiedup/remake/network/cell/PacketSyncCellData.java b/src/main/java/com/tiedup/remake/network/cell/PacketSyncCellData.java index d879c16..40088c3 100644 --- a/src/main/java/com/tiedup/remake/network/cell/PacketSyncCellData.java +++ b/src/main/java/com/tiedup/remake/network/cell/PacketSyncCellData.java @@ -186,6 +186,7 @@ public class PacketSyncCellData extends AbstractClientPacket { @OnlyIn(Dist.CLIENT) private static class ClientHandler { + private static void handle(PacketSyncCellData pkt) { TiedUpMod.LOGGER.debug( "[PacketSyncCellData] Received cell sync: {} at {} with {} position types, {} waypoints", @@ -237,7 +238,9 @@ public class PacketSyncCellData extends AbstractClientPacket { cell.setPathWaypoints(pkt.pathWaypoints); // Update the client-side cache - com.tiedup.remake.client.events.CellHighlightHandler.updateCachedCell(cell); + com.tiedup.remake.client.events.CellHighlightHandler.updateCachedCell( + cell + ); } } diff --git a/src/main/java/com/tiedup/remake/network/conversation/PacketEndConversationC2S.java b/src/main/java/com/tiedup/remake/network/conversation/PacketEndConversationC2S.java index 9ed66d8..1867f66 100644 --- a/src/main/java/com/tiedup/remake/network/conversation/PacketEndConversationC2S.java +++ b/src/main/java/com/tiedup/remake/network/conversation/PacketEndConversationC2S.java @@ -32,30 +32,32 @@ public class PacketEndConversationC2S { } public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { - ServerPlayer sender = ctx.get().getSender(); - if (sender == null) return; + ctx + .get() + .enqueueWork(() -> { + ServerPlayer sender = ctx.get().getSender(); + if (sender == null) return; - if (!PacketRateLimiter.allowPacket(sender, "action")) return; + if (!PacketRateLimiter.allowPacket(sender, "action")) return; - TiedUpMod.LOGGER.info( - "[PacketEndConversationC2S] {} ended conversation with entity {}", - sender.getName().getString(), - entityId - ); + TiedUpMod.LOGGER.info( + "[PacketEndConversationC2S] {} ended conversation with entity {}", + sender.getName().getString(), + entityId + ); - // Get the damsel entity to properly end with cooldown - EntityDamsel damsel = null; - Entity entity = sender.level().getEntity(entityId); - if (entity instanceof EntityDamsel d) { - damsel = d; - } + // Get the damsel entity to properly end with cooldown + EntityDamsel damsel = null; + Entity entity = sender.level().getEntity(entityId); + if (entity instanceof EntityDamsel d) { + damsel = d; + } - // Always clean up conversation state — this is a teardown packet. - // Distance check removed: blocking cleanup causes permanent state leak - // in ConversationManager.activeConversations (reviewer H18 BUG-001). - ConversationManager.endConversation(sender, damsel); - }); + // Always clean up conversation state — this is a teardown packet. + // Distance check removed: blocking cleanup causes permanent state leak + // in ConversationManager.activeConversations (reviewer H18 BUG-001). + ConversationManager.endConversation(sender, damsel); + }); ctx.get().setPacketHandled(true); } diff --git a/src/main/java/com/tiedup/remake/network/conversation/PacketEndConversationS2C.java b/src/main/java/com/tiedup/remake/network/conversation/PacketEndConversationS2C.java index 8cfe383..a3975ed 100644 --- a/src/main/java/com/tiedup/remake/network/conversation/PacketEndConversationS2C.java +++ b/src/main/java/com/tiedup/remake/network/conversation/PacketEndConversationS2C.java @@ -45,6 +45,7 @@ public class PacketEndConversationS2C { @OnlyIn(Dist.CLIENT) private static class ClientHandler { + private static void handle(PacketEndConversationS2C pkt) { TiedUpMod.LOGGER.info( "[PacketEndConversationS2C] Server ended conversation with entity {}", diff --git a/src/main/java/com/tiedup/remake/network/conversation/PacketOpenConversation.java b/src/main/java/com/tiedup/remake/network/conversation/PacketOpenConversation.java index 518c7ab..8c6e6f6 100644 --- a/src/main/java/com/tiedup/remake/network/conversation/PacketOpenConversation.java +++ b/src/main/java/com/tiedup/remake/network/conversation/PacketOpenConversation.java @@ -12,7 +12,6 @@ import net.minecraftforge.network.NetworkEvent; * Packet sent from server to client to open the conversation GUI. * Contains the entity ID, NPC name, and available conversation topics. * - * Phase 14: Conversation System */ public class PacketOpenConversation { diff --git a/src/main/java/com/tiedup/remake/network/conversation/PacketRequestConversation.java b/src/main/java/com/tiedup/remake/network/conversation/PacketRequestConversation.java index b2c7802..1798402 100644 --- a/src/main/java/com/tiedup/remake/network/conversation/PacketRequestConversation.java +++ b/src/main/java/com/tiedup/remake/network/conversation/PacketRequestConversation.java @@ -14,7 +14,6 @@ import net.minecraftforge.network.NetworkEvent; * Packet sent from client to server to request opening a conversation. * Sent when player clicks the "Ask..." button in DialogueScreen. * - * Phase 14: Conversation System * * DISABLED: Conversation system not in use. Kept because it is still registered * in ModNetwork — removing a registered packet would shift packet IDs. diff --git a/src/main/java/com/tiedup/remake/network/conversation/PacketSelectTopic.java b/src/main/java/com/tiedup/remake/network/conversation/PacketSelectTopic.java index 661f292..ec0c061 100644 --- a/src/main/java/com/tiedup/remake/network/conversation/PacketSelectTopic.java +++ b/src/main/java/com/tiedup/remake/network/conversation/PacketSelectTopic.java @@ -15,7 +15,6 @@ import net.minecraftforge.network.NetworkEvent; /** * Packet sent from client to server when player selects a conversation topic. * - * Phase 14: Conversation System */ public class PacketSelectTopic { diff --git a/src/main/java/com/tiedup/remake/network/item/PacketAdjustItem.java b/src/main/java/com/tiedup/remake/network/item/PacketAdjustItem.java index 0af80c8..9a9447d 100644 --- a/src/main/java/com/tiedup/remake/network/item/PacketAdjustItem.java +++ b/src/main/java/com/tiedup/remake/network/item/PacketAdjustItem.java @@ -3,9 +3,9 @@ package com.tiedup.remake.network.item; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.items.base.AdjustmentHelper; import com.tiedup.remake.items.base.IAdjustable; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.network.sync.SyncManager; import com.tiedup.remake.state.PlayerBindState; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.function.Supplier; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; @@ -13,7 +13,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraftforge.network.NetworkEvent; /** - * Phase 16: Packet for adjusting item Y position (Client to Server). * * Sent by client when player adjusts a gag or blindfold position. * Server validates and applies the adjustment, then syncs to all clients. diff --git a/src/main/java/com/tiedup/remake/network/item/PacketAdjustRemote.java b/src/main/java/com/tiedup/remake/network/item/PacketAdjustRemote.java index 96b556b..521a397 100644 --- a/src/main/java/com/tiedup/remake/network/item/PacketAdjustRemote.java +++ b/src/main/java/com/tiedup/remake/network/item/PacketAdjustRemote.java @@ -4,11 +4,11 @@ import com.tiedup.remake.core.SystemMessageManager; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.items.base.AdjustmentHelper; import com.tiedup.remake.items.base.IAdjustable; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.network.sync.SyncManager; import com.tiedup.remake.state.IBondageState; import com.tiedup.remake.state.PlayerBindState; import com.tiedup.remake.state.PlayerCaptorManager; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.UUID; import java.util.function.Supplier; import net.minecraft.ChatFormatting; @@ -21,7 +21,6 @@ import net.minecraftforge.network.NetworkEvent; /** * Packet for adjusting a slave's gag/blindfold remotely. * - * Phase 16: GUI Revamp - Remote adjustment packet * * Security: Distance and dimension validation added to prevent griefing */ @@ -253,7 +252,9 @@ public class PacketAdjustRemote { entity ); if (kidnapped != null && kidnapped.hasCollar()) { - ItemStack collarStack = kidnapped.getEquipment(BodyRegionV2.NECK); + ItemStack collarStack = kidnapped.getEquipment( + BodyRegionV2.NECK + ); if ( collarStack.getItem() instanceof com.tiedup.remake.items.base.ItemCollar collar diff --git a/src/main/java/com/tiedup/remake/network/labor/PacketSyncLaborProgress.java b/src/main/java/com/tiedup/remake/network/labor/PacketSyncLaborProgress.java index b03d890..4831009 100644 --- a/src/main/java/com/tiedup/remake/network/labor/PacketSyncLaborProgress.java +++ b/src/main/java/com/tiedup/remake/network/labor/PacketSyncLaborProgress.java @@ -89,6 +89,7 @@ public class PacketSyncLaborProgress extends AbstractClientPacket { @OnlyIn(Dist.CLIENT) private static class ClientHandler { + private static void handle(PacketSyncLaborProgress pkt) { if (pkt.hasTask) { com.tiedup.remake.client.state.ClientLaborState.setTask( diff --git a/src/main/java/com/tiedup/remake/network/master/PacketMasterStateSync.java b/src/main/java/com/tiedup/remake/network/master/PacketMasterStateSync.java index 6a047fd..97cf193 100644 --- a/src/main/java/com/tiedup/remake/network/master/PacketMasterStateSync.java +++ b/src/main/java/com/tiedup/remake/network/master/PacketMasterStateSync.java @@ -88,11 +88,15 @@ public class PacketMasterStateSync extends AbstractClientPacket { @OnlyIn(Dist.CLIENT) private static class ClientHandler { + private static void handle(PacketMasterStateSync pkt) { - net.minecraft.client.Minecraft mc = net.minecraft.client.Minecraft.getInstance(); + net.minecraft.client.Minecraft mc = + net.minecraft.client.Minecraft.getInstance(); if (mc.level == null) return; - net.minecraft.world.entity.Entity entity = mc.level.getEntity(pkt.entityId); + net.minecraft.world.entity.Entity entity = mc.level.getEntity( + pkt.entityId + ); if (entity instanceof EntityMaster master) { // Apply state sync // Note: Client-side state is read-only via synced entity data diff --git a/src/main/java/com/tiedup/remake/network/minigame/PacketContinuousStruggleState.java b/src/main/java/com/tiedup/remake/network/minigame/PacketContinuousStruggleState.java index 5253718..27c5cfa 100644 --- a/src/main/java/com/tiedup/remake/network/minigame/PacketContinuousStruggleState.java +++ b/src/main/java/com/tiedup/remake/network/minigame/PacketContinuousStruggleState.java @@ -78,8 +78,10 @@ public class PacketContinuousStruggleState extends AbstractClientPacket { @OnlyIn(Dist.CLIENT) private static class ClientHandler { + private static void handle(PacketContinuousStruggleState pkt) { - net.minecraft.client.Minecraft mc = net.minecraft.client.Minecraft.getInstance(); + net.minecraft.client.Minecraft mc = + net.minecraft.client.Minecraft.getInstance(); if (mc.player == null) { TiedUpMod.LOGGER.warn( "[PacketContinuousStruggleState] Player is null, cannot handle packet" @@ -113,35 +115,40 @@ public class PacketContinuousStruggleState extends AbstractClientPacket { } case DIRECTION_CHANGE -> { if ( - mc.screen instanceof com.tiedup.remake.client.gui.screens.ContinuousStruggleMiniGameScreen screen + mc.screen instanceof + com.tiedup.remake.client.gui.screens.ContinuousStruggleMiniGameScreen screen ) { screen.onDirectionChange(pkt.currentDirection); } } case RESISTANCE_UPDATE -> { if ( - mc.screen instanceof com.tiedup.remake.client.gui.screens.ContinuousStruggleMiniGameScreen screen + mc.screen instanceof + com.tiedup.remake.client.gui.screens.ContinuousStruggleMiniGameScreen screen ) { screen.onResistanceUpdate(pkt.currentResistance); } } case SHOCK -> { if ( - mc.screen instanceof com.tiedup.remake.client.gui.screens.ContinuousStruggleMiniGameScreen screen + mc.screen instanceof + com.tiedup.remake.client.gui.screens.ContinuousStruggleMiniGameScreen screen ) { screen.onShock(); } } case ESCAPE -> { if ( - mc.screen instanceof com.tiedup.remake.client.gui.screens.ContinuousStruggleMiniGameScreen screen + mc.screen instanceof + com.tiedup.remake.client.gui.screens.ContinuousStruggleMiniGameScreen screen ) { screen.onEscape(); } } case END -> { if ( - mc.screen instanceof com.tiedup.remake.client.gui.screens.ContinuousStruggleMiniGameScreen screen + mc.screen instanceof + com.tiedup.remake.client.gui.screens.ContinuousStruggleMiniGameScreen screen ) { screen.onEnd(); } diff --git a/src/main/java/com/tiedup/remake/network/minigame/PacketLockpickAttempt.java b/src/main/java/com/tiedup/remake/network/minigame/PacketLockpickAttempt.java index d0a3340..af45b29 100644 --- a/src/main/java/com/tiedup/remake/network/minigame/PacketLockpickAttempt.java +++ b/src/main/java/com/tiedup/remake/network/minigame/PacketLockpickAttempt.java @@ -3,11 +3,6 @@ package com.tiedup.remake.network.minigame; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.items.ItemLockpick; import com.tiedup.remake.items.base.ILockable; -import com.tiedup.remake.v2.BodyRegionV2; -import com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper; -import com.tiedup.remake.v2.furniture.EntityFurniture; -import com.tiedup.remake.v2.furniture.FurnitureDefinition; -import com.tiedup.remake.v2.furniture.network.PacketSyncFurnitureState; import com.tiedup.remake.minigame.LockpickMiniGameState; import com.tiedup.remake.minigame.LockpickMiniGameState.PickAttemptResult; import com.tiedup.remake.minigame.LockpickSessionManager; @@ -15,6 +10,11 @@ import com.tiedup.remake.network.ModNetwork; import com.tiedup.remake.network.PacketRateLimiter; import com.tiedup.remake.network.sync.SyncManager; import com.tiedup.remake.state.PlayerBindState; +import com.tiedup.remake.v2.BodyRegionV2; +import com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper; +import com.tiedup.remake.v2.furniture.EntityFurniture; +import com.tiedup.remake.v2.furniture.FurnitureDefinition; +import com.tiedup.remake.v2.furniture.network.PacketSyncFurnitureState; import java.util.UUID; import java.util.function.Supplier; import net.minecraft.ChatFormatting; @@ -118,14 +118,18 @@ public class PacketLockpickAttempt { // Check for furniture lockpick context FIRST — if present, this is a // furniture seat lockpick, not a body item lockpick. The context tag is // written by PacketFurnitureEscape.handleLockpick() when starting the session. - CompoundTag furnitureCtx = player.getPersistentData() + CompoundTag furnitureCtx = player + .getPersistentData() .getCompound("tiedup_furniture_lockpick_ctx"); if (furnitureCtx != null && furnitureCtx.contains("furniture_id")) { // H18: Distance check BEFORE ending session — prevents consuming session // without reward if player moved away (reviewer H18 RISK-001) int furnitureId = furnitureCtx.getInt("furniture_id"); Entity furnitureEntity = player.level().getEntity(furnitureId); - if (furnitureEntity == null || player.distanceTo(furnitureEntity) > 10.0) { + if ( + furnitureEntity == null || + player.distanceTo(furnitureEntity) > 10.0 + ) { return; } @@ -256,7 +260,9 @@ public class PacketLockpickAttempt { if (passenger != null) { // Clear reconnection tag before dismount if (passenger instanceof ServerPlayer passengerPlayer) { - passengerPlayer.getPersistentData().remove("tiedup_locked_furniture"); + passengerPlayer + .getPersistentData() + .remove("tiedup_locked_furniture"); } passenger.stopRiding(); } @@ -264,12 +270,20 @@ public class PacketLockpickAttempt { // Play unlock sound from the furniture definition FurnitureDefinition def = furniture.getDefinition(); if (def != null && def.feedback().unlockSound() != null) { - player.level().playSound( - null, - entity.getX(), entity.getY(), entity.getZ(), - SoundEvent.createVariableRangeEvent(def.feedback().unlockSound()), - SoundSource.BLOCKS, 1.0f, 1.0f - ); + player + .level() + .playSound( + null, + entity.getX(), + entity.getY(), + entity.getZ(), + SoundEvent.createVariableRangeEvent( + def.feedback().unlockSound() + ), + SoundSource.BLOCKS, + 1.0f, + 1.0f + ); } // Broadcast updated lock/anim state to all tracking clients @@ -277,7 +291,9 @@ public class PacketLockpickAttempt { TiedUpMod.LOGGER.info( "[PacketLockpickAttempt] Player {} picked furniture lock on entity {} seat '{}'", - player.getName().getString(), furnitureEntityId, seatId + player.getName().getString(), + furnitureEntityId, + seatId ); } @@ -337,7 +353,8 @@ public class PacketLockpickAttempt { // Check for JAM (5% chance on miss) — only applies to body item lockpick sessions. // Furniture seat locks do not have a jam mechanic (there is no ILockable item to jam). boolean jammed = false; - boolean isFurnitureSession = player.getPersistentData() + boolean isFurnitureSession = player + .getPersistentData() .getCompound("tiedup_furniture_lockpick_ctx") .contains("furniture_id"); @@ -419,7 +436,9 @@ public class PacketLockpickAttempt { ItemStack lockpickStack = ItemLockpick.findLockpickInInventory(player); if (!lockpickStack.isEmpty()) { lockpickStack.setDamageValue(lockpickStack.getDamageValue() + 1); - if (lockpickStack.getDamageValue() >= lockpickStack.getMaxDamage()) { + if ( + lockpickStack.getDamageValue() >= lockpickStack.getMaxDamage() + ) { lockpickStack.shrink(1); } } @@ -430,7 +449,8 @@ public class PacketLockpickAttempt { if (state == null) return; ItemStack collar = V2EquipmentHelper.getInRegion( - player, BodyRegionV2.NECK + player, + BodyRegionV2.NECK ); if (collar.isEmpty()) return; diff --git a/src/main/java/com/tiedup/remake/network/minigame/PacketLockpickMiniGameMove.java b/src/main/java/com/tiedup/remake/network/minigame/PacketLockpickMiniGameMove.java index bd0a4a4..a767164 100644 --- a/src/main/java/com/tiedup/remake/network/minigame/PacketLockpickMiniGameMove.java +++ b/src/main/java/com/tiedup/remake/network/minigame/PacketLockpickMiniGameMove.java @@ -10,7 +10,6 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraftforge.network.NetworkEvent; /** - * Phase 2: Packet for player position update during lockpick mini-game (Client to Server). * * Contains: * - Session UUID diff --git a/src/main/java/com/tiedup/remake/network/minigame/PacketLockpickMiniGameResult.java b/src/main/java/com/tiedup/remake/network/minigame/PacketLockpickMiniGameResult.java index a786f5a..33a2be5 100644 --- a/src/main/java/com/tiedup/remake/network/minigame/PacketLockpickMiniGameResult.java +++ b/src/main/java/com/tiedup/remake/network/minigame/PacketLockpickMiniGameResult.java @@ -8,7 +8,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; /** - * Phase 2: Packet to send lockpick result to client (Server to Client). * * Contains: * - Session UUID @@ -112,8 +111,10 @@ public class PacketLockpickMiniGameResult extends AbstractClientPacket { @OnlyIn(Dist.CLIENT) private static class ClientHandler { + private static void handle(PacketLockpickMiniGameResult pkt) { - net.minecraft.client.Minecraft mc = net.minecraft.client.Minecraft.getInstance(); + net.minecraft.client.Minecraft mc = + net.minecraft.client.Minecraft.getInstance(); if (mc.player == null) { return; } @@ -124,10 +125,16 @@ public class PacketLockpickMiniGameResult extends AbstractClientPacket { pkt.remainingUses ); - if (mc.screen instanceof com.tiedup.remake.client.gui.screens.LockpickMiniGameScreen screen) { + if ( + mc.screen instanceof + com.tiedup.remake.client.gui.screens.LockpickMiniGameScreen screen + ) { switch (pkt.resultType) { case SUCCESS -> screen.onSuccess(); - case MISSED -> screen.onMissed(pkt.remainingUses, pkt.distance); + case MISSED -> screen.onMissed( + pkt.remainingUses, + pkt.distance + ); case OUT_OF_PICKS -> screen.onOutOfPicks(); case CANCELLED -> screen.onCancelled(); } diff --git a/src/main/java/com/tiedup/remake/network/minigame/PacketLockpickMiniGameStart.java b/src/main/java/com/tiedup/remake/network/minigame/PacketLockpickMiniGameStart.java index 361efe0..bafac97 100644 --- a/src/main/java/com/tiedup/remake/network/minigame/PacketLockpickMiniGameStart.java +++ b/src/main/java/com/tiedup/remake/network/minigame/PacketLockpickMiniGameStart.java @@ -17,7 +17,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraftforge.network.NetworkEvent; /** - * Phase 2: Packet to start a Lockpick mini-game session (Client to Server). * * Sent when player clicks "Lockpick" on a locked item. */ @@ -34,7 +33,9 @@ public class PacketLockpickMiniGameStart { } public static PacketLockpickMiniGameStart decode(FriendlyByteBuf buf) { - return new PacketLockpickMiniGameStart(buf.readEnum(BodyRegionV2.class)); + return new PacketLockpickMiniGameStart( + buf.readEnum(BodyRegionV2.class) + ); } public void handle(Supplier ctx) { diff --git a/src/main/java/com/tiedup/remake/network/minigame/PacketLockpickMiniGameState.java b/src/main/java/com/tiedup/remake/network/minigame/PacketLockpickMiniGameState.java index a3bb13b..b56696b 100644 --- a/src/main/java/com/tiedup/remake/network/minigame/PacketLockpickMiniGameState.java +++ b/src/main/java/com/tiedup/remake/network/minigame/PacketLockpickMiniGameState.java @@ -8,7 +8,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; /** - * Phase 2: Packet to send lockpick initial state to client (Server to Client). * * Contains: * - Session UUID @@ -69,8 +68,10 @@ public class PacketLockpickMiniGameState extends AbstractClientPacket { @OnlyIn(Dist.CLIENT) private static class ClientHandler { + private static void handle(PacketLockpickMiniGameState pkt) { - net.minecraft.client.Minecraft mc = net.minecraft.client.Minecraft.getInstance(); + net.minecraft.client.Minecraft mc = + net.minecraft.client.Minecraft.getInstance(); if (mc.player == null) { return; } diff --git a/src/main/java/com/tiedup/remake/network/personality/NpcCommandType.java b/src/main/java/com/tiedup/remake/network/personality/NpcCommandType.java index 0c33c96..1332716 100644 --- a/src/main/java/com/tiedup/remake/network/personality/NpcCommandType.java +++ b/src/main/java/com/tiedup/remake/network/personality/NpcCommandType.java @@ -9,5 +9,5 @@ public enum NpcCommandType { CANCEL_COMMAND, SELECT_JOB, CYCLE_FOLLOW_DISTANCE, - TOGGLE_AUTO_REST + TOGGLE_AUTO_REST, } diff --git a/src/main/java/com/tiedup/remake/network/personality/PacketNpcCommand.java b/src/main/java/com/tiedup/remake/network/personality/PacketNpcCommand.java index cf5ca07..72adc86 100644 --- a/src/main/java/com/tiedup/remake/network/personality/PacketNpcCommand.java +++ b/src/main/java/com/tiedup/remake/network/personality/PacketNpcCommand.java @@ -17,7 +17,6 @@ import com.tiedup.remake.personality.PersonalityState; import com.tiedup.remake.v2.BodyRegionV2; import java.util.UUID; import java.util.function.Supplier; -import org.jetbrains.annotations.Nullable; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; @@ -25,6 +24,7 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.Entity; import net.minecraft.world.item.ItemStack; import net.minecraftforge.network.NetworkEvent; +import org.jetbrains.annotations.Nullable; /** * Unified C2S packet for all NPC command wand actions. @@ -39,35 +39,82 @@ public class PacketNpcCommand { private final NpcCommandType type; // Optional fields depending on type - private final String commandName; // GIVE_COMMAND, SELECT_JOB + private final String commandName; // GIVE_COMMAND, SELECT_JOB + @Nullable - private final BlockPos targetPos; // GIVE_COMMAND only - private final boolean refreshScreen; // CYCLE_FOLLOW_DISTANCE, TOGGLE_AUTO_REST + private final BlockPos targetPos; // GIVE_COMMAND only + + private final boolean refreshScreen; // CYCLE_FOLLOW_DISTANCE, TOGGLE_AUTO_REST // --- Constructors for each command type --- - public static PacketNpcCommand giveCommand(UUID entityUUID, NpcCommand command, @Nullable BlockPos targetPos) { - return new PacketNpcCommand(entityUUID, NpcCommandType.GIVE_COMMAND, command.name(), targetPos, false); + public static PacketNpcCommand giveCommand( + UUID entityUUID, + NpcCommand command, + @Nullable BlockPos targetPos + ) { + return new PacketNpcCommand( + entityUUID, + NpcCommandType.GIVE_COMMAND, + command.name(), + targetPos, + false + ); } public static PacketNpcCommand cancelCommand(UUID entityUUID) { - return new PacketNpcCommand(entityUUID, NpcCommandType.CANCEL_COMMAND, "", null, false); + return new PacketNpcCommand( + entityUUID, + NpcCommandType.CANCEL_COMMAND, + "", + null, + false + ); } public static PacketNpcCommand selectJob(UUID entityUUID, NpcCommand job) { - return new PacketNpcCommand(entityUUID, NpcCommandType.SELECT_JOB, job.name(), null, false); + return new PacketNpcCommand( + entityUUID, + NpcCommandType.SELECT_JOB, + job.name(), + null, + false + ); } - public static PacketNpcCommand cycleFollowDistance(UUID entityUUID, boolean refreshScreen) { - return new PacketNpcCommand(entityUUID, NpcCommandType.CYCLE_FOLLOW_DISTANCE, "", null, refreshScreen); + public static PacketNpcCommand cycleFollowDistance( + UUID entityUUID, + boolean refreshScreen + ) { + return new PacketNpcCommand( + entityUUID, + NpcCommandType.CYCLE_FOLLOW_DISTANCE, + "", + null, + refreshScreen + ); } - public static PacketNpcCommand toggleAutoRest(UUID entityUUID, boolean refreshScreen) { - return new PacketNpcCommand(entityUUID, NpcCommandType.TOGGLE_AUTO_REST, "", null, refreshScreen); + public static PacketNpcCommand toggleAutoRest( + UUID entityUUID, + boolean refreshScreen + ) { + return new PacketNpcCommand( + entityUUID, + NpcCommandType.TOGGLE_AUTO_REST, + "", + null, + refreshScreen + ); } - private PacketNpcCommand(UUID entityUUID, NpcCommandType type, String commandName, - @Nullable BlockPos targetPos, boolean refreshScreen) { + private PacketNpcCommand( + UUID entityUUID, + NpcCommandType type, + String commandName, + @Nullable BlockPos targetPos, + boolean refreshScreen + ) { this.entityUUID = entityUUID; this.type = type; this.commandName = commandName; @@ -89,8 +136,11 @@ public class PacketNpcCommand { } } case SELECT_JOB -> buf.writeUtf(commandName); - case CYCLE_FOLLOW_DISTANCE, TOGGLE_AUTO_REST -> buf.writeBoolean(refreshScreen); - case CANCEL_COMMAND -> {} // no extra data + case CYCLE_FOLLOW_DISTANCE, TOGGLE_AUTO_REST -> buf.writeBoolean( + refreshScreen + ); + case CANCEL_COMMAND -> { + } // no extra data } } @@ -109,19 +159,23 @@ public class PacketNpcCommand { } } case SELECT_JOB -> cmd = buf.readUtf(32); - case CYCLE_FOLLOW_DISTANCE, TOGGLE_AUTO_REST -> refresh = buf.readBoolean(); - case CANCEL_COMMAND -> {} + case CYCLE_FOLLOW_DISTANCE, TOGGLE_AUTO_REST -> refresh = + buf.readBoolean(); + case CANCEL_COMMAND -> { + } } return new PacketNpcCommand(uuid, type, cmd, pos, refresh); } public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { - ServerPlayer sender = ctx.get().getSender(); - if (sender == null) return; - handleServer(sender); - }); + ctx + .get() + .enqueueWork(() -> { + ServerPlayer sender = ctx.get().getSender(); + if (sender == null) return; + handleServer(sender); + }); ctx.get().setPacketHandled(true); } @@ -130,17 +184,25 @@ public class PacketNpcCommand { private void handleServer(ServerPlayer sender) { if (!PacketRateLimiter.allowPacket(sender, "action")) return; - Entity entity = ((net.minecraft.server.level.ServerLevel) sender.level()).getEntity(entityUUID); + Entity entity = ( + (net.minecraft.server.level.ServerLevel) sender.level() + ).getEntity(entityUUID); if (!(entity instanceof EntityDamsel damsel)) { - TiedUpMod.LOGGER.warn("[PacketNpcCommand:{}] Entity {} not found or not a Damsel", - type, entityUUID); + TiedUpMod.LOGGER.warn( + "[PacketNpcCommand:{}] Entity {} not found or not a Damsel", + type, + entityUUID + ); return; } double distance = sender.distanceTo(damsel); if (distance > MAX_COMMAND_RANGE) { - SystemMessageManager.sendToPlayer(sender, - SystemMessageManager.MessageCategory.ERROR, "Target is too far away!"); + SystemMessageManager.sendToPlayer( + sender, + SystemMessageManager.MessageCategory.ERROR, + "Target is too far away!" + ); return; } @@ -148,7 +210,10 @@ public class PacketNpcCommand { case GIVE_COMMAND -> handleGiveCommand(sender, damsel); case CANCEL_COMMAND -> handleCancelCommand(sender, damsel); case SELECT_JOB -> handleSelectJob(sender, damsel); - case CYCLE_FOLLOW_DISTANCE -> handleCycleFollowDistance(sender, damsel); + case CYCLE_FOLLOW_DISTANCE -> handleCycleFollowDistance( + sender, + damsel + ); case TOGGLE_AUTO_REST -> handleToggleAutoRest(sender, damsel); } } @@ -156,19 +221,32 @@ public class PacketNpcCommand { private void handleGiveCommand(ServerPlayer sender, EntityDamsel damsel) { NpcCommand command = NpcCommand.fromString(commandName); if (command == NpcCommand.NONE && !"NONE".equals(commandName)) { - TiedUpMod.LOGGER.warn("[PacketNpcCommand:GIVE] Unknown command: {}", commandName); + TiedUpMod.LOGGER.warn( + "[PacketNpcCommand:GIVE] Unknown command: {}", + commandName + ); return; } boolean success = damsel.giveCommand(sender, command, targetPos); String npcName = damsel.getNpcName(); if (success) { - EntityDialogueManager.talkTo(damsel, sender, DialogueCategory.COMMAND_ACCEPT); - SystemMessageManager.sendToPlayer(sender, - SystemMessageManager.MessageCategory.INFO, - npcName + " accepted command: " + command.name()); - TiedUpMod.LOGGER.debug("[PacketNpcCommand:GIVE] {} gave command {} to {}", - sender.getName().getString(), command.name(), npcName); + EntityDialogueManager.talkTo( + damsel, + sender, + DialogueCategory.COMMAND_ACCEPT + ); + SystemMessageManager.sendToPlayer( + sender, + SystemMessageManager.MessageCategory.INFO, + npcName + " accepted command: " + command.name() + ); + TiedUpMod.LOGGER.debug( + "[PacketNpcCommand:GIVE] {} gave command {} to {}", + sender.getName().getString(), + command.name(), + npcName + ); } } @@ -177,16 +255,25 @@ public class PacketNpcCommand { damsel.cancelCommand(); String npcName = damsel.getNpcName(); - SystemMessageManager.sendToPlayer(sender, - SystemMessageManager.MessageCategory.INFO, npcName + "'s command cancelled."); - TiedUpMod.LOGGER.debug("[PacketNpcCommand:CANCEL] {} cancelled command for {}", - sender.getName().getString(), npcName); + SystemMessageManager.sendToPlayer( + sender, + SystemMessageManager.MessageCategory.INFO, + npcName + "'s command cancelled." + ); + TiedUpMod.LOGGER.debug( + "[PacketNpcCommand:CANCEL] {} cancelled command for {}", + sender.getName().getString(), + npcName + ); } private void handleSelectJob(ServerPlayer sender, EntityDamsel damsel) { NpcCommand job = NpcCommand.fromString(commandName); if (!job.isWorkCommand()) { - TiedUpMod.LOGGER.warn("[PacketNpcCommand:JOB] {} is not a work command", commandName); + TiedUpMod.LOGGER.warn( + "[PacketNpcCommand:JOB] {} is not a work command", + commandName + ); return; } @@ -195,7 +282,9 @@ public class PacketNpcCommand { String npcName = damsel.getNpcName(); if (state.willObeyCommand(sender, job)) { - ItemStack mainHand = sender.getItemInHand(InteractionHand.MAIN_HAND); + ItemStack mainHand = sender.getItemInHand( + InteractionHand.MAIN_HAND + ); ItemStack offHand = sender.getItemInHand(InteractionHand.OFF_HAND); ItemStack wand = null; @@ -207,17 +296,32 @@ public class PacketNpcCommand { if (wand != null) { ItemCommandWand.enterSelectionMode(wand, damsel.getUUID(), job); - EntityDialogueManager.talkTo(damsel, sender, DialogueCategory.COMMAND_ACCEPT); - SystemMessageManager.sendToPlayer(sender, - SystemMessageManager.MessageCategory.INFO, - npcName + " is ready to " + job.name() + ". Click a chest to set work zone!"); - TiedUpMod.LOGGER.debug("[PacketNpcCommand:JOB] {} accepted job {} - wand in selection mode", - npcName, job.name()); + EntityDialogueManager.talkTo( + damsel, + sender, + DialogueCategory.COMMAND_ACCEPT + ); + SystemMessageManager.sendToPlayer( + sender, + SystemMessageManager.MessageCategory.INFO, + npcName + + " is ready to " + + job.name() + + ". Click a chest to set work zone!" + ); + TiedUpMod.LOGGER.debug( + "[PacketNpcCommand:JOB] {} accepted job {} - wand in selection mode", + npcName, + job.name() + ); } } } - private void handleCycleFollowDistance(ServerPlayer sender, EntityDamsel damsel) { + private void handleCycleFollowDistance( + ServerPlayer sender, + EntityDamsel damsel + ) { if (!validateCollarOwnership(sender, damsel)) return; PersonalityState state = damsel.getPersonalityState(); @@ -231,26 +335,39 @@ public class PacketNpcCommand { }; state.setFollowDistance(next); - TiedUpMod.LOGGER.debug("[PacketNpcCommand:FOLLOW] {} changed {} follow distance to {}", - sender.getName().getString(), damsel.getNpcName(), next.name()); + TiedUpMod.LOGGER.debug( + "[PacketNpcCommand:FOLLOW] {} changed {} follow distance to {}", + sender.getName().getString(), + damsel.getNpcName(), + next.name() + ); if (refreshScreen) { sendRefreshedScreen(sender, damsel, state); } } - private void handleToggleAutoRest(ServerPlayer sender, EntityDamsel damsel) { + private void handleToggleAutoRest( + ServerPlayer sender, + EntityDamsel damsel + ) { if (!validateCollarOwnership(sender, damsel)) return; PersonalityState state = damsel.getPersonalityState(); if (state == null) return; boolean newState = state.toggleAutoRest(); - TiedUpMod.LOGGER.debug("[PacketNpcCommand:REST] {} toggled {} auto-rest to {}", - sender.getName().getString(), damsel.getNpcName(), newState ? "ON" : "OFF"); - SystemMessageManager.sendToPlayer(sender, - SystemMessageManager.MessageCategory.INFO, - "Auto-Rest: " + (newState ? "ON" : "OFF")); + TiedUpMod.LOGGER.debug( + "[PacketNpcCommand:REST] {} toggled {} auto-rest to {}", + sender.getName().getString(), + damsel.getNpcName(), + newState ? "ON" : "OFF" + ); + SystemMessageManager.sendToPlayer( + sender, + SystemMessageManager.MessageCategory.INFO, + "Auto-Rest: " + (newState ? "ON" : "OFF") + ); if (refreshScreen) { sendRefreshedScreen(sender, damsel, state); @@ -259,11 +376,16 @@ public class PacketNpcCommand { // --- Shared helpers --- - private boolean validateCollarOwnership(ServerPlayer sender, EntityDamsel damsel) { + private boolean validateCollarOwnership( + ServerPlayer sender, + EntityDamsel damsel + ) { if (!damsel.hasCollar()) { - SystemMessageManager.sendToPlayer(sender, - SystemMessageManager.MessageCategory.ERROR, - damsel.getNpcName() + " is not wearing a collar!"); + SystemMessageManager.sendToPlayer( + sender, + SystemMessageManager.MessageCategory.ERROR, + damsel.getNpcName() + " is not wearing a collar!" + ); return false; } @@ -273,17 +395,22 @@ public class PacketNpcCommand { } if (!collarItem.getOwners(collar).contains(sender.getUUID())) { - SystemMessageManager.sendToPlayer(sender, - SystemMessageManager.MessageCategory.ERROR, - "You don't own " + damsel.getNpcName() + "'s collar!"); + SystemMessageManager.sendToPlayer( + sender, + SystemMessageManager.MessageCategory.ERROR, + "You don't own " + damsel.getNpcName() + "'s collar!" + ); return false; } return true; } - private static void sendRefreshedScreen(ServerPlayer sender, EntityDamsel damsel, - PersonalityState state) { + private static void sendRefreshedScreen( + ServerPlayer sender, + EntityDamsel damsel, + PersonalityState state + ) { NpcNeeds needs = state.getNeeds(); String homeType = state.getHomeType().name(); @@ -300,13 +427,24 @@ public class PacketNpcCommand { } ModNetwork.sendToPlayer( - new PacketOpenCommandWandScreen( - damsel.getUUID(), damsel.getNpcName(), - state.getPersonality().name(), activeCmd.name(), - needs.getHunger(), needs.getRest(), state.getMood(), - state.getFollowDistance().name(), homeType, - state.isAutoRestEnabled(), "", "", - activeJobLevelName, activeJobXp, activeJobXpMax), - sender); + new PacketOpenCommandWandScreen( + damsel.getUUID(), + damsel.getNpcName(), + state.getPersonality().name(), + activeCmd.name(), + needs.getHunger(), + needs.getRest(), + state.getMood(), + state.getFollowDistance().name(), + homeType, + state.isAutoRestEnabled(), + "", + "", + activeJobLevelName, + activeJobXp, + activeJobXpMax + ), + sender + ); } } diff --git a/src/main/java/com/tiedup/remake/network/personality/PacketRequestNpcInventory.java b/src/main/java/com/tiedup/remake/network/personality/PacketRequestNpcInventory.java index dd288a4..6c4da6a 100644 --- a/src/main/java/com/tiedup/remake/network/personality/PacketRequestNpcInventory.java +++ b/src/main/java/com/tiedup/remake/network/personality/PacketRequestNpcInventory.java @@ -1,9 +1,9 @@ package com.tiedup.remake.network.personality; import com.tiedup.remake.core.TiedUpMod; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.entities.EntityDamsel; import com.tiedup.remake.network.PacketRateLimiter; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.function.Supplier; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; diff --git a/src/main/java/com/tiedup/remake/network/personality/PacketSlaveBeingFreed.java b/src/main/java/com/tiedup/remake/network/personality/PacketSlaveBeingFreed.java index cc4b7a3..301a96b 100644 --- a/src/main/java/com/tiedup/remake/network/personality/PacketSlaveBeingFreed.java +++ b/src/main/java/com/tiedup/remake/network/personality/PacketSlaveBeingFreed.java @@ -14,7 +14,6 @@ import net.minecraftforge.network.NetworkEvent; * Packet sent from server to client to alert an owner that someone * is trying to free their slave. * - * Phase 11: Multiplayer protection system */ public class PacketSlaveBeingFreed { diff --git a/src/main/java/com/tiedup/remake/network/selfbondage/PacketSelfBondage.java b/src/main/java/com/tiedup/remake/network/selfbondage/PacketSelfBondage.java index 62afb50..1eb0fed 100644 --- a/src/main/java/com/tiedup/remake/network/selfbondage/PacketSelfBondage.java +++ b/src/main/java/com/tiedup/remake/network/selfbondage/PacketSelfBondage.java @@ -1,5 +1,6 @@ package com.tiedup.remake.network.selfbondage; +import com.tiedup.remake.core.SettingsAccessor; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.items.base.*; import com.tiedup.remake.network.ModNetwork; @@ -12,7 +13,6 @@ import com.tiedup.remake.tasks.TyingPlayerTask; import com.tiedup.remake.tasks.TyingTask; import com.tiedup.remake.tasks.V2TyingPlayerTask; import com.tiedup.remake.util.KidnappedHelper; -import com.tiedup.remake.core.SettingsAccessor; import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.v2.bondage.IV2BondageItem; import com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper; @@ -225,8 +225,10 @@ public class PacketSelfBondage { // Check if all target regions are already occupied or blocked boolean allBlocked = true; for (BodyRegionV2 region : v2Item.getOccupiedRegions(stack)) { - if (!V2EquipmentHelper.isRegionOccupied(player, region) - && !V2EquipmentHelper.isRegionBlocked(player, region)) { + if ( + !V2EquipmentHelper.isRegionOccupied(player, region) && + !V2EquipmentHelper.isRegionBlocked(player, region) + ) { allBlocked = false; break; } @@ -248,21 +250,23 @@ public class PacketSelfBondage { // Create V2 tying task (uses V2EquipmentHelper on completion, NOT putBindOn) V2TyingPlayerTask newTask = new V2TyingPlayerTask( - stack.copy(), // copy for display/matching - stack, // live reference for consumption + stack.copy(), // copy for display/matching + stack, // live reference for consumption state, - player, // target is self + player, // target is self tyingSeconds, player.level(), - player // kidnapper is also self + player // kidnapper is also self ); TyingTask currentTask = playerState.getCurrentTyingTask(); - if (currentTask == null - || !currentTask.isSameTarget(player) - || currentTask.isOutdated() - || !ItemStack.matches(currentTask.getBind(), stack)) { + if ( + currentTask == null || + !currentTask.isSameTarget(player) || + currentTask.isOutdated() || + !ItemStack.matches(currentTask.getBind(), stack) + ) { // Start new task playerState.setCurrentTyingTask(newTask); newTask.start(); diff --git a/src/main/java/com/tiedup/remake/network/slave/PacketMasterEquip.java b/src/main/java/com/tiedup/remake/network/slave/PacketMasterEquip.java index 3072a8f..daccf5f 100644 --- a/src/main/java/com/tiedup/remake/network/slave/PacketMasterEquip.java +++ b/src/main/java/com/tiedup/remake/network/slave/PacketMasterEquip.java @@ -25,7 +25,11 @@ public class PacketMasterEquip { private final BodyRegionV2 region; private final int inventorySlot; - public PacketMasterEquip(UUID targetEntityUUID, BodyRegionV2 region, int inventorySlot) { + public PacketMasterEquip( + UUID targetEntityUUID, + BodyRegionV2 region, + int inventorySlot + ) { this.targetEntityUUID = targetEntityUUID; this.region = region; this.inventorySlot = inventorySlot; @@ -38,10 +42,17 @@ public class PacketMasterEquip { } public static PacketMasterEquip decode(FriendlyByteBuf buf) { - return new PacketMasterEquip(buf.readUUID(), buf.readEnum(BodyRegionV2.class), buf.readVarInt()); + return new PacketMasterEquip( + buf.readUUID(), + buf.readEnum(BodyRegionV2.class), + buf.readVarInt() + ); } - public static void handle(PacketMasterEquip msg, Supplier ctxSupplier) { + public static void handle( + PacketMasterEquip msg, + Supplier ctxSupplier + ) { NetworkEvent.Context ctx = ctxSupplier.get(); ctx.enqueueWork(() -> { ServerPlayer sender = ctx.getSender(); @@ -49,31 +60,53 @@ public class PacketMasterEquip { if (!PacketRateLimiter.allowPacket(sender, "action")) return; // Find target entity (reuse package-private method from PacketSlaveItemManage) - LivingEntity target = PacketSlaveItemManage.findTargetEntity(sender, msg.targetEntityUUID); + LivingEntity target = PacketSlaveItemManage.findTargetEntity( + sender, + msg.targetEntityUUID + ); if (target == null) return; // Distance check (5 blocks) if (sender.distanceTo(target) > 5.0f) return; // Collar ownership check - IBondageState targetState = KidnappedHelper.getKidnappedState(target); + IBondageState targetState = KidnappedHelper.getKidnappedState( + target + ); if (targetState == null || !targetState.hasCollar()) return; ItemStack collarStack = targetState.getEquipment(BodyRegionV2.NECK); if (collarStack.getItem() instanceof ItemCollar collar) { - if (!collar.isOwner(collarStack, sender) && !sender.hasPermissions(2)) return; + if ( + !collar.isOwner(collarStack, sender) && + !sender.hasPermissions(2) + ) return; } // Validate sender's inventory slot - if (msg.inventorySlot < 0 || msg.inventorySlot >= sender.getInventory().getContainerSize()) return; + if ( + msg.inventorySlot < 0 || + msg.inventorySlot >= sender.getInventory().getContainerSize() + ) return; ItemStack stack = sender.getInventory().getItem(msg.inventorySlot); if (stack.isEmpty()) return; - if (!(stack.getItem() instanceof IV2BondageItem bondageItem)) return; - if (!bondageItem.getOccupiedRegions(stack).contains(msg.region)) return; + if ( + !(stack.getItem() instanceof IV2BondageItem bondageItem) + ) return; + if ( + !bondageItem.getOccupiedRegions(stack).contains(msg.region) + ) return; // Furniture seat blocks this region - if (target.isPassenger() && target.getVehicle() instanceof com.tiedup.remake.v2.furniture.ISeatProvider provider) { - com.tiedup.remake.v2.furniture.SeatDefinition seat = provider.getSeatForPassenger(target); - if (seat != null && seat.blockedRegions().contains(msg.region)) { + if ( + target.isPassenger() && + target.getVehicle() instanceof + com.tiedup.remake.v2.furniture.ISeatProvider provider + ) { + com.tiedup.remake.v2.furniture.SeatDefinition seat = + provider.getSeatForPassenger(target); + if ( + seat != null && seat.blockedRegions().contains(msg.region) + ) { return; // Region blocked by furniture } } @@ -86,7 +119,9 @@ public class PacketMasterEquip { if (result.displaced() != null) { for (ItemStack displaced : result.displaced()) { if (!displaced.isEmpty()) { - sender.getInventory().placeItemBackInInventory(displaced); + sender + .getInventory() + .placeItemBackInInventory(displaced); } } } diff --git a/src/main/java/com/tiedup/remake/network/slave/PacketSlaveAction.java b/src/main/java/com/tiedup/remake/network/slave/PacketSlaveAction.java index 1bdfd68..25bfbc8 100644 --- a/src/main/java/com/tiedup/remake/network/slave/PacketSlaveAction.java +++ b/src/main/java/com/tiedup/remake/network/slave/PacketSlaveAction.java @@ -1,7 +1,6 @@ package com.tiedup.remake.network.slave; import com.tiedup.remake.core.SystemMessageManager; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.items.ItemGpsCollar; import com.tiedup.remake.items.ItemShockCollar; @@ -11,6 +10,7 @@ import com.tiedup.remake.state.IRestrainable; import com.tiedup.remake.state.PlayerBindState; import com.tiedup.remake.state.PlayerCaptorManager; import com.tiedup.remake.util.KidnappedHelper; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.UUID; import java.util.function.Supplier; import net.minecraft.ChatFormatting; @@ -25,7 +25,6 @@ import net.minecraftforge.network.NetworkEvent; * Packet for slave management actions from SlaveManagementScreen. * Handles: SHOCK, LOCATE, FREE actions on owned slaves. * - * Phase 16: GUI Revamp - Slave management packets * * Security: Distance and dimension validation added to prevent griefing */ @@ -92,7 +91,6 @@ public class PacketSlaveAction { return; } - // Phase 17: PlayerKidnapperManager → PlayerCaptorManager PlayerCaptorManager manager = senderState.getCaptorManager(); // Find the target - check both formal captives AND collar-owned entities @@ -103,8 +101,11 @@ public class PacketSlaveAction { if (manager != null && manager.hasCaptives()) { for (IBondageState captive : manager.getCaptives()) { LivingEntity entity = captive.asLivingEntity(); - if (entity != null && entity.getUUID().equals(targetId) - && captive instanceof IRestrainable r) { + if ( + entity != null && + entity.getUUID().equals(targetId) && + captive instanceof IRestrainable r + ) { targetCaptive = r; isFormalCaptive = true; break; @@ -124,7 +125,9 @@ public class PacketSlaveAction { entity ); if (kidnapped != null && kidnapped.hasCollar()) { - ItemStack collarStack = kidnapped.getEquipment(BodyRegionV2.NECK); + ItemStack collarStack = kidnapped.getEquipment( + BodyRegionV2.NECK + ); if (collarStack.getItem() instanceof ItemCollar collar) { if (collar.isOwner(collarStack, sender)) { targetCaptive = kidnapped; @@ -341,7 +344,6 @@ public class PacketSlaveAction { ); } - // Phase 17: PlayerKidnapperManager → PlayerCaptorManager, isFormalSlave → isFormalCaptive private void handleFree( ServerPlayer sender, IRestrainable target, diff --git a/src/main/java/com/tiedup/remake/network/slave/PacketSlaveItemManage.java b/src/main/java/com/tiedup/remake/network/slave/PacketSlaveItemManage.java index 3cbb7d3..f78c3bd 100644 --- a/src/main/java/com/tiedup/remake/network/slave/PacketSlaveItemManage.java +++ b/src/main/java/com/tiedup/remake/network/slave/PacketSlaveItemManage.java @@ -21,7 +21,6 @@ import net.minecraftforge.network.NetworkEvent; * Packet sent from client to server when master uses key to manage slave's items. * Handles LOCK, UNLOCK, and REMOVE operations using the keyUUID system. * - * Phase 20: Key-Lock System - Slave Item Management */ public class PacketSlaveItemManage { @@ -161,7 +160,9 @@ public class PacketSlaveItemManage { } // Security: Verify sender owns the collar (or is admin) - ItemStack collarStack = targetState.getEquipment(BodyRegionV2.NECK); + ItemStack collarStack = targetState.getEquipment( + BodyRegionV2.NECK + ); if ( collarStack.getItem() instanceof com.tiedup.remake.items.base.ItemCollar collar @@ -178,18 +179,23 @@ public class PacketSlaveItemManage { } // Furniture seat blocks this region - if (targetEntity.isPassenger() && targetEntity.getVehicle() instanceof com.tiedup.remake.v2.furniture.ISeatProvider provider) { - com.tiedup.remake.v2.furniture.SeatDefinition seat = provider.getSeatForPassenger(targetEntity); - if (seat != null && seat.blockedRegions().contains(msg.region)) { + if ( + targetEntity.isPassenger() && + targetEntity.getVehicle() instanceof + com.tiedup.remake.v2.furniture.ISeatProvider provider + ) { + com.tiedup.remake.v2.furniture.SeatDefinition seat = + provider.getSeatForPassenger(targetEntity); + if ( + seat != null && + seat.blockedRegions().contains(msg.region) + ) { return; // Region blocked by furniture } } // Get item from region (V2 storage) - ItemStack itemStack = getItemInRegion( - targetState, - msg.region - ); + ItemStack itemStack = getItemInRegion(targetState, msg.region); if (itemStack.isEmpty()) { TiedUpMod.LOGGER.debug( "[PacketSlaveItemManage] Region {} is empty", @@ -264,10 +270,7 @@ public class PacketSlaveItemManage { /** * Find target entity by UUID (player or NPC). */ - static LivingEntity findTargetEntity( - ServerPlayer sender, - UUID targetUUID - ) { + static LivingEntity findTargetEntity(ServerPlayer sender, UUID targetUUID) { // Try player first Player player = sender.level().getPlayerByUUID(targetUUID); if (player != null) { @@ -432,7 +435,6 @@ public class PacketSlaveItemManage { // Lock with keyUUID lockable.setLockedByKeyUUID(itemStack, keyUUID); - // Phase 21: Add lock resistance (configurable, default 250) to bind items when locked if ( region == BodyRegionV2.ARMS && itemStack.getItem() instanceof diff --git a/src/main/java/com/tiedup/remake/network/sync/PacketPlayTestAnimation.java b/src/main/java/com/tiedup/remake/network/sync/PacketPlayTestAnimation.java index 9044ed4..67337b5 100644 --- a/src/main/java/com/tiedup/remake/network/sync/PacketPlayTestAnimation.java +++ b/src/main/java/com/tiedup/remake/network/sync/PacketPlayTestAnimation.java @@ -40,11 +40,17 @@ public class PacketPlayTestAnimation extends AbstractPlayerSyncPacket { @OnlyIn(Dist.CLIENT) private static class ClientHandler { + private static void handle(PacketPlayTestAnimation pkt, Player player) { if (pkt.animId.isEmpty()) { - com.tiedup.remake.client.animation.BondageAnimationManager.stopAnimation(player); + com.tiedup.remake.client.animation.BondageAnimationManager.stopAnimation( + player + ); } else { - com.tiedup.remake.client.animation.BondageAnimationManager.playAnimation(player, pkt.animId); + com.tiedup.remake.client.animation.BondageAnimationManager.playAnimation( + player, + pkt.animId + ); } } } diff --git a/src/main/java/com/tiedup/remake/network/sync/PacketSyncMovementStyle.java b/src/main/java/com/tiedup/remake/network/sync/PacketSyncMovementStyle.java index b29f8f9..65be72f 100644 --- a/src/main/java/com/tiedup/remake/network/sync/PacketSyncMovementStyle.java +++ b/src/main/java/com/tiedup/remake/network/sync/PacketSyncMovementStyle.java @@ -34,7 +34,10 @@ public class PacketSyncMovementStyle extends AbstractPlayerSyncPacket { * @param playerUUID the affected player's UUID * @param style the active style, or null to clear */ - public PacketSyncMovementStyle(UUID playerUUID, @Nullable MovementStyle style) { + public PacketSyncMovementStyle( + UUID playerUUID, + @Nullable MovementStyle style + ) { super(playerUUID); this.styleOrdinal = style == null ? NO_STYLE : (byte) style.ordinal(); } @@ -70,16 +73,25 @@ public class PacketSyncMovementStyle extends AbstractPlayerSyncPacket { @OnlyIn(Dist.CLIENT) private static class ClientHandler { + private static void handle(PacketSyncMovementStyle pkt, Player player) { MovementStyle style = null; - if (pkt.styleOrdinal >= 0 && pkt.styleOrdinal < MovementStyle.values().length) { + if ( + pkt.styleOrdinal >= 0 && + pkt.styleOrdinal < MovementStyle.values().length + ) { style = MovementStyle.values()[pkt.styleOrdinal]; } if (style != null) { - com.tiedup.remake.client.state.MovementStyleClientState.set(player.getUUID(), style); + com.tiedup.remake.client.state.MovementStyleClientState.set( + player.getUUID(), + style + ); } else { - com.tiedup.remake.client.state.MovementStyleClientState.clear(player.getUUID()); + com.tiedup.remake.client.state.MovementStyleClientState.clear( + player.getUUID() + ); } // Crawl pose management: server sets forced pose for hitbox, diff --git a/src/main/java/com/tiedup/remake/network/sync/PacketSyncPetBedState.java b/src/main/java/com/tiedup/remake/network/sync/PacketSyncPetBedState.java index 488e0a4..c7735b8 100644 --- a/src/main/java/com/tiedup/remake/network/sync/PacketSyncPetBedState.java +++ b/src/main/java/com/tiedup/remake/network/sync/PacketSyncPetBedState.java @@ -47,12 +47,17 @@ public class PacketSyncPetBedState extends AbstractPlayerSyncPacket { @OnlyIn(Dist.CLIENT) private static class ClientHandler { + private static void handle(PacketSyncPetBedState pkt, Player player) { if (pkt.mode == 0) { // CLEAR — only stop animation if no bondage animation should be playing // (AnimationTickHandler will re-apply bondage anim on next tick if needed) - com.tiedup.remake.client.animation.BondageAnimationManager.stopAnimation(player); - com.tiedup.remake.client.state.PetBedClientState.clear(player.getUUID()); + com.tiedup.remake.client.animation.BondageAnimationManager.stopAnimation( + player + ); + com.tiedup.remake.client.state.PetBedClientState.clear( + player.getUUID() + ); } else { // Compute bed facing angle from block state float facingYRot = 0f; @@ -61,12 +66,22 @@ public class PacketSyncPetBedState extends AbstractPlayerSyncPacket { facingYRot = state.getValue(PetBedBlock.FACING).toYRot(); } - com.tiedup.remake.client.state.PetBedClientState.set(player.getUUID(), pkt.mode, facingYRot); + com.tiedup.remake.client.state.PetBedClientState.set( + player.getUUID(), + pkt.mode, + facingYRot + ); if (pkt.mode == 1) { - com.tiedup.remake.client.animation.BondageAnimationManager.playAnimation(player, "pet_bed_sit"); + com.tiedup.remake.client.animation.BondageAnimationManager.playAnimation( + player, + "pet_bed_sit" + ); } else if (pkt.mode == 2) { - com.tiedup.remake.client.animation.BondageAnimationManager.playAnimation(player, "pet_bed_sleep"); + com.tiedup.remake.client.animation.BondageAnimationManager.playAnimation( + player, + "pet_bed_sleep" + ); } } } diff --git a/src/main/java/com/tiedup/remake/network/sync/SyncManager.java b/src/main/java/com/tiedup/remake/network/sync/SyncManager.java index 1a9059d..dc3756d 100644 --- a/src/main/java/com/tiedup/remake/network/sync/SyncManager.java +++ b/src/main/java/com/tiedup/remake/network/sync/SyncManager.java @@ -1,19 +1,19 @@ package com.tiedup.remake.network.sync; import com.mojang.logging.LogUtils; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.network.ModNetwork; import com.tiedup.remake.util.ValidationHelper; +import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper; import java.util.*; import java.util.function.Function; -import org.jetbrains.annotations.Nullable; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; /** @@ -43,7 +43,6 @@ public class SyncManager { * 2. Create packet from player * 3. Send to all tracking and self * - * Phase 2 Refactoring: Eliminates code duplication in sync methods. * * @param player The player to sync (must be ServerPlayer) * @param packetFactory Function to create packet from player @@ -114,7 +113,8 @@ public class SyncManager { public static void syncClothesConfig(Player player) { ValidationHelper.asServerPlayer(player).ifPresent(serverPlayer -> { ItemStack clothes = V2EquipmentHelper.getInRegion( - player, BodyRegionV2.TORSO + player, + BodyRegionV2.TORSO ); PacketSyncClothesConfig packet = new PacketSyncClothesConfig( player.getUUID(), @@ -182,7 +182,8 @@ public class SyncManager { // Send other player's clothes config to target ItemStack clothes = V2EquipmentHelper.getInRegion( - otherPlayer, BodyRegionV2.TORSO + otherPlayer, + BodyRegionV2.TORSO ); if (!clothes.isEmpty()) { PacketSyncClothesConfig clothesPacket = diff --git a/src/main/java/com/tiedup/remake/network/trader/PacketBuyCaptive.java b/src/main/java/com/tiedup/remake/network/trader/PacketBuyCaptive.java index 962211f..01da680 100644 --- a/src/main/java/com/tiedup/remake/network/trader/PacketBuyCaptive.java +++ b/src/main/java/com/tiedup/remake/network/trader/PacketBuyCaptive.java @@ -1,7 +1,6 @@ package com.tiedup.remake.network.trader; import com.tiedup.remake.cells.CampOwnership; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.cells.CellDataV2; import com.tiedup.remake.cells.CellRegistryV2; import com.tiedup.remake.core.TiedUpMod; @@ -10,6 +9,7 @@ import com.tiedup.remake.entities.EntitySlaveTrader; import com.tiedup.remake.state.IRestrainable; import com.tiedup.remake.util.KidnappedHelper; import com.tiedup.remake.util.tasks.ItemTask; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.List; import java.util.UUID; import java.util.function.Supplier; diff --git a/src/main/java/com/tiedup/remake/network/trader/PacketOpenTraderScreen.java b/src/main/java/com/tiedup/remake/network/trader/PacketOpenTraderScreen.java index 2117ef4..b8881f8 100644 --- a/src/main/java/com/tiedup/remake/network/trader/PacketOpenTraderScreen.java +++ b/src/main/java/com/tiedup/remake/network/trader/PacketOpenTraderScreen.java @@ -105,12 +105,16 @@ public class PacketOpenTraderScreen extends AbstractClientPacket { @OnlyIn(Dist.CLIENT) private static class ClientHandler { + private static void handle(PacketOpenTraderScreen pkt) { - net.minecraft.client.Minecraft mc = net.minecraft.client.Minecraft.getInstance(); + net.minecraft.client.Minecraft mc = + net.minecraft.client.Minecraft.getInstance(); if (mc.player == null) return; // Convert network data to screen data - List screenOffers = new ArrayList<>(); + List< + com.tiedup.remake.client.gui.screens.SlaveTraderScreen.CaptiveOffer + > screenOffers = new ArrayList<>(); for (CaptiveOfferData data : pkt.offers) { screenOffers.add( new com.tiedup.remake.client.gui.screens.SlaveTraderScreen.CaptiveOffer( @@ -129,7 +133,11 @@ public class PacketOpenTraderScreen extends AbstractClientPacket { ); mc.setScreen( - new com.tiedup.remake.client.gui.screens.SlaveTraderScreen(pkt.traderEntityId, pkt.traderName, screenOffers) + new com.tiedup.remake.client.gui.screens.SlaveTraderScreen( + pkt.traderEntityId, + pkt.traderName, + screenOffers + ) ); } } diff --git a/src/main/java/com/tiedup/remake/personality/CellQuality.java b/src/main/java/com/tiedup/remake/personality/CellQuality.java index a84ef77..57b2ab5 100644 --- a/src/main/java/com/tiedup/remake/personality/CellQuality.java +++ b/src/main/java/com/tiedup/remake/personality/CellQuality.java @@ -2,13 +2,13 @@ package com.tiedup.remake.personality; import com.tiedup.remake.cells.CellDataV2; import com.tiedup.remake.v2.blocks.PetBedBlock; -import org.jetbrains.annotations.Nullable; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; import net.minecraft.world.level.LightLayer; import net.minecraft.world.level.block.BedBlock; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.CarpetBlock; +import org.jetbrains.annotations.Nullable; /** * Quality of the cell/environment around an NPC's home. diff --git a/src/main/java/com/tiedup/remake/personality/HomeType.java b/src/main/java/com/tiedup/remake/personality/HomeType.java index 5b629f4..1081cd9 100644 --- a/src/main/java/com/tiedup/remake/personality/HomeType.java +++ b/src/main/java/com/tiedup/remake/personality/HomeType.java @@ -6,7 +6,7 @@ package com.tiedup.remake.personality; *

                Home types determine comfort level, which affects: *

                  *
                • Hope regeneration (higher comfort = more hope)
                • - *
                • Cell quality evaluation (Phase 6)
                • + *
                • Cell quality evaluation
                • *
                • Mental state decay rates
                • *
                */ diff --git a/src/main/java/com/tiedup/remake/personality/PersonalityState.java b/src/main/java/com/tiedup/remake/personality/PersonalityState.java index e867674..0faf6b3 100644 --- a/src/main/java/com/tiedup/remake/personality/PersonalityState.java +++ b/src/main/java/com/tiedup/remake/personality/PersonalityState.java @@ -5,10 +5,10 @@ import com.tiedup.remake.cells.CellRegistryV2; import com.tiedup.remake.entities.EntityDamsel; import java.util.List; import java.util.UUID; -import org.jetbrains.annotations.Nullable; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerLevel; +import org.jetbrains.annotations.Nullable; /** * Main personality state manager for an NPC. diff --git a/src/main/java/com/tiedup/remake/prison/RansomData.java b/src/main/java/com/tiedup/remake/prison/RansomData.java index ff41a36..0a944a4 100644 --- a/src/main/java/com/tiedup/remake/prison/RansomData.java +++ b/src/main/java/com/tiedup/remake/prison/RansomData.java @@ -1,19 +1,18 @@ package com.tiedup.remake.prison; +import com.mojang.logging.LogUtils; import java.util.UUID; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; -import net.minecraft.resources.ResourceLocation; import net.minecraftforge.registries.ForgeRegistries; -import com.mojang.logging.LogUtils; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; /** - * Phase 2: Data class representing a single ransom demand. * * Contains: * - Captive and captor IDs @@ -380,11 +379,16 @@ public class RansomData { tag.putUUID("ransomId", ransomId); tag.putUUID("captiveId", captiveId); tag.putUUID("captorId", captorId); - ResourceLocation demandItemKey = ForgeRegistries.ITEMS.getKey(demandItem); + ResourceLocation demandItemKey = ForgeRegistries.ITEMS.getKey( + demandItem + ); if (demandItemKey != null) { tag.putString("demandItem", demandItemKey.toString()); } else { - LOGGER.warn("[RansomData] Unregistered demand item {}, falling back to iron_ingot", demandItem); + LOGGER.warn( + "[RansomData] Unregistered demand item {}, falling back to iron_ingot", + demandItem + ); tag.putString("demandItem", "minecraft:iron_ingot"); } tag.putInt("demandAmount", demandAmount); @@ -415,7 +419,11 @@ public class RansomData { ); if (demandItem == null) demandItem = Items.IRON_INGOT; } catch (Exception e) { - LOGGER.warn("[RansomData] Failed to parse demand item key '{}', falling back to iron_ingot", itemKey, e); + LOGGER.warn( + "[RansomData] Failed to parse demand item key '{}', falling back to iron_ingot", + itemKey, + e + ); demandItem = Items.IRON_INGOT; } @@ -427,7 +435,10 @@ public class RansomData { try { difficulty = RansomDifficulty.valueOf(tag.getString("difficulty")); } catch (IllegalArgumentException e) { - LOGGER.warn("[RansomData] Unknown difficulty '{}', falling back to NORMAL", tag.getString("difficulty")); + LOGGER.warn( + "[RansomData] Unknown difficulty '{}', falling back to NORMAL", + tag.getString("difficulty") + ); difficulty = RansomDifficulty.NORMAL; } RansomState state = RansomState.fromString(tag.getString("state")); @@ -456,7 +467,9 @@ public class RansomData { @Override public String toString() { - ResourceLocation demandItemKey = ForgeRegistries.ITEMS.getKey(demandItem); + ResourceLocation demandItemKey = ForgeRegistries.ITEMS.getKey( + demandItem + ); return String.format( "RansomData{id=%s, captive=%s, demand=%dx%s, state=%s, paid=%d/%d}", ransomId.toString().substring(0, 8), diff --git a/src/main/java/com/tiedup/remake/prison/service/BondageService.java b/src/main/java/com/tiedup/remake/prison/service/BondageService.java index 3226db3..b2f4b8b 100644 --- a/src/main/java/com/tiedup/remake/prison/service/BondageService.java +++ b/src/main/java/com/tiedup/remake/prison/service/BondageService.java @@ -1,8 +1,8 @@ package com.tiedup.remake.prison.service; import com.tiedup.remake.core.TiedUpMod; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.state.IBondageState; +import com.tiedup.remake.v2.BodyRegionV2; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/com/tiedup/remake/prison/service/ItemService.java b/src/main/java/com/tiedup/remake/prison/service/ItemService.java index f44a477..4ef8634 100644 --- a/src/main/java/com/tiedup/remake/prison/service/ItemService.java +++ b/src/main/java/com/tiedup/remake/prison/service/ItemService.java @@ -10,7 +10,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.UUID; -import org.jetbrains.annotations.Nullable; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; @@ -20,6 +19,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.ChestBlockEntity; +import org.jetbrains.annotations.Nullable; /** * Centralized item management for the prison system. diff --git a/src/main/java/com/tiedup/remake/prison/service/PrisonerService.java b/src/main/java/com/tiedup/remake/prison/service/PrisonerService.java index 7fa0a0d..0c1a32b 100644 --- a/src/main/java/com/tiedup/remake/prison/service/PrisonerService.java +++ b/src/main/java/com/tiedup/remake/prison/service/PrisonerService.java @@ -1,7 +1,6 @@ package com.tiedup.remake.prison.service; import com.tiedup.remake.cells.CellDataV2; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.cells.CellRegistryV2; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.entities.AbstractTiedUpNpc; @@ -17,8 +16,8 @@ import com.tiedup.remake.state.IBondageState; import com.tiedup.remake.state.ICaptor; import com.tiedup.remake.state.PlayerBindState; import com.tiedup.remake.util.KidnappedHelper; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.*; -import org.jetbrains.annotations.Nullable; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; @@ -29,6 +28,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.Nullable; /** * Centralized prisoner lifecycle service. @@ -109,7 +109,9 @@ public class PrisonerService { } // 2. Leash attach - IBondageState kidnappedState = KidnappedHelper.getKidnappedState(captive); + IBondageState kidnappedState = KidnappedHelper.getKidnappedState( + captive + ); if (kidnappedState == null) { // Rollback manager.escape( @@ -237,7 +239,9 @@ public class PrisonerService { } // 3. Unleash: remove captor refs and drop leash - IBondageState kidnappedState = KidnappedHelper.getKidnappedState(captive); + IBondageState kidnappedState = KidnappedHelper.getKidnappedState( + captive + ); if (kidnappedState != null) { kidnappedState.free(false); // Drop leash without dialogue/items captor.removeCaptive(kidnappedState, false); @@ -307,7 +311,9 @@ public class PrisonerService { ); // 3. Leash to new captor — forceCapturedBy for damsels - IBondageState kidnappedState = KidnappedHelper.getKidnappedState(captive); + IBondageState kidnappedState = KidnappedHelper.getKidnappedState( + captive + ); if (kidnappedState == null) { // Rollback if (isPlayer) { @@ -378,7 +384,9 @@ public class PrisonerService { long gameTime = level.getGameTime(); // 1. Unleash - IBondageState kidnappedState = KidnappedHelper.getKidnappedState(captive); + IBondageState kidnappedState = KidnappedHelper.getKidnappedState( + captive + ); if (kidnappedState != null && kidnappedState.isCaptive()) { kidnappedState.free(false); } @@ -451,7 +459,9 @@ public class PrisonerService { ICaptor oldCaptor, ICaptor newCaptor ) { - IBondageState kidnappedState = KidnappedHelper.getKidnappedState(captive); + IBondageState kidnappedState = KidnappedHelper.getKidnappedState( + captive + ); if (kidnappedState == null) { TiedUpMod.LOGGER.warn( "[PrisonerService] transferCaptive() no kidnapped state for {}", @@ -479,9 +489,7 @@ public class PrisonerService { TiedUpMod.LOGGER.warn( "[PrisonerService] transferCaptive() re-leash to new captor failed, attempting rollback" ); - if ( - captive instanceof AbstractTiedUpNpc npc - ) { + if (captive instanceof AbstractTiedUpNpc npc) { npc.forceCapturedBy(oldCaptor); } else { kidnappedState.getCapturedBy(oldCaptor); @@ -739,9 +747,13 @@ public class PrisonerService { if (state != PrisonerState.CAPTURED) { boolean hasCollarOwners = collars.hasOwners(playerId); if (!hasCollarOwners) { - IBondageState cap = KidnappedHelper.getKidnappedState(player); + IBondageState cap = KidnappedHelper.getKidnappedState( + player + ); ItemStack collar = - cap != null ? cap.getEquipment(BodyRegionV2.NECK) : ItemStack.EMPTY; + cap != null + ? cap.getEquipment(BodyRegionV2.NECK) + : ItemStack.EMPTY; if ( !collar.isEmpty() && diff --git a/src/main/java/com/tiedup/remake/state/CollarRegistry.java b/src/main/java/com/tiedup/remake/state/CollarRegistry.java index a2db0b9..08e87e1 100644 --- a/src/main/java/com/tiedup/remake/state/CollarRegistry.java +++ b/src/main/java/com/tiedup/remake/state/CollarRegistry.java @@ -26,7 +26,6 @@ import org.jetbrains.annotations.Nullable; * - "Slave" = Entity wearing a collar owned by a player (passive ownership) * - "Captive" = Entity attached by leash (active physical control) - managed by PlayerCaptiveManager * - * Phase 17: Terminology Refactoring */ public class CollarRegistry extends SavedData { diff --git a/src/main/java/com/tiedup/remake/state/IBondageState.java b/src/main/java/com/tiedup/remake/state/IBondageState.java index 7b23ef4..6245034 100644 --- a/src/main/java/com/tiedup/remake/state/IBondageState.java +++ b/src/main/java/com/tiedup/remake/state/IBondageState.java @@ -28,10 +28,7 @@ import net.minecraft.world.item.ItemStack; * @see IRestrainable */ public interface IBondageState extends ICapturable { - - // ======================================== // V2 REGION-BASED EQUIPMENT ACCESS - // ======================================== /** * Get the item equipped in a V2 body region. @@ -75,11 +72,13 @@ public interface IBondageState extends ICapturable { * @param force If true, replace even if current item is locked * @return The old ItemStack, or empty if locked (and !force) or nothing equipped */ - ItemStack replaceEquipment(BodyRegionV2 region, ItemStack newStack, boolean force); + ItemStack replaceEquipment( + BodyRegionV2 region, + ItemStack newStack, + boolean force + ); - // ======================================== // STATE QUERIES - BONDAGE EQUIPMENT - // ======================================== /** * Check if entity has bind/ropes equipped. @@ -174,7 +173,6 @@ public interface IBondageState extends ICapturable { /** * Check if entity has mittens equipped. - * Phase 14.4: Mittens system * @return true if MITTENS slot is not empty */ boolean hasMittens(); @@ -213,9 +211,7 @@ public interface IBondageState extends ICapturable { */ boolean hasKnives(); - // ======================================== // BULK OPERATIONS - // ======================================== /** * Apply a full set of bondage equipment at once. @@ -298,9 +294,7 @@ public interface IBondageState extends ICapturable { */ int getBondageItemsWhichCanBeRemovedCount(); - // ======================================== // CLOTHES PERMISSION SYSTEM - // ======================================== /** * Check if a player can remove clothes from this entity. @@ -326,15 +320,12 @@ public interface IBondageState extends ICapturable { */ boolean canChangeClothes(); - // ======================================== // POST-APPLY CALLBACKS - // ======================================== /** * Called after a bind is applied. * Implementations can trigger additional effects (sounds, particles, etc.). * - * Phase 14.1.7: Added missing callback (was documented but not defined) */ default void checkBindAfterApply() { // Default: no-op @@ -373,16 +364,13 @@ public interface IBondageState extends ICapturable { /** * Called after mittens are applied. - * Phase 14.4: Mittens system */ default void checkMittensAfterApply() { // Default: no-op // NPCs don't need post-apply logic by default } - // ======================================== // LOCK SAFETY HELPERS - // ======================================== /** * Execute a runnable only if the item is unlocked. @@ -478,7 +466,10 @@ public interface IBondageState extends ICapturable { ) { if (stack.isEmpty()) return; // Locked ILockable items cannot be removed - if (stack.getItem() instanceof ILockable lockable && lockable.isLocked(stack)) return; + if ( + stack.getItem() instanceof ILockable lockable && + lockable.isLocked(stack) + ) return; // Non-ILockable items or unlocked items: remove and drop ItemStack removed = takeOff.get(); if (!removed.isEmpty()) { @@ -486,9 +477,7 @@ public interface IBondageState extends ICapturable { } } - // ======================================== - // RESISTANCE SYSTEM (Phase 14.1.7) - // ======================================== + // RESISTANCE SYSTEM /** * Get current bind resistance value. @@ -501,7 +490,6 @@ public interface IBondageState extends ICapturable { *

                For Players: Stored in NBT, persists across sessions *

                For NPCs: Default returns 0 (instant escape, can be overridden) * - * Phase 14.1.7: Added to enable struggle system for NPCs * * @return Current resistance value (0 = can escape) */ @@ -517,7 +505,6 @@ public interface IBondageState extends ICapturable { *

                For Players: Updates NBT storage *

                For NPCs: Default no-op (no persistent resistance) * - * Phase 14.1.7: Added to enable struggle system for NPCs * * @param resistance New resistance value */ @@ -531,7 +518,6 @@ public interface IBondageState extends ICapturable { * *

                Same as bind resistance but for collars. * - * Phase 14.1.7: Added for collar struggle system * * @return Current collar resistance value */ @@ -543,7 +529,6 @@ public interface IBondageState extends ICapturable { /** * Set current collar resistance. * - * Phase 14.1.7: Added for collar struggle system * * @param resistance New resistance value */ diff --git a/src/main/java/com/tiedup/remake/state/ICaptor.java b/src/main/java/com/tiedup/remake/state/ICaptor.java index 3309a1e..f287a51 100644 --- a/src/main/java/com/tiedup/remake/state/ICaptor.java +++ b/src/main/java/com/tiedup/remake/state/ICaptor.java @@ -3,40 +3,33 @@ package com.tiedup.remake.state; import net.minecraft.world.entity.Entity; /** - * Phase 8: Master-Captive Relationships - * Phase 14.1.6: Refactored to use IRestrainable for NPC capture support - * Phase 17: Terminology refactoring - slave → captive * C6-V2: Narrowed parameters from IRestrainable to IBondageState (minimum needed type) * * Interface for entities that can capture other entities (players or NPCs). * - * Terminology (Phase 17): + * Terminology: * - "Captive" = Entity attached by leash (active physical control) * - "Slave" = Entity wearing a collar owned by someone (passive ownership via CollarRegistry) * * Design Pattern: * - Interface-based design allows both players (PlayerCaptorManager) - * and NPCs (EntityKidnapper - Phase 14.2+) to act as captors + * and NPCs (EntityKidnapper) to act as captors * - Separates concerns: ICaptor manages captives, IBondageState is managed * * Implementation: - * - PlayerCaptorManager: For player captors (Phase 8) - * - EntityKidnapper: For NPC captors (Phase 14.2+) + * - PlayerCaptorManager: For player captors + * - EntityKidnapper: For NPC captors * * @see IBondageState * @see PlayerCaptorManager */ public interface ICaptor { - // ======================================== // Captive Management - // ======================================== /** * Add a captive to this captor's captive list. * Called when capture succeeds. * - * Phase 14.1.6: Changed from PlayerBindState to IRestrainable - * Phase 17: Renamed from addSlave to addCaptive * C6-V2: Narrowed from IRestrainable to IBondageState * * @param captive The IBondageState entity to capture @@ -47,8 +40,6 @@ public interface ICaptor { * Remove a captive from this captor's captive list. * Called when freeing a captive or when captive escapes. * - * Phase 14.1.6: Changed from PlayerBindState to IRestrainable - * Phase 17: Renamed from removeSlave to removeCaptive * C6-V2: Narrowed from IRestrainable to IBondageState * * @param captive The IBondageState captive to remove @@ -63,8 +54,6 @@ public interface ICaptor { * - Target must be tied up OR have collar with this captor as owner * - Target must not already be captured * - * Phase 14.1.6: Changed from PlayerBindState to IRestrainable - * Phase 17: Renamed from canEnslave to canCapture * C6-V2: Narrowed from IRestrainable to IBondageState * * @param target The potential IBondageState captive @@ -76,8 +65,6 @@ public interface ICaptor { * Check if this captor can release the given captive. * Only the current captor can release their captive. * - * Phase 14.1.6: Changed from PlayerBindState to IRestrainable - * Phase 17: Renamed from canFree to canRelease * C6-V2: Narrowed from IRestrainable to IBondageState * * @param captive The IBondageState captive to check @@ -85,14 +72,11 @@ public interface ICaptor { */ boolean canRelease(IBondageState captive); - // ======================================== // Configuration - // ======================================== /** * Whether this captor allows captives to be transferred to other captors. * - * Phase 17: Renamed from allowSlaveTransfer to allowCaptiveTransfer * * @return true if captive transfer is allowed (default for players) */ @@ -101,22 +85,17 @@ public interface ICaptor { /** * Whether this captor can have multiple captives simultaneously. * - * Phase 17: Renamed from allowMultipleSlaves to allowMultipleCaptives * * @return true if multiple captives allowed (default for players) */ boolean allowMultipleCaptives(); - // ======================================== // Event Callbacks - // ======================================== /** * Called when a captive logs out while captured. * Allows the captor to handle cleanup or persistence. * - * Phase 14.1.6: Changed from PlayerBindState to IRestrainable - * Phase 17: Renamed from onSlaveLogout to onCaptiveLogout * C6-V2: Narrowed from IRestrainable to IBondageState * Note: For NPC captives, this may never be called (NPCs don't log out) * @@ -128,8 +107,6 @@ public interface ICaptor { * Called when a captive is released (freed). * Allows the captor to react to losing a captive. * - * Phase 14.1.6: Changed from PlayerBindState to IRestrainable - * Phase 17: Renamed from onSlaveReleased to onCaptiveReleased * C6-V2: Narrowed from IRestrainable to IBondageState * * @param captive The IBondageState captive that was released @@ -140,22 +117,17 @@ public interface ICaptor { * Called when a captive attempts to struggle. * Allows the captor to react (e.g., shock collar activation). * - * Phase 14.1.6: Changed from PlayerBindState to IRestrainable - * Phase 17: Renamed from onSlaveStruggle to onCaptiveStruggle * C6-V2: Narrowed from IRestrainable to IBondageState * * @param captive The IBondageState captive that struggled */ void onCaptiveStruggle(IBondageState captive); - // ======================================== // Queries - // ======================================== /** * Check if this captor currently has any captives. * - * Phase 17: Renamed from hasSlaves to hasCaptives * * @return true if captive list is not empty */ diff --git a/src/main/java/com/tiedup/remake/state/ICapturable.java b/src/main/java/com/tiedup/remake/state/ICapturable.java index 9a7318d..b1f97d8 100644 --- a/src/main/java/com/tiedup/remake/state/ICapturable.java +++ b/src/main/java/com/tiedup/remake/state/ICapturable.java @@ -1,7 +1,7 @@ package com.tiedup.remake.state; -import org.jetbrains.annotations.Nullable; import net.minecraft.world.entity.Entity; +import org.jetbrains.annotations.Nullable; /** * Capture, leash, and transport interface for kidnapped entities. @@ -14,10 +14,7 @@ import net.minecraft.world.entity.Entity; * @see IRestrainable */ public interface ICapturable extends IRestrainableEntity { - - // ======================================== // CAPTURE LIFECYCLE - // ======================================== /** * Capture this entity by the given captor. @@ -44,7 +41,6 @@ public interface ICapturable extends IRestrainableEntity { *

              • Use vanilla setLeashedTo() directly on the NPC
              • * * - * Phase 17: Renamed from getEnslavedBy to getCapturedBy * * @param captor The captor attempting to capture * @return true if capture succeeded, false otherwise @@ -78,15 +74,12 @@ public interface ICapturable extends IRestrainableEntity { *

                Only works if current captor allows captive transfer * ({@link ICaptor#allowCaptiveTransfer()} == true).

                * - * Phase 17: Renamed from transferSlaveryTo to transferCaptivityTo * * @param newCaptor The new captor to transfer to */ void transferCaptivityTo(ICaptor newCaptor); - // ======================================== // STATE QUERIES - CAPTURE - // ======================================== /** * Check if this entity can be captured. @@ -107,7 +100,6 @@ public interface ICapturable extends IRestrainableEntity { *

                For Players: Returns true when LeashProxyEntity is attached and leashed to captor

                *

                For NPCs: Returns true when vanilla leash is attached

                * - * Phase 17: Renamed from isSlave to isCaptive * * @return true if captured (has leash holder) */ @@ -147,7 +139,6 @@ public interface ICapturable extends IRestrainableEntity { /** * Get the current captor (the entity holding the leash). * - * Phase 17: Renamed from getMaster to getCaptor * * @return The captor, or null if not captured */ diff --git a/src/main/java/com/tiedup/remake/state/ICoercible.java b/src/main/java/com/tiedup/remake/state/ICoercible.java index 8a2068a..9304415 100644 --- a/src/main/java/com/tiedup/remake/state/ICoercible.java +++ b/src/main/java/com/tiedup/remake/state/ICoercible.java @@ -13,10 +13,7 @@ import net.minecraft.world.entity.player.Player; */ // C6-V2: takeBondageItemBy narrowed from IRestrainable to IRestrainableEntity public interface ICoercible extends IRestrainableEntity { - - // ======================================== // SPECIAL INTERACTIONS - // ======================================== /** * Tighten binds on this entity (increase resistance). @@ -72,7 +69,6 @@ public interface ICoercible extends IRestrainableEntity { * Another entity takes a bondage item from this entity. * Used when master removes items from slave. * - * Phase 14.1.7: Changed from PlayerBindState to IRestrainable for polymorphism * C6-V2: Narrowed from IRestrainable to IRestrainableEntity (only uses identity methods) * This allows NPCs to take items from Players or other NPCs * @@ -81,9 +77,7 @@ public interface ICoercible extends IRestrainableEntity { */ void takeBondageItemBy(IRestrainableEntity taker, int slotIndex); - // ======================================== - // COLLAR TIMERS (Phase 14.1.4) - // ======================================== + // COLLAR TIMERS /** * Force-stops and clears any active auto-shock collar timer. diff --git a/src/main/java/com/tiedup/remake/state/IRestrainableEntity.java b/src/main/java/com/tiedup/remake/state/IRestrainableEntity.java index 289a1de..fa5950b 100644 --- a/src/main/java/com/tiedup/remake/state/IRestrainableEntity.java +++ b/src/main/java/com/tiedup/remake/state/IRestrainableEntity.java @@ -1,7 +1,7 @@ package com.tiedup.remake.state; -import java.util.UUID; import com.tiedup.remake.v2.BodyRegionV2; +import java.util.UUID; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; @@ -24,10 +24,7 @@ import net.minecraft.world.level.Level; * @see IRestrainable */ public interface IRestrainableEntity { - - // ======================================== // ENTITY IDENTITY - // ======================================== /** * Get the underlying LivingEntity. @@ -62,9 +59,7 @@ public interface IRestrainableEntity { */ String getNameFromCollar(); - // ======================================== // LIFECYCLE - // ======================================== /** * Called when this entity dies while kidnapped. @@ -82,9 +77,7 @@ public interface IRestrainableEntity { */ boolean onDeathKidnapped(Level world); - // ======================================== // UTILITY - // ======================================== /** * Drop an item at this entity's position. @@ -102,9 +95,7 @@ public interface IRestrainableEntity { */ void teleportToPosition(com.tiedup.remake.util.teleport.Position position); - // ======================================== // DEFAULT HELPER METHODS - COMMUNICATION & STATE - // ======================================== /** * Send a message to this entity (if it can receive messages). @@ -158,50 +149,77 @@ public interface IRestrainableEntity { * Get all V2 equipped items (de-duplicated). * @return Unmodifiable map of region to ItemStack, or empty map if no V2 support. */ - default java.util.Map getAllEquippedV2() { + default java.util.Map< + com.tiedup.remake.v2.BodyRegionV2, + ItemStack + > getAllEquippedV2() { com.tiedup.remake.v2.bondage.IV2BondageEquipment equip = - com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper.getEquipment(asLivingEntity()); + com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper.getEquipment( + asLivingEntity() + ); return equip != null ? equip.getAllEquipped() : java.util.Map.of(); } /** * Get V2 item in a specific body region. */ - default ItemStack getItemInRegion(com.tiedup.remake.v2.BodyRegionV2 region) { - return com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper - .getInRegion(asLivingEntity(), region); + default ItemStack getItemInRegion( + com.tiedup.remake.v2.BodyRegionV2 region + ) { + return com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper.getInRegion( + asLivingEntity(), + region + ); } /** * Equip a V2 item to its declared regions. Server-only. * @return The equip result. */ - default com.tiedup.remake.v2.bondage.V2EquipResult equipToRegion(ItemStack stack) { - return com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper - .equipItem(asLivingEntity(), stack); + default com.tiedup.remake.v2.bondage.V2EquipResult equipToRegion( + ItemStack stack + ) { + return com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper.equipItem( + asLivingEntity(), + stack + ); } /** * Unequip V2 item from a region. Server-only. */ - default ItemStack unequipFromRegion(com.tiedup.remake.v2.BodyRegionV2 region) { - return com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper - .unequipFromRegion(asLivingEntity(), region); + default ItemStack unequipFromRegion( + com.tiedup.remake.v2.BodyRegionV2 region + ) { + return com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper.unequipFromRegion( + asLivingEntity(), + region + ); } /** * Unequip V2 item from a region with force option. Server-only. */ - default ItemStack unequipFromRegion(com.tiedup.remake.v2.BodyRegionV2 region, boolean force) { - return com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper - .unequipFromRegion(asLivingEntity(), region, force); + default ItemStack unequipFromRegion( + com.tiedup.remake.v2.BodyRegionV2 region, + boolean force + ) { + return com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper.unequipFromRegion( + asLivingEntity(), + region, + force + ); } /** * Whether this entity has V2 equipment support. */ default boolean hasV2Support() { - return com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper - .getEquipment(asLivingEntity()) != null; + return ( + com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper.getEquipment( + asLivingEntity() + ) != + null + ); } } diff --git a/src/main/java/com/tiedup/remake/state/ISaleable.java b/src/main/java/com/tiedup/remake/state/ISaleable.java index 404330b..be47863 100644 --- a/src/main/java/com/tiedup/remake/state/ISaleable.java +++ b/src/main/java/com/tiedup/remake/state/ISaleable.java @@ -9,7 +9,6 @@ import org.jetbrains.annotations.Nullable; * @see IRestrainable */ public interface ISaleable { - /** * Check if this entity is marked for sale by a captor. * diff --git a/src/main/java/com/tiedup/remake/state/PlayerBindState.java b/src/main/java/com/tiedup/remake/state/PlayerBindState.java index f402813..77bb59f 100644 --- a/src/main/java/com/tiedup/remake/state/PlayerBindState.java +++ b/src/main/java/com/tiedup/remake/state/PlayerBindState.java @@ -46,13 +46,13 @@ import org.jetbrains.annotations.Nullable; * - Track player restraint states (tied, gagged, blindfolded, etc.) * - Manage bondage equipment lifecycle (put on/take off items) * - Lifecycle management (connection, death, respawn) - * - Phase 8: Enslavement lifecycle (can be enslaved, act as master) - * - Phase 13: Advanced collar features (shocks, GPS tracking) + * - Enslavement lifecycle (can be enslaved, act as master) + * - Advanced collar features (shocks, GPS tracking) * * Thread Safety: This class is accessed from both server and client threads. * Use appropriate synchronization when accessing the instances map. * - * Refactoring: Component-Host pattern (Phase 1 in progress) + * Refactoring: Component-Host pattern */ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { @@ -69,7 +69,6 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { /** * Get or create a PlayerBindState instance for a player. - * Phase 15: Updates player reference when entity is recreated (e.g., after observer reconnects). * * @param player The player entity * @return The state instance associated with this player @@ -85,7 +84,6 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { new PlayerBindState(player) ); - // Phase 15: Update player reference if entity was recreated (reconnection scenario) // This fixes the bug where remote players' animations don't appear after observer reconnects if (state.player != player) { state.player = player; @@ -106,9 +104,7 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { * Cleans up the instance map when a player leaves the server. */ public static void removeInstance(UUID uuid, boolean isClient) { - Map map = isClient - ? instancesClient - : instances; + Map map = isClient ? instancesClient : instances; map.remove(uuid); } @@ -119,27 +115,25 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { private volatile Player player; private boolean online; - // ========== Phase 1 Components ========== + // ========== Core Components ========== private final PlayerTaskManagement taskManagement; private final PlayerStateQuery stateQuery; private final PlayerDataRetrieval dataRetrieval; private final PlayerSale sale; - // ========== Phase 2 Components ========== + // ========== Struggle Components ========== private final PlayerSpecialActions specialActions; private final PlayerClothesPermission clothesPermission; - // ========== Phase 3 Components ========== + // ========== Animation Components ========== private final PlayerEquipment equipment; private final PlayerStruggle struggle; private final PlayerShockCollar shockCollar; - // ========== Phase 4 Components ========== + // ========== Captivity Components ========== private final PlayerLifecycle lifecycle; private final PlayerCaptivity captivity; - // Phase 8: Enslavement fields - // Phase 17: master → captor, slaveHolderManager → captorManager private ICaptor captor; private PlayerCaptorManager captorManager; // Note: transport field removed - now using IPlayerLeashAccess mixin @@ -168,7 +162,9 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { return activeMovementStyle; } - public void setActiveMovementStyle(@Nullable com.tiedup.remake.v2.bondage.movement.MovementStyle style) { + public void setActiveMovementStyle( + @Nullable com.tiedup.remake.v2.bondage.movement.MovementStyle style + ) { this.activeMovementStyle = style; } @@ -234,26 +230,25 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { this.player = player; this.online = true; - // Initialize Phase 1 components + // Initialize core components this.taskManagement = new PlayerTaskManagement(); this.stateQuery = new PlayerStateQuery(this); this.dataRetrieval = new PlayerDataRetrieval(this); this.sale = new PlayerSale(); - // Initialize Phase 2 components + // Initialize struggle components this.specialActions = new PlayerSpecialActions(this); this.clothesPermission = new PlayerClothesPermission(this); - // Initialize Phase 3 components + // Initialize animation components this.equipment = new PlayerEquipment(this); this.struggle = new PlayerStruggle(this); this.shockCollar = new PlayerShockCollar(this); - // Initialize Phase 4 components + // Initialize captivity components this.lifecycle = new PlayerLifecycle(this); this.captivity = new PlayerCaptivity(this); - // Phase 17: Enslavement and captive management this.captor = null; this.captorManager = new PlayerCaptorManager(player); } @@ -301,7 +296,7 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { return stateQuery.hasClothes(); } - /** Check if player has mittens equipped. Phase 14.4: Mittens system */ + /** Check if player has mittens equipped. Mittens system */ public boolean hasMittens() { return stateQuery.hasMittens(); } @@ -334,7 +329,7 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { equipment.putClothesOn(clothes); } - /** Equips mittens (blocks hand interactions). Phase 14.4: Mittens system. Issue #14 fix: now calls onEquipped. */ + /** Equips mittens (blocks hand interactions). Mittens system. Issue #14 fix: now calls onEquipped. */ public void putMittensOn(ItemStack mittens) { equipment.putMittensOn(mittens); } @@ -352,7 +347,7 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { return equipment.takeBlindfoldOff(); } - /** Removes mittens. Phase 14.4: Mittens system */ + /** Removes mittens. Mittens system */ public ItemStack takeMittensOff() { return equipment.takeMittensOff(); } @@ -446,7 +441,7 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { // Note: getCaptor(), getCaptorManager(), setStruggling(), setStrugglingClient(), // isStruggling(), getStruggleStartTick() are implemented elsewhere in the class - // ========== Phase 6: Tying/Untying Task Methods ========== + // ========== Tying/Untying Task Methods ========== // Delegated to PlayerTaskManagement component public TyingTask getCurrentTyingTask() { @@ -505,7 +500,7 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { taskManagement.setRestrainedState(state); } - // ========== Phase 7: Struggle & Resistance Methods ========== + // ========== Struggle & Resistance Methods ========== // Delegated to PlayerStruggle component /** @@ -637,7 +632,6 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { } /** - * Phase 14.1.7: Now part of IRestrainable interface * Delegated to PlayerEquipment component */ @Override @@ -646,7 +640,6 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { } /** - * Phase 14.1.7: Now part of IRestrainable interface * Delegated to PlayerEquipment component */ @Override @@ -655,7 +648,6 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { } /** - * Phase 14.1.7: Added for IRestrainable interface * Delegated to PlayerEquipment component */ @Override @@ -664,7 +656,6 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { } /** - * Phase 14.1.7: Added for IRestrainable interface * Delegated to PlayerEquipment component */ @Override @@ -672,12 +663,7 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { equipment.setCurrentCollarResistance(resistance); } - // ======================================== - // Phase 8: IRestrainable Implementation - // ======================================== - /** - * Phase 17: Renamed from getEnslavedBy to getCapturedBy * Initiates the capture process by a captor. * Uses the proxy-based leash system (player is NOT mounted). * Delegated to PlayerCaptivity component. @@ -692,7 +678,7 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { captivity.free(); } - /** Phase 17: Ends captivity and detaches the leash proxy. + /** Ends captivity and detaches the leash proxy. * Delegated to PlayerCaptivity component. */ @Override public void free(boolean dropLead) { @@ -700,7 +686,6 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { } /** - * Phase 17: Renamed from transferSlaveryTo to transferCaptivityTo * Delegated to PlayerCaptivity component. */ @Override @@ -714,7 +699,6 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { } /** - * Phase 17: Renamed from isSlave to isCaptive * Delegated to PlayerCaptivity component. */ @Override @@ -723,7 +707,6 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { } /** - * Phase 17: Renamed from getMaster to getCaptor * Also implements IPlayerBindStateHost. */ @Override @@ -769,10 +752,7 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { return player.getName().getString(); } - // ======================================== - // Phase 13: Shock Functionality // Delegated to PlayerShockCollar component - // ======================================== @Override public void shockKidnapped() { @@ -789,7 +769,6 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { } /** - * Phase 17: Renamed from checkStillSlave to checkStillCaptive * Periodically monitors captivity validity. * Simplified: If any condition is invalid, free the captive immediately. * Delegated to PlayerCaptivity component. @@ -816,7 +795,6 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { } /** - * Phase 17: Renamed from getSlaveHolderManager to getCaptorManager * Manager for capturing other entities (acting as captor). * Also implements IPlayerBindStateHost. */ @@ -825,9 +803,7 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { return captorManager; } - // ======================================== // IRestrainable Missing Methods - // ======================================== @Override public void teleportToPosition(Position position) { @@ -872,9 +848,7 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { return dataRetrieval.getNameFromCollar(); } - // ======================================== // V2 Region-Based Equipment Access - // ======================================== @Override public ItemStack getEquipment(BodyRegionV2 region) { @@ -891,7 +865,8 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { case NECK -> equipment.putCollarOn(stack); case TORSO -> equipment.putClothesOn(stack); case HANDS -> equipment.putMittensOn(stack); - default -> {} + default -> { + } } } @@ -923,10 +898,8 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { return V2EquipmentHelper.unequipFromRegion(player, region, true); } - // ======================================== // IRestrainable State Queries // Delegated to PlayerStateQuery component - // ======================================== @Override public boolean canBeTiedUp() { @@ -943,9 +916,7 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { return stateQuery.hasKnives(); } - // ======================================== // Sale System - Delegated to PlayerSale component - // ======================================== @Override public boolean isForSell() { @@ -1012,10 +983,8 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { return stateQuery.hasBlindingEffect(); } - // ======================================== // Equipment Take Off (local helpers) // Delegated to PlayerEquipment component - // ======================================== public ItemStack takeEarplugsOff() { return equipment.takeEarplugsOff(); @@ -1025,23 +994,23 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { return equipment.takeClothesOff(); } - // ======================================== // IRestrainable Equipment Put On // Delegated to PlayerEquipment component - // ======================================== /** Equips earplugs (muffles sounds). Issue #14 fix: now calls onEquipped. */ public void putEarplugsOn(ItemStack earplugs) { equipment.putEarplugsOn(earplugs); } - // ======================================== // IRestrainable Equipment Replacement (V2 region-based) // Delegated to PlayerEquipment component (except TORSO - handled by PlayerClothesPermission) - // ======================================== @Override - public synchronized ItemStack replaceEquipment(BodyRegionV2 region, ItemStack newStack, boolean force) { + public synchronized ItemStack replaceEquipment( + BodyRegionV2 region, + ItemStack newStack, + boolean force + ) { // MEDIUM FIX: Synchronized to prevent race condition during equipment replacement return switch (region) { case ARMS -> equipment.replaceBind(newStack, force); @@ -1055,9 +1024,7 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { }; } - // ======================================== // IRestrainable Bulk Operations - // ======================================== @Override public void untie(boolean drop) { @@ -1075,7 +1042,6 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { // V1 speed reduction handled by MovementStyleManager (V2 tick-based). // See H6 fix — removing V1 calls prevents double stacking. - // Phase 17: Free from captivity if applicable if (isCaptive()) { free(); } @@ -1173,10 +1139,8 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { return count; } - // ======================================== // IRestrainable Callbacks // Delegated to PlayerEquipment component - // ======================================== @Override public void checkGagAfterApply() { @@ -1198,10 +1162,8 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { equipment.checkCollarAfterApply(); } - // ======================================== // IRestrainable Special Interactions // Delegated to PlayerSpecialActions component - // ======================================== @Override public void applyChloroform(int duration) { @@ -1209,7 +1171,6 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { } /** - * Phase 14.1.7: Updated to use IRestrainable parameter (was PlayerBindState) * C6-V2: Narrowed to IRestrainableEntity */ @Override @@ -1217,10 +1178,8 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { specialActions.takeBondageItemBy(taker, slotIndex); } - // ======================================== // IRestrainable Clothes Permissions // Delegated to PlayerClothesPermission component - // ======================================== @Override public boolean canTakeOffClothes(Player player) { @@ -1237,9 +1196,7 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { return clothesPermission.canChangeClothes(); } - // ======================================== // IRestrainable Lifecycle - // ======================================== @Override public boolean onDeathKidnapped(net.minecraft.world.level.Level world) { @@ -1262,7 +1219,6 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { // Drop all items dropBondageItems(true); - // Phase 17: Free from captivity if (isCaptive()) { free(); } @@ -1271,10 +1227,8 @@ public class PlayerBindState implements IRestrainable, IPlayerBindStateHost { return lifecycle.onDeathKidnapped(world); } - // ======================================== - // IRestrainable Entity Communication (Phase 14.1.3) + // IRestrainable Entity Communication // Delegated to PlayerDataRetrieval component - // ======================================== @Override public net.minecraft.world.entity.LivingEntity asLivingEntity() { diff --git a/src/main/java/com/tiedup/remake/state/PlayerCaptorManager.java b/src/main/java/com/tiedup/remake/state/PlayerCaptorManager.java index fc73c0a..d247c63 100644 --- a/src/main/java/com/tiedup/remake/state/PlayerCaptorManager.java +++ b/src/main/java/com/tiedup/remake/state/PlayerCaptorManager.java @@ -1,23 +1,22 @@ package com.tiedup.remake.state; import com.tiedup.remake.core.TiedUpMod; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.items.base.ItemCollar; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; + // C6-V2: IRestrainable → IBondageState (narrowed API) /** - * Phase 8: Master-Captive Relationships - * Phase 17: Renamed from PlayerKidnapperManager, terminology slave → captive * * Manages capture relationships for player captors. * - * Terminology (Phase 17): + * Terminology: * - "Captive" = Entity attached by leash (active physical control) * - "Slave" = Entity wearing a collar owned by someone (passive ownership via CollarRegistry) * @@ -50,8 +49,6 @@ public class PlayerCaptorManager implements ICaptor { * List of all captives currently owned by this captor. * Thread-safe to avoid concurrent modification during iteration. * - * Phase 14.1.6: Changed from List to List - * Phase 17: Renamed from slaves to captives */ private final List captives; @@ -65,13 +62,9 @@ public class PlayerCaptorManager implements ICaptor { this.captives = new CopyOnWriteArrayList<>(); } - // ======================================== // ICaptor Implementation - // ======================================== /** - * Phase 14.1.6: Changed parameter from PlayerBindState to IBondageState - * Phase 17: Renamed from addSlave to addCaptive */ @Override public synchronized void addCaptive(IBondageState captive) { @@ -94,8 +87,6 @@ public class PlayerCaptorManager implements ICaptor { } /** - * Phase 14.1.6: Changed parameter from PlayerBindState to IBondageState - * Phase 17: Renamed from removeSlave to removeCaptive * * Thread Safety: Synchronized on 'this' to match addCaptive and freeAllCaptives. */ @@ -127,8 +118,6 @@ public class PlayerCaptorManager implements ICaptor { } /** - * Phase 14.1.6: Changed parameter from PlayerBindState to IBondageState - * Phase 17: Renamed from canEnslave to canCapture */ @Override public boolean canCapture(IBondageState target) { @@ -141,7 +130,6 @@ public class PlayerCaptorManager implements ICaptor { // - Target is tied up, OR // - Target has collar AND collar has this captor as owner - // Phase 14.1.6: Use asLivingEntity() instead of getPlayer() net.minecraft.world.entity.LivingEntity targetEntity = target.asLivingEntity(); if (targetEntity == null) { @@ -169,8 +157,6 @@ public class PlayerCaptorManager implements ICaptor { } /** - * Phase 14.1.6: Changed parameter from PlayerBindState to IBondageState - * Phase 17: Renamed from canFree to canRelease */ @Override public boolean canRelease(IBondageState captive) { @@ -183,7 +169,6 @@ public class PlayerCaptorManager implements ICaptor { } /** - * Phase 17: Renamed from allowSlaveTransfer to allowCaptiveTransfer */ @Override public boolean allowCaptiveTransfer() { @@ -192,7 +177,6 @@ public class PlayerCaptorManager implements ICaptor { } /** - * Phase 17: Renamed from allowMultipleSlaves to allowMultipleCaptives */ @Override public boolean allowMultipleCaptives() { @@ -201,8 +185,6 @@ public class PlayerCaptorManager implements ICaptor { } /** - * Phase 14.1.6: Changed parameter from PlayerBindState to IBondageState - * Phase 17: Renamed from onSlaveLogout to onCaptiveLogout * Note: For NPC captives, this is never called (NPCs don't log out) */ @Override @@ -223,8 +205,6 @@ public class PlayerCaptorManager implements ICaptor { } /** - * Phase 14.1.6: Changed parameter from PlayerBindState to IBondageState - * Phase 17: Renamed from onSlaveReleased to onCaptiveReleased */ @Override public void onCaptiveReleased(IBondageState captive) { @@ -242,8 +222,6 @@ public class PlayerCaptorManager implements ICaptor { } /** - * Phase 14.1.6: Changed parameter from PlayerBindState to IBondageState - * Phase 17: Renamed from onSlaveStruggle to onCaptiveStruggle */ @Override public void onCaptiveStruggle(IBondageState captive) { @@ -256,13 +234,9 @@ public class PlayerCaptorManager implements ICaptor { captive.getKidnappedName(), captor.getName().getString() ); - - // Phase 8: No action for basic struggle - // Phase 14: Shock collar would activate here } /** - * Phase 17: Renamed from hasSlaves to hasCaptives */ @Override public boolean hasCaptives() { @@ -274,14 +248,11 @@ public class PlayerCaptorManager implements ICaptor { return captor; } - // ======================================== // Additional Methods - // ======================================== /** * Frees all captives currently owned by this captor. * - * Phase 17: Renamed from freeAllSlaves to freeAllCaptives * * Thread Safety: Synchronized on 'this' to match addCaptive and removeCaptive. * @@ -307,7 +278,6 @@ public class PlayerCaptorManager implements ICaptor { * Get a copy of the captive list. * Safe for iteration without concurrent modification issues. * - * Phase 17: Renamed from getSlaves to getCaptives * * @return Copy of the current captive list */ @@ -318,7 +288,6 @@ public class PlayerCaptorManager implements ICaptor { /** * Get the number of captives currently owned. * - * Phase 17: Renamed from getSlaveCount to getCaptiveCount * * @return Captive count */ @@ -334,7 +303,6 @@ public class PlayerCaptorManager implements ICaptor { * - When a player gets captured, their captives transfer to new captor * - Prevents circular capture issues * - * Phase 17: Renamed from transferAllSlavesTo to transferAllCaptivesTo * * @param newCaptor The new captor to transfer captives to */ @@ -389,7 +357,6 @@ public class PlayerCaptorManager implements ICaptor { * Clean up invalid captives from the list. * Removes captives that are no longer valid (offline, transport gone, etc.). * - * Phase 17: Renamed from cleanupInvalidSlaves to cleanupInvalidCaptives * * Should be called periodically (e.g., on tick). */ @@ -421,7 +388,5 @@ public class PlayerCaptorManager implements ICaptor { }); } - // ======================================== - // Backward Compatibility (Phase 17) - // ======================================== + // Backward Compatibility } diff --git a/src/main/java/com/tiedup/remake/state/SocialData.java b/src/main/java/com/tiedup/remake/state/SocialData.java index 59c76de..a35270d 100644 --- a/src/main/java/com/tiedup/remake/state/SocialData.java +++ b/src/main/java/com/tiedup/remake/state/SocialData.java @@ -15,7 +15,6 @@ import net.minecraft.world.level.saveddata.SavedData; * - Block lists (which players have blocked which other players) * - Talk area settings (local chat distance per player) * - * Phase 18: Social Commands persistence. */ public class SocialData extends SavedData { diff --git a/src/main/java/com/tiedup/remake/state/components/PlayerCaptivity.java b/src/main/java/com/tiedup/remake/state/components/PlayerCaptivity.java index 87eb1f7..991de9c 100644 --- a/src/main/java/com/tiedup/remake/state/components/PlayerCaptivity.java +++ b/src/main/java/com/tiedup/remake/state/components/PlayerCaptivity.java @@ -2,15 +2,14 @@ package com.tiedup.remake.state.components; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.entities.LeashProxyEntity; -import com.tiedup.remake.state.IPlayerLeashAccess; import com.tiedup.remake.state.ICaptor; +import com.tiedup.remake.state.IPlayerLeashAccess; import com.tiedup.remake.state.hosts.IPlayerBindStateHost; import net.minecraft.world.entity.player.Player; import org.jetbrains.annotations.Nullable; /** * Component responsible for captivity mechanics and leash proxy management. - * Phase 17: Advanced capture system (proxy-based leashing) * * Single Responsibility: Captivity lifecycle and transport management * Complexity: VERY HIGH (mixin coupling, network sync, leash proxy coordination) @@ -35,7 +34,6 @@ public class PlayerCaptivity { // ========== Captivity Initiation ========== /** - * Phase 17: Renamed from getEnslavedBy to getCapturedBy * Initiates the capture process by a captor. * Uses the proxy-based leash system (player is NOT mounted). * @@ -101,7 +99,6 @@ public class PlayerCaptivity { } /** - * Phase 17: Ends captivity and detaches the leash proxy. * * @param dropLead Whether to drop the leash item */ @@ -159,7 +156,6 @@ public class PlayerCaptivity { // ========== Captivity Transfer ========== /** - * Phase 17: Renamed from transferSlaveryTo to transferCaptivityTo * Transfers captivity from current captor to a new captor. * * Thread Safety: Synchronized to prevent concurrent transfer attempts. @@ -206,7 +202,6 @@ public class PlayerCaptivity { } /** - * Phase 17: Renamed from isSlave to isCaptive * Check if player is currently captured by an entity. * * @return true if player has a captor and is leashed @@ -222,7 +217,6 @@ public class PlayerCaptivity { /** * Get the leash proxy entity (transport system). - * Phase 17: Proxy-based leashing (no mounting). * * @return The leash proxy, or null if not leashed */ @@ -238,7 +232,6 @@ public class PlayerCaptivity { // ========== Captivity Monitoring ========== /** - * Phase 17: Renamed from checkStillSlave to checkStillCaptive * Periodically monitors captivity validity. * Simplified: If any condition is invalid, free the captive immediately. * diff --git a/src/main/java/com/tiedup/remake/state/components/PlayerClothesPermission.java b/src/main/java/com/tiedup/remake/state/components/PlayerClothesPermission.java index fa67cb5..fbdd4d2 100644 --- a/src/main/java/com/tiedup/remake/state/components/PlayerClothesPermission.java +++ b/src/main/java/com/tiedup/remake/state/components/PlayerClothesPermission.java @@ -1,9 +1,9 @@ package com.tiedup.remake.state.components; -import com.tiedup.remake.v2.bondage.IV2BondageItem; import com.tiedup.remake.state.hosts.IPlayerBindStateHost; import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.v2.bondage.IV2BondageEquipment; +import com.tiedup.remake.v2.bondage.IV2BondageItem; import com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -63,7 +63,10 @@ public class PlayerClothesPermission { * @return true if clothes can be changed */ public boolean canChangeClothes() { - ItemStack clothes = V2EquipmentHelper.getInRegion(host.getPlayer(), BodyRegionV2.TORSO); + ItemStack clothes = V2EquipmentHelper.getInRegion( + host.getPlayer(), + BodyRegionV2.TORSO + ); if (clothes.isEmpty()) return true; // Check if clothes are locked @@ -95,20 +98,28 @@ public class PlayerClothesPermission { */ public ItemStack replaceClothes(ItemStack newClothes, boolean force) { Player player = host.getPlayer(); - if (player == null || player.level().isClientSide) return ItemStack.EMPTY; + if ( + player == null || player.level().isClientSide + ) return ItemStack.EMPTY; IV2BondageEquipment equip = V2EquipmentHelper.getEquipment(player); if (equip == null) return ItemStack.EMPTY; // Take off old clothes - ItemStack old = V2EquipmentHelper.unequipFromRegion(player, BodyRegionV2.TORSO); + ItemStack old = V2EquipmentHelper.unequipFromRegion( + player, + BodyRegionV2.TORSO + ); // Equip new clothes if we successfully removed old ones if (!old.isEmpty()) { equip.setInRegion(BodyRegionV2.TORSO, newClothes.copy()); // Fire lifecycle hook for new item - if (!newClothes.isEmpty() && newClothes.getItem() instanceof IV2BondageItem newItem) { + if ( + !newClothes.isEmpty() && + newClothes.getItem() instanceof IV2BondageItem newItem + ) { newItem.onEquipped(newClothes, player); } diff --git a/src/main/java/com/tiedup/remake/state/components/PlayerDataRetrieval.java b/src/main/java/com/tiedup/remake/state/components/PlayerDataRetrieval.java index f65c097..73d9db0 100644 --- a/src/main/java/com/tiedup/remake/state/components/PlayerDataRetrieval.java +++ b/src/main/java/com/tiedup/remake/state/components/PlayerDataRetrieval.java @@ -29,31 +29,52 @@ public class PlayerDataRetrieval { // ========== Equipment Getters ========== public ItemStack getCurrentBind() { - return V2EquipmentHelper.getInRegion(host.getPlayer(), BodyRegionV2.ARMS); + return V2EquipmentHelper.getInRegion( + host.getPlayer(), + BodyRegionV2.ARMS + ); } public ItemStack getCurrentGag() { - return V2EquipmentHelper.getInRegion(host.getPlayer(), BodyRegionV2.MOUTH); + return V2EquipmentHelper.getInRegion( + host.getPlayer(), + BodyRegionV2.MOUTH + ); } public ItemStack getCurrentBlindfold() { - return V2EquipmentHelper.getInRegion(host.getPlayer(), BodyRegionV2.EYES); + return V2EquipmentHelper.getInRegion( + host.getPlayer(), + BodyRegionV2.EYES + ); } public ItemStack getCurrentEarplugs() { - return V2EquipmentHelper.getInRegion(host.getPlayer(), BodyRegionV2.EARS); + return V2EquipmentHelper.getInRegion( + host.getPlayer(), + BodyRegionV2.EARS + ); } public ItemStack getCurrentClothes() { - return V2EquipmentHelper.getInRegion(host.getPlayer(), BodyRegionV2.TORSO); + return V2EquipmentHelper.getInRegion( + host.getPlayer(), + BodyRegionV2.TORSO + ); } public ItemStack getCurrentMittens() { - return V2EquipmentHelper.getInRegion(host.getPlayer(), BodyRegionV2.HANDS); + return V2EquipmentHelper.getInRegion( + host.getPlayer(), + BodyRegionV2.HANDS + ); } public ItemStack getCurrentCollar() { - return V2EquipmentHelper.getInRegion(host.getPlayer(), BodyRegionV2.NECK); + return V2EquipmentHelper.getInRegion( + host.getPlayer(), + BodyRegionV2.NECK + ); } // ========== Player Information ========== @@ -97,7 +118,6 @@ public class PlayerDataRetrieval { /** * Check if player has clothes with small arms flag. - * TODO Phase 14+: Check clothes NBT for small arms flag */ public boolean hasClothesWithSmallArms() { return false; diff --git a/src/main/java/com/tiedup/remake/state/components/PlayerEquipment.java b/src/main/java/com/tiedup/remake/state/components/PlayerEquipment.java index 388f999..a25bfad 100644 --- a/src/main/java/com/tiedup/remake/state/components/PlayerEquipment.java +++ b/src/main/java/com/tiedup/remake/state/components/PlayerEquipment.java @@ -1,12 +1,12 @@ package com.tiedup.remake.state.components; -import com.tiedup.remake.v2.bondage.IV2BondageItem; import com.tiedup.remake.items.base.ILockable; import com.tiedup.remake.items.base.ItemBind; import com.tiedup.remake.items.base.ItemCollar; import com.tiedup.remake.state.hosts.IPlayerBindStateHost; import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.v2.bondage.IV2BondageEquipment; +import com.tiedup.remake.v2.bondage.IV2BondageItem; import com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper; import java.util.function.Supplier; import net.minecraft.world.entity.player.Player; @@ -61,7 +61,7 @@ public class PlayerEquipment { host.syncClothesConfig(); } - /** Equips mittens (blocks hand interactions). Phase 14.4: Mittens system. Issue #14 fix: now calls onEquipped. */ + /** Equips mittens (blocks hand interactions). Mittens system. Issue #14 fix: now calls onEquipped. */ public void putMittensOn(ItemStack mittens) { equipInRegion(BodyRegionV2.HANDS, mittens); checkMittensAfterApply(); @@ -77,40 +77,67 @@ public class PlayerEquipment { /** Removes binds and restores speed. */ public ItemStack takeBindOff() { - return V2EquipmentHelper.unequipFromRegion(host.getPlayer(), BodyRegionV2.ARMS); + return V2EquipmentHelper.unequipFromRegion( + host.getPlayer(), + BodyRegionV2.ARMS + ); } public ItemStack takeGagOff() { - return V2EquipmentHelper.unequipFromRegion(host.getPlayer(), BodyRegionV2.MOUTH); + return V2EquipmentHelper.unequipFromRegion( + host.getPlayer(), + BodyRegionV2.MOUTH + ); } public ItemStack takeBlindfoldOff() { - return V2EquipmentHelper.unequipFromRegion(host.getPlayer(), BodyRegionV2.EYES); + return V2EquipmentHelper.unequipFromRegion( + host.getPlayer(), + BodyRegionV2.EYES + ); } public ItemStack takeCollarOff() { - return V2EquipmentHelper.unequipFromRegion(host.getPlayer(), BodyRegionV2.NECK); + return V2EquipmentHelper.unequipFromRegion( + host.getPlayer(), + BodyRegionV2.NECK + ); } - /** Removes mittens. Phase 14.4: Mittens system */ + /** Removes mittens. Mittens system */ public ItemStack takeMittensOff() { - ItemStack mittens = V2EquipmentHelper.getInRegion(host.getPlayer(), BodyRegionV2.HANDS); + ItemStack mittens = V2EquipmentHelper.getInRegion( + host.getPlayer(), + BodyRegionV2.HANDS + ); if (isLocked(mittens, false)) { return ItemStack.EMPTY; } - return V2EquipmentHelper.unequipFromRegion(host.getPlayer(), BodyRegionV2.HANDS); + return V2EquipmentHelper.unequipFromRegion( + host.getPlayer(), + BodyRegionV2.HANDS + ); } public ItemStack takeEarplugsOff() { - ItemStack earplugs = V2EquipmentHelper.getInRegion(host.getPlayer(), BodyRegionV2.EARS); + ItemStack earplugs = V2EquipmentHelper.getInRegion( + host.getPlayer(), + BodyRegionV2.EARS + ); if (isLocked(earplugs, false)) { return ItemStack.EMPTY; } - return V2EquipmentHelper.unequipFromRegion(host.getPlayer(), BodyRegionV2.EARS); + return V2EquipmentHelper.unequipFromRegion( + host.getPlayer(), + BodyRegionV2.EARS + ); } public ItemStack takeClothesOff() { - ItemStack clothes = V2EquipmentHelper.unequipFromRegion(host.getPlayer(), BodyRegionV2.TORSO); + ItemStack clothes = V2EquipmentHelper.unequipFromRegion( + host.getPlayer(), + BodyRegionV2.TORSO + ); // Sync clothes removal to all tracking clients host.syncClothesConfig(); return clothes; @@ -121,7 +148,10 @@ public class PlayerEquipment { */ public ItemStack takeCollarOff(boolean force) { Player player = host.getPlayer(); - ItemStack collar = V2EquipmentHelper.getInRegion(player, BodyRegionV2.NECK); + ItemStack collar = V2EquipmentHelper.getInRegion( + player, + BodyRegionV2.NECK + ); if (collar.isEmpty()) return ItemStack.EMPTY; if (collar.getItem() instanceof ItemCollar collarItem) { @@ -135,21 +165,30 @@ public class PlayerEquipment { /** Replaces the blindfold and returns the old one. Issue #14 fix: now calls lifecycle hooks. */ public ItemStack replaceBlindfold(ItemStack newBlindfold) { - ItemStack current = V2EquipmentHelper.getInRegion(host.getPlayer(), BodyRegionV2.EYES); + ItemStack current = V2EquipmentHelper.getInRegion( + host.getPlayer(), + BodyRegionV2.EYES + ); if (current.isEmpty()) return ItemStack.EMPTY; return replaceInRegion(BodyRegionV2.EYES, newBlindfold); } /** Replaces the gag and returns the old one. Issue #14 fix: now calls lifecycle hooks. */ public ItemStack replaceGag(ItemStack newGag) { - ItemStack current = V2EquipmentHelper.getInRegion(host.getPlayer(), BodyRegionV2.MOUTH); + ItemStack current = V2EquipmentHelper.getInRegion( + host.getPlayer(), + BodyRegionV2.MOUTH + ); if (current.isEmpty()) return ItemStack.EMPTY; return replaceInRegion(BodyRegionV2.MOUTH, newGag); } /** Replaces the collar and returns the old one. Issue #14 fix: now calls lifecycle hooks. */ public ItemStack replaceCollar(ItemStack newCollar) { - ItemStack current = V2EquipmentHelper.getInRegion(host.getPlayer(), BodyRegionV2.NECK); + ItemStack current = V2EquipmentHelper.getInRegion( + host.getPlayer(), + BodyRegionV2.NECK + ); if (current.isEmpty()) return ItemStack.EMPTY; return replaceInRegion(BodyRegionV2.NECK, newCollar); } @@ -176,7 +215,10 @@ public class PlayerEquipment { if (newBind.isEmpty()) { return ItemStack.EMPTY; } - ItemStack current = V2EquipmentHelper.getInRegion(host.getPlayer(), BodyRegionV2.ARMS); + ItemStack current = V2EquipmentHelper.getInRegion( + host.getPlayer(), + BodyRegionV2.ARMS + ); if (isLocked(current, force)) { return ItemStack.EMPTY; } @@ -188,27 +230,42 @@ public class PlayerEquipment { } public ItemStack replaceGag(ItemStack newGag, boolean force) { - ItemStack current = V2EquipmentHelper.getInRegion(host.getPlayer(), BodyRegionV2.MOUTH); + ItemStack current = V2EquipmentHelper.getInRegion( + host.getPlayer(), + BodyRegionV2.MOUTH + ); if (isLocked(current, force)) { return ItemStack.EMPTY; } - ItemStack old = V2EquipmentHelper.unequipFromRegion(host.getPlayer(), BodyRegionV2.MOUTH); + ItemStack old = V2EquipmentHelper.unequipFromRegion( + host.getPlayer(), + BodyRegionV2.MOUTH + ); putGagOn(newGag); return old; } public ItemStack replaceBlindfold(ItemStack newBlindfold, boolean force) { - ItemStack current = V2EquipmentHelper.getInRegion(host.getPlayer(), BodyRegionV2.EYES); + ItemStack current = V2EquipmentHelper.getInRegion( + host.getPlayer(), + BodyRegionV2.EYES + ); if (isLocked(current, force)) { return ItemStack.EMPTY; } - ItemStack old = V2EquipmentHelper.unequipFromRegion(host.getPlayer(), BodyRegionV2.EYES); + ItemStack old = V2EquipmentHelper.unequipFromRegion( + host.getPlayer(), + BodyRegionV2.EYES + ); putBlindfoldOn(newBlindfold); return old; } public ItemStack replaceCollar(ItemStack newCollar, boolean force) { - ItemStack current = V2EquipmentHelper.getInRegion(host.getPlayer(), BodyRegionV2.NECK); + ItemStack current = V2EquipmentHelper.getInRegion( + host.getPlayer(), + BodyRegionV2.NECK + ); if (isLocked(current, force)) { return ItemStack.EMPTY; } @@ -222,7 +279,10 @@ public class PlayerEquipment { } public ItemStack replaceEarplugs(ItemStack newEarplugs, boolean force) { - ItemStack current = V2EquipmentHelper.getInRegion(host.getPlayer(), BodyRegionV2.EARS); + ItemStack current = V2EquipmentHelper.getInRegion( + host.getPlayer(), + BodyRegionV2.EARS + ); if (isLocked(current, force)) { return ItemStack.EMPTY; } @@ -236,7 +296,10 @@ public class PlayerEquipment { } public ItemStack replaceMittens(ItemStack newMittens, boolean force) { - ItemStack current = V2EquipmentHelper.getInRegion(host.getPlayer(), BodyRegionV2.HANDS); + ItemStack current = V2EquipmentHelper.getInRegion( + host.getPlayer(), + BodyRegionV2.HANDS + ); if (isLocked(current, force)) { return ItemStack.EMPTY; } @@ -250,11 +313,13 @@ public class PlayerEquipment { // ========== Resistance Methods ========== /** - * Phase 14.1.7: Now part of IRestrainable interface */ public synchronized int getCurrentBindResistance() { Player player = host.getPlayer(); - ItemStack stack = V2EquipmentHelper.getInRegion(player, BodyRegionV2.ARMS); + ItemStack stack = V2EquipmentHelper.getInRegion( + player, + BodyRegionV2.ARMS + ); if ( stack.isEmpty() || !(stack.getItem() instanceof ItemBind bind) ) return 0; @@ -262,11 +327,13 @@ public class PlayerEquipment { } /** - * Phase 14.1.7: Now part of IRestrainable interface */ public synchronized void setCurrentBindResistance(int resistance) { Player player = host.getPlayer(); - ItemStack stack = V2EquipmentHelper.getInRegion(player, BodyRegionV2.ARMS); + ItemStack stack = V2EquipmentHelper.getInRegion( + player, + BodyRegionV2.ARMS + ); if ( stack.isEmpty() || !(stack.getItem() instanceof ItemBind bind) ) return; @@ -274,11 +341,13 @@ public class PlayerEquipment { } /** - * Phase 14.1.7: Added for IRestrainable interface */ public synchronized int getCurrentCollarResistance() { Player player = host.getPlayer(); - ItemStack stack = V2EquipmentHelper.getInRegion(player, BodyRegionV2.NECK); + ItemStack stack = V2EquipmentHelper.getInRegion( + player, + BodyRegionV2.NECK + ); if ( stack.isEmpty() || !(stack.getItem() instanceof ItemCollar collar) ) return 0; @@ -286,11 +355,13 @@ public class PlayerEquipment { } /** - * Phase 14.1.7: Added for IRestrainable interface */ public synchronized void setCurrentCollarResistance(int resistance) { Player player = host.getPlayer(); - ItemStack stack = V2EquipmentHelper.getInRegion(player, BodyRegionV2.NECK); + ItemStack stack = V2EquipmentHelper.getInRegion( + player, + BodyRegionV2.NECK + ); if ( stack.isEmpty() || !(stack.getItem() instanceof ItemCollar collar) ) return; @@ -339,7 +410,10 @@ public class PlayerEquipment { } private boolean hasMittens() { - return V2EquipmentHelper.isRegionOccupied(host.getPlayer(), BodyRegionV2.HANDS); + return V2EquipmentHelper.isRegionOccupied( + host.getPlayer(), + BodyRegionV2.HANDS + ); } // ========== Low-level V2 equipment operations ========== @@ -380,7 +454,9 @@ public class PlayerEquipment { */ private ItemStack replaceInRegion(BodyRegionV2 region, ItemStack newStack) { Player player = host.getPlayer(); - if (player == null || player.level().isClientSide) return ItemStack.EMPTY; + if ( + player == null || player.level().isClientSide + ) return ItemStack.EMPTY; IV2BondageEquipment equip = V2EquipmentHelper.getEquipment(player); if (equip == null) return ItemStack.EMPTY; @@ -388,7 +464,10 @@ public class PlayerEquipment { ItemStack oldStack = equip.getInRegion(region); // Call onUnequipped for the old item - if (!oldStack.isEmpty() && oldStack.getItem() instanceof IV2BondageItem oldItem) { + if ( + !oldStack.isEmpty() && + oldStack.getItem() instanceof IV2BondageItem oldItem + ) { oldItem.onUnequipped(oldStack, player); } @@ -396,7 +475,10 @@ public class PlayerEquipment { equip.setInRegion(region, newStack.copy()); // Call onEquipped for the new item - if (!newStack.isEmpty() && newStack.getItem() instanceof IV2BondageItem newItem) { + if ( + !newStack.isEmpty() && + newStack.getItem() instanceof IV2BondageItem newItem + ) { newItem.onEquipped(newStack, player); } diff --git a/src/main/java/com/tiedup/remake/state/components/PlayerLifecycle.java b/src/main/java/com/tiedup/remake/state/components/PlayerLifecycle.java index 1b9e764..55d1cba 100644 --- a/src/main/java/com/tiedup/remake/state/components/PlayerLifecycle.java +++ b/src/main/java/com/tiedup/remake/state/components/PlayerLifecycle.java @@ -1,11 +1,11 @@ package com.tiedup.remake.state.components; import com.tiedup.remake.cells.CampOwnership; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.cells.CellRegistryV2; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.items.base.ItemBind; import com.tiedup.remake.state.hosts.IPlayerBindStateHost; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.UUID; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.player.Player; @@ -47,7 +47,6 @@ public class PlayerLifecycle { // Update player reference host.setOnline(true); - // Phase 17: Clear captor reference (enslavement ends on disconnect) host.setCaptor(null); // Reset struggle animation state (prevent stuck animations) diff --git a/src/main/java/com/tiedup/remake/state/components/PlayerSale.java b/src/main/java/com/tiedup/remake/state/components/PlayerSale.java index 69b89c5..35da70d 100644 --- a/src/main/java/com/tiedup/remake/state/components/PlayerSale.java +++ b/src/main/java/com/tiedup/remake/state/components/PlayerSale.java @@ -4,7 +4,6 @@ import com.tiedup.remake.util.tasks.ItemTask; /** * Component responsible for player sale system. - * Phase 14.3.5: Sale system fields * * Single Responsibility: Sale state management * Complexity: LOW (simple state tracking) diff --git a/src/main/java/com/tiedup/remake/state/components/PlayerShockCollar.java b/src/main/java/com/tiedup/remake/state/components/PlayerShockCollar.java index ae0f901..3385eef 100644 --- a/src/main/java/com/tiedup/remake/state/components/PlayerShockCollar.java +++ b/src/main/java/com/tiedup/remake/state/components/PlayerShockCollar.java @@ -1,7 +1,6 @@ package com.tiedup.remake.state.components; import com.tiedup.remake.core.ModSounds; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.core.SystemMessageManager; import com.tiedup.remake.core.SystemMessageManager.MessageCategory; import com.tiedup.remake.core.TiedUpMod; @@ -10,6 +9,7 @@ import com.tiedup.remake.items.ItemShockCollarAuto; import com.tiedup.remake.state.hosts.IPlayerBindStateHost; import com.tiedup.remake.util.GameConstants; import com.tiedup.remake.util.time.Timer; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.List; import java.util.UUID; import net.minecraft.ChatFormatting; @@ -20,7 +20,6 @@ import org.jetbrains.annotations.Nullable; /** * Component responsible for shock collar mechanics and GPS tracking. - * Phase 13: Advanced collar features (shocks, GPS tracking) * * Single Responsibility: Collar automation and GPS monitoring * Complexity: HIGH (synchronized timer, GPS zone checks, network messages) @@ -32,7 +31,6 @@ public class PlayerShockCollar { private final IPlayerBindStateHost host; - // Phase 13: Collar automation fields // volatile: accessed from synchronized blocks across multiple threads private volatile Timer timerAutoShockCollar; private final Object lockTimerAutoShock = new Object(); diff --git a/src/main/java/com/tiedup/remake/state/components/PlayerSpecialActions.java b/src/main/java/com/tiedup/remake/state/components/PlayerSpecialActions.java index 323ea09..5246187 100644 --- a/src/main/java/com/tiedup/remake/state/components/PlayerSpecialActions.java +++ b/src/main/java/com/tiedup/remake/state/components/PlayerSpecialActions.java @@ -9,7 +9,6 @@ import com.tiedup.remake.v2.BodyRegionV2; /** * Component responsible for special player interactions. * v2.5: Knife cut target for accessory cutting - * Phase 14.1.7: Item transfers between players * * Single Responsibility: Special action management * Complexity: MEDIUM (external dependencies) @@ -67,14 +66,12 @@ public class PlayerSpecialActions { } /** - * Phase 14.1.7: Transfer bondage item from this player to another. * Updated to use IRestrainable parameter (was PlayerBindState) * * @param taker The entity taking the item * @param slotIndex The slot index to take from */ public void takeBondageItemBy(IRestrainableEntity taker, int slotIndex) { - // TODO Phase 14+: Transfer item from this player to taker TiedUpMod.LOGGER.debug( "[PlayerSpecialActions] {} taking bondage item from {} (slot {})", taker.getKidnappedName(), diff --git a/src/main/java/com/tiedup/remake/state/components/PlayerStateQuery.java b/src/main/java/com/tiedup/remake/state/components/PlayerStateQuery.java index 311e4d4..8cb10b7 100644 --- a/src/main/java/com/tiedup/remake/state/components/PlayerStateQuery.java +++ b/src/main/java/com/tiedup/remake/state/components/PlayerStateQuery.java @@ -28,22 +28,34 @@ public class PlayerStateQuery { /** Check if player has ropes/ties equipped. */ public boolean isTiedUp() { - return V2EquipmentHelper.isRegionOccupied(host.getPlayer(), BodyRegionV2.ARMS); + return V2EquipmentHelper.isRegionOccupied( + host.getPlayer(), + BodyRegionV2.ARMS + ); } /** Check if player is currently gagged. */ public boolean isGagged() { - return V2EquipmentHelper.isRegionOccupied(host.getPlayer(), BodyRegionV2.MOUTH); + return V2EquipmentHelper.isRegionOccupied( + host.getPlayer(), + BodyRegionV2.MOUTH + ); } /** Check if player is blindfolded. */ public boolean isBlindfolded() { - return V2EquipmentHelper.isRegionOccupied(host.getPlayer(), BodyRegionV2.EYES); + return V2EquipmentHelper.isRegionOccupied( + host.getPlayer(), + BodyRegionV2.EYES + ); } /** Check if player has earplugs. */ public boolean hasEarplugs() { - return V2EquipmentHelper.isRegionOccupied(host.getPlayer(), BodyRegionV2.EARS); + return V2EquipmentHelper.isRegionOccupied( + host.getPlayer(), + BodyRegionV2.EARS + ); } public boolean isEarplugged() { @@ -52,22 +64,34 @@ public class PlayerStateQuery { /** Check if player is wearing a collar. */ public boolean hasCollar() { - return V2EquipmentHelper.isRegionOccupied(host.getPlayer(), BodyRegionV2.NECK); + return V2EquipmentHelper.isRegionOccupied( + host.getPlayer(), + BodyRegionV2.NECK + ); } /** Returns the current collar ItemStack, or empty if none. */ public ItemStack getCurrentCollar() { if (!hasCollar()) return ItemStack.EMPTY; - return V2EquipmentHelper.getInRegion(host.getPlayer(), BodyRegionV2.NECK); + return V2EquipmentHelper.getInRegion( + host.getPlayer(), + BodyRegionV2.NECK + ); } public boolean hasClothes() { - return V2EquipmentHelper.isRegionOccupied(host.getPlayer(), BodyRegionV2.TORSO); + return V2EquipmentHelper.isRegionOccupied( + host.getPlayer(), + BodyRegionV2.TORSO + ); } - /** Check if player has mittens equipped. Phase 14.4: Mittens system */ + /** Check if player has mittens equipped. Mittens system */ public boolean hasMittens() { - return V2EquipmentHelper.isRegionOccupied(host.getPlayer(), BodyRegionV2.HANDS); + return V2EquipmentHelper.isRegionOccupied( + host.getPlayer(), + BodyRegionV2.HANDS + ); } /** Check if player can be tied up (not already tied). */ @@ -104,7 +128,10 @@ public class PlayerStateQuery { */ public boolean hasGaggingEffect() { if (!isGagged()) return false; - ItemStack gag = V2EquipmentHelper.getInRegion(host.getPlayer(), BodyRegionV2.MOUTH); + ItemStack gag = V2EquipmentHelper.getInRegion( + host.getPlayer(), + BodyRegionV2.MOUTH + ); if (gag.isEmpty()) return false; return ( gag.getItem() instanceof @@ -118,7 +145,10 @@ public class PlayerStateQuery { */ public boolean hasBlindingEffect() { if (!isBlindfolded()) return false; - ItemStack blindfold = V2EquipmentHelper.getInRegion(host.getPlayer(), BodyRegionV2.EYES); + ItemStack blindfold = V2EquipmentHelper.getInRegion( + host.getPlayer(), + BodyRegionV2.EYES + ); if (blindfold.isEmpty()) return false; return ( blindfold.getItem() instanceof diff --git a/src/main/java/com/tiedup/remake/state/components/PlayerStruggle.java b/src/main/java/com/tiedup/remake/state/components/PlayerStruggle.java index 29d8280..94aac69 100644 --- a/src/main/java/com/tiedup/remake/state/components/PlayerStruggle.java +++ b/src/main/java/com/tiedup/remake/state/components/PlayerStruggle.java @@ -8,7 +8,6 @@ import net.minecraft.world.entity.player.Player; /** * Component responsible for struggle mechanics and resistance management. - * Phase 7: Struggle & Resistance Methods * * Single Responsibility: Struggle state and resistance tracking * Complexity: MEDIUM (volatile fields, animation coordination) @@ -24,7 +23,6 @@ public class PlayerStruggle { private final IPlayerBindStateHost host; private final PlayerBindState state; // Cast reference for struggle system - // Phase 7 & 8: Struggle state tracking private final StruggleBinds struggleBindState; private final StruggleCollar struggleCollarState; diff --git a/src/main/java/com/tiedup/remake/state/components/PlayerTaskManagement.java b/src/main/java/com/tiedup/remake/state/components/PlayerTaskManagement.java index bde52d1..55db0ee 100644 --- a/src/main/java/com/tiedup/remake/state/components/PlayerTaskManagement.java +++ b/src/main/java/com/tiedup/remake/state/components/PlayerTaskManagement.java @@ -7,7 +7,6 @@ import com.tiedup.remake.tasks.UntyingTask; /** * Component responsible for tracking tying/untying tasks. - * Phase 6: Tying/Untying task tracking (Phase 14.2.6: unified for Players + NPCs) * * Single Responsibility: Task state management * Complexity: LOW (simple getters/setters) diff --git a/src/main/java/com/tiedup/remake/state/struggle/StruggleAccessory.java b/src/main/java/com/tiedup/remake/state/struggle/StruggleAccessory.java index 0287a6f..54edfdc 100644 --- a/src/main/java/com/tiedup/remake/state/struggle/StruggleAccessory.java +++ b/src/main/java/com/tiedup/remake/state/struggle/StruggleAccessory.java @@ -11,7 +11,6 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; /** - * Phase 21: Struggle implementation for accessory items (gag, blindfold, earplugs, collar). * * Accessories have NO base resistance - only locked items can be struggled. * Lock adds 250 resistance. Struggle success destroys the padlock (lockable=false). @@ -189,12 +188,14 @@ public class StruggleAccessory extends StruggleState { } /** - * Phase 13: Trigger shock collar check when struggling against accessories. */ @Override protected boolean onAttempt(PlayerBindState state) { Player player = state.getPlayer(); - ItemStack collar = V2EquipmentHelper.getInRegion(player, BodyRegionV2.NECK); + ItemStack collar = V2EquipmentHelper.getInRegion( + player, + BodyRegionV2.NECK + ); if ( !collar.isEmpty() && diff --git a/src/main/java/com/tiedup/remake/state/struggle/StruggleBinds.java b/src/main/java/com/tiedup/remake/state/struggle/StruggleBinds.java index cb8c1a9..f32c357 100644 --- a/src/main/java/com/tiedup/remake/state/struggle/StruggleBinds.java +++ b/src/main/java/com/tiedup/remake/state/struggle/StruggleBinds.java @@ -1,5 +1,6 @@ package com.tiedup.remake.state.struggle; +import com.tiedup.remake.core.SettingsAccessor; import com.tiedup.remake.core.SystemMessageManager; import com.tiedup.remake.core.SystemMessageManager.MessageCategory; import com.tiedup.remake.core.TiedUpMod; @@ -7,7 +8,6 @@ import com.tiedup.remake.items.base.ILockable; import com.tiedup.remake.items.base.ItemBind; import com.tiedup.remake.state.IPlayerLeashAccess; import com.tiedup.remake.state.PlayerBindState; -import com.tiedup.remake.core.SettingsAccessor; import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper; import net.minecraft.world.entity.item.ItemEntity; @@ -15,7 +15,6 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; /** - * Phase 7: Struggle implementation for bind restraints (ropes). * * Handles struggling against binds: * - Gets/sets resistance from equipped bind item @@ -58,7 +57,6 @@ public class StruggleBinds extends StruggleState { * - No bind item equipped * - Bind item has struggle disabled * - * Phase 20: Locked items can now be struggled, but with x10 resistance. * The resistance penalty is applied in StruggleState.struggle(). * * Based on original StruggleBinds.canStruggle() (lines 33-41) @@ -73,7 +71,10 @@ public class StruggleBinds extends StruggleState { return false; } - ItemStack bindStack = V2EquipmentHelper.getInRegion(player, BodyRegionV2.ARMS); + ItemStack bindStack = V2EquipmentHelper.getInRegion( + player, + BodyRegionV2.ARMS + ); if ( bindStack.isEmpty() || !(bindStack.getItem() instanceof ItemBind bind) @@ -81,11 +82,10 @@ public class StruggleBinds extends StruggleState { return false; } - // Phase 20: Locked items can now be struggled (with x10 resistance) // The locked check has been moved to struggle() where decrease is reduced return bind.canBeStruggledOut(bindStack); -} + } /** * Check if the bind item is locked. @@ -99,7 +99,10 @@ public class StruggleBinds extends StruggleState { Player player = state.getPlayer(); if (player == null) return false; - ItemStack bindStack = V2EquipmentHelper.getInRegion(player, BodyRegionV2.ARMS); + ItemStack bindStack = V2EquipmentHelper.getInRegion( + player, + BodyRegionV2.ARMS + ); if ( bindStack.isEmpty() || !(bindStack.getItem() instanceof ItemBind bind) @@ -135,13 +138,15 @@ public class StruggleBinds extends StruggleState { } /** - * Phase 13: Trigger shock collar check even when struggling against binds. * If shocked, the attempt is missed. */ @Override protected boolean onAttempt(PlayerBindState state) { Player player = state.getPlayer(); - ItemStack collar = V2EquipmentHelper.getInRegion(player, BodyRegionV2.NECK); + ItemStack collar = V2EquipmentHelper.getInRegion( + player, + BodyRegionV2.NECK + ); if ( !collar.isEmpty() && @@ -157,7 +162,6 @@ public class StruggleBinds extends StruggleState { * Drop the bind items to the ground. * Accessories are NOT dropped during bind struggle. * - * Phase 21: Struggle success destroys the padlock (lockable=false). * * Based on original StruggleBinds.dropBondageItems() (lines 50-69) * @@ -170,9 +174,11 @@ public class StruggleBinds extends StruggleState { } // ONLY drop the BIND slot - ItemStack stack = V2EquipmentHelper.getInRegion(player, BodyRegionV2.ARMS); + ItemStack stack = V2EquipmentHelper.getInRegion( + player, + BodyRegionV2.ARMS + ); if (!stack.isEmpty()) { - // Phase 21: Struggle success DESTROYS the padlock // The bind drops without its padlock (lockable=false) ItemStack toDrop = stack.copy(); if ( @@ -217,7 +223,6 @@ public class StruggleBinds extends StruggleState { return; } - // Phase 17: 1. Remove from captivity/leash if (state.isCaptive()) { state.free(); } @@ -240,7 +245,6 @@ public class StruggleBinds extends StruggleState { } /** - * Phase 2: External success action for mini-game system. * Called when player completes struggle mini-game successfully. * * @param state The player's bind state @@ -250,7 +254,6 @@ public class StruggleBinds extends StruggleState { } /** - * Phase 2: Set external cooldown timer (e.g., from mini-game exhaustion). * * @param seconds Cooldown duration in seconds * @param level The level for timer @@ -310,7 +313,10 @@ public class StruggleBinds extends StruggleState { return; } - ItemStack bindStack = V2EquipmentHelper.getInRegion(target, BodyRegionV2.ARMS); + ItemStack bindStack = V2EquipmentHelper.getInRegion( + target, + BodyRegionV2.ARMS + ); if ( bindStack.isEmpty() || !(bindStack.getItem() instanceof ItemBind bind) diff --git a/src/main/java/com/tiedup/remake/state/struggle/StruggleCollar.java b/src/main/java/com/tiedup/remake/state/struggle/StruggleCollar.java index 48352e7..ec46cad 100644 --- a/src/main/java/com/tiedup/remake/state/struggle/StruggleCollar.java +++ b/src/main/java/com/tiedup/remake/state/struggle/StruggleCollar.java @@ -10,7 +10,6 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; /** - * Phase 8: Master-Slave Relationships * * Struggle mechanics specifically for locked collars. * @@ -45,7 +44,10 @@ public class StruggleCollar extends StruggleState { @Override protected int getResistanceState(PlayerBindState state) { Player player = state.getPlayer(); - ItemStack collar = V2EquipmentHelper.getInRegion(player, BodyRegionV2.NECK); + ItemStack collar = V2EquipmentHelper.getInRegion( + player, + BodyRegionV2.NECK + ); if ( collar.isEmpty() || @@ -66,7 +68,10 @@ public class StruggleCollar extends StruggleState { @Override protected void setResistanceState(PlayerBindState state, int resistance) { Player player = state.getPlayer(); - ItemStack collar = V2EquipmentHelper.getInRegion(player, BodyRegionV2.NECK); + ItemStack collar = V2EquipmentHelper.getInRegion( + player, + BodyRegionV2.NECK + ); if ( collar.isEmpty() || @@ -95,12 +100,14 @@ public class StruggleCollar extends StruggleState { protected boolean canStruggle(PlayerBindState state) { Player player = state.getPlayer(); - // Phase 13 logic: Can only struggle against collar if NOT tied up if (state.isTiedUp()) { return false; } - ItemStack collar = V2EquipmentHelper.getInRegion(player, BodyRegionV2.NECK); + ItemStack collar = V2EquipmentHelper.getInRegion( + player, + BodyRegionV2.NECK + ); if ( collar.isEmpty() || @@ -134,7 +141,10 @@ public class StruggleCollar extends StruggleState { @Override protected boolean onAttempt(PlayerBindState state) { Player player = state.getPlayer(); - ItemStack collar = V2EquipmentHelper.getInRegion(player, BodyRegionV2.NECK); + ItemStack collar = V2EquipmentHelper.getInRegion( + player, + BodyRegionV2.NECK + ); if ( !collar.isEmpty() && @@ -157,7 +167,10 @@ public class StruggleCollar extends StruggleState { @Override protected void successAction(PlayerBindState state) { Player player = state.getPlayer(); - ItemStack collar = V2EquipmentHelper.getInRegion(player, BodyRegionV2.NECK); + ItemStack collar = V2EquipmentHelper.getInRegion( + player, + BodyRegionV2.NECK + ); if ( collar.isEmpty() || @@ -217,7 +230,10 @@ public class StruggleCollar extends StruggleState { return; } - ItemStack collar = V2EquipmentHelper.getInRegion(target, BodyRegionV2.NECK); + ItemStack collar = V2EquipmentHelper.getInRegion( + target, + BodyRegionV2.NECK + ); if ( collar.isEmpty() || diff --git a/src/main/java/com/tiedup/remake/state/struggle/StruggleState.java b/src/main/java/com/tiedup/remake/state/struggle/StruggleState.java index abd637e..308523a 100644 --- a/src/main/java/com/tiedup/remake/state/struggle/StruggleState.java +++ b/src/main/java/com/tiedup/remake/state/struggle/StruggleState.java @@ -1,16 +1,15 @@ package com.tiedup.remake.state.struggle; +import com.tiedup.remake.core.SettingsAccessor; import com.tiedup.remake.core.SystemMessageManager; import com.tiedup.remake.core.SystemMessageManager.MessageCategory; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.state.PlayerBindState; -import com.tiedup.remake.core.SettingsAccessor; import com.tiedup.remake.util.time.Timer; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.GameRules; /** - * Phase 7: Base class for struggle mechanics. * * Handles the logic for players/NPCs struggling against restraints: * - Cooldown timer between attempts @@ -87,7 +86,6 @@ public abstract class StruggleState { ); } - // Phase 13: Trigger attempt effects (shock collar check) if (!onAttempt(state)) { return; // Interrupted by pain } @@ -100,8 +98,12 @@ public abstract class StruggleState { if (success) { // Calculate resistance decrease int currentResistance = getResistanceState(state); - int minDecrease = SettingsAccessor.getStruggleMinDecrease(gameRules); - int maxDecrease = SettingsAccessor.getStruggleMaxDecrease(gameRules); + int minDecrease = SettingsAccessor.getStruggleMinDecrease( + gameRules + ); + int maxDecrease = SettingsAccessor.getStruggleMaxDecrease( + gameRules + ); int decrease = minDecrease + diff --git a/src/main/java/com/tiedup/remake/tasks/PlayerStateTask.java b/src/main/java/com/tiedup/remake/tasks/PlayerStateTask.java index af8101d..87303a9 100644 --- a/src/main/java/com/tiedup/remake/tasks/PlayerStateTask.java +++ b/src/main/java/com/tiedup/remake/tasks/PlayerStateTask.java @@ -6,7 +6,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; /** - * Phase 6: Lightweight client-side task state for displaying progress. * * Based on original PlayerStateTask from 1.12.2 * diff --git a/src/main/java/com/tiedup/remake/tasks/TimedInteractTask.java b/src/main/java/com/tiedup/remake/tasks/TimedInteractTask.java index 81e208b..55f4102 100644 --- a/src/main/java/com/tiedup/remake/tasks/TimedInteractTask.java +++ b/src/main/java/com/tiedup/remake/tasks/TimedInteractTask.java @@ -6,8 +6,6 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; /** - * Phase 6: Timed task that involves interacting with a target entity. - * Phase 14.2.6: Refactored to support any IBondageState entity (Players + NPCs) * * Based on original TimedInteractTask from 1.12.2 * diff --git a/src/main/java/com/tiedup/remake/tasks/TimedTask.java b/src/main/java/com/tiedup/remake/tasks/TimedTask.java index 3cd75ef..428e401 100644 --- a/src/main/java/com/tiedup/remake/tasks/TimedTask.java +++ b/src/main/java/com/tiedup/remake/tasks/TimedTask.java @@ -3,7 +3,6 @@ package com.tiedup.remake.tasks; import net.minecraft.world.level.Level; /** - * Phase 6: Base class for all progress-based tasks (tying, untying, etc.) * * Based on original TimedTask from 1.12.2, refactored for continuous click requirement. * diff --git a/src/main/java/com/tiedup/remake/tasks/TyingPlayerTask.java b/src/main/java/com/tiedup/remake/tasks/TyingPlayerTask.java index dc6ac51..7da3492 100644 --- a/src/main/java/com/tiedup/remake/tasks/TyingPlayerTask.java +++ b/src/main/java/com/tiedup/remake/tasks/TyingPlayerTask.java @@ -1,11 +1,11 @@ package com.tiedup.remake.tasks; import com.tiedup.remake.core.TiedUpMod; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.network.ModNetwork; import com.tiedup.remake.network.action.PacketTying; import com.tiedup.remake.state.IBondageState; import com.tiedup.remake.state.PlayerBindState; +import com.tiedup.remake.v2.BodyRegionV2; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; @@ -13,8 +13,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; /** - * Phase 6: Concrete tying task for tying up any IBondageState entity. - * Phase 14.2.6: Unified to work with both Players and NPCs. * * Based on original TyingPlayerTask from 1.12.2 * @@ -115,9 +113,7 @@ public class TyingPlayerTask extends TyingTask { boolean isSelfTying = kidnapper != null && kidnapper.equals(targetEntity); - // ======================================== // SECURITY: Validate kidnapper is still close to target (skip for self-tying) - // ======================================== if (!isSelfTying && kidnapper != null && targetEntity != null) { double distance = kidnapper.distanceTo(targetEntity); if (distance > 4.0) { @@ -290,11 +286,16 @@ public class TyingPlayerTask extends TyingTask { if (isSelfTying) { if (kidnapper instanceof ServerPlayer serverPlayer) { PacketTying completionPacket = new PacketTying( - -1, this.getMaxSeconds(), true, "yourself" + -1, + this.getMaxSeconds(), + true, + "yourself" ); ModNetwork.sendToPlayer(completionPacket, serverPlayer); - PlayerBindState playerState = PlayerBindState.getInstance(serverPlayer); + PlayerBindState playerState = PlayerBindState.getInstance( + serverPlayer + ); if (playerState != null) { playerState.setRestrainedState(null); } @@ -302,11 +303,16 @@ public class TyingPlayerTask extends TyingTask { } else { if (targetEntity instanceof ServerPlayer serverTarget) { PacketTying completionPacket = new PacketTying( - -1, this.getMaxSeconds(), false, kidnapperName + -1, + this.getMaxSeconds(), + false, + kidnapperName ); ModNetwork.sendToPlayer(completionPacket, serverTarget); - PlayerBindState playerState = PlayerBindState.getInstance(serverTarget); + PlayerBindState playerState = PlayerBindState.getInstance( + serverTarget + ); if (playerState != null) { playerState.setRestrainedState(null); } @@ -314,7 +320,10 @@ public class TyingPlayerTask extends TyingTask { if (kidnapper instanceof ServerPlayer serverKidnapper) { PacketTying completionPacket = new PacketTying( - -1, this.getMaxSeconds(), true, targetName + -1, + this.getMaxSeconds(), + true, + targetName ); ModNetwork.sendToPlayer(completionPacket, serverKidnapper); } diff --git a/src/main/java/com/tiedup/remake/tasks/TyingTask.java b/src/main/java/com/tiedup/remake/tasks/TyingTask.java index 9a9991d..4be440e 100644 --- a/src/main/java/com/tiedup/remake/tasks/TyingTask.java +++ b/src/main/java/com/tiedup/remake/tasks/TyingTask.java @@ -6,8 +6,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; /** - * Phase 6: Abstract tying task (binding/gagging an entity). - * Phase 14.2.6: Refactored to support any IBondageState entity (Players + NPCs) * * Based on original TyingTask from 1.12.2 * diff --git a/src/main/java/com/tiedup/remake/tasks/UntyingPlayerTask.java b/src/main/java/com/tiedup/remake/tasks/UntyingPlayerTask.java index f681cdb..79371b4 100644 --- a/src/main/java/com/tiedup/remake/tasks/UntyingPlayerTask.java +++ b/src/main/java/com/tiedup/remake/tasks/UntyingPlayerTask.java @@ -18,8 +18,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; /** - * Phase 6: Concrete untying task for freeing a tied entity. - * Phase 14.2.6: Unified to work with both Players and NPCs. * * Based on original UntyingPlayerTask from 1.12.2 * @@ -92,9 +90,7 @@ public class UntyingPlayerTask extends UntyingTask { */ @Override public synchronized void update() { - // ======================================== // SECURITY: Validate helper is still close to target - // ======================================== if (helper != null && targetEntity != null) { double distance = helper.distanceTo(targetEntity); if (distance > 4.0) { @@ -184,7 +180,11 @@ public class UntyingPlayerTask extends UntyingTask { untieTarget(); // Handle Damsel-specific rewards - if (targetEntity instanceof EntityDamsel damsel && NpcTypeHelper.isDamselOnly(targetEntity) && helper != null) { + if ( + targetEntity instanceof EntityDamsel damsel && + NpcTypeHelper.isDamselOnly(targetEntity) && + helper != null + ) { // Reward the savior (gives emeralds and marks player as savior) damsel.rewardSavior(helper); } @@ -255,8 +255,12 @@ public class UntyingPlayerTask extends UntyingTask { private void dropBondageItems() { // For player targets: use V2EquipmentHelper to get all equipped items if (targetEntity instanceof Player player) { - Map equipped = V2EquipmentHelper.getAllEquipped(player); - for (Map.Entry entry : equipped.entrySet()) { + Map equipped = + V2EquipmentHelper.getAllEquipped(player); + for (Map.Entry< + BodyRegionV2, + ItemStack + > entry : equipped.entrySet()) { ItemStack stack = entry.getValue(); if (!stack.isEmpty()) { // Drop item at player's position @@ -375,7 +379,6 @@ public class UntyingPlayerTask extends UntyingTask { if (targetEntity instanceof Player player) { V2EquipmentHelper.clearAll(player); - // Phase 17: Free from captivity/leash if applicable (player-specific) PlayerBindState playerState = PlayerBindState.getInstance(player); if (playerState != null && playerState.isCaptive()) { playerState.free(); diff --git a/src/main/java/com/tiedup/remake/tasks/UntyingTask.java b/src/main/java/com/tiedup/remake/tasks/UntyingTask.java index 5ceeb43..620c8ab 100644 --- a/src/main/java/com/tiedup/remake/tasks/UntyingTask.java +++ b/src/main/java/com/tiedup/remake/tasks/UntyingTask.java @@ -5,8 +5,6 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; /** - * Phase 6: Abstract untying task (freeing a tied entity). - * Phase 14.2.6: Refactored to support any IBondageState entity (Players + NPCs) * * Based on original UntyingTask from 1.12.2 * diff --git a/src/main/java/com/tiedup/remake/tasks/V2TyingPlayerTask.java b/src/main/java/com/tiedup/remake/tasks/V2TyingPlayerTask.java index 47f1f86..f36f27c 100644 --- a/src/main/java/com/tiedup/remake/tasks/V2TyingPlayerTask.java +++ b/src/main/java/com/tiedup/remake/tasks/V2TyingPlayerTask.java @@ -78,7 +78,9 @@ public class V2TyingPlayerTask extends TyingPlayerTask { } // Consume the held item heldStack.shrink(1); - TiedUpMod.LOGGER.debug("[V2TyingPlayerTask] V2 equip succeeded, item consumed"); + TiedUpMod.LOGGER.debug( + "[V2TyingPlayerTask] V2 equip succeeded, item consumed" + ); } else { TiedUpMod.LOGGER.warn( "[V2TyingPlayerTask] V2 equip BLOCKED after tying — regions may have changed" diff --git a/src/main/java/com/tiedup/remake/util/FoodEffects.java b/src/main/java/com/tiedup/remake/util/FoodEffects.java index a7c0e00..f35dc96 100644 --- a/src/main/java/com/tiedup/remake/util/FoodEffects.java +++ b/src/main/java/com/tiedup/remake/util/FoodEffects.java @@ -1,9 +1,9 @@ package com.tiedup.remake.util; -import org.jetbrains.annotations.Nullable; import net.minecraft.world.food.FoodProperties; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; +import org.jetbrains.annotations.Nullable; /** * Calculates the effects of feeding food items to NPCs. diff --git a/src/main/java/com/tiedup/remake/util/GagMaterial.java b/src/main/java/com/tiedup/remake/util/GagMaterial.java index 6f2119f..4b5a688 100644 --- a/src/main/java/com/tiedup/remake/util/GagMaterial.java +++ b/src/main/java/com/tiedup/remake/util/GagMaterial.java @@ -5,8 +5,6 @@ import com.tiedup.remake.core.ModConfig; /** * GagMaterial DNA - Defines the "sound" and behavior of different gag materials. * - * Phase 15: Added PANEL, LATEX, RING, BITE, SPONGE, BAGUETTE - * Phase 16: Enhanced with phonetic properties for realistic speech transformation */ public enum GagMaterial { // Original materials @@ -63,7 +61,6 @@ public enum GagMaterial { 0.0f ), - // Phase 15: New materials PANEL( new String[] { "m", "n" }, new String[] { "mm", "nn" }, @@ -148,7 +145,6 @@ public enum GagMaterial { private final float defaultComprehension; private final double defaultTalkRange; - // Phase 16: Phonetic properties private final String dominantConsonant; private final String dominantVowel; private final float plosiveBleed; // b,d,g,k,p,t - require lip/tongue diff --git a/src/main/java/com/tiedup/remake/util/GameConstants.java b/src/main/java/com/tiedup/remake/util/GameConstants.java index 0b5f65d..e26a0b6 100644 --- a/src/main/java/com/tiedup/remake/util/GameConstants.java +++ b/src/main/java/com/tiedup/remake/util/GameConstants.java @@ -1,7 +1,6 @@ package com.tiedup.remake.util; /** - * Phase 4 Refactoring: Centralized game constants. * * Contains all magic numbers extracted from across the codebase * for better maintainability and easier tuning. diff --git a/src/main/java/com/tiedup/remake/util/ItemNBTHelper.java b/src/main/java/com/tiedup/remake/util/ItemNBTHelper.java index b7ee7fd..c7e592d 100644 --- a/src/main/java/com/tiedup/remake/util/ItemNBTHelper.java +++ b/src/main/java/com/tiedup/remake/util/ItemNBTHelper.java @@ -3,11 +3,11 @@ package com.tiedup.remake.util; import java.util.ArrayList; import java.util.List; import java.util.UUID; -import org.jetbrains.annotations.Nullable; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.Nullable; /** * Utility class for common NBT operations on ItemStacks. @@ -27,9 +27,7 @@ public final class ItemNBTHelper { // Utility class - no instantiation } - // ======================================== // BOOLEAN OPERATIONS - // ======================================== /** * Get a boolean value from an ItemStack's NBT. @@ -75,9 +73,7 @@ public final class ItemNBTHelper { stack.getOrCreateTag().putBoolean(key, value); } - // ======================================== // INTEGER OPERATIONS - // ======================================== /** * Get an integer value from an ItemStack's NBT. @@ -119,9 +115,7 @@ public final class ItemNBTHelper { stack.getOrCreateTag().putInt(key, value); } - // ======================================== // STRING OPERATIONS - // ======================================== /** * Get a string value from an ItemStack's NBT. @@ -177,9 +171,7 @@ public final class ItemNBTHelper { } } - // ======================================== // UUID OPERATIONS - // ======================================== /** * Get a UUID value from an ItemStack's NBT. @@ -231,9 +223,7 @@ public final class ItemNBTHelper { return tag != null && tag.hasUUID(key); } - // ======================================== // UUID LIST OPERATIONS - // ======================================== /** * Get a list of UUIDs from an ItemStack's NBT. @@ -351,9 +341,7 @@ public final class ItemNBTHelper { return getUUIDList(stack, key).contains(uuid); } - // ======================================== // GENERIC OPERATIONS - // ======================================== /** * Check if an ItemStack's NBT contains a key. diff --git a/src/main/java/com/tiedup/remake/util/KidnapExplosion.java b/src/main/java/com/tiedup/remake/util/KidnapExplosion.java index 4f60221..7d64427 100644 --- a/src/main/java/com/tiedup/remake/util/KidnapExplosion.java +++ b/src/main/java/com/tiedup/remake/util/KidnapExplosion.java @@ -4,7 +4,6 @@ import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.state.IBondageState; import com.tiedup.remake.state.PlayerBindState; import java.util.List; -import org.jetbrains.annotations.Nullable; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.server.level.ServerLevel; @@ -15,11 +14,11 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.phys.AABB; +import org.jetbrains.annotations.Nullable; /** * Kidnap Explosion - Applies bondage to entities in an area. * - * Phase 16: Blocks * * Used by EntityKidnapBomb when it explodes. * Applies stored bondage items to all kidnappable entities in radius. diff --git a/src/main/java/com/tiedup/remake/util/KidnappedHelper.java b/src/main/java/com/tiedup/remake/util/KidnappedHelper.java index 2a90638..2fc43ea 100644 --- a/src/main/java/com/tiedup/remake/util/KidnappedHelper.java +++ b/src/main/java/com/tiedup/remake/util/KidnappedHelper.java @@ -1,15 +1,14 @@ package com.tiedup.remake.util; import com.tiedup.remake.compat.mca.MCACompat; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.state.IRestrainable; import com.tiedup.remake.state.PlayerBindState; +import com.tiedup.remake.v2.BodyRegionV2; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import org.jetbrains.annotations.Nullable; /** - * Phase 14.1: Helper utility for working with IRestrainable entities. * * Provides convenient methods for obtaining IRestrainable instances from various entity types. * @@ -20,8 +19,8 @@ import org.jetbrains.annotations.Nullable; *

                Supported Entity Types

                *
                  *
                • Player: Uses {@link PlayerBindState} singleton
                • - *
                • EntityDamsel (Phase 14.2): Implements IRestrainable directly
                • - *
                • EntityKidnapper (Phase 14.2): Implements IRestrainable directly
                • + *
                • EntityDamsel: Implements IRestrainable directly
                • + *
                • EntityKidnapper: Implements IRestrainable directly
                • *
                • Other entities: Returns null (not kidnappable)
                • *
                * @@ -166,7 +165,6 @@ public class KidnappedHelper { * @return true if the entity is enslaved, false otherwise */ /** - * Phase 17: Renamed from isSlave to isCaptive */ public static boolean isCaptive(LivingEntity entity) { IRestrainable state = getKidnappedState(entity); diff --git a/src/main/java/com/tiedup/remake/util/MessageDispatcher.java b/src/main/java/com/tiedup/remake/util/MessageDispatcher.java index b2af84d..6c0f2a0 100644 --- a/src/main/java/com/tiedup/remake/util/MessageDispatcher.java +++ b/src/main/java/com/tiedup/remake/util/MessageDispatcher.java @@ -1,10 +1,10 @@ package com.tiedup.remake.util; import com.tiedup.remake.dialogue.GagTalkManager; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.entities.EntityDamsel; import com.tiedup.remake.state.IBondageState; import com.tiedup.remake.state.PlayerBindState; +import com.tiedup.remake.v2.BodyRegionV2; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.server.MinecraftServer; @@ -35,9 +35,7 @@ public final class MessageDispatcher { // Utility class - no instantiation } - // ======================================== // EARPLUG-AWARE METHODS - // ======================================== /** * Send a message to a player (respects earplugs). @@ -149,9 +147,7 @@ public final class MessageDispatcher { return true; } - // ======================================== // BYPASS METHODS (ignore earplugs) - // ======================================== /** * Send a critical system message that IGNORES earplugs. @@ -182,9 +178,7 @@ public final class MessageDispatcher { target.displayClientMessage(message, true); } - // ======================================== // INTERNAL HELPERS - // ======================================== /** * Check if a player has earplugs equipped. @@ -200,9 +194,7 @@ public final class MessageDispatcher { return state != null && state.hasEarplugs(); } - // ======================================== // NPC DIALOGUE METHODS - // ======================================== /** * Send a dialogue message from an entity to a player. @@ -230,7 +222,11 @@ public final class MessageDispatcher { // Apply gag talk if entity is a gagged NPC String finalMessage = message; - if (entity instanceof com.tiedup.remake.entities.AbstractTiedUpNpc npc && npc.isGagged()) { + if ( + entity instanceof + com.tiedup.remake.entities.AbstractTiedUpNpc npc && + npc.isGagged() + ) { ItemStack gag = npc.getEquipment(BodyRegionV2.MOUTH); IBondageState state = KidnappedHelper.getKidnappedState(npc); if (state != null && !gag.isEmpty()) { diff --git a/src/main/java/com/tiedup/remake/util/ModGameRules.java b/src/main/java/com/tiedup/remake/util/ModGameRules.java index 2c13e42..c111d37 100644 --- a/src/main/java/com/tiedup/remake/util/ModGameRules.java +++ b/src/main/java/com/tiedup/remake/util/ModGameRules.java @@ -4,7 +4,6 @@ import com.tiedup.remake.core.TiedUpMod; import net.minecraft.world.level.GameRules; /** - * Phase 6: Custom GameRules for TiedUp mod. * * Manages configurable values for gameplay mechanics. * GameRules can be changed via /gamerule command in-game. @@ -13,9 +12,7 @@ import net.minecraft.world.level.GameRules; */ public class ModGameRules { - // ===================================================== // RESTRAINT MECHANICS - // ===================================================== /** Time (in seconds) required to tie up a player. Default: 5 */ public static GameRules.Key TYING_PLAYER_TIME; @@ -26,9 +23,7 @@ public class ModGameRules { /** Resistance added by a padlock when locked on an item. Default: 250 */ public static GameRules.Key PADLOCK_RESISTANCE; - // ===================================================== // STRUGGLE SYSTEM - // ===================================================== /** Enable/disable struggle system. Default: true */ public static GameRules.Key STRUGGLE; @@ -41,34 +36,33 @@ public class ModGameRules { /** Cooldown between struggle attempts (ticks, 20 = 1s). Default: 80 (4s) */ public static GameRules.Key STRUGGLE_TIMER; /** Ticks per 1 resistance point in continuous struggle. Default: 20 (1/s) */ - public static GameRules.Key STRUGGLE_CONTINUOUS_RATE; + public static GameRules.Key< + GameRules.IntegerValue + > STRUGGLE_CONTINUOUS_RATE; /** Probability of random shock during collar struggle (0-100). Default: 20% */ - public static GameRules.Key STRUGGLE_COLLAR_RANDOM_SHOCK; + public static GameRules.Key< + GameRules.IntegerValue + > STRUGGLE_COLLAR_RANDOM_SHOCK; // BUG-003: RESISTANCE_ROPE, RESISTANCE_GAG, RESISTANCE_BLINDFOLD, RESISTANCE_COLLAR - // removed. Bind resistance is now read from ModConfig via SettingsAccessor. - // ===================================================== // NPC STRUGGLE - // ===================================================== /** Enable/disable NPC struggle to escape restraints. Default: true */ public static GameRules.Key NPC_STRUGGLE_ENABLED; /** Base interval (ticks) between NPC struggle attempts. Default: 6000 (5 min) */ public static GameRules.Key NPC_STRUGGLE_INTERVAL; - // ===================================================== // COLLAR & SHOCKER - // ===================================================== /** Enable/disable enslavement system. Default: true */ public static GameRules.Key ENSLAVEMENT_ENABLED; /** Base radius for shocker controller. Default: 50 blocks */ - public static GameRules.Key SHOCKER_CONTROLLER_BASE_RADIUS; + public static GameRules.Key< + GameRules.IntegerValue + > SHOCKER_CONTROLLER_BASE_RADIUS; - // ===================================================== // NPC SPAWNING - // ===================================================== /** Enable/disable damsel entity spawning. Default: true */ public static GameRules.Key DAMSELS_SPAWN; @@ -79,19 +73,23 @@ public class ModGameRules { /** Kidnapper spawn rate (0-100). Default: 100 */ public static GameRules.Key KIDNAPPER_SPAWN_RATE; /** Kidnapper Archer spawn rate (0-100). Default: 100 */ - public static GameRules.Key KIDNAPPER_ARCHER_SPAWN_RATE; + public static GameRules.Key< + GameRules.IntegerValue + > KIDNAPPER_ARCHER_SPAWN_RATE; /** Kidnapper Elite spawn rate (0-100). Default: 100 */ - public static GameRules.Key KIDNAPPER_ELITE_SPAWN_RATE; + public static GameRules.Key< + GameRules.IntegerValue + > KIDNAPPER_ELITE_SPAWN_RATE; /** Kidnapper Merchant spawn rate (0-100). Default: 100 */ - public static GameRules.Key KIDNAPPER_MERCHANT_SPAWN_RATE; + public static GameRules.Key< + GameRules.IntegerValue + > KIDNAPPER_MERCHANT_SPAWN_RATE; /** Master spawn rate (0-100). Default: 100 */ public static GameRules.Key MASTER_SPAWN_RATE; /** Spawn gender mode: 0=BOTH, 1=FEMALE_ONLY, 2=MALE_ONLY. Default: 0 */ public static GameRules.Key SPAWN_GENDER_MODE; - // ===================================================== // BOUNTY SYSTEM - // ===================================================== /** Maximum bounties per player. Default: 5 */ public static GameRules.Key MAX_BOUNTIES; @@ -100,9 +98,7 @@ public class ModGameRules { /** Radius for bounty delivery detection. Default: 5 blocks */ public static GameRules.Key BOUNTY_DELIVERY_RADIUS; - // ===================================================== // MISCELLANEOUS - // ===================================================== /** Kidnap bomb explosion radius. Default: 5 blocks */ public static GameRules.Key KIDNAP_BOMB_RADIUS; @@ -114,7 +110,6 @@ public class ModGameRules { public static void register() { TiedUpMod.LOGGER.info("Registering TiedUp GameRules..."); - // Phase 6: Tying/Untying times // NOTE: Using hardcoded defaults because ModConfig isn't loaded yet during mod construction GAG_TALK_PROXIMITY = GameRules.register( "gagTalkProximity", @@ -133,7 +128,6 @@ public class ModGameRules { GameRules.IntegerValue.create(10) ); - // Phase 7: Struggle/Resistance system STRUGGLE = GameRules.register( "struggle", GameRules.Category.MISC, @@ -167,7 +161,6 @@ public class ModGameRules { // BUG-003: Removed resistanceRope/Gag/Blindfold/Collar GameRule registrations. // Bind resistance is now managed by ModConfig via SettingsAccessor. - // Phase 13: Collar/Shocker features STRUGGLE_COLLAR_RANDOM_SHOCK = GameRules.register( "struggleCollarRandomShock", GameRules.Category.MISC, @@ -180,14 +173,12 @@ public class ModGameRules { GameRules.IntegerValue.create(50) ); - // Phase 8: Enslavement ENSLAVEMENT_ENABLED = GameRules.register( "enslavementEnabled", GameRules.Category.MISC, GameRules.BooleanValue.create(true) ); - // Phase 14.2: Damsel spawning DAMSELS_SPAWN = GameRules.register( "damselsSpawn", GameRules.Category.SPAWNING, @@ -239,7 +230,6 @@ public class ModGameRules { GameRules.IntegerValue.create(100) ); - // Phase 16: Kidnap bomb radius KIDNAP_BOMB_RADIUS = GameRules.register( "kidnapBombRadius", GameRules.Category.MISC, @@ -252,7 +242,6 @@ public class ModGameRules { GameRules.IntegerValue.create(0) ); - // Phase 17: Bounty system MAX_BOUNTIES = GameRules.register( "maxBounties", GameRules.Category.MISC, diff --git a/src/main/java/com/tiedup/remake/util/NameGenerator.java b/src/main/java/com/tiedup/remake/util/NameGenerator.java index 6080243..ff456b7 100644 --- a/src/main/java/com/tiedup/remake/util/NameGenerator.java +++ b/src/main/java/com/tiedup/remake/util/NameGenerator.java @@ -13,7 +13,6 @@ import net.minecraft.util.RandomSource; /** * Random name generator for NPCs (Damsels, Kidnappers). * - * Phase 14.3.5: Name system * * Loads names from assets/tiedup/names/female_names.txt * Contains 5001 female first names from the original mod. diff --git a/src/main/java/com/tiedup/remake/util/RestraintApplicator.java b/src/main/java/com/tiedup/remake/util/RestraintApplicator.java index 8fc3973..28ed1a0 100644 --- a/src/main/java/com/tiedup/remake/util/RestraintApplicator.java +++ b/src/main/java/com/tiedup/remake/util/RestraintApplicator.java @@ -1,11 +1,11 @@ package com.tiedup.remake.util; import com.tiedup.remake.core.TiedUpMod; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.items.base.IHasResistance; import com.tiedup.remake.items.base.ItemBind; import com.tiedup.remake.items.base.ItemCollar; import com.tiedup.remake.state.IBondageState; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.UUID; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; @@ -17,7 +17,6 @@ import org.jetbrains.annotations.Nullable; /** * Utility class for applying restraints to entities. * - * Phase 3: Refactoring - Centralizes restraint application logic * * This class provides methods for applying various restraints (binds, gags, * blindfolds, etc.) to targets with consistent validation. Used by: diff --git a/src/main/java/com/tiedup/remake/util/RestraintEffectUtils.java b/src/main/java/com/tiedup/remake/util/RestraintEffectUtils.java index a981a0d..e8739bf 100644 --- a/src/main/java/com/tiedup/remake/util/RestraintEffectUtils.java +++ b/src/main/java/com/tiedup/remake/util/RestraintEffectUtils.java @@ -3,7 +3,6 @@ package com.tiedup.remake.util; import com.tiedup.remake.core.TiedUpMod; import com.tiedup.remake.state.IPlayerLeashAccess; import java.util.UUID; -import org.jetbrains.annotations.Nullable; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.effect.MobEffectInstance; @@ -20,12 +19,11 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.FenceBlock; import net.minecraft.world.level.block.WallBlock; import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.Nullable; /** - * Phase 5: Utility class for applying/removing restraint effects * * Manages attribute modifiers for movement speed reduction and other effects. - * Phase 14.1: Refactored to support LivingEntity (Player + NPCs) */ public class RestraintEffectUtils { @@ -250,9 +248,7 @@ public class RestraintEffectUtils { } } - // ======================================== // POLE BINDING UTILITIES - // ======================================== /** * Find the closest fence or wall block within a radius. @@ -375,9 +371,7 @@ public class RestraintEffectUtils { return false; } - // ======================================== // CHLOROFORM UTILITIES - // ======================================== /** * Apply chloroform effects to an entity. diff --git a/src/main/java/com/tiedup/remake/util/TiedUpSounds.java b/src/main/java/com/tiedup/remake/util/TiedUpSounds.java index ec2a859..1444d27 100644 --- a/src/main/java/com/tiedup/remake/util/TiedUpSounds.java +++ b/src/main/java/com/tiedup/remake/util/TiedUpSounds.java @@ -12,7 +12,6 @@ import net.minecraft.world.level.Level; * Provides convenient methods for playing mod-specific sounds. * Works for both Players and NPCs (EntityDamsel, etc.) * - * Phase 14.2.5: Connected to actual ModSounds registry */ public class TiedUpSounds { diff --git a/src/main/java/com/tiedup/remake/util/ValidationHelper.java b/src/main/java/com/tiedup/remake/util/ValidationHelper.java index 8ae2534..25f27b1 100644 --- a/src/main/java/com/tiedup/remake/util/ValidationHelper.java +++ b/src/main/java/com/tiedup/remake/util/ValidationHelper.java @@ -1,9 +1,9 @@ package com.tiedup.remake.util; import java.util.Optional; -import org.jetbrains.annotations.Nullable; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; +import org.jetbrains.annotations.Nullable; /** * Player type validation helpers. diff --git a/src/main/java/com/tiedup/remake/util/tasks/ItemTask.java b/src/main/java/com/tiedup/remake/util/tasks/ItemTask.java index 88cf63d..488e604 100644 --- a/src/main/java/com/tiedup/remake/util/tasks/ItemTask.java +++ b/src/main/java/com/tiedup/remake/util/tasks/ItemTask.java @@ -10,7 +10,6 @@ import net.minecraftforge.registries.ForgeRegistries; /** * Represents an item task (for jobs and sales). * - * Phase 14.3.5: Task system for jobs and sales * * An ItemTask defines: * - What item is needed (by registry name) @@ -68,9 +67,7 @@ public class ItemTask { this(stack.getItem(), stack.getCount()); } - // ======================================== // GETTERS - // ======================================== public String getItemId() { return itemId; @@ -122,9 +119,7 @@ public class ItemTask { return new ItemStack(item).getHoverName().getString(); } - // ======================================== // VALIDATION - // ======================================== /** * Check if an ItemStack matches this task (same item type). @@ -165,9 +160,7 @@ public class ItemTask { return true; } - // ======================================== // NBT SERIALIZATION - // ======================================== /** * Save this task to NBT. @@ -199,9 +192,7 @@ public class ItemTask { return new ItemTask(itemId, amount); } - // ======================================== // DISPLAY - // ======================================== /** * Get a display string for this task. diff --git a/src/main/java/com/tiedup/remake/util/tasks/JobLoader.java b/src/main/java/com/tiedup/remake/util/tasks/JobLoader.java index 301d0a3..b315fea 100644 --- a/src/main/java/com/tiedup/remake/util/tasks/JobLoader.java +++ b/src/main/java/com/tiedup/remake/util/tasks/JobLoader.java @@ -8,7 +8,6 @@ import java.util.Random; /** * Loads and manages job tasks for slave work system. * - * Phase 14.3.5: Job system * * A job is an ItemTask that a slave must complete * (fetch X items) within a time limit or face punishment. diff --git a/src/main/java/com/tiedup/remake/util/tasks/SaleLoader.java b/src/main/java/com/tiedup/remake/util/tasks/SaleLoader.java index 9db6c54..14414ad 100644 --- a/src/main/java/com/tiedup/remake/util/tasks/SaleLoader.java +++ b/src/main/java/com/tiedup/remake/util/tasks/SaleLoader.java @@ -8,7 +8,6 @@ import java.util.Random; /** * Loads and manages sale prices for slave trading. * - * Phase 14.3.5: Sale system * * Provides default sale prices and can be extended * to load from config files in the future. diff --git a/src/main/java/com/tiedup/remake/util/teleport/Position.java b/src/main/java/com/tiedup/remake/util/teleport/Position.java index ee7c850..917d34a 100644 --- a/src/main/java/com/tiedup/remake/util/teleport/Position.java +++ b/src/main/java/com/tiedup/remake/util/teleport/Position.java @@ -132,9 +132,7 @@ public class Position { ); } - // ======================================== // NBT SERIALIZATION - // ======================================== /** * Save this position to NBT. @@ -204,9 +202,7 @@ public class Position { return new Position(x, y, z, yaw, pitch, dimension); } - // ======================================== // GETTERS - // ======================================== public double getX() { return x; @@ -301,9 +297,7 @@ public class Position { return Math.sqrt(dx * dx + dz * dz); } - // ======================================== // OBJECT OVERRIDES - // ======================================== @Override public String toString() { diff --git a/src/main/java/com/tiedup/remake/util/teleport/TeleportHelper.java b/src/main/java/com/tiedup/remake/util/teleport/TeleportHelper.java index 4cb0b62..51ffacd 100644 --- a/src/main/java/com/tiedup/remake/util/teleport/TeleportHelper.java +++ b/src/main/java/com/tiedup/remake/util/teleport/TeleportHelper.java @@ -2,7 +2,6 @@ package com.tiedup.remake.util.teleport; import com.tiedup.remake.core.TiedUpMod; import java.util.function.Function; -import org.jetbrains.annotations.Nullable; import net.minecraft.resources.ResourceKey; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; @@ -13,6 +12,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.portal.PortalInfo; import net.minecraft.world.phys.Vec3; import net.minecraftforge.common.util.ITeleporter; +import org.jetbrains.annotations.Nullable; /** * Utility class for teleporting entities across dimensions. @@ -320,9 +320,7 @@ public class TeleportHelper { return position; } - // ======================================== // CUSTOM TELEPORTER FOR FORGE - // ======================================== /** * Custom teleporter that preserves exact position and rotation. diff --git a/src/main/java/com/tiedup/remake/util/time/Timer.java b/src/main/java/com/tiedup/remake/util/time/Timer.java index f150f12..43cd2c9 100644 --- a/src/main/java/com/tiedup/remake/util/time/Timer.java +++ b/src/main/java/com/tiedup/remake/util/time/Timer.java @@ -3,7 +3,6 @@ package com.tiedup.remake.util.time; import net.minecraft.world.level.Level; /** - * Phase 6: Game tick-based timer for progressive tasks. * * Unlike the original mod which used wall-clock time (Date objects), * this uses Minecraft game ticks for: diff --git a/src/main/java/com/tiedup/remake/v2/BodyRegionV2.java b/src/main/java/com/tiedup/remake/v2/BodyRegionV2.java index 32019d1..c1d53e9 100644 --- a/src/main/java/com/tiedup/remake/v2/BodyRegionV2.java +++ b/src/main/java/com/tiedup/remake/v2/BodyRegionV2.java @@ -57,4 +57,4 @@ public enum BodyRegionV2 { return null; } } -} \ No newline at end of file +} diff --git a/src/main/java/com/tiedup/remake/v2/V2Blocks.java b/src/main/java/com/tiedup/remake/v2/V2Blocks.java index 7a56b06..ca1f7ed 100644 --- a/src/main/java/com/tiedup/remake/v2/V2Blocks.java +++ b/src/main/java/com/tiedup/remake/v2/V2Blocks.java @@ -22,9 +22,7 @@ public class V2Blocks { public static final DeferredRegister BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, TiedUpMod.MOD_ID); - // ======================================== // PET FURNITURE - // ======================================== public static final RegistryObject PET_BOWL = BLOCKS.register( "pet_bowl", diff --git a/src/main/java/com/tiedup/remake/v2/V2Items.java b/src/main/java/com/tiedup/remake/v2/V2Items.java index 7f569c7..8d06ef8 100644 --- a/src/main/java/com/tiedup/remake/v2/V2Items.java +++ b/src/main/java/com/tiedup/remake/v2/V2Items.java @@ -18,9 +18,7 @@ public class V2Items { TiedUpMod.MOD_ID ); - // ======================================== // BLOCK ITEMS - // ======================================== public static final RegistryObject PET_BOWL = ITEMS.register( "pet_bowl", diff --git a/src/main/java/com/tiedup/remake/v2/blocks/PetBedBlockEntity.java b/src/main/java/com/tiedup/remake/v2/blocks/PetBedBlockEntity.java index 1b15eca..1d67586 100644 --- a/src/main/java/com/tiedup/remake/v2/blocks/PetBedBlockEntity.java +++ b/src/main/java/com/tiedup/remake/v2/blocks/PetBedBlockEntity.java @@ -63,9 +63,7 @@ public class PetBedBlockEntity extends ObjBlockEntity { return new float[] { 0.0f, 0.0f, 0.0f }; } - // ======================================== // OCCUPANCY - // ======================================== public boolean isOccupied() { return occupantUUID != null; @@ -98,9 +96,7 @@ public class PetBedBlockEntity extends ObjBlockEntity { setChanged(); } - // ======================================== // OWNERSHIP - // ======================================== @Nullable public UUID getOwnerUUID() { @@ -120,9 +116,7 @@ public class PetBedBlockEntity extends ObjBlockEntity { return ownerUUID == null; } - // ======================================== // NBT - // ======================================== @Override protected void saveAdditional(CompoundTag tag) { diff --git a/src/main/java/com/tiedup/remake/v2/blocks/PetBedManager.java b/src/main/java/com/tiedup/remake/v2/blocks/PetBedManager.java index 9fc4eca..9d9f943 100644 --- a/src/main/java/com/tiedup/remake/v2/blocks/PetBedManager.java +++ b/src/main/java/com/tiedup/remake/v2/blocks/PetBedManager.java @@ -6,7 +6,6 @@ import com.tiedup.remake.network.sync.PacketSyncPetBedState; import java.util.Map; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; -import org.jetbrains.annotations.Nullable; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; @@ -16,6 +15,7 @@ import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.Nullable; /** * Server-side tracker for pet bed sit/sleep state per player. diff --git a/src/main/java/com/tiedup/remake/v2/blocks/PetBowlBlockEntity.java b/src/main/java/com/tiedup/remake/v2/blocks/PetBowlBlockEntity.java index 5c38ec3..f9cb9a8 100644 --- a/src/main/java/com/tiedup/remake/v2/blocks/PetBowlBlockEntity.java +++ b/src/main/java/com/tiedup/remake/v2/blocks/PetBowlBlockEntity.java @@ -54,9 +54,7 @@ public class PetBowlBlockEntity extends ObjBlockEntity { return 1.0f; // Adjust based on model size } - // ======================================== // FOOD MANAGEMENT - // ======================================== public boolean hasFood() { return hasFood && foodLevel > 0; @@ -102,9 +100,7 @@ public class PetBowlBlockEntity extends ObjBlockEntity { setChanged(); } - // ======================================== // NBT - // ======================================== @Override protected void saveAdditional(CompoundTag tag) { diff --git a/src/main/java/com/tiedup/remake/v2/blocks/PetCageBlock.java b/src/main/java/com/tiedup/remake/v2/blocks/PetCageBlock.java index 24c838b..0175846 100644 --- a/src/main/java/com/tiedup/remake/v2/blocks/PetCageBlock.java +++ b/src/main/java/com/tiedup/remake/v2/blocks/PetCageBlock.java @@ -42,9 +42,7 @@ public class PetCageBlock extends Block implements EntityBlock { public static final DirectionProperty FACING = HorizontalDirectionalBlock.FACING; - // ======================================== // OBJ MODEL DIMENSIONS (in model space, before rotation/translation) - // ======================================== private static final double MODEL_MIN_X = -1.137; private static final double MODEL_MAX_X = 1.0; private static final double MODEL_MIN_Z = -1.122; @@ -255,9 +253,7 @@ public class PetCageBlock extends Block implements EntityBlock { super.onRemove(state, level, pos, newState, isMoving); } - // ======================================== // CAGE COLLISION (model-accurate) - // ======================================== /** * Compute the cage AABB in world coordinates for a given master position and facing. @@ -462,9 +458,7 @@ public class PetCageBlock extends Block implements EntityBlock { ); } - // ======================================== // MULTI-BLOCK LAYOUT (3x3x2) - // ======================================== private static final int[][] GRID_OFFSETS; diff --git a/src/main/java/com/tiedup/remake/v2/blocks/PetCageBlockEntity.java b/src/main/java/com/tiedup/remake/v2/blocks/PetCageBlockEntity.java index c90badb..80266bb 100644 --- a/src/main/java/com/tiedup/remake/v2/blocks/PetCageBlockEntity.java +++ b/src/main/java/com/tiedup/remake/v2/blocks/PetCageBlockEntity.java @@ -73,9 +73,7 @@ public class PetCageBlockEntity extends ObjBlockEntity { ); } - // ======================================== // OCCUPANT MANAGEMENT - // ======================================== public boolean hasOccupant() { return occupantUUID != null; @@ -105,9 +103,7 @@ public class PetCageBlockEntity extends ObjBlockEntity { return server.getPlayerList().getPlayer(occupantUUID); } - // ======================================== // NBT - // ======================================== @Override protected void saveAdditional(CompoundTag tag) { diff --git a/src/main/java/com/tiedup/remake/v2/blocks/PetCageManager.java b/src/main/java/com/tiedup/remake/v2/blocks/PetCageManager.java index 63cfb50..7e0cb1f 100644 --- a/src/main/java/com/tiedup/remake/v2/blocks/PetCageManager.java +++ b/src/main/java/com/tiedup/remake/v2/blocks/PetCageManager.java @@ -4,13 +4,13 @@ import com.tiedup.remake.core.TiedUpMod; import java.util.Map; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; -import org.jetbrains.annotations.Nullable; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.ai.attributes.AttributeInstance; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.level.block.entity.BlockEntity; +import org.jetbrains.annotations.Nullable; /** * Server-side manager for pet cage confinement. diff --git a/src/main/java/com/tiedup/remake/v2/bondage/IV2BondageEquipment.java b/src/main/java/com/tiedup/remake/v2/bondage/IV2BondageEquipment.java index 30528f2..764b24d 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/IV2BondageEquipment.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/IV2BondageEquipment.java @@ -1,7 +1,6 @@ package com.tiedup.remake.v2.bondage; import com.tiedup.remake.v2.BodyRegionV2; - import java.util.Map; import java.util.UUID; import net.minecraft.core.BlockPos; @@ -23,7 +22,6 @@ import org.jetbrains.annotations.Nullable; */ @AutoRegisterCapability public interface IV2BondageEquipment { - /** * Get the item equipped in the given region. * @return The ItemStack in that region, or {@link ItemStack#EMPTY} — never null. @@ -72,9 +70,7 @@ public interface IV2BondageEquipment { */ void deserializeNBT(CompoundTag tag); - // ======================================== // Pole leash persistence - // ======================================== /** * Whether the player was leashed to a pole when they disconnected. @@ -84,12 +80,14 @@ public interface IV2BondageEquipment { /** * Get the saved pole position, or null if none. */ - @Nullable BlockPos getSavedPolePosition(); + @Nullable + BlockPos getSavedPolePosition(); /** * Get the saved pole dimension, or null if none. */ - @Nullable ResourceKey getSavedPoleDimension(); + @Nullable + ResourceKey getSavedPoleDimension(); /** * Save the pole leash state for restoration on reconnect. @@ -101,9 +99,7 @@ public interface IV2BondageEquipment { */ void clearSavedPoleLeash(); - // ======================================== // Captor persistence - // ======================================== /** * Whether the player had a saved captor when they disconnected. @@ -113,7 +109,8 @@ public interface IV2BondageEquipment { /** * Get the saved captor UUID, or null if none. */ - @Nullable UUID getSavedCaptorUUID(); + @Nullable + UUID getSavedCaptorUUID(); /** * Save the captor UUID for restoration on reconnect. @@ -124,4 +121,4 @@ public interface IV2BondageEquipment { * Clear saved captor state. */ void clearSavedCaptor(); -} \ No newline at end of file +} diff --git a/src/main/java/com/tiedup/remake/v2/bondage/IV2BondageItem.java b/src/main/java/com/tiedup/remake/v2/bondage/IV2BondageItem.java index cd32486..274c91b 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/IV2BondageItem.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/IV2BondageItem.java @@ -1,7 +1,6 @@ package com.tiedup.remake.v2.bondage; import com.tiedup.remake.v2.BodyRegionV2; - import java.util.Set; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.LivingEntity; @@ -16,7 +15,6 @@ import org.jetbrains.annotations.Nullable; * and lifecycle hooks. */ public interface IV2BondageItem { - // ===== REGIONS ===== /** @@ -164,4 +162,4 @@ public interface IV2BondageItem { default boolean canUnequip(ItemStack stack, LivingEntity entity) { return true; } -} \ No newline at end of file +} diff --git a/src/main/java/com/tiedup/remake/v2/bondage/IV2EquipmentHolder.java b/src/main/java/com/tiedup/remake/v2/bondage/IV2EquipmentHolder.java index d887d6c..ab8dd1e 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/IV2EquipmentHolder.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/IV2EquipmentHolder.java @@ -11,7 +11,6 @@ package com.tiedup.remake.v2.bondage; * Players use Forge capabilities instead — they do NOT implement this. */ public interface IV2EquipmentHolder { - /** * Get the V2 equipment storage for this entity. * @return The equipment instance, never null. diff --git a/src/main/java/com/tiedup/remake/v2/bondage/V2BondageItems.java b/src/main/java/com/tiedup/remake/v2/bondage/V2BondageItems.java index 563ec4d..17f9a51 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/V2BondageItems.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/V2BondageItems.java @@ -16,11 +16,13 @@ import net.minecraftforge.registries.RegistryObject; public class V2BondageItems { public static final DeferredRegister ITEMS = DeferredRegister.create( - ForgeRegistries.ITEMS, TiedUpMod.MOD_ID + ForgeRegistries.ITEMS, + TiedUpMod.MOD_ID ); public static final RegistryObject V2_HANDCUFFS = ITEMS.register( - "v2_handcuffs", V2Handcuffs::new + "v2_handcuffs", + V2Handcuffs::new ); /** @@ -28,7 +30,8 @@ public class V2BondageItems { * behavior varies per-stack via the {@code tiedup_item_id} NBT tag. */ public static final RegistryObject DATA_DRIVEN_ITEM = ITEMS.register( - "data_driven_item", DataDrivenBondageItem::new + "data_driven_item", + DataDrivenBondageItem::new ); /** @@ -38,6 +41,7 @@ public class V2BondageItems { * NBT tag on each stack. */ public static final RegistryObject FURNITURE_PLACER = ITEMS.register( - "furniture_placer", FurniturePlacerItem::new + "furniture_placer", + FurniturePlacerItem::new ); } diff --git a/src/main/java/com/tiedup/remake/v2/bondage/V2EquipResult.java b/src/main/java/com/tiedup/remake/v2/bondage/V2EquipResult.java index 243bbae..aa3294d 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/V2EquipResult.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/V2EquipResult.java @@ -8,7 +8,6 @@ import net.minecraft.world.item.ItemStack; * Carries displaced stacks for swap/supersede cases. */ public record V2EquipResult(Type type, List displaced) { - public enum Type { /** Item equipped successfully into empty regions. */ SUCCESS, @@ -17,19 +16,29 @@ public record V2EquipResult(Type type, List displaced) { /** Global item superseded multiple sub-region items. */ SUPERSEDED, /** Item could not be equipped due to unresolvable conflicts. */ - BLOCKED + BLOCKED, } /** Convenience: check if equip was blocked. */ - public boolean isBlocked() { return type == Type.BLOCKED; } + public boolean isBlocked() { + return type == Type.BLOCKED; + } /** Convenience: check if equip succeeded (any non-blocked result). */ - public boolean isSuccess() { return type != Type.BLOCKED; } + public boolean isSuccess() { + return type != Type.BLOCKED; + } // ===== Factory methods ===== - public static final V2EquipResult SUCCESS = new V2EquipResult(Type.SUCCESS, List.of()); - public static final V2EquipResult BLOCKED = new V2EquipResult(Type.BLOCKED, List.of()); + public static final V2EquipResult SUCCESS = new V2EquipResult( + Type.SUCCESS, + List.of() + ); + public static final V2EquipResult BLOCKED = new V2EquipResult( + Type.BLOCKED, + List.of() + ); public static V2EquipResult swapped(ItemStack displaced) { return new V2EquipResult(Type.SWAPPED, List.of(displaced)); diff --git a/src/main/java/com/tiedup/remake/v2/bondage/V2EquipmentManager.java b/src/main/java/com/tiedup/remake/v2/bondage/V2EquipmentManager.java index a0306c1..8567a47 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/V2EquipmentManager.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/V2EquipmentManager.java @@ -1,8 +1,7 @@ package com.tiedup.remake.v2.bondage; -import com.tiedup.remake.v2.BodyRegionV2; - import com.tiedup.remake.core.TiedUpMod; +import com.tiedup.remake.v2.BodyRegionV2; import java.util.ArrayList; import java.util.IdentityHashMap; import java.util.List; @@ -36,7 +35,11 @@ public final class V2EquipmentManager { /** * Check if an item can be equipped without any conflicts (stack-aware). */ - public static boolean canEquip(IV2BondageEquipment equip, IV2BondageItem item, ItemStack newStack) { + public static boolean canEquip( + IV2BondageEquipment equip, + IV2BondageItem item, + ItemStack newStack + ) { return findAllConflicts(equip, item, newStack).isEmpty(); } @@ -66,14 +69,24 @@ public final class V2EquipmentManager { } // 2. Existing items' getBlockedRegions() block new item's regions - for (Map.Entry entry : equip.getAllEquipped().entrySet()) { + for (Map.Entry entry : equip + .getAllEquipped() + .entrySet()) { ItemStack equipped = entry.getValue(); if (seen.containsKey(equipped)) continue; if (equipped.getItem() instanceof IV2BondageItem equippedItem) { - for (BodyRegionV2 newRegion : item.getOccupiedRegions(newStack)) { - if (equippedItem.getBlockedRegions(equipped).contains(newRegion)) { + for (BodyRegionV2 newRegion : item.getOccupiedRegions( + newStack + )) { + if ( + equippedItem + .getBlockedRegions(equipped) + .contains(newRegion) + ) { seen.put(equipped, Boolean.TRUE); - conflicts.add(new ConflictEntry(entry.getKey(), equipped)); + conflicts.add( + new ConflictEntry(entry.getKey(), equipped) + ); break; // One conflict per item is enough } } @@ -116,7 +129,8 @@ public final class V2EquipmentManager { } // De-duplicate conflicts by stack identity - IdentityHashMap uniqueConflicts = new IdentityHashMap<>(); + IdentityHashMap uniqueConflicts = + new IdentityHashMap<>(); for (ConflictEntry c : conflicts) { uniqueConflicts.putIfAbsent(c.stack(), c); } @@ -125,7 +139,9 @@ public final class V2EquipmentManager { if (uniqueConflicts.size() == 1) { ConflictEntry conflict = uniqueConflicts.values().iterator().next(); ItemStack conflictStack = conflict.stack(); - if (conflictStack.getItem() instanceof IV2BondageItem conflictItem) { + if ( + conflictStack.getItem() instanceof IV2BondageItem conflictItem + ) { if (conflictItem.canUnequip(conflictStack, entity)) { removeAllRegionsOf(equip, conflictStack); conflictItem.onUnequipped(conflictStack, entity); @@ -171,7 +187,10 @@ public final class V2EquipmentManager { if (cs.getItem() instanceof IV2BondageItem ci) { ci.onUnequipped(cs, entity); } else { - TiedUpMod.LOGGER.warn("[V2] Supersede removed non-V2 item {} from equipment", cs); + TiedUpMod.LOGGER.warn( + "[V2] Supersede removed non-V2 item {} from equipment", + cs + ); } displaced.add(cs); } @@ -199,7 +218,10 @@ public final class V2EquipmentManager { * Remove an item from all regions by identity scan. * Uses full BodyRegionV2.values() scan to prevent orphan stacks. */ - public static void removeAllRegionsOf(IV2BondageEquipment equip, ItemStack stack) { + public static void removeAllRegionsOf( + IV2BondageEquipment equip, + ItemStack stack + ) { for (BodyRegionV2 region : BodyRegionV2.values()) { //noinspection ObjectEquality — intentional identity comparison if (equip.getInRegion(region) == stack) { @@ -207,5 +229,4 @@ public final class V2EquipmentManager { } } } - -} \ No newline at end of file +} diff --git a/src/main/java/com/tiedup/remake/v2/bondage/capability/V2BondageEquipment.java b/src/main/java/com/tiedup/remake/v2/bondage/capability/V2BondageEquipment.java index 2f24871..a7d65b8 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/capability/V2BondageEquipment.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/capability/V2BondageEquipment.java @@ -42,11 +42,15 @@ public class V2BondageEquipment implements IV2BondageEquipment { private final EnumMap regions; // Pole leash persistence - @Nullable private BlockPos savedPolePosition; - @Nullable private ResourceKey savedPoleDimension; + @Nullable + private BlockPos savedPolePosition; + + @Nullable + private ResourceKey savedPoleDimension; // Captor persistence - @Nullable private UUID savedCaptorUUID; + @Nullable + private UUID savedCaptorUUID; public V2BondageEquipment() { this.regions = new EnumMap<>(BodyRegionV2.class); @@ -104,11 +108,16 @@ public class V2BondageEquipment implements IV2BondageEquipment { public boolean isRegionBlocked(BodyRegionV2 region) { if (region == null) return false; // Check if any equipped item's getBlockedRegions() includes this region - for (Map.Entry entry : getAllEquipped().entrySet()) { + for (Map.Entry< + BodyRegionV2, + ItemStack + > entry : getAllEquipped().entrySet()) { ItemStack stack = entry.getValue(); if (stack.getItem() instanceof IV2BondageItem item) { - if (item.getBlockedRegions(stack).contains(region) - && !item.getOccupiedRegions(stack).contains(region)) { + if ( + item.getBlockedRegions(stack).contains(region) && + !item.getOccupiedRegions(stack).contains(region) + ) { // Blocked by another item (not self-blocking via occupation) return true; } @@ -137,9 +146,7 @@ public class V2BondageEquipment implements IV2BondageEquipment { } } - // ======================================== // Pole leash persistence - // ======================================== @Override public boolean wasLeashedToPole() { @@ -170,9 +177,7 @@ public class V2BondageEquipment implements IV2BondageEquipment { this.savedPoleDimension = null; } - // ======================================== // Captor persistence - // ======================================== @Override public boolean hasSavedCaptor() { @@ -195,9 +200,7 @@ public class V2BondageEquipment implements IV2BondageEquipment { this.savedCaptorUUID = null; } - // ======================================== // NBT serialization - // ======================================== @Override public CompoundTag serializeNBT() { @@ -238,7 +241,10 @@ public class V2BondageEquipment implements IV2BondageEquipment { // Pole leash persistence if (savedPolePosition != null && savedPoleDimension != null) { root.putLong("pole_position", savedPolePosition.asLong()); - root.putString("pole_dimension", savedPoleDimension.location().toString()); + root.putString( + "pole_dimension", + savedPoleDimension.location().toString() + ); } // Captor persistence @@ -279,7 +285,8 @@ public class V2BondageEquipment implements IV2BondageEquipment { if (!key.endsWith(NBT_ALSO_SUFFIX)) continue; String primaryRegionName = key.substring( - 0, key.length() - NBT_ALSO_SUFFIX.length() + 0, + key.length() - NBT_ALSO_SUFFIX.length() ); ItemStack primaryStack = loadedStacks.get(primaryRegionName); if (primaryStack == null) continue; @@ -298,11 +305,15 @@ public class V2BondageEquipment implements IV2BondageEquipment { if (tag.contains("pole_position") && tag.contains("pole_dimension")) { try { savedPolePosition = BlockPos.of(tag.getLong("pole_position")); - savedPoleDimension = ResourceKey.create(Registries.DIMENSION, - new ResourceLocation(tag.getString("pole_dimension"))); + savedPoleDimension = ResourceKey.create( + Registries.DIMENSION, + new ResourceLocation(tag.getString("pole_dimension")) + ); } catch (net.minecraft.ResourceLocationException e) { com.tiedup.remake.core.TiedUpMod.LOGGER.warn( - "Invalid pole dimension in NBT, clearing saved pole data: {}", e.getMessage()); + "Invalid pole dimension in NBT, clearing saved pole data: {}", + e.getMessage() + ); savedPolePosition = null; savedPoleDimension = null; } @@ -318,4 +329,4 @@ public class V2BondageEquipment implements IV2BondageEquipment { savedCaptorUUID = null; } } -} \ No newline at end of file +} diff --git a/src/main/java/com/tiedup/remake/v2/bondage/capability/V2BondageEquipmentProvider.java b/src/main/java/com/tiedup/remake/v2/bondage/capability/V2BondageEquipmentProvider.java index 53e4cf4..b8d3884 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/capability/V2BondageEquipmentProvider.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/capability/V2BondageEquipmentProvider.java @@ -59,4 +59,4 @@ public class V2BondageEquipmentProvider public void invalidate() { optional.invalidate(); } -} \ No newline at end of file +} diff --git a/src/main/java/com/tiedup/remake/v2/bondage/capability/V2EquipmentHelper.java b/src/main/java/com/tiedup/remake/v2/bondage/capability/V2EquipmentHelper.java index 35b0fbc..c565e73 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/capability/V2EquipmentHelper.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/capability/V2EquipmentHelper.java @@ -5,9 +5,9 @@ import com.tiedup.remake.network.ModNetwork; import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.v2.bondage.IV2BondageEquipment; import com.tiedup.remake.v2.bondage.IV2BondageItem; +import com.tiedup.remake.v2.bondage.IV2EquipmentHolder; import com.tiedup.remake.v2.bondage.V2EquipResult; import com.tiedup.remake.v2.bondage.V2EquipmentManager; -import com.tiedup.remake.v2.bondage.IV2EquipmentHolder; import com.tiedup.remake.v2.bondage.network.PacketSyncV2Equipment; import java.util.Map; import net.minecraft.server.level.ServerPlayer; @@ -24,7 +24,6 @@ import org.jetbrains.annotations.Nullable; * is the authority for equipment state. * * Currently dispatches only for Players (via Forge capability). - * Phase 6 will add Damsel/ArmorStand support. */ public final class V2EquipmentHelper { @@ -40,7 +39,8 @@ public final class V2EquipmentHelper { public static IV2BondageEquipment getEquipment(LivingEntity entity) { if (entity == null) return null; if (entity instanceof Player player) { - return player.getCapability(V2BondageEquipmentProvider.V2_BONDAGE_EQUIPMENT) + return player + .getCapability(V2BondageEquipmentProvider.V2_BONDAGE_EQUIPMENT) .orElse(null); } // V2 equipment holders (EntityDamsel, etc.) @@ -54,7 +54,10 @@ public final class V2EquipmentHelper { * Get the item in a specific region for an entity. * @return The ItemStack, or {@link ItemStack#EMPTY} if empty or entity unsupported. */ - public static ItemStack getInRegion(LivingEntity entity, BodyRegionV2 region) { + public static ItemStack getInRegion( + LivingEntity entity, + BodyRegionV2 region + ) { IV2BondageEquipment equip = getEquipment(entity); if (equip == null) return ItemStack.EMPTY; return equip.getInRegion(region); @@ -63,7 +66,10 @@ public final class V2EquipmentHelper { /** * Check if a region is directly occupied on the given entity. */ - public static boolean isRegionOccupied(LivingEntity entity, BodyRegionV2 region) { + public static boolean isRegionOccupied( + LivingEntity entity, + BodyRegionV2 region + ) { IV2BondageEquipment equip = getEquipment(entity); if (equip == null) return false; return equip.isRegionOccupied(region); @@ -72,7 +78,10 @@ public final class V2EquipmentHelper { /** * Check if a region is blocked by any equipped item's {@link IV2BondageItem#getBlockedRegions()}. */ - public static boolean isRegionBlocked(LivingEntity entity, BodyRegionV2 region) { + public static boolean isRegionBlocked( + LivingEntity entity, + BodyRegionV2 region + ) { IV2BondageEquipment equip = getEquipment(entity); if (equip == null) return false; return equip.isRegionBlocked(region); @@ -82,7 +91,9 @@ public final class V2EquipmentHelper { * Get all equipped items (de-duplicated) for an entity. * @return Unmodifiable map, or empty map if entity unsupported. */ - public static Map getAllEquipped(LivingEntity entity) { + public static Map getAllEquipped( + LivingEntity entity + ) { IV2BondageEquipment equip = getEquipment(entity); if (equip == null) return Map.of(); return equip.getAllEquipped(); @@ -110,10 +121,15 @@ public final class V2EquipmentHelper { * @param stack The ItemStack to equip (must implement IV2BondageItem) * @return The equip result, or {@link V2EquipResult#BLOCKED} if invalid */ - public static V2EquipResult equipItem(LivingEntity entity, ItemStack stack) { + public static V2EquipResult equipItem( + LivingEntity entity, + ItemStack stack + ) { if (entity.level().isClientSide) return V2EquipResult.BLOCKED; if (stack == null || stack.isEmpty()) return V2EquipResult.BLOCKED; - if (!(stack.getItem() instanceof IV2BondageItem item)) return V2EquipResult.BLOCKED; + if ( + !(stack.getItem() instanceof IV2BondageItem item) + ) return V2EquipResult.BLOCKED; IV2BondageEquipment equip = getEquipment(entity); if (equip == null) return V2EquipResult.BLOCKED; @@ -122,7 +138,12 @@ public final class V2EquipmentHelper { // Copy the stack so the original isn't mutated ItemStack equipCopy = stack.copy(); - V2EquipResult result = V2EquipmentManager.tryEquip(equip, item, equipCopy, entity); + V2EquipResult result = V2EquipmentManager.tryEquip( + equip, + item, + equipCopy, + entity + ); if (result.isSuccess()) { item.onEquipped(equipCopy, entity); @@ -139,7 +160,10 @@ public final class V2EquipmentHelper { * @param region The region to unequip from * @return The removed ItemStack, or {@link ItemStack#EMPTY} if nothing removed */ - public static ItemStack unequipFromRegion(LivingEntity entity, BodyRegionV2 region) { + public static ItemStack unequipFromRegion( + LivingEntity entity, + BodyRegionV2 region + ) { return unequipFromRegion(entity, region, false); } @@ -225,13 +249,13 @@ public final class V2EquipmentHelper { } PacketSyncV2Equipment packet = new PacketSyncV2Equipment( - entity.getId(), equip.serializeNBT() + entity.getId(), + equip.serializeNBT() ); if (entity instanceof ServerPlayer serverPlayer) { ModNetwork.sendToAllTrackingAndSelf(packet, serverPlayer); } else { - // Phase 6: NPC support — send to all tracking the entity ModNetwork.sendToAllTrackingEntity(packet, entity); } } @@ -250,8 +274,9 @@ public final class V2EquipmentHelper { if (equip == null) return; PacketSyncV2Equipment packet = new PacketSyncV2Equipment( - entity.getId(), equip.serializeNBT() + entity.getId(), + equip.serializeNBT() ); ModNetwork.sendToPlayer(packet, target); } -} \ No newline at end of file +} diff --git a/src/main/java/com/tiedup/remake/v2/bondage/client/V2BondageRenderLayer.java b/src/main/java/com/tiedup/remake/v2/bondage/client/V2BondageRenderLayer.java index 1141bdd..62f3b33 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/client/V2BondageRenderLayer.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/client/V2BondageRenderLayer.java @@ -17,9 +17,9 @@ import com.tiedup.remake.v2.furniture.SeatDefinition; import java.util.Map; import java.util.Set; import net.minecraft.client.model.HumanoidModel; -import net.minecraft.client.renderer.RenderType; import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.LivingEntityRenderer; import net.minecraft.client.renderer.entity.RenderLayerParent; import net.minecraft.client.renderer.entity.layers.RenderLayer; @@ -51,8 +51,10 @@ import org.joml.Matrix4f; * ALL entities (no local-player-only guard). */ @OnlyIn(Dist.CLIENT) -public class V2BondageRenderLayer> - extends RenderLayer { +public class V2BondageRenderLayer< + T extends LivingEntity, + M extends HumanoidModel +> extends RenderLayer { private static final Logger LOGGER = LogManager.getLogger("GltfPipeline"); @@ -84,9 +86,9 @@ public class V2BondageRenderLayer furnitureBlocked = Set.of(); - if (entity.isPassenger() && entity.getVehicle() instanceof ISeatProvider provider) { + if ( + entity.isPassenger() && + entity.getVehicle() instanceof ISeatProvider provider + ) { SeatDefinition seat = provider.getSeatForPassenger(entity); if (seat != null) { furnitureBlocked = seat.blockedRegions(); @@ -133,7 +138,8 @@ public class V2BondageRenderLayer tintColors = TintColorResolver.resolve(stack); if (!tintColors.isEmpty() && data.primitives().size() > 1) { // Multi-primitive mesh with tint data: render per-primitive with colors - RenderType renderType = GltfMeshRenderer.getRenderTypeForDefaultTexture(); + RenderType renderType = + GltfMeshRenderer.getRenderTypeForDefaultTexture(); GltfMeshRenderer.renderSkinnedTinted( - data, joints, poseStack, buffer, - packedLight, packedOverlay, renderType, tintColors + data, + joints, + poseStack, + buffer, + packedLight, + packedOverlay, + renderType, + tintColors ); } else { // Standard path: single primitive or no tint data GltfMeshRenderer.renderSkinned( - data, joints, poseStack, buffer, - packedLight, packedOverlay + data, + joints, + poseStack, + buffer, + packedLight, + packedOverlay ); } poseStack.popPose(); } } -} \ No newline at end of file +} diff --git a/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenBondageItem.java b/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenBondageItem.java index 99af898..77dd380 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenBondageItem.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenBondageItem.java @@ -137,12 +137,18 @@ public class DataDrivenBondageItem extends AbstractV2BondageItem { IV2BondageEquipment equip = V2EquipmentHelper.getEquipment(entity); if (equip != null) { int maxDifficulty = -1; - for (Map.Entry entry : equip.getAllEquipped().entrySet()) { + for (Map.Entry entry : equip + .getAllEquipped() + .entrySet()) { ItemStack stack = entry.getValue(); if (stack.getItem() == this) { - DataDrivenItemDefinition def = DataDrivenItemRegistry.get(stack); + DataDrivenItemDefinition def = + DataDrivenItemRegistry.get(stack); if (def != null) { - maxDifficulty = Math.max(maxDifficulty, def.escapeDifficulty()); + maxDifficulty = Math.max( + maxDifficulty, + def.escapeDifficulty() + ); } } } @@ -157,12 +163,18 @@ public class DataDrivenBondageItem extends AbstractV2BondageItem { @Override public void notifyStruggle(LivingEntity entity) { // Play a generic chain sound for data-driven items - entity.level().playSound( - null, entity.getX(), entity.getY(), entity.getZ(), - net.minecraft.sounds.SoundEvents.CHAIN_STEP, - net.minecraft.sounds.SoundSource.PLAYERS, - 0.4f, 1.0f - ); + entity + .level() + .playSound( + null, + entity.getX(), + entity.getY(), + entity.getZ(), + net.minecraft.sounds.SoundEvents.CHAIN_STEP, + net.minecraft.sounds.SoundSource.PLAYERS, + 0.4f, + 1.0f + ); } // ===== DISPLAY NAME ===== @@ -189,7 +201,9 @@ public class DataDrivenBondageItem extends AbstractV2BondageItem { public static ItemStack createStack(ResourceLocation itemId) { if (V2BondageItems.DATA_DRIVEN_ITEM == null) return ItemStack.EMPTY; ItemStack stack = new ItemStack(V2BondageItems.DATA_DRIVEN_ITEM.get()); - stack.getOrCreateTag().putString(DataDrivenItemRegistry.NBT_ITEM_ID, itemId.toString()); + stack + .getOrCreateTag() + .putString(DataDrivenItemRegistry.NBT_ITEM_ID, itemId.toString()); return stack; } } diff --git a/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenItemDefinition.java b/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenItemDefinition.java index eaa8700..c3c7aea 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenItemDefinition.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenItemDefinition.java @@ -78,7 +78,8 @@ public record DataDrivenItemDefinition( * Optional per-item overrides for the movement style's default values. * Requires {@code movementStyle} to be non-null (ignored otherwise). */ - @Nullable com.tiedup.remake.v2.bondage.movement.MovementModifier movementModifier, + @Nullable + com.tiedup.remake.v2.bondage.movement.MovementModifier movementModifier, /** * Per-animation bone whitelist. Maps animation name (e.g. "idle", "struggle") diff --git a/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenItemParser.java b/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenItemParser.java index 94aca0c..abd6f70 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenItemParser.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenItemParser.java @@ -52,7 +52,9 @@ import org.jetbrains.annotations.Nullable; */ public final class DataDrivenItemParser { - private static final Logger LOGGER = LogManager.getLogger("DataDrivenItems"); + private static final Logger LOGGER = LogManager.getLogger( + "DataDrivenItems" + ); private DataDrivenItemParser() {} @@ -64,7 +66,10 @@ public final class DataDrivenItemParser { * @return the parsed definition, or null if the file is invalid */ @Nullable - public static DataDrivenItemDefinition parse(InputStream input, ResourceLocation fileId) { + public static DataDrivenItemDefinition parse( + InputStream input, + ResourceLocation fileId + ) { try { JsonObject root = JsonParser.parseReader( new InputStreamReader(input, StandardCharsets.UTF_8) @@ -72,7 +77,11 @@ public final class DataDrivenItemParser { return parseObject(root, fileId); } catch (Exception e) { - LOGGER.error("[DataDrivenItems] Failed to parse JSON {}: {}", fileId, e.getMessage()); + LOGGER.error( + "[DataDrivenItems] Failed to parse JSON {}: {}", + fileId, + e.getMessage() + ); return null; } } @@ -85,19 +94,28 @@ public final class DataDrivenItemParser { * @return the parsed definition, or null if validation fails */ @Nullable - public static DataDrivenItemDefinition parseObject(JsonObject root, ResourceLocation fileId) { + public static DataDrivenItemDefinition parseObject( + JsonObject root, + ResourceLocation fileId + ) { // Validate type field String type = getStringOrNull(root, "type"); if (!"tiedup:bondage_item".equals(type)) { - LOGGER.error("[DataDrivenItems] Skipping {}: invalid or missing type '{}' (expected 'tiedup:bondage_item')", - fileId, type); + LOGGER.error( + "[DataDrivenItems] Skipping {}: invalid or missing type '{}' (expected 'tiedup:bondage_item')", + fileId, + type + ); return null; } // Required: display_name String displayName = getStringOrNull(root, "display_name"); if (displayName == null || displayName.isEmpty()) { - LOGGER.error("[DataDrivenItems] Skipping {}: missing 'display_name'", fileId); + LOGGER.error( + "[DataDrivenItems] Skipping {}: missing 'display_name'", + fileId + ); return null; } @@ -107,33 +125,63 @@ public final class DataDrivenItemParser { // Required: model String modelStr = getStringOrNull(root, "model"); if (modelStr == null || modelStr.isEmpty()) { - LOGGER.error("[DataDrivenItems] Skipping {}: missing 'model'", fileId); + LOGGER.error( + "[DataDrivenItems] Skipping {}: missing 'model'", + fileId + ); return null; } ResourceLocation modelLocation = ResourceLocation.tryParse(modelStr); if (modelLocation == null) { - LOGGER.error("[DataDrivenItems] Skipping {}: invalid model ResourceLocation '{}'", fileId, modelStr); + LOGGER.error( + "[DataDrivenItems] Skipping {}: invalid model ResourceLocation '{}'", + fileId, + modelStr + ); return null; } // Optional: slim_model - ResourceLocation slimModelLocation = parseOptionalResourceLocation(root, "slim_model", fileId); + ResourceLocation slimModelLocation = parseOptionalResourceLocation( + root, + "slim_model", + fileId + ); // Optional: texture - ResourceLocation texturePath = parseOptionalResourceLocation(root, "texture", fileId); + ResourceLocation texturePath = parseOptionalResourceLocation( + root, + "texture", + fileId + ); // Optional: animation_source - ResourceLocation animationSource = parseOptionalResourceLocation(root, "animation_source", fileId); + ResourceLocation animationSource = parseOptionalResourceLocation( + root, + "animation_source", + fileId + ); // Required: regions (non-empty) - Set occupiedRegions = parseRegions(root, "regions", fileId); + Set occupiedRegions = parseRegions( + root, + "regions", + fileId + ); if (occupiedRegions == null || occupiedRegions.isEmpty()) { - LOGGER.error("[DataDrivenItems] Skipping {}: missing or empty 'regions'", fileId); + LOGGER.error( + "[DataDrivenItems] Skipping {}: missing or empty 'regions'", + fileId + ); return null; } // Optional: blocked_regions (defaults to regions) - Set blockedRegions = parseRegions(root, "blocked_regions", fileId); + Set blockedRegions = parseRegions( + root, + "blocked_regions", + fileId + ); if (blockedRegions == null || blockedRegions.isEmpty()) { blockedRegions = occupiedRegions; } @@ -148,13 +196,25 @@ public final class DataDrivenItemParser { boolean lockable = getBooleanOrDefault(root, "lockable", true); // Optional: supports_color (default false) - boolean supportsColor = getBooleanOrDefault(root, "supports_color", false); + boolean supportsColor = getBooleanOrDefault( + root, + "supports_color", + false + ); // Optional: tint_channels (default empty) - Map tintChannels = parseTintChannels(root, "tint_channels", fileId); + Map tintChannels = parseTintChannels( + root, + "tint_channels", + fileId + ); // Optional: icon (item model ResourceLocation for inventory sprite) - ResourceLocation icon = parseOptionalResourceLocation(root, "icon", fileId); + ResourceLocation icon = parseOptionalResourceLocation( + root, + "icon", + fileId + ); // Optional: movement_style (requires valid MovementStyle name) MovementStyle movementStyle = null; @@ -162,14 +222,21 @@ public final class DataDrivenItemParser { if (movementStyleStr != null && !movementStyleStr.isEmpty()) { movementStyle = MovementStyle.fromName(movementStyleStr); if (movementStyle == null) { - LOGGER.warn("[DataDrivenItems] In {}: unknown movement_style '{}', ignoring", - fileId, movementStyleStr); + LOGGER.warn( + "[DataDrivenItems] In {}: unknown movement_style '{}', ignoring", + fileId, + movementStyleStr + ); } } // Optional: movement_modifier (requires movement_style to be set) MovementModifier movementModifier = null; - if (movementStyle != null && root.has("movement_modifier") && root.get("movement_modifier").isJsonObject()) { + if ( + movementStyle != null && + root.has("movement_modifier") && + root.get("movement_modifier").isJsonObject() + ) { JsonObject modObj = root.getAsJsonObject("movement_modifier"); Float speedMul = getFloatOrNull(modObj, "speed_multiplier"); Boolean jumpDis = getBooleanOrNull(modObj, "jump_disabled"); @@ -177,14 +244,22 @@ public final class DataDrivenItemParser { movementModifier = new MovementModifier(speedMul, jumpDis); } } else if (movementStyle == null && root.has("movement_modifier")) { - LOGGER.warn("[DataDrivenItems] In {}: movement_modifier ignored because movement_style is absent", - fileId); + LOGGER.warn( + "[DataDrivenItems] In {}: movement_modifier ignored because movement_style is absent", + fileId + ); } // Required: animation_bones (per-animation bone whitelist) - Map> animationBones = parseAnimationBones(root, fileId); + Map> animationBones = parseAnimationBones( + root, + fileId + ); if (animationBones == null) { - LOGGER.error("[DataDrivenItems] Skipping {}: missing or invalid 'animation_bones'", fileId); + LOGGER.error( + "[DataDrivenItems] Skipping {}: missing or invalid 'animation_bones'", + fileId + ); return null; } @@ -200,14 +275,30 @@ public final class DataDrivenItemParser { if (idPath.endsWith(".json")) { idPath = idPath.substring(0, idPath.length() - 5); } - ResourceLocation id = new ResourceLocation(fileId.getNamespace(), idPath); + ResourceLocation id = new ResourceLocation( + fileId.getNamespace(), + idPath + ); return new DataDrivenItemDefinition( - id, displayName, translationKey, modelLocation, slimModelLocation, - texturePath, animationSource, occupiedRegions, blockedRegions, - posePriority, escapeDifficulty, - lockable, supportsColor, tintChannels, icon, - movementStyle, movementModifier, animationBones + id, + displayName, + translationKey, + modelLocation, + slimModelLocation, + texturePath, + animationSource, + occupiedRegions, + blockedRegions, + posePriority, + escapeDifficulty, + lockable, + supportsColor, + tintChannels, + icon, + movementStyle, + movementModifier, + animationBones ); } @@ -223,7 +314,11 @@ public final class DataDrivenItemParser { } } - private static int getIntOrDefault(JsonObject obj, String key, int defaultValue) { + private static int getIntOrDefault( + JsonObject obj, + String key, + int defaultValue + ) { if (!obj.has(key) || obj.get(key).isJsonNull()) return defaultValue; try { return obj.get(key).getAsInt(); @@ -232,7 +327,11 @@ public final class DataDrivenItemParser { } } - private static boolean getBooleanOrDefault(JsonObject obj, String key, boolean defaultValue) { + private static boolean getBooleanOrDefault( + JsonObject obj, + String key, + boolean defaultValue + ) { if (!obj.has(key) || obj.get(key).isJsonNull()) return defaultValue; try { return obj.get(key).getAsBoolean(); @@ -263,13 +362,20 @@ public final class DataDrivenItemParser { @Nullable private static ResourceLocation parseOptionalResourceLocation( - JsonObject obj, String key, ResourceLocation fileId + JsonObject obj, + String key, + ResourceLocation fileId ) { String value = getStringOrNull(obj, key); if (value == null || value.isEmpty()) return null; ResourceLocation loc = ResourceLocation.tryParse(value); if (loc == null) { - LOGGER.warn("[DataDrivenItems] In {}: invalid ResourceLocation for '{}': '{}'", fileId, key, value); + LOGGER.warn( + "[DataDrivenItems] In {}: invalid ResourceLocation for '{}': '{}'", + fileId, + key, + value + ); } return loc; } @@ -279,7 +385,11 @@ public final class DataDrivenItemParser { * Unknown region names are logged as warnings and skipped. */ @Nullable - private static Set parseRegions(JsonObject obj, String key, ResourceLocation fileId) { + private static Set parseRegions( + JsonObject obj, + String key, + ResourceLocation fileId + ) { if (!obj.has(key) || !obj.get(key).isJsonArray()) return null; JsonArray arr = obj.getAsJsonArray(key); @@ -293,12 +403,20 @@ public final class DataDrivenItemParser { if (region != null) { regions.add(region); } else { - LOGGER.warn("[DataDrivenItems] In {}: unknown region '{}' in '{}', skipping", - fileId, name, key); + LOGGER.warn( + "[DataDrivenItems] In {}: unknown region '{}' in '{}', skipping", + fileId, + name, + key + ); } } catch (Exception e) { - LOGGER.warn("[DataDrivenItems] In {}: invalid element in '{}': {}", - fileId, key, e.getMessage()); + LOGGER.warn( + "[DataDrivenItems] In {}: invalid element in '{}': {}", + fileId, + key, + e.getMessage() + ); } } @@ -321,18 +439,29 @@ public final class DataDrivenItemParser { * @param fileId the source file for error messages * @return an unmodifiable map of channel names to RGB ints, or empty map if absent */ - private static Map parseTintChannels(JsonObject obj, String key, ResourceLocation fileId) { + private static Map parseTintChannels( + JsonObject obj, + String key, + ResourceLocation fileId + ) { if (!obj.has(key) || !obj.get(key).isJsonObject()) return Map.of(); JsonObject channels = obj.getAsJsonObject(key); Map result = new LinkedHashMap<>(); for (Map.Entry entry : channels.entrySet()) { try { String hex = entry.getValue().getAsString(); - int color = Integer.parseInt(hex.startsWith("#") ? hex.substring(1) : hex, 16); + int color = Integer.parseInt( + hex.startsWith("#") ? hex.substring(1) : hex, + 16 + ); result.put(entry.getKey(), color); } catch (NumberFormatException e) { - LOGGER.warn("[DataDrivenItems] In {}: invalid hex color '{}' for tint channel '{}'", - fileId, entry.getValue(), entry.getKey()); + LOGGER.warn( + "[DataDrivenItems] In {}: invalid hex color '{}' for tint channel '{}'", + fileId, + entry.getValue(), + entry.getKey() + ); } } return Collections.unmodifiableMap(result); @@ -340,7 +469,12 @@ public final class DataDrivenItemParser { /** Valid PlayerAnimator bone names for animation_bones validation. */ private static final Set VALID_BONE_NAMES = Set.of( - "head", "body", "rightArm", "leftArm", "rightLeg", "leftLeg" + "head", + "body", + "rightArm", + "leftArm", + "rightLeg", + "leftLeg" ); /** @@ -364,14 +498,23 @@ public final class DataDrivenItemParser { * @return unmodifiable map of animation name to bone set, or null if absent/invalid */ @Nullable - private static Map> parseAnimationBones(JsonObject obj, ResourceLocation fileId) { - if (!obj.has("animation_bones") || !obj.get("animation_bones").isJsonObject()) { + private static Map> parseAnimationBones( + JsonObject obj, + ResourceLocation fileId + ) { + if ( + !obj.has("animation_bones") || + !obj.get("animation_bones").isJsonObject() + ) { return null; } JsonObject bonesObj = obj.getAsJsonObject("animation_bones"); if (bonesObj.size() == 0) { - LOGGER.error("[DataDrivenItems] In {}: 'animation_bones' is empty", fileId); + LOGGER.error( + "[DataDrivenItems] In {}: 'animation_bones' is empty", + fileId + ); return null; } @@ -381,8 +524,11 @@ public final class DataDrivenItemParser { JsonElement value = entry.getValue(); if (!value.isJsonArray()) { - LOGGER.warn("[DataDrivenItems] In {}: animation_bones['{}'] is not an array, skipping", - fileId, animName); + LOGGER.warn( + "[DataDrivenItems] In {}: animation_bones['{}'] is not an array, skipping", + fileId, + animName + ); continue; } @@ -394,29 +540,41 @@ public final class DataDrivenItemParser { if (VALID_BONE_NAMES.contains(boneName)) { bones.add(boneName); } else { - LOGGER.warn("[DataDrivenItems] In {}: animation_bones['{}'] contains unknown bone '{}', skipping", - fileId, animName, boneName); + LOGGER.warn( + "[DataDrivenItems] In {}: animation_bones['{}'] contains unknown bone '{}', skipping", + fileId, + animName, + boneName + ); } } catch (Exception e) { - LOGGER.warn("[DataDrivenItems] In {}: invalid element in animation_bones['{}']", - fileId, animName); + LOGGER.warn( + "[DataDrivenItems] In {}: invalid element in animation_bones['{}']", + fileId, + animName + ); } } if (!bones.isEmpty()) { result.put(animName, Collections.unmodifiableSet(bones)); } else { - LOGGER.warn("[DataDrivenItems] In {}: animation_bones['{}'] resolved to empty set, skipping", - fileId, animName); + LOGGER.warn( + "[DataDrivenItems] In {}: animation_bones['{}'] resolved to empty set, skipping", + fileId, + animName + ); } } if (result.isEmpty()) { - LOGGER.error("[DataDrivenItems] In {}: 'animation_bones' has no valid entries", fileId); + LOGGER.error( + "[DataDrivenItems] In {}: 'animation_bones' has no valid entries", + fileId + ); return null; } return Collections.unmodifiableMap(result); } - } diff --git a/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenItemRegistry.java b/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenItemRegistry.java index bc6bc23..b721b0f 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenItemRegistry.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenItemRegistry.java @@ -29,7 +29,10 @@ public final class DataDrivenItemRegistry { * Volatile reference to an unmodifiable map. Reload builds a new map * and swaps atomically; consumer threads always see a consistent snapshot. */ - private static volatile Map DEFINITIONS = Map.of(); + private static volatile Map< + ResourceLocation, + DataDrivenItemDefinition + > DEFINITIONS = Map.of(); private DataDrivenItemRegistry() {} @@ -39,7 +42,9 @@ public final class DataDrivenItemRegistry { * * @param newDefs the new definitions map (will be defensively copied) */ - public static void reload(Map newDefs) { + public static void reload( + Map newDefs + ) { DEFINITIONS = Collections.unmodifiableMap(new HashMap<>(newDefs)); } @@ -53,8 +58,12 @@ public final class DataDrivenItemRegistry { * * @param newDefs the definitions to merge (will overwrite existing entries with same key) */ - public static void mergeAll(Map newDefs) { - Map merged = new HashMap<>(DEFINITIONS); + public static void mergeAll( + Map newDefs + ) { + Map merged = new HashMap<>( + DEFINITIONS + ); merged.putAll(newDefs); DEFINITIONS = Collections.unmodifiableMap(merged); } @@ -81,7 +90,9 @@ public final class DataDrivenItemRegistry { if (stack.isEmpty()) return null; CompoundTag tag = stack.getTag(); if (tag == null || !tag.contains(NBT_ITEM_ID)) return null; - ResourceLocation id = ResourceLocation.tryParse(tag.getString(NBT_ITEM_ID)); + ResourceLocation id = ResourceLocation.tryParse( + tag.getString(NBT_ITEM_ID) + ); if (id == null) return null; return DEFINITIONS.get(id); } diff --git a/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenItemReloadListener.java b/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenItemReloadListener.java index cbf21b3..d05d2e3 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenItemReloadListener.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenItemReloadListener.java @@ -21,50 +21,80 @@ import org.apache.logging.log4j.Logger; *

                Follows the same pattern as {@link com.tiedup.remake.client.animation.context.ContextGlbRegistry}: * prepare phase is a no-op, apply phase scans + parses + atomic-swaps the registry.

                */ -public class DataDrivenItemReloadListener extends SimplePreparableReloadListener { +public class DataDrivenItemReloadListener + extends SimplePreparableReloadListener +{ - private static final Logger LOGGER = LogManager.getLogger("DataDrivenItems"); + private static final Logger LOGGER = LogManager.getLogger( + "DataDrivenItems" + ); /** Resource directory containing item definition JSON files. */ private static final String DIRECTORY = "tiedup_items"; @Override - protected Void prepare(ResourceManager resourceManager, ProfilerFiller profiler) { + protected Void prepare( + ResourceManager resourceManager, + ProfilerFiller profiler + ) { // No preparation needed — parsing happens in apply phase return null; } @Override - protected void apply(Void nothing, ResourceManager resourceManager, ProfilerFiller profiler) { - Map newDefs = new HashMap<>(); + protected void apply( + Void nothing, + ResourceManager resourceManager, + ProfilerFiller profiler + ) { + Map newDefs = + new HashMap<>(); - Map resources = resourceManager.listResources( - DIRECTORY, loc -> loc.getPath().endsWith(".json") - ); + Map resources = + resourceManager.listResources(DIRECTORY, loc -> + loc.getPath().endsWith(".json") + ); int skipped = 0; - for (Map.Entry entry : resources.entrySet()) { + for (Map.Entry< + ResourceLocation, + Resource + > entry : resources.entrySet()) { ResourceLocation fileId = entry.getKey(); Resource resource = entry.getValue(); try (InputStream input = resource.open()) { - DataDrivenItemDefinition def = DataDrivenItemParser.parse(input, fileId); + DataDrivenItemDefinition def = DataDrivenItemParser.parse( + input, + fileId + ); if (def != null) { // Check for duplicate IDs if (newDefs.containsKey(def.id())) { - LOGGER.warn("[DataDrivenItems] Duplicate item ID '{}' from file '{}' — overwriting previous definition", - def.id(), fileId); + LOGGER.warn( + "[DataDrivenItems] Duplicate item ID '{}' from file '{}' — overwriting previous definition", + def.id(), + fileId + ); } newDefs.put(def.id(), def); - LOGGER.debug("[DataDrivenItems] Loaded: {} -> '{}'", def.id(), def.displayName()); + LOGGER.debug( + "[DataDrivenItems] Loaded: {} -> '{}'", + def.id(), + def.displayName() + ); } else { skipped++; } } catch (Exception e) { - LOGGER.error("[DataDrivenItems] Failed to read resource {}: {}", fileId, e.getMessage()); + LOGGER.error( + "[DataDrivenItems] Failed to read resource {}: {}", + fileId, + e.getMessage() + ); skipped++; } } @@ -73,7 +103,11 @@ public class DataDrivenItemReloadListener extends SimplePreparableReloadListener // overwrite client-only definitions on integrated server DataDrivenItemRegistry.mergeAll(newDefs); - LOGGER.info("[DataDrivenItems] Loaded {} item definitions ({} skipped) from {} JSON files", - newDefs.size(), skipped, resources.size()); + LOGGER.info( + "[DataDrivenItems] Loaded {} item definitions ({} skipped) from {} JSON files", + newDefs.size(), + skipped, + resources.size() + ); } } diff --git a/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenItemServerReloadListener.java b/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenItemServerReloadListener.java index b05b741..5f1b16d 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenItemServerReloadListener.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenItemServerReloadListener.java @@ -23,50 +23,80 @@ import org.apache.logging.log4j.Logger; *

                Registered via {@link net.minecraftforge.event.AddReloadListenerEvent} in * {@link com.tiedup.remake.core.TiedUpMod.ForgeEvents}.

                */ -public class DataDrivenItemServerReloadListener extends SimplePreparableReloadListener { +public class DataDrivenItemServerReloadListener + extends SimplePreparableReloadListener +{ - private static final Logger LOGGER = LogManager.getLogger("DataDrivenItems"); + private static final Logger LOGGER = LogManager.getLogger( + "DataDrivenItems" + ); /** Resource directory containing item definition JSON files (under data/). */ private static final String DIRECTORY = "tiedup_items"; @Override - protected Void prepare(ResourceManager resourceManager, ProfilerFiller profiler) { + protected Void prepare( + ResourceManager resourceManager, + ProfilerFiller profiler + ) { // No preparation needed -- parsing happens in apply phase return null; } @Override - protected void apply(Void nothing, ResourceManager resourceManager, ProfilerFiller profiler) { - Map newDefs = new HashMap<>(); + protected void apply( + Void nothing, + ResourceManager resourceManager, + ProfilerFiller profiler + ) { + Map newDefs = + new HashMap<>(); - Map resources = resourceManager.listResources( - DIRECTORY, loc -> loc.getPath().endsWith(".json") - ); + Map resources = + resourceManager.listResources(DIRECTORY, loc -> + loc.getPath().endsWith(".json") + ); int skipped = 0; - for (Map.Entry entry : resources.entrySet()) { + for (Map.Entry< + ResourceLocation, + Resource + > entry : resources.entrySet()) { ResourceLocation fileId = entry.getKey(); Resource resource = entry.getValue(); try (InputStream input = resource.open()) { - DataDrivenItemDefinition def = DataDrivenItemParser.parse(input, fileId); + DataDrivenItemDefinition def = DataDrivenItemParser.parse( + input, + fileId + ); if (def != null) { // Check for duplicate IDs if (newDefs.containsKey(def.id())) { - LOGGER.warn("[DataDrivenItems] Server: Duplicate item ID '{}' from file '{}' -- overwriting previous definition", - def.id(), fileId); + LOGGER.warn( + "[DataDrivenItems] Server: Duplicate item ID '{}' from file '{}' -- overwriting previous definition", + def.id(), + fileId + ); } newDefs.put(def.id(), def); - LOGGER.debug("[DataDrivenItems] Server loaded: {} -> '{}'", def.id(), def.displayName()); + LOGGER.debug( + "[DataDrivenItems] Server loaded: {} -> '{}'", + def.id(), + def.displayName() + ); } else { skipped++; } } catch (Exception e) { - LOGGER.error("[DataDrivenItems] Server: Failed to read resource {}: {}", fileId, e.getMessage()); + LOGGER.error( + "[DataDrivenItems] Server: Failed to read resource {}: {}", + fileId, + e.getMessage() + ); skipped++; } } @@ -75,7 +105,11 @@ public class DataDrivenItemServerReloadListener extends SimplePreparableReloadLi // definitions aren't overwritten on integrated server DataDrivenItemRegistry.mergeAll(newDefs); - LOGGER.info("[DataDrivenItems] Server loaded {} item definitions ({} skipped) from {} JSON files", - newDefs.size(), skipped, resources.size()); + LOGGER.info( + "[DataDrivenItems] Server loaded {} item definitions ({} skipped) from {} JSON files", + newDefs.size(), + skipped, + resources.size() + ); } } diff --git a/src/main/java/com/tiedup/remake/v2/bondage/items/AbstractV2BondageItem.java b/src/main/java/com/tiedup/remake/v2/bondage/items/AbstractV2BondageItem.java index 19384e2..99b56c2 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/items/AbstractV2BondageItem.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/items/AbstractV2BondageItem.java @@ -32,8 +32,10 @@ import org.jetbrains.annotations.Nullable; * Subclasses implement: getOccupiedRegions(), getModelLocation(), getPosePriority(), * getResistanceId(), notifyStruggle(). */ -public abstract class AbstractV2BondageItem extends Item - implements IV2BondageItem, ILockable, IHasResistance { +public abstract class AbstractV2BondageItem + extends Item + implements IV2BondageItem, ILockable, IHasResistance +{ protected AbstractV2BondageItem(Properties properties) { super(properties); @@ -45,7 +47,11 @@ public abstract class AbstractV2BondageItem extends Item // Right-click in air does nothing for self-equip — consistent with V1 behavior. @Override - public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + public InteractionResultHolder use( + Level level, + Player player, + InteractionHand hand + ) { return InteractionResultHolder.pass(player.getItemInHand(hand)); } @@ -53,7 +59,10 @@ public abstract class AbstractV2BondageItem extends Item @Override public InteractionResult interactLivingEntity( - ItemStack stack, Player player, LivingEntity target, InteractionHand hand + ItemStack stack, + Player player, + LivingEntity target, + InteractionHand hand ) { // Client returns SUCCESS for arm swing animation. Server may reject — // minor visual desync is accepted Forge pattern (same as vanilla food/bow). @@ -94,7 +103,10 @@ public abstract class AbstractV2BondageItem extends Item @Override public void appendHoverText( - ItemStack stack, @Nullable Level level, List tooltip, TooltipFlag flag + ItemStack stack, + @Nullable Level level, + List tooltip, + TooltipFlag flag ) { super.appendHoverText(stack, level, tooltip, flag); // Lock status from ILockable @@ -102,19 +114,29 @@ public abstract class AbstractV2BondageItem extends Item // Escape difficulty int difficulty = getEscapeDifficulty(stack); if (difficulty > 0) { - tooltip.add(Component.translatable("item.tiedup.tooltip.escape_difficulty", difficulty) - .withStyle(ChatFormatting.GRAY)); + tooltip.add( + Component.translatable( + "item.tiedup.tooltip.escape_difficulty", + difficulty + ).withStyle(ChatFormatting.GRAY) + ); } } // ===== IV2BondageItem DEFAULTS ===== @Override - public int getEscapeDifficulty() { return 0; } + public int getEscapeDifficulty() { + return 0; + } @Override - public boolean supportsColor() { return false; } + public boolean supportsColor() { + return false; + } @Override - public boolean supportsSlimModel() { return false; } + public boolean supportsSlimModel() { + return false; + } } diff --git a/src/main/java/com/tiedup/remake/v2/bondage/items/V2Handcuffs.java b/src/main/java/com/tiedup/remake/v2/bondage/items/V2Handcuffs.java index d846940..c1d9144 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/items/V2Handcuffs.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/items/V2Handcuffs.java @@ -20,7 +20,8 @@ public class V2Handcuffs extends AbstractV2BondageItem { Collections.unmodifiableSet(EnumSet.of(BodyRegionV2.ARMS)); private static final ResourceLocation MODEL = new ResourceLocation( - TiedUpMod.MOD_ID, "models/gltf/v2/handcuffs/cuffs_prototype.glb" + TiedUpMod.MOD_ID, + "models/gltf/v2/handcuffs/cuffs_prototype.glb" ); public V2Handcuffs() { @@ -28,27 +29,43 @@ public class V2Handcuffs extends AbstractV2BondageItem { } @Override - public Set getOccupiedRegions() { return REGIONS; } + public Set getOccupiedRegions() { + return REGIONS; + } @Override - public ResourceLocation getModelLocation() { return MODEL; } + public ResourceLocation getModelLocation() { + return MODEL; + } @Override - public int getPosePriority() { return 30; } + public int getPosePriority() { + return 30; + } @Override - public int getEscapeDifficulty() { return 100; } + public int getEscapeDifficulty() { + return 100; + } @Override - public String getResistanceId() { return "handcuffs"; } + public String getResistanceId() { + return "handcuffs"; + } @Override public void notifyStruggle(LivingEntity entity) { - entity.level().playSound( - null, entity.getX(), entity.getY(), entity.getZ(), - net.minecraft.sounds.SoundEvents.CHAIN_STEP, - net.minecraft.sounds.SoundSource.PLAYERS, - 0.4f, 1.0f - ); + entity + .level() + .playSound( + null, + entity.getX(), + entity.getY(), + entity.getZ(), + net.minecraft.sounds.SoundEvents.CHAIN_STEP, + net.minecraft.sounds.SoundSource.PLAYERS, + 0.4f, + 1.0f + ); } } diff --git a/src/main/java/com/tiedup/remake/v2/bondage/movement/MovementStyle.java b/src/main/java/com/tiedup/remake/v2/bondage/movement/MovementStyle.java index 420a9fa..f757eac 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/movement/MovementStyle.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/movement/MovementStyle.java @@ -1,7 +1,7 @@ package com.tiedup.remake.v2.bondage.movement; -import org.jetbrains.annotations.Nullable; import com.tiedup.remake.v2.BodyRegionV2; +import org.jetbrains.annotations.Nullable; /** * Movement styles that change how a bound player physically moves. @@ -16,7 +16,6 @@ import com.tiedup.remake.v2.BodyRegionV2; * to avoid pulling server-only classes into client code.

                */ public enum MovementStyle { - /** Swaying side-to-side gait, visual zigzag via animation. Jump allowed. */ WADDLE(1, 0.6f, false), @@ -33,7 +32,11 @@ public enum MovementStyle { private final float defaultSpeedMultiplier; private final boolean defaultJumpDisabled; - MovementStyle(int severity, float defaultSpeedMultiplier, boolean defaultJumpDisabled) { + MovementStyle( + int severity, + float defaultSpeedMultiplier, + boolean defaultJumpDisabled + ) { this.severity = severity; this.defaultSpeedMultiplier = defaultSpeedMultiplier; this.defaultJumpDisabled = defaultJumpDisabled; diff --git a/src/main/java/com/tiedup/remake/v2/bondage/movement/MovementStyleManager.java b/src/main/java/com/tiedup/remake/v2/bondage/movement/MovementStyleManager.java index 275cb5a..4a106d9 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/movement/MovementStyleManager.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/movement/MovementStyleManager.java @@ -61,18 +61,23 @@ public class MovementStyleManager { // RestraintEffectUtils used this UUID with ADDITION operation and addPermanentModifier(). // Players upgrading from V1 may still have this modifier saved in their NBT. // Removed on tick to prevent double stacking with V2 MULTIPLY_BASE modifiers. - private static final UUID V1_BIND_SPEED_MODIFIER_UUID = - UUID.fromString("7f3c7c8e-9d4e-4c7a-8e5f-1a2b3c4d5e6f"); + private static final UUID V1_BIND_SPEED_MODIFIER_UUID = UUID.fromString( + "7f3c7c8e-9d4e-4c7a-8e5f-1a2b3c4d5e6f" + ); // --- Unique UUIDs for AttributeModifiers (one per style to allow clean removal) --- - private static final UUID WADDLE_SPEED_UUID = - UUID.fromString("d7a1c001-0000-0000-0000-000000000001"); - private static final UUID SHUFFLE_SPEED_UUID = - UUID.fromString("d7a1c001-0000-0000-0000-000000000002"); - private static final UUID HOP_SPEED_UUID = - UUID.fromString("d7a1c001-0000-0000-0000-000000000003"); - private static final UUID CRAWL_SPEED_UUID = - UUID.fromString("d7a1c001-0000-0000-0000-000000000004"); + private static final UUID WADDLE_SPEED_UUID = UUID.fromString( + "d7a1c001-0000-0000-0000-000000000001" + ); + private static final UUID SHUFFLE_SPEED_UUID = UUID.fromString( + "d7a1c001-0000-0000-0000-000000000002" + ); + private static final UUID HOP_SPEED_UUID = UUID.fromString( + "d7a1c001-0000-0000-0000-000000000003" + ); + private static final UUID CRAWL_SPEED_UUID = UUID.fromString( + "d7a1c001-0000-0000-0000-000000000004" + ); // --- Hop tuning constants --- private static final double HOP_Y_IMPULSE = 0.28; @@ -119,7 +124,11 @@ public class MovementStyleManager { // --- Skip conditions --- // Update last position even when suspended to prevent false movement // detection on resume (e.g., teleport while riding) - if (player.isPassenger() || player.isDeadOrDying() || state.isStruggling()) { + if ( + player.isPassenger() || + player.isDeadOrDying() || + state.isStruggling() + ) { state.lastX = player.getX(); state.lastY = player.getY(); state.lastZ = player.getZ(); @@ -138,8 +147,8 @@ public class MovementStyleManager { // --- Resolve current style from equipped items --- IV2BondageEquipment equipment = V2EquipmentHelper.getEquipment(player); - Map equipped = equipment != null - ? equipment.getAllEquipped() : Map.of(); + Map equipped = + equipment != null ? equipment.getAllEquipped() : Map.of(); ResolvedMovement resolved = MovementStyleResolver.resolve(equipped); // --- Compare with current active style --- @@ -163,7 +172,9 @@ public class MovementStyleManager { // Sync to all tracking clients (animation + crawl pose) ModNetwork.sendToAllTrackingAndSelf( - new PacketSyncMovementStyle(player.getUUID(), newStyle), player); + new PacketSyncMovementStyle(player.getUUID(), newStyle), + player + ); } // --- Per-style tick --- @@ -229,15 +240,18 @@ public class MovementStyleManager { private static double getJumpBoostFactor(Player player) { var jumpBoost = player.getEffect(MobEffects.JUMP); if (jumpBoost != null) { - return 1.0 + (jumpBoost.getAmplifier() + 1) * 0.1 / 0.42; + return 1.0 + ((jumpBoost.getAmplifier() + 1) * 0.1) / 0.42; } return 1.0; } // ==================== Lifecycle ==================== - private static void onActivate(ServerPlayer player, PlayerBindState state, - MovementStyle style) { + private static void onActivate( + ServerPlayer player, + PlayerBindState state, + MovementStyle style + ) { switch (style) { case WADDLE -> activateWaddle(player, state); case SHUFFLE -> activateShuffle(player, state); @@ -246,8 +260,11 @@ public class MovementStyleManager { } } - private static void onDeactivate(ServerPlayer player, PlayerBindState state, - MovementStyle style) { + private static void onDeactivate( + ServerPlayer player, + PlayerBindState state, + MovementStyle style + ) { switch (style) { case WADDLE -> deactivateWaddle(player, state); case SHUFFLE -> deactivateShuffle(player, state); @@ -267,12 +284,22 @@ public class MovementStyleManager { // ==================== Waddle ==================== - private static void activateWaddle(ServerPlayer player, PlayerBindState state) { - applySpeedModifier(player, WADDLE_SPEED_UUID, "tiedup.waddle_speed", - state.getResolvedMovementSpeed()); + private static void activateWaddle( + ServerPlayer player, + PlayerBindState state + ) { + applySpeedModifier( + player, + WADDLE_SPEED_UUID, + "tiedup.waddle_speed", + state.getResolvedMovementSpeed() + ); } - private static void deactivateWaddle(ServerPlayer player, PlayerBindState state) { + private static void deactivateWaddle( + ServerPlayer player, + PlayerBindState state + ) { removeSpeedModifier(player, WADDLE_SPEED_UUID); } @@ -283,31 +310,54 @@ public class MovementStyleManager { // ==================== Shuffle ==================== - private static void activateShuffle(ServerPlayer player, PlayerBindState state) { - applySpeedModifier(player, SHUFFLE_SPEED_UUID, "tiedup.shuffle_speed", - state.getResolvedMovementSpeed()); + private static void activateShuffle( + ServerPlayer player, + PlayerBindState state + ) { + applySpeedModifier( + player, + SHUFFLE_SPEED_UUID, + "tiedup.shuffle_speed", + state.getResolvedMovementSpeed() + ); } - private static void deactivateShuffle(ServerPlayer player, PlayerBindState state) { + private static void deactivateShuffle( + ServerPlayer player, + PlayerBindState state + ) { removeSpeedModifier(player, SHUFFLE_SPEED_UUID); } - private static void tickShuffle(ServerPlayer player, PlayerBindState state) { + private static void tickShuffle( + ServerPlayer player, + PlayerBindState state + ) { // Shuffle: speed reduction via attribute is sufficient. No per-tick work. } // ==================== Hop ==================== - private static void activateHop(ServerPlayer player, PlayerBindState state) { + private static void activateHop( + ServerPlayer player, + PlayerBindState state + ) { // Apply base speed reduction (~15% base speed between hops) - applySpeedModifier(player, HOP_SPEED_UUID, "tiedup.hop_speed", - state.getResolvedMovementSpeed()); + applySpeedModifier( + player, + HOP_SPEED_UUID, + "tiedup.hop_speed", + state.getResolvedMovementSpeed() + ); state.hopCooldown = 0; state.hopStartupPending = true; state.hopStartupTicks = HOP_STARTUP_DELAY_TICKS; } - private static void deactivateHop(ServerPlayer player, PlayerBindState state) { + private static void deactivateHop( + ServerPlayer player, + PlayerBindState state + ) { removeSpeedModifier(player, HOP_SPEED_UUID); state.hopCooldown = 0; state.hopStartupPending = false; @@ -325,8 +375,9 @@ public class MovementStyleManager { *
              */ private static void tickHop(ServerPlayer player, PlayerBindState state) { - boolean isMoving = player.distanceToSqr(state.lastX, state.lastY, state.lastZ) - > MOVEMENT_THRESHOLD_SQ; + boolean isMoving = + player.distanceToSqr(state.lastX, state.lastY, state.lastZ) > + MOVEMENT_THRESHOLD_SQ; // Decrement cooldown if (state.hopCooldown > 0) { @@ -351,8 +402,10 @@ public class MovementStyleManager { } else if (!isMoving) { state.hopNotMovingTicks++; // Reset startup if not moving for >= 2 consecutive ticks - if (state.hopNotMovingTicks >= HOP_STARTUP_RESET_TICKS - && !state.hopStartupPending) { + if ( + state.hopNotMovingTicks >= HOP_STARTUP_RESET_TICKS && + !state.hopStartupPending + ) { state.hopStartupPending = true; state.hopStartupTicks = HOP_STARTUP_DELAY_TICKS; } @@ -373,9 +426,9 @@ public class MovementStyleManager { Vec3 currentMotion = player.getDeltaMovement(); player.setDeltaMovement( - currentMotion.x + forward.x * HOP_FORWARD_IMPULSE, - HOP_Y_IMPULSE, - currentMotion.z + forward.z * HOP_FORWARD_IMPULSE + currentMotion.x + forward.x * HOP_FORWARD_IMPULSE, + HOP_Y_IMPULSE, + currentMotion.z + forward.z * HOP_FORWARD_IMPULSE ); state.hopCooldown = HOP_COOLDOWN_TICKS; @@ -386,15 +439,25 @@ public class MovementStyleManager { // ==================== Crawl ==================== - private static void activateCrawl(ServerPlayer player, PlayerBindState state) { - applySpeedModifier(player, CRAWL_SPEED_UUID, "tiedup.crawl_speed", - state.getResolvedMovementSpeed()); + private static void activateCrawl( + ServerPlayer player, + PlayerBindState state + ) { + applySpeedModifier( + player, + CRAWL_SPEED_UUID, + "tiedup.crawl_speed", + state.getResolvedMovementSpeed() + ); player.setForcedPose(Pose.SWIMMING); player.refreshDimensions(); state.pendingPoseRestore = false; } - private static void deactivateCrawl(ServerPlayer player, PlayerBindState state) { + private static void deactivateCrawl( + ServerPlayer player, + PlayerBindState state + ) { removeSpeedModifier(player, CRAWL_SPEED_UUID); // Space check: can the player stand up? @@ -427,8 +490,10 @@ public class MovementStyleManager { * Called every tick regardless of active style (step 2 in tick flow). * Retries until space is available for the player to stand. */ - private static void tryRestoreStandingPose(ServerPlayer player, - PlayerBindState state) { + private static void tryRestoreStandingPose( + ServerPlayer player, + PlayerBindState state + ) { EntityDimensions standDims = player.getDimensions(Pose.STANDING); AABB standBox = standDims.makeBoundingBox(player.position()); boolean canStand = player.level().noCollision(player, standBox); @@ -437,8 +502,10 @@ public class MovementStyleManager { player.setForcedPose(null); player.refreshDimensions(); state.pendingPoseRestore = false; - LOGGER.debug("Restored standing pose for {} (pending pose restore cleared)", - player.getName().getString()); + LOGGER.debug( + "Restored standing pose for {} (pending pose restore cleared)", + player.getName().getString() + ); } } @@ -457,10 +524,15 @@ public class MovementStyleManager { */ private static void cleanupV1Modifier(ServerPlayer player) { AttributeInstance attr = player.getAttribute(Attributes.MOVEMENT_SPEED); - if (attr != null && attr.getModifier(V1_BIND_SPEED_MODIFIER_UUID) != null) { + if ( + attr != null && + attr.getModifier(V1_BIND_SPEED_MODIFIER_UUID) != null + ) { attr.removeModifier(V1_BIND_SPEED_MODIFIER_UUID); - LOGGER.info("Removed stale V1 speed modifier from player {}", - player.getName().getString()); + LOGGER.info( + "Removed stale V1 speed modifier from player {}", + player.getName().getString() + ); } } @@ -481,8 +553,12 @@ public class MovementStyleManager { * @param name modifier name (for debugging in F3 screen) * @param multiplier the desired speed fraction (0.0-1.0) */ - private static void applySpeedModifier(ServerPlayer player, UUID uuid, String name, - float multiplier) { + private static void applySpeedModifier( + ServerPlayer player, + UUID uuid, + String name, + float multiplier + ) { AttributeInstance attr = player.getAttribute(Attributes.MOVEMENT_SPEED); if (attr == null) return; @@ -491,8 +567,14 @@ public class MovementStyleManager { // MULTIPLY_BASE: value of -(1 - multiplier) reduces base speed to multiplier fraction double value = -(1.0 - multiplier); - attr.addTransientModifier(new AttributeModifier(uuid, name, - value, AttributeModifier.Operation.MULTIPLY_BASE)); + attr.addTransientModifier( + new AttributeModifier( + uuid, + name, + value, + AttributeModifier.Operation.MULTIPLY_BASE + ) + ); } /** diff --git a/src/main/java/com/tiedup/remake/v2/bondage/movement/MovementStyleResolver.java b/src/main/java/com/tiedup/remake/v2/bondage/movement/MovementStyleResolver.java index 432fd2d..d58482e 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/movement/MovementStyleResolver.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/movement/MovementStyleResolver.java @@ -47,7 +47,9 @@ public final class MovementStyleResolver { * @param equipped map of region to ItemStack (from {@code IV2BondageEquipment.getAllEquipped()}) * @return the resolved movement, or {@link ResolvedMovement#NONE} if no styled items */ - public static ResolvedMovement resolve(Map equipped) { + public static ResolvedMovement resolve( + Map equipped + ) { if (equipped == null || equipped.isEmpty()) { return ResolvedMovement.NONE; } @@ -70,16 +72,20 @@ public final class MovementStyleResolver { int severity = style.getSeverity(); int regionOrdinal = region.ordinal(); - if (severity > bestSeverity - || (severity == bestSeverity && regionOrdinal < bestRegionOrdinal)) { + if ( + severity > bestSeverity || + (severity == bestSeverity && + regionOrdinal < bestRegionOrdinal) + ) { bestStyle = style; MovementModifier mod = def.movementModifier(); bestSpeed = (mod != null && mod.speedMultiplier() != null) - ? mod.speedMultiplier() - : style.getDefaultSpeedMultiplier(); - bestJumpDisabled = (mod != null && mod.jumpDisabled() != null) - ? mod.jumpDisabled() - : style.isDefaultJumpDisabled(); + ? mod.speedMultiplier() + : style.getDefaultSpeedMultiplier(); + bestJumpDisabled = (mod != null && + mod.jumpDisabled() != null) + ? mod.jumpDisabled() + : style.isDefaultJumpDisabled(); bestSeverity = severity; bestRegionOrdinal = regionOrdinal; } @@ -92,8 +98,11 @@ public final class MovementStyleResolver { int severity = fallback.style.getSeverity(); int regionOrdinal = region.ordinal(); - if (severity > bestSeverity - || (severity == bestSeverity && regionOrdinal < bestRegionOrdinal)) { + if ( + severity > bestSeverity || + (severity == bestSeverity && + regionOrdinal < bestRegionOrdinal) + ) { bestStyle = fallback.style; bestSpeed = fallback.speed; bestJumpDisabled = fallback.jumpDisabled; @@ -139,10 +148,16 @@ public final class MovementStyleResolver { PoseType poseType = bindItem.getPoseType(); return switch (poseType) { - case WRAP, LATEX_SACK -> - new V1Fallback(MovementStyle.SHUFFLE, V1_IMMOBILIZED_SPEED, true); - case DOG, HUMAN_CHAIR -> - new V1Fallback(MovementStyle.CRAWL, V1_STANDARD_SPEED, true); + case WRAP, LATEX_SACK -> new V1Fallback( + MovementStyle.SHUFFLE, + V1_IMMOBILIZED_SPEED, + true + ); + case DOG, HUMAN_CHAIR -> new V1Fallback( + MovementStyle.CRAWL, + V1_STANDARD_SPEED, + true + ); default -> // STANDARD, STRAITJACKET: shuffle at V1 standard speed new V1Fallback(MovementStyle.SHUFFLE, V1_STANDARD_SPEED, true); @@ -150,5 +165,9 @@ public final class MovementStyleResolver { } /** Internal holder for V1 fallback resolution result. */ - private record V1Fallback(MovementStyle style, float speed, boolean jumpDisabled) {} + private record V1Fallback( + MovementStyle style, + float speed, + boolean jumpDisabled + ) {} } diff --git a/src/main/java/com/tiedup/remake/v2/bondage/movement/ResolvedMovement.java b/src/main/java/com/tiedup/remake/v2/bondage/movement/ResolvedMovement.java index a337cce..e17b06c 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/movement/ResolvedMovement.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/movement/ResolvedMovement.java @@ -18,7 +18,10 @@ public record ResolvedMovement( /** Final jump-disabled flag (style default or item override). */ boolean jumpDisabled ) { - /** Sentinel for "no movement style active". */ - public static final ResolvedMovement NONE = new ResolvedMovement(null, 1.0f, false); + public static final ResolvedMovement NONE = new ResolvedMovement( + null, + 1.0f, + false + ); } diff --git a/src/main/java/com/tiedup/remake/v2/bondage/network/PacketSyncV2Equipment.java b/src/main/java/com/tiedup/remake/v2/bondage/network/PacketSyncV2Equipment.java index efd8254..84d3336 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/network/PacketSyncV2Equipment.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/network/PacketSyncV2Equipment.java @@ -25,7 +25,9 @@ import org.apache.logging.log4j.Logger; */ public class PacketSyncV2Equipment { - private static final Logger LOGGER = LogManager.getLogger("PacketSyncV2Equipment"); + private static final Logger LOGGER = LogManager.getLogger( + "PacketSyncV2Equipment" + ); private final int entityId; private final CompoundTag data; @@ -45,12 +47,18 @@ public class PacketSyncV2Equipment { public static PacketSyncV2Equipment decode(FriendlyByteBuf buf) { int entityId = buf.readInt(); CompoundTag data = buf.readNbt(); - return new PacketSyncV2Equipment(entityId, data != null ? data : new CompoundTag()); + return new PacketSyncV2Equipment( + entityId, + data != null ? data : new CompoundTag() + ); } // ==================== Handler ==================== - public static void handle(PacketSyncV2Equipment msg, Supplier ctxSupplier) { + public static void handle( + PacketSyncV2Equipment msg, + Supplier ctxSupplier + ) { NetworkEvent.Context ctx = ctxSupplier.get(); ctx.enqueueWork(() -> { if (FMLEnvironment.dist == Dist.CLIENT) { @@ -74,7 +82,8 @@ public class PacketSyncV2Equipment { holder.getV2Equipment().deserializeNBT(msg.data); return; } - living.getCapability(V2BondageEquipmentProvider.V2_BONDAGE_EQUIPMENT) + living + .getCapability(V2BondageEquipmentProvider.V2_BONDAGE_EQUIPMENT) .ifPresent(equip -> equip.deserializeNBT(msg.data)); } } diff --git a/src/main/java/com/tiedup/remake/v2/bondage/network/PacketV2LockToggle.java b/src/main/java/com/tiedup/remake/v2/bondage/network/PacketV2LockToggle.java index e628258..488514a 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/network/PacketV2LockToggle.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/network/PacketV2LockToggle.java @@ -36,13 +36,20 @@ import net.minecraftforge.network.NetworkEvent; */ public class PacketV2LockToggle { - public enum Action { LOCK, UNLOCK } + public enum Action { + LOCK, + UNLOCK, + } private final int targetEntityId; private final BodyRegionV2 region; private final Action action; - public PacketV2LockToggle(int targetEntityId, BodyRegionV2 region, Action action) { + public PacketV2LockToggle( + int targetEntityId, + BodyRegionV2 region, + Action action + ) { this.targetEntityId = targetEntityId; this.region = region; this.action = action; @@ -62,7 +69,10 @@ public class PacketV2LockToggle { ); } - public static void handle(PacketV2LockToggle msg, Supplier ctxSupplier) { + public static void handle( + PacketV2LockToggle msg, + Supplier ctxSupplier + ) { NetworkEvent.Context ctx = ctxSupplier.get(); ctx.enqueueWork(() -> { ServerPlayer sender = ctx.getSender(); @@ -75,13 +85,18 @@ public class PacketV2LockToggle { } private static void handleServer( - ServerPlayer sender, int targetEntityId, BodyRegionV2 region, Action action + ServerPlayer sender, + int targetEntityId, + BodyRegionV2 region, + Action action ) { Entity rawTarget = sender.level().getEntity(targetEntityId); if (!(rawTarget instanceof LivingEntity target)) return; // Distance + line-of-sight validation - if (sender.distanceTo(target) > 4.0 || !sender.hasLineOfSight(target)) return; + if ( + sender.distanceTo(target) > 4.0 || !sender.hasLineOfSight(target) + ) return; ItemStack stack = V2EquipmentHelper.getInRegion(target, region); if (stack.isEmpty()) return; @@ -91,8 +106,9 @@ public class PacketV2LockToggle { ItemStack mainHand = sender.getItemInHand(InteractionHand.MAIN_HAND); ItemStack offHand = sender.getItemInHand(InteractionHand.OFF_HAND); - boolean hasMasterKey = mainHand.getItem() instanceof ItemMasterKey - || offHand.getItem() instanceof ItemMasterKey; + boolean hasMasterKey = + mainHand.getItem() instanceof ItemMasterKey || + offHand.getItem() instanceof ItemMasterKey; ItemKey heldKey = null; ItemStack heldKeyStack = ItemStack.EMPTY; @@ -115,8 +131,11 @@ public class PacketV2LockToggle { lockable.setLockedByKeyUUID(stack, keyUUID); lockable.initializeLockResistance(stack); - TiedUpMod.LOGGER.debug("[V2LockToggle] Locked region {} on entity {}", - region.name(), target.getName().getString()); + TiedUpMod.LOGGER.debug( + "[V2LockToggle] Locked region {} on entity {}", + region.name(), + target.getName().getString() + ); } case UNLOCK -> { if (!lockable.isLocked(stack)) return; @@ -133,8 +152,11 @@ public class PacketV2LockToggle { return; } - TiedUpMod.LOGGER.debug("[V2LockToggle] Unlocked region {} on entity {}", - region.name(), target.getName().getString()); + TiedUpMod.LOGGER.debug( + "[V2LockToggle] Unlocked region {} on entity {}", + region.name(), + target.getName().getString() + ); } } diff --git a/src/main/java/com/tiedup/remake/v2/bondage/network/PacketV2SelfEquip.java b/src/main/java/com/tiedup/remake/v2/bondage/network/PacketV2SelfEquip.java index 79f5a85..53ba618 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/network/PacketV2SelfEquip.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/network/PacketV2SelfEquip.java @@ -20,7 +20,9 @@ import org.apache.logging.log4j.Logger; */ public class PacketV2SelfEquip { - private static final Logger LOGGER = LogManager.getLogger("PacketV2SelfEquip"); + private static final Logger LOGGER = LogManager.getLogger( + "PacketV2SelfEquip" + ); private final BodyRegionV2 region; private final int inventorySlot; @@ -36,10 +38,16 @@ public class PacketV2SelfEquip { } public static PacketV2SelfEquip decode(FriendlyByteBuf buf) { - return new PacketV2SelfEquip(buf.readEnum(BodyRegionV2.class), buf.readVarInt()); + return new PacketV2SelfEquip( + buf.readEnum(BodyRegionV2.class), + buf.readVarInt() + ); } - public static void handle(PacketV2SelfEquip msg, Supplier ctxSupplier) { + public static void handle( + PacketV2SelfEquip msg, + Supplier ctxSupplier + ) { NetworkEvent.Context ctx = ctxSupplier.get(); ctx.enqueueWork(() -> { ServerPlayer player = ctx.getSender(); @@ -47,26 +55,46 @@ public class PacketV2SelfEquip { if (!PacketRateLimiter.allowPacket(player, "action")) return; // Validate slot index - if (msg.inventorySlot < 0 || msg.inventorySlot >= player.getInventory().getContainerSize()) return; + if ( + msg.inventorySlot < 0 || + msg.inventorySlot >= player.getInventory().getContainerSize() + ) return; ItemStack stack = player.getInventory().getItem(msg.inventorySlot); if (stack.isEmpty()) return; - if (!(stack.getItem() instanceof IV2BondageItem bondageItem)) return; + if ( + !(stack.getItem() instanceof IV2BondageItem bondageItem) + ) return; // Warn if data-driven item has no definition (missing JSON or reload issue) - if (bondageItem instanceof DataDrivenBondageItem && DataDrivenItemRegistry.get(stack) == null) { - LOGGER.warn("[V2SelfEquip] Data-driven item in slot {} has no definition — equip blocked. Stack NBT: {}", - msg.inventorySlot, stack.getTag()); + if ( + bondageItem instanceof DataDrivenBondageItem && + DataDrivenItemRegistry.get(stack) == null + ) { + LOGGER.warn( + "[V2SelfEquip] Data-driven item in slot {} has no definition — equip blocked. Stack NBT: {}", + msg.inventorySlot, + stack.getTag() + ); return; } // Validate item targets this region - if (!bondageItem.getOccupiedRegions(stack).contains(msg.region)) return; + if ( + !bondageItem.getOccupiedRegions(stack).contains(msg.region) + ) return; // Furniture seat blocks this region - if (player.isPassenger() && player.getVehicle() instanceof com.tiedup.remake.v2.furniture.ISeatProvider provider) { - com.tiedup.remake.v2.furniture.SeatDefinition seat = provider.getSeatForPassenger(player); - if (seat != null && seat.blockedRegions().contains(msg.region)) { + if ( + player.isPassenger() && + player.getVehicle() instanceof + com.tiedup.remake.v2.furniture.ISeatProvider provider + ) { + com.tiedup.remake.v2.furniture.SeatDefinition seat = + provider.getSeatForPassenger(player); + if ( + seat != null && seat.blockedRegions().contains(msg.region) + ) { return; // Region blocked by furniture } } @@ -80,7 +108,9 @@ public class PacketV2SelfEquip { if (result.displaced() != null) { for (ItemStack displaced : result.displaced()) { if (!displaced.isEmpty()) { - player.getInventory().placeItemBackInInventory(displaced); + player + .getInventory() + .placeItemBackInInventory(displaced); } } } diff --git a/src/main/java/com/tiedup/remake/v2/bondage/network/PacketV2SelfLock.java b/src/main/java/com/tiedup/remake/v2/bondage/network/PacketV2SelfLock.java index 8a3fe26..c59ee11 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/network/PacketV2SelfLock.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/network/PacketV2SelfLock.java @@ -31,7 +31,10 @@ public class PacketV2SelfLock { return new PacketV2SelfLock(buf.readEnum(BodyRegionV2.class)); } - public static void handle(PacketV2SelfLock msg, Supplier ctxSupplier) { + public static void handle( + PacketV2SelfLock msg, + Supplier ctxSupplier + ) { NetworkEvent.Context ctx = ctxSupplier.get(); ctx.enqueueWork(() -> { ServerPlayer player = ctx.getSender(); @@ -39,17 +42,31 @@ public class PacketV2SelfLock { if (!PacketRateLimiter.allowPacket(player, "action")) return; // Arms must be free to self-lock - if (V2EquipmentHelper.isRegionOccupied(player, BodyRegionV2.ARMS)) return; + if ( + V2EquipmentHelper.isRegionOccupied(player, BodyRegionV2.ARMS) + ) return; - ItemStack equipped = V2EquipmentHelper.getInRegion(player, msg.region); + ItemStack equipped = V2EquipmentHelper.getInRegion( + player, + msg.region + ); if (equipped.isEmpty()) return; if (!(equipped.getItem() instanceof ILockable lockable)) return; - if (!lockable.isLockable(equipped) || lockable.isLocked(equipped)) return; + if ( + !lockable.isLockable(equipped) || lockable.isLocked(equipped) + ) return; // Furniture seat blocks this region - if (player.isPassenger() && player.getVehicle() instanceof com.tiedup.remake.v2.furniture.ISeatProvider provider) { - com.tiedup.remake.v2.furniture.SeatDefinition seat = provider.getSeatForPassenger(player); - if (seat != null && seat.blockedRegions().contains(msg.region)) { + if ( + player.isPassenger() && + player.getVehicle() instanceof + com.tiedup.remake.v2.furniture.ISeatProvider provider + ) { + com.tiedup.remake.v2.furniture.SeatDefinition seat = + provider.getSeatForPassenger(player); + if ( + seat != null && seat.blockedRegions().contains(msg.region) + ) { return; // Region blocked by furniture } } diff --git a/src/main/java/com/tiedup/remake/v2/bondage/network/PacketV2SelfRemove.java b/src/main/java/com/tiedup/remake/v2/bondage/network/PacketV2SelfRemove.java index 559096a..f8bf11a 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/network/PacketV2SelfRemove.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/network/PacketV2SelfRemove.java @@ -36,7 +36,10 @@ public class PacketV2SelfRemove { return new PacketV2SelfRemove(buf.readEnum(BodyRegionV2.class)); } - public static void handle(PacketV2SelfRemove msg, Supplier ctxSupplier) { + public static void handle( + PacketV2SelfRemove msg, + Supplier ctxSupplier + ) { NetworkEvent.Context ctx = ctxSupplier.get(); ctx.enqueueWork(() -> { ServerPlayer player = ctx.getSender(); @@ -56,25 +59,33 @@ public class PacketV2SelfRemove { // Arm restraints cannot be self-removed — must use struggle if (item.getOccupiedRegions(stack).contains(BodyRegionV2.ARMS)) { - TiedUpMod.LOGGER.debug("[V2SelfRemove] Blocked: item occupies ARMS, must struggle"); + TiedUpMod.LOGGER.debug( + "[V2SelfRemove] Blocked: item occupies ARMS, must struggle" + ); return; } // Cannot manipulate buckles/clasps with bound arms if (V2EquipmentHelper.isRegionOccupied(player, BodyRegionV2.ARMS)) { - TiedUpMod.LOGGER.debug("[V2SelfRemove] Blocked: player's ARMS are occupied"); + TiedUpMod.LOGGER.debug( + "[V2SelfRemove] Blocked: player's ARMS are occupied" + ); return; } // Cannot manipulate buckles/clasps with covered hands if (V2EquipmentHelper.isRegionOccupied(player, BodyRegionV2.HANDS)) { - TiedUpMod.LOGGER.debug("[V2SelfRemove] Blocked: player's HANDS are occupied"); + TiedUpMod.LOGGER.debug( + "[V2SelfRemove] Blocked: player's HANDS are occupied" + ); return; } // Check item allows unequip (not locked) if (!item.canUnequip(stack, player)) { - TiedUpMod.LOGGER.debug("[V2SelfRemove] Blocked: item canUnequip=false (locked?)"); + TiedUpMod.LOGGER.debug( + "[V2SelfRemove] Blocked: item canUnequip=false (locked?)" + ); return; } diff --git a/src/main/java/com/tiedup/remake/v2/bondage/network/PacketV2SelfUnlock.java b/src/main/java/com/tiedup/remake/v2/bondage/network/PacketV2SelfUnlock.java index 3cdf5ce..79c5a0c 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/network/PacketV2SelfUnlock.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/network/PacketV2SelfUnlock.java @@ -32,7 +32,10 @@ public class PacketV2SelfUnlock { return new PacketV2SelfUnlock(buf.readEnum(BodyRegionV2.class)); } - public static void handle(PacketV2SelfUnlock msg, Supplier ctxSupplier) { + public static void handle( + PacketV2SelfUnlock msg, + Supplier ctxSupplier + ) { NetworkEvent.Context ctx = ctxSupplier.get(); ctx.enqueueWork(() -> { ServerPlayer player = ctx.getSender(); @@ -40,24 +43,39 @@ public class PacketV2SelfUnlock { if (!PacketRateLimiter.allowPacket(player, "action")) return; // Arms must be free to self-unlock - if (V2EquipmentHelper.isRegionOccupied(player, BodyRegionV2.ARMS)) return; + if ( + V2EquipmentHelper.isRegionOccupied(player, BodyRegionV2.ARMS) + ) return; - ItemStack equipped = V2EquipmentHelper.getInRegion(player, msg.region); + ItemStack equipped = V2EquipmentHelper.getInRegion( + player, + msg.region + ); if (equipped.isEmpty()) return; if (!(equipped.getItem() instanceof ILockable lockable)) return; if (!lockable.isLocked(equipped)) return; // Furniture seat blocks this region - if (player.isPassenger() && player.getVehicle() instanceof com.tiedup.remake.v2.furniture.ISeatProvider provider) { - com.tiedup.remake.v2.furniture.SeatDefinition seat = provider.getSeatForPassenger(player); - if (seat != null && seat.blockedRegions().contains(msg.region)) { + if ( + player.isPassenger() && + player.getVehicle() instanceof + com.tiedup.remake.v2.furniture.ISeatProvider provider + ) { + com.tiedup.remake.v2.furniture.SeatDefinition seat = + provider.getSeatForPassenger(player); + if ( + seat != null && seat.blockedRegions().contains(msg.region) + ) { return; // Region blocked by furniture } } // Find matching key in inventory UUID lockedByUUID = lockable.getLockedByKeyUUID(equipped); - ItemStack keyStack = findMatchingKeyInInventory(player, lockedByUUID); + ItemStack keyStack = findMatchingKeyInInventory( + player, + lockedByUUID + ); if (keyStack.isEmpty()) return; lockable.setLockedByKeyUUID(equipped, null); @@ -70,7 +88,10 @@ public class PacketV2SelfUnlock { * Find a key in the player's inventory that matches the lock UUID, * or a master key that unlocks anything. */ - private static ItemStack findMatchingKeyInInventory(ServerPlayer player, UUID lockedByUUID) { + private static ItemStack findMatchingKeyInInventory( + ServerPlayer player, + UUID lockedByUUID + ) { for (int i = 0; i < player.getInventory().getContainerSize(); i++) { ItemStack s = player.getInventory().getItem(i); if (s.isEmpty()) continue; @@ -78,7 +99,10 @@ public class PacketV2SelfUnlock { if (s.is(ModItems.MASTER_KEY.get())) return s; // Regular key: must match the lock UUID if (s.getItem() instanceof ItemKey key) { - if (lockedByUUID != null && lockedByUUID.equals(key.getKeyUUID(s))) { + if ( + lockedByUUID != null && + lockedByUUID.equals(key.getKeyUUID(s)) + ) { return s; } } diff --git a/src/main/java/com/tiedup/remake/v2/bondage/network/PacketV2StruggleStart.java b/src/main/java/com/tiedup/remake/v2/bondage/network/PacketV2StruggleStart.java index 8c46302..d8ca9a9 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/network/PacketV2StruggleStart.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/network/PacketV2StruggleStart.java @@ -50,7 +50,10 @@ public class PacketV2StruggleStart { return new PacketV2StruggleStart(buf.readEnum(BodyRegionV2.class)); } - public static void handle(PacketV2StruggleStart msg, Supplier ctxSupplier) { + public static void handle( + PacketV2StruggleStart msg, + Supplier ctxSupplier + ) { NetworkEvent.Context ctx = ctxSupplier.get(); ctx.enqueueWork(() -> { ServerPlayer player = ctx.getSender(); @@ -72,7 +75,9 @@ public class PacketV2StruggleStart { if (!resistanceItem.canBeStruggledOut(stack)) return; // RISK-002 fix: respect server config - if (!com.tiedup.remake.core.ModConfig.SERVER.struggleMiniGameEnabled.get()) return; + if ( + !com.tiedup.remake.core.ModConfig.SERVER.struggleMiniGameEnabled.get() + ) return; int resistance = resistanceItem.getCurrentResistance(stack, player); boolean isLocked = false; @@ -87,9 +92,13 @@ public class PacketV2StruggleStart { if (resistance <= 0) return; StruggleSessionManager manager = StruggleSessionManager.getInstance(); - ContinuousStruggleMiniGameState session = manager.startV2StruggleSession( - player, region, resistance, isLocked - ); + ContinuousStruggleMiniGameState session = + manager.startV2StruggleSession( + player, + region, + resistance, + isLocked + ); if (session != null) { ModNetwork.sendToPlayer( diff --git a/src/main/java/com/tiedup/remake/v2/client/DataDrivenIconBakedModel.java b/src/main/java/com/tiedup/remake/v2/client/DataDrivenIconBakedModel.java index 5a25262..73dd38b 100644 --- a/src/main/java/com/tiedup/remake/v2/client/DataDrivenIconBakedModel.java +++ b/src/main/java/com/tiedup/remake/v2/client/DataDrivenIconBakedModel.java @@ -34,7 +34,10 @@ public class DataDrivenIconBakedModel implements BakedModel { * @param original the original baked model to wrap (provides quads, transforms, etc.) * @param overrides the custom overrides that resolve icon models from NBT */ - public DataDrivenIconBakedModel(BakedModel original, DataDrivenIconOverrides overrides) { + public DataDrivenIconBakedModel( + BakedModel original, + DataDrivenIconOverrides overrides + ) { this.original = original; this.overrides = overrides; } @@ -58,7 +61,11 @@ public class DataDrivenIconBakedModel implements BakedModel { // ===== Delegated methods ===== @Override - public List getQuads(@Nullable BlockState state, @Nullable Direction direction, RandomSource random) { + public List getQuads( + @Nullable BlockState state, + @Nullable Direction direction, + RandomSource random + ) { return original.getQuads(state, direction, random); } diff --git a/src/main/java/com/tiedup/remake/v2/client/DataDrivenIconOverrides.java b/src/main/java/com/tiedup/remake/v2/client/DataDrivenIconOverrides.java index 22238e4..b26d812 100644 --- a/src/main/java/com/tiedup/remake/v2/client/DataDrivenIconOverrides.java +++ b/src/main/java/com/tiedup/remake/v2/client/DataDrivenIconOverrides.java @@ -7,7 +7,6 @@ import com.tiedup.remake.v2.furniture.FurniturePlacerItem; import com.tiedup.remake.v2.furniture.FurnitureRegistry; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import org.jetbrains.annotations.Nullable; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.block.model.ItemOverrides; @@ -20,6 +19,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.jetbrains.annotations.Nullable; /** * Custom {@link ItemOverrides} that switches the rendered item model based on @@ -43,7 +43,9 @@ import org.apache.logging.log4j.Logger; @OnlyIn(Dist.CLIENT) public class DataDrivenIconOverrides extends ItemOverrides { - private static final Logger LOGGER = LogManager.getLogger("DataDrivenIcons"); + private static final Logger LOGGER = LogManager.getLogger( + "DataDrivenIcons" + ); /** * Identifies which type of NBT-driven item this override handles. @@ -52,7 +54,7 @@ public class DataDrivenIconOverrides extends ItemOverrides { /** Data-driven bondage items (reads {@code tiedup_item_id} NBT). */ BONDAGE_ITEM, /** Furniture placer items (reads {@code tiedup_furniture_id} NBT). */ - FURNITURE_PLACER + FURNITURE_PLACER, } private final Mode mode; @@ -65,18 +67,21 @@ public class DataDrivenIconOverrides extends ItemOverrides { *

              Values are never null (ConcurrentHashMap forbids nulls). Missing icons * are tracked separately in {@link #knownMissing}.

              */ - private final Map iconModelCache = new ConcurrentHashMap<>(); + private final Map iconModelCache = + new ConcurrentHashMap<>(); /** * Set of icon ResourceLocations that were looked up but not found. * Prevents repeated failed lookups from hitting the model registry every frame. */ - private final Map knownMissing = new ConcurrentHashMap<>(); + private final Map knownMissing = + new ConcurrentHashMap<>(); /** * Set of icon ResourceLocations that we already logged a warning for (to avoid log spam). */ - private final Map warnedMissing = new ConcurrentHashMap<>(); + private final Map warnedMissing = + new ConcurrentHashMap<>(); public DataDrivenIconOverrides(Mode mode) { super(); @@ -130,11 +135,14 @@ public class DataDrivenIconOverrides extends ItemOverrides { switch (mode) { case BONDAGE_ITEM: { - DataDrivenItemDefinition def = DataDrivenItemRegistry.get(stack); + DataDrivenItemDefinition def = DataDrivenItemRegistry.get( + stack + ); return def != null ? def.icon() : null; } case FURNITURE_PLACER: { - String furnitureIdStr = FurniturePlacerItem.getFurnitureIdFromStack(stack); + String furnitureIdStr = + FurniturePlacerItem.getFurnitureIdFromStack(stack); if (furnitureIdStr == null) return null; FurnitureDefinition def = FurnitureRegistry.get(furnitureIdStr); return def != null ? def.icon() : null; @@ -188,7 +196,10 @@ public class DataDrivenIconOverrides extends ItemOverrides { // Strategy 3: Try as-is with "inventory" variant // e.g., "tiedup:armbinder" → ModelResourceLocation("tiedup:armbinder", "inventory") if (!path.contains("/")) { - ModelResourceLocation mrl = new ModelResourceLocation(iconRL, "inventory"); + ModelResourceLocation mrl = new ModelResourceLocation( + iconRL, + "inventory" + ); model = mc.getModelManager().getModel(mrl); if (model != missingModel) { return model; @@ -198,9 +209,14 @@ public class DataDrivenIconOverrides extends ItemOverrides { // Not found — log once if (!warnedMissing.containsKey(iconRL)) { warnedMissing.put(iconRL, Boolean.TRUE); - LOGGER.warn("[DataDrivenIcons] Icon model not found for '{}' (mode={}). " - + "Ensure a model JSON exists at assets/{}/models/{}.json or the item is registered.", - iconRL, mode, iconRL.getNamespace(), iconRL.getPath()); + LOGGER.warn( + "[DataDrivenIcons] Icon model not found for '{}' (mode={}). " + + "Ensure a model JSON exists at assets/{}/models/{}.json or the item is registered.", + iconRL, + mode, + iconRL.getNamespace(), + iconRL.getPath() + ); } return null; diff --git a/src/main/java/com/tiedup/remake/v2/client/V2ClientSetup.java b/src/main/java/com/tiedup/remake/v2/client/V2ClientSetup.java index 0c7adcd..b33c9bb 100644 --- a/src/main/java/com/tiedup/remake/v2/client/V2ClientSetup.java +++ b/src/main/java/com/tiedup/remake/v2/client/V2ClientSetup.java @@ -141,13 +141,15 @@ public class V2ClientSetup { DataDrivenIconOverrides overrides = new DataDrivenIconOverrides(mode); DataDrivenIconBakedModel wrapped = new DataDrivenIconBakedModel( - originalItemModel, overrides + originalItemModel, + overrides ); models.put(itemModelLoc, wrapped); TiedUpMod.LOGGER.info( "[V2ClientSetup] Wrapped {} model with icon overrides (mode={})", - itemName, mode + itemName, + mode ); } } diff --git a/src/main/java/com/tiedup/remake/v2/furniture/EntityFurniture.java b/src/main/java/com/tiedup/remake/v2/furniture/EntityFurniture.java index d3c6f8e..716daee 100644 --- a/src/main/java/com/tiedup/remake/v2/furniture/EntityFurniture.java +++ b/src/main/java/com/tiedup/remake/v2/furniture/EntityFurniture.java @@ -19,11 +19,13 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientGamePacketListener; -import net.minecraft.resources.ResourceLocation; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.Entity; @@ -33,8 +35,6 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Pose; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.sounds.SoundEvent; -import net.minecraft.sounds.SoundSource; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; import net.minecraftforge.entity.IEntityAdditionalSpawnData; @@ -59,25 +59,36 @@ import org.jetbrains.annotations.Nullable; * Forge to include the {@code IEntityAdditionalSpawnData} buffer in the spawn * packet. Without this override, the entity would be invisible on clients.

              */ -public class EntityFurniture extends Entity - implements ISeatProvider, IEntityAdditionalSpawnData { +public class EntityFurniture + extends Entity + implements ISeatProvider, IEntityAdditionalSpawnData +{ // ========== SynchedEntityData Accessors ========== /** The furniture definition ID (ResourceLocation string form). */ private static final EntityDataAccessor FURNITURE_ID = - SynchedEntityData.defineId(EntityFurniture.class, EntityDataSerializers.STRING); + SynchedEntityData.defineId( + EntityFurniture.class, + EntityDataSerializers.STRING + ); /** * Bitmask of locked seats. Bit N corresponds to seat index N * in {@link FurnitureDefinition#seats()}. Max 8 seats per furniture. */ private static final EntityDataAccessor SEAT_LOCK_BITS = - SynchedEntityData.defineId(EntityFurniture.class, EntityDataSerializers.BYTE); + SynchedEntityData.defineId( + EntityFurniture.class, + EntityDataSerializers.BYTE + ); /** Current animation state (idle, occupied, locking, struggle). */ private static final EntityDataAccessor ANIM_STATE = - SynchedEntityData.defineId(EntityFurniture.class, EntityDataSerializers.BYTE); + SynchedEntityData.defineId( + EntityFurniture.class, + EntityDataSerializers.BYTE + ); // ========== Animation State Constants ========== @@ -166,7 +177,10 @@ public class EntityFurniture extends Entity public EntityDimensions getDimensions(Pose pose) { FurnitureDefinition def = getDefinition(); if (def != null) { - return EntityDimensions.fixed(def.hitboxWidth(), def.hitboxHeight()); + return EntityDimensions.fixed( + def.hitboxWidth(), + def.hitboxHeight() + ); } return EntityDimensions.fixed(1.0f, 1.0f); } @@ -228,7 +242,9 @@ public class EntityFurniture extends Entity if (locked) { writeFurnitureReconnectionTag(serverPlayer, seatId); } else { - serverPlayer.getPersistentData().remove("tiedup_locked_furniture"); + serverPlayer + .getPersistentData() + .remove("tiedup_locked_furniture"); } } } @@ -258,7 +274,10 @@ public class EntityFurniture extends Entity * @param player the server player locked in this furniture * @param seatId the seat ID the player is locked in */ - private void writeFurnitureReconnectionTag(ServerPlayer player, String seatId) { + private void writeFurnitureReconnectionTag( + ServerPlayer player, + String seatId + ) { CompoundTag tag = new CompoundTag(); BlockPos pos = this.blockPosition(); tag.putInt("x", pos.getX()); @@ -311,13 +330,21 @@ public class EntityFurniture extends Entity * by spacing seats evenly along the furniture's local right axis.

              */ @Override - protected void positionRider(Entity passenger, Entity.MoveFunction moveFunction) { + protected void positionRider( + Entity passenger, + Entity.MoveFunction moveFunction + ) { if (!this.hasPassenger(passenger)) return; SeatDefinition seat = getSeatForPassenger(passenger); if (seat == null) { // Fallback: center of entity at base height - moveFunction.accept(passenger, this.getX(), this.getY(), this.getZ()); + moveFunction.accept( + passenger, + this.getX(), + this.getY(), + this.getZ() + ); return; } @@ -326,10 +353,13 @@ public class EntityFurniture extends Entity if (this.level().isClientSide) { FurnitureDefinition def = getDefinition(); if (def != null) { - double[] pos = com.tiedup.remake.v2.furniture.client.FurnitureSeatPositionHelper - .getSeatWorldPosition( - def, seat.id(), - this.getX(), this.getY(), this.getZ(), + double[] pos = + com.tiedup.remake.v2.furniture.client.FurnitureSeatPositionHelper.getSeatWorldPosition( + def, + seat.id(), + this.getX(), + this.getY(), + this.getZ(), this.getYRot() ); if (pos != null) { @@ -349,7 +379,8 @@ public class EntityFurniture extends Entity float yawRad = (float) Math.toRadians(this.getYRot()); double rightX = -Math.sin(yawRad + Math.PI / 2.0); double rightZ = Math.cos(yawRad + Math.PI / 2.0); - double offset = seatCount == 1 ? 0.0 : (seatIdx - (seatCount - 1) / 2.0); + double offset = + seatCount == 1 ? 0.0 : (seatIdx - (seatCount - 1) / 2.0); moveFunction.accept( passenger, @@ -464,7 +495,10 @@ public class EntityFurniture extends Entity * @return the best matching seat, or null if no occupied lockable seats exist */ @Nullable - private SeatDefinition findNearestOccupiedLockableSeat(Player player, FurnitureDefinition def) { + private SeatDefinition findNearestOccupiedLockableSeat( + Player player, + FurnitureDefinition def + ) { Vec3 playerPos = player.getEyePosition(); Vec3 lookDir = player.getLookAngle(); float yawRad = (float) Math.toRadians(this.getYRot()); @@ -482,7 +516,9 @@ public class EntityFurniture extends Entity SeatDefinition seat = seats.get(i); // Only consider occupied, lockable seats - if (!seat.lockable() || !seatAssignments.containsValue(seat.id())) continue; + if ( + !seat.lockable() || !seatAssignments.containsValue(seat.id()) + ) continue; double offset = seatCount == 1 ? 0.0 : (i - (seatCount - 1) / 2.0); Vec3 seatWorldPos = new Vec3( @@ -533,9 +569,20 @@ public class EntityFurniture extends Entity if (passenger instanceof ServerPlayer sp) { FurnitureDefinition def = getDefinition(); if (def != null && def.feedback().deniedSound() != null) { - sp.level().playSound(null, sp.getX(), sp.getY(), sp.getZ(), - SoundEvent.createVariableRangeEvent(def.feedback().deniedSound()), - SoundSource.PLAYERS, 0.5f, 1.0f); + sp + .level() + .playSound( + null, + sp.getX(), + sp.getY(), + sp.getZ(), + SoundEvent.createVariableRangeEvent( + def.feedback().deniedSound() + ), + SoundSource.PLAYERS, + 0.5f, + 1.0f + ); } } @@ -546,7 +593,11 @@ public class EntityFurniture extends Entity String lockedSeatId = seat.id(); Entity self = this; this.getServer().execute(() -> { - if (passenger.isAlive() && self.isAlive() && !self.isRemoved()) { + if ( + passenger.isAlive() && + self.isAlive() && + !self.isRemoved() + ) { passenger.startRiding(self, true); // Re-assign the specific seat (not just first available) assignSeat(passenger, lockedSeatId); @@ -575,7 +626,9 @@ public class EntityFurniture extends Entity if (!this.level().isClientSide) { this.entityData.set(ANIM_STATE, STATE_EXITING); this.transitionTicksLeft = 20; - this.transitionTargetState = this.getPassengers().isEmpty() ? STATE_IDLE : STATE_OCCUPIED; + this.transitionTargetState = this.getPassengers().isEmpty() + ? STATE_IDLE + : STATE_OCCUPIED; } // Client-side: immediately stop the furniture pose animation on the dismounting player. @@ -583,8 +636,9 @@ public class EntityFurniture extends Entity // The safety tick in AnimationTickHandler also catches this after a 3-tick grace period, // but stopping immediately avoids a visible animation glitch during dismount. if (this.level().isClientSide && passenger instanceof Player) { - com.tiedup.remake.client.animation.BondageAnimationManager - .stopFurniture((Player) passenger); + com.tiedup.remake.client.animation.BondageAnimationManager.stopFurniture( + (Player) passenger + ); } } @@ -598,7 +652,9 @@ public class EntityFurniture extends Entity // Don't clobber active transitions — let the tick timer handle the reset if (this.transitionTicksLeft > 0) return; - byte state = this.getPassengers().isEmpty() ? STATE_IDLE : STATE_OCCUPIED; + byte state = this.getPassengers().isEmpty() + ? STATE_IDLE + : STATE_OCCUPIED; this.entityData.set(ANIM_STATE, state); } @@ -628,11 +684,16 @@ public class EntityFurniture extends Entity // Priority 1: Force-mount a leashed captive onto an available seat. // The interacting player must be a captor with at least one leashed captive, // and the captive must wear a collar owned by this player (or player is OP). - if (player instanceof ServerPlayer serverPlayer - && this.getPassengers().size() < def.seats().size()) { - PlayerBindState ownerState = PlayerBindState.getInstance(serverPlayer); + if ( + player instanceof ServerPlayer serverPlayer && + this.getPassengers().size() < def.seats().size() + ) { + PlayerBindState ownerState = PlayerBindState.getInstance( + serverPlayer + ); if (ownerState != null) { - PlayerCaptorManager captorManager = ownerState.getCaptorManager(); + PlayerCaptorManager captorManager = + ownerState.getCaptorManager(); if (captorManager != null && captorManager.hasCaptives()) { for (IBondageState captive : captorManager.getCaptives()) { LivingEntity captiveEntity = captive.asLivingEntity(); @@ -647,11 +708,18 @@ public class EntityFurniture extends Entity // Verify collar ownership if (!captive.hasCollar()) continue; - ItemStack collarStack = captive.getEquipment(BodyRegionV2.NECK); - if (collarStack.isEmpty() - || !(collarStack.getItem() instanceof ItemCollar collar)) continue; - if (!collar.isOwner(collarStack, serverPlayer) - && !serverPlayer.hasPermissions(2)) continue; + ItemStack collarStack = captive.getEquipment( + BodyRegionV2.NECK + ); + if ( + collarStack.isEmpty() || + !(collarStack.getItem() instanceof + ItemCollar collar) + ) continue; + if ( + !collar.isOwner(collarStack, serverPlayer) && + !serverPlayer.hasPermissions(2) + ) continue; // Detach leash only (drop the lead, keep tied-up status) captive.free(false); @@ -662,10 +730,18 @@ public class EntityFurniture extends Entity // Play mount sound FurnitureFeedback feedback = def.feedback(); if (feedback.mountSound() != null) { - this.level().playSound(null, - this.getX(), this.getY(), this.getZ(), - SoundEvent.createVariableRangeEvent(feedback.mountSound()), - SoundSource.BLOCKS, 1.0f, 1.0f); + this.level().playSound( + null, + this.getX(), + this.getY(), + this.getZ(), + SoundEvent.createVariableRangeEvent( + feedback.mountSound() + ), + SoundSource.BLOCKS, + 1.0f, + 1.0f + ); } // Broadcast updated state to tracking clients @@ -688,7 +764,10 @@ public class EntityFurniture extends Entity // Use look direction to pick the nearest occupied, lockable seat. ItemStack heldItem = player.getItemInHand(hand); if (isKeyItem(heldItem) && !this.getPassengers().isEmpty()) { - SeatDefinition targetSeat = findNearestOccupiedLockableSeat(player, def); + SeatDefinition targetSeat = findNearestOccupiedLockableSeat( + player, + def + ); if (targetSeat != null) { boolean wasLocked = isSeatLocked(targetSeat.id()); setSeatLocked(targetSeat.id(), !wasLocked); @@ -699,15 +778,24 @@ public class EntityFurniture extends Entity ? feedback.unlockSound() : feedback.lockSound(); if (soundRL != null) { - this.level().playSound(null, this.getX(), this.getY(), this.getZ(), + this.level().playSound( + null, + this.getX(), + this.getY(), + this.getZ(), SoundEvent.createVariableRangeEvent(soundRL), - SoundSource.BLOCKS, 1.0f, 1.0f); + SoundSource.BLOCKS, + 1.0f, + 1.0f + ); } // Set lock/unlock animation with transition timer boolean nowLocked = !wasLocked; - this.entityData.set(ANIM_STATE, - nowLocked ? STATE_LOCKING : STATE_UNLOCKING); + this.entityData.set( + ANIM_STATE, + nowLocked ? STATE_LOCKING : STATE_UNLOCKING + ); this.transitionTicksLeft = 20; this.transitionTargetState = STATE_OCCUPIED; @@ -723,7 +811,10 @@ public class EntityFurniture extends Entity } // Priority 3: Empty hand + available seat -> self mount - if (heldItem.isEmpty() && this.getPassengers().size() < def.seats().size()) { + if ( + heldItem.isEmpty() && + this.getPassengers().size() < def.seats().size() + ) { player.startRiding(this); return InteractionResult.CONSUME; } @@ -731,9 +822,16 @@ public class EntityFurniture extends Entity // No valid action — play denied sound if configured FurnitureFeedback feedback = def.feedback(); if (feedback != null && feedback.deniedSound() != null) { - this.level().playSound(null, this.getX(), this.getY(), this.getZ(), + this.level().playSound( + null, + this.getX(), + this.getY(), + this.getZ(), SoundEvent.createVariableRangeEvent(feedback.deniedSound()), - SoundSource.BLOCKS, 0.5f, 1.0f); + SoundSource.BLOCKS, + 0.5f, + 1.0f + ); } return InteractionResult.PASS; @@ -775,10 +873,22 @@ public class EntityFurniture extends Entity // Creative mode bypasses this check (handled above with instant discard). if (!this.getPassengers().isEmpty()) { FurnitureDefinition occupiedDef = getDefinition(); - if (occupiedDef != null && occupiedDef.feedback().deniedSound() != null) { - this.level().playSound(null, this.getX(), this.getY(), this.getZ(), - SoundEvent.createVariableRangeEvent(occupiedDef.feedback().deniedSound()), - SoundSource.BLOCKS, 0.5f, 1.0f); + if ( + occupiedDef != null && + occupiedDef.feedback().deniedSound() != null + ) { + this.level().playSound( + null, + this.getX(), + this.getY(), + this.getZ(), + SoundEvent.createVariableRangeEvent( + occupiedDef.feedback().deniedSound() + ), + SoundSource.BLOCKS, + 0.5f, + 1.0f + ); } return true; // Consume the attack but accumulate no damage } @@ -790,7 +900,9 @@ public class EntityFurniture extends Entity if (this.currentDamage >= resistance) { this.ejectPassengers(); if (def != null && def.dropOnBreak()) { - ItemStack dropStack = FurniturePlacerItem.createStack(def.id()); + ItemStack dropStack = FurniturePlacerItem.createStack( + def.id() + ); if (!dropStack.isEmpty()) { this.spawnAtLocation(dropStack); } @@ -850,9 +962,9 @@ public class EntityFurniture extends Entity passengerUuids.add(passenger.getUUID()); } - boolean removed = seatAssignments.keySet().removeIf( - uuid -> !passengerUuids.contains(uuid) - ); + boolean removed = seatAssignments + .keySet() + .removeIf(uuid -> !passengerUuids.contains(uuid)); if (removed) { TiedUpMod.LOGGER.debug( @@ -888,7 +1000,8 @@ public class EntityFurniture extends Entity @Override protected void readAdditionalSaveData(CompoundTag tag) { - if (tag.contains(FurnitureRegistry.NBT_FURNITURE_ID, 8)) { // 8 = TAG_String + if (tag.contains(FurnitureRegistry.NBT_FURNITURE_ID, 8)) { + // 8 = TAG_String setFurnitureId(tag.getString(FurnitureRegistry.NBT_FURNITURE_ID)); } if (tag.contains("facing")) { @@ -909,7 +1022,8 @@ public class EntityFurniture extends Entity // Restore seat assignments seatAssignments.clear(); - if (tag.contains("seat_assignments", 10)) { // 10 = TAG_Compound + if (tag.contains("seat_assignments", 10)) { + // 10 = TAG_Compound CompoundTag assignments = tag.getCompound("seat_assignments"); for (String key : assignments.getAllKeys()) { try { diff --git a/src/main/java/com/tiedup/remake/v2/furniture/FurnitureFeedback.java b/src/main/java/com/tiedup/remake/v2/furniture/FurnitureFeedback.java index 01daad3..28d4ef8 100644 --- a/src/main/java/com/tiedup/remake/v2/furniture/FurnitureFeedback.java +++ b/src/main/java/com/tiedup/remake/v2/furniture/FurnitureFeedback.java @@ -31,6 +31,11 @@ public record FurnitureFeedback( ) { /** Empty feedback -- all sounds null (use defaults). */ public static final FurnitureFeedback EMPTY = new FurnitureFeedback( - null, null, null, null, null, null + null, + null, + null, + null, + null, + null ); } diff --git a/src/main/java/com/tiedup/remake/v2/furniture/FurnitureParser.java b/src/main/java/com/tiedup/remake/v2/furniture/FurnitureParser.java index e5dc3a7..d761ddd 100644 --- a/src/main/java/com/tiedup/remake/v2/furniture/FurnitureParser.java +++ b/src/main/java/com/tiedup/remake/v2/furniture/FurnitureParser.java @@ -32,11 +32,15 @@ import org.jetbrains.annotations.Nullable; */ public final class FurnitureParser { - private static final Logger LOGGER = LogManager.getLogger("TiedUpFurniture"); + private static final Logger LOGGER = LogManager.getLogger( + "TiedUpFurniture" + ); private static final String TAG = "[FurnitureParser]"; /** Strict hex color pattern: # followed by exactly 6 hex digits. */ - private static final Pattern HEX_COLOR = Pattern.compile("^#[0-9A-Fa-f]{6}$"); + private static final Pattern HEX_COLOR = Pattern.compile( + "^#[0-9A-Fa-f]{6}$" + ); /** Maximum number of seats per furniture (bitmask limit: 8 bits). */ private static final int MAX_SEATS = 8; @@ -51,7 +55,10 @@ public final class FurnitureParser { * @return the parsed definition, or null if the file is invalid */ @Nullable - public static FurnitureDefinition parse(InputStream input, ResourceLocation fileId) { + public static FurnitureDefinition parse( + InputStream input, + ResourceLocation fileId + ) { try { JsonObject root = JsonParser.parseReader( new InputStreamReader(input, StandardCharsets.UTF_8) @@ -59,7 +66,12 @@ public final class FurnitureParser { return parseObject(root, fileId); } catch (Exception e) { - LOGGER.error("{} Failed to parse JSON {}: {}", TAG, fileId, e.getMessage()); + LOGGER.error( + "{} Failed to parse JSON {}: {}", + TAG, + fileId, + e.getMessage() + ); return null; } } @@ -72,7 +84,10 @@ public final class FurnitureParser { * @return the parsed definition, or null if validation fails */ @Nullable - public static FurnitureDefinition parseObject(JsonObject root, ResourceLocation fileId) { + public static FurnitureDefinition parseObject( + JsonObject root, + ResourceLocation fileId + ) { // --- Required: id --- String idStr = getStringOrNull(root, "id"); if (idStr == null || idStr.isEmpty()) { @@ -81,7 +96,12 @@ public final class FurnitureParser { } ResourceLocation id = ResourceLocation.tryParse(idStr); if (id == null) { - LOGGER.error("{} Skipping {}: invalid id ResourceLocation '{}'", TAG, fileId, idStr); + LOGGER.error( + "{} Skipping {}: invalid id ResourceLocation '{}'", + TAG, + fileId, + idStr + ); return null; } @@ -103,7 +123,12 @@ public final class FurnitureParser { } ResourceLocation modelLocation = ResourceLocation.tryParse(modelStr); if (modelLocation == null) { - LOGGER.error("{} Skipping {}: invalid model ResourceLocation '{}'", TAG, fileId, modelStr); + LOGGER.error( + "{} Skipping {}: invalid model ResourceLocation '{}'", + TAG, + fileId, + modelStr + ); return null; } @@ -115,15 +140,27 @@ public final class FurnitureParser { } // --- Optional: supports_color (default false) --- - boolean supportsColor = getBooleanOrDefault(root, "supports_color", false); + boolean supportsColor = getBooleanOrDefault( + root, + "supports_color", + false + ); // --- Optional: hitbox (defaults: 1.0 x 1.0, clamped [0.1, 5.0]) --- float hitboxWidth = 1.0f; float hitboxHeight = 1.0f; if (root.has("hitbox") && root.get("hitbox").isJsonObject()) { JsonObject hitbox = root.getAsJsonObject("hitbox"); - hitboxWidth = clamp(getFloatOrDefault(hitbox, "width", 1.0f), 0.1f, 5.0f); - hitboxHeight = clamp(getFloatOrDefault(hitbox, "height", 1.0f), 0.1f, 5.0f); + hitboxWidth = clamp( + getFloatOrDefault(hitbox, "width", 1.0f), + 0.1f, + 5.0f + ); + hitboxHeight = clamp( + getFloatOrDefault(hitbox, "height", 1.0f), + 0.1f, + 5.0f + ); } // --- Optional: placement --- @@ -139,14 +176,22 @@ public final class FurnitureParser { boolean lockable = getBooleanOrDefault(root, "lockable", false); // --- Optional: break_resistance (default 100, clamped [1, 10000]) --- - float breakResistance = clamp(getFloatOrDefault(root, "break_resistance", 100.0f), 1.0f, 10000.0f); + float breakResistance = clamp( + getFloatOrDefault(root, "break_resistance", 100.0f), + 1.0f, + 10000.0f + ); // --- Optional: drop_on_break (default true) --- boolean dropOnBreak = getBooleanOrDefault(root, "drop_on_break", true); // --- Required: seats (non-empty array, size [1, 8]) --- if (!root.has("seats") || !root.get("seats").isJsonArray()) { - LOGGER.error("{} Skipping {}: missing or invalid 'seats' array", TAG, fileId); + LOGGER.error( + "{} Skipping {}: missing or invalid 'seats' array", + TAG, + fileId + ); return null; } JsonArray seatsArray = root.getAsJsonArray("seats"); @@ -155,18 +200,33 @@ public final class FurnitureParser { return null; } if (seatsArray.size() > MAX_SEATS) { - LOGGER.error("{} Skipping {}: 'seats' array has {} entries (max {})", - TAG, fileId, seatsArray.size(), MAX_SEATS); + LOGGER.error( + "{} Skipping {}: 'seats' array has {} entries (max {})", + TAG, + fileId, + seatsArray.size(), + MAX_SEATS + ); return null; } List seats = new ArrayList<>(seatsArray.size()); for (int i = 0; i < seatsArray.size(); i++) { if (!seatsArray.get(i).isJsonObject()) { - LOGGER.error("{} Skipping {}: seats[{}] is not a JSON object", TAG, fileId, i); + LOGGER.error( + "{} Skipping {}: seats[{}] is not a JSON object", + TAG, + fileId, + i + ); return null; } - SeatDefinition seat = parseSeat(seatsArray.get(i).getAsJsonObject(), i, lockable, fileId); + SeatDefinition seat = parseSeat( + seatsArray.get(i).getAsJsonObject(), + i, + lockable, + fileId + ); if (seat == null) { // parseSeat already logged the error return null; @@ -184,15 +244,30 @@ public final class FurnitureParser { String category = getStringOrDefault(root, "category", "furniture"); // --- Optional: icon (item model ResourceLocation for inventory sprite) --- - ResourceLocation icon = parseOptionalResourceLocation(root, "icon", fileId); + ResourceLocation icon = parseOptionalResourceLocation( + root, + "icon", + fileId + ); return new FurnitureDefinition( - id, displayName, translationKey, modelLocation, - tintChannels, supportsColor, - hitboxWidth, hitboxHeight, - snapToWall, floorOnly, - lockable, breakResistance, dropOnBreak, - seats, feedback, category, icon + id, + displayName, + translationKey, + modelLocation, + tintChannels, + supportsColor, + hitboxWidth, + hitboxHeight, + snapToWall, + floorOnly, + lockable, + breakResistance, + dropOnBreak, + seats, + feedback, + category, + icon ); } @@ -208,47 +283,85 @@ public final class FurnitureParser { * @return the parsed seat, or null on validation failure */ @Nullable - private static SeatDefinition parseSeat(JsonObject obj, int index, - boolean parentLockable, - ResourceLocation fileId) { + private static SeatDefinition parseSeat( + JsonObject obj, + int index, + boolean parentLockable, + ResourceLocation fileId + ) { // Required: id (must not contain ':') String seatId = getStringOrNull(obj, "id"); if (seatId == null || seatId.isEmpty()) { - LOGGER.error("{} Skipping {}: seats[{}] missing 'id'", TAG, fileId, index); + LOGGER.error( + "{} Skipping {}: seats[{}] missing 'id'", + TAG, + fileId, + index + ); return null; } if (seatId.contains(":")) { - LOGGER.error("{} Skipping {}: seats[{}] id '{}' must not contain ':'", - TAG, fileId, index, seatId); + LOGGER.error( + "{} Skipping {}: seats[{}] id '{}' must not contain ':'", + TAG, + fileId, + index, + seatId + ); return null; } // Required: armature String armature = getStringOrNull(obj, "armature"); if (armature == null || armature.isEmpty()) { - LOGGER.error("{} Skipping {}: seats[{}] missing 'armature'", TAG, fileId, index); + LOGGER.error( + "{} Skipping {}: seats[{}] missing 'armature'", + TAG, + fileId, + index + ); return null; } // Optional: blocked_regions (unknown region = fatal for entire furniture) - Set blockedRegions = parseBlockedRegions(obj, index, fileId); + Set blockedRegions = parseBlockedRegions( + obj, + index, + fileId + ); if (blockedRegions == null) { // parseBlockedRegions returns null ONLY on unknown region name (fatal) return null; } // Optional: lockable (inherits from top-level) - boolean seatLockable = getBooleanOrDefault(obj, "lockable", parentLockable); + boolean seatLockable = getBooleanOrDefault( + obj, + "lockable", + parentLockable + ); // Optional: locked_difficulty (clamped [1, 10000], default 1) - int lockedDifficulty = clampInt(getIntOrDefault(obj, "locked_difficulty", 1), 1, 10000); + int lockedDifficulty = clampInt( + getIntOrDefault(obj, "locked_difficulty", 1), + 1, + 10000 + ); // Optional: item_difficulty_bonus (default false) - boolean itemDifficultyBonus = getBooleanOrDefault(obj, "item_difficulty_bonus", false); + boolean itemDifficultyBonus = getBooleanOrDefault( + obj, + "item_difficulty_bonus", + false + ); return new SeatDefinition( - seatId, armature, blockedRegions, - seatLockable, lockedDifficulty, itemDifficultyBonus + seatId, + armature, + blockedRegions, + seatLockable, + lockedDifficulty, + itemDifficultyBonus ); } @@ -257,15 +370,25 @@ public final class FurnitureParser { * Returns null (fatal) if any region name is unknown. */ @Nullable - private static Set parseBlockedRegions(JsonObject obj, int seatIndex, - ResourceLocation fileId) { - if (!obj.has("blocked_regions") || !obj.get("blocked_regions").isJsonArray()) { - return Collections.unmodifiableSet(EnumSet.noneOf(BodyRegionV2.class)); + private static Set parseBlockedRegions( + JsonObject obj, + int seatIndex, + ResourceLocation fileId + ) { + if ( + !obj.has("blocked_regions") || + !obj.get("blocked_regions").isJsonArray() + ) { + return Collections.unmodifiableSet( + EnumSet.noneOf(BodyRegionV2.class) + ); } JsonArray arr = obj.getAsJsonArray("blocked_regions"); if (arr.isEmpty()) { - return Collections.unmodifiableSet(EnumSet.noneOf(BodyRegionV2.class)); + return Collections.unmodifiableSet( + EnumSet.noneOf(BodyRegionV2.class) + ); } EnumSet regions = EnumSet.noneOf(BodyRegionV2.class); @@ -274,15 +397,25 @@ public final class FurnitureParser { try { name = elem.getAsString().toUpperCase(); } catch (Exception e) { - LOGGER.error("{} Skipping {}: seats[{}] invalid element in 'blocked_regions': {}", - TAG, fileId, seatIndex, e.getMessage()); + LOGGER.error( + "{} Skipping {}: seats[{}] invalid element in 'blocked_regions': {}", + TAG, + fileId, + seatIndex, + e.getMessage() + ); return null; } BodyRegionV2 region = BodyRegionV2.fromName(name); if (region == null) { - LOGGER.error("{} Skipping {}: seats[{}] unknown body region '{}'", - TAG, fileId, seatIndex, name); + LOGGER.error( + "{} Skipping {}: seats[{}] unknown body region '{}'", + TAG, + fileId, + seatIndex, + name + ); return null; } regions.add(region); @@ -293,7 +426,10 @@ public final class FurnitureParser { // ===== Feedback Parsing ===== - private static FurnitureFeedback parseFeedback(JsonObject obj, ResourceLocation fileId) { + private static FurnitureFeedback parseFeedback( + JsonObject obj, + ResourceLocation fileId + ) { return new FurnitureFeedback( parseOptionalResourceLocation(obj, "mount_sound", fileId), parseOptionalResourceLocation(obj, "lock_sound", fileId), @@ -311,8 +447,14 @@ public final class FurnitureParser { * Returns empty map if field is absent. Returns null if any value is invalid hex. */ @Nullable - private static Map parseTintChannels(JsonObject root, ResourceLocation fileId) { - if (!root.has("tint_channels") || !root.get("tint_channels").isJsonObject()) { + private static Map parseTintChannels( + JsonObject root, + ResourceLocation fileId + ) { + if ( + !root.has("tint_channels") || + !root.get("tint_channels").isJsonObject() + ) { return Map.of(); } @@ -324,15 +466,24 @@ public final class FurnitureParser { try { hex = entry.getValue().getAsString(); } catch (Exception e) { - LOGGER.error("{} Skipping {}: tint_channels '{}' value is not a string", - TAG, fileId, entry.getKey()); + LOGGER.error( + "{} Skipping {}: tint_channels '{}' value is not a string", + TAG, + fileId, + entry.getKey() + ); return null; } if (!HEX_COLOR.matcher(hex).matches()) { - LOGGER.error("{} Skipping {}: tint_channels '{}' has invalid hex color '{}' " - + "(expected '#' followed by 6 hex digits)", - TAG, fileId, entry.getKey(), hex); + LOGGER.error( + "{} Skipping {}: tint_channels '{}' has invalid hex color '{}' " + + "(expected '#' followed by 6 hex digits)", + TAG, + fileId, + entry.getKey(), + hex + ); return null; } @@ -355,12 +506,20 @@ public final class FurnitureParser { } } - private static String getStringOrDefault(JsonObject obj, String key, String defaultValue) { + private static String getStringOrDefault( + JsonObject obj, + String key, + String defaultValue + ) { String value = getStringOrNull(obj, key); return (value != null && !value.isEmpty()) ? value : defaultValue; } - private static int getIntOrDefault(JsonObject obj, String key, int defaultValue) { + private static int getIntOrDefault( + JsonObject obj, + String key, + int defaultValue + ) { if (!obj.has(key) || obj.get(key).isJsonNull()) return defaultValue; try { return obj.get(key).getAsInt(); @@ -369,7 +528,11 @@ public final class FurnitureParser { } } - private static float getFloatOrDefault(JsonObject obj, String key, float defaultValue) { + private static float getFloatOrDefault( + JsonObject obj, + String key, + float defaultValue + ) { if (!obj.has(key) || obj.get(key).isJsonNull()) return defaultValue; try { return obj.get(key).getAsFloat(); @@ -378,7 +541,11 @@ public final class FurnitureParser { } } - private static boolean getBooleanOrDefault(JsonObject obj, String key, boolean defaultValue) { + private static boolean getBooleanOrDefault( + JsonObject obj, + String key, + boolean defaultValue + ) { if (!obj.has(key) || obj.get(key).isJsonNull()) return defaultValue; try { return obj.get(key).getAsBoolean(); @@ -389,13 +556,21 @@ public final class FurnitureParser { @Nullable private static ResourceLocation parseOptionalResourceLocation( - JsonObject obj, String key, ResourceLocation fileId + JsonObject obj, + String key, + ResourceLocation fileId ) { String value = getStringOrNull(obj, key); if (value == null || value.isEmpty()) return null; ResourceLocation loc = ResourceLocation.tryParse(value); if (loc == null) { - LOGGER.warn("{} In {}: invalid ResourceLocation for '{}': '{}'", TAG, fileId, key, value); + LOGGER.warn( + "{} In {}: invalid ResourceLocation for '{}': '{}'", + TAG, + fileId, + key, + value + ); } return loc; } diff --git a/src/main/java/com/tiedup/remake/v2/furniture/FurniturePlacerItem.java b/src/main/java/com/tiedup/remake/v2/furniture/FurniturePlacerItem.java index 0e9113c..bf5e33f 100644 --- a/src/main/java/com/tiedup/remake/v2/furniture/FurniturePlacerItem.java +++ b/src/main/java/com/tiedup/remake/v2/furniture/FurniturePlacerItem.java @@ -86,7 +86,8 @@ public class FurniturePlacerItem extends Item { // Spawn the furniture entity EntityFurniture furniture = new EntityFurniture( - ModEntities.FURNITURE.get(), level + ModEntities.FURNITURE.get(), + level ); furniture.setFurnitureId(furnitureIdStr); furniture.moveTo(spawnPos.x, spawnPos.y, spawnPos.z); @@ -101,10 +102,19 @@ public class FurniturePlacerItem extends Item { // Snap to wall: if enabled, check 4 cardinal directions for an adjacent wall // and rotate the furniture to face it (back against wall), overriding player yaw. if (def.snapToWall()) { - Direction[] directions = {Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST}; + Direction[] directions = { + Direction.NORTH, + Direction.SOUTH, + Direction.EAST, + Direction.WEST, + }; for (Direction dir : directions) { BlockPos wallPos = spawnBlockPos.relative(dir); - if (level.getBlockState(wallPos).isFaceSturdy(level, wallPos, dir.getOpposite())) { + if ( + level + .getBlockState(wallPos) + .isFaceSturdy(level, wallPos, dir.getOpposite()) + ) { yaw = dir.toYRot(); break; } @@ -155,9 +165,12 @@ public class FurniturePlacerItem extends Item { public static ItemStack createStack(ResourceLocation furnitureId) { if (V2BondageItems.FURNITURE_PLACER == null) return ItemStack.EMPTY; ItemStack stack = new ItemStack(V2BondageItems.FURNITURE_PLACER.get()); - stack.getOrCreateTag().putString( - FurnitureRegistry.NBT_FURNITURE_ID, furnitureId.toString() - ); + stack + .getOrCreateTag() + .putString( + FurnitureRegistry.NBT_FURNITURE_ID, + furnitureId.toString() + ); return stack; } @@ -173,8 +186,12 @@ public class FurniturePlacerItem extends Item { public static String getFurnitureIdFromStack(ItemStack stack) { if (stack.isEmpty() || !stack.hasTag()) return null; // noinspection DataFlowIssue -- hasTag() guarantees non-null - if (!stack.getTag().contains(FurnitureRegistry.NBT_FURNITURE_ID, 8)) return null; - String id = stack.getTag().getString(FurnitureRegistry.NBT_FURNITURE_ID); + if ( + !stack.getTag().contains(FurnitureRegistry.NBT_FURNITURE_ID, 8) + ) return null; + String id = stack + .getTag() + .getString(FurnitureRegistry.NBT_FURNITURE_ID); return id.isEmpty() ? null : id; } } diff --git a/src/main/java/com/tiedup/remake/v2/furniture/FurnitureRegistry.java b/src/main/java/com/tiedup/remake/v2/furniture/FurnitureRegistry.java index 80ea795..98212b2 100644 --- a/src/main/java/com/tiedup/remake/v2/furniture/FurnitureRegistry.java +++ b/src/main/java/com/tiedup/remake/v2/furniture/FurnitureRegistry.java @@ -30,7 +30,10 @@ public final class FurnitureRegistry { * Volatile reference to an unmodifiable map. {@link #reload} builds a new map * and swaps atomically; consumer threads always see a consistent snapshot. */ - private static volatile Map DEFINITIONS = Map.of(); + private static volatile Map< + ResourceLocation, + FurnitureDefinition + > DEFINITIONS = Map.of(); private FurnitureRegistry() {} @@ -41,7 +44,9 @@ public final class FurnitureRegistry { * * @param newDefs the new definitions map (will be defensively copied) */ - public static void reload(Map newDefs) { + public static void reload( + Map newDefs + ) { DEFINITIONS = Collections.unmodifiableMap(new HashMap<>(newDefs)); } diff --git a/src/main/java/com/tiedup/remake/v2/furniture/FurnitureServerReloadListener.java b/src/main/java/com/tiedup/remake/v2/furniture/FurnitureServerReloadListener.java index b3eabc3..e73131f 100644 --- a/src/main/java/com/tiedup/remake/v2/furniture/FurnitureServerReloadListener.java +++ b/src/main/java/com/tiedup/remake/v2/furniture/FurnitureServerReloadListener.java @@ -22,30 +22,45 @@ import org.apache.logging.log4j.Logger; *

              Registered via {@link net.minecraftforge.event.AddReloadListenerEvent} in * {@link com.tiedup.remake.core.TiedUpMod.ForgeEvents}.

              */ -public class FurnitureServerReloadListener extends SimplePreparableReloadListener { +public class FurnitureServerReloadListener + extends SimplePreparableReloadListener +{ - private static final Logger LOGGER = LogManager.getLogger("TiedUpFurniture"); + private static final Logger LOGGER = LogManager.getLogger( + "TiedUpFurniture" + ); /** Resource directory containing furniture definition JSON files (under data/). */ private static final String DIRECTORY = "tiedup_furniture"; @Override - protected Void prepare(ResourceManager resourceManager, ProfilerFiller profiler) { + protected Void prepare( + ResourceManager resourceManager, + ProfilerFiller profiler + ) { // No preparation needed -- parsing happens in apply phase return null; } @Override - protected void apply(Void nothing, ResourceManager resourceManager, ProfilerFiller profiler) { + protected void apply( + Void nothing, + ResourceManager resourceManager, + ProfilerFiller profiler + ) { Map newDefs = new HashMap<>(); - Map resources = resourceManager.listResources( - DIRECTORY, loc -> loc.getPath().endsWith(".json") - ); + Map resources = + resourceManager.listResources(DIRECTORY, loc -> + loc.getPath().endsWith(".json") + ); int skipped = 0; - for (Map.Entry entry : resources.entrySet()) { + for (Map.Entry< + ResourceLocation, + Resource + > entry : resources.entrySet()) { ResourceLocation fileId = entry.getKey(); Resource resource = entry.getValue(); @@ -55,17 +70,28 @@ public class FurnitureServerReloadListener extends SimplePreparableReloadListene if (def != null) { // Check for duplicate IDs if (newDefs.containsKey(def.id())) { - LOGGER.warn("[TiedUpFurniture] Server: Duplicate furniture ID '{}' from file '{}' -- overwriting previous definition", - def.id(), fileId); + LOGGER.warn( + "[TiedUpFurniture] Server: Duplicate furniture ID '{}' from file '{}' -- overwriting previous definition", + def.id(), + fileId + ); } newDefs.put(def.id(), def); - LOGGER.debug("[TiedUpFurniture] Server loaded: {} -> '{}'", def.id(), def.displayName()); + LOGGER.debug( + "[TiedUpFurniture] Server loaded: {} -> '{}'", + def.id(), + def.displayName() + ); } else { skipped++; } } catch (Exception e) { - LOGGER.error("[TiedUpFurniture] Server: Failed to read resource {}: {}", fileId, e.getMessage()); + LOGGER.error( + "[TiedUpFurniture] Server: Failed to read resource {}: {}", + fileId, + e.getMessage() + ); skipped++; } } @@ -77,12 +103,20 @@ public class FurnitureServerReloadListener extends SimplePreparableReloadListene net.minecraft.server.MinecraftServer server = net.minecraftforge.server.ServerLifecycleHooks.getCurrentServer(); if (server != null) { - for (net.minecraft.server.level.ServerPlayer p : server.getPlayerList().getPlayers()) { - com.tiedup.remake.v2.furniture.network.PacketSyncFurnitureDefinitions.sendToPlayer(p); + for (net.minecraft.server.level.ServerPlayer p : server + .getPlayerList() + .getPlayers()) { + com.tiedup.remake.v2.furniture.network.PacketSyncFurnitureDefinitions.sendToPlayer( + p + ); } } - LOGGER.info("[TiedUpFurniture] Server loaded {} furniture definitions ({} skipped) from {} JSON files", - newDefs.size(), skipped, resources.size()); + LOGGER.info( + "[TiedUpFurniture] Server loaded {} furniture definitions ({} skipped) from {} JSON files", + newDefs.size(), + skipped, + resources.size() + ); } } diff --git a/src/main/java/com/tiedup/remake/v2/furniture/ISeatProvider.java b/src/main/java/com/tiedup/remake/v2/furniture/ISeatProvider.java index f82c3ea..6637564 100644 --- a/src/main/java/com/tiedup/remake/v2/furniture/ISeatProvider.java +++ b/src/main/java/com/tiedup/remake/v2/furniture/ISeatProvider.java @@ -14,7 +14,6 @@ import org.jetbrains.annotations.Nullable; * never EntityFurniture directly.

              */ public interface ISeatProvider { - /** All seat definitions for this entity. */ List getSeats(); diff --git a/src/main/java/com/tiedup/remake/v2/furniture/client/FurnitureAnimationContext.java b/src/main/java/com/tiedup/remake/v2/furniture/client/FurnitureAnimationContext.java index ebf5359..96705c2 100644 --- a/src/main/java/com/tiedup/remake/v2/furniture/client/FurnitureAnimationContext.java +++ b/src/main/java/com/tiedup/remake/v2/furniture/client/FurnitureAnimationContext.java @@ -7,11 +7,11 @@ import com.tiedup.remake.v2.BodyRegionV2; import dev.kosmx.playerAnim.core.data.KeyframeAnimation; import java.util.HashSet; import java.util.Set; -import org.jetbrains.annotations.Nullable; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.jetbrains.annotations.Nullable; /** * Builds a {@link KeyframeAnimation} for a player seated on furniture. @@ -43,7 +43,9 @@ import org.apache.logging.log4j.Logger; @OnlyIn(Dist.CLIENT) public final class FurnitureAnimationContext { - private static final Logger LOGGER = LogManager.getLogger("FurnitureAnimation"); + private static final Logger LOGGER = LogManager.getLogger( + "FurnitureAnimation" + ); private FurnitureAnimationContext() {} @@ -61,24 +63,30 @@ public final class FurnitureAnimationContext { */ @Nullable public static KeyframeAnimation create( - GltfData.AnimationClip seatClip, - @Nullable GltfData seatSkeleton, - Set blockedRegions) { - + GltfData.AnimationClip seatClip, + @Nullable GltfData seatSkeleton, + Set blockedRegions + ) { if (seatClip == null) { - LOGGER.warn("[FurnitureAnim] Cannot create animation: seatClip is null"); + LOGGER.warn( + "[FurnitureAnim] Cannot create animation: seatClip is null" + ); return null; } if (seatSkeleton == null) { // V1: skeleton parsing not yet implemented. Furniture animation requires // rest pose data for glTF-to-PlayerAnimator conversion. - LOGGER.debug("[FurnitureAnim] Seat skeleton unavailable (V1), skipping animation"); + LOGGER.debug( + "[FurnitureAnim] Seat skeleton unavailable (V1), skipping animation" + ); return null; } if (blockedRegions == null || blockedRegions.isEmpty()) { - LOGGER.debug("[FurnitureAnim] No blocked regions, skipping animation"); + LOGGER.debug( + "[FurnitureAnim] No blocked regions, skipping animation" + ); return null; } @@ -87,9 +95,15 @@ public final class FurnitureAnimationContext { KeyframeAnimation fullAnim; try { fullAnim = GltfPoseConverter.convertWithSkeleton( - seatSkeleton, seatClip, "furniture_seat"); + seatSkeleton, + seatClip, + "furniture_seat" + ); } catch (Exception e) { - LOGGER.error("[FurnitureAnim] Failed to convert seat animation clip", e); + LOGGER.error( + "[FurnitureAnim] Failed to convert seat animation clip", + e + ); return null; } @@ -101,7 +115,10 @@ public final class FurnitureAnimationContext { if (blockedParts.isEmpty()) { // Blocked regions don't map to any animation bones (e.g., only NECK/FINGERS/TAIL/WINGS) - LOGGER.debug("[FurnitureAnim] Blocked regions {} map to zero bones, skipping", blockedRegions); + LOGGER.debug( + "[FurnitureAnim] Blocked regions {} map to zero bones, skipping", + blockedRegions + ); return null; } @@ -119,8 +136,12 @@ public final class FurnitureAnimationContext { disableParts(builder, disabledParts); KeyframeAnimation result = builder.build(); - LOGGER.debug("[FurnitureAnim] Created animation: blocked={}, enabled={}, disabled={}", - blockedRegions, blockedParts, disabledParts); + LOGGER.debug( + "[FurnitureAnim] Created animation: blocked={}, enabled={}, disabled={}", + blockedRegions, + blockedParts, + disabledParts + ); return result; } @@ -135,7 +156,9 @@ public final class FurnitureAnimationContext { * @param disabledParts set of PlayerAnimator part names to disable */ private static void disableParts( - KeyframeAnimation.AnimationBuilder builder, Set disabledParts) { + KeyframeAnimation.AnimationBuilder builder, + Set disabledParts + ) { for (String partName : disabledParts) { KeyframeAnimation.StateCollection part = builder.getPart(partName); if (part != null) { diff --git a/src/main/java/com/tiedup/remake/v2/furniture/client/FurnitureEntityRenderer.java b/src/main/java/com/tiedup/remake/v2/furniture/client/FurnitureEntityRenderer.java index 5641bb6..30489e4 100644 --- a/src/main/java/com/tiedup/remake/v2/furniture/client/FurnitureEntityRenderer.java +++ b/src/main/java/com/tiedup/remake/v2/furniture/client/FurnitureEntityRenderer.java @@ -64,11 +64,18 @@ public class FurnitureEntityRenderer extends EntityRenderer { GltfData meshData = data.furnitureMesh(); // Compute joint matrices: animated if there is an active clip, static otherwise - GltfData.AnimationClip activeClip = resolveActiveAnimation(entity, meshData); + GltfData.AnimationClip activeClip = resolveActiveAnimation( + entity, + meshData + ); Matrix4f[] joints; if (activeClip != null) { float time = computeAnimationTime(entity, activeClip, partialTick); - joints = GltfSkinningEngine.computeJointMatricesAnimated(meshData, activeClip, time); + joints = GltfSkinningEngine.computeJointMatricesAnimated( + meshData, + activeClip, + time + ); } else { joints = GltfSkinningEngine.computeJointMatrices(meshData); } @@ -88,15 +95,26 @@ public class FurnitureEntityRenderer extends EntityRenderer { // has multiple primitives (tintable and non-tintable parts). Map tintColors = def.tintChannels(); if (!tintColors.isEmpty() && meshData.primitives().size() > 1) { - RenderType renderType = GltfMeshRenderer.getRenderTypeForDefaultTexture(); + RenderType renderType = + GltfMeshRenderer.getRenderTypeForDefaultTexture(); GltfMeshRenderer.renderSkinnedTinted( - meshData, joints, poseStack, buffer, - packedLight, packedOverlay, renderType, tintColors + meshData, + joints, + poseStack, + buffer, + packedLight, + packedOverlay, + renderType, + tintColors ); } else { GltfMeshRenderer.renderSkinned( - meshData, joints, poseStack, buffer, - packedLight, packedOverlay + meshData, + joints, + poseStack, + buffer, + packedLight, + packedOverlay ); } @@ -117,19 +135,22 @@ public class FurnitureEntityRenderer extends EntityRenderer { * @return the resolved animation clip, or null for static rendering */ private GltfData.AnimationClip resolveActiveAnimation( - EntityFurniture entity, GltfData meshData + EntityFurniture entity, + GltfData meshData ) { String animName = switch (entity.getAnimState()) { case EntityFurniture.STATE_OCCUPIED -> "Occupied"; case EntityFurniture.STATE_LOCKING -> "LockClose"; case EntityFurniture.STATE_STRUGGLE -> "Shake"; case EntityFurniture.STATE_UNLOCKING -> "LockOpen"; - case EntityFurniture.STATE_ENTERING -> "Occupied"; // furniture plays Occupied during player enter transition - case EntityFurniture.STATE_EXITING -> "Idle"; // furniture transitions to Idle during player exit + case EntityFurniture.STATE_ENTERING -> "Occupied"; // furniture plays Occupied during player enter transition + case EntityFurniture.STATE_EXITING -> "Idle"; // furniture transitions to Idle during player exit default -> "Idle"; }; GltfData.AnimationClip clip = meshData.getAnimation(animName); - if (clip == null && entity.getAnimState() != EntityFurniture.STATE_IDLE) { + if ( + clip == null && entity.getAnimState() != EntityFurniture.STATE_IDLE + ) { // Specific state animation missing: fall back to Idle clip = meshData.getAnimation("Idle"); } @@ -150,7 +171,9 @@ public class FurnitureEntityRenderer extends EntityRenderer { * @return time in frame-space, suitable for {@link GltfSkinningEngine#computeJointMatricesAnimated} */ private float computeAnimationTime( - EntityFurniture entity, GltfData.AnimationClip clip, float partialTick + EntityFurniture entity, + GltfData.AnimationClip clip, + float partialTick ) { int frameCount = clip.frameCount(); if (frameCount <= 1) return 0f; diff --git a/src/main/java/com/tiedup/remake/v2/furniture/client/FurnitureGlbParser.java b/src/main/java/com/tiedup/remake/v2/furniture/client/FurnitureGlbParser.java index c41aa32..aa8da71 100644 --- a/src/main/java/com/tiedup/remake/v2/furniture/client/FurnitureGlbParser.java +++ b/src/main/java/com/tiedup/remake/v2/furniture/client/FurnitureGlbParser.java @@ -20,11 +20,11 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; -import org.jetbrains.annotations.Nullable; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.jetbrains.annotations.Nullable; import org.joml.Matrix4f; import org.joml.Quaternionf; import org.joml.Vector3f; @@ -57,10 +57,10 @@ public final class FurnitureGlbParser { private static final Logger LOGGER = LogManager.getLogger("FurnitureGltf"); - private static final int GLB_MAGIC = 0x46546C67; // "glTF" + private static final int GLB_MAGIC = 0x46546C67; // "glTF" private static final int GLB_VERSION = 2; - private static final int CHUNK_JSON = 0x4E4F534A; // "JSON" - private static final int CHUNK_BIN = 0x004E4942; // "BIN\0" + private static final int CHUNK_JSON = 0x4E4F534A; // "JSON" + private static final int CHUNK_BIN = 0x004E4942; // "BIN\0" private static final String PLAYER_PREFIX = "Player_"; @@ -74,9 +74,12 @@ public final class FurnitureGlbParser { * @return parsed furniture data * @throws IOException if the file is malformed or I/O fails */ - public static FurnitureGltfData parse(InputStream input, String debugName) throws IOException { + public static FurnitureGltfData parse(InputStream input, String debugName) + throws IOException { byte[] allBytes = input.readAllBytes(); - ByteBuffer buf = ByteBuffer.wrap(allBytes).order(ByteOrder.LITTLE_ENDIAN); + ByteBuffer buf = ByteBuffer.wrap(allBytes).order( + ByteOrder.LITTLE_ENDIAN + ); // ---- GLB header ---- int magic = buf.getInt(); @@ -85,7 +88,9 @@ public final class FurnitureGlbParser { } int version = buf.getInt(); if (version != GLB_VERSION) { - throw new IOException("Unsupported GLB version " + version + " in " + debugName); + throw new IOException( + "Unsupported GLB version " + version + " in " + debugName + ); } buf.getInt(); // total file length — not needed, we already have all bytes @@ -125,18 +130,27 @@ public final class FurnitureGlbParser { // ---- Identify Player_* armature root nodes ---- // A "Player_*" armature root is any node whose name starts with "Player_". // Its name suffix is the seat ID. - Map seatIdToRootNode = new LinkedHashMap<>(); // seatId -> node index + Map seatIdToRootNode = new LinkedHashMap<>(); // seatId -> node index Set playerRootNodes = new HashSet<>(); if (nodes != null) { for (int ni = 0; ni < nodes.size(); ni++) { JsonObject node = nodes.get(ni).getAsJsonObject(); - String name = node.has("name") ? node.get("name").getAsString() : ""; - if (name.startsWith(PLAYER_PREFIX) && name.length() > PLAYER_PREFIX.length()) { + String name = node.has("name") + ? node.get("name").getAsString() + : ""; + if ( + name.startsWith(PLAYER_PREFIX) && + name.length() > PLAYER_PREFIX.length() + ) { String seatId = name.substring(PLAYER_PREFIX.length()); seatIdToRootNode.put(seatId, ni); playerRootNodes.add(ni); - LOGGER.debug("[FurnitureGltf] Found Player armature: '{}' -> seat '{}'", name, seatId); + LOGGER.debug( + "[FurnitureGltf] Found Player armature: '{}' -> seat '{}'", + name, + seatId + ); } } } @@ -145,18 +159,25 @@ public final class FurnitureGlbParser { // For each skin, check if its skeleton node (or the first joint's parent) is a Player_* root. // The "skeleton" field in a glTF skin points to the root bone node of that armature. int furnitureSkinIdx = -1; - Map seatIdToSkinIdx = new LinkedHashMap<>(); // seatId -> skin index + Map seatIdToSkinIdx = new LinkedHashMap<>(); // seatId -> skin index if (skins != null) { for (int si = 0; si < skins.size(); si++) { JsonObject skin = skins.get(si).getAsJsonObject(); - int skeletonNode = skin.has("skeleton") ? skin.get("skeleton").getAsInt() : -1; + int skeletonNode = skin.has("skeleton") + ? skin.get("skeleton").getAsInt() + : -1; // Check if the skeleton root node is a Player_* armature String matchedSeatId = null; - if (skeletonNode >= 0 && playerRootNodes.contains(skeletonNode)) { + if ( + skeletonNode >= 0 && playerRootNodes.contains(skeletonNode) + ) { // Direct match: skeleton field points to a Player_* node - for (Map.Entry entry : seatIdToRootNode.entrySet()) { + for (Map.Entry< + String, + Integer + > entry : seatIdToRootNode.entrySet()) { if (entry.getValue() == skeletonNode) { matchedSeatId = entry.getKey(); break; @@ -167,24 +188,35 @@ public final class FurnitureGlbParser { // Fallback: check if any joint in this skin is a child of a Player_* root if (matchedSeatId == null && skin.has("joints")) { matchedSeatId = matchSkinToPlayerArmature( - skin.getAsJsonArray("joints"), nodes, seatIdToRootNode + skin.getAsJsonArray("joints"), + nodes, + seatIdToRootNode ); } if (matchedSeatId != null) { seatIdToSkinIdx.put(matchedSeatId, si); - LOGGER.debug("[FurnitureGltf] Skin {} -> seat '{}'", si, matchedSeatId); + LOGGER.debug( + "[FurnitureGltf] Skin {} -> seat '{}'", + si, + matchedSeatId + ); } else if (furnitureSkinIdx < 0) { furnitureSkinIdx = si; LOGGER.debug("[FurnitureGltf] Skin {} -> furniture", si); } else { - LOGGER.warn("[FurnitureGltf] Extra non-Player skin {} ignored in '{}'", si, debugName); + LOGGER.warn( + "[FurnitureGltf] Extra non-Player skin {} ignored in '{}'", + si, + debugName + ); } } } // ---- Extract seat transforms from Player_* root nodes ---- - Map seatTransforms = new LinkedHashMap<>(); + Map seatTransforms = + new LinkedHashMap<>(); for (Map.Entry entry : seatIdToRootNode.entrySet()) { String seatId = entry.getKey(); int nodeIdx = entry.getValue(); @@ -193,33 +225,62 @@ public final class FurnitureGlbParser { Vector3f position = new Vector3f(); if (node.has("translation")) { JsonArray t = node.getAsJsonArray("translation"); - position.set(t.get(0).getAsFloat(), t.get(1).getAsFloat(), t.get(2).getAsFloat()); + position.set( + t.get(0).getAsFloat(), + t.get(1).getAsFloat(), + t.get(2).getAsFloat() + ); } Quaternionf rotation = new Quaternionf(); if (node.has("rotation")) { JsonArray r = node.getAsJsonArray("rotation"); - rotation.set(r.get(0).getAsFloat(), r.get(1).getAsFloat(), - r.get(2).getAsFloat(), r.get(3).getAsFloat()); + rotation.set( + r.get(0).getAsFloat(), + r.get(1).getAsFloat(), + r.get(2).getAsFloat(), + r.get(3).getAsFloat() + ); } - seatTransforms.put(seatId, new FurnitureGltfData.SeatTransform(seatId, position, rotation)); - LOGGER.debug("[FurnitureGltf] Seat '{}' transform: pos=({},{},{}), rot=({},{},{},{})", - seatId, position.x, position.y, position.z, - rotation.x, rotation.y, rotation.z, rotation.w); + seatTransforms.put( + seatId, + new FurnitureGltfData.SeatTransform(seatId, position, rotation) + ); + LOGGER.debug( + "[FurnitureGltf] Seat '{}' transform: pos=({},{},{}), rot=({},{},{},{})", + seatId, + position.x, + position.y, + position.z, + rotation.x, + rotation.y, + rotation.z, + rotation.w + ); } // ---- Parse furniture mesh (full GltfData from the furniture skin) ---- GltfData furnitureMesh = parseFurnitureSkin( - furnitureSkinIdx, root, accessors, bufferViews, nodes, meshes, skins, binData, debugName + furnitureSkinIdx, + root, + accessors, + bufferViews, + nodes, + meshes, + skins, + binData, + debugName ); // ---- Partition animations by Blender prefix convention ---- // Blender exports animations as "ArmatureName|AnimSuffix". // For Player_* armatures: key by seatId, strip to AnimSuffix. // For furniture armature: strip to AnimSuffix. - Map> seatAnimations = new LinkedHashMap<>(); - Map furnitureAnimClips = new LinkedHashMap<>(); + Map> seatAnimations = + new LinkedHashMap<>(); + Map furnitureAnimClips = + new LinkedHashMap<>(); // Build set of known Player_* armature names for prefix matching Map armatureNameToSeatId = new LinkedHashMap<>(); @@ -227,20 +288,26 @@ public final class FurnitureGlbParser { String seatId = entry.getKey(); int nodeIdx = entry.getValue(); JsonObject node = nodes.get(nodeIdx).getAsJsonObject(); - String armatureName = node.has("name") ? node.get("name").getAsString() : ""; + String armatureName = node.has("name") + ? node.get("name").getAsString() + : ""; armatureNameToSeatId.put(armatureName, seatId); } // Also detect the furniture armature name (for stripping its prefix) String furnitureArmatureName = detectFurnitureArmatureName( - furnitureSkinIdx, skins, nodes + furnitureSkinIdx, + skins, + nodes ); JsonArray animations = root.getAsJsonArray("animations"); if (animations != null) { for (int ai = 0; ai < animations.size(); ai++) { JsonObject anim = animations.get(ai).getAsJsonObject(); - String rawName = anim.has("name") ? anim.get("name").getAsString() : "animation_" + ai; + String rawName = anim.has("name") + ? anim.get("name").getAsString() + : "animation_" + ai; // Parse the "ArmatureName|AnimSuffix" convention String armaturePrefix = null; @@ -253,28 +320,48 @@ public final class FurnitureGlbParser { // Determine which armature this animation belongs to String matchedSeatId = (armaturePrefix != null) - ? armatureNameToSeatId.get(armaturePrefix) : null; + ? armatureNameToSeatId.get(armaturePrefix) + : null; if (matchedSeatId != null) { // Player animation: parse with the seat's joint mapping GltfData.AnimationClip clip = parseAnimationRaw( - anim, accessors, bufferViews, binData, nodes + anim, + accessors, + bufferViews, + binData, + nodes ); if (clip != null) { seatAnimations - .computeIfAbsent(matchedSeatId, k -> new LinkedHashMap<>()) + .computeIfAbsent(matchedSeatId, k -> + new LinkedHashMap<>() + ) .put(animSuffix, clip); - LOGGER.debug("[FurnitureGltf] Seat '{}' animation: '{}'", matchedSeatId, animSuffix); + LOGGER.debug( + "[FurnitureGltf] Seat '{}' animation: '{}'", + matchedSeatId, + animSuffix + ); } } else { // Furniture animation (or unmatched prefix -- treat as furniture) // Parse using the furniture joint mapping GltfData.AnimationClip clip = parseFurnitureAnimation( - anim, accessors, bufferViews, binData, nodes, furnitureSkinIdx, skins + anim, + accessors, + bufferViews, + binData, + nodes, + furnitureSkinIdx, + skins ); if (clip != null) { furnitureAnimClips.put(animSuffix, clip); - LOGGER.debug("[FurnitureGltf] Furniture animation: '{}'", animSuffix); + LOGGER.debug( + "[FurnitureGltf] Furniture animation: '{}'", + animSuffix + ); } } } @@ -284,30 +371,55 @@ public final class FurnitureGlbParser { // The furnitureMesh was parsed without animations; now rebuild it with the furniture clips. // If there are furniture animations, create a new GltfData with them. if (!furnitureAnimClips.isEmpty() && furnitureMesh != null) { - GltfData.AnimationClip defaultClip = furnitureAnimClips.values().iterator().next(); + GltfData.AnimationClip defaultClip = furnitureAnimClips + .values() + .iterator() + .next(); // Build raw copies for the raw-space maps - Map rawFurnitureClips = new LinkedHashMap<>(); - for (Map.Entry e : furnitureAnimClips.entrySet()) { - rawFurnitureClips.put(e.getKey(), GlbParserUtils.deepCopyClip(e.getValue())); + Map rawFurnitureClips = + new LinkedHashMap<>(); + for (Map.Entry< + String, + GltfData.AnimationClip + > e : furnitureAnimClips.entrySet()) { + rawFurnitureClips.put( + e.getKey(), + GlbParserUtils.deepCopyClip(e.getValue()) + ); } - GltfData.AnimationClip rawDefaultClip = rawFurnitureClips.values().iterator().next(); + GltfData.AnimationClip rawDefaultClip = rawFurnitureClips + .values() + .iterator() + .next(); // Convert furniture animations to MC space for (GltfData.AnimationClip clip : furnitureAnimClips.values()) { - GlbParserUtils.convertAnimationToMinecraftSpace(clip, furnitureMesh.jointCount()); + GlbParserUtils.convertAnimationToMinecraftSpace( + clip, + furnitureMesh.jointCount() + ); } furnitureMesh = new GltfData( - furnitureMesh.positions(), furnitureMesh.normals(), furnitureMesh.texCoords(), - furnitureMesh.indices(), furnitureMesh.joints(), furnitureMesh.weights(), - furnitureMesh.jointNames(), furnitureMesh.parentJointIndices(), + furnitureMesh.positions(), + furnitureMesh.normals(), + furnitureMesh.texCoords(), + furnitureMesh.indices(), + furnitureMesh.joints(), + furnitureMesh.weights(), + furnitureMesh.jointNames(), + furnitureMesh.parentJointIndices(), furnitureMesh.inverseBindMatrices(), - furnitureMesh.restRotations(), furnitureMesh.restTranslations(), + furnitureMesh.restRotations(), + furnitureMesh.restTranslations(), furnitureMesh.rawGltfRestRotations(), - rawDefaultClip, defaultClip, - furnitureAnimClips, rawFurnitureClips, + rawDefaultClip, + defaultClip, + furnitureAnimClips, + rawFurnitureClips, furnitureMesh.primitives(), - furnitureMesh.vertexCount(), furnitureMesh.jointCount() + furnitureMesh.vertexCount(), + furnitureMesh.jointCount() ); } @@ -323,8 +435,15 @@ public final class FurnitureGlbParser { try { GltfData seatSkel = parseSeatSkeleton( - skinIdx, root, accessors, bufferViews, nodes, skins, binData, - seatId, debugName + skinIdx, + root, + accessors, + bufferViews, + nodes, + skins, + binData, + seatId, + debugName ); if (seatSkel != null && seatSkel.jointCount() > 0) { @@ -332,31 +451,58 @@ public final class FurnitureGlbParser { // so animation clip indices match the filtered skeleton joints. Map remappedClips = remapSeatAnimations( - skinIdx, skins, nodes, seatId, - armatureNameToSeatId, animations, - accessors, bufferViews, binData + skinIdx, + skins, + nodes, + seatId, + armatureNameToSeatId, + animations, + accessors, + bufferViews, + binData ); if (!remappedClips.isEmpty()) { // Build raw copies before any conversion - Map rawRemappedClips = new LinkedHashMap<>(); - for (Map.Entry clipEntry : remappedClips.entrySet()) { - rawRemappedClips.put(clipEntry.getKey(), GlbParserUtils.deepCopyClip(clipEntry.getValue())); + Map rawRemappedClips = + new LinkedHashMap<>(); + for (Map.Entry< + String, + GltfData.AnimationClip + > clipEntry : remappedClips.entrySet()) { + rawRemappedClips.put( + clipEntry.getKey(), + GlbParserUtils.deepCopyClip( + clipEntry.getValue() + ) + ); } // Rebuild the GltfData with the remapped animations as rawNamedAnimations - GltfData.AnimationClip defaultRawClip = rawRemappedClips.values().iterator().next(); + GltfData.AnimationClip defaultRawClip = rawRemappedClips + .values() + .iterator() + .next(); seatSkel = new GltfData( - seatSkel.positions(), seatSkel.normals(), seatSkel.texCoords(), - seatSkel.indices(), seatSkel.joints(), seatSkel.weights(), - seatSkel.jointNames(), seatSkel.parentJointIndices(), + seatSkel.positions(), + seatSkel.normals(), + seatSkel.texCoords(), + seatSkel.indices(), + seatSkel.joints(), + seatSkel.weights(), + seatSkel.jointNames(), + seatSkel.parentJointIndices(), seatSkel.inverseBindMatrices(), - seatSkel.restRotations(), seatSkel.restTranslations(), + seatSkel.restRotations(), + seatSkel.restTranslations(), seatSkel.rawGltfRestRotations(), - defaultRawClip, null, - new LinkedHashMap<>(), rawRemappedClips, + defaultRawClip, + null, + new LinkedHashMap<>(), + rawRemappedClips, seatSkel.primitives(), - seatSkel.vertexCount(), seatSkel.jointCount() + seatSkel.vertexCount(), + seatSkel.jointCount() ); // Replace the raw-indexed clips in seatAnimations with properly-mapped ones @@ -364,25 +510,38 @@ public final class FurnitureGlbParser { } seatSkeletons.put(seatId, seatSkel); - LOGGER.debug("[FurnitureGltf] Parsed seat skeleton '{}': {} joints, {} animations", - seatId, seatSkel.jointCount(), remappedClips.size()); + LOGGER.debug( + "[FurnitureGltf] Parsed seat skeleton '{}': {} joints, {} animations", + seatId, + seatSkel.jointCount(), + remappedClips.size() + ); } else { - LOGGER.warn("[FurnitureGltf] Seat '{}' skeleton has no known bones in '{}'", - seatId, debugName); + LOGGER.warn( + "[FurnitureGltf] Seat '{}' skeleton has no known bones in '{}'", + seatId, + debugName + ); } } catch (Exception e) { - LOGGER.error("[FurnitureGltf] Failed to parse seat skeleton '{}' in '{}'", - seatId, debugName, e); + LOGGER.error( + "[FurnitureGltf] Failed to parse seat skeleton '{}' in '{}'", + seatId, + debugName, + e + ); } } - LOGGER.info("[FurnitureGltf] Parsed '{}': furnitureSkin={}, seats={}, seatSkeletons={}, furnitureAnims={}, seatAnimSets={}", + LOGGER.info( + "[FurnitureGltf] Parsed '{}': furnitureSkin={}, seats={}, seatSkeletons={}, furnitureAnims={}, seatAnimSets={}", debugName, furnitureSkinIdx >= 0 ? "yes" : "no", seatTransforms.size(), seatSkeletons.size(), furnitureAnimClips.size(), - seatAnimations.size()); + seatAnimations.size() + ); return new FurnitureGltfData( furnitureMesh, @@ -392,9 +551,7 @@ public final class FurnitureGlbParser { ); } - // ======================================================================== // Skin classification helpers - // ======================================================================== /** * Try to match a skin's joints to a Player_* armature by checking whether @@ -402,11 +559,16 @@ public final class FurnitureGlbParser { */ @Nullable private static String matchSkinToPlayerArmature( - JsonArray skinJoints, JsonArray nodes, Map seatIdToRootNode + JsonArray skinJoints, + JsonArray nodes, + Map seatIdToRootNode ) { for (JsonElement jointElem : skinJoints) { int jointNodeIdx = jointElem.getAsInt(); - for (Map.Entry entry : seatIdToRootNode.entrySet()) { + for (Map.Entry< + String, + Integer + > entry : seatIdToRootNode.entrySet()) { if (isDescendantOf(jointNodeIdx, entry.getValue(), nodes)) { return entry.getKey(); } @@ -419,7 +581,11 @@ public final class FurnitureGlbParser { * Check if nodeIdx is a descendant of ancestorIdx via the node children hierarchy. * Also returns true if nodeIdx == ancestorIdx. */ - private static boolean isDescendantOf(int nodeIdx, int ancestorIdx, JsonArray nodes) { + private static boolean isDescendantOf( + int nodeIdx, + int ancestorIdx, + JsonArray nodes + ) { if (nodeIdx == ancestorIdx) return true; JsonObject ancestor = nodes.get(ancestorIdx).getAsJsonObject(); if (!ancestor.has("children")) return false; @@ -434,7 +600,9 @@ public final class FurnitureGlbParser { */ @Nullable private static String detectFurnitureArmatureName( - int furnitureSkinIdx, @Nullable JsonArray skins, JsonArray nodes + int furnitureSkinIdx, + @Nullable JsonArray skins, + JsonArray nodes ) { if (skins == null || furnitureSkinIdx < 0) return null; JsonObject skin = skins.get(furnitureSkinIdx).getAsJsonObject(); @@ -444,9 +612,7 @@ public final class FurnitureGlbParser { return node.has("name") ? node.get("name").getAsString() : null; } - // ======================================================================== // Furniture skin parsing (produces a GltfData) - // ======================================================================== /** * Parse the furniture skin into a full {@link GltfData}. @@ -456,16 +622,31 @@ public final class FurnitureGlbParser { * @return parsed GltfData, or a minimal empty GltfData if no furniture skin exists */ private static GltfData parseFurnitureSkin( - int skinIdx, JsonObject root, - JsonArray accessors, JsonArray bufferViews, - JsonArray nodes, @Nullable JsonArray meshes, @Nullable JsonArray skins, - ByteBuffer binData, String debugName + int skinIdx, + JsonObject root, + JsonArray accessors, + JsonArray bufferViews, + JsonArray nodes, + @Nullable JsonArray meshes, + @Nullable JsonArray skins, + ByteBuffer binData, + String debugName ) throws IOException { - // If no furniture skin, return minimal GltfData (mesh-only GLB?) if (skins == null || skinIdx < 0) { - LOGGER.warn("[FurnitureGltf] No furniture skin found in '{}', attempting mesh-only parse", debugName); - return buildMeshOnlyGltfData(root, accessors, bufferViews, nodes, meshes, binData, debugName); + LOGGER.warn( + "[FurnitureGltf] No furniture skin found in '{}', attempting mesh-only parse", + debugName + ); + return buildMeshOnlyGltfData( + root, + accessors, + bufferViews, + nodes, + meshes, + binData, + debugName + ); } JsonObject skin = skins.get(skinIdx).getAsJsonObject(); @@ -495,13 +676,17 @@ public final class FurnitureGlbParser { int nodeIdx = jointNodeIndices.get(j); JsonObject node = nodes.get(nodeIdx).getAsJsonObject(); - jointNames[j] = node.has("name") ? node.get("name").getAsString() : "joint_" + j; + jointNames[j] = node.has("name") + ? node.get("name").getAsString() + : "joint_" + j; if (node.has("rotation")) { JsonArray r = node.getAsJsonArray("rotation"); restRotations[j] = new Quaternionf( - r.get(0).getAsFloat(), r.get(1).getAsFloat(), - r.get(2).getAsFloat(), r.get(3).getAsFloat() + r.get(0).getAsFloat(), + r.get(1).getAsFloat(), + r.get(2).getAsFloat(), + r.get(3).getAsFloat() ); } else { restRotations[j] = new Quaternionf(); @@ -510,7 +695,9 @@ public final class FurnitureGlbParser { if (node.has("translation")) { JsonArray t = node.getAsJsonArray("translation"); restTranslations[j] = new Vector3f( - t.get(0).getAsFloat(), t.get(1).getAsFloat(), t.get(2).getAsFloat() + t.get(0).getAsFloat(), + t.get(1).getAsFloat(), + t.get(2).getAsFloat() ); } else { restTranslations[j] = new Vector3f(); @@ -538,7 +725,12 @@ public final class FurnitureGlbParser { Matrix4f[] inverseBindMatrices = new Matrix4f[jointCount]; if (skin.has("inverseBindMatrices")) { int ibmAccessor = skin.get("inverseBindMatrices").getAsInt(); - float[] ibmData = GlbParserUtils.readFloatAccessor(accessors, bufferViews, binData, ibmAccessor); + float[] ibmData = GlbParserUtils.readFloatAccessor( + accessors, + bufferViews, + binData, + ibmAccessor + ); for (int j = 0; j < jointCount; j++) { inverseBindMatrices[j] = new Matrix4f(); inverseBindMatrices[j].set(ibmData, j * 16); @@ -557,7 +749,9 @@ public final class FurnitureGlbParser { if (targetMeshIdx < 0 && meshes != null) { for (int mi = 0; mi < meshes.size(); mi++) { JsonObject mesh = meshes.get(mi).getAsJsonObject(); - String meshName = mesh.has("name") ? mesh.get("name").getAsString() : ""; + String meshName = mesh.has("name") + ? mesh.get("name").getAsString() + : ""; if (!meshName.startsWith("Player")) { targetMeshIdx = mi; } @@ -593,25 +787,42 @@ public final class FurnitureGlbParser { JsonObject attributes = primitive.getAsJsonObject("attributes"); float[] primPositions = GlbParserUtils.readFloatAccessor( - accessors, bufferViews, binData, attributes.get("POSITION").getAsInt() + accessors, + bufferViews, + binData, + attributes.get("POSITION").getAsInt() ); float[] primNormals = attributes.has("NORMAL") - ? GlbParserUtils.readFloatAccessor(accessors, bufferViews, binData, attributes.get("NORMAL").getAsInt()) + ? GlbParserUtils.readFloatAccessor( + accessors, + bufferViews, + binData, + attributes.get("NORMAL").getAsInt() + ) : new float[primPositions.length]; float[] primTexCoords = attributes.has("TEXCOORD_0") - ? GlbParserUtils.readFloatAccessor(accessors, bufferViews, binData, attributes.get("TEXCOORD_0").getAsInt()) - : new float[primPositions.length / 3 * 2]; + ? GlbParserUtils.readFloatAccessor( + accessors, + bufferViews, + binData, + attributes.get("TEXCOORD_0").getAsInt() + ) + : new float[(primPositions.length / 3) * 2]; int primVertexCount = primPositions.length / 3; int[] primIndices; if (primitive.has("indices")) { primIndices = GlbParserUtils.readIntAccessor( - accessors, bufferViews, binData, primitive.get("indices").getAsInt() + accessors, + bufferViews, + binData, + primitive.get("indices").getAsInt() ); } else { primIndices = new int[primVertexCount]; - for (int i = 0; i < primVertexCount; i++) primIndices[i] = i; + for (int i = 0; i < primVertexCount; i++) primIndices[i] = + i; } if (cumulativeVertexCount > 0) { @@ -625,12 +836,18 @@ public final class FurnitureGlbParser { float[] primWeights = new float[primVertexCount * 4]; if (attributes.has("JOINTS_0")) { primJoints = GlbParserUtils.readIntAccessor( - accessors, bufferViews, binData, attributes.get("JOINTS_0").getAsInt() + accessors, + bufferViews, + binData, + attributes.get("JOINTS_0").getAsInt() ); } if (attributes.has("WEIGHTS_0")) { primWeights = GlbParserUtils.readFloatAccessor( - accessors, bufferViews, binData, attributes.get("WEIGHTS_0").getAsInt() + accessors, + bufferViews, + binData, + attributes.get("WEIGHTS_0").getAsInt() ); } @@ -642,10 +859,18 @@ public final class FurnitureGlbParser { matName = materialNames[matIdx]; } } - boolean isTintable = matName != null && matName.startsWith("tintable_"); + boolean isTintable = + matName != null && matName.startsWith("tintable_"); String tintChannel = isTintable ? matName : null; - parsedPrimitives.add(new GltfData.Primitive(primIndices, matName, isTintable, tintChannel)); + parsedPrimitives.add( + new GltfData.Primitive( + primIndices, + matName, + isTintable, + tintChannel + ) + ); allPositions.add(primPositions); allNormals.add(primNormals); @@ -663,15 +888,25 @@ public final class FurnitureGlbParser { weights = GlbParserUtils.flattenFloats(allWeights); int totalIndices = 0; - for (GltfData.Primitive p : parsedPrimitives) totalIndices += p.indices().length; + for (GltfData.Primitive p : parsedPrimitives) + totalIndices += p.indices().length; indices = new int[totalIndices]; int offset = 0; for (GltfData.Primitive p : parsedPrimitives) { - System.arraycopy(p.indices(), 0, indices, offset, p.indices().length); + System.arraycopy( + p.indices(), + 0, + indices, + offset, + p.indices().length + ); offset += p.indices().length; } } else { - LOGGER.info("[FurnitureGltf] No furniture mesh found in '{}'", debugName); + LOGGER.info( + "[FurnitureGltf] No furniture mesh found in '{}'", + debugName + ); positions = new float[0]; normals = new float[0]; texCoords = new float[0]; @@ -688,20 +923,35 @@ public final class FurnitureGlbParser { } // ---- Convert to Minecraft space ---- - convertToMinecraftSpace(positions, normals, restTranslations, restRotations, - inverseBindMatrices, jointCount); + convertToMinecraftSpace( + positions, + normals, + restTranslations, + restRotations, + inverseBindMatrices, + jointCount + ); return new GltfData( - positions, normals, texCoords, - indices, meshJoints, weights, - jointNames, parentJointIndices, + positions, + normals, + texCoords, + indices, + meshJoints, + weights, + jointNames, + parentJointIndices, inverseBindMatrices, - restRotations, restTranslations, + restRotations, + restTranslations, rawRestRotations, - null, null, // animations injected later by the caller - new LinkedHashMap<>(), new LinkedHashMap<>(), + null, + null, // animations injected later by the caller + new LinkedHashMap<>(), + new LinkedHashMap<>(), parsedPrimitives, - vertexCount, jointCount + vertexCount, + jointCount ); } @@ -711,9 +961,12 @@ public final class FurnitureGlbParser { */ private static GltfData buildMeshOnlyGltfData( JsonObject root, - JsonArray accessors, JsonArray bufferViews, - JsonArray nodes, @Nullable JsonArray meshes, - ByteBuffer binData, String debugName + JsonArray accessors, + JsonArray bufferViews, + JsonArray nodes, + @Nullable JsonArray meshes, + ByteBuffer binData, + String debugName ) { String[] materialNames = GlbParserUtils.parseMaterialNames(root); List parsedPrimitives = new ArrayList<>(); @@ -723,7 +976,9 @@ public final class FurnitureGlbParser { if (meshes != null) { for (int mi = 0; mi < meshes.size(); mi++) { JsonObject mesh = meshes.get(mi).getAsJsonObject(); - String meshName = mesh.has("name") ? mesh.get("name").getAsString() : ""; + String meshName = mesh.has("name") + ? mesh.get("name").getAsString() + : ""; if (!meshName.startsWith("Player")) { targetMeshIdx = mi; break; @@ -751,25 +1006,42 @@ public final class FurnitureGlbParser { JsonObject attributes = primitive.getAsJsonObject("attributes"); float[] primPositions = GlbParserUtils.readFloatAccessor( - accessors, bufferViews, binData, attributes.get("POSITION").getAsInt() + accessors, + bufferViews, + binData, + attributes.get("POSITION").getAsInt() ); float[] primNormals = attributes.has("NORMAL") - ? GlbParserUtils.readFloatAccessor(accessors, bufferViews, binData, attributes.get("NORMAL").getAsInt()) + ? GlbParserUtils.readFloatAccessor( + accessors, + bufferViews, + binData, + attributes.get("NORMAL").getAsInt() + ) : new float[primPositions.length]; float[] primTexCoords = attributes.has("TEXCOORD_0") - ? GlbParserUtils.readFloatAccessor(accessors, bufferViews, binData, attributes.get("TEXCOORD_0").getAsInt()) - : new float[primPositions.length / 3 * 2]; + ? GlbParserUtils.readFloatAccessor( + accessors, + bufferViews, + binData, + attributes.get("TEXCOORD_0").getAsInt() + ) + : new float[(primPositions.length / 3) * 2]; int primVertexCount = primPositions.length / 3; int[] primIndices; if (primitive.has("indices")) { primIndices = GlbParserUtils.readIntAccessor( - accessors, bufferViews, binData, primitive.get("indices").getAsInt() + accessors, + bufferViews, + binData, + primitive.get("indices").getAsInt() ); } else { primIndices = new int[primVertexCount]; - for (int i = 0; i < primVertexCount; i++) primIndices[i] = i; + for (int i = 0; i < primVertexCount; i++) primIndices[i] = + i; } if (cumulativeVertexCount > 0) { @@ -785,10 +1057,16 @@ public final class FurnitureGlbParser { matName = materialNames[matIdx]; } } - boolean isTintable = matName != null && matName.startsWith("tintable_"); - parsedPrimitives.add(new GltfData.Primitive( - primIndices, matName, isTintable, isTintable ? matName : null - )); + boolean isTintable = + matName != null && matName.startsWith("tintable_"); + parsedPrimitives.add( + new GltfData.Primitive( + primIndices, + matName, + isTintable, + isTintable ? matName : null + ) + ); allPositions.add(primPositions); allNormals.add(primNormals); @@ -802,11 +1080,18 @@ public final class FurnitureGlbParser { texCoords = GlbParserUtils.flattenFloats(allTexCoords); int totalIndices = 0; - for (GltfData.Primitive p : parsedPrimitives) totalIndices += p.indices().length; + for (GltfData.Primitive p : parsedPrimitives) + totalIndices += p.indices().length; indices = new int[totalIndices]; int offset = 0; for (GltfData.Primitive p : parsedPrimitives) { - System.arraycopy(p.indices(), 0, indices, offset, p.indices().length); + System.arraycopy( + p.indices(), + 0, + indices, + offset, + p.indices().length + ); offset += p.indices().length; } @@ -828,16 +1113,25 @@ public final class FurnitureGlbParser { } return new GltfData( - positions, normals, texCoords, - indices, new int[0], new float[0], - new String[0], new int[0], + positions, + normals, + texCoords, + indices, + new int[0], + new float[0], + new String[0], + new int[0], new Matrix4f[0], - new Quaternionf[0], new Vector3f[0], new Quaternionf[0], - null, null, - new LinkedHashMap<>(), new LinkedHashMap<>(), + new Vector3f[0], + new Quaternionf[0], + null, + null, + new LinkedHashMap<>(), + new LinkedHashMap<>(), parsedPrimitives, - vertexCount, 0 + vertexCount, + 0 ); } @@ -846,20 +1140,26 @@ public final class FurnitureGlbParser { * A node that has both a "skin" field matching skinIdx and a "mesh" field * links the two. */ - private static int findMeshForSkin(int skinIdx, JsonArray nodes, @Nullable JsonArray meshes) { + private static int findMeshForSkin( + int skinIdx, + JsonArray nodes, + @Nullable JsonArray meshes + ) { if (meshes == null || skinIdx < 0) return -1; for (int ni = 0; ni < nodes.size(); ni++) { JsonObject node = nodes.get(ni).getAsJsonObject(); - if (node.has("skin") && node.get("skin").getAsInt() == skinIdx && node.has("mesh")) { + if ( + node.has("skin") && + node.get("skin").getAsInt() == skinIdx && + node.has("mesh") + ) { return node.get("mesh").getAsInt(); } } return -1; } - // ======================================================================== // Seat skeleton parsing (Player_* armatures for player animation) - // ======================================================================== /** * Parse a Player_* skin into a skeleton-only {@link GltfData} for player animation. @@ -883,14 +1183,22 @@ public final class FurnitureGlbParser { */ @Nullable private static GltfData parseSeatSkeleton( - int skinIdx, JsonObject root, - JsonArray accessors, JsonArray bufferViews, - JsonArray nodes, @Nullable JsonArray skins, - ByteBuffer binData, String seatId, String debugName + int skinIdx, + JsonObject root, + JsonArray accessors, + JsonArray bufferViews, + JsonArray nodes, + @Nullable JsonArray skins, + ByteBuffer binData, + String seatId, + String debugName ) throws IOException { - if (skins == null || skinIdx < 0) { - LOGGER.warn("[FurnitureGltf] No skin for seat '{}' in '{}'", seatId, debugName); + LOGGER.warn( + "[FurnitureGltf] No skin for seat '{}' in '{}'", + seatId, + debugName + ); return null; } @@ -905,18 +1213,28 @@ public final class FurnitureGlbParser { for (int j = 0; j < skinJoints.size(); j++) { int nodeIdx = skinJoints.get(j).getAsInt(); JsonObject node = nodes.get(nodeIdx).getAsJsonObject(); - String name = node.has("name") ? node.get("name").getAsString() : "joint_" + j; + String name = node.has("name") + ? node.get("name").getAsString() + : "joint_" + j; if (GltfBoneMapper.isKnownBone(name)) { skinJointRemap[j] = filteredJointNodes.size(); filteredJointNodes.add(nodeIdx); } else { - LOGGER.debug("[FurnitureGltf] Seat '{}': skipping non-player bone '{}'", seatId, name); + LOGGER.debug( + "[FurnitureGltf] Seat '{}': skipping non-player bone '{}'", + seatId, + name + ); } } int jointCount = filteredJointNodes.size(); if (jointCount == 0) { - LOGGER.warn("[FurnitureGltf] Seat '{}' skin has no known player bones in '{}'", seatId, debugName); + LOGGER.warn( + "[FurnitureGltf] Seat '{}' skin has no known player bones in '{}'", + seatId, + debugName + ); return null; } @@ -939,13 +1257,17 @@ public final class FurnitureGlbParser { int nodeIdx = filteredJointNodes.get(j); JsonObject node = nodes.get(nodeIdx).getAsJsonObject(); - jointNames[j] = node.has("name") ? node.get("name").getAsString() : "joint_" + j; + jointNames[j] = node.has("name") + ? node.get("name").getAsString() + : "joint_" + j; if (node.has("rotation")) { JsonArray r = node.getAsJsonArray("rotation"); restRotations[j] = new Quaternionf( - r.get(0).getAsFloat(), r.get(1).getAsFloat(), - r.get(2).getAsFloat(), r.get(3).getAsFloat() + r.get(0).getAsFloat(), + r.get(1).getAsFloat(), + r.get(2).getAsFloat(), + r.get(3).getAsFloat() ); } else { restRotations[j] = new Quaternionf(); @@ -954,7 +1276,9 @@ public final class FurnitureGlbParser { if (node.has("translation")) { JsonArray t = node.getAsJsonArray("translation"); restTranslations[j] = new Vector3f( - t.get(0).getAsFloat(), t.get(1).getAsFloat(), t.get(2).getAsFloat() + t.get(0).getAsFloat(), + t.get(1).getAsFloat(), + t.get(2).getAsFloat() ); } else { restTranslations[j] = new Vector3f(); @@ -983,7 +1307,12 @@ public final class FurnitureGlbParser { Matrix4f[] inverseBindMatrices = new Matrix4f[jointCount]; if (skin.has("inverseBindMatrices")) { int ibmAccessor = skin.get("inverseBindMatrices").getAsInt(); - float[] ibmData = GlbParserUtils.readFloatAccessor(accessors, bufferViews, binData, ibmAccessor); + float[] ibmData = GlbParserUtils.readFloatAccessor( + accessors, + bufferViews, + binData, + ibmAccessor + ); for (int origJ = 0; origJ < skinJoints.size(); origJ++) { int newJ = skinJointRemap[origJ]; if (newJ >= 0) { @@ -1007,28 +1336,53 @@ public final class FurnitureGlbParser { // Empty arrays for positions/normals (skeleton-only, no mesh) float[] emptyPositions = new float[0]; float[] emptyNormals = new float[0]; - convertToMinecraftSpace(emptyPositions, emptyNormals, restTranslations, restRotations, - inverseBindMatrices, jointCount); + convertToMinecraftSpace( + emptyPositions, + emptyNormals, + restTranslations, + restRotations, + inverseBindMatrices, + jointCount + ); - LOGGER.debug("[FurnitureGltf] Seat '{}' skeleton: {} filtered joints from {} total in '{}'", - seatId, jointCount, skinJoints.size(), debugName); + LOGGER.debug( + "[FurnitureGltf] Seat '{}' skeleton: {} filtered joints from {} total in '{}'", + seatId, + jointCount, + skinJoints.size(), + debugName + ); for (int j = 0; j < jointCount; j++) { - LOGGER.debug("[FurnitureGltf] seat '{}' joint[{}] = '{}', parent={}", - seatId, j, jointNames[j], parentJointIndices[j]); + LOGGER.debug( + "[FurnitureGltf] seat '{}' joint[{}] = '{}', parent={}", + seatId, + j, + jointNames[j], + parentJointIndices[j] + ); } // Return skeleton-only GltfData (no mesh, no animations yet) return new GltfData( - new float[0], new float[0], new float[0], // positions, normals, texCoords - new int[0], new int[0], new float[0], // indices, joints, weights - jointNames, parentJointIndices, + new float[0], + new float[0], + new float[0], // positions, normals, texCoords + new int[0], + new int[0], + new float[0], // indices, joints, weights + jointNames, + parentJointIndices, inverseBindMatrices, - restRotations, restTranslations, + restRotations, + restTranslations, rawRestRotations, - null, null, // animations added later - new LinkedHashMap<>(), new LinkedHashMap<>(), - List.of(), // no primitives - 0, jointCount + null, + null, // animations added later + new LinkedHashMap<>(), + new LinkedHashMap<>(), + List.of(), // no primitives + 0, + jointCount ); } @@ -1053,10 +1407,15 @@ public final class FurnitureGlbParser { * @return map of animation name to properly-indexed clip, or empty map if none found */ private static Map remapSeatAnimations( - int skinIdx, @Nullable JsonArray skins, JsonArray nodes, - String seatId, Map armatureNameToSeatId, + int skinIdx, + @Nullable JsonArray skins, + JsonArray nodes, + String seatId, + Map armatureNameToSeatId, @Nullable JsonArray animations, - JsonArray accessors, JsonArray bufferViews, ByteBuffer binData + JsonArray accessors, + JsonArray bufferViews, + ByteBuffer binData ) { Map result = new LinkedHashMap<>(); @@ -1070,7 +1429,9 @@ public final class FurnitureGlbParser { for (int j = 0; j < skinJoints.size(); j++) { int nodeIdx = skinJoints.get(j).getAsInt(); JsonObject node = nodes.get(nodeIdx).getAsJsonObject(); - String name = node.has("name") ? node.get("name").getAsString() : "joint_" + j; + String name = node.has("name") + ? node.get("name").getAsString() + : "joint_" + j; if (GltfBoneMapper.isKnownBone(name)) { filteredJointNodes.add(nodeIdx); } @@ -1087,7 +1448,10 @@ public final class FurnitureGlbParser { // Find this seat's armature name for prefix matching String targetArmatureName = null; - for (Map.Entry entry : armatureNameToSeatId.entrySet()) { + for (Map.Entry< + String, + String + > entry : armatureNameToSeatId.entrySet()) { if (seatId.equals(entry.getValue())) { targetArmatureName = entry.getKey(); break; @@ -1097,7 +1461,9 @@ public final class FurnitureGlbParser { // Re-parse each animation that belongs to this seat for (int ai = 0; ai < animations.size(); ai++) { JsonObject anim = animations.get(ai).getAsJsonObject(); - String rawName = anim.has("name") ? anim.get("name").getAsString() : "animation_" + ai; + String rawName = anim.has("name") + ? anim.get("name").getAsString() + : "animation_" + ai; // Parse "ArmatureName|AnimSuffix" convention String armaturePrefix = null; @@ -1109,27 +1475,37 @@ public final class FurnitureGlbParser { } // Only process animations belonging to this seat's armature - if (armaturePrefix == null || !armaturePrefix.equals(targetArmatureName)) { + if ( + armaturePrefix == null || + !armaturePrefix.equals(targetArmatureName) + ) { continue; } // Parse with the filtered joint mapping GltfData.AnimationClip clip = parseAnimationWithMapping( - anim, accessors, bufferViews, binData, nodeToJoint, jointCount + anim, + accessors, + bufferViews, + binData, + nodeToJoint, + jointCount ); if (clip != null) { result.put(animSuffix, clip); - LOGGER.debug("[FurnitureGltf] Remapped seat '{}' animation: '{}' ({} joints)", - seatId, animSuffix, jointCount); + LOGGER.debug( + "[FurnitureGltf] Remapped seat '{}' animation: '{}' ({} joints)", + seatId, + animSuffix, + jointCount + ); } } return result; } - // ======================================================================== // Animation parsing - // ======================================================================== /** * Parse a raw animation clip without any joint index mapping. @@ -1145,8 +1521,10 @@ public final class FurnitureGlbParser { @Nullable private static GltfData.AnimationClip parseAnimationRaw( JsonObject animation, - JsonArray accessors, JsonArray bufferViews, - ByteBuffer binData, JsonArray nodes + JsonArray accessors, + JsonArray bufferViews, + ByteBuffer binData, + JsonArray nodes ) { JsonArray channels = animation.getAsJsonArray("channels"); JsonArray samplers = animation.getAsJsonArray("samplers"); @@ -1157,7 +1535,10 @@ public final class FurnitureGlbParser { JsonObject channel = chElem.getAsJsonObject(); JsonObject target = channel.getAsJsonObject("target"); if (target.has("node")) { - maxNodeIdx = Math.max(maxNodeIdx, target.get("node").getAsInt()); + maxNodeIdx = Math.max( + maxNodeIdx, + target.get("node").getAsInt() + ); } } int slotCount = maxNodeIdx + 1; @@ -1179,24 +1560,46 @@ public final class FurnitureGlbParser { int samplerIdx = channel.get("sampler").getAsInt(); JsonObject sampler = samplers.get(samplerIdx).getAsJsonObject(); - float[] times = GlbParserUtils.readFloatAccessor(accessors, bufferViews, binData, sampler.get("input").getAsInt()); + float[] times = GlbParserUtils.readFloatAccessor( + accessors, + bufferViews, + binData, + sampler.get("input").getAsInt() + ); if ("rotation".equals(path)) { - float[] quats = GlbParserUtils.readFloatAccessor(accessors, bufferViews, binData, sampler.get("output").getAsInt()); + float[] quats = GlbParserUtils.readFloatAccessor( + accessors, + bufferViews, + binData, + sampler.get("output").getAsInt() + ); Quaternionf[] qArr = new Quaternionf[times.length]; for (int i = 0; i < times.length; i++) { qArr[i] = new Quaternionf( - quats[i * 4], quats[i * 4 + 1], quats[i * 4 + 2], quats[i * 4 + 3] + quats[i * 4], + quats[i * 4 + 1], + quats[i * 4 + 2], + quats[i * 4 + 3] ); } rotJoints.add(nodeIdx); rotTimestamps.add(times); rotValues.add(qArr); } else if ("translation".equals(path)) { - float[] vecs = GlbParserUtils.readFloatAccessor(accessors, bufferViews, binData, sampler.get("output").getAsInt()); + float[] vecs = GlbParserUtils.readFloatAccessor( + accessors, + bufferViews, + binData, + sampler.get("output").getAsInt() + ); Vector3f[] tArr = new Vector3f[times.length]; for (int i = 0; i < times.length; i++) { - tArr[i] = new Vector3f(vecs[i * 3], vecs[i * 3 + 1], vecs[i * 3 + 2]); + tArr[i] = new Vector3f( + vecs[i * 3], + vecs[i * 3 + 1], + vecs[i * 3 + 2] + ); } transJoints.add(nodeIdx); transTimestamps.add(times); @@ -1206,7 +1609,9 @@ public final class FurnitureGlbParser { if (rotJoints.isEmpty() && transJoints.isEmpty()) return null; - float[] timestamps = !rotTimestamps.isEmpty() ? rotTimestamps.get(0) : transTimestamps.get(0); + float[] timestamps = !rotTimestamps.isEmpty() + ? rotTimestamps.get(0) + : transTimestamps.get(0); int frameCount = timestamps.length; Quaternionf[][] rotations = new Quaternionf[slotCount][]; @@ -1215,7 +1620,8 @@ public final class FurnitureGlbParser { Quaternionf[] vals = rotValues.get(i); rotations[jIdx] = new Quaternionf[frameCount]; for (int f = 0; f < frameCount; f++) { - rotations[jIdx][f] = f < vals.length ? vals[f] : vals[vals.length - 1]; + rotations[jIdx][f] = + f < vals.length ? vals[f] : vals[vals.length - 1]; } } @@ -1225,11 +1631,19 @@ public final class FurnitureGlbParser { Vector3f[] vals = transValues.get(i); translations[jIdx] = new Vector3f[frameCount]; for (int f = 0; f < frameCount; f++) { - translations[jIdx][f] = f < vals.length ? new Vector3f(vals[f]) : new Vector3f(vals[vals.length - 1]); + translations[jIdx][f] = + f < vals.length + ? new Vector3f(vals[f]) + : new Vector3f(vals[vals.length - 1]); } } - return new GltfData.AnimationClip(timestamps, rotations, translations, frameCount); + return new GltfData.AnimationClip( + timestamps, + rotations, + translations, + frameCount + ); } /** @@ -1239,9 +1653,12 @@ public final class FurnitureGlbParser { @Nullable private static GltfData.AnimationClip parseFurnitureAnimation( JsonObject animation, - JsonArray accessors, JsonArray bufferViews, - ByteBuffer binData, JsonArray nodes, - int furnitureSkinIdx, @Nullable JsonArray skins + JsonArray accessors, + JsonArray bufferViews, + ByteBuffer binData, + JsonArray nodes, + int furnitureSkinIdx, + @Nullable JsonArray skins ) { if (skins == null || furnitureSkinIdx < 0) return null; @@ -1259,7 +1676,12 @@ public final class FurnitureGlbParser { // Delegate to the standard animation parsing logic return parseAnimationWithMapping( - animation, accessors, bufferViews, binData, nodeToJoint, jointCount + animation, + accessors, + bufferViews, + binData, + nodeToJoint, + jointCount ); } @@ -1270,9 +1692,11 @@ public final class FurnitureGlbParser { @Nullable private static GltfData.AnimationClip parseAnimationWithMapping( JsonObject animation, - JsonArray accessors, JsonArray bufferViews, + JsonArray accessors, + JsonArray bufferViews, ByteBuffer binData, - int[] nodeToJoint, int jointCount + int[] nodeToJoint, + int jointCount ) { JsonArray channels = animation.getAsJsonArray("channels"); JsonArray samplers = animation.getAsJsonArray("samplers"); @@ -1292,29 +1716,53 @@ public final class FurnitureGlbParser { String path = target.get("path").getAsString(); int nodeIdx = target.get("node").getAsInt(); - if (nodeIdx >= nodeToJoint.length || nodeToJoint[nodeIdx] < 0) continue; + if ( + nodeIdx >= nodeToJoint.length || nodeToJoint[nodeIdx] < 0 + ) continue; int jointIdx = nodeToJoint[nodeIdx]; int samplerIdx = channel.get("sampler").getAsInt(); JsonObject sampler = samplers.get(samplerIdx).getAsJsonObject(); - float[] times = GlbParserUtils.readFloatAccessor(accessors, bufferViews, binData, sampler.get("input").getAsInt()); + float[] times = GlbParserUtils.readFloatAccessor( + accessors, + bufferViews, + binData, + sampler.get("input").getAsInt() + ); if ("rotation".equals(path)) { - float[] quats = GlbParserUtils.readFloatAccessor(accessors, bufferViews, binData, sampler.get("output").getAsInt()); + float[] quats = GlbParserUtils.readFloatAccessor( + accessors, + bufferViews, + binData, + sampler.get("output").getAsInt() + ); Quaternionf[] qArr = new Quaternionf[times.length]; for (int i = 0; i < times.length; i++) { qArr[i] = new Quaternionf( - quats[i * 4], quats[i * 4 + 1], quats[i * 4 + 2], quats[i * 4 + 3] + quats[i * 4], + quats[i * 4 + 1], + quats[i * 4 + 2], + quats[i * 4 + 3] ); } rotJoints.add(jointIdx); rotTimestamps.add(times); rotValues.add(qArr); } else if ("translation".equals(path)) { - float[] vecs = GlbParserUtils.readFloatAccessor(accessors, bufferViews, binData, sampler.get("output").getAsInt()); + float[] vecs = GlbParserUtils.readFloatAccessor( + accessors, + bufferViews, + binData, + sampler.get("output").getAsInt() + ); Vector3f[] tArr = new Vector3f[times.length]; for (int i = 0; i < times.length; i++) { - tArr[i] = new Vector3f(vecs[i * 3], vecs[i * 3 + 1], vecs[i * 3 + 2]); + tArr[i] = new Vector3f( + vecs[i * 3], + vecs[i * 3 + 1], + vecs[i * 3 + 2] + ); } transJoints.add(jointIdx); transTimestamps.add(times); @@ -1324,7 +1772,9 @@ public final class FurnitureGlbParser { if (rotJoints.isEmpty() && transJoints.isEmpty()) return null; - float[] timestamps = !rotTimestamps.isEmpty() ? rotTimestamps.get(0) : transTimestamps.get(0); + float[] timestamps = !rotTimestamps.isEmpty() + ? rotTimestamps.get(0) + : transTimestamps.get(0); int frameCount = timestamps.length; Quaternionf[][] rotations = new Quaternionf[jointCount][]; @@ -1333,7 +1783,8 @@ public final class FurnitureGlbParser { Quaternionf[] vals = rotValues.get(i); rotations[jIdx] = new Quaternionf[frameCount]; for (int f = 0; f < frameCount; f++) { - rotations[jIdx][f] = f < vals.length ? vals[f] : vals[vals.length - 1]; + rotations[jIdx][f] = + f < vals.length ? vals[f] : vals[vals.length - 1]; } } @@ -1343,25 +1794,34 @@ public final class FurnitureGlbParser { Vector3f[] vals = transValues.get(i); translations[jIdx] = new Vector3f[frameCount]; for (int f = 0; f < frameCount; f++) { - translations[jIdx][f] = f < vals.length ? new Vector3f(vals[f]) : new Vector3f(vals[vals.length - 1]); + translations[jIdx][f] = + f < vals.length + ? new Vector3f(vals[f]) + : new Vector3f(vals[vals.length - 1]); } } - return new GltfData.AnimationClip(timestamps, rotations, translations, frameCount); + return new GltfData.AnimationClip( + timestamps, + rotations, + translations, + frameCount + ); } - // ======================================================================== // Coordinate conversion - // ======================================================================== /** * Convert spatial data from glTF space to Minecraft model-def space. * Same transform as GlbParser: 180 degrees around Z, negating X and Y. */ private static void convertToMinecraftSpace( - float[] positions, float[] normals, - Vector3f[] restTranslations, Quaternionf[] restRotations, - Matrix4f[] inverseBindMatrices, int jointCount + float[] positions, + float[] normals, + Vector3f[] restTranslations, + Quaternionf[] restRotations, + Matrix4f[] inverseBindMatrices, + int jointCount ) { // Vertex positions: negate X and Y for (int i = 0; i < positions.length; i += 3) { @@ -1391,5 +1851,4 @@ public final class FurnitureGlbParser { ibm.set(temp); } } - } diff --git a/src/main/java/com/tiedup/remake/v2/furniture/client/FurnitureGltfCache.java b/src/main/java/com/tiedup/remake/v2/furniture/client/FurnitureGltfCache.java index debadd3..2cfe47f 100644 --- a/src/main/java/com/tiedup/remake/v2/furniture/client/FurnitureGltfCache.java +++ b/src/main/java/com/tiedup/remake/v2/furniture/client/FurnitureGltfCache.java @@ -3,7 +3,6 @@ package com.tiedup.remake.v2.furniture.client; import java.io.InputStream; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import org.jetbrains.annotations.Nullable; import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.resources.Resource; @@ -11,6 +10,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.jetbrains.annotations.Nullable; /** * Lazy-loading cache for parsed multi-armature furniture GLB data. @@ -31,14 +31,11 @@ public final class FurnitureGltfCache { * Sentinel value stored in the cache when loading fails, to avoid retrying * broken resources on every frame. */ - private static final FurnitureGltfData FAILED_SENTINEL = new FurnitureGltfData( - null, - Map.of(), - Map.of(), - Map.of() - ); + private static final FurnitureGltfData FAILED_SENTINEL = + new FurnitureGltfData(null, Map.of(), Map.of(), Map.of()); - private static final Map CACHE = new ConcurrentHashMap<>(); + private static final Map CACHE = + new ConcurrentHashMap<>(); private FurnitureGltfCache() {} @@ -51,7 +48,10 @@ public final class FurnitureGltfCache { */ @Nullable public static FurnitureGltfData get(ResourceLocation modelLocation) { - FurnitureGltfData cached = CACHE.computeIfAbsent(modelLocation, FurnitureGltfCache::load); + FurnitureGltfData cached = CACHE.computeIfAbsent( + modelLocation, + FurnitureGltfCache::load + ); return cached == FAILED_SENTINEL ? null : cached; } @@ -72,12 +72,19 @@ public final class FurnitureGltfCache { } try (InputStream is = resource.open()) { - FurnitureGltfData data = FurnitureGlbParser.parse(is, loc.toString()); + FurnitureGltfData data = FurnitureGlbParser.parse( + is, + loc.toString() + ); LOGGER.debug("[FurnitureGltf] Cached: {}", loc); return data; } } catch (Exception e) { - LOGGER.error("[FurnitureGltf] Failed to load furniture GLB: {}", loc, e); + LOGGER.error( + "[FurnitureGltf] Failed to load furniture GLB: {}", + loc, + e + ); return FAILED_SENTINEL; } } diff --git a/src/main/java/com/tiedup/remake/v2/furniture/client/FurnitureSeatPositionHelper.java b/src/main/java/com/tiedup/remake/v2/furniture/client/FurnitureSeatPositionHelper.java index a181774..e960905 100644 --- a/src/main/java/com/tiedup/remake/v2/furniture/client/FurnitureSeatPositionHelper.java +++ b/src/main/java/com/tiedup/remake/v2/furniture/client/FurnitureSeatPositionHelper.java @@ -38,7 +38,9 @@ public final class FurnitureSeatPositionHelper { public static double[] getSeatWorldPosition( FurnitureDefinition def, String seatId, - double furnitureX, double furnitureY, double furnitureZ, + double furnitureX, + double furnitureY, + double furnitureZ, float furnitureYRot ) { ResourceLocation modelLoc = def.modelLocation(); @@ -47,7 +49,9 @@ public final class FurnitureSeatPositionHelper { FurnitureGltfData gltfData = FurnitureGltfCache.get(modelLoc); if (gltfData == null) return null; - FurnitureGltfData.SeatTransform transform = gltfData.seatTransforms().get(seatId); + FurnitureGltfData.SeatTransform transform = gltfData + .seatTransforms() + .get(seatId); if (transform == null) return null; // The seat transform position is in Minecraft model space (post-conversion): @@ -67,7 +71,7 @@ public final class FurnitureSeatPositionHelper { return new double[] { furnitureX + rx, furnitureY + sy, - furnitureZ + rz + furnitureZ + rz, }; } } diff --git a/src/main/java/com/tiedup/remake/v2/furniture/network/PacketFurnitureEscape.java b/src/main/java/com/tiedup/remake/v2/furniture/network/PacketFurnitureEscape.java index bf82958..aed9e83 100644 --- a/src/main/java/com/tiedup/remake/v2/furniture/network/PacketFurnitureEscape.java +++ b/src/main/java/com/tiedup/remake/v2/furniture/network/PacketFurnitureEscape.java @@ -88,7 +88,10 @@ public class PacketFurnitureEscape { ctx.setPacketHandled(true); } - private static void handleOnServer(PacketFurnitureEscape msg, NetworkEvent.Context ctx) { + private static void handleOnServer( + PacketFurnitureEscape msg, + NetworkEvent.Context ctx + ) { ServerPlayer sender = ctx.getSender(); if (sender == null) return; @@ -103,10 +106,14 @@ public class PacketFurnitureEscape { if (!entity.isAlive() || entity.isRemoved()) return; // Validate escape method - if (msg.escapeMethod != METHOD_STRUGGLE && msg.escapeMethod != METHOD_LOCKPICK) { + if ( + msg.escapeMethod != METHOD_STRUGGLE && + msg.escapeMethod != METHOD_LOCKPICK + ) { TiedUpMod.LOGGER.warn( "[PacketFurnitureEscape] Invalid escape method {} from {}", - msg.escapeMethod, sender.getName().getString() + msg.escapeMethod, + sender.getName().getString() ); return; } @@ -133,7 +140,8 @@ public class PacketFurnitureEscape { if (!furnitureEntity.hasPassenger(sender)) { TiedUpMod.LOGGER.debug( "[PacketFurnitureEscape] Struggle: {} is not a passenger of furniture {}", - sender.getName().getString(), furnitureEntity.getId() + sender.getName().getString(), + furnitureEntity.getId() ); return; } @@ -160,12 +168,18 @@ public class PacketFurnitureEscape { // Compute difficulty int baseDifficulty = provider.getLockedDifficulty(seat.id()); int itemBonus = computeItemDifficultyBonus(sender, provider, seat); - int totalDifficulty = Math.min(baseDifficulty + itemBonus, MAX_DIFFICULTY); + int totalDifficulty = Math.min( + baseDifficulty + itemBonus, + MAX_DIFFICULTY + ); TiedUpMod.LOGGER.debug( "[PacketFurnitureEscape] Struggle: {} on seat '{}' — difficulty {} (base {} + items {})", - sender.getName().getString(), seat.id(), - totalDifficulty, baseDifficulty, itemBonus + sender.getName().getString(), + seat.id(), + totalDifficulty, + baseDifficulty, + itemBonus ); // Difficulty 0: immediate escape (no minigame needed) @@ -181,13 +195,16 @@ public class PacketFurnitureEscape { TiedUpMod.LOGGER.info( "[PacketFurnitureEscape] {} escaped furniture {} (difficulty was 0)", - sender.getName().getString(), furnitureEntity.getId() + sender.getName().getString(), + furnitureEntity.getId() ); return; } // Respect server config: if struggle minigame is disabled, skip - if (!com.tiedup.remake.core.ModConfig.SERVER.struggleMiniGameEnabled.get()) { + if ( + !com.tiedup.remake.core.ModConfig.SERVER.struggleMiniGameEnabled.get() + ) { TiedUpMod.LOGGER.debug( "[PacketFurnitureEscape] Struggle minigame disabled by server config" ); @@ -196,9 +213,13 @@ public class PacketFurnitureEscape { // Launch struggle minigame session via StruggleSessionManager StruggleSessionManager manager = StruggleSessionManager.getInstance(); - ContinuousStruggleMiniGameState session = manager.startFurnitureStruggleSession( - sender, furnitureEntity.getId(), seat.id(), totalDifficulty - ); + ContinuousStruggleMiniGameState session = + manager.startFurnitureStruggleSession( + sender, + furnitureEntity.getId(), + seat.id(), + totalDifficulty + ); if (session != null) { // Send START packet to open the struggle GUI on the client @@ -255,7 +276,11 @@ public class PacketFurnitureEscape { // Use look-direction-based seat targeting (same vector math as // EntityFurniture.findNearestOccupiedLockableSeat) instead of // blindly picking the first locked seat. - SeatDefinition targetSeat = findNearestLockedOccupiedSeat(sender, provider, furnitureEntity); + SeatDefinition targetSeat = findNearestLockedOccupiedSeat( + sender, + provider, + furnitureEntity + ); if (targetSeat == null) { TiedUpMod.LOGGER.debug( "[PacketFurnitureEscape] Lockpick: no locked occupied seat found" @@ -264,30 +289,52 @@ public class PacketFurnitureEscape { } // Find the passenger in this seat (needed for item bonus computation) - Entity passenger = findPassengerInSeat(provider, furnitureEntity, targetSeat.id()); + Entity passenger = findPassengerInSeat( + provider, + furnitureEntity, + targetSeat.id() + ); // Compute difficulty int baseDifficulty = provider.getLockedDifficulty(targetSeat.id()); int itemBonus = 0; if (passenger instanceof LivingEntity livingPassenger) { - itemBonus = computeItemDifficultyBonus(livingPassenger, provider, targetSeat); + itemBonus = computeItemDifficultyBonus( + livingPassenger, + provider, + targetSeat + ); } - int totalDifficulty = Math.min(baseDifficulty + itemBonus, MAX_DIFFICULTY); + int totalDifficulty = Math.min( + baseDifficulty + itemBonus, + MAX_DIFFICULTY + ); TiedUpMod.LOGGER.debug( "[PacketFurnitureEscape] Lockpick: {} on seat '{}' -- difficulty {} (base {} + items {})", - sender.getName().getString(), targetSeat.id(), - totalDifficulty, baseDifficulty, itemBonus + sender.getName().getString(), + targetSeat.id(), + totalDifficulty, + baseDifficulty, + itemBonus ); // Difficulty 0: immediate success — unlock + dismount + consume lockpick if (totalDifficulty == 0) { - completeLockpickSuccess(sender, furnitureEntity, provider, targetSeat, passenger); + completeLockpickSuccess( + sender, + furnitureEntity, + provider, + targetSeat, + passenger + ); return; } // Respect server config: if lockpick minigame is disabled, skip - if (!com.tiedup.remake.core.ModConfig.SERVER.lockpickMiniGameEnabled.get()) { + if ( + !com.tiedup.remake.core.ModConfig.SERVER.lockpickMiniGameEnabled.get() + ) { TiedUpMod.LOGGER.debug( "[PacketFurnitureEscape] Lockpick minigame disabled by server config" ); @@ -298,11 +345,15 @@ public class PacketFurnitureEscape { ItemStack lockpickStack = ItemLockpick.findLockpickInInventory(sender); if (lockpickStack.isEmpty()) return; // double-check; hasLockpickInInventory passed above - int remainingUses = lockpickStack.getMaxDamage() - lockpickStack.getDamageValue(); + int remainingUses = + lockpickStack.getMaxDamage() - lockpickStack.getDamageValue(); // Sweet spot width scales inversely with difficulty: harder locks = narrower sweet spot. // Base width 0.15 at difficulty 1, down to 0.03 at MAX_DIFFICULTY. - float sweetSpotWidth = Math.max(0.03f, 0.15f - (totalDifficulty / (float) MAX_DIFFICULTY) * 0.12f); + float sweetSpotWidth = Math.max( + 0.03f, + 0.15f - (totalDifficulty / (float) MAX_DIFFICULTY) * 0.12f + ); // Start lockpick session via LockpickSessionManager. // The existing lockpick session uses a targetSlot (BodyRegionV2 ordinal) for @@ -311,7 +362,8 @@ public class PacketFurnitureEscape { // For now, we use the simplified approach: start the session and let the existing // PacketLockpickAttempt handler manage the sweet-spot interaction. On success, // the furniture-specific completion is handled by a post-session check. - LockpickSessionManager lockpickManager = LockpickSessionManager.getInstance(); + LockpickSessionManager lockpickManager = + LockpickSessionManager.getInstance(); LockpickMiniGameState session = lockpickManager.startLockpickSession( sender, furnitureEntity.getId(), // repurpose targetSlot as entity ID @@ -350,8 +402,11 @@ public class PacketFurnitureEscape { TiedUpMod.LOGGER.info( "[PacketFurnitureEscape] {} started lockpick on seat '{}' of furniture {} (difficulty {}, sweet spot width {})", - sender.getName().getString(), targetSeat.id(), - furnitureEntity.getId(), totalDifficulty, sweetSpotWidth + sender.getName().getString(), + targetSeat.id(), + furnitureEntity.getId(), + totalDifficulty, + sweetSpotWidth ); } @@ -368,7 +423,9 @@ public class PacketFurnitureEscape { ) { provider.setSeatLocked(targetSeat.id(), false); if (passenger instanceof ServerPlayer passengerPlayer) { - passengerPlayer.getPersistentData().remove("tiedup_locked_furniture"); + passengerPlayer + .getPersistentData() + .remove("tiedup_locked_furniture"); } if (passenger != null) { passenger.stopRiding(); @@ -378,7 +435,9 @@ public class PacketFurnitureEscape { ItemStack lockpickStack = ItemLockpick.findLockpickInInventory(sender); if (!lockpickStack.isEmpty()) { lockpickStack.setDamageValue(lockpickStack.getDamageValue() + 1); - if (lockpickStack.getDamageValue() >= lockpickStack.getMaxDamage()) { + if ( + lockpickStack.getDamageValue() >= lockpickStack.getMaxDamage() + ) { lockpickStack.shrink(1); } } @@ -390,7 +449,9 @@ public class PacketFurnitureEscape { TiedUpMod.LOGGER.info( "[PacketFurnitureEscape] {} lockpicked seat '{}' on furniture {} (difficulty was 0)", - sender.getName().getString(), targetSeat.id(), furnitureEntity.getId() + sender.getName().getString(), + targetSeat.id(), + furnitureEntity.getId() ); } @@ -411,8 +472,11 @@ public class PacketFurnitureEscape { return 0; } - Set blockedRegions = provider.getBlockedRegions(seat.id()); - Map equipped = V2EquipmentHelper.getAllEquipped(passenger); + Set blockedRegions = provider.getBlockedRegions( + seat.id() + ); + Map equipped = + V2EquipmentHelper.getAllEquipped(passenger); int bonus = 0; for (Map.Entry entry : equipped.entrySet()) { @@ -436,7 +500,9 @@ public class PacketFurnitureEscape { if (stack.getItem() instanceof ItemLockpick) return true; } // Also check offhand - if (player.getOffhandItem().getItem() instanceof ItemLockpick) return true; + if ( + player.getOffhandItem().getItem() instanceof ItemLockpick + ) return true; return false; } @@ -526,7 +592,9 @@ public class PacketFurnitureEscape { String seatId ) { for (Entity passenger : furnitureEntity.getPassengers()) { - SeatDefinition passengerSeat = provider.getSeatForPassenger(passenger); + SeatDefinition passengerSeat = provider.getSeatForPassenger( + passenger + ); if (passengerSeat != null && passengerSeat.id().equals(seatId)) { return passenger; } diff --git a/src/main/java/com/tiedup/remake/v2/furniture/network/PacketFurnitureForcemount.java b/src/main/java/com/tiedup/remake/v2/furniture/network/PacketFurnitureForcemount.java index ff0f1ac..39eef2f 100644 --- a/src/main/java/com/tiedup/remake/v2/furniture/network/PacketFurnitureForcemount.java +++ b/src/main/java/com/tiedup/remake/v2/furniture/network/PacketFurnitureForcemount.java @@ -1,11 +1,11 @@ package com.tiedup.remake.v2.furniture.network; import com.tiedup.remake.core.TiedUpMod; -import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.items.base.ItemCollar; import com.tiedup.remake.network.PacketRateLimiter; import com.tiedup.remake.state.IBondageState; import com.tiedup.remake.util.KidnappedHelper; +import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.v2.furniture.EntityFurniture; import com.tiedup.remake.v2.furniture.FurnitureDefinition; import com.tiedup.remake.v2.furniture.FurnitureFeedback; @@ -48,7 +48,10 @@ public class PacketFurnitureForcemount { // ==================== Codec ==================== - public static void encode(PacketFurnitureForcemount msg, FriendlyByteBuf buf) { + public static void encode( + PacketFurnitureForcemount msg, + FriendlyByteBuf buf + ) { buf.writeInt(msg.furnitureEntityId); buf.writeUUID(msg.captiveUUID); } @@ -68,7 +71,10 @@ public class PacketFurnitureForcemount { ctx.setPacketHandled(true); } - private static void handleOnServer(PacketFurnitureForcemount msg, NetworkEvent.Context ctx) { + private static void handleOnServer( + PacketFurnitureForcemount msg, + NetworkEvent.Context ctx + ) { ServerPlayer sender = ctx.getSender(); if (sender == null) return; @@ -126,8 +132,10 @@ public class PacketFurnitureForcemount { } ItemStack collarStack = captiveState.getEquipment(BodyRegionV2.NECK); - if (collarStack.isEmpty() - || !(collarStack.getItem() instanceof ItemCollar collar)) { + if ( + collarStack.isEmpty() || + !(collarStack.getItem() instanceof ItemCollar collar) + ) { TiedUpMod.LOGGER.debug( "[PacketFurnitureForcemount] Invalid collar item on captive" ); @@ -174,13 +182,21 @@ public class PacketFurnitureForcemount { FurnitureFeedback feedback = def.feedback(); ResourceLocation mountSoundRL = feedback.mountSound(); if (mountSoundRL != null) { - SoundEvent sound = SoundEvent.createVariableRangeEvent(mountSoundRL); - entity.level().playSound( - null, - entity.getX(), entity.getY(), entity.getZ(), - sound, SoundSource.BLOCKS, - 1.0f, 1.0f + SoundEvent sound = SoundEvent.createVariableRangeEvent( + mountSoundRL ); + entity + .level() + .playSound( + null, + entity.getX(), + entity.getY(), + entity.getZ(), + sound, + SoundSource.BLOCKS, + 1.0f, + 1.0f + ); } } @@ -202,15 +218,20 @@ public class PacketFurnitureForcemount { * Find a living entity by UUID within a reasonable range of the sender. * Checks players first (O(1) lookup), then falls back to entity search. */ - private static LivingEntity findCaptiveByUUID(ServerPlayer sender, UUID uuid) { + private static LivingEntity findCaptiveByUUID( + ServerPlayer sender, + UUID uuid + ) { // Try player lookup first (fast) - net.minecraft.world.entity.player.Player player = - sender.level().getPlayerByUUID(uuid); + net.minecraft.world.entity.player.Player player = sender + .level() + .getPlayerByUUID(uuid); if (player != null) return player; // Search nearby entities (64 block radius) AABB searchBox = sender.getBoundingBox().inflate(64); - for (LivingEntity nearby : sender.level() + for (LivingEntity nearby : sender + .level() .getEntitiesOfClass(LivingEntity.class, searchBox)) { if (nearby.getUUID().equals(uuid)) { return nearby; @@ -224,12 +245,20 @@ public class PacketFurnitureForcemount { * * @return the seat ID, or null if all seats are occupied */ - private static String findFirstAvailableSeat(ISeatProvider provider, Entity furniture) { + private static String findFirstAvailableSeat( + ISeatProvider provider, + Entity furniture + ) { for (SeatDefinition seat : provider.getSeats()) { boolean occupied = false; for (Entity passenger : furniture.getPassengers()) { - SeatDefinition passengerSeat = provider.getSeatForPassenger(passenger); - if (passengerSeat != null && passengerSeat.id().equals(seat.id())) { + SeatDefinition passengerSeat = provider.getSeatForPassenger( + passenger + ); + if ( + passengerSeat != null && + passengerSeat.id().equals(seat.id()) + ) { occupied = true; break; } diff --git a/src/main/java/com/tiedup/remake/v2/furniture/network/PacketFurnitureLock.java b/src/main/java/com/tiedup/remake/v2/furniture/network/PacketFurnitureLock.java index c6cfda1..459d469 100644 --- a/src/main/java/com/tiedup/remake/v2/furniture/network/PacketFurnitureLock.java +++ b/src/main/java/com/tiedup/remake/v2/furniture/network/PacketFurnitureLock.java @@ -63,7 +63,10 @@ public class PacketFurnitureLock { ctx.setPacketHandled(true); } - private static void handleOnServer(PacketFurnitureLock msg, NetworkEvent.Context ctx) { + private static void handleOnServer( + PacketFurnitureLock msg, + NetworkEvent.Context ctx + ) { ServerPlayer sender = ctx.getSender(); if (sender == null) return; @@ -78,8 +81,9 @@ public class PacketFurnitureLock { if (!entity.isAlive() || entity.isRemoved()) return; // Sender must hold a key item in either hand - boolean hasKey = (sender.getMainHandItem().getItem() instanceof ItemMasterKey) - || (sender.getOffhandItem().getItem() instanceof ItemMasterKey); + boolean hasKey = + (sender.getMainHandItem().getItem() instanceof ItemMasterKey) || + (sender.getOffhandItem().getItem() instanceof ItemMasterKey); if (!hasKey) { TiedUpMod.LOGGER.debug( "[PacketFurnitureLock] {} does not hold a key item in either hand", @@ -93,7 +97,8 @@ public class PacketFurnitureLock { if (seat == null) { TiedUpMod.LOGGER.debug( "[PacketFurnitureLock] Seat '{}' not found on entity {}", - msg.seatId, msg.entityId + msg.seatId, + msg.entityId ); return; } @@ -135,22 +140,32 @@ public class PacketFurnitureLock { ? feedback.unlockSound() : feedback.lockSound(); if (soundRL != null) { - SoundEvent sound = SoundEvent.createVariableRangeEvent(soundRL); - entity.level().playSound( - null, // null = play for all nearby players - entity.getX(), entity.getY(), entity.getZ(), - sound, SoundSource.BLOCKS, - 1.0f, 1.0f + SoundEvent sound = SoundEvent.createVariableRangeEvent( + soundRL ); + entity + .level() + .playSound( + null, // null = play for all nearby players + entity.getX(), + entity.getY(), + entity.getZ(), + sound, + SoundSource.BLOCKS, + 1.0f, + 1.0f + ); } } // Set lock/unlock animation state. The next updateAnimState() call // (from tick or passenger change) will reset it to OCCUPIED/IDLE. boolean nowLocked = !wasLocked; - furniture.setAnimState(nowLocked - ? EntityFurniture.STATE_LOCKING - : EntityFurniture.STATE_UNLOCKING); + furniture.setAnimState( + nowLocked + ? EntityFurniture.STATE_LOCKING + : EntityFurniture.STATE_UNLOCKING + ); // Broadcast updated state to all tracking clients PacketSyncFurnitureState.sendToTracking(furniture); @@ -162,7 +177,10 @@ public class PacketFurnitureLock { /** * Find a SeatDefinition by ID from the provider's seat list. */ - private static SeatDefinition findSeatById(ISeatProvider provider, String seatId) { + private static SeatDefinition findSeatById( + ISeatProvider provider, + String seatId + ) { for (SeatDefinition seat : provider.getSeats()) { if (seat.id().equals(seatId)) return seat; } @@ -178,7 +196,9 @@ public class PacketFurnitureLock { String seatId ) { for (Entity passenger : furnitureEntity.getPassengers()) { - SeatDefinition passengerSeat = provider.getSeatForPassenger(passenger); + SeatDefinition passengerSeat = provider.getSeatForPassenger( + passenger + ); if (passengerSeat != null && passengerSeat.id().equals(seatId)) { return true; } diff --git a/src/main/java/com/tiedup/remake/v2/furniture/network/PacketSyncFurnitureDefinitions.java b/src/main/java/com/tiedup/remake/v2/furniture/network/PacketSyncFurnitureDefinitions.java index 55e4392..94ccfc4 100644 --- a/src/main/java/com/tiedup/remake/v2/furniture/network/PacketSyncFurnitureDefinitions.java +++ b/src/main/java/com/tiedup/remake/v2/furniture/network/PacketSyncFurnitureDefinitions.java @@ -40,7 +40,9 @@ import org.apache.logging.log4j.Logger; */ public class PacketSyncFurnitureDefinitions { - private static final Logger LOGGER = LogManager.getLogger("PacketSyncFurnitureDefinitions"); + private static final Logger LOGGER = LogManager.getLogger( + "PacketSyncFurnitureDefinitions" + ); /** * Safety cap on the number of definitions to prevent memory exhaustion @@ -65,13 +67,18 @@ public class PacketSyncFurnitureDefinitions { private final Map definitions; - public PacketSyncFurnitureDefinitions(Map definitions) { + public PacketSyncFurnitureDefinitions( + Map definitions + ) { this.definitions = definitions; } // ==================== Codec ==================== - public static void encode(PacketSyncFurnitureDefinitions msg, FriendlyByteBuf buf) { + public static void encode( + PacketSyncFurnitureDefinitions msg, + FriendlyByteBuf buf + ) { buf.writeVarInt(msg.definitions.size()); for (FurnitureDefinition def : msg.definitions.values()) { @@ -91,7 +98,9 @@ public class PacketSyncFurnitureDefinitions { // Tint channels buf.writeVarInt(def.tintChannels().size()); - for (Map.Entry entry : def.tintChannels().entrySet()) { + for (Map.Entry entry : def + .tintChannels() + .entrySet()) { buf.writeUtf(entry.getKey()); buf.writeInt(entry.getValue()); } @@ -138,7 +147,10 @@ public class PacketSyncFurnitureDefinitions { buf.writeBoolean(seat.itemDifficultyBonus()); } - private static void encodeFeedback(FurnitureFeedback feedback, FriendlyByteBuf buf) { + private static void encodeFeedback( + FurnitureFeedback feedback, + FriendlyByteBuf buf + ) { writeOptionalRL(buf, feedback.mountSound()); writeOptionalRL(buf, feedback.lockSound()); writeOptionalRL(buf, feedback.unlockSound()); @@ -147,7 +159,10 @@ public class PacketSyncFurnitureDefinitions { writeOptionalRL(buf, feedback.deniedSound()); } - private static void writeOptionalRL(FriendlyByteBuf buf, ResourceLocation rl) { + private static void writeOptionalRL( + FriendlyByteBuf buf, + ResourceLocation rl + ) { buf.writeBoolean(rl != null); if (rl != null) { buf.writeResourceLocation(rl); @@ -203,11 +218,23 @@ public class PacketSyncFurnitureDefinitions { ResourceLocation icon = readOptionalRL(buf); FurnitureDefinition def = new FurnitureDefinition( - id, displayName, translationKey, modelLocation, - Map.copyOf(tintChannels), supportsColor, - hitboxWidth, hitboxHeight, snapToWall, floorOnly, - lockable, breakResistance, dropOnBreak, - List.copyOf(seats), feedback, category, icon + id, + displayName, + translationKey, + modelLocation, + Map.copyOf(tintChannels), + supportsColor, + hitboxWidth, + hitboxHeight, + snapToWall, + floorOnly, + lockable, + breakResistance, + dropOnBreak, + List.copyOf(seats), + feedback, + category, + icon ); defs.put(id, def); @@ -235,8 +262,12 @@ public class PacketSyncFurnitureDefinitions { boolean itemDifficultyBonus = buf.readBoolean(); return new SeatDefinition( - id, armatureName, Set.copyOf(blockedRegions), - lockable, lockedDifficulty, itemDifficultyBonus + id, + armatureName, + Set.copyOf(blockedRegions), + lockable, + lockedDifficulty, + itemDifficultyBonus ); } @@ -249,8 +280,12 @@ public class PacketSyncFurnitureDefinitions { ResourceLocation deniedSound = readOptionalRL(buf); return new FurnitureFeedback( - mountSound, lockSound, unlockSound, - struggleLoopSound, escapeSound, deniedSound + mountSound, + lockSound, + unlockSound, + struggleLoopSound, + escapeSound, + deniedSound ); } @@ -276,8 +311,10 @@ public class PacketSyncFurnitureDefinitions { @OnlyIn(Dist.CLIENT) private static void handleOnClient(PacketSyncFurnitureDefinitions msg) { FurnitureRegistry.reload(msg.definitions); - LOGGER.debug("Client received {} furniture definitions from server", - msg.definitions.size()); + LOGGER.debug( + "Client received {} furniture definitions from server", + msg.definitions.size() + ); } // ==================== Server-side Helpers ==================== diff --git a/src/main/java/com/tiedup/remake/v2/furniture/network/PacketSyncFurnitureState.java b/src/main/java/com/tiedup/remake/v2/furniture/network/PacketSyncFurnitureState.java index 9d7dcd5..97ea77d 100644 --- a/src/main/java/com/tiedup/remake/v2/furniture/network/PacketSyncFurnitureState.java +++ b/src/main/java/com/tiedup/remake/v2/furniture/network/PacketSyncFurnitureState.java @@ -33,7 +33,11 @@ public class PacketSyncFurnitureState { private final byte lockBits; private final byte animState; - public PacketSyncFurnitureState(int entityId, byte lockBits, byte animState) { + public PacketSyncFurnitureState( + int entityId, + byte lockBits, + byte animState + ) { this.entityId = entityId; this.lockBits = lockBits; this.animState = animState; @@ -41,7 +45,10 @@ public class PacketSyncFurnitureState { // ==================== Codec ==================== - public static void encode(PacketSyncFurnitureState msg, FriendlyByteBuf buf) { + public static void encode( + PacketSyncFurnitureState msg, + FriendlyByteBuf buf + ) { buf.writeInt(msg.entityId); buf.writeByte(msg.lockBits); buf.writeByte(msg.animState); diff --git a/src/main/java/com/tiedup/remake/worldgen/AbstractKidnapperStructure.java b/src/main/java/com/tiedup/remake/worldgen/AbstractKidnapperStructure.java index 5a7a223..b179dbc 100644 --- a/src/main/java/com/tiedup/remake/worldgen/AbstractKidnapperStructure.java +++ b/src/main/java/com/tiedup/remake/worldgen/AbstractKidnapperStructure.java @@ -13,7 +13,6 @@ import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilde /** * Abstract base class for kidnapper structure types. * - * Phase 3: Refactoring - Consolidates common structure generation logic * * Subclasses: * - KidnapperCampStructure: Small, 2 tents diff --git a/src/main/java/com/tiedup/remake/worldgen/HangingCagePiece.java b/src/main/java/com/tiedup/remake/worldgen/HangingCagePiece.java index bc6c82f..d5c333b 100644 --- a/src/main/java/com/tiedup/remake/worldgen/HangingCagePiece.java +++ b/src/main/java/com/tiedup/remake/worldgen/HangingCagePiece.java @@ -298,7 +298,6 @@ public class HangingCagePiece extends StructurePiece { int baseZ = centerZ - 6; int floorY = candidatePos.getY() - 5; - // Phase 1: Shell — walls, floor, ceiling, air interior for (int rx = 0; rx < ROOM; rx++) { for (int rz = 0; rz < ROOM; rz++) { if (!layout.isInShape(rx, rz)) continue; @@ -356,7 +355,6 @@ public class HangingCagePiece extends StructurePiece { } } - // Phase 2: Theme-specific decorations theme.placeDecorations( level, random, @@ -367,7 +365,6 @@ public class HangingCagePiece extends StructurePiece { chunkBB ); - // Phase 2b: Shared structural features RoomTheme.placeSharedPillars( level, random, @@ -416,11 +413,9 @@ public class HangingCagePiece extends StructurePiece { chunkBB ); - // Phase 2c: Chests placeVanillaChest(level, random, baseX, baseZ, floorY, layout, chunkBB); placeTrappedChest(level, random, baseX, baseZ, floorY, layout, chunkBB); - // Phase 3: Iron bars from ry=7 to ry=10 at center [6,6] for (int ry = 7; ry <= 10; ry++) { safeSetBlock( level, @@ -430,7 +425,6 @@ public class HangingCagePiece extends StructurePiece { ); } - // Phase 4: Pet Cage at [6,6] ry=5 BlockPos masterPos = new BlockPos(centerX, floorY + 5, centerZ); BlockState masterState = V2Blocks.PET_CAGE.get() diff --git a/src/main/java/com/tiedup/remake/worldgen/KidnapperFortressStructure.java b/src/main/java/com/tiedup/remake/worldgen/KidnapperFortressStructure.java index 1cc5d21..b53987b 100644 --- a/src/main/java/com/tiedup/remake/worldgen/KidnapperFortressStructure.java +++ b/src/main/java/com/tiedup/remake/worldgen/KidnapperFortressStructure.java @@ -12,7 +12,6 @@ import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilde /** * Kidnapper Fortress - Large, rare structure. * - * Phase 4: Kidnapper Revamp - Varied Structures * * The largest kidnapper structure type. * Contains: diff --git a/src/main/java/com/tiedup/remake/worldgen/KidnapperOutpostStructure.java b/src/main/java/com/tiedup/remake/worldgen/KidnapperOutpostStructure.java index 6cdd23a..9a57688 100644 --- a/src/main/java/com/tiedup/remake/worldgen/KidnapperOutpostStructure.java +++ b/src/main/java/com/tiedup/remake/worldgen/KidnapperOutpostStructure.java @@ -11,7 +11,6 @@ import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilde /** * Kidnapper Outpost - Medium-sized structure. * - * Phase 4: Kidnapper Revamp - Varied Structures * * Single-piece structure that spawns on flat terrain (like fortress). * Uses kidnap_outpost.nbt template. diff --git a/src/main/java/com/tiedup/remake/worldgen/ModStructures.java b/src/main/java/com/tiedup/remake/worldgen/ModStructures.java index 2ea3396..8a76100 100644 --- a/src/main/java/com/tiedup/remake/worldgen/ModStructures.java +++ b/src/main/java/com/tiedup/remake/worldgen/ModStructures.java @@ -11,7 +11,6 @@ import net.minecraftforge.registries.RegistryObject; * Registry for custom structures. * * Phase: Kidnapper Revamp - Cell System - * Phase 4: Added Outpost and Fortress structures */ public class ModStructures { diff --git a/src/main/java/com/tiedup/remake/worldgen/RoomTheme.java b/src/main/java/com/tiedup/remake/worldgen/RoomTheme.java index 67e9af0..7c06ada 100644 --- a/src/main/java/com/tiedup/remake/worldgen/RoomTheme.java +++ b/src/main/java/com/tiedup/remake/worldgen/RoomTheme.java @@ -30,11 +30,8 @@ enum RoomTheme { int rz, boolean isEdge ) { - boolean isCorner = - (rx == 1 || rx == 11) && (rz == 1 || rz == 11); - if ( - isCorner - ) return Blocks.MOSSY_COBBLESTONE.defaultBlockState(); + boolean isCorner = (rx == 1 || rx == 11) && (rz == 1 || rz == 11); + if (isCorner) return Blocks.MOSSY_COBBLESTONE.defaultBlockState(); return r.nextFloat() < 0.15f ? Blocks.COBBLESTONE.defaultBlockState() : Blocks.DEEPSLATE_TILES.defaultBlockState(); @@ -66,26 +63,17 @@ enum RoomTheme { // Cobwebs at corners (low + high) for (int[] c : corners) { if ( - layout.isInShape(c[0], c[1]) && - !layout.isWall(c[0], c[1]) + layout.isInShape(c[0], c[1]) && !layout.isWall(c[0], c[1]) ) { HangingCagePiece.safeSetBlock( level, - new BlockPos( - baseX + c[0], - floorY + 1, - baseZ + c[1] - ), + new BlockPos(baseX + c[0], floorY + 1, baseZ + c[1]), Blocks.COBWEB.defaultBlockState(), chunkBB ); HangingCagePiece.safeSetBlock( level, - new BlockPos( - baseX + c[0], - floorY + 9, - baseZ + c[1] - ), + new BlockPos(baseX + c[0], floorY + 9, baseZ + c[1]), Blocks.COBWEB.defaultBlockState(), chunkBB ); @@ -137,9 +125,7 @@ enum RoomTheme { chunkBB ); int fcx2 = fcx + (fcx < 6 ? 1 : -1); - if ( - layout.isInShape(fcx2, fcz) && !layout.isWall(fcx2, fcz) - ) { + if (layout.isInShape(fcx2, fcz) && !layout.isWall(fcx2, fcz)) { HangingCagePiece.safeSetBlock( level, new BlockPos(baseX + fcx2, floorY + 1, baseZ + fcz), @@ -160,13 +146,7 @@ enum RoomTheme { // Side chains placeSharedChains(level, baseX, baseZ, floorY, chunkBB); // Hanging lanterns - placeSharedHangingLanterns( - level, - baseX, - baseZ, - floorY, - chunkBB - ); + placeSharedHangingLanterns(level, baseX, baseZ, floorY, chunkBB); } @Override @@ -240,8 +220,7 @@ enum RoomTheme { // Soul fire at corners: soul_sand at ry=0, soul_fire at ry=1 for (int[] c : corners) { if ( - layout.isInShape(c[0], c[1]) && - !layout.isWall(c[0], c[1]) + layout.isInShape(c[0], c[1]) && !layout.isWall(c[0], c[1]) ) { HangingCagePiece.safeSetBlock( level, @@ -251,11 +230,7 @@ enum RoomTheme { ); HangingCagePiece.safeSetBlock( level, - new BlockPos( - baseX + c[0], - floorY + 1, - baseZ + c[1] - ), + new BlockPos(baseX + c[0], floorY + 1, baseZ + c[1]), Blocks.SOUL_FIRE.defaultBlockState(), chunkBB ); @@ -306,9 +281,7 @@ enum RoomTheme { int[] ifc = icorners[1]; int ifcx = ifc[0] + (ifc[0] < 6 ? 1 : -1); int ifcz = ifc[1] + (ifc[1] < 6 ? 1 : -1); - if ( - layout.isInShape(ifcx, ifcz) && !layout.isWall(ifcx, ifcz) - ) { + if (layout.isInShape(ifcx, ifcz) && !layout.isWall(ifcx, ifcz)) { HangingCagePiece.safeSetBlock( level, new BlockPos(baseX + ifcx, floorY + 1, baseZ + ifcz), @@ -317,16 +290,11 @@ enum RoomTheme { ); int ifcx2 = ifcx + (ifcx < 6 ? 1 : -1); if ( - layout.isInShape(ifcx2, ifcz) && - !layout.isWall(ifcx2, ifcz) + layout.isInShape(ifcx2, ifcz) && !layout.isWall(ifcx2, ifcz) ) { HangingCagePiece.safeSetBlock( level, - new BlockPos( - baseX + ifcx2, - floorY + 1, - baseZ + ifcz - ), + new BlockPos(baseX + ifcx2, floorY + 1, baseZ + ifcz), Blocks.LAVA_CAULDRON.defaultBlockState(), chunkBB ); @@ -350,13 +318,7 @@ enum RoomTheme { // Side chains placeSharedChains(level, baseX, baseZ, floorY, chunkBB); // Hanging lanterns - placeSharedHangingLanterns( - level, - baseX, - baseZ, - floorY, - chunkBB - ); + placeSharedHangingLanterns(level, baseX, baseZ, floorY, chunkBB); } @Override @@ -372,9 +334,7 @@ enum RoomTheme { public BlockState scatterBlock(RandomSource r) { float f = r.nextFloat(); if (f < 0.40f) return Blocks.SOUL_SAND.defaultBlockState(); - if ( - f < 0.70f - ) return Blocks.NETHER_WART_BLOCK.defaultBlockState(); + if (f < 0.70f) return Blocks.NETHER_WART_BLOCK.defaultBlockState(); return Blocks.BONE_BLOCK.defaultBlockState(); } @@ -390,9 +350,7 @@ enum RoomTheme { if ( ry == 1 && f < 0.20f ) return Blocks.MOSSY_COBBLESTONE.defaultBlockState(); - if ( - f < 0.15f - ) return Blocks.MOSSY_STONE_BRICKS.defaultBlockState(); + if (f < 0.15f) return Blocks.MOSSY_STONE_BRICKS.defaultBlockState(); if ( f < 0.30f ) return Blocks.CRACKED_STONE_BRICKS.defaultBlockState(); @@ -406,11 +364,8 @@ enum RoomTheme { int rz, boolean isEdge ) { - boolean isCorner = - (rx == 1 || rx == 11) && (rz == 1 || rz == 11); - if ( - isCorner - ) return Blocks.MOSSY_COBBLESTONE.defaultBlockState(); + boolean isCorner = (rx == 1 || rx == 11) && (rz == 1 || rz == 11); + if (isCorner) return Blocks.MOSSY_COBBLESTONE.defaultBlockState(); return r.nextFloat() < 0.20f ? Blocks.COBBLESTONE.defaultBlockState() : Blocks.STONE_BRICKS.defaultBlockState(); @@ -442,26 +397,17 @@ enum RoomTheme { // Cobwebs at corners (low + high) for (int[] c : corners) { if ( - layout.isInShape(c[0], c[1]) && - !layout.isWall(c[0], c[1]) + layout.isInShape(c[0], c[1]) && !layout.isWall(c[0], c[1]) ) { HangingCagePiece.safeSetBlock( level, - new BlockPos( - baseX + c[0], - floorY + 1, - baseZ + c[1] - ), + new BlockPos(baseX + c[0], floorY + 1, baseZ + c[1]), Blocks.COBWEB.defaultBlockState(), chunkBB ); HangingCagePiece.safeSetBlock( level, - new BlockPos( - baseX + c[0], - floorY + 9, - baseZ + c[1] - ), + new BlockPos(baseX + c[0], floorY + 9, baseZ + c[1]), Blocks.COBWEB.defaultBlockState(), chunkBB ); @@ -499,8 +445,7 @@ enum RoomTheme { // Skull in first corner int[] sc = corners[0]; if ( - layout.isInShape(sc[0], sc[1]) && - !layout.isWall(sc[0], sc[1]) + layout.isInShape(sc[0], sc[1]) && !layout.isWall(sc[0], sc[1]) ) { HangingCagePiece.safeSetBlock( level, @@ -513,9 +458,7 @@ enum RoomTheme { int[] cfc = corners[1]; int cfcx = cfc[0] + (cfc[0] < 6 ? 1 : -1); int cfcz = cfc[1] + (cfc[1] < 6 ? 1 : -1); - if ( - layout.isInShape(cfcx, cfcz) && !layout.isWall(cfcx, cfcz) - ) { + if (layout.isInShape(cfcx, cfcz) && !layout.isWall(cfcx, cfcz)) { HangingCagePiece.safeSetBlock( level, new BlockPos(baseX + cfcx, floorY + 1, baseZ + cfcz), @@ -524,16 +467,11 @@ enum RoomTheme { ); int cfcx2 = cfcx + (cfcx < 6 ? 1 : -1); if ( - layout.isInShape(cfcx2, cfcz) && - !layout.isWall(cfcx2, cfcz) + layout.isInShape(cfcx2, cfcz) && !layout.isWall(cfcx2, cfcz) ) { HangingCagePiece.safeSetBlock( level, - new BlockPos( - baseX + cfcx2, - floorY + 1, - baseZ + cfcz - ), + new BlockPos(baseX + cfcx2, floorY + 1, baseZ + cfcz), Blocks.CANDLE.defaultBlockState() .setValue(BlockStateProperties.CANDLES, 4) .setValue(BlockStateProperties.LIT, true), @@ -542,13 +480,7 @@ enum RoomTheme { } } placeSharedChains(level, baseX, baseZ, floorY, chunkBB); - placeSharedHangingLanterns( - level, - baseX, - baseZ, - floorY, - chunkBB - ); + placeSharedHangingLanterns(level, baseX, baseZ, floorY, chunkBB); } @Override @@ -623,16 +555,11 @@ enum RoomTheme { // Snow layers in corners for (int[] c : corners) { if ( - layout.isInShape(c[0], c[1]) && - !layout.isWall(c[0], c[1]) + layout.isInShape(c[0], c[1]) && !layout.isWall(c[0], c[1]) ) { HangingCagePiece.safeSetBlock( level, - new BlockPos( - baseX + c[0], - floorY + 1, - baseZ + c[1] - ), + new BlockPos(baseX + c[0], floorY + 1, baseZ + c[1]), Blocks.SNOW.defaultBlockState().setValue( net.minecraft.world.level.block.SnowLayerBlock.LAYERS, 2 + random.nextInt(3) @@ -679,8 +606,7 @@ enum RoomTheme { int ifc2x = ifc2[0] + (ifc2[0] < 6 ? 1 : -1); int ifc2z = ifc2[1] + (ifc2[1] < 6 ? 1 : -1); if ( - layout.isInShape(ifc2x, ifc2z) && - !layout.isWall(ifc2x, ifc2z) + layout.isInShape(ifc2x, ifc2z) && !layout.isWall(ifc2x, ifc2z) ) { HangingCagePiece.safeSetBlock( level, @@ -698,11 +624,7 @@ enum RoomTheme { ) { HangingCagePiece.safeSetBlock( level, - new BlockPos( - baseX + ifc2x2, - floorY + 1, - baseZ + ifc2z - ), + new BlockPos(baseX + ifc2x2, floorY + 1, baseZ + ifc2z), Blocks.BLUE_ICE.defaultBlockState(), chunkBB ); @@ -724,20 +646,12 @@ enum RoomTheme { } } placeSharedChains(level, baseX, baseZ, floorY, chunkBB); - placeSharedHangingLanterns( - level, - baseX, - baseZ, - floorY, - chunkBB - ); + placeSharedHangingLanterns(level, baseX, baseZ, floorY, chunkBB); } @Override public BlockState pillarBlock(RandomSource r, int ry) { - if ( - ry == 1 || ry == 10 - ) return Blocks.BLUE_ICE.defaultBlockState(); + if (ry == 1 || ry == 10) return Blocks.BLUE_ICE.defaultBlockState(); return r.nextFloat() < 0.5f ? Blocks.PACKED_ICE.defaultBlockState() : Blocks.BLUE_ICE.defaultBlockState(); @@ -853,8 +767,7 @@ enum RoomTheme { int[][] corners = layout.innerCorners(); int[] sc = corners[0]; if ( - layout.isInShape(sc[0], sc[1]) && - !layout.isWall(sc[0], sc[1]) + layout.isInShape(sc[0], sc[1]) && !layout.isWall(sc[0], sc[1]) ) { HangingCagePiece.safeSetBlock( level, @@ -868,9 +781,7 @@ enum RoomTheme { int[] sfc = scorners[1]; int sfcx = sfc[0] + (sfc[0] < 6 ? 1 : -1); int sfcz = sfc[1] + (sfc[1] < 6 ? 1 : -1); - if ( - layout.isInShape(sfcx, sfcz) && !layout.isWall(sfcx, sfcz) - ) { + if (layout.isInShape(sfcx, sfcz) && !layout.isWall(sfcx, sfcz)) { HangingCagePiece.safeSetBlock( level, new BlockPos(baseX + sfcx, floorY + 1, baseZ + sfcz), @@ -879,16 +790,11 @@ enum RoomTheme { ); int sfcx2 = sfcx + (sfcx < 6 ? 1 : -1); if ( - layout.isInShape(sfcx2, sfcz) && - !layout.isWall(sfcx2, sfcz) + layout.isInShape(sfcx2, sfcz) && !layout.isWall(sfcx2, sfcz) ) { HangingCagePiece.safeSetBlock( level, - new BlockPos( - baseX + sfcx2, - floorY + 1, - baseZ + sfcz - ), + new BlockPos(baseX + sfcx2, floorY + 1, baseZ + sfcz), Blocks.SCULK_SENSOR.defaultBlockState(), chunkBB ); @@ -912,20 +818,12 @@ enum RoomTheme { } } placeSharedChains(level, baseX, baseZ, floorY, chunkBB); - placeSharedHangingLanterns( - level, - baseX, - baseZ, - floorY, - chunkBB - ); + placeSharedHangingLanterns(level, baseX, baseZ, floorY, chunkBB); } @Override public BlockState pillarBlock(RandomSource r, int ry) { - if ( - ry == 1 || ry == 10 - ) return Blocks.SCULK.defaultBlockState(); + if (ry == 1 || ry == 10) return Blocks.SCULK.defaultBlockState(); return r.nextFloat() < 0.3f ? Blocks.SCULK.defaultBlockState() : Blocks.DEEPSLATE_TILE_WALL.defaultBlockState(); @@ -949,9 +847,7 @@ enum RoomTheme { @Override public BlockState wallBlock(RandomSource r, int ry) { float f = r.nextFloat(); - if ( - f < 0.10f - ) return Blocks.CHISELED_SANDSTONE.defaultBlockState(); + if (f < 0.10f) return Blocks.CHISELED_SANDSTONE.defaultBlockState(); if (f < 0.30f) return Blocks.SANDSTONE.defaultBlockState(); return Blocks.CUT_SANDSTONE.defaultBlockState(); } @@ -1043,8 +939,7 @@ enum RoomTheme { int[][] corners = layout.innerCorners(); int[] tc = corners[0]; if ( - layout.isInShape(tc[0], tc[1]) && - !layout.isWall(tc[0], tc[1]) + layout.isInShape(tc[0], tc[1]) && !layout.isWall(tc[0], tc[1]) ) { HangingCagePiece.safeSetBlock( level, @@ -1058,8 +953,7 @@ enum RoomTheme { int ssfcx = ssfc[0] + (ssfc[0] < 6 ? 1 : -1); int ssfcz = ssfc[1] + (ssfc[1] < 6 ? 1 : -1); if ( - layout.isInShape(ssfcx, ssfcz) && - !layout.isWall(ssfcx, ssfcz) + layout.isInShape(ssfcx, ssfcz) && !layout.isWall(ssfcx, ssfcz) ) { HangingCagePiece.safeSetBlock( level, @@ -1074,11 +968,7 @@ enum RoomTheme { ) { HangingCagePiece.safeSetBlock( level, - new BlockPos( - baseX + ssfcx2, - floorY + 1, - baseZ + ssfcz - ), + new BlockPos(baseX + ssfcx2, floorY + 1, baseZ + ssfcz), Blocks.FLOWER_POT.defaultBlockState(), chunkBB ); @@ -1100,13 +990,7 @@ enum RoomTheme { } } placeSharedChains(level, baseX, baseZ, floorY, chunkBB); - placeSharedHangingLanterns( - level, - baseX, - baseZ, - floorY, - chunkBB - ); + placeSharedHangingLanterns(level, baseX, baseZ, floorY, chunkBB); } @Override @@ -1225,19 +1109,13 @@ enum RoomTheme { // Skip cage center area (5-7, 5-7) if (rx >= 5 && rx <= 7 && rz >= 5 && rz <= 7) continue; // Skip corner positions (used by decorations/chests) - if ( - (rx <= 2 || rx >= 10) && (rz <= 2 || rz >= 10) - ) continue; + if ((rx <= 2 || rx >= 10) && (rz <= 2 || rz >= 10)) continue; if (random.nextFloat() < 0.12f) { BlockState scatter = theme.scatterBlock(random); if (scatter != null) { HangingCagePiece.safeSetBlock( level, - new BlockPos( - baseX + rx, - floorY + 1, - baseZ + rz - ), + new BlockPos(baseX + rx, floorY + 1, baseZ + rz), scatter, chunkBB ); @@ -1280,11 +1158,7 @@ enum RoomTheme { ) { HangingCagePiece.safeSetBlock( level, - new BlockPos( - baseX + pos[0], - floorY + 10, - baseZ + pos[1] - ), + new BlockPos(baseX + pos[0], floorY + 10, baseZ + pos[1]), Blocks.COBWEB.defaultBlockState(), chunkBB ); @@ -1300,21 +1174,13 @@ enum RoomTheme { ) { HangingCagePiece.safeSetBlock( level, - new BlockPos( - baseX + pos[0], - floorY + 10, - baseZ + pos[1] - ), + new BlockPos(baseX + pos[0], floorY + 10, baseZ + pos[1]), Blocks.CHAIN.defaultBlockState(), chunkBB ); HangingCagePiece.safeSetBlock( level, - new BlockPos( - baseX + pos[0], - floorY + 9, - baseZ + pos[1] - ), + new BlockPos(baseX + pos[0], floorY + 9, baseZ + pos[1]), Blocks.CHAIN.defaultBlockState(), chunkBB ); @@ -1346,11 +1212,7 @@ enum RoomTheme { ) { HangingCagePiece.safeSetBlock( level, - new BlockPos( - baseX + pos[0], - floorY + 1, - baseZ + pos[1] - ), + new BlockPos(baseX + pos[0], floorY + 1, baseZ + pos[1]), Blocks.LANTERN.defaultBlockState(), chunkBB ); @@ -1368,9 +1230,7 @@ enum RoomTheme { { 12, 8 }, }; for (int[] pos : wallSconces) { - if ( - layout.isWall(pos[0], pos[1]) && random.nextFloat() < 0.5f - ) { + if (layout.isWall(pos[0], pos[1]) && random.nextFloat() < 0.5f) { Direction torchDir = getTorchDirection(pos[0], pos[1]); if (torchDir != null) { HangingCagePiece.safeSetBlock( @@ -1420,22 +1280,14 @@ enum RoomTheme { // Band at ry=5 HangingCagePiece.safeSetBlock( level, - new BlockPos( - baseX + pos[0], - floorY + 5, - baseZ + pos[1] - ), + new BlockPos(baseX + pos[0], floorY + 5, baseZ + pos[1]), theme.wallAccentBlock(), chunkBB ); // Optional band at ry=8 HangingCagePiece.safeSetBlock( level, - new BlockPos( - baseX + pos[0], - floorY + 8, - baseZ + pos[1] - ), + new BlockPos(baseX + pos[0], floorY + 8, baseZ + pos[1]), theme.wallAccentBlock(), chunkBB );