TurtyWurty

PlayerBoneBERenderer.java

Sep 22nd, 2023
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.98 KB | None | 0 0
  1. package dev.turtywurty.turtyissinking.client.renderers.blockentity;
  2.  
  3. import com.mojang.authlib.GameProfile;
  4. import com.mojang.authlib.minecraft.MinecraftProfileTexture;
  5. import com.mojang.authlib.minecraft.MinecraftProfileTexture.Type;
  6. import com.mojang.blaze3d.vertex.PoseStack;
  7. import dev.turtywurty.turtyissinking.blockentities.PlayerBoneBlockEntity;
  8. import dev.turtywurty.turtyissinking.blocks.PlayerBoneBlock;
  9. import dev.turtywurty.turtyissinking.client.screens.BonesawScreen.PlayerBone;
  10. import net.minecraft.client.Minecraft;
  11. import net.minecraft.client.model.PlayerModel;
  12. import net.minecraft.client.model.geom.ModelPart;
  13. import net.minecraft.client.player.AbstractClientPlayer;
  14. import net.minecraft.client.renderer.MultiBufferSource;
  15. import net.minecraft.client.renderer.RenderType;
  16. import net.minecraft.client.renderer.blockentity.BlockEntityRenderer;
  17. import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider;
  18. import net.minecraft.client.renderer.entity.player.PlayerRenderer;
  19. import net.minecraft.client.renderer.texture.OverlayTexture;
  20. import net.minecraft.client.resources.DefaultPlayerSkin;
  21. import net.minecraft.core.UUIDUtil;
  22. import net.minecraft.resources.ResourceLocation;
  23. import org.jetbrains.annotations.NotNull;
  24.  
  25. import java.util.Map;
  26. import java.util.UUID;
  27.  
  28. public class PlayerBoneBERenderer implements BlockEntityRenderer<PlayerBoneBlockEntity> {
  29.     public PlayerBoneBERenderer(BlockEntityRendererProvider.Context ignored) {
  30.     }
  31.    
  32.     @Override
  33.     public void render(PlayerBoneBlockEntity pBlockEntity, float pPartialTick, @NotNull PoseStack pPoseStack,
  34.                        @NotNull MultiBufferSource pBufferSource, int pPackedLight, int pPackedOverlay) {
  35.         final var block = (PlayerBoneBlock) pBlockEntity.getBlockState().getBlock();
  36.         final PlayerBone bone = block.getBone();
  37.         if (bone == PlayerBone.HEAD)
  38.             return;
  39.  
  40.         GameProfile profile = pBlockEntity.getGameProfile();
  41.         if (profile == null) {
  42.             profile = new GameProfile(UUID.randomUUID(), "Steve");
  43.         }
  44.  
  45.         Map<Type, MinecraftProfileTexture> map = getSkinInformation(profile);
  46.         final ResourceLocation texture = getSkinTexture(map, profile);
  47.         final RenderType renderType = getRenderType(texture);
  48.         String modelType = getModelType(profile, map);
  49.         final PlayerRenderer renderer = getPlayerRenderer(modelType);
  50.         if (renderer == null)
  51.             return;
  52.  
  53.         final PlayerModel<AbstractClientPlayer> model = renderer.getModel();
  54.         final ModelPart[] parts = bone.getParts(model);
  55.         for (final ModelPart modelPart : parts) {
  56.             pPoseStack.pushPose();
  57.             modelPart.translateAndRotate(pPoseStack);
  58.             pPoseStack.scale(1.0f, -1.0f, -1.0f);
  59.             pPoseStack.translate(0.5, -0.75, -0.5);
  60.             switch (bone) {
  61.                 case LEFT_ARM:
  62.                     pPoseStack.translate(-0.7, 0.0, 0.0);
  63.                     break;
  64.                 case RIGHT_ARM:
  65.                     pPoseStack.translate(0.7, 0.0, 0.0);
  66.                     break;
  67.                 case LEFT_LEG:
  68.                     pPoseStack.translate(-0.2375, 0.0, 0);
  69.                     break;
  70.                 case RIGHT_LEG:
  71.                     pPoseStack.translate(0.2375, 0.0, 0);
  72.                     break;
  73.             }
  74.  
  75.             modelPart.render(
  76.                     pPoseStack,
  77.                     pBufferSource.getBuffer(renderType),
  78.                     pPackedLight,
  79.                     OverlayTexture.NO_OVERLAY);
  80.             pPoseStack.popPose();
  81.         }
  82.     }
  83.  
  84.     private static Map<Type, MinecraftProfileTexture> getSkinInformation(GameProfile profile) {
  85.         return Minecraft.getInstance()
  86.                 .getSkinManager()
  87.                 .getInsecureSkinInformation(profile);
  88.     }
  89.  
  90.     private static ResourceLocation getSkinTexture(Map<Type, MinecraftProfileTexture> map, GameProfile profile) {
  91.         if (map.containsKey(Type.SKIN)) {
  92.             return Minecraft.getInstance()
  93.                     .getSkinManager()
  94.                     .registerTexture(map.get(Type.SKIN), Type.SKIN);
  95.         } else {
  96.             return DefaultPlayerSkin.getDefaultSkin(UUIDUtil.getOrCreatePlayerUUID(profile));
  97.         }
  98.     }
  99.  
  100.     private static RenderType getRenderType(ResourceLocation texture) {
  101.         return RenderType.entityCutoutNoCull(texture);
  102.     }
  103.  
  104.     private static String getModelType(GameProfile profile, Map<Type, MinecraftProfileTexture> map) {
  105.         return profile == null ||
  106.                 map == null ||
  107.                 !map.containsKey(Type.SKIN) ?
  108.                     "default" :
  109.                     map.get(Type.SKIN).getMetadata("model");
  110.     }
  111.  
  112.     private static PlayerRenderer getPlayerRenderer(String modelType) {
  113.         return (PlayerRenderer)
  114.                 Minecraft.getInstance()
  115.                         .getEntityRenderDispatcher()
  116.                         .getSkinMap()
  117.                         .get(modelType);
  118.     }
  119. }
  120.  
Add Comment
Please, Sign In to add comment