From 9ef8799c198dfac993f6ce544b860669f5b43ba3 Mon Sep 17 00:00:00 2001 From: KeyLime17 Date: Tue, 15 Apr 2025 03:11:56 -0400 Subject: [PATCH] The Ulukai, also moved special item classes to a separate directory --- .../cinder_loe/CinderEventHandler.java | 12 +- .../com/zivilon/cinder_loe/CinderLoE.java | 13 +- .../zivilon/cinder_loe/CinderLoE_Config.java | 3 + .../zivilon/cinder_loe/items/BrokenHalo.java | 29 -- .../cinder_loe/items/specials/BrokenHalo.java | 12 + .../items/{ => specials}/PallandoStaff.java | 8 +- .../items/{ => specials}/RadagastStaff.java | 3 +- .../items/{ => specials}/SarumanStaff.java | 15 +- .../{ => specials}/SarumanWhiteStaff.java | 16 +- .../cinder_loe/items/specials/Ulukai.java | 272 ++++++++++++++++++ .../items/{ => specials}/UnnamedSpear.java | 3 +- .../items/{ => specials}/VoidDagger.java | 12 +- .../items/{ => specials}/WoodElfRelic.java | 6 +- .../world/event/UlukaiCurseHandler.java | 38 +++ .../assets/cinder_loe/lang/en_US.lang | 1 + .../assets/lotr/textures/items/ingotAsh.png | Bin 6176 -> 2156 bytes .../assets/lotr/textures/items/ulukai.png | Bin 0 -> 858 bytes .../lotr/textures/items/ulukai.png.mcmeta | 50 ++++ 18 files changed, 394 insertions(+), 99 deletions(-) delete mode 100644 src/main/java/com/zivilon/cinder_loe/items/BrokenHalo.java create mode 100644 src/main/java/com/zivilon/cinder_loe/items/specials/BrokenHalo.java rename src/main/java/com/zivilon/cinder_loe/items/{ => specials}/PallandoStaff.java (92%) rename src/main/java/com/zivilon/cinder_loe/items/{ => specials}/RadagastStaff.java (97%) rename src/main/java/com/zivilon/cinder_loe/items/{ => specials}/SarumanStaff.java (72%) rename src/main/java/com/zivilon/cinder_loe/items/{ => specials}/SarumanWhiteStaff.java (70%) create mode 100644 src/main/java/com/zivilon/cinder_loe/items/specials/Ulukai.java rename src/main/java/com/zivilon/cinder_loe/items/{ => specials}/UnnamedSpear.java (94%) rename src/main/java/com/zivilon/cinder_loe/items/{ => specials}/VoidDagger.java (94%) rename src/main/java/com/zivilon/cinder_loe/items/{ => specials}/WoodElfRelic.java (94%) create mode 100644 src/main/java/com/zivilon/cinder_loe/world/event/UlukaiCurseHandler.java create mode 100644 src/main/resources/assets/lotr/textures/items/ulukai.png create mode 100644 src/main/resources/assets/lotr/textures/items/ulukai.png.mcmeta diff --git a/src/main/java/com/zivilon/cinder_loe/CinderEventHandler.java b/src/main/java/com/zivilon/cinder_loe/CinderEventHandler.java index 86b9fdc..90629d6 100644 --- a/src/main/java/com/zivilon/cinder_loe/CinderEventHandler.java +++ b/src/main/java/com/zivilon/cinder_loe/CinderEventHandler.java @@ -1,11 +1,10 @@ package com.zivilon.cinder_loe; import com.zivilon.cinder_loe.entity.corrupt.CorruptMan; -import com.zivilon.cinder_loe.items.BrokenHalo; +import com.zivilon.cinder_loe.items.specials.BrokenHalo; import com.zivilon.cinder_loe.network.PacketWarbandLocations; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.IFuelHandler; -import cpw.mods.fml.common.eventhandler.EventPriority; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.TickEvent; import cpw.mods.fml.common.registry.GameRegistry; @@ -16,25 +15,17 @@ import lotr.common.enchant.LOTREnchantmentHelper; import lotr.common.item.*; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.DataWatcher; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.*; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.nbt.NBTTagString; -import net.minecraft.network.Packet; -import net.minecraft.network.play.server.S04PacketEntityEquipment; -import net.minecraft.network.play.server.S09PacketHeldItemChange; -import net.minecraft.network.play.server.S1CPacketEntityMetadata; -import net.minecraft.network.play.server.S19PacketEntityStatus; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import net.minecraft.util.ChatComponentText; import net.minecraft.util.DamageSource; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; -import net.minecraft.world.WorldServer; import net.minecraftforge.common.DimensionManager; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.living.LivingAttackEvent; @@ -66,6 +57,7 @@ public class CinderEventHandler implements IFuelHandler { } } } + } @SubscribeEvent diff --git a/src/main/java/com/zivilon/cinder_loe/CinderLoE.java b/src/main/java/com/zivilon/cinder_loe/CinderLoE.java index 4bc3d6d..d89d1c8 100644 --- a/src/main/java/com/zivilon/cinder_loe/CinderLoE.java +++ b/src/main/java/com/zivilon/cinder_loe/CinderLoE.java @@ -24,6 +24,7 @@ import com.zivilon.cinder_loe.entity.npc.radagast.*; import com.zivilon.cinder_loe.entity.projectile.*; import com.zivilon.cinder_loe.entity.trader.*; import com.zivilon.cinder_loe.items.*; +import com.zivilon.cinder_loe.items.specials.*; import com.zivilon.cinder_loe.network.*; import com.zivilon.cinder_loe.potion.LoEPotions; import com.zivilon.cinder_loe.tileentity.*; @@ -84,13 +85,6 @@ import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.world.WorldEvent; import static lotr.common.LOTRMod.horseArmorIron; -import static lotr.common.item.LOTRMaterial.GONDOR; - -import net.minecraft.command.ICommandSender; -import net.minecraft.command.CommandBase; -import net.minecraft.util.ChatComponentText; -import net.minecraftforge.client.ClientCommandHandler; -import com.zivilon.cinder_loe.SwiftnessHandler; @Mod( modid = "cinder_loe", @@ -304,6 +298,7 @@ public class CinderLoE { // Relics public static Item welfRelic; + public static Item ulukai; // Spawn eggs public static Item spawnEgg; public static Item unitLevelTool; @@ -340,6 +335,7 @@ public class CinderLoE { new CharacterEventListener(); FMLCommonHandler.instance().bus().register(new WarbandTickHandler()); MinecraftForge.EVENT_BUS.register(new SwiftnessHandler()); + FMLCommonHandler.instance().bus().register(new com.zivilon.cinder_loe.world.event.UlukaiCurseHandler()); } @@ -363,6 +359,7 @@ public class CinderLoE { CharacterRoleAPI.loadRolesFromFile(); event.registerServerCommand(new CommandCinderCharacter()); event.registerServerCommand(new CommandWarband()); + // event.registerServerCommand(new CommandMobileSound()); } public void registerEntities() { // Last ID added: 60 @@ -592,6 +589,7 @@ public class CinderLoE { sarumanWhiteStaff = (new SarumanWhiteStaff()).setUnlocalizedName("lotr:sarumanWhiteStaff").setTextureName("lotr:sarumanStaff"); // Relics welfRelic = (new WoodElfRelic()).setUnlocalizedName("lotr:welfRelic").setTextureName("lotr:welfRelic"); + ulukai = (new Ulukai()).setUnlocalizedName("lotr:ulukai").setTextureName("lotr:ulukai"); unitLevelTool = (new unitLevelTool()).setUnlocalizedName("lotr:unitLevelTool").setTextureName("stick"); /** @@ -674,6 +672,7 @@ public class CinderLoE { //Relics ItemRegistration.register(welfRelic, "welfRelic", 6704); + ItemRegistration.register(ulukai, "ulukai", 6706); linkLOTRWeapon(welfRelic, "welfRelic"); diff --git a/src/main/java/com/zivilon/cinder_loe/CinderLoE_Config.java b/src/main/java/com/zivilon/cinder_loe/CinderLoE_Config.java index 10dde10..92a742d 100644 --- a/src/main/java/com/zivilon/cinder_loe/CinderLoE_Config.java +++ b/src/main/java/com/zivilon/cinder_loe/CinderLoE_Config.java @@ -14,6 +14,7 @@ public class CinderLoE_Config { public static float enchantment_color_blue; public static String corrupt_faction; public static String skeleton_faction; + public static String ulukai_faction; public static boolean objective_lindon; public static boolean objective_arnor; @@ -47,6 +48,8 @@ public class CinderLoE_Config { corrupt_faction = config.getString("CorruptFaction", Configuration.CATEGORY_GENERAL, "UTUMNO", "Configure the alignment the Corrupt npcs follow"); skeleton_faction = config.getString("SkeletonFaction", Configuration.CATEGORY_GENERAL, "UTUMNO", "Configure the alignment the Skeleton npcs follow"); + ulukai_faction = config.getString("UlukaiFaction", Configuration.CATEGORY_GENERAL, "GUNDABAD", "Configure the faction the Ulukai Assists"); + objective_lindon = config.getBoolean("Lindon", Configuration.CATEGORY_GENERAL, false, "set true if Lindon Objective Complete"); objective_arnor = config.getBoolean("Arnor", Configuration.CATEGORY_GENERAL, false,"set true if Arnor Objective Complete"); objective_angmar = config.getBoolean("Angmar", Configuration.CATEGORY_GENERAL, false, "set true if Angmar Objective Complete"); diff --git a/src/main/java/com/zivilon/cinder_loe/items/BrokenHalo.java b/src/main/java/com/zivilon/cinder_loe/items/BrokenHalo.java deleted file mode 100644 index 1c59bd7..0000000 --- a/src/main/java/com/zivilon/cinder_loe/items/BrokenHalo.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.zivilon.cinder_loe.items; - -import com.zivilon.cinder_loe.CinderLoE; -import com.zivilon.cinder_loe.entity.corrupt.CorruptMan; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import lotr.common.item.LOTRItemArmor; -import lotr.common.item.LOTRMaterial; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.IEntityLivingData; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; -import net.minecraft.world.World; -import net.minecraftforge.event.entity.living.LivingEvent; -import net.minecraftforge.event.entity.living.LivingHurtEvent; - -import java.util.Random; - -public class BrokenHalo extends LOTRItemArmor { - - public BrokenHalo(LOTRMaterial material, int slotType, String s) { - super(material, slotType, s); - - } -} diff --git a/src/main/java/com/zivilon/cinder_loe/items/specials/BrokenHalo.java b/src/main/java/com/zivilon/cinder_loe/items/specials/BrokenHalo.java new file mode 100644 index 0000000..ba0fcbb --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/items/specials/BrokenHalo.java @@ -0,0 +1,12 @@ +package com.zivilon.cinder_loe.items.specials; + +import lotr.common.item.LOTRItemArmor; +import lotr.common.item.LOTRMaterial; + +public class BrokenHalo extends LOTRItemArmor { + + public BrokenHalo(LOTRMaterial material, int slotType, String s) { + super(material, slotType, s); + + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/items/PallandoStaff.java b/src/main/java/com/zivilon/cinder_loe/items/specials/PallandoStaff.java similarity index 92% rename from src/main/java/com/zivilon/cinder_loe/items/PallandoStaff.java rename to src/main/java/com/zivilon/cinder_loe/items/specials/PallandoStaff.java index 6c06934..008d26a 100644 --- a/src/main/java/com/zivilon/cinder_loe/items/PallandoStaff.java +++ b/src/main/java/com/zivilon/cinder_loe/items/specials/PallandoStaff.java @@ -1,27 +1,23 @@ -package com.zivilon.cinder_loe.items; +package com.zivilon.cinder_loe.items.specials; import cpw.mods.fml.common.network.simpleimpl.IMessage; import java.util.List; -import lotr.common.LOTRCreativeTabs; + import lotr.common.LOTRLevelData; import lotr.common.LOTRMod; import lotr.common.fac.LOTRFaction; import lotr.common.network.LOTRPacketHandler; import lotr.common.network.LOTRPacketWeaponFX; -import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.EnumAction; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; import net.minecraft.potion.Potion; import net.minecraft.server.MinecraftServer; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; import net.minecraft.world.World; import com.zivilon.cinder_loe.items.WizardStaff; diff --git a/src/main/java/com/zivilon/cinder_loe/items/RadagastStaff.java b/src/main/java/com/zivilon/cinder_loe/items/specials/RadagastStaff.java similarity index 97% rename from src/main/java/com/zivilon/cinder_loe/items/RadagastStaff.java rename to src/main/java/com/zivilon/cinder_loe/items/specials/RadagastStaff.java index 8a469e9..d970ca3 100644 --- a/src/main/java/com/zivilon/cinder_loe/items/RadagastStaff.java +++ b/src/main/java/com/zivilon/cinder_loe/items/specials/RadagastStaff.java @@ -1,6 +1,7 @@ -package com.zivilon.cinder_loe.items; +package com.zivilon.cinder_loe.items.specials; +import com.zivilon.cinder_loe.items.WizardStaff; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.passive.EntityAnimal; diff --git a/src/main/java/com/zivilon/cinder_loe/items/SarumanStaff.java b/src/main/java/com/zivilon/cinder_loe/items/specials/SarumanStaff.java similarity index 72% rename from src/main/java/com/zivilon/cinder_loe/items/SarumanStaff.java rename to src/main/java/com/zivilon/cinder_loe/items/specials/SarumanStaff.java index 46f3878..dbc68bd 100644 --- a/src/main/java/com/zivilon/cinder_loe/items/SarumanStaff.java +++ b/src/main/java/com/zivilon/cinder_loe/items/specials/SarumanStaff.java @@ -1,27 +1,14 @@ -package com.zivilon.cinder_loe.items; +package com.zivilon.cinder_loe.items.specials; import cpw.mods.fml.common.network.simpleimpl.IMessage; -import java.util.List; -import lotr.common.LOTRCreativeTabs; -import lotr.common.LOTRLevelData; -import lotr.common.LOTRMod; -import lotr.common.fac.LOTRFaction; import lotr.common.network.LOTRPacketHandler; import lotr.common.network.LOTRPacketWeaponFX; -import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.EnumAction; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.potion.PotionEffect; -import net.minecraft.potion.Potion; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; import net.minecraft.world.World; import com.zivilon.cinder_loe.items.WizardStaff; diff --git a/src/main/java/com/zivilon/cinder_loe/items/SarumanWhiteStaff.java b/src/main/java/com/zivilon/cinder_loe/items/specials/SarumanWhiteStaff.java similarity index 70% rename from src/main/java/com/zivilon/cinder_loe/items/SarumanWhiteStaff.java rename to src/main/java/com/zivilon/cinder_loe/items/specials/SarumanWhiteStaff.java index 68984f6..a141bbb 100644 --- a/src/main/java/com/zivilon/cinder_loe/items/SarumanWhiteStaff.java +++ b/src/main/java/com/zivilon/cinder_loe/items/specials/SarumanWhiteStaff.java @@ -1,27 +1,13 @@ -package com.zivilon.cinder_loe.items; +package com.zivilon.cinder_loe.items.specials; import cpw.mods.fml.common.network.simpleimpl.IMessage; -import java.util.List; -import lotr.common.LOTRCreativeTabs; -import lotr.common.LOTRLevelData; -import lotr.common.LOTRMod; -import lotr.common.fac.LOTRFaction; import lotr.common.network.LOTRPacketHandler; import lotr.common.network.LOTRPacketWeaponFX; -import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.EnumAction; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.potion.PotionEffect; -import net.minecraft.potion.Potion; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; import net.minecraft.world.World; import com.zivilon.cinder_loe.items.WizardStaff; diff --git a/src/main/java/com/zivilon/cinder_loe/items/specials/Ulukai.java b/src/main/java/com/zivilon/cinder_loe/items/specials/Ulukai.java new file mode 100644 index 0000000..9667f1d --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/items/specials/Ulukai.java @@ -0,0 +1,272 @@ +package com.zivilon.cinder_loe.items.specials; + +import com.zivilon.cinder_loe.CinderLoE_Config; +import com.zivilon.cinder_loe.LoECreativeTabs; +import com.zivilon.cinder_loe.entity.npc.orc.NorthernOrc; +import com.zivilon.cinder_loe.entity.npc.radagast.FangornAnimal; +import com.zivilon.cinder_loe.util.BlockPos; +import lotr.common.LOTRMod; +import lotr.common.entity.npc.*; +import lotr.common.fac.LOTRFaction; +import lotr.common.fac.LOTRFactionRelations; +import net.minecraft.entity.*; +import net.minecraft.entity.ai.attributes.AttributeModifier; +import net.minecraft.entity.ai.attributes.IAttributeInstance; +import net.minecraft.entity.passive.EntityAnimal; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumAction; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.UUID; + + +public class Ulukai extends Item { + private static final String ULUKAI_TAG = "UlukaiModifiers"; + LOTRFaction gundabad = LOTRFaction.valueOf(CinderLoE_Config.ulukai_faction); + + public Ulukai() { + super(); + this.setCreativeTab(LoECreativeTabs.tabCharacterLoE); + } + + public int getMaxItemUseDuration(ItemStack itemstack) { + return 400; + } //20 second usage before it spawns anything + + public EnumAction getItemUseAction(ItemStack itemstack) { + return EnumAction.bow; + } + + public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer) { + entityplayer.setItemInUse(itemstack, getMaxItemUseDuration(itemstack)); + return itemstack; + } + + @Override + public ItemStack onEaten(ItemStack stack, World world, EntityPlayer player) { + if (!world.isRemote) { + if (isAreaCrowded(world, player)) { + world.playSoundAtEntity(player, "lotr:item.puff", 1.0F, 2.0F); + } else { + for (int i = 0; i < 5; i++) { + BlockPos spawnPos = BlockPos.findSafeSpawnLocation(world, player); + if (spawnPos != null) { + spawnRandomGundabad(world, spawnPos); + } + } + + world.playSoundAtEntity(player, "lotr:dwarf.kill", 2.0F, + (Item.itemRand.nextFloat() - Item.itemRand.nextFloat()) * 0.1F + 0.5F); + } + } + + return stack; + } + + + + public boolean isAreaCrowded(World world, EntityPlayer player) { + int radius = 30; // Check within 30 blocks + int maxEntities = 50; // Maximum allowed nearby entities + + AxisAlignedBB checkArea = AxisAlignedBB.getBoundingBox( + player.posX - radius, player.posY - radius, player.posZ - radius, + player.posX + radius, player.posY + radius, player.posZ + radius + ); + + List nearbyNpcs = world.getEntitiesWithinAABB(LOTREntityNPC.class, checkArea); + int gundabadCount = 0; + for (LOTREntityNPC npc : nearbyNpcs) { + LOTRFaction faction = LOTRMod.getNPCFaction(npc); + if (faction == gundabad) { + gundabadCount++; + } + } + return gundabadCount >= maxEntities; + } + + + @Override + public void onUsingTick(ItemStack stack, EntityPlayer player, int count) { + if (player.worldObj.isRemote) return; + + int ticksUsed = getMaxItemUseDuration(stack) - count; + + // Avoid triggering at tick 0 + if (ticksUsed > 0 && ticksUsed % 20 == 0) { + applyAllyHealing(player.worldObj, player); + } + + if (ticksUsed > 0 && ticksUsed % 200 == 0) { + applyEnemyMaxHealthReduction(player.worldObj, player); + } + } + + public void spawnRandomGundabad(World world, BlockPos location) { + Random rand = new Random(); + int choice = rand.nextInt(7); // 0 to 6 + + EntityLiving entity; + + switch (choice) { + case 0: + entity = new LOTREntityGundabadOrc(world); + break; + case 1: + entity = new LOTREntityGundabadOrcArcher(world); + break; + case 2: + entity = new LOTREntityGundabadWarg(world); + break; + case 3: + entity = new LOTREntityGundabadUruk(world); + break; + case 4: + entity = new LOTREntityGundabadUrukArcher(world); + break; + case 5: + entity = new LOTREntityGundabadBannerBearer(world); + break; + case 6: + entity = new NorthernOrc(world); + break; + default: + entity = new LOTREntityGundabadOrc(world); + break; + } + + entity.setPosition(location.x + 0.5, location.y, location.z + 0.5); // Center the entity on the block + entity.onSpawnWithEgg((IEntityLivingData) null); + world.spawnEntityInWorld(entity); + } + + + private void applyEnemyMaxHealthReduction(World world, EntityPlayer player) { + LOTRFaction gundabad = LOTRFaction.GUNDABAD; + + List nearbyEntities = world.getEntitiesWithinAABB( + EntityLivingBase.class, player.boundingBox.expand(10.0D, 10.0D, 10.0D)); + + for (EntityLivingBase target : nearbyEntities) { + if (target == player || target instanceof EntityPlayer) continue; + + if (target instanceof LOTREntityNPC) { + LOTRFaction targetFaction = LOTRMod.getNPCFaction((LOTREntityNPC) target); + if (targetFaction != null) { + LOTRFactionRelations.Relation relation = LOTRFactionRelations.getRelations(gundabad, targetFaction); + + if (relation == LOTRFactionRelations.Relation.ENEMY || relation == LOTRFactionRelations.Relation.MORTAL_ENEMY) { + IAttributeInstance attribute = target.getEntityAttribute(SharedMonsterAttributes.maxHealth); + double currentMax = attribute.getAttributeValue(); + double newMax = currentMax - 1.0D; + + if (newMax >= 10.0D) { + AttributeModifier mod = new AttributeModifier(UUID.randomUUID(), "Ulukai Curse", -1.0D, 0); + attribute.applyModifier(mod); + + // Save UUID + timestamp + NBTTagCompound data = target.getEntityData(); + NBTTagList list = data.getTagList(ULUKAI_TAG, 10); // 10 = compound + + NBTTagCompound entry = new NBTTagCompound(); + entry.setString("UUID", mod.getID().toString()); + entry.setLong("AppliedAt", player.ticksExisted); // or use world.getTotalWorldTime() + + list.appendTag(entry); + data.setTag(ULUKAI_TAG, list); + System.out.println("Ulukai Curse applied to: " + target.getCommandSenderName() + + " UUID=" + mod.getID() + " Tick=" + player.ticksExisted); + + world.playSoundAtEntity(player, "lotr:wraith.marshWraith_shoot", 1F,1F); + + for(int l = 0; l < 16; ++l) { + LOTRMod.proxy.spawnParticle("morgulPortal", + target.posX, target.posY + 1.0D, target.posZ, + 0.0D, 0.02D, 0.0D); + } + } + } + } + } + } + } + + + + private void applyAllyHealing(World world, EntityPlayer player) { + + List nearbyEntities = world.getEntitiesWithinAABB( + EntityLivingBase.class, player.boundingBox.expand(10.0D, 10.0D, 10.0D)); + + List validTargets = new ArrayList<>(); + + for (EntityLivingBase target : nearbyEntities) { + if (target == player || target instanceof EntityPlayer) continue; + + if (target instanceof LOTREntityNPC) { + LOTRFaction targetFaction = LOTRMod.getNPCFaction((LOTREntityNPC) target); + if (targetFaction == gundabad && target.getHealth() < target.getMaxHealth()) { + validTargets.add(target); + } + } + } + + // Heal a random wounded ally, if any exist + if (!validTargets.isEmpty()) { + EntityLivingBase toHeal = validTargets.get(world.rand.nextInt(validTargets.size())); + toHeal.heal(1.0F); // 0.5 heart + world.playSoundAtEntity(toHeal, "mob.zombie.unfect", 0.25F,1F); + + for(int l = 0; l < 8; ++l) { + LOTRMod.proxy.spawnParticle("heart", + toHeal.posX, toHeal.posY + 1.0D, toHeal.posZ, + 0.0D, 0.02D, 0.0D); + } + + } else { + // Fizzle + world.playSoundAtEntity(player, "lotr:swan.hiss", 0.1F, 0.1F + world.rand.nextFloat() * 0.5F); + } + } + + + public static void removeExpiredUlukaiModifiers(EntityLivingBase entity, long currentTick) { + IAttributeInstance attr = entity.getEntityAttribute(SharedMonsterAttributes.maxHealth); + NBTTagCompound data = entity.getEntityData(); + NBTTagList oldList = data.getTagList(ULUKAI_TAG, 10); // 10 = compound tag + NBTTagList newList = new NBTTagList(); + + for (int i = 0; i < oldList.tagCount(); i++) { + NBTTagCompound entry = oldList.getCompoundTagAt(i); + long applied = entry.getLong("AppliedAt"); + String uuidStr = entry.getString("UUID"); + + if (currentTick - applied >= 72000L) { // 1 hour in ticks + try { + UUID uuid = UUID.fromString(uuidStr); + AttributeModifier mod = attr.getModifier(uuid); + if (mod != null) { + attr.removeModifier(mod); + System.out.println("Ulukai Curse expired: " + entity.getCommandSenderName() + + " UUID=" + uuid + " Tick=" + currentTick); + } + } catch (IllegalArgumentException e) { + // Invalid UUID format — skip + } + } else { + newList.appendTag(entry); // Keep active ones + } + } + + data.setTag(ULUKAI_TAG, newList); + } + + +} \ No newline at end of file diff --git a/src/main/java/com/zivilon/cinder_loe/items/UnnamedSpear.java b/src/main/java/com/zivilon/cinder_loe/items/specials/UnnamedSpear.java similarity index 94% rename from src/main/java/com/zivilon/cinder_loe/items/UnnamedSpear.java rename to src/main/java/com/zivilon/cinder_loe/items/specials/UnnamedSpear.java index 877da04..fc971c3 100644 --- a/src/main/java/com/zivilon/cinder_loe/items/UnnamedSpear.java +++ b/src/main/java/com/zivilon/cinder_loe/items/specials/UnnamedSpear.java @@ -1,7 +1,6 @@ -package com.zivilon.cinder_loe.items; +package com.zivilon.cinder_loe.items.specials; import lotr.common.item.LOTRItemSpear; -import lotr.common.item.LOTRItemSword; import lotr.common.item.LOTRMaterial; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/com/zivilon/cinder_loe/items/VoidDagger.java b/src/main/java/com/zivilon/cinder_loe/items/specials/VoidDagger.java similarity index 94% rename from src/main/java/com/zivilon/cinder_loe/items/VoidDagger.java rename to src/main/java/com/zivilon/cinder_loe/items/specials/VoidDagger.java index 96f7c06..595e54c 100644 --- a/src/main/java/com/zivilon/cinder_loe/items/VoidDagger.java +++ b/src/main/java/com/zivilon/cinder_loe/items/specials/VoidDagger.java @@ -1,27 +1,17 @@ -package com.zivilon.cinder_loe.items; +package com.zivilon.cinder_loe.items.specials; import com.zivilon.cinder_loe.entity.corrupt.*; import lotr.common.LOTRLevelData; import lotr.common.entity.npc.*; import lotr.common.fac.LOTRFaction; import lotr.common.item.LOTRItemDagger; -import lotr.common.item.LOTRItemSword; import lotr.common.item.LOTRMaterial; -import lotr.common.item.LOTRWeaponStats; -import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.IEntityLivingData; -import net.minecraft.entity.monster.EntityZombie; -import net.minecraft.entity.passive.EntityVillager; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.item.EnumAction; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; -import net.minecraft.world.EnumDifficulty; -import net.minecraft.world.World; public class VoidDagger extends LOTRItemDagger { public VoidDagger(LOTRMaterial material) { diff --git a/src/main/java/com/zivilon/cinder_loe/items/WoodElfRelic.java b/src/main/java/com/zivilon/cinder_loe/items/specials/WoodElfRelic.java similarity index 94% rename from src/main/java/com/zivilon/cinder_loe/items/WoodElfRelic.java rename to src/main/java/com/zivilon/cinder_loe/items/specials/WoodElfRelic.java index 60e0fe1..44c1cd9 100644 --- a/src/main/java/com/zivilon/cinder_loe/items/WoodElfRelic.java +++ b/src/main/java/com/zivilon/cinder_loe/items/specials/WoodElfRelic.java @@ -1,12 +1,10 @@ -package com.zivilon.cinder_loe.items; +package com.zivilon.cinder_loe.items.specials; -import com.zivilon.cinder_loe.CinderLoE; +import com.zivilon.cinder_loe.items.WizardStaff; import cpw.mods.fml.common.network.simpleimpl.IMessage; import lotr.common.LOTRLevelData; import lotr.common.LOTRMod; import lotr.common.fac.LOTRFaction; -import lotr.common.item.LOTRItemSword; -import lotr.common.item.LOTRStoryItem; import lotr.common.network.LOTRPacketHandler; import lotr.common.network.LOTRPacketWeaponFX; import net.minecraft.entity.Entity; diff --git a/src/main/java/com/zivilon/cinder_loe/world/event/UlukaiCurseHandler.java b/src/main/java/com/zivilon/cinder_loe/world/event/UlukaiCurseHandler.java new file mode 100644 index 0000000..2640251 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/world/event/UlukaiCurseHandler.java @@ -0,0 +1,38 @@ +package com.zivilon.cinder_loe.world.event; + +import com.zivilon.cinder_loe.items.specials.Ulukai; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.gameevent.TickEvent; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.world.World; +import net.minecraftforge.common.DimensionManager; + +public class UlukaiCurseHandler { + private int tickCounter = 0; + public static final int INTERVAL_TICKS = 72000; // 1 hour ~~10 minutes at 20 TPS~~ + + @SubscribeEvent + public void onServerTick(TickEvent.ServerTickEvent event) { + if (event.phase == TickEvent.Phase.END) { + tickCounter++; + if (tickCounter >= INTERVAL_TICKS) { + tickCounter = 0; + runUlukaiCleanup(); + } + } + } + + private void runUlukaiCleanup() { + for (World world : DimensionManager.getWorlds()) { + if (world == null || world.isRemote) continue; + + for (Object obj : world.loadedEntityList) { + if (obj instanceof EntityLivingBase entity && + entity.getEntityData().hasKey("UlukaiModifiers")) { + + Ulukai.removeExpiredUlukaiModifiers(entity, world.getTotalWorldTime()); + } + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cinder_loe/lang/en_US.lang b/src/main/resources/assets/cinder_loe/lang/en_US.lang index c1ec776..74f2695 100644 --- a/src/main/resources/assets/cinder_loe/lang/en_US.lang +++ b/src/main/resources/assets/cinder_loe/lang/en_US.lang @@ -105,6 +105,7 @@ item.lotr:sarumanStaff.name=Staff of Saruman of Many Colors item.lotr:sarumanWhiteStaff.name=Staff of Saruman the White item.lotr:welfRelic.name=Horn of the Greenwood Stag +item.lotr:ulukai.name=Ulûkai item.lotr:onion.name=Onion item.lotr:cabbage.name=Cabbage diff --git a/src/main/resources/assets/lotr/textures/items/ingotAsh.png b/src/main/resources/assets/lotr/textures/items/ingotAsh.png index c2b118e89d0cf1c30b1d745696b2ce970254e6ad..1af431e23b0e3ce8ec8e248ebcb257f3642ad292 100644 GIT binary patch delta 125 zcmZ2r@J3*QN(5tZkh>G(&67Iy3=9k`>5jgR3=A9lx&I`x0{IHb9znhg3{`3j3=J&| z48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!ItFh?!utPpuymtsj_IpWHA9bu9qzQ bOwzn9^`@qq?F9C-b250k`njxgN@xNAI9?#& literal 6176 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/items/ulukai.png.mcmeta b/src/main/resources/assets/lotr/textures/items/ulukai.png.mcmeta new file mode 100644 index 0000000..49e167b --- /dev/null +++ b/src/main/resources/assets/lotr/textures/items/ulukai.png.mcmeta @@ -0,0 +1,50 @@ +{ + "animation": { + "frames": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 2, + 2, + 2, + 3, + 3, + 3, + 4, + 4, + 4, + 3, + 3, + 3, + 2, + 2, + 2, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ] + } +}