diff --git a/src/main/java/mc/duzo/timeless/mixin/client/ArmorFeatureRendererMixin.java b/src/main/java/mc/duzo/timeless/mixin/client/ArmorFeatureRendererMixin.java index a10fa97..0b46b4d 100644 --- a/src/main/java/mc/duzo/timeless/mixin/client/ArmorFeatureRendererMixin.java +++ b/src/main/java/mc/duzo/timeless/mixin/client/ArmorFeatureRendererMixin.java @@ -19,7 +19,7 @@ public class ArmorFeatureRendererMixin { private void timeless$getArmorTexture(ArmorItem item, boolean secondLayer, @Nullable String overlay, CallbackInfoReturnable cir) { if (!(item instanceof SuitItem suit)) return; - if (!suit.getSuit().toClient().hasRenderer()) return; + if (!suit.getSuit().toClient().hasModel()) return; cir.setReturnValue(new Identifier(Timeless.MOD_ID, "textures/empty.png")); } diff --git a/src/main/java/mc/duzo/timeless/mixin/client/PlayerEntityRendererMixin.java b/src/main/java/mc/duzo/timeless/mixin/client/PlayerEntityRendererMixin.java new file mode 100644 index 0000000..cc42d28 --- /dev/null +++ b/src/main/java/mc/duzo/timeless/mixin/client/PlayerEntityRendererMixin.java @@ -0,0 +1,43 @@ +package mc.duzo.timeless.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.AbstractClientPlayerEntity; +import net.minecraft.client.render.entity.EntityRendererFactory; +import net.minecraft.client.render.entity.LivingEntityRenderer; +import net.minecraft.client.render.entity.PlayerEntityRenderer; +import net.minecraft.client.render.entity.model.PlayerEntityModel; + +import mc.duzo.timeless.suit.client.render.SuitFeature; + +@Mixin(PlayerEntityRenderer.class) +public abstract class PlayerEntityRendererMixin extends LivingEntityRenderer> { + public PlayerEntityRendererMixin(EntityRendererFactory.Context ctx, PlayerEntityModel model, float shadowRadius) { + super(ctx, model, shadowRadius); + } + + @Inject(method = "", at = @At("TAIL")) + private void timeless$PlayerEntityRenderer(EntityRendererFactory.Context ctx, boolean slim, CallbackInfo ci) { + PlayerEntityRenderer renderer = (PlayerEntityRenderer) (Object) this; + + this.addFeature(new SuitFeature<>(renderer, ctx.getModelLoader())); + } + + @Inject(method = "setModelPose", at = @At("TAIL")) + private void timeless$playerRender(AbstractClientPlayerEntity player, CallbackInfo ci) { + boolean current = this.getModel().body.visible; + if (!(current)) return; + if (!SuitFeature.shouldRender(player)) return; + + this.getModel().setVisible(false); + + MinecraftClient client = MinecraftClient.getInstance(); + if (player.equals(client.player) && !client.gameRenderer.getCamera().isThirdPerson()) { + this.getModel().setVisible(true); + } + } +} \ No newline at end of file diff --git a/src/main/java/mc/duzo/timeless/suit/Suit.java b/src/main/java/mc/duzo/timeless/suit/Suit.java index 7980e82..27c07d1 100644 --- a/src/main/java/mc/duzo/timeless/suit/Suit.java +++ b/src/main/java/mc/duzo/timeless/suit/Suit.java @@ -6,9 +6,12 @@ import mc.duzo.timeless.registry.Identifiable; import mc.duzo.timeless.suit.client.ClientSuit; import mc.duzo.timeless.suit.client.ClientSuitRegistry; +import mc.duzo.timeless.suit.set.SuitSet; public abstract class Suit implements Identifiable { public abstract boolean isBinding(); + public abstract SuitSet getSet(); + @Environment(EnvType.CLIENT) public ClientSuit toClient() { ClientSuit found = ClientSuitRegistry.REGISTRY.get(this.id()); diff --git a/src/main/java/mc/duzo/timeless/suit/client/ClientSuit.java b/src/main/java/mc/duzo/timeless/suit/client/ClientSuit.java index 2ad451d..f11d1f2 100644 --- a/src/main/java/mc/duzo/timeless/suit/client/ClientSuit.java +++ b/src/main/java/mc/duzo/timeless/suit/client/ClientSuit.java @@ -1,11 +1,16 @@ package mc.duzo.timeless.suit.client; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; + import net.minecraft.util.Identifier; import mc.duzo.timeless.registry.Identifiable; import mc.duzo.timeless.suit.Suit; import mc.duzo.timeless.suit.SuitRegistry; +import mc.duzo.timeless.suit.client.render.SuitModel; +@Environment(EnvType.CLIENT) public abstract class ClientSuit implements Identifiable { private final Suit parent; protected ClientSuit(Suit suit) { @@ -24,5 +29,16 @@ public Identifier id() { return this.toServer().id(); } - public abstract boolean hasRenderer(); + /** + * @return whether this suit has a custom model and will use the timeless renderer + */ + public boolean hasModel() { + return this.model() != null; + } + public SuitModel model() { + return null; + } + public Identifier texture() { + return new Identifier(this.id().getNamespace(), "textures/suit/" + this.id().getPath() + ".png"); + } } diff --git a/src/main/java/mc/duzo/timeless/suit/client/render/SuitFeature.java b/src/main/java/mc/duzo/timeless/suit/client/render/SuitFeature.java new file mode 100644 index 0000000..9df5085 --- /dev/null +++ b/src/main/java/mc/duzo/timeless/suit/client/render/SuitFeature.java @@ -0,0 +1,60 @@ +package mc.duzo.timeless.suit.client.render; + +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.entity.feature.FeatureRenderer; +import net.minecraft.client.render.entity.feature.FeatureRendererContext; +import net.minecraft.client.render.entity.model.BipedEntityModel; +import net.minecraft.client.render.entity.model.EntityModel; +import net.minecraft.client.render.entity.model.EntityModelLoader; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.ItemStack; + +import mc.duzo.timeless.suit.Suit; +import mc.duzo.timeless.suit.item.SuitItem; +import mc.duzo.timeless.suit.set.SuitSet; + +public class SuitFeature> + extends FeatureRenderer { + + public SuitFeature(FeatureRendererContext context, EntityModelLoader loader) { + super(context); + } + + @Override + public void render(MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, T livingEntity, float f, float g, float h, float j, float k, float l) { + Suit suit = findSuit(livingEntity); + if (suit == null) return; + + SuitSet set = suit.getSet(); + if (!(set.isWearing(livingEntity))) return; // todo this check every frame is bad + + VertexConsumer consumer = vertexConsumerProvider.getBuffer(RenderLayer.getEntityTranslucent(suit.toClient().texture())); + SuitModel model = suit.toClient().model(); + + BipedEntityModel context = (BipedEntityModel) this.getContextModel(); + + model.copyFrom(context); + model.setAngles(livingEntity, f, g, j, k, l); + + model.render(livingEntity, j, matrixStack, consumer, i, 1, 1, 1, 1); + } + + private static Suit findSuit(LivingEntity entity) { + ItemStack chest = entity.getEquippedStack(EquipmentSlot.CHEST); + if (!(chest.getItem() instanceof SuitItem item)) return null; + + return item.getSuit(); + } + + public static boolean shouldRender(LivingEntity livingEntity) { + Suit suit = findSuit(livingEntity); + if (suit == null) return false; + + SuitSet set = suit.getSet(); + return set.isWearing(livingEntity); // todo this check every frame is bad + } +} diff --git a/src/main/java/mc/duzo/timeless/suit/client/render/SuitModel.java b/src/main/java/mc/duzo/timeless/suit/client/render/SuitModel.java new file mode 100644 index 0000000..a24b6fc --- /dev/null +++ b/src/main/java/mc/duzo/timeless/suit/client/render/SuitModel.java @@ -0,0 +1,58 @@ +package mc.duzo.timeless.suit.client.render; + +import java.util.Optional; + +import net.minecraft.client.model.ModelPart; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.entity.model.BipedEntityModel; +import net.minecraft.client.render.entity.model.EntityModel; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.LivingEntity; +import net.minecraft.util.Identifier; + +import mc.duzo.timeless.suit.client.ClientSuit; + +public abstract class SuitModel extends EntityModel { + /** + * This will be called to render the model, perform all adjustments here and render the model using the proper method. + */ + public abstract void render(LivingEntity entity, float tickDelta, MatrixStack matrices, VertexConsumer vertexConsumers, int light, float r, float g, float b, float alpha); + + @Override + public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) { + this.getPart().render(matrices, vertices, light, overlay, red, green, blue, alpha); + } + + public Identifier texture() { + return this.getSuit().texture(); + } + public Optional emission() { + return Optional.empty(); + } + public abstract ClientSuit getSuit(); + + /** + * @return The root model part + */ + public abstract ModelPart getPart(); + + /** + * @return the name of the root model part + */ + protected String getPartName() { + return "root"; + } + public Optional getChild(String name) { + if (name.equals(this.getPartName())) { + return Optional.of(this.getPart()); + } + return this.getPart().traverse().filter(part -> part.hasChild(name)).findFirst().map(part -> part.getChild(name)); + } + protected void resetTransforms() { + this.getPart().resetTransform(); + this.getPart().traverse().forEach(ModelPart::resetTransform); + } + public void copyFrom(BipedEntityModel model) { + + } +} diff --git a/src/main/java/mc/duzo/timeless/suit/ironman/IronManSuit.java b/src/main/java/mc/duzo/timeless/suit/ironman/IronManSuit.java index 82357b3..7853fdc 100644 --- a/src/main/java/mc/duzo/timeless/suit/ironman/IronManSuit.java +++ b/src/main/java/mc/duzo/timeless/suit/ironman/IronManSuit.java @@ -4,7 +4,6 @@ import mc.duzo.timeless.Timeless; import mc.duzo.timeless.suit.Suit; -import mc.duzo.timeless.suit.client.ClientSuit; public abstract class IronManSuit extends Suit { private final Identifier id; @@ -33,14 +32,4 @@ public boolean isBinding() { public Identifier id() { return this.id; } - - @Override - protected ClientSuit createClient() { - return new ClientSuit(this) { - @Override - public boolean hasRenderer() { - return true; - } - }; - } } diff --git a/src/main/java/mc/duzo/timeless/suit/ironman/mk5/MarkFiveSuit.java b/src/main/java/mc/duzo/timeless/suit/ironman/mk5/MarkFiveSuit.java index 2b29172..e55d5c9 100644 --- a/src/main/java/mc/duzo/timeless/suit/ironman/mk5/MarkFiveSuit.java +++ b/src/main/java/mc/duzo/timeless/suit/ironman/mk5/MarkFiveSuit.java @@ -1,9 +1,31 @@ package mc.duzo.timeless.suit.ironman.mk5; +import mc.duzo.timeless.suit.client.ClientSuit; +import mc.duzo.timeless.suit.client.render.SuitModel; import mc.duzo.timeless.suit.ironman.IronManSuit; +import mc.duzo.timeless.suit.ironman.mk5.client.MarkFiveModel; +import mc.duzo.timeless.suit.set.SetRegistry; +import mc.duzo.timeless.suit.set.SuitSet; public class MarkFiveSuit extends IronManSuit { public MarkFiveSuit() { super("mk_five"); } + + @Override + public SuitSet getSet() { + return SetRegistry.MARK_FIVE; + } + + @Override + protected ClientSuit createClient() { + SuitModel model = new MarkFiveModel(); + + return new ClientSuit(this) { + @Override + public SuitModel model() { + return model; + } + }; + } } diff --git a/src/main/java/mc/duzo/timeless/suit/ironman/mk5/client/MarkFiveModel.java b/src/main/java/mc/duzo/timeless/suit/ironman/mk5/client/MarkFiveModel.java new file mode 100644 index 0000000..69de4bf --- /dev/null +++ b/src/main/java/mc/duzo/timeless/suit/ironman/mk5/client/MarkFiveModel.java @@ -0,0 +1,292 @@ +package mc.duzo.timeless.suit.ironman.mk5.client; + +import net.minecraft.client.model.*; +import net.minecraft.client.render.OverlayTexture; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.entity.model.BipedEntityModel; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.LivingEntity; + +import mc.duzo.timeless.suit.client.ClientSuit; +import mc.duzo.timeless.suit.client.render.SuitModel; +import mc.duzo.timeless.suit.set.SetRegistry; + +public class MarkFiveModel extends SuitModel { + private final ModelPart root; + private final ModelPart leftLeg; + private final ModelPart rightLeg; + private final ModelPart leftArm; + private final ModelPart rightArm; + private final ModelPart body; + private final ModelPart head; + private ClientSuit parent; + public MarkFiveModel(ModelPart root) { + this.root = root; + + this.leftLeg = this.getChild("LeftLeg").orElseThrow(); + this.rightLeg = this.getChild("RightLeg").orElseThrow(); + this.rightArm = this.getChild("RightArm").orElseThrow(); + this.leftArm = this.getChild("LeftArm").orElseThrow(); + this.body = this.getChild("Body").orElseThrow(); + this.head = this.getChild("Head").orElseThrow(); + + this.getChild("case").orElseThrow().visible = false; + } + public MarkFiveModel() { + this(getTexturedModelData().createModel()); + } + + public static TexturedModelData getTexturedModelData() { + ModelData modelData = new ModelData(); + ModelPartData modelPartData = modelData.getRoot(); + ModelPartData parentofsuit = modelPartData.addChild("parentofsuit", ModelPartBuilder.create(), ModelTransform.pivot(0.0F, 24.0F, -12.0F)); + + ModelPartData suit = parentofsuit.addChild("suit", ModelPartBuilder.create(), ModelTransform.pivot(0.0F, -21.0F, 12.0F)); + + ModelPartData LeftLeg = suit.addChild("LeftLeg", ModelPartBuilder.create(), ModelTransform.pivot(1.9F, 9.0F, 0.0F)); + + ModelPartData bone20 = LeftLeg.addChild("bone20", ModelPartBuilder.create(), ModelTransform.pivot(-1.9F, 4.75F, 0.0F)); + + ModelPartData s1_left = bone20.addChild("s1_left", ModelPartBuilder.create().uv(123, 124).mirrored().cuboid(-2.1F, 0.0F, -2.0F, 4.0F, 8.0F, 4.0F, new Dilation(0.001F)).mirrored(false), ModelTransform.pivot(2.0F, -5.0F, 0.0F)); + + ModelPartData s2_left = bone20.addChild("s2_left", ModelPartBuilder.create().uv(140, 124).mirrored().cuboid(-2.0F, -3.0F, -2.0F, 4.0F, 8.0F, 4.0F, new Dilation(0.001F)).mirrored(false), ModelTransform.pivot(1.9F, -2.0F, 0.0F)); + + ModelPartData bone21 = LeftLeg.addChild("bone21", ModelPartBuilder.create(), ModelTransform.pivot(-1.9F, 12.0F, 0.0F)); + + ModelPartData l1_left = bone21.addChild("l1_left", ModelPartBuilder.create().uv(190, 117).mirrored().cuboid(-2.0F, 0.0F, -2.0F, 4.0F, 8.0F, 4.0F, new Dilation(0.25F)).mirrored(false), ModelTransform.pivot(1.9F, -12.0F, 0.0F)); + + ModelPartData l2_left = bone21.addChild("l2_left", ModelPartBuilder.create().uv(209, 117).mirrored().cuboid(-2.0F, -8.25F, -2.0F, 4.0F, 8.0F, 4.0F, new Dilation(0.25F)).mirrored(false), ModelTransform.pivot(1.9F, -3.75F, 0.0F)); + + ModelPartData LeftFoot = LeftLeg.addChild("LeftFoot", ModelPartBuilder.create(), ModelTransform.pivot(-1.9F, 11.75F, 0.0F)); + + ModelPartData f_left = LeftFoot.addChild("f_left", ModelPartBuilder.create().uv(75, 0).mirrored().cuboid(-2.0F, -4.0F, -2.0F, 4.0F, 4.0F, 4.0F, new Dilation(0.25F)).mirrored(false) + .uv(54, 34).mirrored().cuboid(-2.0F, -4.0F, -2.0F, 4.0F, 4.0F, 4.0F, new Dilation(0.5F)).mirrored(false), ModelTransform.pivot(1.9F, 0.0F, 0.0F)); + + ModelPartData foot_left_beam = f_left.addChild("foot_left_beam", ModelPartBuilder.create().uv(13, 47).mirrored().cuboid(-2.0F, -1.25F, -2.0F, 4.0F, 1.0F, 4.0F, new Dilation(0.5F)).mirrored(false), ModelTransform.pivot(0.0F, 0.25F, 0.0F)); + + ModelPartData RightLeg = suit.addChild("RightLeg", ModelPartBuilder.create(), ModelTransform.pivot(-1.9F, 9.0F, 0.0F)); + + ModelPartData bone16 = RightLeg.addChild("bone16", ModelPartBuilder.create(), ModelTransform.pivot(1.9F, 4.75F, 0.0F)); + + ModelPartData s1_right = bone16.addChild("s1_right", ModelPartBuilder.create().uv(123, 124).cuboid(-1.9F, 0.0F, -2.0F, 4.0F, 8.0F, 4.0F, new Dilation(0.001F)), ModelTransform.pivot(-2.0F, -5.0F, 0.0F)); + + ModelPartData s2_right = bone16.addChild("s2_right", ModelPartBuilder.create().uv(140, 124).cuboid(-2.0F, -3.0F, -2.0F, 4.0F, 8.0F, 4.0F, new Dilation(0.001F)), ModelTransform.pivot(-1.9F, -2.0F, 0.0F)); + + ModelPartData bone18 = RightLeg.addChild("bone18", ModelPartBuilder.create(), ModelTransform.pivot(1.9F, 12.0F, 0.0F)); + + ModelPartData l1_right = bone18.addChild("l1_right", ModelPartBuilder.create().uv(190, 117).cuboid(-2.0F, 0.0F, -2.0F, 4.0F, 8.0F, 4.0F, new Dilation(0.25F)), ModelTransform.pivot(-1.9F, -12.0F, 0.0F)); + + ModelPartData l2_right = bone18.addChild("l2_right", ModelPartBuilder.create().uv(209, 117).cuboid(-2.0F, -8.25F, -2.0F, 4.0F, 8.0F, 4.0F, new Dilation(0.25F)), ModelTransform.pivot(-1.9F, -3.75F, 0.0F)); + + ModelPartData RightFoot = RightLeg.addChild("RightFoot", ModelPartBuilder.create(), ModelTransform.pivot(1.9F, 11.75F, 0.0F)); + + ModelPartData f_right = RightFoot.addChild("f_right", ModelPartBuilder.create().uv(75, 0).cuboid(-2.0F, -4.0F, -2.0F, 4.0F, 4.0F, 4.0F, new Dilation(0.25F)) + .uv(54, 34).cuboid(-2.0F, -4.0F, -2.0F, 4.0F, 4.0F, 4.0F, new Dilation(0.5F)), ModelTransform.pivot(-1.9F, 0.0F, 0.0F)); + + ModelPartData foot_right_beam = f_right.addChild("foot_right_beam", ModelPartBuilder.create().uv(13, 47).cuboid(-2.0F, -1.25F, -2.0F, 4.0F, 1.0F, 4.0F, new Dilation(0.5F)), ModelTransform.pivot(0.0F, 0.25F, 0.0F)); + + ModelPartData RightArm = suit.addChild("RightArm", ModelPartBuilder.create(), ModelTransform.pivot(-5.0F, -1.0F, 0.0F)); + + ModelPartData bone23 = RightArm.addChild("bone23", ModelPartBuilder.create(), ModelTransform.pivot(-1.0F, 7.0F, 0.0F)); + + ModelPartData b4_right = bone23.addChild("b4_right", ModelPartBuilder.create().uv(65, 116).mirrored().cuboid(-4.0F, -9.0F, -2.0F, 4.0F, 12.0F, 4.0F, new Dilation(0.0F)).mirrored(false), ModelTransform.pivot(2.0F, 0.0F, 0.0F)); + + ModelPartData right_beam = b4_right.addChild("right_beam", ModelPartBuilder.create().uv(13, 47).cuboid(-2.0F, -1.25F, -2.0F, 4.0F, 1.0F, 4.0F, new Dilation(0.25F)), ModelTransform.pivot(-2.0F, 3.25F, 0.0F)); + + ModelPartData lb5_right = bone23.addChild("lb5_right", ModelPartBuilder.create().uv(64, 190).mirrored().cuboid(-2.0F, -11.0F, -2.0F, 4.0F, 12.0F, 4.0F, new Dilation(0.225F)).mirrored(false), ModelTransform.pivot(0.0F, 2.0F, 0.0F)); + + ModelPartData lb1_right = bone23.addChild("lb1_right", ModelPartBuilder.create().uv(43, 192).mirrored().cuboid(-2.0F, -12.0F, -2.0F, 4.0F, 12.0F, 4.0F, new Dilation(0.25F)).mirrored(false), ModelTransform.pivot(0.0F, 3.0F, 0.0F)); + + ModelPartData lb2_right = bone23.addChild("lb2_right", ModelPartBuilder.create().uv(65, 170).mirrored().cuboid(-2.0F, -7.0F, -2.0F, 4.0F, 12.0F, 4.0F, new Dilation(0.25F)).mirrored(false), ModelTransform.pivot(0.0F, -2.0F, 0.0F)); + + ModelPartData bands_right = RightArm.addChild("bands_right", ModelPartBuilder.create(), ModelTransform.pivot(5.0F, 22.0F, 0.0F)); + + ModelPartData b1_right = bands_right.addChild("b1_right", ModelPartBuilder.create().uv(49, 100).mirrored().cuboid(-4.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, new Dilation(0.001F)).mirrored(false), ModelTransform.pivot(-4.0F, -24.0F, 0.0F)); + + ModelPartData b2_right = bands_right.addChild("b2_right", ModelPartBuilder.create().uv(65, 100).mirrored().cuboid(-4.0F, -3.0F, -2.0F, 4.0F, 12.0F, 4.0F, new Dilation(0.001F)).mirrored(false), ModelTransform.pivot(-4.0F, -21.0F, 0.0F)); + + ModelPartData b3_right = bands_right.addChild("b3_right", ModelPartBuilder.create().uv(49, 116).mirrored().cuboid(-2.0F, -9.0F, -2.0F, 4.0F, 12.0F, 4.0F, new Dilation(0.001F)).mirrored(false), ModelTransform.pivot(-6.0F, -15.0F, 0.0F)); + + ModelPartData layer_bands3 = RightArm.addChild("layer_bands3", ModelPartBuilder.create(), ModelTransform.pivot(15.0F, 0.0F, 0.0F)); + + ModelPartData lb3_right = layer_bands3.addChild("lb3_right", ModelPartBuilder.create().uv(63, 150).mirrored().cuboid(-2.0F, -3.0F, -2.0F, 4.0F, 12.0F, 4.0F, new Dilation(0.25F)).mirrored(false), ModelTransform.pivot(-16.0F, 1.0F, 0.0F)); + + ModelPartData lb4_right = layer_bands3.addChild("lb4_right", ModelPartBuilder.create().uv(42, 168).mirrored().cuboid(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, new Dilation(0.25F)).mirrored(false), ModelTransform.pivot(-16.0F, -2.0F, 0.0F)); + + ModelPartData right_Shoulder = RightArm.addChild("right_Shoulder", ModelPartBuilder.create().uv(3, 118).mirrored().cuboid(-4.0F, 1.25F, 1.0F, 4.0F, 12.0F, 4.0F, new Dilation(0.25F)).mirrored(false), ModelTransform.pivot(1.0F, -3.25F, -3.0F)); + + ModelPartData LeftArmLayer_r1 = right_Shoulder.addChild("LeftArmLayer_r1", ModelPartBuilder.create().uv(74, 10).mirrored().cuboid(-5.0F, 0.0F, 0.0F, 5.0F, 3.0F, 6.0F, new Dilation(0.0F)).mirrored(false), ModelTransform.of(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, -0.0873F)); + + ModelPartData LeftArm = suit.addChild("LeftArm", ModelPartBuilder.create(), ModelTransform.pivot(5.0F, -1.0F, 0.0F)); + + ModelPartData bone17 = LeftArm.addChild("bone17", ModelPartBuilder.create(), ModelTransform.pivot(1.0F, 7.0F, 0.0F)); + + ModelPartData b4_left = bone17.addChild("b4_left", ModelPartBuilder.create().uv(65, 116).cuboid(0.0F, -9.0F, -2.0F, 4.0F, 12.0F, 4.0F, new Dilation(0.0F)), ModelTransform.pivot(-2.0F, 0.0F, 0.0F)); + + ModelPartData left_beam = b4_left.addChild("left_beam", ModelPartBuilder.create().uv(13, 47).mirrored().cuboid(-2.0F, -1.25F, -2.0F, 4.0F, 1.0F, 4.0F, new Dilation(0.25F)).mirrored(false), ModelTransform.pivot(2.0F, 3.25F, 0.0F)); + + ModelPartData lb5_left = bone17.addChild("lb5_left", ModelPartBuilder.create().uv(64, 190).cuboid(-2.0F, -11.0F, -2.0F, 4.0F, 12.0F, 4.0F, new Dilation(0.225F)), ModelTransform.pivot(0.0F, 2.0F, 0.0F)); + + ModelPartData lb1_left = bone17.addChild("lb1_left", ModelPartBuilder.create().uv(43, 192).cuboid(-2.0F, -12.0F, -2.0F, 4.0F, 12.0F, 4.0F, new Dilation(0.25F)), ModelTransform.pivot(0.0F, 3.0F, 0.0F)); + + ModelPartData lb2_left = bone17.addChild("lb2_left", ModelPartBuilder.create().uv(65, 170).cuboid(-2.0F, -7.0F, -2.0F, 4.0F, 12.0F, 4.0F, new Dilation(0.25F)), ModelTransform.pivot(0.0F, -2.0F, 0.0F)); + + ModelPartData bands_left = LeftArm.addChild("bands_left", ModelPartBuilder.create(), ModelTransform.pivot(-5.0F, 22.0F, 0.0F)); + + ModelPartData b1_left = bands_left.addChild("b1_left", ModelPartBuilder.create().uv(49, 100).cuboid(0.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, new Dilation(0.001F)), ModelTransform.pivot(4.0F, -24.0F, 0.0F)); + + ModelPartData b2_left = bands_left.addChild("b2_left", ModelPartBuilder.create().uv(65, 100).cuboid(0.0F, -3.0F, -2.0F, 4.0F, 12.0F, 4.0F, new Dilation(0.001F)), ModelTransform.pivot(4.0F, -21.0F, 0.0F)); + + ModelPartData b3_left = bands_left.addChild("b3_left", ModelPartBuilder.create().uv(49, 116).cuboid(-2.0F, -9.0F, -2.0F, 4.0F, 12.0F, 4.0F, new Dilation(0.001F)), ModelTransform.pivot(6.0F, -15.0F, 0.0F)); + + ModelPartData layer_bands2 = LeftArm.addChild("layer_bands2", ModelPartBuilder.create(), ModelTransform.pivot(-15.0F, 0.0F, 0.0F)); + + ModelPartData lb3_left = layer_bands2.addChild("lb3_left", ModelPartBuilder.create().uv(63, 150).cuboid(-2.0F, -3.0F, -2.0F, 4.0F, 12.0F, 4.0F, new Dilation(0.25F)), ModelTransform.pivot(16.0F, 1.0F, 0.0F)); + + ModelPartData lb4_left = layer_bands2.addChild("lb4_left", ModelPartBuilder.create().uv(42, 168).cuboid(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, new Dilation(0.25F)), ModelTransform.pivot(16.0F, -2.0F, 0.0F)); + + ModelPartData left_Shoulder = LeftArm.addChild("left_Shoulder", ModelPartBuilder.create().uv(3, 118).cuboid(0.0F, 1.25F, 1.0F, 4.0F, 12.0F, 4.0F, new Dilation(0.25F)), ModelTransform.pivot(-1.0F, -3.25F, -3.0F)); + + ModelPartData LeftArmLayer_r2 = left_Shoulder.addChild("LeftArmLayer_r2", ModelPartBuilder.create().uv(74, 10).cuboid(0.0F, 0.0F, 0.0F, 5.0F, 3.0F, 6.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0873F)); + + ModelPartData Body = suit.addChild("Body", ModelPartBuilder.create(), ModelTransform.pivot(0.0F, -3.0F, 0.0F)); + + ModelPartData chest = Body.addChild("chest", ModelPartBuilder.create(), ModelTransform.pivot(1.0F, 25.0F, -0.05F)); + + ModelPartData bone7 = chest.addChild("bone7", ModelPartBuilder.create().uv(100, 12).cuboid(-4.5F, -2.0F, 0.0F, 9.0F, 2.0F, 2.0F, new Dilation(0.0F)), ModelTransform.pivot(-1.0F, -23.5F, -3.0F)); + + ModelPartData bone6 = chest.addChild("bone6", ModelPartBuilder.create().uv(101, 8).cuboid(-3.5F, 0.0F, 0.0F, 7.0F, 1.0F, 2.0F, new Dilation(0.0F)), ModelTransform.pivot(-1.0F, -19.5F, -3.0F)); + + ModelPartData core = chest.addChild("core", ModelPartBuilder.create().uv(93, 0).cuboid(-2.5F, -2.5F, 0.0F, 5.0F, 5.0F, 2.0F, new Dilation(0.0F)), ModelTransform.pivot(-1.0F, -22.0F, -3.0F)); + + ModelPartData powerthing = chest.addChild("powerthing", ModelPartBuilder.create().uv(18, 34).cuboid(-2.0F, -1.75F, -1.0F, 4.0F, 4.0F, 1.0F, new Dilation(-0.475F)), ModelTransform.pivot(-1.0F, -22.2F, -2.3F)); + + ModelPartData bone8 = chest.addChild("bone8", ModelPartBuilder.create(), ModelTransform.pivot(-1.0F, -19.5F, -2.95F)); + + ModelPartData bone5 = bone8.addChild("bone5", ModelPartBuilder.create().uv(92, 8).mirrored().cuboid(-0.5F, -2.0F, 0.0F, 2.0F, 3.0F, 2.0F, new Dilation(0.0F)).mirrored(false), ModelTransform.pivot(3.0F, -1.0F, -0.05F)); + + ModelPartData bone = bone8.addChild("bone", ModelPartBuilder.create().uv(92, 8).cuboid(-2.5F, -2.0F, 0.0F, 2.0F, 3.0F, 2.0F, new Dilation(0.0F)), ModelTransform.pivot(-2.0F, -1.0F, -0.05F)); + + ModelPartData main_torso = Body.addChild("main_torso", ModelPartBuilder.create(), ModelTransform.pivot(0.0F, 1.0F, 2.0F)); + + ModelPartData bone11 = main_torso.addChild("bone11", ModelPartBuilder.create().uv(155, 22).cuboid(-2.0F, 0.0F, -2.0F, 2.0F, 12.0F, 4.0F, new Dilation(0.001F)) + .uv(155, 22).mirrored().cuboid(0.0F, 0.0F, -2.0F, 2.0F, 12.0F, 4.0F, new Dilation(0.001F)).mirrored(false), ModelTransform.pivot(0.0F, -1.0F, -2.0F)); + + ModelPartData left_torso = bone11.addChild("left_torso", ModelPartBuilder.create().uv(138, 22).cuboid(-3.0F, -6.0F, -2.0F, 3.0F, 12.0F, 4.0F, new Dilation(0.001F)), ModelTransform.pivot(-1.0F, 6.0F, 0.0F)); + + ModelPartData right_torso = bone11.addChild("right_torso", ModelPartBuilder.create().uv(138, 22).mirrored().cuboid(0.0F, -6.0F, -2.0F, 3.0F, 12.0F, 4.0F, new Dilation(0.001F)).mirrored(false), ModelTransform.pivot(1.0F, 6.0F, 0.0F)); + + ModelPartData bone4 = Body.addChild("bone4", ModelPartBuilder.create().uv(29, 30).cuboid(-4.0F, 0.25F, 0.25F, 8.0F, 12.0F, 4.0F, new Dilation(0.275F)), ModelTransform.pivot(0.0F, -0.25F, -2.25F)); + + ModelPartData back = Body.addChild("back", ModelPartBuilder.create(), ModelTransform.pivot(0.0F, 24.0F, 0.0F)); + + ModelPartData bone12 = back.addChild("bone12", ModelPartBuilder.create().uv(147, 61).cuboid(-4.0F, -6.75F, -4.25F, 8.0F, 12.0F, 4.0F, new Dilation(0.275F)), ModelTransform.pivot(0.0F, -17.25F, 2.25F)); + + ModelPartData bone10 = bone12.addChild("bone10", ModelPartBuilder.create().uv(161, 79).mirrored().cuboid(-1.85F, -7.05F, -2.25F, 8.0F, 12.0F, 2.0F, new Dilation(0.275F)).mirrored(false), ModelTransform.pivot(-2.15F, 0.3F, 0.0F)); + + ModelPartData bone9 = bone12.addChild("bone9", ModelPartBuilder.create().uv(161, 79).cuboid(-6.15F, -7.05F, -2.25F, 8.0F, 12.0F, 2.0F, new Dilation(0.275F)), ModelTransform.pivot(2.15F, 0.3F, 0.0F)); + + ModelPartData stomach = Body.addChild("stomach", ModelPartBuilder.create(), ModelTransform.pivot(0.0F, 3.0F, 0.0F)); + + ModelPartData abs3 = stomach.addChild("abs3", ModelPartBuilder.create().uv(92, 46).cuboid(-4.0F, -9.15F, 0.25F, 8.0F, 12.0F, 1.0F, new Dilation(0.275F)), ModelTransform.pivot(0.0F, 6.15F, -2.25F)); + + ModelPartData abs2 = stomach.addChild("abs2", ModelPartBuilder.create().uv(92, 33).cuboid(-4.0F, -7.0F, 0.25F, 8.0F, 12.0F, 1.0F, new Dilation(0.275F)), ModelTransform.pivot(0.0F, 4.0F, -2.25F)); + + ModelPartData abs1 = stomach.addChild("abs1", ModelPartBuilder.create().uv(92, 20).cuboid(-4.0F, -5.0F, 0.25F, 8.0F, 12.0F, 1.0F, new Dilation(0.275F)), ModelTransform.pivot(0.0F, 2.0F, -2.25F)); + + ModelPartData bone13 = Body.addChild("bone13", ModelPartBuilder.create(), ModelTransform.pivot(0.0F, -0.5F, 2.75F)); + + ModelPartData bone14 = bone13.addChild("bone14", ModelPartBuilder.create().uv(92, 72).cuboid(-4.5F, 0.0F, -2.0F, 9.0F, 7.0F, 2.0F, new Dilation(-0.025F)), ModelTransform.pivot(0.0F, 0.0F, 0.0F)); + + ModelPartData bone15 = bone13.addChild("bone15", ModelPartBuilder.create().uv(92, 82).cuboid(-4.5F, -4.0F, -2.0F, 9.0F, 7.0F, 2.0F, new Dilation(-0.025F)), ModelTransform.pivot(0.0F, 4.0F, 0.0F)); + + ModelPartData Head = suit.addChild("Head", ModelPartBuilder.create(), ModelTransform.pivot(0.0F, -3.0F, 0.0F)); + + ModelPartData firststage = Head.addChild("firststage", ModelPartBuilder.create(), ModelTransform.pivot(0.0F, 24.0F, 0.0F)); + + ModelPartData ribs = firststage.addChild("ribs", ModelPartBuilder.create(), ModelTransform.pivot(0.0F, 0.0F, 0.0F)); + + ModelPartData JAW = ribs.addChild("JAW", ModelPartBuilder.create().uv(99, 229).cuboid(-4.0F, -4.0F, -1.0F, 8.0F, 8.0F, 8.0F, new Dilation(0.001F)), ModelTransform.pivot(0.0F, -28.0F, -3.0F)); + + ModelPartData one4 = ribs.addChild("one4", ModelPartBuilder.create().uv(137, 220).cuboid(-4.0F, -4.0F, -4.0F, 8.0F, 8.0F, 8.0F, new Dilation(0.001F)), ModelTransform.pivot(0.0F, -28.0F, 0.0F)); + + ModelPartData one3 = ribs.addChild("one3", ModelPartBuilder.create().uv(196, 176).cuboid(-4.0F, -4.0F, -2.0F, 8.0F, 8.0F, 6.0F, new Dilation(0.5F)) + .uv(163, 197).cuboid(-4.0F, -4.0F, -2.0F, 8.0F, 8.0F, 6.0F, new Dilation(0.5F)) + .uv(184, 148).cuboid(-4.0F, -4.0F, -4.0F, 8.0F, 8.0F, 8.0F, new Dilation(0.001F)), ModelTransform.pivot(0.0F, -28.0F, 0.0F)); + + ModelPartData one2 = ribs.addChild("one2", ModelPartBuilder.create().uv(162, 176).cuboid(-4.0F, -4.0F, -2.0F, 8.0F, 8.0F, 6.0F, new Dilation(0.5F)) + .uv(151, 148).cuboid(-4.0F, -4.0F, -4.0F, 8.0F, 8.0F, 8.0F, new Dilation(0.001F)), ModelTransform.pivot(0.0F, -28.0F, 0.0F)); + + ModelPartData ears = one2.addChild("ears", ModelPartBuilder.create().uv(130, 194).cuboid(-4.0F, -32.0F, -2.0F, 8.0F, 8.0F, 6.0F, new Dilation(0.5F)), ModelTransform.pivot(0.0F, 28.0F, 0.0F)); + + ModelPartData one = ribs.addChild("one", ModelPartBuilder.create().uv(130, 176).cuboid(-4.0F, -8.0F, -2.5F, 8.0F, 8.0F, 6.0F, new Dilation(0.5F)) + .uv(118, 148).cuboid(-4.0F, -8.0F, -4.5F, 8.0F, 8.0F, 8.0F, new Dilation(0.001F)), ModelTransform.pivot(0.0F, -24.0F, 0.5F)); + + ModelPartData bone19 = firststage.addChild("bone19", ModelPartBuilder.create(), ModelTransform.pivot(0.0F, -29.0F, -0.5F)); + + ModelPartData bone22 = bone19.addChild("bone22", ModelPartBuilder.create().uv(10, 138).cuboid(-2.5F, -1.0F, -2.0F, 5.0F, 2.0F, 2.0F, new Dilation(0.0F)), ModelTransform.pivot(0.0F, 4.25F, -2.0F)); + + ModelPartData bone31 = bone19.addChild("bone31", ModelPartBuilder.create(), ModelTransform.pivot(0.0F, 0.0F, 0.0F)); + + ModelPartData helmet2 = bone31.addChild("helmet2", ModelPartBuilder.create(), ModelTransform.pivot(0.0F, 0.0F, 0.0F)); + + ModelPartData bone25 = helmet2.addChild("bone25", ModelPartBuilder.create().uv(34, 133).cuboid(-4.0F, 0.5F, 0.5F, 8.0F, 8.0F, 1.0F, new Dilation(0.5F)), ModelTransform.pivot(0.0F, -3.5F, -3.75F)); + + ModelPartData bone26 = helmet2.addChild("bone26", ModelPartBuilder.create().uv(34, 142).cuboid(-4.0F, -0.6F, 0.5F, 8.0F, 8.0F, 1.0F, new Dilation(0.5F)) + .uv(10, 177).cuboid(-3.0F, 0.4F, 0.25F, 6.0F, 7.0F, 1.0F, new Dilation(0.001F)), ModelTransform.pivot(0.0F, -2.4F, -3.75F)); + + ModelPartData bone27 = helmet2.addChild("bone27", ModelPartBuilder.create().uv(10, 185).cuboid(-3.0F, -4.1F, 0.25F, 6.0F, 7.0F, 1.0F, new Dilation(0.001F)), ModelTransform.pivot(0.0F, 2.1F, -3.75F)); + + ModelPartData bone30 = bone27.addChild("bone30", ModelPartBuilder.create().uv(34, 151).cuboid(-4.0F, -4.0F, -0.5F, 8.0F, 8.0F, 1.0F, new Dilation(0.5F)), ModelTransform.pivot(0.0F, -1.1F, 1.0F)); + + ModelPartData bone28 = helmet2.addChild("bone28", ModelPartBuilder.create().uv(16, 151).cuboid(-4.0F, -5.1F, 0.5F, 8.0F, 8.0F, 1.0F, new Dilation(0.5F)) + .uv(10, 193).cuboid(-3.0F, -4.1F, 0.25F, 6.0F, 7.0F, 1.0F, new Dilation(0.001F)), ModelTransform.pivot(0.0F, 2.1F, -3.75F)); + + ModelPartData bone29 = helmet2.addChild("bone29", ModelPartBuilder.create().uv(10, 193).cuboid(-3.0F, -3.0F, -4.0F, 6.0F, 7.0F, 1.0F, new Dilation(0.0F)), ModelTransform.pivot(0.0F, 1.0F, 0.5F)); + + ModelPartData caseItem = suit.addChild("case", ModelPartBuilder.create().uv(92, 101).cuboid(-7.0F, -4.0F, -2.0F, 14.0F, 9.0F, 4.0F, new Dilation(0.0F)) + .uv(93, 115).cuboid(-4.0F, -6.0F, -1.0F, 8.0F, 2.0F, 2.0F, new Dilation(0.0F)), ModelTransform.pivot(0.0F, 0.0F, 0.0F)); + return TexturedModelData.of(modelData, 256, 256); + } + + @Override + public void render(LivingEntity entity, float tickDelta, MatrixStack matrices, VertexConsumer vertexConsumers, int light, float r, float g, float b, float alpha) { + matrices.push(); + + matrices.translate(0f, -0.15f, 0f); + this.getPart().render(matrices, vertexConsumers, light, OverlayTexture.DEFAULT_UV, r, g, b, alpha); + + matrices.pop(); + } + + @Override + public ClientSuit getSuit() { + if (this.parent == null) { + this.parent = SetRegistry.MARK_FIVE.suit().toClient(); + } + + return this.parent; + } + + @Override + public ModelPart getPart() { + return this.root; + } + + @Override + public void setAngles(LivingEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { + + } + + @Override + public void copyFrom(BipedEntityModel model) { + super.copyFrom(model); + + this.head.copyTransform(model.head); + this.body.copyTransform(model.body); + this.leftArm.copyTransform(model.leftArm); + this.leftLeg.copyTransform(model.leftLeg); + this.rightArm.copyTransform(model.rightArm); + this.rightLeg.copyTransform(model.rightLeg); + } +} diff --git a/src/main/resources/assets/timeless/textures/suit/ironman/mk5.png b/src/main/resources/assets/timeless/textures/suit/iron_man_mk_five.png similarity index 100% rename from src/main/resources/assets/timeless/textures/suit/ironman/mk5.png rename to src/main/resources/assets/timeless/textures/suit/iron_man_mk_five.png diff --git a/src/main/resources/timeless.mixins.json b/src/main/resources/timeless.mixins.json index f0084e5..47412f4 100644 --- a/src/main/resources/timeless.mixins.json +++ b/src/main/resources/timeless.mixins.json @@ -6,7 +6,8 @@ "EnchantmentHelperMixin" ], "client": [ - "client.ArmorFeatureRendererMixin" + "client.ArmorFeatureRendererMixin", + "client.PlayerEntityRendererMixin" ], "injectors": { "defaultRequire": 1