diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/CustomGunRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/CustomGunRenderer.java index de02fbd6a..5cc9485f2 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/renderer/CustomGunRenderer.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/CustomGunRenderer.java @@ -1,10 +1,12 @@ package com.atsuishio.superbwarfare.client.renderer; +import com.atsuishio.superbwarfare.client.ItemModelHelper; import com.atsuishio.superbwarfare.client.model.item.CustomGunModel; import com.atsuishio.superbwarfare.config.client.DisplayConfig; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.texture.OverlayTexture; @@ -14,6 +16,7 @@ import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.Nullable; import org.joml.Matrix4f; import software.bernie.geckolib.animatable.GeoAnimatable; +import software.bernie.geckolib.animatable.GeoItem; import software.bernie.geckolib.cache.object.BakedGeoModel; import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.model.GeoModel; @@ -21,6 +24,8 @@ import software.bernie.geckolib.renderer.GeoItemRenderer; import software.bernie.geckolib.util.Color; import software.bernie.geckolib.util.RenderUtil; +import java.util.Set; + public class CustomGunRenderer extends GeoItemRenderer { public static final float SCALE_RECIPROCAL = 1.0f / 16.0f; @@ -35,10 +40,36 @@ public class CustomGunRenderer extends GeoIte super(model); } + /** + * 在其他视角下会隐藏的骨骼名称,例如配件的骨骼名 + */ + public Set getHiddenBonesInOtherPerspective() { + return Set.of(); + } + @Override - public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { - this.transformType = transformType; - super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + public void renderRecursively(PoseStack poseStack, T animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + + var player = mc.player; + if (player == null) return; + ItemStack itemStack = player.getMainHandItem(); + if (itemStack.getItem() instanceof GunItem && GeoItem.getId(itemStack) == this.getInstanceId(animatable)) { + if (this.renderPerspective == ItemDisplayContext.FIXED) { + ItemModelHelper.hideAllAttachments(bone, name); + if (this.getHiddenBonesInOtherPerspective().contains(name)) { + bone.setHidden(true); + } + } + } else { + ItemModelHelper.hideAllAttachments(bone, name); + if (this.getHiddenBonesInOtherPerspective().contains(name)) { + bone.setHidden(true); + } + } + + super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/gun/Mp5ItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/gun/Mp5ItemRenderer.java index d5ccd5e4a..c181bad67 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/renderer/gun/Mp5ItemRenderer.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/gun/Mp5ItemRenderer.java @@ -19,6 +19,8 @@ import net.minecraft.world.item.ItemStack; import software.bernie.geckolib.animatable.GeoItem; import software.bernie.geckolib.cache.object.GeoBone; +import java.util.Set; + public class Mp5ItemRenderer extends CustomGunRenderer { public Mp5ItemRenderer() { @@ -54,11 +56,6 @@ public class Mp5ItemRenderer extends CustomGunRenderer { } AnimationHelper.handleShootFlare(name, stack, itemStack, bone, buffer, packedLightIn, 0, 0.05, 1, 0.35); ItemModelHelper.handleGunAttachments(bone, itemStack, name); - } else if (this.renderPerspective == ItemDisplayContext.FIXED) { - ItemModelHelper.hideAllAttachments(bone, name); - if (name.equals("yugu")) { - bone.setHidden(true); - } } int scopeType = GunData.from(itemStack).attachment.get(AttachmentType.SCOPE); @@ -68,11 +65,6 @@ public class Mp5ItemRenderer extends CustomGunRenderer { case 2 -> AnimationHelper.handleZoomCrossHair(currentBuffer, renderType, name, stack, bone, buffer, 0, 0.52, 14, 1.4f, 255, 0, 0, 255, "acog", true); } - } else { - ItemModelHelper.hideAllAttachments(bone, name); - if (name.equals("yugu")) { - bone.setHidden(true); - } } if (renderingArms) { @@ -81,4 +73,9 @@ public class Mp5ItemRenderer extends CustomGunRenderer { super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); } + + @Override + public Set getHiddenBonesInOtherPerspective() { + return Set.of("yugu"); + } }