diff --git a/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java b/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java index ebdc8115c..50cbafea4 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java +++ b/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java @@ -26,6 +26,7 @@ import ru.dbotthepony.mc.otm.client.AndroidMenuKeyMapping; import ru.dbotthepony.mc.otm.client.ClientEventHandlerKt; import ru.dbotthepony.mc.otm.client.ClientTickHandlerKt; import ru.dbotthepony.mc.otm.client.MatteryGUI; +import ru.dbotthepony.mc.otm.client.model.ExosuitModel; import ru.dbotthepony.mc.otm.client.model.GravitationStabilizerModel; import ru.dbotthepony.mc.otm.client.model.TritaniumArmorModel; import ru.dbotthepony.mc.otm.client.render.ShockwaveRenderer; @@ -199,6 +200,8 @@ public final class OverdriveThatMatters { EVENT_BUS.addListener(EventPriority.NORMAL, AndroidAbilityKeyMapping.INSTANCE::onRenderGuiEvent); EVENT_BUS.addListener(EventPriority.NORMAL, AndroidAbilityKeyMapping.INSTANCE::onRenderLevel); + EVENT_BUS.addListener(EventPriority.NORMAL, ExosuitModel::onPlayerRendered); + event.enqueueWork(GlobalEventHandlerKt::recordClientThread); } } diff --git a/src/main/java/ru/dbotthepony/mc/otm/client/model/ExosuitModel.java b/src/main/java/ru/dbotthepony/mc/otm/client/model/ExosuitModel.java new file mode 100644 index 000000000..4b848fd4b --- /dev/null +++ b/src/main/java/ru/dbotthepony/mc/otm/client/model/ExosuitModel.java @@ -0,0 +1,123 @@ +package ru.dbotthepony.mc.otm.client.model; + +import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeDeformation; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.client.event.RenderPlayerEvent; +import ru.dbotthepony.mc.otm.OverdriveThatMatters; +import ru.dbotthepony.mc.otm.capability.MatteryCapability; + +public final class ExosuitModel { + private ExosuitModel() {} + + public static final HumanoidModel modelNormal; + public static final HumanoidModel modelGlow; + + public static final ResourceLocation texture = new ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/models/armor/exosuit.png"); + + static { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + partdefinition.addOrReplaceChild("head", CubeListBuilder.create(), PartPose.offset(0.0F, 0.0F, 0.0F)); + partdefinition.addOrReplaceChild("hat", CubeListBuilder.create(), PartPose.offset(0.0F, 0.0F, 0.0F)); + + partdefinition.addOrReplaceChild("body", CubeListBuilder.create().texOffs(20, 0).addBox(-3.0F, -0.1F, 3.5F, 6.0F, 8.0F, 3.0F, new CubeDeformation(0.0F)) + .texOffs(0, 14).addBox(-3.0F, 8.6F, 3.5F, 6.0F, 3.0F, 3.0F, new CubeDeformation(0.0F)) + .texOffs(0, 0).addBox(-3.5F, 0.5F, 1.5F, 7.0F, 11.0F, 3.0F, new CubeDeformation(0.0F)) + .texOffs(18, 12).addBox(-4.0F, 9.0F, 2.5F, 1.0F, 2.0F, 3.0F, new CubeDeformation(0.0F)) + .texOffs(18, 12).addBox(3.0F, 9.0F, 2.5F, 1.0F, 2.0F, 3.0F, new CubeDeformation(0.0F)) + .texOffs(0, 20).addBox(-2.5F, 7.0F, 4.0F, 5.0F, 2.0F, 2.0F, new CubeDeformation(0.0F)) + .texOffs(38, 0).addBox(2.0F, 1.0F, 3.5F, 2.0F, 6.0F, 2.0F, new CubeDeformation(0.0F)) + .texOffs(15, 17).addBox(-4.0F, 1.0F, 2.5F, 2.0F, 3.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 0.0F, 0.0F)); + + partdefinition.addOrReplaceChild("right_arm", CubeListBuilder.create(), PartPose.offset(-5.0F, 2.0F, 0.0F)); + partdefinition.addOrReplaceChild("left_arm", CubeListBuilder.create(), PartPose.offset(5.0F, 2.0F, 0.0F)); + partdefinition.addOrReplaceChild("right_leg", CubeListBuilder.create(), PartPose.offset(-1.9F, 12.0F, 0.0F)); + partdefinition.addOrReplaceChild("left_leg", CubeListBuilder.create(), PartPose.offset(1.9F, 12.0F, 0.0F)); + + var def = LayerDefinition.create(meshdefinition, 64, 64); + modelNormal = new HumanoidModel<>(def.bakeRoot()); + + modelNormal.head.visible = false; + modelNormal.hat.visible = false; + modelNormal.rightArm.visible = false; + modelNormal.leftArm.visible = false; + modelNormal.leftLeg.visible = false; + modelNormal.rightLeg.visible = false; + } + + static { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + partdefinition.addOrReplaceChild("head", CubeListBuilder.create(), PartPose.offset(0.0F, 0.0F, 0.0F)); + partdefinition.addOrReplaceChild("hat", CubeListBuilder.create(), PartPose.offset(0.0F, 0.0F, 0.0F)); + + partdefinition.addOrReplaceChild("body", CubeListBuilder.create().texOffs(20, 0).addBox(-3.0F, -0.1F, 3.5F, 6.0F, 8.0F, 3.0F, new CubeDeformation(0.0F)) + .texOffs(29, 4).addBox(-2.0F, 0.9F, 6.5F, 4.0F, 1.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(29, 4).addBox(-2.0F, 2.9F, 6.5F, 4.0F, 1.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 0.0F, 0.0F)); + + partdefinition.addOrReplaceChild("right_arm", CubeListBuilder.create(), PartPose.offset(-5.0F, 2.0F, 0.0F)); + partdefinition.addOrReplaceChild("left_arm", CubeListBuilder.create(), PartPose.offset(5.0F, 2.0F, 0.0F)); + partdefinition.addOrReplaceChild("right_leg", CubeListBuilder.create(), PartPose.offset(-1.9F, 12.0F, 0.0F)); + partdefinition.addOrReplaceChild("left_leg", CubeListBuilder.create(), PartPose.offset(1.9F, 12.0F, 0.0F)); + + var def = LayerDefinition.create(meshdefinition, 64, 64); + modelGlow = new HumanoidModel<>(def.bakeRoot()); + + modelGlow.head.visible = false; + modelGlow.hat.visible = false; + modelGlow.rightArm.visible = false; + modelGlow.leftArm.visible = false; + modelGlow.leftLeg.visible = false; + modelGlow.rightLeg.visible = false; + } + + @SuppressWarnings("OptionalGetWithoutIsPresent") + public static void onPlayerRendered(final RenderPlayerEvent.Post event) { + var cap = event.getEntity().getCapability(MatteryCapability.MATTERY_PLAYER); + + if (!cap.isPresent()) { + return; + } + + if (cap.resolve().get().getHasExoSuit()) { + var model = event.getRenderer().getModel(); + model.copyPropertiesTo(modelNormal); + model.copyPropertiesTo(modelGlow); + + int overlayCoords = LivingEntityRenderer.getOverlayCoords(event.getEntity(), 0f); + + var rendertype = RenderType.entityCutoutNoCull(texture); + + modelNormal.renderToBuffer( + event.getPoseStack(), + event.getMultiBufferSource().getBuffer(rendertype), + event.getPackedLight(), + overlayCoords, + // rgba + 1f, 1f, 1f, 1f + ); + + modelGlow.renderToBuffer( + event.getPoseStack(), + event.getMultiBufferSource().getBuffer(rendertype), + event.getPackedLight(), + overlayCoords, + // rgba + 1f, 1f, 1f, 1f + ); + } + } +} diff --git a/src/main/java/ru/dbotthepony/mc/otm/client/model/GravitationStabilizerModel.java b/src/main/java/ru/dbotthepony/mc/otm/client/model/GravitationStabilizerModel.java index 4c817d68e..fbd689852 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/client/model/GravitationStabilizerModel.java +++ b/src/main/java/ru/dbotthepony/mc/otm/client/model/GravitationStabilizerModel.java @@ -9,9 +9,11 @@ import net.minecraftforge.client.event.EntityRenderersEvent; import ru.dbotthepony.mc.otm.OverdriveThatMatters; import ru.dbotthepony.mc.otm.registry.MNames; -public class GravitationStabilizerModel { +public final class GravitationStabilizerModel { public static final ModelLayerLocation LAYER_LOCATION = new ModelLayerLocation(OverdriveThatMatters.loc(MNames.PORTABLE_GRAVITATION_STABILIZER), "main"); + private GravitationStabilizerModel() {} + private static HumanoidModel model; private static LayerDefinition def;