package com.tiedup.remake.client.animation; import com.tiedup.remake.items.base.PoseType; import net.minecraft.client.model.HumanoidModel; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; /** * Applies static bondage poses directly to HumanoidModel. * *

Used for entities that don't support PlayerAnimator (e.g., MCA villagers). * Directly modifies arm/leg rotations on the model. * *

Extracted from BondageAnimationManager to separate concerns: * BondageAnimationManager handles PlayerAnimator layers, * StaticPoseApplier handles raw model manipulation. */ @OnlyIn(Dist.CLIENT) public class StaticPoseApplier { /** * Apply a static bondage pose directly to a HumanoidModel. * * @param model The humanoid model to modify * @param poseType The pose type (STANDARD, STRAITJACKET, WRAP, LATEX_SACK) * @param armsBound whether ARMS region is occupied * @param legsBound whether LEGS region is occupied */ public static void applyStaticPose( HumanoidModel model, PoseType poseType, boolean armsBound, boolean legsBound ) { if (model == null) { return; } applyBodyPose(model, poseType); if (armsBound) { applyArmPose(model, poseType); } if (legsBound) { applyLegPose(model, poseType); } } /** * Apply arm pose based on pose type. * Values converted from animation JSON (degrees to radians). */ private static void applyArmPose( HumanoidModel model, PoseType poseType ) { switch (poseType) { case STANDARD -> { model.rightArm.xRot = 0.899f; model.rightArm.yRot = 1.0f; model.rightArm.zRot = 0f; model.leftArm.xRot = 0.899f; model.leftArm.yRot = -1.0f; model.leftArm.zRot = 0f; } case STRAITJACKET -> { model.rightArm.xRot = 0.764f; model.rightArm.yRot = -0.84f; model.rightArm.zRot = 0f; model.leftArm.xRot = 0.764f; model.leftArm.yRot = 0.84f; model.leftArm.zRot = 0f; } case WRAP, LATEX_SACK -> { model.rightArm.xRot = 0f; model.rightArm.yRot = 0f; model.rightArm.zRot = -0.087f; model.leftArm.xRot = 0f; model.leftArm.yRot = 0f; model.leftArm.zRot = 0.087f; } case DOG -> { model.rightArm.xRot = -2.094f; model.rightArm.yRot = 0.175f; model.rightArm.zRot = 0f; model.leftArm.xRot = -2.094f; model.leftArm.yRot = -0.175f; model.leftArm.zRot = 0f; } case HUMAN_CHAIR -> { model.rightArm.xRot = -2.094f; model.rightArm.yRot = 0.175f; model.rightArm.zRot = 0f; model.leftArm.xRot = -2.094f; model.leftArm.yRot = -0.175f; model.leftArm.zRot = 0f; } } } /** * Apply leg pose based on pose type. */ private static void applyLegPose( HumanoidModel model, PoseType poseType ) { if (poseType == PoseType.DOG || poseType == PoseType.HUMAN_CHAIR) { model.rightLeg.xRot = -1.047f; model.rightLeg.yRot = 0.349f; model.rightLeg.zRot = 0f; model.leftLeg.xRot = -1.047f; model.leftLeg.yRot = -0.349f; model.leftLeg.zRot = 0f; } else { model.rightLeg.xRot = 0f; model.rightLeg.yRot = 0f; model.rightLeg.zRot = -0.1f; model.leftLeg.xRot = 0f; model.leftLeg.yRot = 0f; model.leftLeg.zRot = 0.1f; } } /** * Apply body pose for DOG/HUMAN_CHAIR pose. */ public static void applyBodyPose( HumanoidModel model, PoseType poseType ) { if (poseType == PoseType.DOG || poseType == PoseType.HUMAN_CHAIR) { model.body.xRot = -1.571f; } } }