diff --git a/gradle.properties b/gradle.properties index 2c96ea8..6554403 100644 --- a/gradle.properties +++ b/gradle.properties @@ -34,7 +34,7 @@ mod_name=Stalinium # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. mod_license=MIT # The mod version. See https://semver.org/ -mod_version=0.0.11 +mod_version=0.0.18 # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. # This should match the base package used for the mod sources. # See https://maven.apache.org/guides/mini/guide-naming-conventions.html diff --git a/src/main/java/net/krituximon/stalinium/item/ModItems.java b/src/main/java/net/krituximon/stalinium/item/ModItems.java index 55bc0cc..57819f0 100644 --- a/src/main/java/net/krituximon/stalinium/item/ModItems.java +++ b/src/main/java/net/krituximon/stalinium/item/ModItems.java @@ -1,6 +1,7 @@ package net.krituximon.stalinium.item; import net.krituximon.stalinium.Stalinium; +import net.krituximon.stalinium.item.custom.*; import net.krituximon.stalinium.sound.ModSounds; import net.minecraft.world.item.*; import net.neoforged.bus.api.IEventBus; @@ -40,15 +41,15 @@ public class ModItems { .attributes(HoeItem.createAttributes(ModTiers.STALINIUM, 1.0f, -3.0f)))); public static final DeferredItem STALINIUM_HELMET = ITEMS.register("stalinium_helmet", - () -> new ArmorItem(ModArmorMaterials.STALINIUM_ARMOR_MATERIAL, ArmorItem.Type.HELMET, + () -> new ModArmorItem(ModArmorMaterials.STALINIUM_ARMOR_MATERIAL, ArmorItem.Type.HELMET, new Item.Properties().durability(ArmorItem.Type.HELMET.getDurability(19)))); public static final DeferredItem STALINIUM_CHESTPLATE = ITEMS.register("stalinium_chestplate", - () -> new ArmorItem(ModArmorMaterials.STALINIUM_ARMOR_MATERIAL, ArmorItem.Type.CHESTPLATE, + () -> new StaliniumChestplateLeggingsItem(ModArmorMaterials.STALINIUM_ARMOR_MATERIAL, ArmorItem.Type.CHESTPLATE, new Item.Properties().durability(ArmorItem.Type.CHESTPLATE.getDurability(19)))); public static final DeferredItem STALINIUM_LEGGINGS = ITEMS.register("stalinium_leggings", - () -> new ArmorItem(ModArmorMaterials.STALINIUM_ARMOR_MATERIAL, ArmorItem.Type.LEGGINGS, + () -> new StaliniumChestplateLeggingsItem(ModArmorMaterials.STALINIUM_ARMOR_MATERIAL, ArmorItem.Type.LEGGINGS, new Item.Properties().durability(ArmorItem.Type.LEGGINGS.getDurability(19)))); public static final DeferredItem STALINIUM_BOOTS = ITEMS.register("stalinium_boots", diff --git a/src/main/java/net/krituximon/stalinium/item/custom/ModArmorItem.java b/src/main/java/net/krituximon/stalinium/item/custom/ModArmorItem.java new file mode 100644 index 0000000..1f0aae4 --- /dev/null +++ b/src/main/java/net/krituximon/stalinium/item/custom/ModArmorItem.java @@ -0,0 +1,93 @@ +package net.krituximon.stalinium.item.custom; + +import com.google.common.collect.ImmutableMap; +import net.krituximon.stalinium.item.ModArmorMaterials; +import net.minecraft.core.Holder; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.AABB; + +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.STALINIUM_ARMOR_MATERIAL, + List.of(new MobEffectInstance(MobEffects.HEALTH_BOOST, 100, 0, false, false))) + .build(); + + public ModArmorItem(Holder material, Type type, Properties properties) { + super(material, type, properties); + } + + @Override + public void inventoryTick(ItemStack stack, Level level, Entity entity, int slotId, boolean isSelected) { + if (entity instanceof Player player && !level.isClientSide() && hasFullSuitOfArmorOn(player)) { + evaluateArmorEffects(player); + } + } + + private void evaluateArmorEffects(Player player) { + for (Map.Entry, List> entry : MATERIAL_TO_EFFECT_MAP.entrySet()) { + Holder mapArmorMaterial = entry.getKey(); + List mapEffect = entry.getValue(); + + if (hasPlayerCorrectArmorOn(mapArmorMaterial, player)) { + addEffectToPlayer(player, mapEffect); + } + } + } + + private void addEffectToPlayer(Player player, List mapEffect) { + AABB box = player.getBoundingBox().inflate(20.0); + int playersInBox = player.level().getEntitiesOfClass( + Player.class, + box, + p -> p instanceof ServerPlayer && player.isAlliedTo(p) + ).size(); + + for (MobEffectInstance effect : mapEffect) { + int newAmplifier = Math.min(4, effect.getAmplifier() + playersInBox); + player.addEffect(new MobEffectInstance( + effect.getEffect(), + effect.getDuration(), + newAmplifier, + effect.isAmbient(), + effect.isVisible() + )); + } + } + + private boolean hasPlayerCorrectArmorOn(Holder mapArmorMaterial, Player player) { + for (ItemStack armorStack : player.getArmorSlots()) { + if (!(armorStack.getItem() instanceof ArmorItem)) { + return false; + } + } + + ArmorItem boots = ((ArmorItem) player.getInventory().getArmor(0).getItem()); + ArmorItem leggings = ((ArmorItem) player.getInventory().getArmor(1).getItem()); + ArmorItem chestplate = ((ArmorItem) player.getInventory().getArmor(2).getItem()); + ArmorItem helmet = ((ArmorItem) player.getInventory().getArmor(3).getItem()); + + return boots.getMaterial() == mapArmorMaterial && leggings.getMaterial() == mapArmorMaterial + && chestplate.getMaterial() == mapArmorMaterial && helmet.getMaterial() == mapArmorMaterial; + } + + private boolean hasFullSuitOfArmorOn(Player player) { + ItemStack boots = player.getInventory().getArmor(0); + ItemStack leggings = player.getInventory().getArmor(1); + ItemStack chestplate = player.getInventory().getArmor(2); + ItemStack helmet = player.getInventory().getArmor(3); + + return !boots.isEmpty() && !leggings.isEmpty() && !chestplate.isEmpty() && !helmet.isEmpty(); + } +} \ No newline at end of file diff --git a/src/main/java/net/krituximon/stalinium/item/StaliniumAxeItem.java b/src/main/java/net/krituximon/stalinium/item/custom/StaliniumAxeItem.java similarity index 99% rename from src/main/java/net/krituximon/stalinium/item/StaliniumAxeItem.java rename to src/main/java/net/krituximon/stalinium/item/custom/StaliniumAxeItem.java index 08763c4..e3575a7 100644 --- a/src/main/java/net/krituximon/stalinium/item/StaliniumAxeItem.java +++ b/src/main/java/net/krituximon/stalinium/item/custom/StaliniumAxeItem.java @@ -1,4 +1,4 @@ -package net.krituximon.stalinium.item; +package net.krituximon.stalinium.item.custom; import net.krituximon.stalinium.util.PlacedLogStorage; import net.minecraft.client.gui.screens.Screen; diff --git a/src/main/java/net/krituximon/stalinium/item/custom/StaliniumChestplateLeggingsItem.java b/src/main/java/net/krituximon/stalinium/item/custom/StaliniumChestplateLeggingsItem.java new file mode 100644 index 0000000..c701f0d --- /dev/null +++ b/src/main/java/net/krituximon/stalinium/item/custom/StaliniumChestplateLeggingsItem.java @@ -0,0 +1,107 @@ +package net.krituximon.stalinium.item.custom; + +import com.google.common.collect.ImmutableMap; +import net.krituximon.stalinium.item.ModArmorMaterials; +import net.minecraft.core.Holder; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.AABB; + +import java.util.List; +import java.util.Map; + +public class StaliniumChestplateLeggingsItem extends ArmorItem { + private static final Map, List> MATERIAL_TO_EFFECT_MAP = + (new ImmutableMap.Builder, List>()) + .put(ModArmorMaterials.STALINIUM_ARMOR_MATERIAL, + List.of(new MobEffectInstance(MobEffects.DAMAGE_RESISTANCE, 100, 0, false, false))) + .build(); + + public StaliniumChestplateLeggingsItem(Holder material, Type type, Properties properties) { + super(material, type, properties); + } + + @Override + public void inventoryTick(ItemStack stack, Level level, Entity entity, int slotId, boolean isSelected) { + if (entity instanceof Player player && !level.isClientSide() && hasChestAndLeggingsOn(player)) { + evaluateArmorEffects(player); + } + } + + private void evaluateArmorEffects(Player player) { + for (Map.Entry, List> entry : MATERIAL_TO_EFFECT_MAP.entrySet()) { + Holder mapArmorMaterial = entry.getKey(); + List mapEffect = entry.getValue(); + + if (hasPlayerCorrectArmorOn(mapArmorMaterial, player)) { + addEffectToPlayer(player, mapEffect); + } + } + } + + private void addEffectToPlayer(Player player, List mapEffect) { + AABB box = player.getBoundingBox().inflate(5.0); + List allies = player.level().getEntitiesOfClass( + Player.class, + box, + p -> p instanceof ServerPlayer && player.isAlliedTo(p) + ); + + for (MobEffectInstance effect : mapEffect) { + player.addEffect(new MobEffectInstance( + effect.getEffect(), + effect.getDuration(), + effect.getAmplifier(), + effect.isAmbient(), + effect.isVisible())); + for (Player ally : allies) { + ally.addEffect(new MobEffectInstance( + effect.getEffect(), + effect.getDuration(), + effect.getAmplifier(), + effect.isAmbient(), + effect.isVisible() + )); + } + } + } + + private boolean hasPlayerCorrectArmorOn(Holder mapArmorMaterial, Player player) { + ItemStack leggingsStack = player.getInventory().getArmor(1); + ItemStack chestplateStack = player.getInventory().getArmor(2); + + if (leggingsStack.isEmpty() || chestplateStack.isEmpty()) { + return false; + } + + ArmorItem leggingsItem = (ArmorItem) leggingsStack.getItem(); + ArmorItem chestplateItem = (ArmorItem) chestplateStack.getItem(); + + return leggingsItem.getMaterial() == mapArmorMaterial + && chestplateItem.getMaterial() == mapArmorMaterial; + } + + private boolean hasChestAndLeggingsOn(Player player) { + ItemStack leggings = player.getInventory().getArmor(1); + ItemStack chestplate = player.getInventory().getArmor(2); + + return !leggings.isEmpty() && !chestplate.isEmpty(); + } + + @Override + public boolean isDamageable(ItemStack stack) { + return false; + } + + @Override + public boolean isDamaged(ItemStack stack) { + return false; + } +} \ No newline at end of file diff --git a/src/main/java/net/krituximon/stalinium/item/StaliniumHoeItem.java b/src/main/java/net/krituximon/stalinium/item/custom/StaliniumHoeItem.java similarity index 97% rename from src/main/java/net/krituximon/stalinium/item/StaliniumHoeItem.java rename to src/main/java/net/krituximon/stalinium/item/custom/StaliniumHoeItem.java index b4b95b2..0ce7693 100644 --- a/src/main/java/net/krituximon/stalinium/item/StaliniumHoeItem.java +++ b/src/main/java/net/krituximon/stalinium/item/custom/StaliniumHoeItem.java @@ -1,4 +1,4 @@ -package net.krituximon.stalinium.item; +package net.krituximon.stalinium.item.custom; import net.minecraft.client.gui.screens.Screen; import net.minecraft.core.BlockPos; @@ -7,7 +7,6 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.*; import net.minecraft.world.item.context.UseOnContext; diff --git a/src/main/java/net/krituximon/stalinium/item/StaliniumPickaxeItem.java b/src/main/java/net/krituximon/stalinium/item/custom/StaliniumPickaxeItem.java similarity index 98% rename from src/main/java/net/krituximon/stalinium/item/StaliniumPickaxeItem.java rename to src/main/java/net/krituximon/stalinium/item/custom/StaliniumPickaxeItem.java index 5f5e1fb..b6c2d11 100644 --- a/src/main/java/net/krituximon/stalinium/item/StaliniumPickaxeItem.java +++ b/src/main/java/net/krituximon/stalinium/item/custom/StaliniumPickaxeItem.java @@ -1,4 +1,4 @@ -package net.krituximon.stalinium.item; +package net.krituximon.stalinium.item.custom; import net.minecraft.client.gui.screens.Screen; import net.minecraft.core.BlockPos; diff --git a/src/main/java/net/krituximon/stalinium/item/StaliniumShovelItem.java b/src/main/java/net/krituximon/stalinium/item/custom/StaliniumShovelItem.java similarity index 98% rename from src/main/java/net/krituximon/stalinium/item/StaliniumShovelItem.java rename to src/main/java/net/krituximon/stalinium/item/custom/StaliniumShovelItem.java index b8310fd..dc62d1f 100644 --- a/src/main/java/net/krituximon/stalinium/item/StaliniumShovelItem.java +++ b/src/main/java/net/krituximon/stalinium/item/custom/StaliniumShovelItem.java @@ -1,4 +1,4 @@ -package net.krituximon.stalinium.item; +package net.krituximon.stalinium.item.custom; import net.minecraft.client.gui.screens.Screen; import net.minecraft.core.BlockPos; diff --git a/src/main/java/net/krituximon/stalinium/item/StaliniumSwordItem.java b/src/main/java/net/krituximon/stalinium/item/custom/StaliniumSwordItem.java similarity index 99% rename from src/main/java/net/krituximon/stalinium/item/StaliniumSwordItem.java rename to src/main/java/net/krituximon/stalinium/item/custom/StaliniumSwordItem.java index 4d64f03..b2d2462 100644 --- a/src/main/java/net/krituximon/stalinium/item/StaliniumSwordItem.java +++ b/src/main/java/net/krituximon/stalinium/item/custom/StaliniumSwordItem.java @@ -1,4 +1,4 @@ -package net.krituximon.stalinium.item; +package net.krituximon.stalinium.item.custom; import net.krituximon.stalinium.Stalinium; import net.minecraft.client.gui.screens.Screen;