From 340580f2d078ae84ab40b693cb3642a234d6780d Mon Sep 17 00:00:00 2001 From: Vos Date: Sun, 9 Nov 2025 17:07:53 -0600 Subject: [PATCH] Prisma Steel Armor Effects --- .../acethewildfire/acesbs/item/ModItems.java | 9 +- .../acesbs/item/custom/ModArmorItem.java | 94 +++++++++++++++++++ 2 files changed, 99 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/acethewildfire/acesbs/item/custom/ModArmorItem.java diff --git a/src/main/java/com/acethewildfire/acesbs/item/ModItems.java b/src/main/java/com/acethewildfire/acesbs/item/ModItems.java index 4e4d900..867a9fe 100644 --- a/src/main/java/com/acethewildfire/acesbs/item/ModItems.java +++ b/src/main/java/com/acethewildfire/acesbs/item/ModItems.java @@ -2,6 +2,7 @@ package com.acethewildfire.acesbs.item; import com.acethewildfire.acesbs.AcesBS; import com.acethewildfire.acesbs.item.custom.HammerItem; +import com.acethewildfire.acesbs.item.custom.ModArmorItem; import com.acethewildfire.acesbs.item.custom.OracleLemon; import com.acethewildfire.acesbs.item.custom.Wand; import net.minecraft.client.gui.screen.Screen; @@ -71,19 +72,19 @@ public class ModItems { ); public static final Item PRISMA_STEEL_HELMET = registerItem("prisma_steel_helmet", - new ArmorItem(ModArmorMaterials.PRISMA_STEEL_ARMOR_MATERIAL, ArmorItem.Type.HELMET, new Item.Settings() + new ModArmorItem(ModArmorMaterials.PRISMA_STEEL_ARMOR_MATERIAL, ArmorItem.Type.HELMET, new Item.Settings() .maxDamage(ArmorItem.Type.HELMET.getMaxDamage(15)))); public static final Item PRISMA_STEEL_CHESTPLATE = registerItem("prisma_steel_chestplate", - new ArmorItem(ModArmorMaterials.PRISMA_STEEL_ARMOR_MATERIAL, ArmorItem.Type.CHESTPLATE, new Item.Settings() + new ModArmorItem(ModArmorMaterials.PRISMA_STEEL_ARMOR_MATERIAL, ArmorItem.Type.CHESTPLATE, new Item.Settings() .maxDamage(ArmorItem.Type.CHESTPLATE.getMaxDamage(15)))); public static final Item PRISMA_STEEL_LEGGINGS = registerItem("prisma_steel_leggings", - new ArmorItem(ModArmorMaterials.PRISMA_STEEL_ARMOR_MATERIAL, ArmorItem.Type.LEGGINGS, new Item.Settings() + new ModArmorItem(ModArmorMaterials.PRISMA_STEEL_ARMOR_MATERIAL, ArmorItem.Type.LEGGINGS, new Item.Settings() .maxDamage(ArmorItem.Type.LEGGINGS.getMaxDamage(15)))); public static final Item PRISMA_STEEL_BOOTS = registerItem("prisma_steel_boots", - new ArmorItem(ModArmorMaterials.PRISMA_STEEL_ARMOR_MATERIAL, ArmorItem.Type.BOOTS, new Item.Settings() + new ModArmorItem(ModArmorMaterials.PRISMA_STEEL_ARMOR_MATERIAL, ArmorItem.Type.BOOTS, new Item.Settings() .maxDamage(ArmorItem.Type.BOOTS.getMaxDamage(15)))); private static Item registerItem(String name, Item item){ diff --git a/src/main/java/com/acethewildfire/acesbs/item/custom/ModArmorItem.java b/src/main/java/com/acethewildfire/acesbs/item/custom/ModArmorItem.java new file mode 100644 index 0000000..2dee79d --- /dev/null +++ b/src/main/java/com/acethewildfire/acesbs/item/custom/ModArmorItem.java @@ -0,0 +1,94 @@ +package com.acethewildfire.acesbs.item.custom; + +import com.acethewildfire.acesbs.item.ModArmorMaterials; +import com.google.common.collect.ImmutableMap; +import net.minecraft.entity.Entity; +import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.entity.effect.StatusEffects; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ArmorItem; +import net.minecraft.item.ArmorMaterial; +import net.minecraft.item.ItemStack; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.world.World; + +import java.util.List; +import java.util.Map; + +public class ModArmorItem extends ArmorItem { + private static final Map, List> MATERIAL_TO_EFFECT_MAP = + (new ImmutableMap.Builder, List>()) + .put(ModArmorMaterials.PRISMA_STEEL_ARMOR_MATERIAL, + List.of(new StatusEffectInstance(StatusEffects.SPEED, 400, 1, false, false), + new StatusEffectInstance(StatusEffects.JUMP_BOOST, 400, 0, false, false))) +// For more materials just add more puts +// .put(ModArmorMaterials.PRISMA_STEEL_ARMOR_MATERIAL, +// List.of(new StatusEffectInstance(StatusEffects.SPEED, 400, 2, false, false), +// new StatusEffectInstance(StatusEffects.JUMP_BOOST, 400, 1, false, false))) + .build(); + + public ModArmorItem(RegistryEntry material, Type type, Settings settings) { + super(material, type, settings); + } + + @Override + public void inventoryTick(ItemStack stack, World world, Entity entity, int slot, boolean selected) { + if(!world.isClient()) { + if(entity instanceof PlayerEntity player) { + if(hasFullSuitOfArmorOn(player)) { + evaluateArmorEffects(player); + } + } + } + + super.inventoryTick(stack, world, entity, slot, selected); + } + + private void evaluateArmorEffects(PlayerEntity player) { + for (Map.Entry, List> entry : MATERIAL_TO_EFFECT_MAP.entrySet()) { + RegistryEntry mapArmorMaterial = entry.getKey(); + List mapStatusEffects = entry.getValue(); + + if(hasCorrectArmorOn(mapArmorMaterial, player)) { + addStatusEffectForMaterial(player, mapArmorMaterial, mapStatusEffects); + } + } + } + + private void addStatusEffectForMaterial(PlayerEntity player, RegistryEntry mapArmorMaterial, List mapStatusEffect) { + boolean hasPlayerEffect = mapStatusEffect.stream().allMatch(statusEffectInstance -> player.hasStatusEffect(statusEffectInstance.getEffectType())); + + if(!hasPlayerEffect) { + for (StatusEffectInstance instance : mapStatusEffect) { + player.addStatusEffect(new StatusEffectInstance(instance.getEffectType(), + instance.getDuration(), instance.getAmplifier(), instance.isAmbient(), instance.shouldShowParticles())); + } + } + } + + private boolean hasFullSuitOfArmorOn(PlayerEntity player) { + ItemStack boots = player.getInventory().getArmorStack(0); + ItemStack leggings = player.getInventory().getArmorStack(1); + ItemStack breastplate = player.getInventory().getArmorStack(2); + ItemStack helmet = player.getInventory().getArmorStack(3); + + return !helmet.isEmpty() && !breastplate.isEmpty() + && !leggings.isEmpty() && !boots.isEmpty(); + } + + private boolean hasCorrectArmorOn(RegistryEntry material, PlayerEntity player) { + for (ItemStack armorStack: player.getInventory().armor) { + if(!(armorStack.getItem() instanceof ArmorItem)) { + return false; + } + } + + ArmorItem boots = ((ArmorItem)player.getInventory().getArmorStack(0).getItem()); + ArmorItem leggings = ((ArmorItem)player.getInventory().getArmorStack(1).getItem()); + ArmorItem breastplate = ((ArmorItem)player.getInventory().getArmorStack(2).getItem()); + ArmorItem helmet = ((ArmorItem)player.getInventory().getArmorStack(3).getItem()); + + return helmet.getMaterial() == material && breastplate.getMaterial() == material && + leggings.getMaterial() == material && boots.getMaterial() == material; + } +} \ No newline at end of file