Files
TiedUp-/src/main/java/com/tiedup/remake/state/components/PlayerClothesPermission.java
NotEvil f6466360b6 Clean repo for open source release
Remove build artifacts, dev tool configs, unused dependencies,
and third-party source dumps. Add proper README, update .gitignore,
clean up Makefile.
2026-04-12 00:51:22 +02:00

150 lines
5.0 KiB
Java

package com.tiedup.remake.state.components;
import com.tiedup.remake.v2.bondage.IV2BondageItem;
import com.tiedup.remake.state.hosts.IPlayerBindStateHost;
import com.tiedup.remake.v2.BodyRegionV2;
import com.tiedup.remake.v2.bondage.IV2BondageEquipment;
import com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
/**
* Component responsible for clothes permission and management.
* Handles who can remove/change clothes and manages clothes replacement with network sync.
*
* Single Responsibility: Clothes permissions and synchronization
* Complexity: MEDIUM (network sync coordination)
* Risk: MEDIUM (must coordinate SyncManager calls)
*
* Epic 5F: Uses V2EquipmentHelper/BodyRegionV2.
*/
public class PlayerClothesPermission {
private final IPlayerBindStateHost host;
public PlayerClothesPermission(IPlayerBindStateHost host) {
this.host = host;
}
// ========== Permission Checks ==========
/**
* Check if a specific player can take off this player's clothes.
* Currently permissive - anyone can take off clothes.
* Future: Could check if 'player' is owner/master when tied up.
*
* @param player The player attempting to remove clothes
* @return true if allowed
*/
public boolean canTakeOffClothes(Player player) {
// Currently permissive - anyone can take off clothes
// Future: Could check if 'player' is owner/master when tied up
return true;
}
/**
* Check if a specific player can change this player's clothes.
* Currently permissive - anyone can change clothes.
* Future: Could check if 'player' is owner/master when tied up.
*
* @param player The player attempting to change clothes
* @return true if allowed
*/
public boolean canChangeClothes(Player player) {
// Currently permissive - anyone can change clothes
// Future: Could check if 'player' is owner/master when tied up
return true;
}
/**
* Check if clothes can be changed (no specific player context).
* Checks if no clothes are equipped, or if clothes are not locked.
*
* @return true if clothes can be changed
*/
public boolean canChangeClothes() {
ItemStack clothes = V2EquipmentHelper.getInRegion(host.getPlayer(), BodyRegionV2.TORSO);
if (clothes.isEmpty()) return true;
// Check if clothes are locked
return !isLocked(clothes, false);
}
// ========== Clothes Management ==========
/**
* Replace current clothes with new clothes.
* Removes old clothes and equips new ones.
* Syncs clothes config to all clients.
*
* @param newClothes The new clothes to equip
* @return The old clothes, or empty if none
*/
public ItemStack replaceClothes(ItemStack newClothes) {
return replaceClothes(newClothes, false);
}
/**
* Replace current clothes with new clothes, with optional force.
* If force is true, bypasses lock checks.
* Syncs clothes config to all clients.
*
* @param newClothes The new clothes to equip
* @param force true to bypass lock checks
* @return The old clothes, or empty if none
*/
public ItemStack replaceClothes(ItemStack newClothes, boolean force) {
Player player = host.getPlayer();
if (player == null || player.level().isClientSide) return ItemStack.EMPTY;
IV2BondageEquipment equip = V2EquipmentHelper.getEquipment(player);
if (equip == null) return ItemStack.EMPTY;
// Take off old clothes
ItemStack old = V2EquipmentHelper.unequipFromRegion(player, BodyRegionV2.TORSO);
// Equip new clothes if we successfully removed old ones
if (!old.isEmpty()) {
equip.setInRegion(BodyRegionV2.TORSO, newClothes.copy());
// Fire lifecycle hook for new item
if (!newClothes.isEmpty() && newClothes.getItem() instanceof IV2BondageItem newItem) {
newItem.onEquipped(newClothes, player);
}
V2EquipmentHelper.sync(player);
// CRITICAL: Sync clothes config to all tracking clients
// This ensures dynamic textures and other clothes properties are synced
host.syncClothesConfig();
}
return old;
}
// ========== Helper Methods ==========
/**
* Check if an item is locked.
* Helper method for lock checking.
*
* @param stack The item to check
* @param force If true, returns false (bypasses lock)
* @return true if locked and not forced
*/
private boolean isLocked(ItemStack stack, boolean force) {
if (force) return false;
if (stack.isEmpty()) return false;
// Check if item has locked property
if (
stack.getItem() instanceof
com.tiedup.remake.items.base.ILockable lockable
) {
return lockable.isLocked(stack);
}
return false;
}
}