diff --git a/src/main/java/me/jonasjones/nec/entity/damage/ModDamageSource.java b/src/main/java/me/jonasjones/nec/entity/damage/ModDamageSource.java new file mode 100644 index 0000000..2eaa024 --- /dev/null +++ b/src/main/java/me/jonasjones/nec/entity/damage/ModDamageSource.java @@ -0,0 +1,10 @@ +package me.jonasjones.nec.entity.damage; + +import net.minecraft.entity.damage.DamageSource; + +public class ModDamageSource /*extends DamageSource*/ { + + //protected ModDamageSource(String name) { + // super(name); + //} +} diff --git a/src/main/java/me/jonasjones/nec/item/ModItems.java b/src/main/java/me/jonasjones/nec/item/ModItems.java index feb8978..959162f 100644 --- a/src/main/java/me/jonasjones/nec/item/ModItems.java +++ b/src/main/java/me/jonasjones/nec/item/ModItems.java @@ -1,6 +1,8 @@ package me.jonasjones.nec.item; +import me.jonasjones.nec.item.items.MaskItem; import me.jonasjones.nec.item.materials.DirtToolMaterial; +import me.jonasjones.nec.item.materials.MaskArmorMaterial; import me.jonasjones.nec.util.ModRegistries; import net.fabricmc.fabric.api.item.v1.FabricItemSettings; import net.minecraft.item.*; @@ -12,6 +14,7 @@ public class ModItems { private static Item STEEL_ITEM; private static ToolItem DIRT_SWORD_ITEM; private static Item NEGATIVE_FLINT_ITEM; + private static Item MASK_ITEM; public static void register() { ToolItem DIRT_SWORD = new SwordItem(DirtToolMaterial.INSTANCE, 1, -3.0F, new Item.Settings()); @@ -25,5 +28,10 @@ public class ModItems { Item NEGATIVE_FLINT = new Item(new FabricItemSettings()); NEGATIVE_FLINT_ITEM = Registry.register(Registries.ITEM, new Identifier("nec", "negative_flint"), NEGATIVE_FLINT); ModRegistries.register_item(NEGATIVE_FLINT_ITEM); + + ArmorMaterial MaskArmorMaterial = new MaskArmorMaterial(); + MaskItem MASK = new MaskItem(MaskArmorMaterial, MaskItem.Type.HELMET, new Item.Settings()); + MASK_ITEM = Registry.register(Registries.ITEM, new Identifier("nec", "mask"), MASK); + ModRegistries.register_item(MASK_ITEM); } } diff --git a/src/main/java/me/jonasjones/nec/item/items/MaskItem.java b/src/main/java/me/jonasjones/nec/item/items/MaskItem.java new file mode 100644 index 0000000..419a29b --- /dev/null +++ b/src/main/java/me/jonasjones/nec/item/items/MaskItem.java @@ -0,0 +1,159 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package me.jonasjones.nec.item.items; + +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.Multimap; +import java.util.EnumMap; +import java.util.List; +import java.util.UUID; + +import me.jonasjones.nec.entity.damage.ModDamageSource; +import net.minecraft.block.DispenserBlock; +import net.minecraft.block.dispenser.DispenserBehavior; +import net.minecraft.block.dispenser.ItemDispenserBehavior; +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.attribute.EntityAttribute; +import net.minecraft.entity.attribute.EntityAttributeModifier; +import net.minecraft.entity.attribute.EntityAttributes; +import net.minecraft.entity.attribute.EntityAttributeModifier.Operation; +import net.minecraft.entity.damage.DamageSource; +import net.minecraft.entity.mob.MobEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ArmorMaterial; +import net.minecraft.item.Equipment; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.predicate.entity.EntityPredicates; +import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; +import net.minecraft.sound.SoundEvent; +import net.minecraft.sound.SoundEvents; +import net.minecraft.text.Text; +import net.minecraft.util.Hand; +import net.minecraft.util.Identifier; +import net.minecraft.util.TypedActionResult; +import net.minecraft.util.Util; +import net.minecraft.util.math.BlockPointer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Direction; +import net.minecraft.world.World; + +public class MaskItem extends Item implements Equipment { + private static final EnumMap MODIFIERS = (EnumMap)Util.make(new EnumMap(Type.class), (uuidMap) -> { + uuidMap.put(MaskItem.Type.HELMET, UUID.fromString("2AD3F246-FEE1-4E67-B886-69FD380BB150")); + }); + public static final DispenserBehavior DISPENSER_BEHAVIOR = new ItemDispenserBehavior() { + protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { + return MaskItem.dispenseArmor(pointer, stack) ? stack : super.dispenseSilently(pointer, stack); + } + }; + protected final Type type; + private final int protection; + private final float toughness; + protected final float knockbackResistance; + protected final ArmorMaterial material; + private final Multimap attributeModifiers; + + public static boolean dispenseArmor(BlockPointer pointer, ItemStack armor) { + BlockPos blockPos = pointer.getPos().offset((Direction)pointer.getBlockState().get(DispenserBlock.FACING)); + List list = pointer.getWorld().getEntitiesByClass(LivingEntity.class, new Box(blockPos), EntityPredicates.EXCEPT_SPECTATOR.and(new EntityPredicates.Equipable(armor))); + if (list.isEmpty()) { + return false; + } else { + LivingEntity livingEntity = (LivingEntity)list.get(0); + EquipmentSlot equipmentSlot = MobEntity.getPreferredEquipmentSlot(armor); + ItemStack itemStack = armor.split(1); + livingEntity.equipStack(equipmentSlot, itemStack); + if (livingEntity instanceof MobEntity) { + ((MobEntity)livingEntity).setEquipmentDropChance(equipmentSlot, 2.0F); + ((MobEntity)livingEntity).setPersistent(); + } + + return true; + } + } + + public MaskItem(ArmorMaterial material, Type type, Item.Settings settings) { + super(settings); + this.material = material; + this.type = type; + this.protection = 0; + this.toughness = material.getToughness(); + this.knockbackResistance = material.getKnockbackResistance(); + DispenserBlock.registerBehavior(this, DISPENSER_BEHAVIOR); + ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); + UUID uUID = (UUID)MODIFIERS.get(type); + builder.put(EntityAttributes.GENERIC_ARMOR, new EntityAttributeModifier(uUID, "Armor modifier", (double)this.protection, Operation.ADDITION)); + builder.put(EntityAttributes.GENERIC_ARMOR_TOUGHNESS, new EntityAttributeModifier(uUID, "Armor toughness", (double)this.toughness, Operation.ADDITION)); + + this.attributeModifiers = builder.build(); + } + + public Type getType() { + return this.type; + } + + public int getEnchantability() { + return this.material.getEnchantability(); + } + + public ArmorMaterial getMaterial() { + return this.material; + } + + public boolean canRepair(ItemStack stack, ItemStack ingredient) { + return this.material.getRepairIngredient().test(ingredient) || super.canRepair(stack, ingredient); + } + + public TypedActionResult use(World world, PlayerEntity user, Hand hand) { + //user.damage(new DamageSource(Registry.register(Registries.ITEM, new Identifier("nec", "custom_death_message"), Text.translatable("death.attack.custom")).setDeathMessage(Text.translatable("death.attack.custom")), Float.MAX_VALUE); + return this.equipAndSwap(this, world, user, hand); + } + + public Multimap getAttributeModifiers(EquipmentSlot slot) { + return slot == this.type.getEquipmentSlot() ? this.attributeModifiers : super.getAttributeModifiers(slot); + } + + public int getProtection() { + return this.protection; + } + + public float getToughness() { + return this.toughness; + } + + public EquipmentSlot getSlotType() { + return this.type.getEquipmentSlot(); + } + + public SoundEvent getEquipSound() { + return this.getMaterial().getEquipSound(); + } + + public static enum Type { + HELMET(EquipmentSlot.HEAD, "helmet"); + + private final EquipmentSlot equipmentSlot; + private final String name; + + private Type(EquipmentSlot equipmentSlot, String name) { + this.equipmentSlot = equipmentSlot; + this.name = name; + } + + public EquipmentSlot getEquipmentSlot() { + return this.equipmentSlot; + } + + public String getName() { + return this.name; + } + + } +} diff --git a/src/main/java/me/jonasjones/nec/item/materials/MaskArmorMaterial.java b/src/main/java/me/jonasjones/nec/item/materials/MaskArmorMaterial.java new file mode 100644 index 0000000..74bdb1d --- /dev/null +++ b/src/main/java/me/jonasjones/nec/item/materials/MaskArmorMaterial.java @@ -0,0 +1,55 @@ +package me.jonasjones.nec.item.materials; + +import net.minecraft.item.ArmorItem; +import net.minecraft.item.ArmorMaterial; +import net.minecraft.item.ItemConvertible; +import net.minecraft.recipe.Ingredient; +import net.minecraft.registry.Registries; +import net.minecraft.sound.SoundEvent; +import net.minecraft.sound.SoundEvents; +import net.minecraft.util.Identifier; + +public class MaskArmorMaterial implements ArmorMaterial { + public static final MaskArmorMaterial INSTANCE = new MaskArmorMaterial(); + private static final int[] BASE_DURABILITY = new int[] {13, 15, 16, 11}; + private static final int[] PROTECTION_VALUES = new int[] {1, 2, 3, 1}; + @Override + public int getDurability(ArmorItem.Type type) { + return 0; + } + + @Override + public int getProtection(ArmorItem.Type type) { + return 0; + } + + @Override + public int getEnchantability() { + return 0; + } + + @Override + public SoundEvent getEquipSound() { + return SoundEvents.ITEM_ARMOR_EQUIP_LEATHER; + } + + @Override + public Ingredient getRepairIngredient() { + return Ingredient.ofItems(Registries.ITEM.get(Identifier.tryParse("mask"))); + } + + @Override + public String getName() { + return "mask"; + } + + @Override + public float getToughness() { + return 0; + } + + @Override + public float getKnockbackResistance() { + return 0; + } +} diff --git a/src/main/resources/assets/minecraft/textures/models/armor/mask_layer_1.png b/src/main/resources/assets/minecraft/textures/models/armor/mask_layer_1.png new file mode 100644 index 0000000..307be76 Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/models/armor/mask_layer_1.png differ diff --git a/src/main/resources/assets/nec/models/item/mask.json b/src/main/resources/assets/nec/models/item/mask.json new file mode 100644 index 0000000..4019dd6 --- /dev/null +++ b/src/main/resources/assets/nec/models/item/mask.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "nec:item/mask", + "layer1": "minecraft:textures/models/armor/name_layer_1.png" + } + } \ No newline at end of file diff --git a/src/main/resources/assets/nec/textures/item/mask.png b/src/main/resources/assets/nec/textures/item/mask.png new file mode 100644 index 0000000..bb04bd4 Binary files /dev/null and b/src/main/resources/assets/nec/textures/item/mask.png differ diff --git a/src/main/resources/assets/nec/textures/models/mask_layer_1.png b/src/main/resources/assets/nec/textures/models/mask_layer_1.png new file mode 100644 index 0000000..d014e65 Binary files /dev/null and b/src/main/resources/assets/nec/textures/models/mask_layer_1.png differ diff --git a/src/main/resources/data/nec/recipes/mask.json b/src/main/resources/data/nec/recipes/mask.json new file mode 100644 index 0000000..e87554e --- /dev/null +++ b/src/main/resources/data/nec/recipes/mask.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "ABA" + ], + "key": { + "A": { + "item": "minecraft:string" + }, + "B": { + "item": "minecraft:light_blue_carpet" + } + }, + "result": { + "item": "nec:mask" + } +} \ No newline at end of file