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.
This commit is contained in:
NotEvil
2026-04-12 01:24:49 +02:00
parent 73d70e212d
commit a71093ba9c
482 changed files with 8500 additions and 5155 deletions

View File

@@ -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);
}

View File

@@ -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<EntityFurniture> 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;
}

View File

@@ -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
*

View File

@@ -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
*

View File

@@ -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,

View File

@@ -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.

View File

@@ -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
*/

View File

@@ -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)
*/

View File

@@ -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;

View File

@@ -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
)
);
}
}

View File

@@ -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
)
);
}
}

View File

@@ -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(

View File

@@ -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
);
}
}

View File

@@ -32,30 +32,32 @@ public class PacketEndConversationC2S {
}
public void handle(Supplier<NetworkEvent.Context> 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);
}

View File

@@ -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 {}",

View File

@@ -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 {

View File

@@ -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.

View File

@@ -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 {

View File

@@ -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.

View File

@@ -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

View File

@@ -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(

View File

@@ -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

View File

@@ -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();
}

View File

@@ -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;

View File

@@ -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

View File

@@ -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();
}

View File

@@ -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<NetworkEvent.Context> ctx) {

View File

@@ -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;
}

View File

@@ -9,5 +9,5 @@ public enum NpcCommandType {
CANCEL_COMMAND,
SELECT_JOB,
CYCLE_FOLLOW_DISTANCE,
TOGGLE_AUTO_REST
TOGGLE_AUTO_REST,
}

View File

@@ -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<NetworkEvent.Context> 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
);
}
}

View File

@@ -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;

View File

@@ -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 {

View File

@@ -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();

View File

@@ -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<NetworkEvent.Context> ctxSupplier) {
public static void handle(
PacketMasterEquip msg,
Supplier<NetworkEvent.Context> 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);
}
}
}

View File

@@ -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,

View File

@@ -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

View File

@@ -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
);
}
}
}

View File

@@ -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,

View File

@@ -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"
);
}
}
}

View File

@@ -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 =

View File

@@ -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;

View File

@@ -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<com.tiedup.remake.client.gui.screens.SlaveTraderScreen.CaptiveOffer> 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
)
);
}
}