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,290 @@
package com.tiedup.remake.dialogue.conversation;
import com.tiedup.remake.core.TiedUpMod;
import com.tiedup.remake.v2.BodyRegionV2;
import com.tiedup.remake.dialogue.DialogueBridge;
import com.tiedup.remake.entities.EntityMaster;
import com.tiedup.remake.entities.ai.master.MasterPlaceBlockGoal;
import com.tiedup.remake.entities.ai.master.MasterState;
import com.tiedup.remake.items.ModItems;
import com.tiedup.remake.items.base.BindVariant;
import com.tiedup.remake.network.ModNetwork;
import com.tiedup.remake.network.master.PacketOpenPetRequestMenu;
import com.tiedup.remake.state.PlayerBindState;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.item.ItemStack;
/**
* Manager for handling pet requests to their Master NPC.
*
* This is the server-side handler for player-initiated requests in pet play mode.
* Utilizes existing systems:
* - PlayerEquipment.equip(BodyRegionV2.ARMS, bind) / takeBindOff() for tie/untie
* - MasterState.DOGWALK for walk mode
* - MasterPlaceBlockGoal for feeding/resting
* - Leash physics via mixin for pulling the player
*/
public class PetRequestManager {
/** Maximum distance for pet request interaction */
private static final double MAX_DISTANCE = 6.0;
/**
* Open the pet request menu for a pet player.
* Sends a packet to the client to display the GUI.
*
* @param master The master entity
* @param pet The pet player
*/
public static void openRequestMenu(EntityMaster master, ServerPlayer pet) {
if (!master.isPetPlayer(pet)) {
TiedUpMod.LOGGER.warn(
"[PetRequestManager] {} is not a pet of {}",
pet.getName().getString(),
master.getNpcName()
);
return;
}
// Check distance
double dist = master.distanceTo(pet);
if (dist > MAX_DISTANCE) {
pet.sendSystemMessage(
Component.literal("You are too far from your Master to talk.")
);
return;
}
// Send packet to open GUI on client
ModNetwork.sendToPlayer(
new PacketOpenPetRequestMenu(
master.getId(),
master.getNpcName()
),
pet
);
TiedUpMod.LOGGER.debug(
"[PetRequestManager] Opened request menu for {} with {}",
pet.getName().getString(),
master.getNpcName()
);
}
/**
* Handle a request from the pet player.
* Called when the player selects an option from the pet request menu.
*
* @param master The master entity
* @param pet The pet player making the request
* @param request The request type
*/
public static void handleRequest(
EntityMaster master,
ServerPlayer pet,
PetRequest request
) {
if (!master.isPetPlayer(pet)) {
TiedUpMod.LOGGER.warn(
"[PetRequestManager] Rejected request from non-pet {} to {}",
pet.getName().getString(),
master.getNpcName()
);
return;
}
// Check distance
double dist = master.distanceTo(pet);
if (dist > MAX_DISTANCE) {
pet.sendSystemMessage(
Component.literal("You are too far from your Master.")
);
return;
}
TiedUpMod.LOGGER.info(
"[PetRequestManager] {} requested {} from {}",
pet.getName().getString(),
request.name(),
master.getNpcName()
);
// Display what the player "says"
pet.sendSystemMessage(
Component.literal("You: " + request.getPlayerText())
);
// Handle specific request
switch (request) {
case REQUEST_FOOD -> triggerFeeding(master, pet);
case REQUEST_SLEEP -> triggerResting(master, pet);
case REQUEST_WALK_PASSIVE -> triggerDogwalk(master, pet, false);
case REQUEST_WALK_ACTIVE -> triggerDogwalk(master, pet, true);
case REQUEST_TIE -> triggerTie(master, pet);
case REQUEST_UNTIE -> triggerUntie(master, pet);
case END_CONVERSATION -> endConversation(master, pet);
}
}
/**
* Trigger feeding action - Master places bowl for pet.
*/
private static void triggerFeeding(EntityMaster master, ServerPlayer pet) {
DialogueBridge.talkTo(master, pet, "petplay.feeding");
MasterPlaceBlockGoal goal = master.getPlaceBlockGoal();
if (goal != null) {
goal.triggerFeeding();
}
}
/**
* Trigger resting action - Master places pet bed for pet.
*/
private static void triggerResting(EntityMaster master, ServerPlayer pet) {
DialogueBridge.talkTo(master, pet, "petplay.resting");
MasterPlaceBlockGoal goal = master.getPlaceBlockGoal();
if (goal != null) {
goal.triggerResting();
}
}
/**
* Trigger dogwalk mode.
* Puts dogbind on player and attaches leash.
*
* @param masterLeads If true, Master walks and pulls pet. If false, Master follows pet.
*/
private static void triggerDogwalk(
EntityMaster master,
ServerPlayer pet,
boolean masterLeads
) {
// Get player bind state
PlayerBindState state = PlayerBindState.getInstance(pet);
if (state == null) {
TiedUpMod.LOGGER.warn(
"[PetRequestManager] Could not get PlayerBindState for {}",
pet.getName().getString()
);
return;
}
// Put dogbind on player (if not already tied)
if (!state.isTiedUp()) {
ItemStack dogbind = new ItemStack(
ModItems.getBind(BindVariant.DOGBINDER)
);
state.equip(BodyRegionV2.ARMS, dogbind);
TiedUpMod.LOGGER.debug(
"[PetRequestManager] Equipped dogbind on {} for walk",
pet.getName().getString()
);
}
// Attach leash
master.attachLeashToPet();
// Set dogwalk mode
master.setDogwalkMode(masterLeads);
master.setMasterState(MasterState.DOGWALK);
String dialogueId = masterLeads
? "petplay.walk_active"
: "petplay.walk_passive";
DialogueBridge.talkTo(master, pet, dialogueId);
TiedUpMod.LOGGER.info(
"[PetRequestManager] {} entered DOGWALK mode with {} (masterLeads={})",
master.getNpcName(),
pet.getName().getString(),
masterLeads
);
}
/**
* Trigger tie request - Master ties up the pet.
*/
private static void triggerTie(EntityMaster master, ServerPlayer pet) {
// Don't allow tie requests during dogwalk
if (master.getStateManager().getCurrentState() == MasterState.DOGWALK) {
DialogueBridge.talkTo(master, pet, "petplay.busy");
return;
}
// Get player bind state
PlayerBindState state = PlayerBindState.getInstance(pet);
if (state == null) {
TiedUpMod.LOGGER.warn(
"[PetRequestManager] Could not get PlayerBindState for {}",
pet.getName().getString()
);
return;
}
// Check if already tied
if (state.isTiedUp()) {
DialogueBridge.talkTo(master, pet, "petplay.already_tied");
return;
}
// Master equips armbinder on pet (classic pet play restraint)
ItemStack bind = new ItemStack(ModItems.getBind(BindVariant.ARMBINDER));
state.equip(BodyRegionV2.ARMS, bind);
DialogueBridge.talkTo(master, pet, "petplay.tie_accept");
TiedUpMod.LOGGER.info(
"[PetRequestManager] {} tied up {} with armbinder",
master.getNpcName(),
pet.getName().getString()
);
}
/**
* Trigger untie request - Master unties the pet.
*/
private static void triggerUntie(EntityMaster master, ServerPlayer pet) {
// Don't allow untie requests during dogwalk
if (master.getStateManager().getCurrentState() == MasterState.DOGWALK) {
DialogueBridge.talkTo(master, pet, "petplay.busy");
return;
}
// Get player bind state
PlayerBindState state = PlayerBindState.getInstance(pet);
if (state == null) {
TiedUpMod.LOGGER.warn(
"[PetRequestManager] Could not get PlayerBindState for {}",
pet.getName().getString()
);
return;
}
// Check if actually tied
if (!state.isTiedUp()) {
DialogueBridge.talkTo(master, pet, "petplay.not_tied");
return;
}
// Master removes bind from pet
state.unequip(BodyRegionV2.ARMS);
DialogueBridge.talkTo(master, pet, "petplay.untie_accept");
TiedUpMod.LOGGER.info(
"[PetRequestManager] {} untied {}",
master.getNpcName(),
pet.getName().getString()
);
}
/**
* End the conversation gracefully.
*/
private static void endConversation(EntityMaster master, ServerPlayer pet) {
DialogueBridge.talkTo(master, pet, "petplay.dismiss");
}
}