diff --git a/build.gradle b/build.gradle index f8b8dd3..c5870f6 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'fabric-loom' version '1.8-SNAPSHOT' + id 'fabric-loom' version '1.9-SNAPSHOT' id 'maven-publish' } diff --git a/gradle.properties b/gradle.properties index eff8daf..e37fd5d 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.21.2 - yarn_mappings=1.21.2+build.1 - loader_version=0.16.7 + minecraft_version=1.21.4 + yarn_mappings=1.21.4+build.1 + loader_version=0.16.9 # Mod Properties - mod_version = 0.1.1+mc1.21.2 + mod_version = 0.1.1+mc1.21.4 maven_group = tobinio archives_base_name = real-arrow-tip # Dependencies # check this on https://modmuss50.me/fabric.html - fabric_version=0.106.1+1.21.2 + fabric_version=0.111.0+1.21.4 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 9355b41..94113f2 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.10-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/src/main/java/tobinio/realarrowtip/ColorProvider.java b/src/main/java/tobinio/realarrowtip/ColorProvider.java deleted file mode 100644 index 5c8e841..0000000 --- a/src/main/java/tobinio/realarrowtip/ColorProvider.java +++ /dev/null @@ -1,56 +0,0 @@ -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) -> { - 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.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 deleted file mode 100644 index 68ba647..0000000 --- a/src/main/java/tobinio/realarrowtip/ModelPredicateProvider.java +++ /dev/null @@ -1,78 +0,0 @@ -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; -import net.minecraft.item.Items; -import net.minecraft.util.Identifier; - -/** - * Created: 05/10/2023 - * - * @author Tobias Frischmann - */ -public class ModelPredicateProvider { - - public static void initialize() { - initializeBow(); - initializeCrossbow(); - } - - private static void initializeBow() { - ModelPredicateProviderRegistry.register(Items.BOW, Identifier.ofVanilla("spectral"), (stack, world, entity, seed) -> { - if (entity == null || !entity.isUsingItem() || entity.getActiveItem() != stack) return 0; - - return entity.getProjectileType(stack).isOf(Items.SPECTRAL_ARROW) ? 1 : 0; - }); - - ModelPredicateProviderRegistry.register(Items.BOW, Identifier.ofVanilla("tipped"), (stack, world, entity, seed) -> { - if (entity == null || !entity.isUsingItem() || entity.getActiveItem() != stack) return 0; - - - ItemStack projectile = entity.getProjectileType(stack); - - if (entity instanceof AbstractSkeletonEntity skeleton) { - projectile = skeleton.createArrowProjectile(projectile, 0, stack).getItemStack(); - } - - if (projectile.isOf(Items.TIPPED_ARROW) || projectile.get(DataComponentTypes.POTION_CONTENTS) != null) { - stack.setHolder(entity); - return 1; - } - - return 0; - }); - } - - private static void initializeCrossbow() { - ModelPredicateProviderRegistry.register(Items.CROSSBOW, Identifier.ofVanilla("spectral"), (stack, world, entity, seed) -> { - if (!CrossbowItem.isCharged(stack)) return 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)) return 0; - - 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; - } - - return 0; - }); - } -} diff --git a/src/main/java/tobinio/realarrowtip/RealArrowTip.java b/src/main/java/tobinio/realarrowtip/RealArrowTip.java index 24f42a5..868f4ba 100644 --- a/src/main/java/tobinio/realarrowtip/RealArrowTip.java +++ b/src/main/java/tobinio/realarrowtip/RealArrowTip.java @@ -1,10 +1,19 @@ package tobinio.realarrowtip; import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.api.ModInitializer; +import net.minecraft.client.render.item.property.select.SelectProperties; +import net.minecraft.client.render.item.tint.TintSourceTypes; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.PotionContentsComponent; +import net.minecraft.item.ItemStack; import net.minecraft.util.Identifier; +import net.minecraft.util.math.ColorHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import tobinio.realarrowtip.model.charge.BowChargeTypeProperty; +import tobinio.realarrowtip.model.charge.CrossbowChargeTypeProperty; +import tobinio.realarrowtip.model.tint.BowTintSource; +import tobinio.realarrowtip.model.tint.CrossbowTintSource; public class RealArrowTip implements ClientModInitializer { public static String modID = "real_arrow_tip"; @@ -13,12 +22,19 @@ public class RealArrowTip implements ClientModInitializer { @Override public void onInitializeClient() { - ModelPredicateProvider.initialize(); - ColorProvider.initialize(); + SelectProperties.ID_MAPPER.put(id("crossbow_charge_type"), CrossbowChargeTypeProperty.TYPE); + SelectProperties.ID_MAPPER.put(id("bow_charge_type"), BowChargeTypeProperty.TYPE); + + TintSourceTypes.ID_MAPPER.put(id("bow"), BowTintSource.CODEC); + TintSourceTypes.ID_MAPPER.put(id("crossbow"), CrossbowTintSource.CODEC); } public static Identifier id(String path) { return Identifier.of(modID, path); } + public static int getColorFromStack(ItemStack stack) { + return ColorHelper.fullAlpha((stack.getOrDefault(DataComponentTypes.POTION_CONTENTS, + PotionContentsComponent.DEFAULT)).getColor()); + } } diff --git a/src/main/java/tobinio/realarrowtip/mixin/ArrowEntityRendererMixin.java b/src/main/java/tobinio/realarrowtip/mixin/ArrowEntityRendererMixin.java index 16b5558..0aca915 100644 --- a/src/main/java/tobinio/realarrowtip/mixin/ArrowEntityRendererMixin.java +++ b/src/main/java/tobinio/realarrowtip/mixin/ArrowEntityRendererMixin.java @@ -1,26 +1,12 @@ 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.client.render.entity.state.ArrowEntityRenderState; -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.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import tobinio.realarrowtip.HasColor; /** diff --git a/src/main/java/tobinio/realarrowtip/mixin/ProjectileEntityRendererMixin.java b/src/main/java/tobinio/realarrowtip/mixin/ProjectileEntityRendererMixin.java index 950deb0..2c8c987 100644 --- a/src/main/java/tobinio/realarrowtip/mixin/ProjectileEntityRendererMixin.java +++ b/src/main/java/tobinio/realarrowtip/mixin/ProjectileEntityRendererMixin.java @@ -12,24 +12,15 @@ import net.minecraft.client.render.entity.model.ArrowEntityModel; import net.minecraft.client.render.entity.state.ArrowEntityRenderState; import net.minecraft.client.render.entity.state.ProjectileEntityRenderState; 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.Final; 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; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import tobinio.realarrowtip.HasColor; -import tobinio.realarrowtip.RealArrowTip; - -import java.util.Arrays; import static tobinio.realarrowtip.RealArrowTip.id; diff --git a/src/main/java/tobinio/realarrowtip/model/charge/BowChargeTypeProperty.java b/src/main/java/tobinio/realarrowtip/model/charge/BowChargeTypeProperty.java new file mode 100644 index 0000000..c352358 --- /dev/null +++ b/src/main/java/tobinio/realarrowtip/model/charge/BowChargeTypeProperty.java @@ -0,0 +1,65 @@ +package tobinio.realarrowtip.model.charge; + +import com.mojang.serialization.MapCodec; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.render.item.property.select.SelectProperty; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.ChargedProjectilesComponent; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.mob.AbstractSkeletonEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.item.ModelTransformationMode; +import net.minecraft.util.math.ColorHelper; +import org.jetbrains.annotations.Nullable; + +import static tobinio.realarrowtip.RealArrowTip.getColorFromStack; + +/** + * Created: 18.12.24 + * + * @author Tobias Frischmann + */ +@Environment (EnvType.CLIENT) +public record BowChargeTypeProperty() implements SelectProperty { + public static final Type TYPE = Type.create( + MapCodec.unit(new BowChargeTypeProperty()), ChargeType.CODEC + ); + + public ChargeType getValue( + ItemStack itemStack, @Nullable ClientWorld clientWorld, @Nullable LivingEntity livingEntity, int i, + ModelTransformationMode modelTransformationMode + ) { + + if (livingEntity != null) { + ItemStack projectile = livingEntity.getProjectileType(itemStack); + + if (livingEntity instanceof AbstractSkeletonEntity skeleton) { + projectile = skeleton.createArrowProjectile(projectile, 0, itemStack).getItemStack(); + } + + if (projectile.isOf(Items.SPECTRAL_ARROW)) { + return ChargeType.SPECTRAL; + } + + if (projectile.isOf(Items.TIPPED_ARROW) || projectile.get(DataComponentTypes.POTION_CONTENTS) != null) { + return ChargeType.TIPPED; + } + + if (projectile.isOf(Items.FIREWORK_ROCKET)) { + return ChargeType.ROCKET; + } + + return ChargeType.ARROW; + } + + return ChargeType.NONE; + } + + @Override + public Type getType() { + return TYPE; + } +} \ No newline at end of file diff --git a/src/main/java/tobinio/realarrowtip/model/charge/ChargeType.java b/src/main/java/tobinio/realarrowtip/model/charge/ChargeType.java new file mode 100644 index 0000000..769b451 --- /dev/null +++ b/src/main/java/tobinio/realarrowtip/model/charge/ChargeType.java @@ -0,0 +1,29 @@ +package tobinio.realarrowtip.model.charge; + +import com.mojang.serialization.Codec; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.util.StringIdentifiable; + +import java.util.List; + +/** + * Created: 18.12.24 + * + * @author Tobias Frischmann + */ +public enum ChargeType implements StringIdentifiable { + NONE("none"), ARROW("arrow"), SPECTRAL("spectral"), TIPPED("tipped"), ROCKET("rocket"); + + public static final Codec CODEC = StringIdentifiable.createCodec(ChargeType::values); + private final String name; + + ChargeType(final String name) { + this.name = name; + } + + @Override + public String asString() { + return this.name; + } +} diff --git a/src/main/java/tobinio/realarrowtip/model/charge/CrossbowChargeTypeProperty.java b/src/main/java/tobinio/realarrowtip/model/charge/CrossbowChargeTypeProperty.java new file mode 100644 index 0000000..cefcf28 --- /dev/null +++ b/src/main/java/tobinio/realarrowtip/model/charge/CrossbowChargeTypeProperty.java @@ -0,0 +1,55 @@ +package tobinio.realarrowtip.model.charge; + +import com.mojang.serialization.MapCodec; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.render.item.property.select.SelectProperty; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.ChargedProjectilesComponent; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.item.ModelTransformationMode; +import org.jetbrains.annotations.Nullable; + +/** + * Created: 18.12.24 + * + * @author Tobias Frischmann + */ +@Environment (EnvType.CLIENT) +public record CrossbowChargeTypeProperty() implements SelectProperty { + public static final SelectProperty.Type TYPE = SelectProperty.Type.create( + MapCodec.unit(new CrossbowChargeTypeProperty()), ChargeType.CODEC + ); + + public ChargeType getValue( + ItemStack itemStack, @Nullable ClientWorld clientWorld, @Nullable LivingEntity livingEntity, int i, + ModelTransformationMode modelTransformationMode + ) { + ChargedProjectilesComponent chargedProjectilesComponent = itemStack.get(DataComponentTypes.CHARGED_PROJECTILES); + if (chargedProjectilesComponent == null || chargedProjectilesComponent.isEmpty()) { + return ChargeType.NONE; + } else { + if (chargedProjectilesComponent.contains(Items.SPECTRAL_ARROW)) { + return ChargeType.SPECTRAL; + } + + if (chargedProjectilesComponent.contains(Items.TIPPED_ARROW)) { + return ChargeType.TIPPED; + } + + if (chargedProjectilesComponent.contains(Items.FIREWORK_ROCKET)) { + return ChargeType.ROCKET; + } + + return ChargeType.ARROW; + } + } + + @Override + public SelectProperty.Type getType() { + return TYPE; + } +} \ No newline at end of file diff --git a/src/main/java/tobinio/realarrowtip/model/tint/BowTintSource.java b/src/main/java/tobinio/realarrowtip/model/tint/BowTintSource.java new file mode 100644 index 0000000..6a9502d --- /dev/null +++ b/src/main/java/tobinio/realarrowtip/model/tint/BowTintSource.java @@ -0,0 +1,46 @@ +package tobinio.realarrowtip.model.tint; + +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.client.render.item.tint.TintSource; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.mob.AbstractSkeletonEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.dynamic.Codecs; +import net.minecraft.util.math.ColorHelper; +import org.jetbrains.annotations.Nullable; + +import static tobinio.realarrowtip.RealArrowTip.getColorFromStack; + +/** + * Created: 18.12.24 + * + * @author Tobias Frischmann + */ +public record BowTintSource(int defaultColor) implements TintSource { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( + instance -> instance.group(Codecs.RGB.fieldOf("default").forGetter(BowTintSource::defaultColor)) + .apply(instance, BowTintSource::new) + ); + + @Override + public int getTint(ItemStack stack, @Nullable ClientWorld world, @Nullable LivingEntity user) { + if (user != null) { + ItemStack projectile = user.getProjectileType(stack); + + if (user instanceof AbstractSkeletonEntity skeleton) { + projectile = skeleton.createArrowProjectile(projectile, 0, stack).getItemStack(); + } + + return getColorFromStack(projectile); + } + + return ColorHelper.fullAlpha(this.defaultColor); + } + + @Override + public MapCodec getCodec() { + return CODEC; + } +} diff --git a/src/main/java/tobinio/realarrowtip/model/tint/CrossbowTintSource.java b/src/main/java/tobinio/realarrowtip/model/tint/CrossbowTintSource.java new file mode 100644 index 0000000..3240f28 --- /dev/null +++ b/src/main/java/tobinio/realarrowtip/model/tint/CrossbowTintSource.java @@ -0,0 +1,45 @@ +package tobinio.realarrowtip.model.tint; + +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.client.render.item.tint.TintSource; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.ChargedProjectilesComponent; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.util.dynamic.Codecs; +import org.jetbrains.annotations.Nullable; +import tobinio.realarrowtip.RealArrowTip; + +import java.util.Optional; + +/** + * Created: 18.12.24 + * + * @author Tobias Frischmann + */ +public record CrossbowTintSource(int defaultColor) implements TintSource { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( + instance -> instance.group(Codecs.RGB.fieldOf("default").forGetter(CrossbowTintSource::defaultColor)) + .apply(instance, CrossbowTintSource::new) + ); + + @Override + public int getTint(ItemStack stack, @Nullable ClientWorld world, @Nullable LivingEntity user) { + 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(RealArrowTip::getColorFromStack).orElse(this.defaultColor); + } + + @Override + public MapCodec getCodec() { + return CODEC; + } +} diff --git a/src/main/resources/assets/minecraft/items/bow.json b/src/main/resources/assets/minecraft/items/bow.json new file mode 100644 index 0000000..3183b5a --- /dev/null +++ b/src/main/resources/assets/minecraft/items/bow.json @@ -0,0 +1,115 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/bow" + }, + "on_true": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "real_arrow_tip:item/bow_pulling_1_spectral" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "real_arrow_tip:item/bow_pulling_2_spectral" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "real_arrow_tip:item/bow_pulling_0_spectral" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "when": "spectral" + }, + { + "model": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "real_arrow_tip:item/bow_pulling_1_tipped", + "tints": [ + { + "type": "real_arrow_tip:bow", + "default": -13083194 + } + ] + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "real_arrow_tip:item/bow_pulling_2_tipped", + "tints": [ + { + "type": "real_arrow_tip:bow", + "default": -13083194 + } + ] + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "real_arrow_tip:item/bow_pulling_0_tipped", + "tints": [ + { + "type": "real_arrow_tip:bow", + "default": -13083194 + } + ] + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "when": "tipped" + } + ], + "fallback": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/bow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "real_arrow_tip:bow_charge_type" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/minecraft/items/crossbow.json b/src/main/resources/assets/minecraft/items/crossbow.json new file mode 100644 index 0000000..965cfdc --- /dev/null +++ b/src/main/resources/assets/minecraft/items/crossbow.json @@ -0,0 +1,74 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/crossbow_arrow" + }, + "when": "arrow" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/crossbow_firework" + }, + "when": "rocket" + }, + { + "model": { + "type": "minecraft:model", + "model": "real_arrow_tip:item/crossbow_spectral" + }, + "when": "spectral" + }, + { + "model": { + "type": "minecraft:model", + "model": "real_arrow_tip:item/crossbow_tipped", + "tints": [ + { + "type": "real_arrow_tip:crossbow", + "default": -13083194 + } + ] + }, + "when": "tipped" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/crossbow" + }, + "property": "real_arrow_tip:crossbow_charge_type" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/crossbow_pulling_1" + }, + "threshold": 0.58 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/crossbow_pulling_2" + }, + "threshold": 1 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/crossbow_pulling_0" + }, + "property": "minecraft:crossbow/pull" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/minecraft/models/item/bow.json b/src/main/resources/assets/minecraft/models/item/bow.json deleted file mode 100644 index e26af52..0000000 --- a/src/main/resources/assets/minecraft/models/item/bow.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "item/bow" - }, - "display": { - "thirdperson_righthand": { - "rotation": [ - -80, - 260, - -40 - ], - "translation": [ - -1, - -2, - 2.5 - ], - "scale": [ - 0.9, - 0.9, - 0.9 - ] - }, - "thirdperson_lefthand": { - "rotation": [ - -80, - -280, - 40 - ], - "translation": [ - -1, - -2, - 2.5 - ], - "scale": [ - 0.9, - 0.9, - 0.9 - ] - }, - "firstperson_righthand": { - "rotation": [ - 0, - -90, - 25 - ], - "translation": [ - 1.13, - 3.2, - 1.13 - ], - "scale": [ - 0.68, - 0.68, - 0.68 - ] - }, - "firstperson_lefthand": { - "rotation": [ - 0, - 90, - -25 - ], - "translation": [ - 1.13, - 3.2, - 1.13 - ], - "scale": [ - 0.68, - 0.68, - 0.68 - ] - } - }, - "overrides": [ - { - "predicate": { - "pulling": 1 - }, - "model": "item/bow_pulling_0" - }, - { - "predicate": { - "pulling": 1, - "pull": 0.65 - }, - "model": "item/bow_pulling_1" - }, - { - "predicate": { - "pulling": 1, - "pull": 0.9 - }, - "model": "item/bow_pulling_2" - }, - { - "predicate": { - "pulling": 1, - "tipped": 1 - }, - "model": "real_arrow_tip:item/bow_pulling_0_tipped" - }, - { - "predicate": { - "pulling": 1, - "tipped": 1, - "pull": 0.65 - }, - "model": "real_arrow_tip:item/bow_pulling_1_tipped" - }, - { - "predicate": { - "pulling": 1, - "tipped": 1, - "pull": 0.9 - }, - "model": "real_arrow_tip:item/bow_pulling_2_tipped" - }, - { - "predicate": { - "pulling": 1, - "spectral": 1 - }, - "model": "real_arrow_tip:item/bow_pulling_0_spectral" - }, - { - "predicate": { - "pulling": 1, - "spectral": 1, - "pull": 0.65 - }, - "model": "real_arrow_tip:item/bow_pulling_1_spectral" - }, - { - "predicate": { - "pulling": 1, - "spectral": 1, - "pull": 0.9 - }, - "model": "real_arrow_tip:item/bow_pulling_2_spectral" - } - ] -} diff --git a/src/main/resources/assets/minecraft/models/item/crossbow.json b/src/main/resources/assets/minecraft/models/item/crossbow.json deleted file mode 100644 index fbbc9cb..0000000 --- a/src/main/resources/assets/minecraft/models/item/crossbow.json +++ /dev/null @@ -1,125 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "item/crossbow_standby" - }, - "display": { - "thirdperson_righthand": { - "rotation": [ - -90, - 0, - -60 - ], - "translation": [ - 2, - 0.1, - -3 - ], - "scale": [ - 0.9, - 0.9, - 0.9 - ] - }, - "thirdperson_lefthand": { - "rotation": [ - -90, - 0, - 30 - ], - "translation": [ - 2, - 0.1, - -3 - ], - "scale": [ - 0.9, - 0.9, - 0.9 - ] - }, - "firstperson_righthand": { - "rotation": [ - -90, - 0, - -55 - ], - "translation": [ - 1.13, - 3.2, - 1.13 - ], - "scale": [ - 0.68, - 0.68, - 0.68 - ] - }, - "firstperson_lefthand": { - "rotation": [ - -90, - 0, - 35 - ], - "translation": [ - 1.13, - 3.2, - 1.13 - ], - "scale": [ - 0.68, - 0.68, - 0.68 - ] - } - }, - "overrides": [ - { - "predicate": { - "pulling": 1 - }, - "model": "item/crossbow_pulling_0" - }, - { - "predicate": { - "pulling": 1, - "pull": 0.58 - }, - "model": "item/crossbow_pulling_1" - }, - { - "predicate": { - "pulling": 1, - "pull": 1.0 - }, - "model": "item/crossbow_pulling_2" - }, - { - "predicate": { - "charged": 1 - }, - "model": "item/crossbow_arrow" - }, - { - "predicate": { - "charged": 1, - "firework": 1 - }, - "model": "item/crossbow_firework" - }, - { - "predicate": { - "charged": 1, - "tipped": 1 - }, - "model": "real_arrow_tip:item/crossbow_tipped" - }, - { - "predicate": { - "charged": 1, - "spectral": 1 - }, - "model": "real_arrow_tip:item/crossbow_spectral" - } - ] -} diff --git a/src/main/resources/assets/real_arrow_tip/models/item/bow_pulling_0_tipped.json b/src/main/resources/assets/real_arrow_tip/models/item/bow_pulling_0_tipped.json index d18833b..fb34615 100644 --- a/src/main/resources/assets/real_arrow_tip/models/item/bow_pulling_0_tipped.json +++ b/src/main/resources/assets/real_arrow_tip/models/item/bow_pulling_0_tipped.json @@ -1,7 +1,7 @@ { "parent": "item/bow", "textures": { - "layer0": "real_arrow_tip:item/bow_pulling_0_base_tipped", - "layer1": "real_arrow_tip:item/bow_pulling_0_head_tipped" + "layer0": "real_arrow_tip:item/bow_pulling_0_head_tipped", + "layer1": "real_arrow_tip:item/bow_pulling_0_base_tipped" } } diff --git a/src/main/resources/assets/real_arrow_tip/models/item/bow_pulling_1_tipped.json b/src/main/resources/assets/real_arrow_tip/models/item/bow_pulling_1_tipped.json index f85f40a..f921914 100644 --- a/src/main/resources/assets/real_arrow_tip/models/item/bow_pulling_1_tipped.json +++ b/src/main/resources/assets/real_arrow_tip/models/item/bow_pulling_1_tipped.json @@ -1,7 +1,7 @@ { "parent": "item/bow", "textures": { - "layer0": "real_arrow_tip:item/bow_pulling_1_base_tipped", - "layer1": "real_arrow_tip:item/bow_pulling_1_head_tipped" + "layer0": "real_arrow_tip:item/bow_pulling_1_head_tipped", + "layer1": "real_arrow_tip:item/bow_pulling_1_base_tipped" } } diff --git a/src/main/resources/assets/real_arrow_tip/models/item/bow_pulling_2_tipped.json b/src/main/resources/assets/real_arrow_tip/models/item/bow_pulling_2_tipped.json index 30cc31d..82ebe07 100644 --- a/src/main/resources/assets/real_arrow_tip/models/item/bow_pulling_2_tipped.json +++ b/src/main/resources/assets/real_arrow_tip/models/item/bow_pulling_2_tipped.json @@ -1,7 +1,7 @@ { "parent": "item/bow", "textures": { - "layer0": "real_arrow_tip:item/bow_pulling_2_base_tipped", - "layer1": "real_arrow_tip:item/bow_pulling_2_head_tipped" + "layer0": "real_arrow_tip:item/bow_pulling_2_head_tipped", + "layer1": "real_arrow_tip:item/bow_pulling_2_base_tipped" } } diff --git a/src/main/resources/assets/real_arrow_tip/models/item/crossbow_tipped.json b/src/main/resources/assets/real_arrow_tip/models/item/crossbow_tipped.json index 2cca1d7..06a19c8 100644 --- a/src/main/resources/assets/real_arrow_tip/models/item/crossbow_tipped.json +++ b/src/main/resources/assets/real_arrow_tip/models/item/crossbow_tipped.json @@ -1,7 +1,7 @@ { "parent": "item/crossbow", "textures": { - "layer0": "real_arrow_tip:item/crossbow_tipped_base", - "layer1": "real_arrow_tip:item/crossbow_tipped_head" + "layer0": "real_arrow_tip:item/crossbow_tipped_head", + "layer1": "real_arrow_tip:item/crossbow_tipped_base" } }