diff --git a/build.gradle b/build.gradle
index d14fb18..0d0a235 100644
--- a/build.gradle
+++ b/build.gradle
@@ -66,7 +66,7 @@ minecraft {
// However, it must be at "META-INF/accesstransformer.cfg" in the final mod jar to be loaded by Forge.
// This default location is a best practice to automatically put the file in the right place in the final jar.
// See https://docs.minecraftforge.net/en/latest/advanced/accesstransformers/ for more information.
- // accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg')
+ accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg')
// Default run configurations.
// These can be tweaked, removed, or duplicated as needed.
diff --git a/src/main/java/com/tiedup/remake/rig/TiedUpRigConstants.java b/src/main/java/com/tiedup/remake/rig/TiedUpRigConstants.java
index 2e30a5f..c86ccb8 100644
--- a/src/main/java/com/tiedup/remake/rig/TiedUpRigConstants.java
+++ b/src/main/java/com/tiedup/remake/rig/TiedUpRigConstants.java
@@ -99,16 +99,28 @@ public final class TiedUpRigConstants {
/**
* En dev env : log via le consumer + throw l'exception.
- * En prod : log seulement. Équivalent EF {@code TiedUpRigConstants.logAndStacktraceIfDevSide}.
+ * En prod : log seulement. Équivalent EF {@code EpicFightMod.logAndStacktraceIfDevSide}.
*/
- public static void logAndStacktraceIfDevSide(
+ public static void logAndStacktraceIfDevSide(
java.util.function.BiConsumer logAction,
String message,
- java.util.function.Function exceptionFactory
+ java.util.function.Function exceptionFactory
+ ) {
+ logAndStacktraceIfDevSide(logAction, message, exceptionFactory, message);
+ }
+
+ public static void logAndStacktraceIfDevSide(
+ java.util.function.BiConsumer logAction,
+ String message,
+ java.util.function.Function exceptionFactory,
+ String stackTraceMessage
) {
logAction.accept(LOGGER, message);
if (IS_DEV_ENV) {
- throw exceptionFactory.apply(message);
+ Throwable t = exceptionFactory.apply(stackTraceMessage);
+ if (t instanceof RuntimeException re) throw re;
+ if (t instanceof Error err) throw err;
+ throw new RuntimeException(t);
}
}
}
diff --git a/src/main/java/com/tiedup/remake/rig/anim/AnimationManager.java b/src/main/java/com/tiedup/remake/rig/anim/AnimationManager.java
index 1f81340..479ea4f 100644
--- a/src/main/java/com/tiedup/remake/rig/anim/AnimationManager.java
+++ b/src/main/java/com/tiedup/remake/rig/anim/AnimationManager.java
@@ -23,7 +23,7 @@ import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;
-import org.apache.logging.log4j.Logger;
+import org.slf4j.Logger;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
diff --git a/src/main/java/com/tiedup/remake/rig/anim/client/property/TrailInfo.java b/src/main/java/com/tiedup/remake/rig/anim/client/property/TrailInfo.java
new file mode 100644
index 0000000..0feec1a
--- /dev/null
+++ b/src/main/java/com/tiedup/remake/rig/anim/client/property/TrailInfo.java
@@ -0,0 +1,29 @@
+/*
+ * Derived from Epic Fight (https://github.com/Epic-Fight/epicfight)
+ * by the Epic Fight Team, licensed under GPLv3.
+ * Modifications © 2026 TiedUp! Remake Contributors, distributed under GPLv3.
+ */
+
+package com.tiedup.remake.rig.anim.client.property;
+
+import com.google.gson.JsonElement;
+
+import net.minecraft.core.particles.SimpleParticleType;
+import net.minecraft.world.phys.Vec3;
+
+/**
+ * Stub RIG Phase 0 — combat weapon particle trail. Pas utilisé dans TiedUp
+ * (bondage, pas d'armes actives), mais on garde l'API typée pour JSON compat.
+ * {@code deserialize} retourne toujours un trail neutre non-playable, donc
+ * le block dans StaticAnimation est court-circuité (voir {@link #playable()}).
+ */
+public record TrailInfo(String joint, SimpleParticleType particle, boolean playable) {
+ public static TrailInfo deserialize(JsonElement element) {
+ return new TrailInfo("", null, false);
+ }
+
+ public Vec3 start() { return Vec3.ZERO; }
+ public Vec3 end() { return Vec3.ZERO; }
+ public float startTime() { return 0.0F; }
+ public float endTime() { return 0.0F; }
+}
diff --git a/src/main/java/com/tiedup/remake/rig/anim/types/ActionAnimation.java b/src/main/java/com/tiedup/remake/rig/anim/types/ActionAnimation.java
index 1062f09..c66ace9 100644
--- a/src/main/java/com/tiedup/remake/rig/anim/types/ActionAnimation.java
+++ b/src/main/java/com/tiedup/remake/rig/anim/types/ActionAnimation.java
@@ -6,6 +6,10 @@
package com.tiedup.remake.rig.anim.types;
+import net.minecraft.world.phys.Vec3;
+
+import com.tiedup.remake.rig.anim.AnimationVariables;
+import com.tiedup.remake.rig.anim.AnimationVariables.IndependentAnimationVariableKey;
import com.tiedup.remake.rig.anim.property.AnimationProperty.ActionAnimationProperty;
import com.tiedup.remake.rig.armature.Armature;
import com.tiedup.remake.rig.asset.AssetAccessor;
@@ -19,6 +23,13 @@ import com.tiedup.remake.rig.asset.AssetAccessor;
*/
public class ActionAnimation extends MainFrameAnimation {
+ // Variables indépendantes propagées à MoveCoordFunctions (position de départ
+ // en coord monde + produit scalaire lookVec initial pour lerp anim→world).
+ public static final IndependentAnimationVariableKey BEGINNING_LOCATION =
+ AnimationVariables.independent((animator) -> animator.getEntityPatch().getOriginal().position(), true);
+ public static final IndependentAnimationVariableKey INITIAL_LOOK_VEC_DOT =
+ AnimationVariables.independent((animator) -> 1.0F, true);
+
public ActionAnimation(float transitionTime, boolean isRepeat, String registryName, AssetAccessor extends Armature> armature) {
super(transitionTime, isRepeat, registryName, armature);
}
@@ -34,4 +45,18 @@ public class ActionAnimation extends MainFrameAnimation {
public ActionAnimation addProperty(ActionAnimationProperty property, V value) {
return this;
}
+
+ /**
+ * Stub — LinkAnimation.modifyPose appelle ça pour aligner la root joint
+ * en espace monde pendant la transition. No-op en TiedUp.
+ */
+ public void correctRootJoint(
+ com.tiedup.remake.rig.anim.types.LinkAnimation linkAnimation,
+ com.tiedup.remake.rig.anim.Pose pose,
+ com.tiedup.remake.rig.patch.LivingEntityPatch> entitypatch,
+ float time,
+ float partialTicks
+ ) {
+ // no-op
+ }
}
diff --git a/src/main/java/com/tiedup/remake/rig/anim/types/AttackAnimation.java b/src/main/java/com/tiedup/remake/rig/anim/types/AttackAnimation.java
index e765701..0eff923 100644
--- a/src/main/java/com/tiedup/remake/rig/anim/types/AttackAnimation.java
+++ b/src/main/java/com/tiedup/remake/rig/anim/types/AttackAnimation.java
@@ -9,6 +9,8 @@ package com.tiedup.remake.rig.anim.types;
import java.util.Collections;
import java.util.List;
+import net.minecraft.world.InteractionHand;
+
import com.tiedup.remake.rig.armature.Armature;
import com.tiedup.remake.rig.asset.AssetAccessor;
@@ -44,13 +46,34 @@ public class AttackAnimation extends ActionAnimation {
super(isRepeat, registryName, armature);
}
+ /**
+ * Stub — MoveCoordFunctions appelle ça pour calculer la reach mid-anim.
+ * On retourne toujours une Phase neutre (mainHand, pas de colliders),
+ * donc le reach retombe sur {@code entitypatch.getReach(MAIN_HAND)}.
+ */
+ public Phase getPhaseByTime(float elapsedTime) {
+ return new Phase();
+ }
+
/**
* Phase d'attaque. Stub pour satisfaire {@code phase.getColliders()}
- * en JsonAssetLoader.
+ * en JsonAssetLoader + {@code phase.hand} en MoveCoordFunctions.
*/
public static class Phase {
- public Object[] getColliders() {
- return new Object[0];
+ public final InteractionHand hand = InteractionHand.MAIN_HAND;
+
+ public JointColliderPair[] getColliders() {
+ return new JointColliderPair[0];
+ }
+ }
+
+ /**
+ * Stub — (Joint, Collider) pair pour les hitboxes combat. Non utilisé
+ * en TiedUp, juste un placeholder typé pour que JsonAssetLoader:592 compile.
+ */
+ public static class JointColliderPair {
+ public com.tiedup.remake.rig.armature.Joint getFirst() {
+ return null;
}
}
}
diff --git a/src/main/java/com/tiedup/remake/rig/anim/types/StaticAnimation.java b/src/main/java/com/tiedup/remake/rig/anim/types/StaticAnimation.java
index 992cef8..aaffa60 100644
--- a/src/main/java/com/tiedup/remake/rig/anim/types/StaticAnimation.java
+++ b/src/main/java/com/tiedup/remake/rig/anim/types/StaticAnimation.java
@@ -116,6 +116,11 @@ public class StaticAnimation extends DynamicAnimation implements InverseKinemati
this.filehash = getFileHash(this.resourceLocation);
}
+ /* Resourcepack animations — transitionTime par défaut */
+ public StaticAnimation(boolean isRepeat, String path, AssetAccessor extends Armature> armature) {
+ this(TiedUpRigConstants.GENERAL_ANIMATION_TRANSITION_TIME, isRepeat, path, armature);
+ }
+
/* Resourcepack animations */
public StaticAnimation(float transitionTime, boolean isRepeat, String path, AssetAccessor extends Armature> armature) {
super(transitionTime, isRepeat);
diff --git a/src/main/java/com/tiedup/remake/rig/armature/types/ToolHolderArmature.java b/src/main/java/com/tiedup/remake/rig/armature/types/ToolHolderArmature.java
new file mode 100644
index 0000000..be8851e
--- /dev/null
+++ b/src/main/java/com/tiedup/remake/rig/armature/types/ToolHolderArmature.java
@@ -0,0 +1,21 @@
+/*
+ * Derived from Epic Fight (https://github.com/Epic-Fight/epicfight)
+ * by the Epic Fight Team, licensed under GPLv3.
+ * Modifications © 2026 TiedUp! Remake Contributors, distributed under GPLv3.
+ */
+
+package com.tiedup.remake.rig.armature.types;
+
+import com.tiedup.remake.rig.armature.Joint;
+
+/**
+ * Interface pour armatures portant un outil (main gauche/droite + dos).
+ * TiedUp gardera cette convention pour maintenir la compat avec les JSON EF
+ * (rig équivalent : Tool_R, Tool_L, Tool_Back). Dans les faits, dans un
+ * contexte bondage, "outil" = menottes, laisse, cage, etc.
+ */
+public interface ToolHolderArmature {
+ Joint leftToolJoint();
+ Joint rightToolJoint();
+ Joint backToolJoint();
+}
diff --git a/src/main/java/com/tiedup/remake/rig/cloth/ClothSimulator.java b/src/main/java/com/tiedup/remake/rig/cloth/ClothSimulator.java
index d7dbda8..67013e2 100644
--- a/src/main/java/com/tiedup/remake/rig/cloth/ClothSimulator.java
+++ b/src/main/java/com/tiedup/remake/rig/cloth/ClothSimulator.java
@@ -415,10 +415,11 @@ public class ClothSimulator extends AbstractSimulator, ClothSimulator.ClothOBBCollider> entry : this.clothColliders) {
- entry.getSecond().draw(poseStack, Minecraft.getInstance().renderBuffers().bufferSource(), 0xFFFFFFFF);
- }
+ // no-op Phase 0
}
// Remove entity inverted world translation while keeping the scale
diff --git a/src/main/java/com/tiedup/remake/rig/mesh/HumanoidMesh.java b/src/main/java/com/tiedup/remake/rig/mesh/HumanoidMesh.java
index e36409c..d63d2e7 100644
--- a/src/main/java/com/tiedup/remake/rig/mesh/HumanoidMesh.java
+++ b/src/main/java/com/tiedup/remake/rig/mesh/HumanoidMesh.java
@@ -49,17 +49,9 @@ public class HumanoidMesh extends SkinnedMesh {
}
public AssetAccessor extends SkinnedMesh> getHumanoidArmorModel(EquipmentSlot slot) {
- switch (slot) {
- case HEAD:
- return Meshes.HELMET;
- case CHEST:
- return Meshes.CHESTPLATE;
- case LEGS:
- return Meshes.LEGGINS;
- case FEET:
- return Meshes.BOOTS;
- default:
- return null;
- }
+ // RIG : Meshes.{HELMET,CHESTPLATE,LEGGINS,BOOTS} strippés en Phase 0 (armor rendering
+ // hors scope bondage V1). Re-implém Phase 2 si besoin de rendre armures vanilla
+ // sur le rig — pour l'instant retour null = armor rendering off.
+ return null;
}
}
diff --git a/src/main/java/com/tiedup/remake/rig/mesh/transformer/VanillaModelTransformer.java b/src/main/java/com/tiedup/remake/rig/mesh/transformer/VanillaModelTransformer.java
new file mode 100644
index 0000000..aa34dba
--- /dev/null
+++ b/src/main/java/com/tiedup/remake/rig/mesh/transformer/VanillaModelTransformer.java
@@ -0,0 +1,55 @@
+/*
+ * Derived from Epic Fight (https://github.com/Epic-Fight/epicfight)
+ * by the Epic Fight Team, licensed under GPLv3.
+ * Modifications © 2026 TiedUp! Remake Contributors, distributed under GPLv3.
+ */
+
+package com.tiedup.remake.rig.mesh.transformer;
+
+import java.util.List;
+import java.util.function.Supplier;
+
+import net.minecraft.client.model.geom.ModelPart;
+
+import com.tiedup.remake.rig.math.OpenMatrix4f;
+import com.tiedup.remake.rig.mesh.Mesh;
+import com.tiedup.remake.rig.mesh.MeshPartDefinition;
+
+/**
+ * Stub RIG Phase 0 — le transformer complet EF (HumanoidModel → SkinnedMesh
+ * runtime conversion) n'est pas porté : TiedUp utilise exclusivement GLB +
+ * JSON EF pour la définition des meshes. Seule la record
+ * {@link VanillaMeshPartDefinition} est conservée, car référencée par
+ * {@code JsonAssetLoader} pour instancier les parts nommées.
+ *
+ * Phase 2 : décider si on fork le transformer pour garder la compat runtime
+ * avec les modèles vanilla (armor rendering), ou si on reroute vers GLB only.
+ */
+public class VanillaModelTransformer {
+
+ public record VanillaMeshPartDefinition(
+ String partName,
+ Mesh.RenderProperties renderProperties,
+ List path,
+ OpenMatrix4f invertedParentTransform,
+ ModelPart root
+ ) implements MeshPartDefinition {
+
+ public static MeshPartDefinition of(String partName, Mesh.RenderProperties renderProperties) {
+ return new VanillaMeshPartDefinition(partName, renderProperties, null, null, null);
+ }
+
+ public static MeshPartDefinition of(String partName) {
+ return new VanillaMeshPartDefinition(partName, null, null, null, null);
+ }
+
+ public static MeshPartDefinition of(String partName, List path, OpenMatrix4f invertedParentTransform, ModelPart root) {
+ return new VanillaMeshPartDefinition(partName, null, path, invertedParentTransform, root);
+ }
+
+ @Override
+ public Supplier getModelPartAnimationProvider() {
+ return () -> null;
+ }
+ }
+}
diff --git a/src/main/java/com/tiedup/remake/rig/patch/LivingEntityPatch.java b/src/main/java/com/tiedup/remake/rig/patch/LivingEntityPatch.java
index 4c63d4d..56b049d 100644
--- a/src/main/java/com/tiedup/remake/rig/patch/LivingEntityPatch.java
+++ b/src/main/java/com/tiedup/remake/rig/patch/LivingEntityPatch.java
@@ -8,6 +8,7 @@ package com.tiedup.remake.rig.patch;
import javax.annotation.Nullable;
+import net.minecraft.world.InteractionHand;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.phys.Vec3;
@@ -65,6 +66,10 @@ public abstract class LivingEntityPatch extends EntityPa
return 1.0F;
}
+ public float getReach(InteractionHand hand) {
+ return getReach();
+ }
+
public float getYRot() {
return this.original.getYRot();
}
diff --git a/src/main/java/com/tiedup/remake/rig/patch/PlayerPatch.java b/src/main/java/com/tiedup/remake/rig/patch/PlayerPatch.java
new file mode 100644
index 0000000..b47449c
--- /dev/null
+++ b/src/main/java/com/tiedup/remake/rig/patch/PlayerPatch.java
@@ -0,0 +1,17 @@
+/*
+ * Derived from Epic Fight (https://github.com/Epic-Fight/epicfight)
+ * by the Epic Fight Team, licensed under GPLv3.
+ * Modifications © 2026 TiedUp! Remake Contributors, distributed under GPLv3.
+ */
+
+package com.tiedup.remake.rig.patch;
+
+import net.minecraft.world.entity.player.Player;
+
+/**
+ * Stub RIG Phase 0 — patch de capability attaché à un {@link Player}.
+ * Re-implém complète Phase 2 (séparation ClientPlayerPatch / ServerPlayerPatch,
+ * input handling, first-person, cam sync).
+ */
+public abstract class PlayerPatch extends LivingEntityPatch {
+}
diff --git a/src/main/java/com/tiedup/remake/rig/physics/ik/InverseKinematicsProvider.java b/src/main/java/com/tiedup/remake/rig/physics/ik/InverseKinematicsProvider.java
index b5f1e9e..1cdd541 100644
--- a/src/main/java/com/tiedup/remake/rig/physics/ik/InverseKinematicsProvider.java
+++ b/src/main/java/com/tiedup/remake/rig/physics/ik/InverseKinematicsProvider.java
@@ -6,6 +6,7 @@
package com.tiedup.remake.rig.physics.ik;
+import com.tiedup.remake.rig.physics.SimulationProvider;
import com.tiedup.remake.rig.physics.ik.InverseKinematicsSimulator.InverseKinematicsBuilder;
import com.tiedup.remake.rig.physics.ik.InverseKinematicsSimulator.InverseKinematicsObject;
@@ -19,13 +20,15 @@ import com.tiedup.remake.rig.physics.ik.InverseKinematicsSimulator.InverseKinema
* Conservé comme interface vide pour que {@code StaticAnimation
* implements InverseKinematicsProvider} compile.
*/
-public interface InverseKinematicsProvider {
+public interface InverseKinematicsProvider
+ extends SimulationProvider {
/**
* Crée les données de simulation IK. Stub par défaut : no-op.
* Surchargé dans les classes qui auraient réellement de l'IK (aucune
* en TiedUp).
*/
+ @Override
default InverseKinematicsObject createSimulationData(
InverseKinematicsProvider provider,
InverseKinematicsSimulatable simOwner,
diff --git a/src/main/java/com/tiedup/remake/rig/physics/ik/InverseKinematicsSimulator.java b/src/main/java/com/tiedup/remake/rig/physics/ik/InverseKinematicsSimulator.java
index 9f16716..444aa95 100644
--- a/src/main/java/com/tiedup/remake/rig/physics/ik/InverseKinematicsSimulator.java
+++ b/src/main/java/com/tiedup/remake/rig/physics/ik/InverseKinematicsSimulator.java
@@ -6,6 +6,13 @@
package com.tiedup.remake.rig.physics.ik;
+import java.util.Optional;
+import java.util.function.BooleanSupplier;
+
+import com.tiedup.remake.rig.armature.Joint;
+import com.tiedup.remake.rig.physics.PhysicsSimulator;
+import com.tiedup.remake.rig.physics.SimulationObject;
+
/**
* RIG stub. Upstream EF : simulateur d'inverse kinematics (solveur CCD
* ou FABRIK) utilisé pour attacher des membres à des points cibles
@@ -15,15 +22,24 @@ package com.tiedup.remake.rig.physics.ik;
* AnimationProperty compilent. Les nested types sont des stubs sans
* logique.
*/
-public class InverseKinematicsSimulator {
+public class InverseKinematicsSimulator implements PhysicsSimulator {
- public static class InverseKinematicsObject {
+ @Override public void tick(InverseKinematicsSimulatable object) {}
+ @Override public boolean isRunning(Joint key) { return false; }
+ @Override public void runUntil(Joint key, InverseKinematicsProvider provider, InverseKinematicsBuilder builder, BooleanSupplier when) {}
+ @Override public void runWhen(Joint key, InverseKinematicsProvider provider, InverseKinematicsBuilder builder, BooleanSupplier when) {}
+ @Override public void restart(Joint key) {}
+ @Override public void stop(Joint key) {}
+ @Override public Optional getRunningObject(Joint key) { return Optional.empty(); }
+
+
+ public static class InverseKinematicsObject implements SimulationObject {
public InverseKinematicsObject(InverseKinematicsBuilder builder) {
// no-op
}
}
- public static class InverseKinematicsBuilder {
+ public static class InverseKinematicsBuilder extends SimulationObject.SimulationObjectBuilder {
// no-op stub
}
@@ -35,8 +51,8 @@ public class InverseKinematicsSimulator {
public BakedInverseKinematicsDefinition bake(
Object armature,
Object jointTransforms,
- float correctY,
- float correctZ) {
+ boolean correctY,
+ boolean correctZ) {
return new BakedInverseKinematicsDefinition();
}
}
diff --git a/src/main/java/com/tiedup/remake/rig/render/PatchedEntityRenderer.java b/src/main/java/com/tiedup/remake/rig/render/PatchedEntityRenderer.java
new file mode 100644
index 0000000..0116073
--- /dev/null
+++ b/src/main/java/com/tiedup/remake/rig/render/PatchedEntityRenderer.java
@@ -0,0 +1,15 @@
+/*
+ * Derived from Epic Fight (https://github.com/Epic-Fight/epicfight)
+ * by the Epic Fight Team, licensed under GPLv3.
+ * Modifications © 2026 TiedUp! Remake Contributors, distributed under GPLv3.
+ */
+
+package com.tiedup.remake.rig.render;
+
+/**
+ * Stub RIG Phase 0 — renderer EF substituant {@code EntityRenderer} vanilla
+ * pour les entités riggées. Implémentation complète Phase 2 (pipeline :
+ * pose → armature → skinning → VertexConsumer).
+ */
+public abstract class PatchedEntityRenderer {
+}
diff --git a/src/main/java/com/tiedup/remake/rig/render/TiedUpRenderTypes.java b/src/main/java/com/tiedup/remake/rig/render/TiedUpRenderTypes.java
index ea42c6f..82292ba 100644
--- a/src/main/java/com/tiedup/remake/rig/render/TiedUpRenderTypes.java
+++ b/src/main/java/com/tiedup/remake/rig/render/TiedUpRenderTypes.java
@@ -48,7 +48,7 @@ public final class TiedUpRenderTypes extends RenderType {
private static final BiFunction TRIANGULATED_OUTLINE =
Util.memoize((texLocation, cullStateShard) -> {
return RenderType.create(
- TiedUpRigConstants.prefix("outline"),
+ TiedUpRigConstants.prefix("outline").toString(),
DefaultVertexFormat.POSITION_COLOR_TEX,
VertexFormat.Mode.TRIANGLES,
256,
@@ -288,7 +288,7 @@ public final class TiedUpRenderTypes extends RenderType {
private static final RenderType ENTITY_UI_COLORED =
create(
- TiedUpRigConstants.prefix("ui_color")
+ TiedUpRigConstants.prefix("ui_color").toString()
, DefaultVertexFormat.POSITION_COLOR
, VertexFormat.Mode.QUADS
, 256
@@ -304,7 +304,7 @@ public final class TiedUpRenderTypes extends RenderType {
private static final Function ENTITY_UI_TEXTURE = Util.memoize(
(textureLocation) -> create(
- TiedUpRigConstants.prefix("ui_texture")
+ TiedUpRigConstants.prefix("ui_texture").toString()
, DefaultVertexFormat.POSITION_TEX
, VertexFormat.Mode.QUADS
, 256
@@ -321,7 +321,7 @@ public final class TiedUpRenderTypes extends RenderType {
);
private static final RenderType OBB = create(
- TiedUpRigConstants.prefix("debug_collider")
+ TiedUpRigConstants.prefix("debug_collider").toString()
, DefaultVertexFormat.POSITION_COLOR_NORMAL
, VertexFormat.Mode.LINE_STRIP
, 256
@@ -339,7 +339,7 @@ public final class TiedUpRenderTypes extends RenderType {
);
private static final RenderType DEBUG_QUADS = create(
- TiedUpRigConstants.prefix("debug_quad")
+ TiedUpRigConstants.prefix("debug_quad").toString()
, DefaultVertexFormat.POSITION_COLOR
, VertexFormat.Mode.QUADS
, 256
@@ -355,7 +355,7 @@ public final class TiedUpRenderTypes extends RenderType {
);
private static final RenderType GUI_TRIANGLE = create(
- TiedUpRigConstants.prefix("gui_triangle")
+ TiedUpRigConstants.prefix("gui_triangle").toString()
, DefaultVertexFormat.POSITION_COLOR
, VertexFormat.Mode.TRIANGLES
, 256
@@ -370,7 +370,7 @@ public final class TiedUpRenderTypes extends RenderType {
private static final Function OVERLAY_MODEL = Util.memoize(texLocation -> {
return create(
- TiedUpRigConstants.prefix("overlay_model"),
+ TiedUpRigConstants.prefix("overlay_model").toString(),
DefaultVertexFormat.NEW_ENTITY,
VertexFormat.Mode.TRIANGLES,
256,
@@ -391,7 +391,7 @@ public final class TiedUpRenderTypes extends RenderType {
private static final RenderType ENTITY_AFTERIMAGE_WHITE =
create(
- TiedUpRigConstants.prefix("entity_afterimage"),
+ TiedUpRigConstants.prefix("entity_afterimage").toString(),
DefaultVertexFormat.PARTICLE,
VertexFormat.Mode.TRIANGLES,
256,
@@ -410,7 +410,7 @@ public final class TiedUpRenderTypes extends RenderType {
private static final RenderType ITEM_AFTERIMAGE_WHITE =
create(
- TiedUpRigConstants.prefix("item_afterimage"),
+ TiedUpRigConstants.prefix("item_afterimage").toString(),
DefaultVertexFormat.PARTICLE,
VertexFormat.Mode.QUADS,
256,
@@ -429,7 +429,7 @@ public final class TiedUpRenderTypes extends RenderType {
private static final Function ENTITY_PARTICLE = Util.memoize(texLocation -> {
return create(
- TiedUpRigConstants.prefix("entity_particle"),
+ TiedUpRigConstants.prefix("entity_particle").toString(),
DefaultVertexFormat.NEW_ENTITY,
VertexFormat.Mode.TRIANGLES,
256,
@@ -449,7 +449,7 @@ public final class TiedUpRenderTypes extends RenderType {
private static final RenderType ITEM_PARTICLE =
create(
- TiedUpRigConstants.prefix("item_particle"),
+ TiedUpRigConstants.prefix("item_particle").toString(),
DefaultVertexFormat.NEW_ENTITY,
VertexFormat.Mode.QUADS,
256,
@@ -468,7 +468,7 @@ public final class TiedUpRenderTypes extends RenderType {
private static final Function ENTITY_PARTICLE_STENCIL = Util.memoize(texLocation -> {
return create(
- TiedUpRigConstants.prefix("entity_particle_stencil"),
+ TiedUpRigConstants.prefix("entity_particle_stencil").toString(),
DefaultVertexFormat.POSITION_TEX,
VertexFormat.Mode.TRIANGLES,
256,
@@ -484,7 +484,7 @@ public final class TiedUpRenderTypes extends RenderType {
private static final RenderType ITEM_PARTICLE_STENCIL =
create(
- TiedUpRigConstants.prefix("item_particle_stencil"),
+ TiedUpRigConstants.prefix("item_particle_stencil").toString(),
DefaultVertexFormat.POSITION_TEX,
VertexFormat.Mode.QUADS,
256,
@@ -499,7 +499,7 @@ public final class TiedUpRenderTypes extends RenderType {
private static final RenderType.CompositeRenderType BLOCK_HIGHLIGHT =
create(
- TiedUpRigConstants.prefix("block_highlight"),
+ TiedUpRigConstants.prefix("block_highlight").toString(),
DefaultVertexFormat.BLOCK,
VertexFormat.Mode.QUADS,
256,
@@ -627,7 +627,7 @@ public final class TiedUpRenderTypes extends RenderType {
CompositeRenderType glintRenderType = WORLD_RENDERTYPES_COLORED_GLINT.computeIfAbsent(
owner,
k -> create(
- TiedUpRigConstants.prefix("colored_glint"),
+ TiedUpRigConstants.prefix("colored_glint").toString(),
DefaultVertexFormat.POSITION_TEX,
VertexFormat.Mode.TRIANGLES,
256,
diff --git a/src/main/java/com/tiedup/remake/rig/render/compute/ComputeShaderProvider.java b/src/main/java/com/tiedup/remake/rig/render/compute/ComputeShaderProvider.java
index 61b69ca..2ef0490 100644
--- a/src/main/java/com/tiedup/remake/rig/render/compute/ComputeShaderProvider.java
+++ b/src/main/java/com/tiedup/remake/rig/render/compute/ComputeShaderProvider.java
@@ -20,6 +20,11 @@ public final class ComputeShaderProvider {
return null;
}
+ /** Stub : compute shader jamais supporté en Phase 0 → CPU skinning uniquement. */
+ public static boolean supportComputeShader() {
+ return false;
+ }
+
/** Stub no-op pour Iris init (référence pour IRISCompat éventuel). */
public static void initIris() {
// no-op Phase 0
diff --git a/src/main/java/com/tiedup/remake/rig/render/compute/ComputeShaderSetup.java b/src/main/java/com/tiedup/remake/rig/render/compute/ComputeShaderSetup.java
index b81a002..209199f 100644
--- a/src/main/java/com/tiedup/remake/rig/render/compute/ComputeShaderSetup.java
+++ b/src/main/java/com/tiedup/remake/rig/render/compute/ComputeShaderSetup.java
@@ -13,6 +13,7 @@ import net.minecraft.client.renderer.RenderType;
import com.tiedup.remake.rig.mesh.Mesh;
import com.tiedup.remake.rig.armature.Armature;
import com.tiedup.remake.rig.math.OpenMatrix4f;
+import com.tiedup.remake.rig.TiedUpRigConstants;
/**
* RIG stub. Upstream EF : ComputeShaderSetup = binding OpenGL 4.3+ compute
@@ -25,6 +26,28 @@ import com.tiedup.remake.rig.math.OpenMatrix4f;
*/
public abstract class ComputeShaderSetup {
+ /** Pool de matrices réutilisées par SkinnedMesh pour le CPU skinning. */
+ public static final OpenMatrix4f[] TOTAL_POSES = new OpenMatrix4f[TiedUpRigConstants.MAX_JOINTS];
+ public static final OpenMatrix4f[] TOTAL_NORMALS = new OpenMatrix4f[TiedUpRigConstants.MAX_JOINTS];
+
+ static {
+ for (int i = 0; i < TiedUpRigConstants.MAX_JOINTS; i++) {
+ TOTAL_POSES[i] = new OpenMatrix4f();
+ TOTAL_NORMALS[i] = new OpenMatrix4f();
+ }
+ }
+
+ /**
+ * Stub inner class — utilisé par {@code SkinnedMesh.SkinnedMeshPart.partVBO}.
+ * Le CPU path ne crée jamais d'instance, ne pointe que le type.
+ */
+ public static class MeshPartBuffer {
+ public void destroyBuffers() {}
+ }
+
+ /** Libération des buffers VBO (GPU path). No-op sur le stub. */
+ public void destroyBuffers() {}
+
/** No-op stub : le chemin GPU compute n'est jamais emprunté. */
public void drawWithShader(
Object mesh,
diff --git a/src/main/java/com/tiedup/remake/rig/render/item/RenderItemBase.java b/src/main/java/com/tiedup/remake/rig/render/item/RenderItemBase.java
new file mode 100644
index 0000000..37af767
--- /dev/null
+++ b/src/main/java/com/tiedup/remake/rig/render/item/RenderItemBase.java
@@ -0,0 +1,15 @@
+/*
+ * Derived from Epic Fight (https://github.com/Epic-Fight/epicfight)
+ * by the Epic Fight Team, licensed under GPLv3.
+ * Modifications © 2026 TiedUp! Remake Contributors, distributed under GPLv3.
+ */
+
+package com.tiedup.remake.rig.render.item;
+
+/**
+ * Stub RIG Phase 0 — renderer pour les items (EF : weapons avec trail,
+ * tools). TiedUp : re-implém Phase 3 pour menottes/laisse/cage rendues
+ * attachées aux joints Tool_R/Tool_L via ItemStack injection.
+ */
+public abstract class RenderItemBase {
+}
diff --git a/src/main/java/com/tiedup/remake/rig/render/layer/LayerUtil.java b/src/main/java/com/tiedup/remake/rig/render/layer/LayerUtil.java
new file mode 100644
index 0000000..267ab33
--- /dev/null
+++ b/src/main/java/com/tiedup/remake/rig/render/layer/LayerUtil.java
@@ -0,0 +1,32 @@
+/*
+ * Derived from Epic Fight (https://github.com/Epic-Fight/epicfight)
+ * by the Epic Fight Team, licensed under GPLv3.
+ * Modifications © 2026 TiedUp! Remake Contributors, distributed under GPLv3.
+ */
+
+package com.tiedup.remake.rig.render.layer;
+
+import net.minecraft.client.model.EntityModel;
+import net.minecraft.client.renderer.entity.LivingEntityRenderer;
+import net.minecraft.world.entity.LivingEntity;
+
+import com.tiedup.remake.rig.mesh.SkinnedMesh;
+import com.tiedup.remake.rig.patch.LivingEntityPatch;
+
+/**
+ * Stub RIG Phase 0 — registry de layers additionnels (armor, glow, cape...)
+ * pour renderers EF. Implém complète Phase 2.
+ */
+public class LayerUtil {
+
+ @FunctionalInterface
+ public interface LayerProvider<
+ E extends LivingEntity,
+ T extends LivingEntityPatch,
+ M extends EntityModel,
+ R extends LivingEntityRenderer,
+ AM extends SkinnedMesh
+ > {
+ void addLayer(R renderer);
+ }
+}
diff --git a/src/main/java/com/tiedup/remake/rig/util/AttackResult.java b/src/main/java/com/tiedup/remake/rig/util/AttackResult.java
new file mode 100644
index 0000000..6bb16b1
--- /dev/null
+++ b/src/main/java/com/tiedup/remake/rig/util/AttackResult.java
@@ -0,0 +1,42 @@
+/*
+ * Derived from Epic Fight (https://github.com/Epic-Fight/epicfight)
+ * by the Epic Fight Team, licensed under GPLv3.
+ * Modifications © 2026 TiedUp! Remake Contributors, distributed under GPLv3.
+ */
+
+package com.tiedup.remake.rig.util;
+
+/**
+ * Stub RIG Phase 0 — encodage résultat d'attaque combat EF. Utilisé uniquement
+ * comme type pour {@code ATTACK_RESULT} StateFactor côté EntityState. Pas de
+ * logique combat dans TiedUp — logique porté Phase 2 si besoin hitboxes menottes.
+ */
+public class AttackResult {
+ public final ResultType resultType;
+ public final float damage;
+
+ public AttackResult(ResultType resultType, float damage) {
+ this.resultType = resultType;
+ this.damage = damage;
+ }
+
+ public static AttackResult success(float damage) { return new AttackResult(ResultType.SUCCESS, damage); }
+ public static AttackResult blocked(float damage) { return new AttackResult(ResultType.BLOCKED, damage); }
+ public static AttackResult missed(float damage) { return new AttackResult(ResultType.MISSED, damage); }
+ public static AttackResult of(ResultType resultType, float damage) { return new AttackResult(resultType, damage); }
+
+ public static enum ResultType {
+ SUCCESS(true, true), MISSED(false, false), BLOCKED(false, true);
+
+ boolean dealtDamage;
+ boolean shouldCount;
+
+ ResultType(boolean dealtDamage, boolean countAsHitEntity) {
+ this.dealtDamage = dealtDamage;
+ this.shouldCount = countAsHitEntity;
+ }
+
+ public boolean dealtDamage() { return this.dealtDamage; }
+ public boolean shouldCount() { return this.shouldCount; }
+ }
+}
diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg
new file mode 100644
index 0000000..ffef14d
--- /dev/null
+++ b/src/main/resources/META-INF/accesstransformer.cfg
@@ -0,0 +1,127 @@
+public net.minecraft.client.Minecraft m_202354_()Z # startAttack
+public net.minecraft.client.gui.components.AbstractSelectionList f_93399_ # scrolling
+protected-f net.minecraft.client.gui.components.AbstractSelectionList f_93387_ # itemHeight
+public net.minecraft.client.gui.components.AbstractSliderButton m_93611_(D)V # setValue
+public net.minecraft.client.gui.components.BossHealthOverlay f_93697_ # GUI_BARS_LOCATION
+public net.minecraft.client.gui.components.EditBox f_94089_ # responder
+public net.minecraft.client.gui.GuiGraphics f_279587_ # scissorStack
+public net.minecraft.client.gui.GuiGraphics m_280479_(Lnet/minecraft/resources/ResourceLocation;IIIIIFFFFFFFF)V # innerBlit
+public net.minecraft.client.gui.GuiGraphics$ScissorStack
+public net.minecraft.client.gui.GuiGraphics$ScissorStack f_279656_ # stack
+public net.minecraft.client.gui.screens.Screen f_267454_ # initialized
+public net.minecraft.client.Camera f_90562_ # eyeHeight
+public net.minecraft.client.Camera f_90563_ # eyeHeightOld
+public net.minecraft.client.Camera m_90566_(D)D # getMaxZoom
+public net.minecraft.client.Camera m_90568_(DDD)V # move
+public net.minecraft.client.Camera m_90572_(FF)V # setRotation
+public net.minecraft.client.Camera m_90584_(DDD)V # setPosition
+public net.minecraft.client.KeyboardHandler m_90913_(Ljava/lang/String;[Ljava/lang/Object;)V # debugFeedbackTranslated
+public net.minecraft.client.player.LocalPlayer f_108583_ # sprintToggleTimer
+public net.minecraft.client.renderer.MultiBufferSource$BufferSource f_109905_ # fixedBuffers
+public-f net.minecraft.client.renderer.block.model.ItemOverrides f_111735_ # overrides
+public-f net.minecraft.client.renderer.block.model.ItemOverrides f_173461_ # properties
+public net.minecraft.client.renderer.block.model.ItemOverrides$BakedOverride ([Lnet/minecraft/client/renderer/block/model/ItemOverrides$PropertyMatcher;Lnet/minecraft/client/resources/model/BakedModel;)V
+public net.minecraft.client.renderer.block.model.ItemOverrides$PropertyMatcher (IF)V
+public net.minecraft.client.renderer.block.model.ItemOverrides$PropertyMatcher
+public net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer f_117070_ # ARMOR_LOCATION_CACHE
+public net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer m_117078_(Lnet/minecraft/world/entity/EquipmentSlot;)Lnet/minecraft/client/model/HumanoidModel; # getArmorModel
+public net.minecraft.client.renderer.entity.layers.ElytraLayer f_116935_ # elytraModel
+public net.minecraft.client.renderer.entity.LivingEntityRenderer f_115291_ # layers
+public net.minecraft.client.renderer.GameRenderer m_109141_(Lnet/minecraft/client/Camera;FZ)D # getFov
+public net.minecraft.client.renderer.ItemInHandRenderer m_109366_(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;ILnet/minecraft/world/item/ItemStack;)V # renderMap
+public net.minecraft.client.renderer.LightTexture f_109870_ # lightTexture
+public net.minecraft.client.renderer.OutlineBufferSource f_109922_ # teamR
+public net.minecraft.client.renderer.OutlineBufferSource f_109923_ # teamG
+public net.minecraft.client.renderer.OutlineBufferSource f_109924_ # teamB
+public net.minecraft.client.renderer.OutlineBufferSource f_109925_ # teamA
+public net.minecraft.client.renderer.RenderStateShard f_110133_ # name
+public net.minecraft.client.renderer.RenderStateShard$ShaderStateShard f_173136_ # shader
+public net.minecraft.client.renderer.RenderStateShard$TextureStateShard f_110329_ # blur
+public net.minecraft.client.renderer.RenderStateShard$TextureStateShard f_110330_ # mipmap
+public net.minecraft.client.renderer.RenderStateShard$TextureStateShard f_110328_ # texture
+public net.minecraft.client.renderer.RenderType f_110389_ # format
+public net.minecraft.client.renderer.RenderType f_110393_ # sortOnUpload
+public-f net.minecraft.client.renderer.RenderType$CompositeState
+public net.minecraft.client.renderer.RenderType$CompositeState (Lnet/minecraft/client/renderer/RenderStateShard$EmptyTextureStateShard;Lnet/minecraft/client/renderer/RenderStateShard$ShaderStateShard;Lnet/minecraft/client/renderer/RenderStateShard$TransparencyStateShard;Lnet/minecraft/client/renderer/RenderStateShard$DepthTestStateShard;Lnet/minecraft/client/renderer/RenderStateShard$CullStateShard;Lnet/minecraft/client/renderer/RenderStateShard$LightmapStateShard;Lnet/minecraft/client/renderer/RenderStateShard$OverlayStateShard;Lnet/minecraft/client/renderer/RenderStateShard$LayeringStateShard;Lnet/minecraft/client/renderer/RenderStateShard$OutputStateShard;Lnet/minecraft/client/renderer/RenderStateShard$TexturingStateShard;Lnet/minecraft/client/renderer/RenderStateShard$WriteMaskStateShard;Lnet/minecraft/client/renderer/RenderStateShard$LineStateShard;Lnet/minecraft/client/renderer/RenderStateShard$ColorLogicStateShard;Lnet/minecraft/client/renderer/RenderType$OutlineProperty;)V
+public net.minecraft.client.renderer.RenderType$CompositeRenderType
+public net.minecraft.client.renderer.RenderType$CompositeRenderType f_110511_ # state
+public-f net.minecraft.client.renderer.RenderType$CompositeRenderType f_110513_ # outline
+public net.minecraft.client.renderer.RenderType$CompositeRenderType (Ljava/lang/String;Lcom/mojang/blaze3d/vertex/VertexFormat;Lcom/mojang/blaze3d/vertex/VertexFormat$Mode;IZZLnet/minecraft/client/renderer/RenderType$CompositeState;)V
+public net.minecraft.client.renderer.RenderType$CompositeState f_110576_ # textureState
+public net.minecraft.client.renderer.RenderType$CompositeState f_173274_ # shaderState
+public net.minecraft.client.renderer.RenderType$CompositeState f_110577_ # transparencyState
+public net.minecraft.client.renderer.RenderType$CompositeState f_110581_ # depthTestState
+public net.minecraft.client.renderer.RenderType$CompositeState f_110582_ # cullState
+public net.minecraft.client.renderer.RenderType$CompositeState f_110583_ # lightmapState
+public net.minecraft.client.renderer.RenderType$CompositeState f_110584_ # overlayState
+public net.minecraft.client.renderer.RenderType$CompositeState f_110586_ # layeringState
+public net.minecraft.client.renderer.RenderType$CompositeState f_110587_ # outputState
+public net.minecraft.client.renderer.RenderType$CompositeState f_110588_ # texturingState
+public net.minecraft.client.renderer.RenderType$CompositeState f_110589_ # writeMaskState
+public net.minecraft.client.renderer.RenderType$CompositeState f_110590_ # lineState
+public net.minecraft.client.renderer.RenderType$CompositeState f_285566_ # colorLogicState
+public net.minecraft.client.renderer.RenderType$CompositeState f_110591_ # outlineProperty
+public-f net.minecraft.client.renderer.RenderType$CompositeState f_110592_ # states
+public net.minecraft.client.renderer.RenderType$OutlineProperty
+public net.minecraft.client.renderer.entity.EntityRenderDispatcher f_114363_ # playerRenderers
+public net.minecraft.client.renderer.entity.player.PlayerRenderer m_117818_(Lnet/minecraft/client/player/AbstractClientPlayer;)V # setModelProperties
+public net.minecraft.client.renderer.entity.layers.VillagerProfessionLayer f_117623_ # typeHatCache
+public net.minecraft.client.renderer.entity.layers.VillagerProfessionLayer f_117624_ # professionHatCache
+public net.minecraft.client.renderer.entity.layers.VillagerProfessionLayer m_117668_(Ljava/lang/String;Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/resources/ResourceLocation; # getResourceLocation
+public net.minecraft.client.multiplayer.ClientLevel f_104561_ # connection
+public net.minecraft.client.multiplayer.PlayerInfo m_105341_()V # registerTextures
+public net.minecraft.client.model.geom.ModelPart f_104212_ # cubes
+public net.minecraft.client.model.geom.ModelPart f_104213_ # childrens
+public-f net.minecraft.client.model.geom.ModelPart$Cube f_104341_ # polygons
+public-f net.minecraft.client.model.geom.ModelPart$Polygon f_104360_ # normal
+public-f net.minecraft.client.model.geom.ModelPart$Polygon f_104359_ # vertices
+public net.minecraft.client.model.geom.ModelPart$Polygon
+public net.minecraft.client.model.geom.ModelPart$Vertex
+public net.minecraft.nbt.CompoundTag f_128329_ # tags
+public net.minecraft.world.level.dimension.end.EndDragonFight f_64060_ # dragonEvent
+public net.minecraft.world.level.GameRules$BooleanValue m_46252_(ZLjava/util/function/BiConsumer;)Lnet/minecraft/world/level/GameRules$Type; # create
+public net.minecraft.world.level.GameRules$IntegerValue m_46294_(ILjava/util/function/BiConsumer;)Lnet/minecraft/world/level/GameRules$Type; # create
+public net.minecraft.world.level.GameRules$BooleanValue m_46250_(Z)Lnet/minecraft/world/level/GameRules$Type; # create
+public com.mojang.math.Quaternion f_80119_ # i
+public com.mojang.math.Quaternion f_80120_ # j
+public com.mojang.math.Quaternion f_80121_ # k
+public com.mojang.math.Quaternion f_80122_ # r
+public net.minecraft.client.particle.Particle m_107271_(F)V # setAlpha
+public-f net.minecraft.world.entity.ai.attributes.AttributeMap f_22141_ # supplier
+public net.minecraft.world.entity.ai.attributes.AttributeSupplier f_22241_ # instances
+public net.minecraft.world.entity.ai.Brain f_21845_ # availableBehaviorsByPriority
+public net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal f_26048_ # targetType
+public net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal f_26051_ # targetConditions
+public-f net.minecraft.world.entity.boss.enderdragon.EnderDragon f_31074_ # phaseManager
+public net.minecraft.world.entity.boss.enderdragon.phases.EnderDragonPhase m_31402_(Ljava/lang/Class;Ljava/lang/String;)Lnet/minecraft/world/entity/boss/enderdragon/phases/EnderDragonPhase; # create
+public net.minecraft.world.entity.boss.enderdragon.phases.EnderDragonPhaseManager f_31409_ # dragon
+public net.minecraft.world.entity.boss.enderdragon.EnderDragon f_31075_ # growlTime
+public net.minecraft.world.entity.boss.wither.WitherBoss f_31423_ # xRotHeads
+public net.minecraft.world.entity.boss.wither.WitherBoss f_31425_ # xRotOHeads
+public net.minecraft.world.entity.boss.wither.WitherBoss f_31424_ # yRotHeads
+public net.minecraft.world.entity.boss.wither.WitherBoss f_31426_ # yRotOHeads
+public net.minecraft.world.entity.boss.wither.WitherBoss f_31430_ # bossEvent
+public net.minecraft.world.entity.boss.wither.WitherBoss m_31514_(I)D # getHeadX
+public net.minecraft.world.entity.boss.wither.WitherBoss m_31516_(I)D # getHeadY
+public net.minecraft.world.entity.boss.wither.WitherBoss m_31518_(I)D # getHeadZ
+public net.minecraft.world.entity.boss.wither.WitherBoss m_31457_(ILnet/minecraft/world/entity/LivingEntity;)V # performRangedAttack
+public net.minecraft.world.entity.boss.wither.WitherBoss m_31448_(IDDDZ)V # performRangedAttack
+public net.minecraft.world.entity.monster.EnderMan f_32473_ # SCREAMING
+public net.minecraft.world.entity.monster.EnderMan m_32529_()Z # teleport
+public net.minecraft.world.entity.projectile.AbstractArrow f_36703_ # inGround
+public net.minecraft.world.entity.projectile.ThrownTrident f_37556_ # dealtDamage
+public net.minecraft.world.entity.projectile.ThrownTrident f_37555_ # tridentItem
+public net.minecraft.world.entity.AreaEffectCloud f_19686_ # victims
+public net.minecraft.world.entity.Entity f_19815_ # dimensions
+public net.minecraft.world.entity.Entity f_19861_ # onGround
+public net.minecraft.world.entity.Entity m_20015_(Lnet/minecraft/world/phys/Vec3;FF)Lnet/minecraft/world/phys/Vec3; # getInputVector
+public net.minecraft.world.entity.LivingEntity f_20898_ # lastHurt
+public net.minecraft.world.entity.LivingEntity f_20903_ # lerpSteps
+public net.minecraft.world.entity.LivingEntity f_20904_ # lerpX
+public net.minecraft.world.entity.LivingEntity f_20905_ # lerpY
+public net.minecraft.world.entity.LivingEntity f_20906_ # lerpZ
+public net.minecraft.world.entity.LivingEntity f_20907_ # lerpYRot
+public net.minecraft.world.entity.LivingEntity f_20922_ # attackStrengthTicker
+public net.minecraft.world.entity.LivingEntity f_20954_ # noJumpDelay
+public net.minecraft.world.item.ItemStack (Ljava/lang/Void;)V # constructor
+public net.minecraft.world.damagesource.CombatTracker f_19277_ # mob