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.
This commit is contained in:
NotEvil
2026-04-12 00:51:22 +02:00
parent 2e7a1d403b
commit f6466360b6
1947 changed files with 238025 additions and 1 deletions

View File

@@ -0,0 +1,204 @@
package com.tiedup.remake.util;
import com.tiedup.remake.core.TiedUpMod;
import com.tiedup.remake.network.sync.SyncManager;
import com.tiedup.remake.state.IBondageState;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
import java.util.function.Predicate;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import org.jetbrains.annotations.Nullable;
/**
* Helper class for common bondage equipment interaction logic.
*
* This class extracts the duplicated interactLivingEntity pattern
* from ItemGag, ItemBlindfold, ItemMittens, ItemEarplugs, and ItemCollar.
*/
public class EquipmentInteractionHelper {
/**
* Standard equipment interaction for bondage items.
*
* Handles the common flow: check state → equip or replace equipment.
*
* @param stack The item stack being used
* @param player The player using the item
* @param target The entity being equipped
* @param isEquipped Predicate to check if target already has this equipment
* @param putOn Consumer to equip the item on target (state, itemCopy)
* @param replace Function to replace existing equipment (state, itemCopy) → oldItem
* @param sendMessage Consumer to send message to target (player, target)
* @param logPrefix Log prefix for this equipment type
* @return InteractionResult
*/
public static InteractionResult equipOnTarget(
ItemStack stack,
Player player,
LivingEntity target,
Predicate<IBondageState> isEquipped,
BiConsumer<IBondageState, ItemStack> putOn,
BiFunction<IBondageState, ItemStack, ItemStack> replace,
BiConsumer<Player, LivingEntity> sendMessage,
String logPrefix
) {
return equipOnTarget(
stack,
player,
target,
isEquipped,
putOn,
replace,
sendMessage,
logPrefix,
null,
null,
null
);
}
/**
* Equipment interaction with additional hooks for special items (like Collar).
*
* @param stack The item stack being used
* @param player The player using the item
* @param target The entity being equipped
* @param isEquipped Predicate to check if target already has this equipment
* @param putOn Consumer to equip the item on target (state, itemCopy)
* @param replace Function to replace existing equipment (state, itemCopy) → oldItem
* @param sendMessage Consumer to send message to target (player, target)
* @param logPrefix Log prefix for this equipment type
* @param preEquipHook Optional hook called before equipping (for owner registration, etc.)
* @param postEquipHook Optional hook called after equipping (for sound, particles, etc.)
* @param canReplace Optional predicate to check if replacement is allowed (for lock check)
* @return InteractionResult
*/
public static InteractionResult equipOnTarget(
ItemStack stack,
Player player,
LivingEntity target,
Predicate<IBondageState> isEquipped,
BiConsumer<IBondageState, ItemStack> putOn,
BiFunction<IBondageState, ItemStack, ItemStack> replace,
BiConsumer<Player, LivingEntity> sendMessage,
String logPrefix,
@Nullable EquipContext preEquipHook,
@Nullable EquipContext postEquipHook,
@Nullable ReplacePredicate canReplace
) {
// Server-side only
if (player.level().isClientSide) {
return InteractionResult.SUCCESS;
}
// Get target state
IBondageState targetState = KidnappedHelper.getKidnappedState(target);
if (targetState == null) {
return InteractionResult.PASS;
}
// Must be tied up
if (!targetState.isTiedUp()) {
return InteractionResult.PASS;
}
// Pre-equip hook (e.g., register collar owner)
if (preEquipHook != null) {
preEquipHook.execute(stack, player, target, targetState);
}
// Case 1: Not equipped - put on new
if (!isEquipped.test(targetState)) {
putOn.accept(targetState, stack.copy());
stack.shrink(1);
sendMessage.accept(player, target);
syncIfPlayer(target);
// Post-equip hook (e.g., play sound)
if (postEquipHook != null) {
postEquipHook.execute(stack, player, target, targetState);
}
TiedUpMod.LOGGER.info(
"[{}] {} put {} on {}",
logPrefix,
player.getName().getString(),
logPrefix.toLowerCase(),
target.getName().getString()
);
return InteractionResult.SUCCESS;
}
// Case 2: Already equipped - replace
else {
// Check if replacement is allowed (e.g., not locked)
if (
canReplace != null &&
!canReplace.canReplace(targetState, player)
) {
return InteractionResult.PASS;
}
ItemStack oldItem = replace.apply(targetState, stack.copy());
if (oldItem != null && !oldItem.isEmpty()) {
stack.shrink(1);
targetState.kidnappedDropItem(oldItem);
sendMessage.accept(player, target);
syncIfPlayer(target);
// Post-equip hook
if (postEquipHook != null) {
postEquipHook.execute(stack, player, target, targetState);
}
TiedUpMod.LOGGER.info(
"[{}] {} replaced {} on {}",
logPrefix,
player.getName().getString(),
logPrefix.toLowerCase(),
target.getName().getString()
);
return InteractionResult.SUCCESS;
}
}
return InteractionResult.PASS;
}
/**
* Sync inventory if target is a ServerPlayer.
*/
private static void syncIfPlayer(LivingEntity target) {
if (target instanceof ServerPlayer serverPlayer) {
SyncManager.syncInventory(serverPlayer);
}
}
/**
* Functional interface for pre/post equip hooks.
*/
@FunctionalInterface
public interface EquipContext {
void execute(
ItemStack stack,
Player player,
LivingEntity target,
IBondageState state
);
}
/**
* Functional interface to check if replacement is allowed.
*/
@FunctionalInterface
public interface ReplacePredicate {
boolean canReplace(IBondageState state, Player player);
}
}