From 5a76223f14ab314c0fa51f22b5abce6590c01ed5 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 21 Oct 2022 19:31:53 +0700 Subject: [PATCH] ah yes, no hooks for layers --- .../mc/otm/client/model/ExosuitModel.java | 89 +++++++++++++------ 1 file changed, 62 insertions(+), 27 deletions(-) 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 index 4b848fd4b..d5a52d0c6 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/client/model/ExosuitModel.java +++ b/src/main/java/ru/dbotthepony/mc/otm/client/model/ExosuitModel.java @@ -1,7 +1,10 @@ package ru.dbotthepony.mc.otm.client.model; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import it.unimi.dsi.fastutil.objects.ReferenceArraySet; import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.PlayerModel; import net.minecraft.client.model.geom.PartPose; import net.minecraft.client.model.geom.builders.CubeDeformation; import net.minecraft.client.model.geom.builders.CubeListBuilder; @@ -10,13 +13,20 @@ 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.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.client.event.RenderPlayerEvent; import ru.dbotthepony.mc.otm.OverdriveThatMatters; import ru.dbotthepony.mc.otm.capability.MatteryCapability; +import javax.annotation.Nonnull; +import java.util.Set; + public final class ExosuitModel { private ExosuitModel() {} @@ -84,40 +94,65 @@ public final class ExosuitModel { modelGlow.rightLeg.visible = false; } - @SuppressWarnings("OptionalGetWithoutIsPresent") - public static void onPlayerRendered(final RenderPlayerEvent.Post event) { - var cap = event.getEntity().getCapability(MatteryCapability.MATTERY_PLAYER); + private static final Set patchedRenderers = new ReferenceArraySet<>(); - if (!cap.isPresent()) { - return; + private static class ExosuitLayer extends RenderLayer> { + public ExosuitLayer(RenderLayerParent> p_117346_) { + super(p_117346_); } - if (cap.resolve().get().getHasExoSuit()) { - var model = event.getRenderer().getModel(); - model.copyPropertiesTo(modelNormal); - model.copyPropertiesTo(modelGlow); + @SuppressWarnings("OptionalGetWithoutIsPresent") + @Override + public void render( + @Nonnull PoseStack poseStack, + @Nonnull MultiBufferSource bufferSource, + int packedLight, + @Nonnull AbstractClientPlayer player, + float p_117353_, + float p_117354_, + float p_117355_, + float p_117356_, + float p_117357_, + float p_117358_ + ) { + var cap = player.getCapability(MatteryCapability.MATTERY_PLAYER); - int overlayCoords = LivingEntityRenderer.getOverlayCoords(event.getEntity(), 0f); + if (!cap.isPresent()) { + return; + } - var rendertype = RenderType.entityCutoutNoCull(texture); + if (cap.resolve().get().getHasExoSuit()) { + var model = getParentModel(); + model.copyPropertiesTo(modelNormal); + model.copyPropertiesTo(modelGlow); - modelNormal.renderToBuffer( - event.getPoseStack(), - event.getMultiBufferSource().getBuffer(rendertype), - event.getPackedLight(), - overlayCoords, - // rgba - 1f, 1f, 1f, 1f - ); + int overlayCoords = LivingEntityRenderer.getOverlayCoords(player, 0f); + var rendertype = RenderType.entityCutoutNoCull(texture); - modelGlow.renderToBuffer( - event.getPoseStack(), - event.getMultiBufferSource().getBuffer(rendertype), - event.getPackedLight(), - overlayCoords, - // rgba - 1f, 1f, 1f, 1f - ); + modelNormal.renderToBuffer( + poseStack, + bufferSource.getBuffer(rendertype), + packedLight, + overlayCoords, + // rgba + 1f, 1f, 1f, 1f + ); + + modelGlow.renderToBuffer( + poseStack, + bufferSource.getBuffer(rendertype), + packedLight, + overlayCoords, + // rgba + 1f, 1f, 1f, 1f + ); + } + } + } + + public static void onPlayerRendered(final RenderPlayerEvent.Post event) { + if (patchedRenderers.add(event.getRenderer())) { + event.getRenderer().addLayer(new ExosuitLayer(event.getRenderer())); } } }