From 54bb32ac311cefd20ec66bda76527a3ade2ba39f Mon Sep 17 00:00:00 2001 From: tobinio Date: Mon, 19 Aug 2024 20:55:13 +0200 Subject: [PATCH] fix #3 --- .../tobinio/realarrowtip/ColorProvider.java | 57 +++++++++++++++++++ .../realarrowtip/ModelPredicateProvider.java | 15 ++++- .../tobinio/realarrowtip/RealArrowTip.java | 1 + .../realarrowtip/mixin/ItemColorsMixin.java | 54 ------------------ src/main/resources/real-arrow-tip.mixins.json | 1 - 5 files changed, 71 insertions(+), 57 deletions(-) create mode 100644 src/main/java/tobinio/realarrowtip/ColorProvider.java delete mode 100644 src/main/java/tobinio/realarrowtip/mixin/ItemColorsMixin.java diff --git a/src/main/java/tobinio/realarrowtip/ColorProvider.java b/src/main/java/tobinio/realarrowtip/ColorProvider.java new file mode 100644 index 0000000..b86bcac --- /dev/null +++ b/src/main/java/tobinio/realarrowtip/ColorProvider.java @@ -0,0 +1,57 @@ +package tobinio.realarrowtip; + + +import net.fabricmc.fabric.api.client.rendering.v1.ColorProviderRegistry; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.ChargedProjectilesComponent; +import net.minecraft.component.type.PotionContentsComponent; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.mob.AbstractSkeletonEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.util.math.ColorHelper; + +import java.util.Optional; + +/** + * Created: 19.08.24 + * + * @author Tobias Frischmann + */ +public class ColorProvider { + public static void initialize() { + ColorProviderRegistry.ITEM.register((stack, tintIndex) -> { + if (tintIndex != 1) return -1; + + if (stack.getHolder() instanceof LivingEntity livingEntity) { + + ItemStack projectile = livingEntity.getProjectileType(stack); + + if (livingEntity instanceof AbstractSkeletonEntity skeleton) { + projectile = skeleton.createArrowProjectile(projectile, 0, stack).getItemStack(); + } + + return getColorFromStack(projectile); + } + + return -1; + }, Items.BOW); + + ColorProviderRegistry.ITEM.register((stack, tintIndex) -> { + System.out.println(tintIndex); + if (tintIndex != 1) return -1; + + ChargedProjectilesComponent chargedProjectiles = stack.getOrDefault(DataComponentTypes.CHARGED_PROJECTILES, ChargedProjectilesComponent.DEFAULT); + Optional tippedArrow = chargedProjectiles.getProjectiles() + .stream() + .filter(itemStack -> itemStack.isOf(Items.TIPPED_ARROW)) + .findFirst(); + + return tippedArrow.map(ColorProvider::getColorFromStack).orElse(-1); + }, Items.CROSSBOW); + } + + private static int getColorFromStack(ItemStack stack) { + return ColorHelper.Argb.fullAlpha((stack.getOrDefault(DataComponentTypes.POTION_CONTENTS, PotionContentsComponent.DEFAULT)).getColor()); + } +} diff --git a/src/main/java/tobinio/realarrowtip/ModelPredicateProvider.java b/src/main/java/tobinio/realarrowtip/ModelPredicateProvider.java index 736a3b8..e2cf41a 100644 --- a/src/main/java/tobinio/realarrowtip/ModelPredicateProvider.java +++ b/src/main/java/tobinio/realarrowtip/ModelPredicateProvider.java @@ -2,6 +2,7 @@ package tobinio.realarrowtip; import net.minecraft.client.item.ModelPredicateProviderRegistry; import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.ChargedProjectilesComponent; import net.minecraft.entity.mob.AbstractSkeletonEntity; import net.minecraft.item.CrossbowItem; import net.minecraft.item.ItemStack; @@ -50,13 +51,23 @@ public class ModelPredicateProvider { ModelPredicateProviderRegistry.register(Items.CROSSBOW, Identifier.ofVanilla("spectral"), (stack, world, entity, seed) -> { if (!CrossbowItem.isCharged(stack) || entity == null) return 0; - return entity.getProjectileType(stack).isOf(Items.SPECTRAL_ARROW) ? 1 : 0; + ChargedProjectilesComponent chargedProjectiles = stack.getOrDefault(DataComponentTypes.CHARGED_PROJECTILES, ChargedProjectilesComponent.DEFAULT); + var isSpectral = chargedProjectiles.getProjectiles() + .stream() + .anyMatch(itemStack -> itemStack.isOf(Items.SPECTRAL_ARROW)); + + return isSpectral ? 1 : 0; }); ModelPredicateProviderRegistry.register(Items.CROSSBOW, Identifier.ofVanilla("tipped"), (stack, world, entity, seed) -> { if (!CrossbowItem.isCharged(stack) || entity == null) return 0; - if (entity.getProjectileType(stack).isOf(Items.TIPPED_ARROW)) { + ChargedProjectilesComponent chargedProjectiles = stack.getOrDefault(DataComponentTypes.CHARGED_PROJECTILES, ChargedProjectilesComponent.DEFAULT); + var isTipped = chargedProjectiles.getProjectiles() + .stream() + .anyMatch(itemStack -> itemStack.isOf(Items.TIPPED_ARROW)); + + if (isTipped) { stack.setHolder(entity); return 1; } diff --git a/src/main/java/tobinio/realarrowtip/RealArrowTip.java b/src/main/java/tobinio/realarrowtip/RealArrowTip.java index a841bf4..413ceac 100644 --- a/src/main/java/tobinio/realarrowtip/RealArrowTip.java +++ b/src/main/java/tobinio/realarrowtip/RealArrowTip.java @@ -13,6 +13,7 @@ public class RealArrowTip implements ModInitializer { @Override public void onInitialize() { ModelPredicateProvider.initialize(); + ColorProvider.initialize(); } public static Identifier id(String path) { diff --git a/src/main/java/tobinio/realarrowtip/mixin/ItemColorsMixin.java b/src/main/java/tobinio/realarrowtip/mixin/ItemColorsMixin.java deleted file mode 100644 index 2826d5b..0000000 --- a/src/main/java/tobinio/realarrowtip/mixin/ItemColorsMixin.java +++ /dev/null @@ -1,54 +0,0 @@ -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.AbstractSkeletonEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -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; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import java.util.Optional; - -/** - * Created: 03/10/2023 - * - * @author Tobias Frischmann - */ - -@Mixin (ItemColors.class) -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; - - if (stack.getHolder() instanceof LivingEntity livingEntity) { - - ItemStack projectile = livingEntity.getProjectileType(stack); - - if (livingEntity instanceof AbstractSkeletonEntity skeleton) { - projectile = skeleton.createArrowProjectile(projectile, 0, stack).getItemStack(); - } - - PotionContentsComponent potion = projectile.get(DataComponentTypes.POTION_CONTENTS); - - if (potion != null) { - return ColorHelper.Argb.fullAlpha(potion.getColor()); - } - } - - return -1; - }, Items.CROSSBOW, Items.BOW); - } -} diff --git a/src/main/resources/real-arrow-tip.mixins.json b/src/main/resources/real-arrow-tip.mixins.json index 0f4acbf..95983a7 100644 --- a/src/main/resources/real-arrow-tip.mixins.json +++ b/src/main/resources/real-arrow-tip.mixins.json @@ -5,7 +5,6 @@ "compatibilityLevel": "JAVA_21", "client": [ "ArrowEntityRendererMixin", - "ItemColorsMixin", "ProjectileEntityRendererMixin" ], "injectors": { -- 2.51.2