diff --git a/build.gradle b/build.gradle index 75b6abc..8015aea 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'fabric-loom' version '1.2-SNAPSHOT' + id 'fabric-loom' version '1.6-SNAPSHOT' id 'maven-publish' } @@ -14,6 +14,10 @@ repositories { // for more information about repositories. } +loom { + accessWidenerPath = file("src/main/resources/real-arrow-tip.accesswidener") +} + dependencies { // To change the versions see the gradle.properties file minecraft "com.mojang:minecraft:${project.minecraft_version}" @@ -39,7 +43,7 @@ processResources { } } -def targetJavaVersion = 17 +def targetJavaVersion = 21 tasks.withType(JavaCompile).configureEach { // ensure that the encoding is set to UTF-8, no matter what the system default is // this fixes some edge cases with special characters not displaying correctly diff --git a/gradle.properties b/gradle.properties index 22b0b67..fffdb86 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,15 +3,15 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://modmuss50.me/fabric.html - minecraft_version=1.20.4 - yarn_mappings=1.20.4+build.1 - loader_version=0.15.0 + minecraft_version=1.20.5 + yarn_mappings=1.20.5+build.1 + loader_version=0.15.10 # Mod Properties - mod_version = 0.1.0+mc1.20 + mod_version = 0.1.0+mc1.20.5 maven_group = tobinio archives_base_name = real-arrow-tip # Dependencies # check this on https://modmuss50.me/fabric.html - fabric_version=0.91.1+1.20.4 + fabric_version=0.97.6+1.20.5 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 37aef8d..20db9ad 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 diff --git a/src/main/java/tobinio/realarrowtip/ModelPredicateProvider.java b/src/main/java/tobinio/realarrowtip/ModelPredicateProvider.java index 481afbd..d5f3bd6 100644 --- a/src/main/java/tobinio/realarrowtip/ModelPredicateProvider.java +++ b/src/main/java/tobinio/realarrowtip/ModelPredicateProvider.java @@ -1,8 +1,12 @@ package tobinio.realarrowtip; import net.minecraft.client.item.ModelPredicateProviderRegistry; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.entity.mob.AbstractSkeletonEntity; import net.minecraft.entity.mob.StrayEntity; +import net.minecraft.item.BowItem; import net.minecraft.item.CrossbowItem; +import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.util.Identifier; @@ -20,32 +24,46 @@ public class ModelPredicateProvider { private static void initializeBow() { ModelPredicateProviderRegistry.register(Items.BOW, new Identifier("spectral"), (stack, world, entity, seed) -> { - if (entity == null) return 0; + if (entity == null || !entity.isUsingItem() || entity.getActiveItem() != stack) return 0; return entity.getProjectileType(stack).isOf(Items.SPECTRAL_ARROW) ? 1 : 0; }); ModelPredicateProviderRegistry.register(Items.BOW, new Identifier("tipped"), (stack, world, entity, seed) -> { - if (entity == null) return 0; + if (entity == null || !entity.isUsingItem() || entity.getActiveItem() != stack) return 0; - if (entity instanceof StrayEntity) + + ItemStack projectile = entity.getProjectileType(stack); + + if (entity instanceof AbstractSkeletonEntity skeleton) { + projectile = skeleton.createArrowProjectile(projectile, 0).getItemStack(); + } + + if (projectile.isOf(Items.TIPPED_ARROW) || projectile.get(DataComponentTypes.POTION_CONTENTS) != null) { + stack.setHolder(entity); return 1; + } - return entity.getProjectileType(stack).isOf(Items.TIPPED_ARROW) ? 1 : 0; + return 0; }); } private static void initializeCrossbow() { ModelPredicateProviderRegistry.register(Items.CROSSBOW, new Identifier("spectral"), (stack, world, entity, seed) -> { - if (!CrossbowItem.isCharged(stack)) return 0; + if (!CrossbowItem.isCharged(stack) || entity == null) return 0; - return CrossbowItem.hasProjectile(stack, Items.SPECTRAL_ARROW) ? 1 : 0; + return entity.getProjectileType(stack).isOf(Items.SPECTRAL_ARROW) ? 1 : 0; }); ModelPredicateProviderRegistry.register(Items.CROSSBOW, new Identifier("tipped"), (stack, world, entity, seed) -> { - if (!CrossbowItem.isCharged(stack)) return 0; + if (!CrossbowItem.isCharged(stack) || entity == null) return 0; + + if (entity.getProjectileType(stack).isOf(Items.TIPPED_ARROW)) { + stack.setHolder(entity); + return 1; + } - return CrossbowItem.hasProjectile(stack, Items.TIPPED_ARROW) ? 1 : 0; + return 0; }); } } 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..4f8d586 --- /dev/null +++ b/src/main/java/tobinio/realarrowtip/mixin/ArrowEntityRendererMixin.java @@ -0,0 +1,39 @@ +package tobinio.realarrowtip.mixin; + +import com.llamalad7.mixinextras.sugar.Local; +import net.minecraft.client.color.block.BlockColors; +import net.minecraft.client.color.item.ItemColors; +import net.minecraft.client.render.entity.ArrowEntityRenderer; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.PotionContentsComponent; +import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.mob.AbstractSkeletonEntity; +import net.minecraft.entity.projectile.ArrowEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.ColorHelper; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +/** + * Created: 03/10/2023 + * + * @author Tobias Frischmann + */ + +@Mixin (ArrowEntityRenderer.class) +public abstract class ArrowEntityRendererMixin { + /** + * @author to_binio + * @reason vanilla code does not work and is not used anywhere this fixes it + */ + @Overwrite + public Identifier getTexture(ArrowEntity arrowEntity) { + return arrowEntity.getColor() != -1 ? ArrowEntityRenderer.TIPPED_TEXTURE : ArrowEntityRenderer.TEXTURE; + } +} diff --git a/src/main/java/tobinio/realarrowtip/mixin/BowItemMixin.java b/src/main/java/tobinio/realarrowtip/mixin/BowItemMixin.java deleted file mode 100644 index 77909b9..0000000 --- a/src/main/java/tobinio/realarrowtip/mixin/BowItemMixin.java +++ /dev/null @@ -1,22 +0,0 @@ -package tobinio.realarrowtip.mixin; - -import net.minecraft.entity.LivingEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -/** - * Created: 05/10/2023 - * - * @author Tobias Frischmann - */ -@Mixin (net.minecraft.item.BowItem.class) -public abstract class BowItemMixin extends ItemMixin { - - @Override - protected void useOnEntity(World world, LivingEntity user, ItemStack stack, int remainingUseTicks, - CallbackInfo ci) { - stack.setHolder(user); - } -} diff --git a/src/main/java/tobinio/realarrowtip/mixin/CrossbowItemInvoker.java b/src/main/java/tobinio/realarrowtip/mixin/CrossbowItemInvoker.java deleted file mode 100644 index ad93e3b..0000000 --- a/src/main/java/tobinio/realarrowtip/mixin/CrossbowItemInvoker.java +++ /dev/null @@ -1,22 +0,0 @@ -package tobinio.realarrowtip.mixin; - -import net.minecraft.item.CrossbowItem; -import net.minecraft.item.ItemStack; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -import java.util.List; - -/** - * Created: 04/10/2023 - * - * @author Tobias Frischmann - */ - -@Mixin (CrossbowItem.class) -public interface CrossbowItemInvoker { - @Invoker ("getProjectiles") - static List invokerGetProjectiles(ItemStack crossbow) { - throw new AssertionError(); - } -} diff --git a/src/main/java/tobinio/realarrowtip/mixin/ItemColorsMixin.java b/src/main/java/tobinio/realarrowtip/mixin/ItemColorsMixin.java index 1adcac7..2932bf6 100644 --- a/src/main/java/tobinio/realarrowtip/mixin/ItemColorsMixin.java +++ b/src/main/java/tobinio/realarrowtip/mixin/ItemColorsMixin.java @@ -3,13 +3,14 @@ package tobinio.realarrowtip.mixin; import com.llamalad7.mixinextras.sugar.Local; import net.minecraft.client.color.block.BlockColors; import net.minecraft.client.color.item.ItemColors; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.PotionContentsComponent; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.mob.StrayEntity; +import net.minecraft.entity.mob.AbstractSkeletonEntity; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; -import net.minecraft.potion.PotionUtil; -import net.minecraft.potion.Potions; +import net.minecraft.util.math.ColorHelper; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -28,36 +29,26 @@ public abstract class ItemColorsMixin { @Inject (method = "create", at = @At (value = "RETURN")) private static void create(BlockColors blockColors, CallbackInfoReturnable cir, @Local ItemColors itemColors) { + itemColors.register((stack, tintIndex) -> { if (tintIndex != 1) return -1; - Entity holder = stack.getHolder(); + if (stack.getHolder() instanceof LivingEntity livingEntity) { - if (holder instanceof LivingEntity livingEntity) { + ItemStack projectile = livingEntity.getProjectileType(stack); - if (holder instanceof StrayEntity) { - return PotionUtil.getColor(Potions.SLOWNESS); + if (livingEntity instanceof AbstractSkeletonEntity skeleton) { + projectile = skeleton.createArrowProjectile(projectile, 0).getItemStack(); } - ItemStack projectileType = livingEntity.getProjectileType(stack); + PotionContentsComponent potion = projectile.get(DataComponentTypes.POTION_CONTENTS); - if (projectileType.isOf(Items.TIPPED_ARROW)) { - return PotionUtil.getColor(projectileType); + if (potion != null) { + return ColorHelper.Argb.fullAlpha(potion.getColor()); } } return -1; - }, Items.BOW); - - itemColors.register((stack, tintIndex) -> { - if (tintIndex != 1) return -1; - - Optional tippedArrow = CrossbowItemInvoker.invokerGetProjectiles(stack) - .stream() - .filter(itemStack -> itemStack.isOf(Items.TIPPED_ARROW)) - .findFirst(); - - return tippedArrow.map(PotionUtil::getColor).orElse(-1); - }, Items.CROSSBOW); + }, Items.CROSSBOW, Items.BOW); } } diff --git a/src/main/java/tobinio/realarrowtip/mixin/ItemMixin.java b/src/main/java/tobinio/realarrowtip/mixin/ItemMixin.java deleted file mode 100644 index 63e6e08..0000000 --- a/src/main/java/tobinio/realarrowtip/mixin/ItemMixin.java +++ /dev/null @@ -1,25 +0,0 @@ -package tobinio.realarrowtip.mixin; - -import net.minecraft.entity.LivingEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -/** - * Created: 05/10/2023 - * - * @author Tobias Frischmann - */ - -@Mixin (Item.class) -public class ItemMixin { - - @Inject (method = "usageTick", at = @At (value = "HEAD")) - protected void useOnEntity(World world, LivingEntity user, ItemStack stack, int remainingUseTicks, - CallbackInfo ci) { - } -} diff --git a/src/main/java/tobinio/realarrowtip/mixin/ProjectileEntityRendererMixin.java b/src/main/java/tobinio/realarrowtip/mixin/ProjectileEntityRendererMixin.java index 948b444..354d641 100644 --- a/src/main/java/tobinio/realarrowtip/mixin/ProjectileEntityRendererMixin.java +++ b/src/main/java/tobinio/realarrowtip/mixin/ProjectileEntityRendererMixin.java @@ -5,6 +5,7 @@ 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.ArrowEntityRenderer; import net.minecraft.client.render.entity.ProjectileEntityRenderer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.projectile.ArrowEntity; @@ -15,6 +16,7 @@ import net.minecraft.util.math.RotationAxis; import org.joml.Matrix3f; import org.joml.Matrix4f; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -25,35 +27,40 @@ import tobinio.realarrowtip.RealArrowTip; 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) { + VertexConsumerProvider vertexConsumerProvider, int i, CallbackInfo ci) { if (persistentProjectileEntity instanceof ArrowEntity arrowEntity) { - int color = arrowEntity.getColor(); + int color = ColorHelper.Argb.fullAlpha(arrowEntity.getColor()); - if (color < 0) + if (color == -1) return; - VertexConsumer headVertexConsumer = vertexConsumerProvider.getBuffer(RenderLayer.getEntityCutout(new Identifier(RealArrowTip.modID, "textures/entity/projectiles/tipped_arrow_head.png"))); - int red = ColorHelper.Argb.getRed(color); int blue = ColorHelper.Argb.getBlue(color); int green = ColorHelper.Argb.getGreen(color); + VertexConsumer headVertexConsumer = vertexConsumerProvider.getBuffer(RenderLayer.getEntityCutout(new Identifier(RealArrowTip.modID, "textures/entity/projectiles/tipped_arrow_head.png"))); + 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); + vertexTint(matrixStack, headVertexConsumer, -8, -2, 0, 0.0F, 0.0F, 0, 1, 0, i, red, green, blue); + vertexTint(matrixStack, headVertexConsumer, 8, -2, 0, 0.5F, 0.0F, 0, 1, 0, i, red, green, blue); + vertexTint(matrixStack, headVertexConsumer, 8, 2, 0, 0.5F, 0.15625F, 0, 1, 0, i, red, green, blue); + vertexTint(matrixStack, headVertexConsumer, -8, 2, 0, 0.0F, 0.15625F, 0, 1, 0, i, red, green, blue); } } } @Unique - private void vertexTint(Matrix4f positionMatrix, Matrix3f normalMatrix, VertexConsumer vertexConsumer, int x, int y, + private void vertexTint(MatrixStack matrixStack, VertexConsumer vertexConsumer, int x, int y, 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(); + vertexConsumer.vertex(matrixStack.peek(), (float) x, (float) y, (float) z) + .color(red, green, blue, 255) + .texture(u, v) + .overlay(OverlayTexture.DEFAULT_UV) + .light(light) + .normal(matrixStack.peek(), (float) normalX, (float) normalY, (float) normalZ) + .next(); } } diff --git a/src/main/resources/assets/real_arrow_tip/models/item/crossbow_spectral.json b/src/main/resources/assets/real_arrow_tip/models/item/crossbow_spectral.json index fdb225b..bb061cb 100644 --- a/src/main/resources/assets/real_arrow_tip/models/item/crossbow_spectral.json +++ b/src/main/resources/assets/real_arrow_tip/models/item/crossbow_spectral.json @@ -1,6 +1,6 @@ { - "parent": "item/crossbow", - "textures": { - "layer0": "real_arrow_tip:item/crossbow_spectral" - } + "parent": "item/crossbow", + "textures": { + "layer0": "real_arrow_tip:item/crossbow_spectral" + } } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index a6ce0cf..ae1faea 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -27,9 +27,10 @@ "mixins": [ "real-arrow-tip.mixins.json" ], + "accessWidener": "real-arrow-tip.accesswidener", "depends": { "fabricloader": ">=${loader_version}", "fabric": "*", - "minecraft": "^1.20" + "minecraft": ">=1.20.5" } } diff --git a/src/main/resources/real-arrow-tip.accesswidener b/src/main/resources/real-arrow-tip.accesswidener new file mode 100644 index 0000000..a605cdf --- /dev/null +++ b/src/main/resources/real-arrow-tip.accesswidener @@ -0,0 +1,2 @@ +accessWidener v2 named +accessible method net/minecraft/entity/mob/AbstractSkeletonEntity createArrowProjectile (Lnet/minecraft/item/ItemStack;F)Lnet/minecraft/entity/projectile/PersistentProjectileEntity; diff --git a/src/main/resources/real-arrow-tip.mixins.json b/src/main/resources/real-arrow-tip.mixins.json index 264cbfe..0f4acbf 100644 --- a/src/main/resources/real-arrow-tip.mixins.json +++ b/src/main/resources/real-arrow-tip.mixins.json @@ -2,13 +2,9 @@ "required": true, "minVersion": "0.8", "package": "tobinio.realarrowtip.mixin", - "compatibilityLevel": "JAVA_17", - "mixins": [ - "BowItemMixin", - "CrossbowItemInvoker", - "ItemMixin" - ], + "compatibilityLevel": "JAVA_21", "client": [ + "ArrowEntityRendererMixin", "ItemColorsMixin", "ProjectileEntityRendererMixin" ],