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:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
*
|
||||
|
||||
@@ -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
|
||||
*
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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)
|
||||
*/
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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 {}",
|
||||
|
||||
@@ -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 {
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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 {
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -9,5 +9,5 @@ public enum NpcCommandType {
|
||||
CANCEL_COMMAND,
|
||||
SELECT_JOB,
|
||||
CYCLE_FOLLOW_DISTANCE,
|
||||
TOGGLE_AUTO_REST
|
||||
TOGGLE_AUTO_REST,
|
||||
}
|
||||
|
||||
@@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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"
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 =
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user