1010import net .minecraft .client .render .entity .LivingEntityRenderer ;
1111import net .minecraft .client .render .entity .PlayerEntityRenderer ;
1212import net .minecraft .client .render .entity .model .PlayerEntityModel ;
13+ import net .minecraft .client .texture .GuiAtlasManager ;
14+ import net .minecraft .client .texture .Sprite ;
1315import net .minecraft .client .util .math .MatrixStack ;
1416import net .minecraft .entity .Entity ;
15- import net .minecraft .util . Identifier ;
17+ import net .minecraft .scoreboard . ScoreboardDisplaySlot ;
1618import net .minecraft .util .math .MathHelper ;
1719import org .joml .Matrix4f ;
1820import org .spongepowered .asm .mixin .Mixin ;
21+ import org .spongepowered .asm .mixin .Unique ;
1922import org .spongepowered .asm .mixin .injection .At ;
2023import org .spongepowered .asm .mixin .injection .Inject ;
2124import org .spongepowered .asm .mixin .injection .callback .CallbackInfo ;
2225
2326@ Mixin (PlayerEntityRenderer .class )
2427public abstract class PlayerEntityRendererMixin extends LivingEntityRenderer <AbstractClientPlayerEntity , PlayerEntityModel <AbstractClientPlayerEntity >> {
25- private static final Identifier ICONS = new Identifier ("textures/gui/icons.png" );
26-
2728 public PlayerEntityRendererMixin (EntityRendererFactory .Context ctx , PlayerEntityModel <AbstractClientPlayerEntity > model , float shadowRadius ) {
2829 super (ctx , model , shadowRadius );
2930 }
@@ -44,7 +45,7 @@ public void renderHealth(AbstractClientPlayerEntity abstractClientPlayerEntity,
4445 matrixStack .translate (0 , abstractClientPlayerEntity .getHeight () + 0.5f , 0 );
4546 if (this .hasLabel (abstractClientPlayerEntity ) && d <= 4096.0 ) {
4647 matrixStack .translate (0.0D , 9.0F * 1.15F * 0.025F , 0.0D );
47- if (d < 100.0 && abstractClientPlayerEntity .getScoreboard ().getObjectiveForSlot (2 ) != null ) {
48+ if (d < 100.0 && abstractClientPlayerEntity .getScoreboard ().getObjectiveForSlot (ScoreboardDisplaySlot . BELOW_NAME ) != null ) {
4849 matrixStack .translate (0.0D , 9.0F * 1.15F * 0.025F , 0.0D );
4950 }
5051 }
@@ -56,13 +57,12 @@ public void renderHealth(AbstractClientPlayerEntity abstractClientPlayerEntity,
5657 matrixStack .scale (pixelSize , pixelSize , pixelSize );
5758 matrixStack .translate (0 , Config .getHeartOffset (), 0 );
5859
59- Tessellator tessellator = Tessellator .getInstance ();
60- BufferBuilder vertexConsumer = tessellator .getBuffer ();
60+ GuiAtlasManager guiAtlasManager = MinecraftClient .getInstance ().getGuiAtlasManager ();
6161
62- vertexConsumer .begin (VertexFormat .DrawMode .QUADS , VertexFormats .POSITION_TEXTURE );
6362 RenderSystem .setShader (GameRenderer ::getPositionTexProgram );
64- RenderSystem .setShaderTexture (0 , ICONS );
63+ RenderSystem .setShaderTexture (0 , guiAtlasManager . getSprite ( HeartType . EMPTY . texture ). getAtlasId () );
6564 RenderSystem .enableDepthTest ();
65+ BufferBuilder vertexConsumer = Tessellator .getInstance ().begin (VertexFormat .DrawMode .QUADS , VertexFormats .POSITION_TEXTURE );
6666
6767 Matrix4f model = matrixStack .peek ().getPositionMatrix ();
6868
@@ -90,7 +90,7 @@ public void renderHealth(AbstractClientPlayerEntity abstractClientPlayerEntity,
9090 float x = maxX - col * 8 ;
9191 float y = row * rowOffset ;
9292 float z = row * 0.01F ;
93- drawHeart (model , vertexConsumer , x , y , z , HeartType .EMPTY );
93+ drawHeart (model , vertexConsumer , x , y , z , HeartType .EMPTY , guiAtlasManager );
9494
9595 HeartType type ;
9696 if (heart < heartsRed ) {
@@ -107,15 +107,16 @@ public void renderHealth(AbstractClientPlayerEntity abstractClientPlayerEntity,
107107 }
108108 }
109109 if (type != HeartType .EMPTY ) {
110- drawHeart (model , vertexConsumer , x , y , z , type );
110+ drawHeart (model , vertexConsumer , x , y , z , type , guiAtlasManager );
111111 }
112112 }
113113
114- tessellator . draw ( );
114+ BufferRenderer . drawWithGlobalProgram ( vertexConsumer . end () );
115115
116116 matrixStack .pop ();
117117 }
118118
119+ @ Unique
119120 private static boolean shouldRenderHeartsForEntity (Entity entity ) {
120121 if (entity instanceof AbstractClientPlayerEntity abstractClientPlayerEntity ) {
121122 return !abstractClientPlayerEntity .isMainPlayer () && !abstractClientPlayerEntity .isInvisibleTo (MinecraftClient .getInstance ().player );
@@ -124,21 +125,25 @@ private static boolean shouldRenderHeartsForEntity(Entity entity) {
124125 return false ;
125126 }
126127
127- private static void drawHeart (Matrix4f model , VertexConsumer vertexConsumer , float x , float y , float z , HeartType type ){
128- float minU = type .u / 256F ;
129- float maxU = minU + 9F / 256F ;
130- float minV = type .v / 256F ;
131- float maxV = minV + 9F / 256F ;
128+ @ Unique
129+ private static void drawHeart (Matrix4f model , VertexConsumer vertexConsumer , float x , float y , float z , HeartType type , GuiAtlasManager guiAtlasManager ){
130+ Sprite sprite = guiAtlasManager .getSprite (type .texture );
131+
132+ float minU = sprite .getMinU ();
133+ float maxU = sprite .getMaxU ();
134+ float minV = sprite .getMinV ();
135+ float maxV = sprite .getMaxV ();
132136
133137 float heartSize = 9F ;
134138
135139 drawVertex (model , vertexConsumer , x , y - heartSize , z , minU , maxV );
136- drawVertex (model , vertexConsumer , x - heartSize , y - heartSize , z , maxU , maxV );
137- drawVertex (model , vertexConsumer , x - heartSize , y , z , maxU , minV );
138140 drawVertex (model , vertexConsumer , x , y , z , minU , minV );
141+ drawVertex (model , vertexConsumer , x - heartSize , y , z , maxU , minV );
142+ drawVertex (model , vertexConsumer , x - heartSize , y - heartSize , z , maxU , maxV );
139143 }
140144
145+ @ Unique
141146 private static void drawVertex (Matrix4f model , VertexConsumer vertices , float x , float y , float z , float u , float v ) {
142- vertices .vertex (model , x , y , z ).texture (u , v ). next () ;
147+ vertices .vertex (model , x , y , z ).texture (u , v );
143148 }
144149}
0 commit comments