ModCapeLayer.java 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package me.km.overrides;
  2. import com.mojang.blaze3d.matrix.MatrixStack;
  3. import com.mojang.blaze3d.vertex.IVertexBuilder;
  4. import net.minecraft.client.entity.player.AbstractClientPlayerEntity;
  5. import net.minecraft.client.renderer.IRenderTypeBuffer;
  6. import net.minecraft.client.renderer.RenderType;
  7. import net.minecraft.client.renderer.Vector3f;
  8. import net.minecraft.client.renderer.entity.IEntityRenderer;
  9. import net.minecraft.client.renderer.entity.layers.CapeLayer;
  10. import net.minecraft.client.renderer.entity.model.PlayerModel;
  11. import net.minecraft.client.renderer.texture.OverlayTexture;
  12. import net.minecraft.entity.player.PlayerModelPart;
  13. import net.minecraft.inventory.EquipmentSlotType;
  14. import net.minecraft.item.ItemStack;
  15. import net.minecraft.item.Items;
  16. import net.minecraft.util.ResourceLocation;
  17. import net.minecraft.util.math.MathHelper;
  18. import net.minecraftforge.api.distmarker.Dist;
  19. import net.minecraftforge.api.distmarker.OnlyIn;
  20. @OnlyIn(Dist.CLIENT)
  21. public class ModCapeLayer extends CapeLayer {
  22. public ModCapeLayer(IEntityRenderer<AbstractClientPlayerEntity, PlayerModel<AbstractClientPlayerEntity>> pRenderer) {
  23. super(pRenderer);
  24. }
  25. @Override
  26. public void render(MatrixStack mStack, IRenderTypeBuffer buffer, int packedLightIn, AbstractClientPlayerEntity p, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch) {
  27. if(p.hasPlayerInfo() && !p.isInvisible() && p.isWearing(PlayerModelPart.CAPE)) {
  28. ItemStack chestStack = p.getItemStackFromSlot(EquipmentSlotType.CHEST);
  29. if(chestStack.getItem() != Items.ELYTRA) {
  30. ResourceLocation rl = PlayerCapeLoader.INSTANCE.getTexture(p.getUniqueID());
  31. if(rl == null) {
  32. return;
  33. }
  34. mStack.push();
  35. mStack.translate(0.0, 0.0, 0.125);
  36. double d0 = MathHelper.lerp(partialTicks, p.prevChasingPosX, p.chasingPosX) - MathHelper.lerp(partialTicks, p.prevPosX, p.getPosX());
  37. double d1 = MathHelper.lerp(partialTicks, p.prevChasingPosY, p.chasingPosY) - MathHelper.lerp(partialTicks, p.prevPosY, p.getPosY());
  38. double d2 = MathHelper.lerp(partialTicks, p.prevChasingPosZ, p.chasingPosZ) - MathHelper.lerp(partialTicks, p.prevPosZ, p.getPosZ());
  39. float f = p.prevRenderYawOffset + (p.renderYawOffset - p.prevRenderYawOffset);
  40. double d3 = MathHelper.sin(f * ((float) Math.PI / 180f));
  41. double d4 = -MathHelper.cos(f * ((float) Math.PI / 180f));
  42. float f1 = (float) d1 * 10.0f;
  43. f1 = MathHelper.clamp(f1, -6.0f, 32.0f);
  44. float f2 = (float) (d0 * d3 + d2 * d4) * 100.0f;
  45. f2 = MathHelper.clamp(f2, 0.0f, 150.0f);
  46. float f3 = (float) (d0 * d4 - d2 * d3) * 100.0f;
  47. f3 = MathHelper.clamp(f3, -20.0f, 20.0f);
  48. if(f2 < 0.0f) {
  49. f2 = 0.0f;
  50. }
  51. float f4 = MathHelper.lerp(partialTicks, p.prevCameraYaw, p.cameraYaw);
  52. f1 = f1 + MathHelper.sin(MathHelper.lerp(partialTicks, p.prevDistanceWalkedModified, p.distanceWalkedModified) * 6.0f) * 32.0f * f4;
  53. if(p.isCrouching()) {
  54. f1 += 25.0f;
  55. }
  56. mStack.rotate(Vector3f.XP.rotationDegrees(6.0f + f2 / 2.0f + f1));
  57. mStack.rotate(Vector3f.ZP.rotationDegrees(f3 / 2.0f));
  58. mStack.rotate(Vector3f.YP.rotationDegrees(180.0f - f3 / 2.0f));
  59. IVertexBuilder ivertexbuilder = buffer.getBuffer(RenderType.getEntitySolid(rl));
  60. this.getEntityModel().renderCape(mStack, ivertexbuilder, packedLightIn, OverlayTexture.NO_OVERLAY);
  61. mStack.pop();
  62. }
  63. }
  64. }
  65. }