Compare commits
1 Commits
chore/fina
...
chore/quic
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0d65229514 |
@@ -3,7 +3,7 @@ package com.tiedup.remake.client.animation.render;
|
|||||||
import com.tiedup.remake.core.TiedUpMod;
|
import com.tiedup.remake.core.TiedUpMod;
|
||||||
import com.tiedup.remake.items.base.PoseType;
|
import com.tiedup.remake.items.base.PoseType;
|
||||||
import com.tiedup.remake.v2.bondage.PoseTypeHelper;
|
import com.tiedup.remake.v2.bondage.PoseTypeHelper;
|
||||||
import com.tiedup.remake.state.HumanChairHelper;
|
import com.tiedup.remake.util.HumanChairHelper;
|
||||||
import com.tiedup.remake.state.PlayerBindState;
|
import com.tiedup.remake.state.PlayerBindState;
|
||||||
import com.tiedup.remake.v2.BodyRegionV2;
|
import com.tiedup.remake.v2.BodyRegionV2;
|
||||||
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import com.tiedup.remake.client.state.PetBedClientState;
|
|||||||
import com.tiedup.remake.core.TiedUpMod;
|
import com.tiedup.remake.core.TiedUpMod;
|
||||||
import com.tiedup.remake.items.base.PoseType;
|
import com.tiedup.remake.items.base.PoseType;
|
||||||
import com.tiedup.remake.v2.bondage.PoseTypeHelper;
|
import com.tiedup.remake.v2.bondage.PoseTypeHelper;
|
||||||
import com.tiedup.remake.state.HumanChairHelper;
|
import com.tiedup.remake.util.HumanChairHelper;
|
||||||
import com.tiedup.remake.state.PlayerBindState;
|
import com.tiedup.remake.state.PlayerBindState;
|
||||||
import com.tiedup.remake.v2.BodyRegionV2;
|
import com.tiedup.remake.v2.BodyRegionV2;
|
||||||
import net.minecraft.client.player.AbstractClientPlayer;
|
import net.minecraft.client.player.AbstractClientPlayer;
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ import com.tiedup.remake.client.state.PetBedClientState;
|
|||||||
import com.tiedup.remake.items.base.PoseType;
|
import com.tiedup.remake.items.base.PoseType;
|
||||||
import com.tiedup.remake.v2.bondage.BindModeHelper;
|
import com.tiedup.remake.v2.bondage.BindModeHelper;
|
||||||
import com.tiedup.remake.v2.bondage.PoseTypeHelper;
|
import com.tiedup.remake.v2.bondage.PoseTypeHelper;
|
||||||
import com.tiedup.remake.state.HumanChairHelper;
|
import com.tiedup.remake.util.HumanChairHelper;
|
||||||
import com.tiedup.remake.state.PlayerBindState;
|
import com.tiedup.remake.state.PlayerBindState;
|
||||||
import com.tiedup.remake.v2.BodyRegionV2;
|
import com.tiedup.remake.v2.BodyRegionV2;
|
||||||
import com.tiedup.remake.v2.bondage.IV2BondageEquipment;
|
import com.tiedup.remake.v2.bondage.IV2BondageEquipment;
|
||||||
|
|||||||
@@ -13,8 +13,6 @@ import java.util.Set;
|
|||||||
import java.util.TreeSet;
|
import java.util.TreeSet;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import net.minecraft.client.Minecraft;
|
|
||||||
import net.minecraft.client.player.AbstractClientPlayer;
|
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import net.minecraft.world.entity.LivingEntity;
|
import net.minecraft.world.entity.LivingEntity;
|
||||||
import net.minecraftforge.api.distmarker.Dist;
|
import net.minecraftforge.api.distmarker.Dist;
|
||||||
@@ -433,52 +431,6 @@ public final class GltfAnimationApplier {
|
|||||||
ContextAnimationFactory.clearCache();
|
ContextAnimationFactory.clearCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
// LEGACY F9 DEBUG TOGGLE
|
|
||||||
|
|
||||||
private static boolean debugEnabled = false;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Toggle debug mode via F9 key.
|
|
||||||
* When enabled, applies handcuffs V2 animation (rightArm + leftArm) to the local player
|
|
||||||
* using STAND_IDLE context. When disabled, clears all V2 animation.
|
|
||||||
*/
|
|
||||||
public static void toggle() {
|
|
||||||
debugEnabled = !debugEnabled;
|
|
||||||
LOGGER.info(
|
|
||||||
"[GltfPipeline] Debug toggle: {}",
|
|
||||||
debugEnabled ? "ON" : "OFF"
|
|
||||||
);
|
|
||||||
|
|
||||||
AbstractClientPlayer player = Minecraft.getInstance().player;
|
|
||||||
if (player == null) return;
|
|
||||||
|
|
||||||
if (debugEnabled) {
|
|
||||||
ResourceLocation modelLoc = ResourceLocation.fromNamespaceAndPath(
|
|
||||||
"tiedup",
|
|
||||||
"models/gltf/v2/handcuffs/cuffs_prototype.glb"
|
|
||||||
);
|
|
||||||
Set<String> armParts = Set.of("rightArm", "leftArm");
|
|
||||||
RegionBoneMapper.BoneOwnership debugOwnership =
|
|
||||||
new RegionBoneMapper.BoneOwnership(armParts, Set.of());
|
|
||||||
applyV2Animation(
|
|
||||||
player,
|
|
||||||
modelLoc,
|
|
||||||
null,
|
|
||||||
AnimationContext.STAND_IDLE,
|
|
||||||
debugOwnership
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
clearV2Animation(player);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Whether F9 debug mode is currently enabled.
|
|
||||||
*/
|
|
||||||
public static boolean isEnabled() {
|
|
||||||
return debugEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
// INTERNAL
|
// INTERNAL
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,11 +1,9 @@
|
|||||||
package com.tiedup.remake.client.gltf;
|
package com.tiedup.remake.client.gltf;
|
||||||
|
|
||||||
import com.mojang.blaze3d.platform.InputConstants;
|
|
||||||
import com.tiedup.remake.client.animation.context.ContextAnimationFactory;
|
import com.tiedup.remake.client.animation.context.ContextAnimationFactory;
|
||||||
import com.tiedup.remake.client.animation.context.ContextGlbRegistry;
|
import com.tiedup.remake.client.animation.context.ContextGlbRegistry;
|
||||||
import com.tiedup.remake.v2.bondage.client.V2BondageRenderLayer;
|
import com.tiedup.remake.v2.bondage.client.V2BondageRenderLayer;
|
||||||
import com.tiedup.remake.v2.bondage.datadriven.DataDrivenItemReloadListener;
|
import com.tiedup.remake.v2.bondage.datadriven.DataDrivenItemReloadListener;
|
||||||
import net.minecraft.client.KeyMapping;
|
|
||||||
import net.minecraft.client.renderer.entity.player.PlayerRenderer;
|
import net.minecraft.client.renderer.entity.player.PlayerRenderer;
|
||||||
import net.minecraft.server.packs.resources.ResourceManager;
|
import net.minecraft.server.packs.resources.ResourceManager;
|
||||||
import net.minecraft.server.packs.resources.SimplePreparableReloadListener;
|
import net.minecraft.server.packs.resources.SimplePreparableReloadListener;
|
||||||
@@ -13,8 +11,6 @@ import net.minecraft.util.profiling.ProfilerFiller;
|
|||||||
import net.minecraftforge.api.distmarker.Dist;
|
import net.minecraftforge.api.distmarker.Dist;
|
||||||
import net.minecraftforge.client.event.EntityRenderersEvent;
|
import net.minecraftforge.client.event.EntityRenderersEvent;
|
||||||
import net.minecraftforge.client.event.RegisterClientReloadListenersEvent;
|
import net.minecraftforge.client.event.RegisterClientReloadListenersEvent;
|
||||||
import net.minecraftforge.client.event.RegisterKeyMappingsEvent;
|
|
||||||
import net.minecraftforge.event.TickEvent;
|
|
||||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||||
import net.minecraftforge.fml.common.Mod;
|
import net.minecraftforge.fml.common.Mod;
|
||||||
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
|
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
|
||||||
@@ -23,24 +19,16 @@ import org.apache.logging.log4j.Logger;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Forge event registration for the glTF pipeline.
|
* Forge event registration for the glTF pipeline.
|
||||||
* Registers keybind (F9), render layers, and animation factory.
|
* Registers render layers and animation factory.
|
||||||
*/
|
*/
|
||||||
public final class GltfClientSetup {
|
public final class GltfClientSetup {
|
||||||
|
|
||||||
private static final Logger LOGGER = LogManager.getLogger("GltfPipeline");
|
private static final Logger LOGGER = LogManager.getLogger("GltfPipeline");
|
||||||
|
|
||||||
private static final String KEY_CATEGORY = "key.categories.tiedup";
|
|
||||||
static final KeyMapping TOGGLE_KEY = new KeyMapping(
|
|
||||||
"key.tiedup.gltf_toggle",
|
|
||||||
InputConstants.Type.KEYSYM,
|
|
||||||
InputConstants.KEY_F9,
|
|
||||||
KEY_CATEGORY
|
|
||||||
);
|
|
||||||
|
|
||||||
private GltfClientSetup() {}
|
private GltfClientSetup() {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MOD bus event subscribers (FMLClientSetupEvent, RegisterKeyMappings, AddLayers).
|
* MOD bus event subscribers (FMLClientSetupEvent, AddLayers).
|
||||||
*/
|
*/
|
||||||
@Mod.EventBusSubscriber(
|
@Mod.EventBusSubscriber(
|
||||||
modid = "tiedup",
|
modid = "tiedup",
|
||||||
@@ -58,21 +46,11 @@ public final class GltfClientSetup {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@SubscribeEvent
|
|
||||||
public static void onRegisterKeybindings(
|
|
||||||
RegisterKeyMappingsEvent event
|
|
||||||
) {
|
|
||||||
event.register(TOGGLE_KEY);
|
|
||||||
LOGGER.info("[GltfPipeline] Keybind registered: F9");
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public static void onAddLayers(EntityRenderersEvent.AddLayers event) {
|
public static void onAddLayers(EntityRenderersEvent.AddLayers event) {
|
||||||
// Add GltfRenderLayer (prototype/debug with F9 toggle) to player renderers
|
|
||||||
var defaultRenderer = event.getSkin("default");
|
var defaultRenderer = event.getSkin("default");
|
||||||
if (defaultRenderer instanceof PlayerRenderer playerRenderer) {
|
if (defaultRenderer instanceof PlayerRenderer playerRenderer) {
|
||||||
playerRenderer.addLayer(new GltfRenderLayer(playerRenderer));
|
|
||||||
playerRenderer.addLayer(
|
playerRenderer.addLayer(
|
||||||
new V2BondageRenderLayer<>(playerRenderer)
|
new V2BondageRenderLayer<>(playerRenderer)
|
||||||
);
|
);
|
||||||
@@ -81,10 +59,9 @@ public final class GltfClientSetup {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add both layers to slim player renderer (Alex)
|
// Add V2 layer to slim player renderer (Alex)
|
||||||
var slimRenderer = event.getSkin("slim");
|
var slimRenderer = event.getSkin("slim");
|
||||||
if (slimRenderer instanceof PlayerRenderer playerRenderer) {
|
if (slimRenderer instanceof PlayerRenderer playerRenderer) {
|
||||||
playerRenderer.addLayer(new GltfRenderLayer(playerRenderer));
|
|
||||||
playerRenderer.addLayer(
|
playerRenderer.addLayer(
|
||||||
new V2BondageRenderLayer<>(playerRenderer)
|
new V2BondageRenderLayer<>(playerRenderer)
|
||||||
);
|
);
|
||||||
@@ -143,23 +120,4 @@ public final class GltfClientSetup {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* FORGE bus event subscribers (ClientTickEvent for keybind toggle).
|
|
||||||
*/
|
|
||||||
@Mod.EventBusSubscriber(
|
|
||||||
modid = "tiedup",
|
|
||||||
bus = Mod.EventBusSubscriber.Bus.FORGE,
|
|
||||||
value = Dist.CLIENT
|
|
||||||
)
|
|
||||||
public static class ForgeBusEvents {
|
|
||||||
|
|
||||||
@SubscribeEvent
|
|
||||||
public static void onClientTick(TickEvent.ClientTickEvent event) {
|
|
||||||
if (event.phase != TickEvent.Phase.END) return;
|
|
||||||
|
|
||||||
while (TOGGLE_KEY.consumeClick()) {
|
|
||||||
GltfAnimationApplier.toggle();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,106 +0,0 @@
|
|||||||
package com.tiedup.remake.client.gltf;
|
|
||||||
|
|
||||||
import com.mojang.blaze3d.vertex.PoseStack;
|
|
||||||
import net.minecraft.client.Minecraft;
|
|
||||||
import net.minecraft.client.model.PlayerModel;
|
|
||||||
import net.minecraft.client.player.AbstractClientPlayer;
|
|
||||||
import net.minecraft.client.renderer.MultiBufferSource;
|
|
||||||
import net.minecraft.client.renderer.entity.RenderLayerParent;
|
|
||||||
import net.minecraft.client.renderer.entity.layers.RenderLayer;
|
|
||||||
import net.minecraft.resources.ResourceLocation;
|
|
||||||
import net.minecraftforge.api.distmarker.Dist;
|
|
||||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
|
||||||
import org.apache.logging.log4j.LogManager;
|
|
||||||
import org.apache.logging.log4j.Logger;
|
|
||||||
import org.joml.Matrix4f;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* RenderLayer that renders the glTF mesh (handcuffs) on the player.
|
|
||||||
* Only active when enabled and only renders on the local player.
|
|
||||||
* <p>
|
|
||||||
* Uses the live skinning path: reads live skeleton from HumanoidModel
|
|
||||||
* via {@link GltfLiveBoneReader}, following PlayerAnimator + bendy-lib rotations.
|
|
||||||
* Falls back to GLB-internal skinning via {@link GltfSkinningEngine} if live reading fails.
|
|
||||||
*/
|
|
||||||
@OnlyIn(Dist.CLIENT)
|
|
||||||
public class GltfRenderLayer
|
|
||||||
extends RenderLayer<AbstractClientPlayer, PlayerModel<AbstractClientPlayer>>
|
|
||||||
{
|
|
||||||
|
|
||||||
private static final Logger LOGGER = LogManager.getLogger("GltfPipeline");
|
|
||||||
|
|
||||||
private static final ResourceLocation CUFFS_MODEL =
|
|
||||||
ResourceLocation.fromNamespaceAndPath(
|
|
||||||
"tiedup",
|
|
||||||
"models/gltf/v2/handcuffs/cuffs_prototype.glb"
|
|
||||||
);
|
|
||||||
|
|
||||||
public GltfRenderLayer(
|
|
||||||
RenderLayerParent<
|
|
||||||
AbstractClientPlayer,
|
|
||||||
PlayerModel<AbstractClientPlayer>
|
|
||||||
> renderer
|
|
||||||
) {
|
|
||||||
super(renderer);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Y translate offset to place the glTF mesh in the MC PoseStack.
|
|
||||||
* <p>
|
|
||||||
* After LivingEntityRenderer's scale(-1,-1,1) + translate(0,-1.501,0),
|
|
||||||
* the PoseStack origin is at the model top (1.501 blocks above feet), Y-down.
|
|
||||||
* The glTF mesh (MC-converted) has feet at Y=0 and head at Y≈-1.5.
|
|
||||||
* Translating by 1.501 maps glTF feet to PoseStack feet and head to top.
|
|
||||||
*/
|
|
||||||
private static final float ALIGNMENT_Y = 1.501f;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void render(
|
|
||||||
PoseStack poseStack,
|
|
||||||
MultiBufferSource buffer,
|
|
||||||
int packedLight,
|
|
||||||
AbstractClientPlayer entity,
|
|
||||||
float limbSwing,
|
|
||||||
float limbSwingAmount,
|
|
||||||
float partialTick,
|
|
||||||
float ageInTicks,
|
|
||||||
float netHeadYaw,
|
|
||||||
float headPitch
|
|
||||||
) {
|
|
||||||
if (!GltfAnimationApplier.isEnabled()) return;
|
|
||||||
if (entity != Minecraft.getInstance().player) return;
|
|
||||||
|
|
||||||
GltfData data = GltfCache.get(CUFFS_MODEL);
|
|
||||||
if (data == null) return;
|
|
||||||
|
|
||||||
// Live path: read skeleton from HumanoidModel (after PlayerAnimator)
|
|
||||||
PlayerModel<AbstractClientPlayer> parentModel = this.getParentModel();
|
|
||||||
Matrix4f[] joints = GltfLiveBoneReader.computeJointMatricesFromModel(
|
|
||||||
parentModel,
|
|
||||||
data,
|
|
||||||
entity
|
|
||||||
);
|
|
||||||
if (joints == null) {
|
|
||||||
// Fallback to GLB-internal path if live reading fails
|
|
||||||
joints = GltfSkinningEngine.computeJointMatrices(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
poseStack.pushPose();
|
|
||||||
|
|
||||||
// Align glTF mesh with MC model (feet-to-feet alignment)
|
|
||||||
poseStack.translate(0, ALIGNMENT_Y, 0);
|
|
||||||
|
|
||||||
GltfMeshRenderer.renderSkinned(
|
|
||||||
data,
|
|
||||||
joints,
|
|
||||||
poseStack,
|
|
||||||
buffer,
|
|
||||||
packedLight,
|
|
||||||
net.minecraft.client.renderer.entity.LivingEntityRenderer.getOverlayCoords(
|
|
||||||
entity,
|
|
||||||
0.0f
|
|
||||||
)
|
|
||||||
);
|
|
||||||
poseStack.popPose();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1072,7 +1072,7 @@ public class EntityMaster extends EntityKidnapperElite {
|
|||||||
if (
|
if (
|
||||||
tag != null &&
|
tag != null &&
|
||||||
tag.getBoolean(
|
tag.getBoolean(
|
||||||
com.tiedup.remake.state.HumanChairHelper.NBT_KEY
|
com.tiedup.remake.util.HumanChairHelper.NBT_KEY
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
bindState.unequip(BodyRegionV2.ARMS);
|
bindState.unequip(BodyRegionV2.ARMS);
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import com.tiedup.remake.dialogue.DialogueBridge;
|
|||||||
import com.tiedup.remake.entities.EntityMaster;
|
import com.tiedup.remake.entities.EntityMaster;
|
||||||
import com.tiedup.remake.v2.bondage.datadriven.DataDrivenBondageItem;
|
import com.tiedup.remake.v2.bondage.datadriven.DataDrivenBondageItem;
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import com.tiedup.remake.state.HumanChairHelper;
|
import com.tiedup.remake.util.HumanChairHelper;
|
||||||
import com.tiedup.remake.state.PlayerBindState;
|
import com.tiedup.remake.state.PlayerBindState;
|
||||||
import com.tiedup.remake.v2.BodyRegionV2;
|
import com.tiedup.remake.v2.BodyRegionV2;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package com.tiedup.remake.mixin;
|
package com.tiedup.remake.mixin;
|
||||||
|
|
||||||
import com.tiedup.remake.state.HumanChairHelper;
|
import com.tiedup.remake.util.HumanChairHelper;
|
||||||
import com.tiedup.remake.state.PlayerBindState;
|
import com.tiedup.remake.state.PlayerBindState;
|
||||||
import com.tiedup.remake.v2.BodyRegionV2;
|
import com.tiedup.remake.v2.BodyRegionV2;
|
||||||
import net.minecraft.world.entity.LivingEntity;
|
import net.minecraft.world.entity.LivingEntity;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package com.tiedup.remake.mixin.client;
|
|||||||
|
|
||||||
import com.tiedup.remake.items.base.PoseType;
|
import com.tiedup.remake.items.base.PoseType;
|
||||||
import com.tiedup.remake.v2.bondage.PoseTypeHelper;
|
import com.tiedup.remake.v2.bondage.PoseTypeHelper;
|
||||||
import com.tiedup.remake.state.HumanChairHelper;
|
import com.tiedup.remake.util.HumanChairHelper;
|
||||||
import com.tiedup.remake.state.PlayerBindState;
|
import com.tiedup.remake.state.PlayerBindState;
|
||||||
import com.tiedup.remake.v2.BodyRegionV2;
|
import com.tiedup.remake.v2.BodyRegionV2;
|
||||||
import net.minecraft.client.Camera;
|
import net.minecraft.client.Camera;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.tiedup.remake.state;
|
package com.tiedup.remake.util;
|
||||||
|
|
||||||
import com.tiedup.remake.items.base.PoseType;
|
import com.tiedup.remake.items.base.PoseType;
|
||||||
import net.minecraft.nbt.CompoundTag;
|
import net.minecraft.nbt.CompoundTag;
|
||||||
@@ -46,9 +46,7 @@ import org.joml.Matrix4f;
|
|||||||
* pushPose/popPose pair. Joint matrices are computed per-GLB-model
|
* pushPose/popPose pair. Joint matrices are computed per-GLB-model
|
||||||
* because different GLB models have different skeletons.
|
* because different GLB models have different skeletons.
|
||||||
*
|
*
|
||||||
* <p>Unlike {@link com.tiedup.remake.client.gltf.GltfRenderLayer},
|
* <p>This layer is always active and renders on ALL entities.
|
||||||
* this layer is always active (no F9 toggle guard) and renders on
|
|
||||||
* ALL entities (no local-player-only guard).
|
|
||||||
*/
|
*/
|
||||||
@OnlyIn(Dist.CLIENT)
|
@OnlyIn(Dist.CLIENT)
|
||||||
public class V2BondageRenderLayer<
|
public class V2BondageRenderLayer<
|
||||||
|
|||||||
@@ -1,7 +1,12 @@
|
|||||||
package com.tiedup.remake.v2.bondage.datadriven;
|
package com.tiedup.remake.v2.bondage.datadriven;
|
||||||
|
|
||||||
|
import com.tiedup.remake.core.ModSounds;
|
||||||
import com.tiedup.remake.core.TiedUpMod;
|
import com.tiedup.remake.core.TiedUpMod;
|
||||||
|
import com.tiedup.remake.state.IRestrainable;
|
||||||
|
import com.tiedup.remake.util.KidnappedHelper;
|
||||||
import com.tiedup.remake.v2.BodyRegionV2;
|
import com.tiedup.remake.v2.BodyRegionV2;
|
||||||
|
import com.tiedup.remake.v2.bondage.CollarHelper;
|
||||||
|
import com.tiedup.remake.v2.bondage.V2EquipResult;
|
||||||
import com.tiedup.remake.v2.bondage.BindModeHelper;
|
import com.tiedup.remake.v2.bondage.BindModeHelper;
|
||||||
import com.tiedup.remake.v2.bondage.IV2BondageEquipment;
|
import com.tiedup.remake.v2.bondage.IV2BondageEquipment;
|
||||||
import com.tiedup.remake.v2.bondage.TyingInteractionHelper;
|
import com.tiedup.remake.v2.bondage.TyingInteractionHelper;
|
||||||
@@ -168,11 +173,39 @@ public class DataDrivenBondageItem extends AbstractV2BondageItem {
|
|||||||
return TyingInteractionHelper.handleTying(serverPlayer, target, stack, hand);
|
return TyingInteractionHelper.handleTying(serverPlayer, target, stack, hand);
|
||||||
}
|
}
|
||||||
|
|
||||||
// NECK: blocked — collar equip requires owner setup (add owner to NBT,
|
// NECK: collar equip flow
|
||||||
// register in CollarRegistry, play sound, sync) which is not yet wired
|
if (regions.contains(BodyRegionV2.NECK) && player instanceof ServerPlayer serverPlayer) {
|
||||||
// through interactLivingEntity. TODO: implement collar equip flow.
|
// Target must be tied up to collar (V1 rule preserved)
|
||||||
if (regions.contains(BodyRegionV2.NECK)) {
|
IRestrainable targetState = KidnappedHelper.getKidnappedState(target);
|
||||||
TiedUpMod.LOGGER.debug("[DataDrivenBondageItem] NECK equip via right-click not yet implemented");
|
if (targetState == null || !targetState.isTiedUp()) {
|
||||||
|
return InteractionResult.PASS;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Distance + line-of-sight
|
||||||
|
if (player.distanceTo(target) > 4.0 || !player.hasLineOfSight(target)) {
|
||||||
|
return InteractionResult.PASS;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add player as owner in NBT before equip
|
||||||
|
ItemStack collarCopy = stack.copy();
|
||||||
|
CollarHelper.addOwner(collarCopy, player);
|
||||||
|
|
||||||
|
// Equip via V2 system (handles conflict resolution, displaced items)
|
||||||
|
V2EquipResult result = V2EquipmentHelper.equipItem(target, collarCopy);
|
||||||
|
if (result.isSuccess()) {
|
||||||
|
for (ItemStack displaced : result.displaced()) {
|
||||||
|
target.spawnAtLocation(displaced);
|
||||||
|
}
|
||||||
|
stack.shrink(1);
|
||||||
|
// Play collar equip sound
|
||||||
|
target.level().playSound(null, target.getX(), target.getY(), target.getZ(),
|
||||||
|
ModSounds.COLLAR_PUT.get(),
|
||||||
|
net.minecraft.sounds.SoundSource.PLAYERS, 0.5f, 1.0f);
|
||||||
|
V2EquipmentHelper.sync(target);
|
||||||
|
TiedUpMod.LOGGER.info("[DataDrivenBondageItem] {} collared {} (owner added)",
|
||||||
|
player.getName().getString(), target.getName().getString());
|
||||||
|
return InteractionResult.SUCCESS;
|
||||||
|
}
|
||||||
return InteractionResult.PASS;
|
return InteractionResult.PASS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user