diff --git a/src/main/java/ru/betterend/blocks/basis/EndChainBlock.java b/src/main/java/ru/betterend/blocks/basis/EndChainBlock.java index 8ad78048..004ef654 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndChainBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndChainBlock.java @@ -19,6 +19,7 @@ import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.patterns.BlockModelProvider; +import ru.betterend.patterns.ModelProvider; import ru.betterend.patterns.Patterns; public class EndChainBlock extends ChainBlock implements BlockModelProvider, IRenderTypeable { @@ -48,7 +49,7 @@ public class EndChainBlock extends ChainBlock implements BlockModelProvider, IRe @Override public BlockModel getModel(ResourceLocation blockId) { - return BlockModelProvider.createItemModel(blockId.getPath()); + return ModelProvider.createItemModel(blockId.getPath()); } @Override diff --git a/src/main/java/ru/betterend/item/ArmoredElytra.java b/src/main/java/ru/betterend/item/ArmoredElytra.java index ba9a5894..cb2e5218 100644 --- a/src/main/java/ru/betterend/item/ArmoredElytra.java +++ b/src/main/java/ru/betterend/item/ArmoredElytra.java @@ -1,59 +1,76 @@ package ru.betterend.item; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.item.v1.EquipmentSlotProvider; import net.fabricmc.fabric.api.object.builder.v1.client.model.FabricModelPredicateProviderRegistry; +import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.item.ElytraItem; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Rarity; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.item.*; import ru.betterend.BetterEnd; import ru.betterend.interfaces.BreakableItem; import ru.betterend.patterns.ModelProvider; import ru.betterend.patterns.Patterns; import ru.betterend.registry.EndItems; -public class ArmoredElytra extends ElytraItem implements EquipmentSlotProvider, BreakableItem, ModelProvider { +import java.util.UUID; + +public class ArmoredElytra extends EndArmorItem implements MultiModelItem { + + private static final UUID ARMOR_MODIFIER_UUID_CHEST = ARMOR_MODIFIER_UUID_PER_SLOT[2]; private final ResourceLocation wingTexture; private final Item repairItem; private final double movementFactor; + private final float toughness; + private final int defense; - public ArmoredElytra(String name, Item repairItem, int durability, double movementFactor, boolean fireproof) { - super(fireproof ? EndItems.makeItemSettings().durability(durability).rarity(Rarity.RARE).fireResistant() : - EndItems.makeItemSettings().durability(durability).rarity(Rarity.RARE)); + public ArmoredElytra(String name, ArmorMaterial material, Item repairItem, int durability, double movementFactor, boolean fireproof) { + super(material, EquipmentSlot.CHEST, fireproof ? + EndItems.makeItemSettings().durability(durability).rarity(Rarity.EPIC).fireResistant() : + EndItems.makeItemSettings().durability(durability).rarity(Rarity.EPIC)); this.wingTexture = BetterEnd.makeID("textures/entity/" + name + ".png"); this.repairItem = repairItem; this.movementFactor = movementFactor; + this.defense = (int) ((double) material.getDefenseForSlot(EquipmentSlot.CHEST) / 1.75); + this.toughness = material.getToughness() / 1.75F; + addAttributeModifier(Attributes.ARMOR, new AttributeModifier(ARMOR_MODIFIER_UUID_CHEST, + "Armor modifier", defense, AttributeModifier.Operation.ADDITION)); + addAttributeModifier(Attributes.ARMOR_TOUGHNESS, new AttributeModifier(ARMOR_MODIFIER_UUID_CHEST, + "Armor toughness", toughness, AttributeModifier.Operation.ADDITION)); } public double getMovementFactor() { return movementFactor; } + @Environment(EnvType.CLIENT) public ResourceLocation getWingTexture() { return wingTexture; } @Override public boolean isValidRepairItem(ItemStack itemStack, ItemStack itemStack2) { - return itemStack2.getItem() == repairItem; + return super.isValidRepairItem(itemStack, itemStack2) || itemStack2.getItem() == repairItem; } @Override - public void registerBrokenItem() { + public int getDefense() { + return defense; + } + + @Override + public float getToughness() { + return toughness; + } + + @Override + @Environment(EnvType.CLIENT) + public void registerModelPredicate() { FabricModelPredicateProviderRegistry.register(this, new ResourceLocation("broken"), (itemStack, clientLevel, livingEntity) -> ElytraItem.isFlyEnabled(itemStack) ? 0.0F : 1.0F); } - - @Override - public String getModelPattern(String name) { - return Patterns.createItemGenerated(name); - } - - @Override - public EquipmentSlot getPreferredEquipmentSlot(ItemStack stack) { - return EquipmentSlot.CHEST; - } } diff --git a/src/main/java/ru/betterend/item/EndArmorItem.java b/src/main/java/ru/betterend/item/EndArmorItem.java index 574caab8..d76a71a7 100644 --- a/src/main/java/ru/betterend/item/EndArmorItem.java +++ b/src/main/java/ru/betterend/item/EndArmorItem.java @@ -2,9 +2,12 @@ package ru.betterend.item; import java.util.UUID; +import com.google.common.collect.HashMultimap; import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.Multimap; +import net.minecraft.client.renderer.block.model.BlockModel; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.ai.attributes.Attribute; import net.minecraft.world.entity.ai.attributes.AttributeModifier; @@ -17,36 +20,41 @@ import ru.betterend.patterns.ModelProvider; import ru.betterend.patterns.Patterns; public class EndArmorItem extends ArmorItem implements ModelProvider { - public EndArmorItem(ArmorMaterial material, EquipmentSlot slot, Item.Properties settings) { - super(material, slot, settings); - addKnockbackResistance((ArmorItemAccessor) this, slot, this.knockbackResistance); - } + protected static final UUID[] ARMOR_MODIFIER_UUID_PER_SLOT = new UUID[] { + UUID.fromString("845DB27C-C624-495F-8C9F-6020A9A58B6B"), + UUID.fromString("D8499B04-0E66-4726-AB29-64469D734E0D"), + UUID.fromString("9F3D476D-C118-4544-8365-64846904B48E"), + UUID.fromString("2AD3F246-FEE1-4E67-B886-69FD380BB150") + }; - /** Ensures knockback resistance is actually applied */ - private static void addKnockbackResistance(ArmorItemAccessor accessor, EquipmentSlot slot, double knockbackResistance) { - if (knockbackResistance == 0) { - return; + protected final Multimap defaultModifiers; + + public EndArmorItem(ArmorMaterial material, EquipmentSlot equipmentSlot, Properties settings) { + super(material, equipmentSlot, settings); + this.defaultModifiers = HashMultimap.create(); + UUID uuid = ARMOR_MODIFIER_UUID_PER_SLOT[equipmentSlot.getIndex()]; + addAttributeModifier(Attributes.ARMOR, new AttributeModifier(uuid, "Armor modifier", getDefense(), AttributeModifier.Operation.ADDITION)); + addAttributeModifier(Attributes.ARMOR_TOUGHNESS, new AttributeModifier(uuid, "Armor toughness", getToughness(), AttributeModifier.Operation.ADDITION)); + if (knockbackResistance > 0.0F) { + addAttributeModifier(Attributes.KNOCKBACK_RESISTANCE, new AttributeModifier(uuid, "Armor knockback resistance", knockbackResistance, AttributeModifier.Operation.ADDITION)); } - - Multimap attributeModifiers = accessor.be_getDefaultModifiers(); - - // In case Mojang or anyone else decided to fix this - if (attributeModifiers.keys().contains(Attributes.KNOCKBACK_RESISTANCE)) { - return; - } - - UUID uuid = accessor.be_getModifiers()[slot.getIndex()]; - - // Rebuild attributeModifiers to include knockback resistance - ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); - builder.putAll(attributeModifiers); - builder.put(Attributes.KNOCKBACK_RESISTANCE, new AttributeModifier(uuid, "Armor knockback resistance", knockbackResistance, AttributeModifier.Operation.ADDITION)); - accessor.be_setDefaultModifiers(builder.build()); } @Override - public String getModelPattern(String name) { - return Patterns.createJson(Patterns.ITEM_GENERATED, name); + public Multimap getDefaultAttributeModifiers(EquipmentSlot equipmentSlot) { + return equipmentSlot == slot ? defaultModifiers : super.getDefaultAttributeModifiers(equipmentSlot); + } + + protected void addAttributeModifier(Attribute attribute, AttributeModifier modifier) { + if (defaultModifiers.containsKey(attribute)) { + defaultModifiers.removeAll(attribute); + } + defaultModifiers.put(attribute, modifier); + } + + @Override + public String getModelString(String name) { + return Patterns.createItemGenerated(name); } } diff --git a/src/main/java/ru/betterend/item/ModelProviderDiscItem.java b/src/main/java/ru/betterend/item/ModelProviderDiscItem.java index 6ad46ea9..f630683e 100644 --- a/src/main/java/ru/betterend/item/ModelProviderDiscItem.java +++ b/src/main/java/ru/betterend/item/ModelProviderDiscItem.java @@ -15,9 +15,4 @@ public class ModelProviderDiscItem extends RecordItem implements ModelProvider { public String getModelString(String name) { return Patterns.createJson(Patterns.ITEM_GENERATED, name); } - - @Override - public BlockModel getModel() { - return null; - } } diff --git a/src/main/java/ru/betterend/item/ModelProviderItem.java b/src/main/java/ru/betterend/item/ModelProviderItem.java index abf58612..acb9c14f 100644 --- a/src/main/java/ru/betterend/item/ModelProviderItem.java +++ b/src/main/java/ru/betterend/item/ModelProviderItem.java @@ -1,6 +1,7 @@ package ru.betterend.item; import net.minecraft.client.renderer.block.model.BlockModel; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import ru.betterend.patterns.ModelProvider; import ru.betterend.patterns.Patterns; @@ -16,7 +17,7 @@ public class ModelProviderItem extends Item implements ModelProvider { } @Override - public BlockModel getModel() { - return null; + public BlockModel getModel(ResourceLocation resourceLocation) { + return ModelProvider.createItemModel(resourceLocation.getPath()); } } diff --git a/src/main/java/ru/betterend/patterns/BlockModelProvider.java b/src/main/java/ru/betterend/patterns/BlockModelProvider.java index c8c37a8d..4847855a 100644 --- a/src/main/java/ru/betterend/patterns/BlockModelProvider.java +++ b/src/main/java/ru/betterend/patterns/BlockModelProvider.java @@ -18,11 +18,6 @@ public interface BlockModelProvider extends ModelProvider { BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState); MultiVariant getModelVariant(ResourceLocation resourceLocation, BlockState blockState); - static BlockModel createItemModel(String name) { - String pattern = Patterns.createItemGenerated("item/" + name); - return BlockModel.fromString(pattern); - } - static BlockModel createBlockModel(ResourceLocation blockId, String pattern) { BlockModel model = BlockModel.fromString(pattern); ResourceLocation modelLoc = new ResourceLocation(blockId.getNamespace(), "blocks/" + blockId.getPath()); diff --git a/src/main/java/ru/betterend/patterns/ModelProvider.java b/src/main/java/ru/betterend/patterns/ModelProvider.java index c49b1ed0..7918818d 100644 --- a/src/main/java/ru/betterend/patterns/ModelProvider.java +++ b/src/main/java/ru/betterend/patterns/ModelProvider.java @@ -5,5 +5,13 @@ import net.minecraft.resources.ResourceLocation; public interface ModelProvider { String getModelString(String name); - BlockModel getModel(ResourceLocation resourceLocation); + + default BlockModel getModel(ResourceLocation resourceLocation) { + return createItemModel(resourceLocation.getPath()); + } + + static BlockModel createItemModel(String name) { + String pattern = Patterns.createItemGenerated("item/" + name); + return BlockModel.fromString(pattern); + } } \ No newline at end of file