package net.minecraft.world.item.equipment; import java.util.Map; import net.minecraft.core.Holder; import net.minecraft.core.HolderSet; import net.minecraft.core.component.DataComponents; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; import net.minecraft.tags.TagKey; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.EquipmentSlotGroup; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.item.Item; import net.minecraft.world.item.component.ItemAttributeModifiers; import net.minecraft.world.item.component.ItemAttributeModifiers.Builder; public record ArmorMaterial( int durability, Map defense, int enchantmentValue, Holder equipSound, float toughness, float knockbackResistance, TagKey repairIngredient, ResourceLocation modelId ) { public Item.Properties humanoidProperties(Item.Properties properties, ArmorType armorType) { return properties.durability(armorType.getDurability(this.durability)) .attributes(this.createAttributes(armorType)) .enchantable(this.enchantmentValue) .component(DataComponents.EQUIPPABLE, Equippable.builder(armorType.getSlot()).setEquipSound(this.equipSound).setModel(this.modelId).build()) .repairable(this.repairIngredient); } public Item.Properties animalProperties(Item.Properties properties, HolderSet> holderSet) { return properties.durability(ArmorType.BODY.getDurability(this.durability)) .attributes(this.createAttributes(ArmorType.BODY)) .repairable(this.repairIngredient) .component( DataComponents.EQUIPPABLE, Equippable.builder(EquipmentSlot.BODY).setEquipSound(this.equipSound).setModel(this.modelId).setAllowedEntities(holderSet).build() ); } public Item.Properties animalProperties(Item.Properties properties, Holder holder, boolean bl, HolderSet> holderSet) { if (bl) { properties = properties.durability(ArmorType.BODY.getDurability(this.durability)).repairable(this.repairIngredient); } return properties.attributes(this.createAttributes(ArmorType.BODY)) .component( DataComponents.EQUIPPABLE, Equippable.builder(EquipmentSlot.BODY).setEquipSound(holder).setModel(this.modelId).setAllowedEntities(holderSet).setDamageOnHurt(bl).build() ); } private ItemAttributeModifiers createAttributes(ArmorType armorType) { int i = (Integer)this.defense.getOrDefault(armorType, 0); Builder builder = ItemAttributeModifiers.builder(); EquipmentSlotGroup equipmentSlotGroup = EquipmentSlotGroup.bySlot(armorType.getSlot()); ResourceLocation resourceLocation = ResourceLocation.withDefaultNamespace("armor." + armorType.getName()); builder.add(Attributes.ARMOR, new AttributeModifier(resourceLocation, i, AttributeModifier.Operation.ADD_VALUE), equipmentSlotGroup); builder.add(Attributes.ARMOR_TOUGHNESS, new AttributeModifier(resourceLocation, this.toughness, AttributeModifier.Operation.ADD_VALUE), equipmentSlotGroup); if (this.knockbackResistance > 0.0F) { builder.add( Attributes.KNOCKBACK_RESISTANCE, new AttributeModifier(resourceLocation, this.knockbackResistance, AttributeModifier.Operation.ADD_VALUE), equipmentSlotGroup ); } return builder.build(); } }