diff --git a/src/main/java/tobinio/realarrowtip/RealArrowTip.java b/src/main/java/tobinio/realarrowtip/RealArrowTip.java index e2a33b8..eb24146 100644 --- a/src/main/java/tobinio/realarrowtip/RealArrowTip.java +++ b/src/main/java/tobinio/realarrowtip/RealArrowTip.java @@ -3,6 +3,8 @@ package tobinio.realarrowtip; import net.fabricmc.api.ModInitializer; public class RealArrowTip implements ModInitializer { + public static String modID = "real_arrow_tip"; + /** * Runs the mod initializer. */ diff --git a/src/main/java/tobinio/realarrowtip/mixin/ArrowEntityRendererMixin.java b/src/main/java/tobinio/realarrowtip/mixin/ArrowEntityRendererMixin.java new file mode 100644 index 0000000..cc7a086 --- /dev/null +++ b/src/main/java/tobinio/realarrowtip/mixin/ArrowEntityRendererMixin.java @@ -0,0 +1,34 @@ +package tobinio.realarrowtip.mixin; + +import net.minecraft.client.render.entity.ArrowEntityRenderer; +import net.minecraft.client.render.entity.EntityRendererFactory; +import net.minecraft.client.render.entity.ProjectileEntityRenderer; +import net.minecraft.entity.projectile.ArrowEntity; +import net.minecraft.util.Identifier; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.injection.Redirect; +import tobinio.realarrowtip.RealArrowTip; + +import static net.minecraft.client.render.entity.ArrowEntityRenderer.TEXTURE; + +/** + * Created: 02/10/2023 + * @author Tobias Frischmann + */ + +@Mixin (ArrowEntityRenderer.class) +public abstract class ArrowEntityRendererMixin extends ProjectileEntityRenderer { + + //todo only overwrite identifier + + public ArrowEntityRendererMixin(EntityRendererFactory.Context context) { + super(context); + } + + @Override + public Identifier getTexture(ArrowEntity arrowEntity) { + return arrowEntity.getColor() > 0 ? new Identifier(RealArrowTip.modID, "textures/entity/projectiles/tipped_arrow.png") : TEXTURE; + } + +} diff --git a/src/main/java/tobinio/realarrowtip/mixin/ProjectileEntityRendererMixin.java b/src/main/java/tobinio/realarrowtip/mixin/ProjectileEntityRendererMixin.java index 8c7bb94..ab6d73d 100644 --- a/src/main/java/tobinio/realarrowtip/mixin/ProjectileEntityRendererMixin.java +++ b/src/main/java/tobinio/realarrowtip/mixin/ProjectileEntityRendererMixin.java @@ -2,11 +2,16 @@ package tobinio.realarrowtip.mixin; import com.llamalad7.mixinextras.sugar.Local; import net.minecraft.client.render.OverlayTexture; +import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.entity.ProjectileEntityRenderer; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.projectile.ArrowEntity; import net.minecraft.entity.projectile.PersistentProjectileEntity; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.ColorHelper; +import net.minecraft.util.math.RotationAxis; import org.joml.Matrix3f; import org.joml.Matrix4f; import org.spongepowered.asm.mixin.Mixin; @@ -15,48 +20,40 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import tobinio.realarrowtip.RealArrowTip; @Mixin (ProjectileEntityRenderer.class) public abstract class ProjectileEntityRendererMixin { + @Inject (at = @At (value = "INVOKE", target = "Lnet/minecraft/client/util/math/MatrixStack;pop()V", shift = At.Shift.BEFORE), method = "render(Lnet/minecraft/entity/projectile/PersistentProjectileEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V") + private void render(T persistentProjectileEntity, float f, float g, MatrixStack matrixStack, + VertexConsumerProvider vertexConsumerProvider, int i, CallbackInfo ci, @Local Matrix4f matrix4f, + @Local Matrix3f matrix3f) { - @Shadow - public abstract void vertex(Matrix4f positionMatrix, Matrix3f normalMatrix, VertexConsumer vertexConsumer, int x, - int y, int z, float u, float v, int normalX, int normalZ, int normalY, int light); + if (persistentProjectileEntity instanceof ArrowEntity arrowEntity) { - @Redirect (at = @At (value = "INVOKE", target = "Lnet/minecraft/client/render/entity/ProjectileEntityRenderer;vertex(Lorg/joml/Matrix4f;Lorg/joml/Matrix3f;Lnet/minecraft/client/render/VertexConsumer;IIIFFIIII)V", ordinal = 8), method = "render(Lnet/minecraft/entity/projectile/PersistentProjectileEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V") - private void render1(ProjectileEntityRenderer instance, Matrix4f positionMatrix, Matrix3f normalMatrix, - VertexConsumer vertexConsumer, int x, int y, int z, float u, float v, int normalX, int normalZ, int normalY, - int light) { + int color = arrowEntity.getColor(); - this.vertexTint(positionMatrix, normalMatrix, vertexConsumer, -8, -2, 0, 0.0F, 0.0F, 0, 1, 0, light); - } - - @Redirect (at = @At (value = "INVOKE", target = "Lnet/minecraft/client/render/entity/ProjectileEntityRenderer;vertex(Lorg/joml/Matrix4f;Lorg/joml/Matrix3f;Lnet/minecraft/client/render/VertexConsumer;IIIFFIIII)V", ordinal = 9), method = "render(Lnet/minecraft/entity/projectile/PersistentProjectileEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V") - private void render2(ProjectileEntityRenderer instance, Matrix4f positionMatrix, Matrix3f normalMatrix, - VertexConsumer vertexConsumer, int x, int y, int z, float u, float v, int normalX, int normalZ, int normalY, - int light) { - - this.vertexTint(positionMatrix, normalMatrix, vertexConsumer, 8, -2, 0, 0.5F, 0.0F, 0, 1, 0, light); - } - - @Redirect (at = @At (value = "INVOKE", target = "Lnet/minecraft/client/render/entity/ProjectileEntityRenderer;vertex(Lorg/joml/Matrix4f;Lorg/joml/Matrix3f;Lnet/minecraft/client/render/VertexConsumer;IIIFFIIII)V", ordinal = 10), method = "render(Lnet/minecraft/entity/projectile/PersistentProjectileEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V") - private void render3(ProjectileEntityRenderer instance, Matrix4f positionMatrix, Matrix3f normalMatrix, - VertexConsumer vertexConsumer, int x, int y, int z, float u, float v, int normalX, int normalZ, int normalY, - int light) { + if (color < 0) + return; - this.vertexTint(positionMatrix, normalMatrix, vertexConsumer, 8, 2, 0, 0.5F, 0.15625F, 0, 1, 0, light); - } + VertexConsumer headVertexConsumer = vertexConsumerProvider.getBuffer(RenderLayer.getEntityCutout(new Identifier(RealArrowTip.modID, "textures/entity/projectiles/tipped_arrow_head.png"))); - @Redirect (at = @At (value = "INVOKE", target = "Lnet/minecraft/client/render/entity/ProjectileEntityRenderer;vertex(Lorg/joml/Matrix4f;Lorg/joml/Matrix3f;Lnet/minecraft/client/render/VertexConsumer;IIIFFIIII)V", ordinal = 11), method = "render(Lnet/minecraft/entity/projectile/PersistentProjectileEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V") - private void render4(ProjectileEntityRenderer instance, Matrix4f positionMatrix, Matrix3f normalMatrix, - VertexConsumer vertexConsumer, int x, int y, int z, float u, float v, int normalX, int normalZ, int normalY, - int light) { + int red = ColorHelper.Argb.getRed(color); + int blue = ColorHelper.Argb.getBlue(color); + int green = ColorHelper.Argb.getGreen(color); - this.vertexTint(positionMatrix, normalMatrix, vertexConsumer, -8, 2, 0, 0.0F, 0.15625F, 0, 1, 0, light); + for (int u = 0; u < 4; ++u) { + matrixStack.multiply(RotationAxis.POSITIVE_X.rotationDegrees(90.0F)); + vertexTint(matrix4f, matrix3f, headVertexConsumer, -8, -2, 0, 0.0F, 0.0F, 0, 1, 0, i, red, green, blue); + vertexTint(matrix4f, matrix3f, headVertexConsumer, 8, -2, 0, 0.5F, 0.0F, 0, 1, 0, i, red, green, blue); + vertexTint(matrix4f, matrix3f, headVertexConsumer, 8, 2, 0, 0.5F, 0.15625F, 0, 1, 0, i, red, green, blue); + vertexTint(matrix4f, matrix3f, headVertexConsumer, -8, 2, 0, 0.0F, 0.15625F, 0, 1, 0, i, red, green, blue); + } + } } private void vertexTint(Matrix4f positionMatrix, Matrix3f normalMatrix, VertexConsumer vertexConsumer, int x, int y, - int z, float u, float v, int normalX, int normalZ, int normalY, int light) { - vertexConsumer.vertex(positionMatrix, (float) x, (float) y, (float) z).color(255, 0, 255, 255).texture(u, v).overlay(OverlayTexture.DEFAULT_UV).light(light).normal(normalMatrix, (float) normalX, (float) normalY, (float) normalZ).next(); + int z, float u, float v, int normalX, int normalZ, int normalY, int light, int red, int green, int blue) { + vertexConsumer.vertex(positionMatrix, (float) x, (float) y, (float) z).color(red, green, blue, 255).texture(u, v).overlay(OverlayTexture.DEFAULT_UV).light(light).normal(normalMatrix, (float) normalX, (float) normalY, (float) normalZ).next(); } } diff --git a/src/main/resources/assets/real_arrow_tip/textures/entity/projectiles/tipped_arrow.png b/src/main/resources/assets/real_arrow_tip/textures/entity/projectiles/tipped_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..90426d6059dceb09b3e13bda2eb9d641044ff033 GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4rT@h2A3sW#~2tG7>k44ofy`glX=O&z`&C3 z=Zvn%Y>*sGm;n>7^2_ziZC!Ru$Kh+ z1^)*F1}Sf5HwFd<&H|6fVg?4j!ywFfJby(B0|SGHr;B5Vh5y^WgIo*>9L~#i|NozC z{N{qirpJ{y=ZyaiuxH-AB0Cfmh4ZE3bKy*GvPDqL2(v- cjx%gouHv~%&l}n^FfcH9y85}Sb4q9e02dohh5!Hn literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/real_arrow_tip/textures/entity/projectiles/tipped_arrow_head.png b/src/main/resources/assets/real_arrow_tip/textures/entity/projectiles/tipped_arrow_head.png new file mode 100644 index 0000000000000000000000000000000000000000..cbbaecdaadccf164f600759ca1eae9d7740d0e4e GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4rT@h2A3sW#~2tG7>k44ofy`glX=O&z`&C3 z=|1&sft^C5k zz`$AH5n0T@z;_sg8IR|$NMT@LF!FS946*P}PEcbA5H&DxlH_Pu)xa6dI*Un7gPGBz tgjvjB6$6u-sKbF3OdJbB7>$h?CeP>o!gD<69RmXcgQu&X%Q~loCIF=rHP-+D literal 0 HcmV?d00001 diff --git a/src/main/resources/real-arrow-tip.mixins.json b/src/main/resources/real-arrow-tip.mixins.json index 7b0fdb9..39255de 100644 --- a/src/main/resources/real-arrow-tip.mixins.json +++ b/src/main/resources/real-arrow-tip.mixins.json @@ -6,6 +6,7 @@ "mixins": [ ], "client": [ + "ArrowEntityRendererMixin", "ProjectileEntityRendererMixin" ], "injectors": {