From 8aedbdfc5e28df8c8228fc2aeb14ede5f3c75d1d Mon Sep 17 00:00:00 2001 From: KeyLime17 Date: Thu, 26 Jun 2025 14:43:38 -0400 Subject: [PATCH] Mouth of Sauron ability created --- .../cinder_loe/CinderEventHandler.java | 201 ++++++++++-------- .../com/zivilon/cinder_loe/CinderLoE.java | 2 +- .../client/model/ModelBodyDorwinionElite.java | 96 +++++++++ .../model/ModelDorwinionChestplate.java | 112 ---------- .../coremod/LOTRMaterialTransformer.java | 1 + .../items/specials/MouthOfSauronWeapon.java | 69 ++++++ .../mixins/MixinLOTRArmorModels.java | 1 + .../mixins/MixinLOTREnchantment.java | 3 +- .../java/com/zivilon/cinder_loe/recipes.java | 6 +- .../assets/cinder_loe/lang/en_US.lang | 40 +++- .../assets/lotr/armor/dorwinionelite_1.png | Bin 1047 -> 0 bytes .../assets/lotr/armor/dorwinionelite_2.png | Bin 729 -> 700 bytes .../lotr/armor/dorwinionelite_chestplate.png | Bin 1692 -> 2232 bytes .../lotr/armor/dorwinionelite_helmet.png | Bin 1706 -> 0 bytes .../textures/items/bodyDorwinionElite.png | Bin 473 -> 344 bytes .../lotr/textures/items/bodyIsildur.png | Bin 0 -> 638 bytes .../textures/items/bootsDorwinionElite.png | Bin 303 -> 251 bytes .../textures/items/helmetDorwinionElite.png | Bin 421 -> 313 bytes .../textures/items/legsDorwinionElite.png | Bin 352 -> 401 bytes 19 files changed, 325 insertions(+), 206 deletions(-) create mode 100644 src/main/java/com/zivilon/cinder_loe/client/model/ModelBodyDorwinionElite.java delete mode 100644 src/main/java/com/zivilon/cinder_loe/client/model/ModelDorwinionChestplate.java create mode 100644 src/main/java/com/zivilon/cinder_loe/items/specials/MouthOfSauronWeapon.java delete mode 100644 src/main/resources/assets/lotr/armor/dorwinionelite_1.png delete mode 100644 src/main/resources/assets/lotr/armor/dorwinionelite_helmet.png create mode 100644 src/main/resources/assets/lotr/textures/items/bodyIsildur.png diff --git a/src/main/java/com/zivilon/cinder_loe/CinderEventHandler.java b/src/main/java/com/zivilon/cinder_loe/CinderEventHandler.java index d5b2f37..922b504 100644 --- a/src/main/java/com/zivilon/cinder_loe/CinderEventHandler.java +++ b/src/main/java/com/zivilon/cinder_loe/CinderEventHandler.java @@ -10,6 +10,7 @@ import cpw.mods.fml.common.IFuelHandler; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.TickEvent; import cpw.mods.fml.common.registry.GameRegistry; +import lotr.common.LOTRLevelData; import lotr.common.LOTRMod; import lotr.common.LOTRDimension; import lotr.common.enchant.LOTREnchantment; @@ -18,6 +19,7 @@ import lotr.common.entity.item.LOTREntityArrowPoisoned; import lotr.common.entity.npc.LOTREntityOrc; import lotr.common.entity.projectile.LOTREntityCrossbowBolt; import lotr.common.entity.projectile.LOTREntityDart; +import lotr.common.fac.LOTRFaction; import lotr.common.item.*; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; @@ -99,56 +101,88 @@ public class CinderEventHandler implements IFuelHandler { @SubscribeEvent public void onLivingAttack(LivingAttackEvent event) { - - EntityLivingBase entity = event.entityLiving; - EntityLivingBase attacker = event.source.getEntity() instanceof EntityLivingBase ? (EntityLivingBase)event.source.getEntity() : null; - World world = entity.worldObj; if (event.entityLiving.worldObj.isRemote) return; + EntityLivingBase target = event.entityLiving; if (event.source instanceof EntityDamageSourceIndirect) { - Entity projectile = event.source.getSourceOfDamage(); - if (projectile instanceof EntityArrow || projectile instanceof LOTREntityCrossbowBolt || projectile instanceof LOTREntityDart) { - boolean wearingAllGalvorn = true; - for (int i = 0; i < 4; ++i) { - ItemStack armour = entity.getEquipmentInSlot(i + 1); - if (armour != null && armour.getItem() instanceof ItemArmor && ((ItemArmor)armour.getItem()).getArmorMaterial() == CinderLoE.MATERIAL_GILDEDGALVORN.toArmorMaterial()) continue; - wearingAllGalvorn = false; - break; - } - if (wearingAllGalvorn) { - if (!world.isRemote && entity instanceof EntityPlayer) { - ((EntityPlayer)entity).inventory.damageArmor(event.ammount); + Entity proj = event.source.getSourceOfDamage(); + if (proj instanceof EntityArrow + || proj instanceof LOTREntityCrossbowBolt + || proj instanceof LOTREntityDart) { + boolean allGalvorn = true; + for (int slot = 1; slot <= 4; slot++) { + ItemStack armor = target.getEquipmentInSlot(slot); + if (armor == null + || !(armor.getItem() instanceof ItemArmor) + || ((ItemArmor)armor.getItem()).getArmorMaterial() + != CinderLoE.MATERIAL_GILDEDGALVORN.toArmorMaterial()) { + allGalvorn = false; + break; } - this.cancelAttackEvent(event); } + if (allGalvorn && target instanceof EntityPlayerMP) { + ((EntityPlayerMP)target).inventory.damageArmor(event.ammount); + cancelAttackEvent(event); + return; + } + } + } + + Entity rawAttacker = event.source.getEntity(); + + if (!(rawAttacker instanceof EntityPlayerMP)) return; + EntityPlayerMP player = (EntityPlayerMP) rawAttacker; + + ItemStack held = player.getHeldItem(); + if (held != null) { + if (held.getItem() == LOTRMod.maceMallornCharred + && LOTRLevelData.getData(player).getAlignment(LOTRFaction.FANGORN) > 0) { + player.addPotionEffect(new PotionEffect(Potion.weakness.id, 100)); + String msg = EnumChatFormatting.RED + + "Your hand grows weak the " + + EnumChatFormatting.YELLOW + + "Ents of Fangorn" + + EnumChatFormatting.RED + + " do not forgive you!"; + player.addChatMessage(new ChatComponentText(msg)); + player.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "You must have negative Fangorn alignment.")); + } else if (held.getItem() == LOTRMod.swordGondolin + && LOTRLevelData.getData(player).getAlignment(LOTRFaction.ANGMAR) > 0) { + player.addPotionEffect(new PotionEffect(Potion.weakness.id, 100)); + String msg = EnumChatFormatting.RED + + "Your hand grows weak the " + + EnumChatFormatting.YELLOW + + "Gondolininian spirits" + + EnumChatFormatting.RED + + " do not forgive you!"; + player.addChatMessage(new ChatComponentText(msg)); + player.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "You must have negative Angmar alignment.")); } } - if (!(attacker instanceof EntityPlayerMP player)) return; - - ItemStack weapon = player.getHeldItem(); - if (weapon == null) return; - boolean isMelee = weapon.getItem() instanceof LOTRItemSpear - || weapon.getItem() instanceof LOTRItemSword - || weapon.getItem() instanceof LOTRItemDagger - || weapon.getItem() instanceof LOTRItemBattleaxe - || weapon.getItem() instanceof LOTRItemHammer - || weapon.getItem() instanceof ItemSword; - if (!isMelee || !weapon.isItemStackDamageable()) return; - - float[] durabilityThresholds = {0.5f, 0.4f, 0.25f}; - double[] probabilities = {0.0005, 0.001, 0.005}; - - float durabilityPercent = (weapon.getMaxDamage() - weapon.getItemDamage()) / (float)weapon.getMaxDamage(); - for (int i = 0; i < durabilityThresholds.length; i++) { - if (durabilityPercent <= durabilityThresholds[i]) { - if (random.nextDouble() <= probabilities[i]) { - addNegativeModifier(weapon, player, "weapon"); + + + if (held != null) { + boolean isMelee = held.getItem() instanceof LOTRItemSpear + || held.getItem() instanceof LOTRItemSword + || held.getItem() instanceof LOTRItemDagger + || held.getItem() instanceof LOTRItemBattleaxe + || held.getItem() instanceof LOTRItemHammer + || held.getItem() instanceof ItemSword; + if (isMelee && held.isItemStackDamageable()) { + float pct = (held.getMaxDamage() - held.getItemDamage()) / (float) held.getMaxDamage(); + float[] thresholds = {0.5f, 0.4f, 0.25f}; + double[] probs = {0.0005, 0.001, 0.005}; + for (int i = 0; i < thresholds.length; i++) { + if (pct <= thresholds[i] && random.nextDouble() <= probs[i]) { + addNegativeModifier(held, player, "weapon"); + break; + } } - break; } } } + private void cancelAttackEvent(LivingAttackEvent event) { event.setCanceled(true); DamageSource source = event.source; @@ -159,15 +193,15 @@ public class CinderEventHandler implements IFuelHandler { @SubscribeEvent public void onLivingHurt(LivingHurtEvent event) { - if (event.entityLiving == null || event.source.getEntity() == null) { - return; - } + if (event.entityLiving == null || event.source.getEntity() == null) return; EntityLivingBase entity = event.entityLiving; EntityLivingBase attacker = event.source.getEntity() instanceof EntityLivingBase ? (EntityLivingBase) event.source.getEntity() : null; World world = entity.worldObj; DamageSource source = event.source; + + if (event.source.getSourceOfDamage() instanceof LOTREntityArrowPoisoned && !world.isRemote) { LOTREntityArrowPoisoned arrow = (LOTREntityArrowPoisoned) event.source.getSourceOfDamage(); Entity shooter = arrow.shootingEntity; @@ -188,7 +222,6 @@ public class CinderEventHandler implements IFuelHandler { // Negative Arrow Protection Handler if (!event.entityLiving.worldObj.isRemote && event.source.isProjectile() && event.entityLiving instanceof EntityPlayerMP player) { - // player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "DEBUG: Initial Damage: " + event.ammount)); float totalAdditionalDamage = 0.0f; // Initialize total additional damage @@ -221,57 +254,37 @@ public class CinderEventHandler implements IFuelHandler { event.ammount = player.getHealth(); // Ensure player dies if health reaches 0 or below } - // player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "DEBUG: Total Additional Damage: " + newDamage)); } } - // Broken Halo Event handler - if (attacker != null && event.source.getSourceOfDamage() == attacker) { - ItemStack helmet = entity.getEquipmentInSlot(4); - if (helmet != null && helmet.getItem() instanceof BrokenHalo) { - - if (random.nextDouble() <= 0.25) { - // Summon Corrupt Civilian NPC - CorruptMan spawnedEntity = new CorruptMan(world); - spawnedEntity.copyLocationAndAnglesFrom(attacker); - - // Randomly select main weapon - ItemStack mainWeapon = getRandomWeapon(); - spawnedEntity.npcItemsInv.setIdleItem(mainWeapon); - spawnedEntity.npcItemsInv.setMeleeWeapon(mainWeapon); - spawnedEntity.setHealth(10); - spawnedEntity.addPotionEffect(new PotionEffect(Potion.regeneration.id, 9999, 0)); - - spawnedEntity.onSpawnWithEgg(null); - world.spawnEntityInWorld(spawnedEntity); - world.playAuxSFXAtEntity(null, 1016, (int) spawnedEntity.posX, (int) spawnedEntity.posY, (int) spawnedEntity.posZ, 0); - world.playSoundAtEntity(entity, "mob.zombie.unfect", 1F, 1F); - - } - } - } + // Broken Halo Event handler, Unused, deprecated until the halo has a new usage +// if (attacker != null && event.source.getSourceOfDamage() == attacker) { +// ItemStack helmet = entity.getEquipmentInSlot(4); +// if (helmet != null && helmet.getItem() instanceof BrokenHalo) { +// +// if (random.nextDouble() <= 0.25) { +// // Summon Corrupt Civilian NPC +// CorruptMan spawnedEntity = new CorruptMan(world); +// spawnedEntity.copyLocationAndAnglesFrom(attacker); +// +// // Randomly select main weapon +// ItemStack mainWeapon = getRandomWeapon(); +// spawnedEntity.npcItemsInv.setIdleItem(mainWeapon); +// spawnedEntity.npcItemsInv.setMeleeWeapon(mainWeapon); +// spawnedEntity.setHealth(10); +// spawnedEntity.addPotionEffect(new PotionEffect(Potion.regeneration.id, 9999, 0)); +// +// spawnedEntity.onSpawnWithEgg(null); +// world.spawnEntityInWorld(spawnedEntity); +// world.playAuxSFXAtEntity(null, 1016, (int) spawnedEntity.posX, (int) spawnedEntity.posY, (int) spawnedEntity.posZ, 0); +// world.playSoundAtEntity(entity, "mob.zombie.unfect", 1F, 1F); +// +// } +// } +// } // Smithing Rework event handler - //Removed, there is a handler for when you already attack, this is redundant - /*if (attacker instanceof EntityPlayerMP player) { - ItemStack weapon = player.getHeldItem(); - // smithing rework for melee - if (weapon !=null && (weapon.getItem() instanceof LOTRItemSpear || weapon.getItem() instanceof LOTRItemSword || weapon.getItem() instanceof LOTRItemDagger || weapon.getItem() instanceof LOTRItemBattleaxe || weapon.getItem() instanceof LOTRItemHammer || weapon.getItem() instanceof ItemSword)) { - float[] durabilityThresholds = {0.6f, 0.5f, 0.4f}; - double[] probabilities = {0.02, 0.05, 0.1}; - - if (weapon.isItemStackDamageable()) { - float durabilityPercent = (float) (weapon.getMaxDamage() - weapon.getItemDamage() / weapon.getMaxDamage()); - for (int j = 0; j < durabilityThresholds.length; j++) { - if (durabilityPercent <= durabilityThresholds[j] && random.nextDouble() <= probabilities[j]) { - addNegativeModifier(weapon, player, "weapon"); - break; // Exit loop once a modifier is added - } - } - } - } - }*/ if (entity instanceof EntityPlayerMP player) { // Durability thresholds and corresponding probabilities for adding a negative modifier @@ -298,6 +311,20 @@ public class CinderEventHandler implements IFuelHandler { } } + + // Isildurs chestplate handler + // Incoming damage from poison, drink poison (for lurtz bow, rip anyone who drinks a bad drink), or wither is doubled + + EntityPlayerMP player = (EntityPlayerMP) event.entityLiving; + ItemStack chest = player.getEquipmentInSlot(2); + if (chest == null || chest.getItem() != CinderLoE.bodyIsildur) return; + + boolean isPoison = player.isPotionActive(Potion.poison.id); + boolean isPoisonedDrink = player.isPotionActive(LOTRPoisonedDrinks.killingPoison.id); + boolean isWitherDamage = event.source == DamageSource.wither; + if (isPoisonedDrink || isWitherDamage || isPoison) { + event.ammount *= 2.0F; + } } private void sendNegativeModifierMessage(EntityPlayerMP player, String type) { diff --git a/src/main/java/com/zivilon/cinder_loe/CinderLoE.java b/src/main/java/com/zivilon/cinder_loe/CinderLoE.java index 9b5c219..58abc11 100644 --- a/src/main/java/com/zivilon/cinder_loe/CinderLoE.java +++ b/src/main/java/com/zivilon/cinder_loe/CinderLoE.java @@ -1068,7 +1068,7 @@ public class CinderLoE { MATERIAL_DORWINIONELITE = getLOTRMaterialByName("DORWINIONELITE"); if (MATERIAL_DORWINIONELITE != null) { helmetDorwinionElite = (new LoEArmor(MATERIAL_DORWINIONELITE, 0, "helmet", LOTRMod.elfSteel)).setUnlocalizedName("lotr:helmetDorwinionElite").setTextureName("lotr:helmetDorwinionElite").setCreativeTab(null); - bodyDorwinionElite = (new LoEArmor(MATERIAL_DORWINIONELITE, 1, LOTRMod.elfSteel)).setUnlocalizedName("lotr:bodyDorwinionElite").setTextureName("lotr:bodyDorwinionElite").setCreativeTab(null); + bodyDorwinionElite = (new LoEArmor(MATERIAL_DORWINIONELITE, 1, "chestplate", LOTRMod.elfSteel)).setUnlocalizedName("lotr:bodyDorwinionElite").setTextureName("lotr:bodyDorwinionElite").setCreativeTab(null); legsDorwinionElite = (new LoEArmor(MATERIAL_DORWINIONELITE, 2, LOTRMod.elfSteel)).setUnlocalizedName("lotr:legsDorwinionElite").setTextureName("lotr:legsDorwinionElite").setCreativeTab(null); bootsDorwinionElite = (new LoEArmor(MATERIAL_DORWINIONELITE, 3, LOTRMod.elfSteel)).setUnlocalizedName("lotr:bootsDorwinionElite").setTextureName("lotr:bootsDorwinionElite").setCreativeTab(null); diff --git a/src/main/java/com/zivilon/cinder_loe/client/model/ModelBodyDorwinionElite.java b/src/main/java/com/zivilon/cinder_loe/client/model/ModelBodyDorwinionElite.java new file mode 100644 index 0000000..27e6f1a --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/client/model/ModelBodyDorwinionElite.java @@ -0,0 +1,96 @@ +package com.zivilon.cinder_loe.client.model; + +import lotr.client.model.LOTRModelBiped; +import net.minecraft.client.model.ModelBox; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +// Made with Blockbench 4.12.5 +// Exported for Minecraft version 1.7 - 1.12 +// Paste this class into your mod and generate all required imports + +public class ModelBodyDorwinionElite extends LOTRModelBiped { + public ModelRenderer Body; + public ModelRenderer Backplate; + public ModelRenderer FrontPlate; + public ModelRenderer LeftArm; + public ModelRenderer PauldronLeft; + public ModelRenderer PauldronTopperLeft; + public ModelRenderer RightArm; + public ModelRenderer PauldronRight; + public ModelRenderer PauldronTopperRight; + + public ModelBodyDorwinionElite(float f) { + textureWidth = 64; + textureHeight = 64; + this.bipedBody.cubeList.clear(); + this.bipedRightArm.cubeList.clear(); + this.bipedLeftArm.cubeList.clear(); + this.bipedHead.cubeList.clear(); + this.bipedHeadwear.cubeList.clear(); + this.bipedRightLeg.cubeList.clear(); + this.bipedLeftLeg.cubeList.clear(); + + Body = new ModelRenderer(this); + Body.setRotationPoint(0.0F, 0.0F, 0.0F); + bipedBody.addChild(Body); + Body.cubeList.add(new ModelBox(Body, 0, 16, -4.0F, 0.0F, -2.0F, 8, 12, 4, 0.5F)); + + Backplate = new ModelRenderer(this); + Backplate.setRotationPoint(0.0F, 0.0F, 0.0F); + bipedBody.addChild(Backplate); + Backplate.cubeList.add(new ModelBox(Backplate, 22, 4, -5.0F, -1.05F, 2.8F, 10, 8, 0, 0.0F)); + + FrontPlate = new ModelRenderer(this); + FrontPlate.setRotationPoint(0.0F, 0.0F, 0.0F); + bipedBody.addChild(FrontPlate); + FrontPlate.cubeList.add(new ModelBox(FrontPlate, 32, 4, -5.0F, -1.05F, -2.8F, 10, 8, 0, 0.0F)); + + LeftArm = new ModelRenderer(this); + LeftArm.setRotationPoint(-1.0F, -2.0F, -2.0F); + bipedLeftArm.addChild(LeftArm); + LeftArm.cubeList.add(new ModelBox(LeftArm, 25, 35, 0.0F, 0.0F, 0.0F, 4, 12, 4, 0.5F)); + + PauldronLeft = new ModelRenderer(this); + PauldronLeft.setRotationPoint(0.0F, 0.0F, 0.0F); + LeftArm.addChild(PauldronLeft); + setRotationAngle(PauldronLeft, 0.0F, 0.0F, 0.0873F); + PauldronLeft.cubeList.add(new ModelBox(PauldronLeft, 40, 47, -0.5F, -1.4F, -1.0F, 6, 6, 6, 0.0F)); + + PauldronTopperLeft = new ModelRenderer(this); + PauldronTopperLeft.setRotationPoint(0.0F, 0.0F, 0.0F); + LeftArm.addChild(PauldronTopperLeft); + setRotationAngle(PauldronTopperLeft, 0.0F, 0.0F, 0.0873F); + PauldronTopperLeft.cubeList.add(new ModelBox(PauldronTopperLeft, 48, 8, 0.5F, -3.4F, -2.0F, 0, 4, 8, 0.0F)); + + RightArm = new ModelRenderer(this); + RightArm.setRotationPoint(-1.0F, -2.0F, -2.0F); + bipedRightArm.addChild(RightArm); + RightArm.cubeList.add(new ModelBox(RightArm, 24, 16, -2.0F, 0.0F, 0.0F, 4, 12, 4, 0.5F)); + + PauldronRight = new ModelRenderer(this); + PauldronRight.setRotationPoint(0.0F, 0.0F, 0.0F); + RightArm.addChild(PauldronRight); + setRotationAngle(PauldronRight, 0.0F, 0.0F, -0.0873F); + PauldronRight.cubeList.add(new ModelBox(PauldronRight, 40, 20, -3.5F, -1.4F, -1.0F, 6, 6, 6, 0.0F)); + + PauldronTopperRight = new ModelRenderer(this); + PauldronTopperRight.setRotationPoint(0.0F, 0.0F, 0.0F); + RightArm.addChild(PauldronTopperRight); + setRotationAngle(PauldronTopperRight, 0.0F, 0.0F, -0.0873F); + PauldronTopperRight.cubeList.add(new ModelBox(PauldronTopperRight, 48, 8, 1.5F, -3.4F, -2.0F, 0, 4, 8, 0.0F)); + } + + @Override + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + this.bipedBody.render(f5); + this.bipedLeftArm.render(f5); + this.bipedRightArm.render(f5); + } + + public void setRotationAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/client/model/ModelDorwinionChestplate.java b/src/main/java/com/zivilon/cinder_loe/client/model/ModelDorwinionChestplate.java deleted file mode 100644 index 597169f..0000000 --- a/src/main/java/com/zivilon/cinder_loe/client/model/ModelDorwinionChestplate.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.zivilon.cinder_loe.client.model;// Made with Blockbench 4.12.4 -// Exported for Minecraft version 1.7 - 1.12 -// Paste this class into your mod and generate all required imports - - -import lotr.client.model.LOTRModelBiped; -import net.minecraft.client.model.ModelBox; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; - -//====================================================== -//Deprecated -//====================================================== - - -public class ModelDorwinionChestplate extends LOTRModelBiped { -// private final ModelRenderer bipedRightArm_r1; -// private final ModelRenderer BLOODGUARDPAULDRONRIGHTTOPPER_r1; -// private final ModelRenderer BLOODGUARDPAULDRONRIGHT_r1; -// private final ModelRenderer BLOODGUARDPAULDRONLEFT_r1; -// private final ModelRenderer BLOODGUARDPAULDRONLEFTTOPPER_r1; - - public ModelDorwinionChestplate(float f) { - super(f); - textureWidth = 64; - textureHeight = 64; - this.bipedBody.cubeList.clear(); - this.bipedRightArm.cubeList.clear(); - this.bipedLeftArm.cubeList.clear(); - - bipedBody = new ModelRenderer(this); - bipedBody.setRotationPoint(0.0F, 0.0F, 0.0F); - bipedBody.cubeList.add(new ModelBox(bipedBody, 0, 16, -4.0F, 0.0F, -2.0F, 8, 12, 4, 0.5F)); - bipedBody.cubeList.add(new ModelBox(bipedBody, 22, 4, -5.0F, -1.05F, 2.8F, 10, 8, 0, 0.0F)); - bipedBody.cubeList.add(new ModelBox(bipedBody, 32, 4, -5.0F, -1.05F, -2.8F, 10, 8, 0, 0.0F)); - - //bipedLeftArm = new ModelRenderer(this, 40, 16); - bipedLeftArm = new ModelRenderer(this, 24, 16); - this.bipedLeftArm.mirror = true; - this.bipedLeftArm.setRotationPoint(-5.0F, 2.0F, 0.0F); - //bipedLeftArm.cubeList.add(new ModelBox(bipedLeftArm, 24, 16, -9.0F, -24.0F, -2.0F, 4, 12, 4, 0.5F)); - this.bipedLeftArm.addBox(-9.0F, -24.0F, -2.0F, 4, 12, 4, 0.5F); - this.setRotationAngle(bipedLeftArm, 0.0F, 0.0F, 0.026354471705114374F); - - this.bipedRightArm = new ModelRenderer(this, 40, 16); - this.bipedRightArm.setRotationPoint(5.0F, 2.0F, 0.0F); - -// bipedRightArm = new ModelRenderer(this, 40, 16); -// bipedRightArm.setRotationPoint(5.0F, 2.0F, 0.0F); -// bipedRightArm.mirror = true; - -// bipedLeftArm = new ModelRenderer(this,40, 16); -// bipedLeftArm.setRotationPoint(0.0F, 24.0F, 0.0F); -// bipedLeftArm.cubeList.add(new ModelBox(bipedLeftArm, 24, 16, -9.0F, -24.0F, -2.0F, 4, 12, 4, 0.5F)); - -// -// bipedRightArm_r1 = new ModelRenderer(this); -// bipedRightArm_r1.setRotationPoint(-2.0F, 22.0F, 0.0F); -// -// setRotationAngle(bipedRightArm_r1, 0.0F, 3.1416F, 0.0F); -// bipedRightArm_r1.cubeList.add(new ModelBox(bipedRightArm_r1, 24, 16, -6.0F, -24.0F, -2.0F, 4, 12, 4, 0.5F)); -// -// BLOODGUARDPAULDRONRIGHTTOPPER_r1 = new ModelRenderer(this); -// BLOODGUARDPAULDRONRIGHTTOPPER_r1.setRotationPoint(2.0F, -1.0F, 3.0F); -// -// setRotationAngle(BLOODGUARDPAULDRONRIGHTTOPPER_r1, 0.0F, 3.1416F, 0.0873F); -// BLOODGUARDPAULDRONRIGHTTOPPER_r1.cubeList.add(new ModelBox(BLOODGUARDPAULDRONRIGHTTOPPER_r1, 48, 8, 1.6F, -3.9F, -1.0F, 0, 4, 8, 0.0F)); -// -// BLOODGUARDPAULDRONRIGHT_r1 = new ModelRenderer(this); -// BLOODGUARDPAULDRONRIGHT_r1.setRotationPoint(0.0F, 3.0F, 3.0F); -// -// setRotationAngle(BLOODGUARDPAULDRONRIGHT_r1, 0.0F, 3.1416F, 0.0873F); -// BLOODGUARDPAULDRONRIGHT_r1.cubeList.add(new ModelBox(BLOODGUARDPAULDRONRIGHT_r1, 40, 20, -5.0F, -6.0F, 0.0F, 6, 6, 6, 0.0F)); -// -// BLOODGUARDPAULDRONLEFT_r1 = new ModelRenderer(this); -// BLOODGUARDPAULDRONLEFT_r1.setRotationPoint(-5.0F, -19.0F, -3.0F); -// -// setRotationAngle(BLOODGUARDPAULDRONLEFT_r1, 0.0F, 0.0F, -0.0873F); -// BLOODGUARDPAULDRONLEFT_r1.cubeList.add(new ModelBox(BLOODGUARDPAULDRONLEFT_r1, 40, 20, -5.0F, -6.0F, 0.0F, 6, 6, 6, 0.0F)); -// -// BLOODGUARDPAULDRONLEFTTOPPER_r1 = new ModelRenderer(this); -// BLOODGUARDPAULDRONLEFTTOPPER_r1.setRotationPoint(-6.0F, -23.0F, -3.0F); -// -// setRotationAngle(BLOODGUARDPAULDRONLEFTTOPPER_r1, 0.0F, 0.0F, -0.0873F); -// BLOODGUARDPAULDRONLEFTTOPPER_r1.cubeList.add(new ModelBox(BLOODGUARDPAULDRONLEFTTOPPER_r1, 48, 8, 0.6F, -3.9F, -1.0F, 0, 4, 8, 0.0F)); -// -// -// bipedRightArm.addChild(BLOODGUARDPAULDRONRIGHTTOPPER_r1); -// bipedRightArm.addChild(bipedRightArm_r1); -// bipedLeftArm.addChild(BLOODGUARDPAULDRONLEFTTOPPER_r1); -// bipedLeftArm.addChild(BLOODGUARDPAULDRONLEFT_r1); -// bipedRightArm.addChild(BLOODGUARDPAULDRONRIGHT_r1); - - this.bipedHead.cubeList.clear(); - this.bipedHeadwear.cubeList.clear(); - this.bipedRightLeg.cubeList.clear(); - this.bipedLeftLeg.cubeList.clear(); - } - - @Override - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - bipedBody.render(f5); - bipedRightArm.render(f5); - bipedLeftArm.render(f5); - } - - public void setRotationAngle(ModelRenderer modelRenderer, float x, float y, float z) { - modelRenderer.rotateAngleX = x; - modelRenderer.rotateAngleY = y; - modelRenderer.rotateAngleZ = z; - } -} \ No newline at end of file diff --git a/src/main/java/com/zivilon/cinder_loe/coremod/LOTRMaterialTransformer.java b/src/main/java/com/zivilon/cinder_loe/coremod/LOTRMaterialTransformer.java index 3357fcf..3075901 100644 --- a/src/main/java/com/zivilon/cinder_loe/coremod/LOTRMaterialTransformer.java +++ b/src/main/java/com/zivilon/cinder_loe/coremod/LOTRMaterialTransformer.java @@ -52,6 +52,7 @@ public class LOTRMaterialTransformer implements IClassTransformer { // Custom modifyMaterial("UTUMNO", 1500, 0.7F, 3.5F, classNode); + modifyMaterial("GONDOLIN", 1500, 0.7F, 4.5F, classNode); addMaterial("RED_DWARF", classNode); addMaterial("WIZARD", classNode); diff --git a/src/main/java/com/zivilon/cinder_loe/items/specials/MouthOfSauronWeapon.java b/src/main/java/com/zivilon/cinder_loe/items/specials/MouthOfSauronWeapon.java new file mode 100644 index 0000000..2a04c64 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/items/specials/MouthOfSauronWeapon.java @@ -0,0 +1,69 @@ +package com.zivilon.cinder_loe.items.specials; + +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import lotr.common.LOTRLevelData; +import lotr.common.LOTRMod; +import lotr.common.entity.animal.LOTREntityHorse; +import lotr.common.fac.LOTRFaction; +import lotr.common.item.LOTRItemSword; +import lotr.common.item.LOTRMaterial; +import lotr.common.network.LOTRPacketHandler; +import lotr.common.network.LOTRPacketWeaponFX; +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.ItemStack; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; + +import java.util.List; + +public class MouthOfSauronWeapon extends LOTRItemSword { + + public MouthOfSauronWeapon() { + super(LOTRMaterial.MORDOR); + this.setMaxDamage(1500); + this.lotrWeaponDamage = 8.0f; + } + + public ItemStack onEaten(ItemStack itemstack, World world, EntityPlayer entityplayer) { + itemstack.damageItem(2, (EntityLivingBase)entityplayer); + return MouthOfSauronWeapon.useAbility(itemstack, world, (EntityLivingBase)entityplayer); + } + + public static ItemStack useAbility(ItemStack itemstack, World world, EntityLivingBase user) { + user.swingItem(); + world.playSoundAtEntity((Entity)user, "mob.wither.hurt", 2.0f, (itemRand.nextFloat() - itemRand.nextFloat()) * 0.2f + 1.0f); + if (!world.isRemote) { + List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, user.boundingBox.expand(12.0, 8.0, 12.0)); + if (!entities.isEmpty()) { + for (int i = 0; i < entities.size(); ++i) { + EntityLiving entityliving; + EntityLivingBase entity = (EntityLivingBase)entities.get(i); + if (entity == user || entity instanceof EntityLiving && LOTRFaction.MORDOR.isGoodRelation(LOTRMod.getNPCFaction((Entity)(entityliving = (EntityLiving)entity))) || entity instanceof EntityPlayer && (!(user instanceof EntityPlayer) ? user instanceof EntityLiving && ((EntityLiving)user).getAttackTarget() != entity && LOTRLevelData.getData((EntityPlayer)entity).getAlignment(LOTRFaction.MORDOR) > 0.0f : !MinecraftServer.getServer().isPVPEnabled() || LOTRLevelData.getData((EntityPlayer)entity).getAlignment(LOTRFaction.MORDOR) > 0.0f)) continue; + float strength = 6.0f - user.getDistanceToEntity((Entity)entity) * 0.75f; + if (strength < 1.0f) { + strength = 1.0f; + } + if (user instanceof EntityPlayer) { + entity.attackEntityFrom(DamageSource.causePlayerDamage((EntityPlayer)((EntityPlayer)user)), 6.0f * strength); + } else { + entity.attackEntityFrom(DamageSource.causeMobDamage((EntityLivingBase)user), 6.0f * strength); + } + float knockback = strength; + if (knockback > 4.0f) { + knockback = 4.0f; + } + if (!(entity instanceof LOTREntityHorse)) entity.addVelocity((double)(-MathHelper.sin((float)(user.rotationYaw * (float)Math.PI / 180.0f)) * 0.7f * knockback), 0.2 + 0.12 * (double)knockback, (double)(MathHelper.cos((float)(user.rotationYaw * (float)Math.PI / 180.0f)) * 0.7f * knockback)); + } + } + LOTRPacketWeaponFX packet = new LOTRPacketWeaponFX(LOTRPacketWeaponFX.Type.MACE_SAURON, (Entity)user); + LOTRPacketHandler.networkWrapper.sendToAllAround((IMessage)packet, LOTRPacketHandler.nearEntity((Entity)user, 64.0)); + } + return itemstack; + } + +} diff --git a/src/main/java/com/zivilon/cinder_loe/mixins/MixinLOTRArmorModels.java b/src/main/java/com/zivilon/cinder_loe/mixins/MixinLOTRArmorModels.java index 7fbe925..cfc8411 100644 --- a/src/main/java/com/zivilon/cinder_loe/mixins/MixinLOTRArmorModels.java +++ b/src/main/java/com/zivilon/cinder_loe/mixins/MixinLOTRArmorModels.java @@ -109,6 +109,7 @@ public class MixinLOTRArmorModels { map.put(LOTRMod.woodPlate, new LOTRModelHeadPlate()); map.put(LOTRMod.ceramicPlate, new LOTRModelHeadPlate()); map.put(CinderLoE.helmetDorwinionElite, new ModelDorwinionHelmet(1.0f)); + map.put(CinderLoE.bodyDorwinionElite, new ModelBodyDorwinionElite(1.0f)); for (ModelBiped armorModel : map.values()) copyModelRotations(armorModel, key); this.specialArmorModels.put(key, map); diff --git a/src/main/java/com/zivilon/cinder_loe/mixins/MixinLOTREnchantment.java b/src/main/java/com/zivilon/cinder_loe/mixins/MixinLOTREnchantment.java index 2816d0e..2c1c281 100644 --- a/src/main/java/com/zivilon/cinder_loe/mixins/MixinLOTREnchantment.java +++ b/src/main/java/com/zivilon/cinder_loe/mixins/MixinLOTREnchantment.java @@ -30,7 +30,8 @@ public class MixinLOTREnchantment { LOTREnchantment protectRangedWeak2 = new LOTREnchantmentWeakProtectionRanged("protectRangedWeak2", -2).setEnchantWeight(0); LOTREnchantment rangedWeak3 = new LOTREnchantmentRangedDamage("rangedWeak3", 0.25f); LOTREnchantment weak4 = new LOTREnchantmentDamage("weak4", -3.0f).setEnchantWeight(0); - LOTREnchantment chill = new LOTREnchantmentExtraSpecial("strong5", 1.0f).setEnchantWeight(0); + //LOTREnchantment chill = new LOTREnchantmentExtraSpecial("strong5", 1.0f).setEnchantWeight(0); + LOTREnchantment chill = new LOTREnchantmentDamage("strong5", 3.25f).setEnchantWeight(0); LOTREnchantment rangedStrong4 = new LOTREnchantmentRangedDamage("rangedStrong4", 1.4f).setEnchantWeight(0).setSkilful(); LOTREnchantment meleeReach2 = new LOTREnchantmentMeleeReach("meleeReach2", 1.33f).setEnchantWeight(0).setSkilful(); LOTREnchantment meleeSpeed2 = new LOTREnchantmentMeleeSpeed("meleeSpeed2", 1.33f).setEnchantWeight(0).setSkilful(); diff --git a/src/main/java/com/zivilon/cinder_loe/recipes.java b/src/main/java/com/zivilon/cinder_loe/recipes.java index 8934ebf..9e4f4dd 100644 --- a/src/main/java/com/zivilon/cinder_loe/recipes.java +++ b/src/main/java/com/zivilon/cinder_loe/recipes.java @@ -388,16 +388,16 @@ public class recipes { Character.valueOf('X'), Items.iron_ingot)); LOTRRecipes.angmarRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.bootsRhudaur), "X X", "X X", Character.valueOf('X'), Items.iron_ingot)); - LOTRRecipes.angmarRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.greatswordAngmar), " X ", " X", "Y ", + LOTRRecipes.angmarRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.greatswordAngmar), " X", " X ", "Y ", Character.valueOf('X'), LOTRMod.orcSteel, Character.valueOf('Y'), "stickWood")); } public static void registerLindonRecipes() { - LOTRRecipes.highElvenRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.greatswordLindon), " X ", " X", "Y ", + LOTRRecipes.highElvenRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.greatswordLindon), " X", " X ", "Y ", Character.valueOf('X'), LOTRMod.elfSteel, Character.valueOf('Y'), "stickWood")); } public static void registerDaleRecipes() { - LOTRRecipes.daleRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.greatswordDale), " X ", " X", "Y ", + LOTRRecipes.daleRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.greatswordDale), " X", " X ", "Y ", Character.valueOf('X'), Items.iron_ingot, Character.valueOf('Y'), "stickWood")); } 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 849f105..c343887 100644 --- a/src/main/resources/assets/cinder_loe/lang/en_US.lang +++ b/src/main/resources/assets/cinder_loe/lang/en_US.lang @@ -109,6 +109,14 @@ 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:helmetDorLomin.name=Dragonhelm of Dor-Lomin +item.lotr:bodyIsildur.name=Isildurs Chestplate +item.lotr:bowLurtz.name=Lurtz' Bow + +item.lotr:greatswordAngmar.name=Angmar Greatsword +item.lotr:greatswordLindon.name=Sirrandrai Battleblade +item.lotr:greatswordDale.name=Esgarothi Greatsword +item.lotr:greatswordNumenor.name=Black Númenórean Greatsword item.lotr:onion.name=Onion item.lotr:cabbage.name=Cabbage @@ -117,7 +125,7 @@ item.lotr:lightStew.name=Light Stew item.lotr:spice.name=Spices item.lotr:spicedHam.name=Spiced Ham item.lotr:chocolatebar.name=Chocolate Bar -item.lotr:fruitsalad.name=Fruid Salad +item.lotr:fruitsalad.name=Fruit Salad item.lotr:flour.name=Flour item.lotr:dough.name=Dough item.lotr:pasta.name=Pasta @@ -125,6 +133,7 @@ item.lotr:pretzel.name=Pretzel item.lotr:halva.name=Halva item.lotr:doner_kebab.name=Döner Kebab item.lotr:flatbread.name=Flatbread +item.lotr:maggotymaggotlessBread.name=Maggoty Maggotless Bread item.lotr:bonemold.name=Bonemold item.lotr:helmetLimwaith.name=Limwaith Helmet @@ -161,6 +170,16 @@ item.lotr:bodyGildedGalvorn.name=Gilded Galvorn Chestplate item.lotr:legsGildedGalvorn.name=Gilded Galvorn Leggings item.lotr:bootsGildedGalvorn.name=Gilded Galvorn Boots +item.lotr:helmetEsgaroth.name=Esgarothi Helmet +item.lotr:bodyEsgaroth.name=Esgarothi Chestplate +item.lotr:legsEsgaroth.name=Esgarothi Leggings +item.lotr:bootsEsgaroth.name=Esgarothi Boots + +item.lotr:helmetDorwinionElite.name=Bladorthin Champion Helmet +item.lotr:bodyDorwinionElite.name=Bladorthin Champion Chestplate +item.lotr:legsDorwinionElite.name=Bladorthin Champion Leggings +item.lotr:bootsDorwinionElite.name=Bladorthin Champion Boots + item.lotr:ingotAsh.name=Ashen Ingot item.lotr:swordAsh.name=Ash-Forged Sword item.lotr:staffAsh.name=Ash-Forged Bardiche @@ -346,6 +365,24 @@ entity.cinder_loe.NorthernOrc.name=Northern Orc entity.cinder_loe.Monkey.name=Monkey entity.cinder_loe.Usurper.name=Umbar Usurper +entity.cinder_loe.AngmarOrcButcher.name=Angmar Orc Butcher +entity.cinder_loe.AngmarOrcBrewer.name=Angmar Orc Brewer +entity.cinder_loe.AngmarOrcSmith.name=Angmar Orc Smith +entity.cinder_loe.DolGuldurOrcButcher.name=Dol Guldur Orc Butcher +entity.cinder_loe.DolGuldurOrcBrewer.name=Dol Guldur Orc Brewer +entity.cinder_loe.DolGuldurOrcSmith.name=Dol Guldur Orc Smith +entity.cinder_loe.GundabadOrcBrewer.name=Gundabad Orc Brewer +entity.cinder_loe.GundabadOrcButcher.name=Gundabad Orc Butcher +entity.cinder_loe.GundabadOrcSmith.name=Gundabad Orc Smith +entity.cinder_loe.HalfTrollBrewer.name=Half-Troll Brewer +entity.cinder_loe.HalfTrollButcher.name=Half-Troll Butcher +entity.cinder_loe.IsengardOrcBrewer.name=Isengard Snaga Brewer +entity.cinder_loe.IsengardOrcButcher.name=Isengard Snaga Butcher +entity.cinder_loe.IsengardOrcSmith.name=Uruk-Hai Smith +entity.cinder_loe.MordorOrcBrewer.name=Mordor Orc Brewer +entity.cinder_loe.MordorOrcButcher.name=Mordor Orc Butcher +entity.cinder_loe.MordorOrcSmith.name=Black Uruk Smith + lotr.enchant.protectWeak1=Dented lotr.enchant.baneNPC=Lifebane lotr.enchant.protectWeak2=Defective @@ -376,7 +413,6 @@ lotr.unit.Banner_Horse=Mounted Banner Bearer lotr.unit.TestMob=Test Mob lotr.unit.Sirrandrai=Rider of Sirrandrai - lotr.unitinfo.Angmar=To Hire this unit you must have the Angmar Objective complete. lotr.unitinfo.Arnor=To Hire this unit you must have the Arnor Objective complete. lotr.unitinfo.Rhudaur=To Hire this unit you must have the Rhudaur Objective complete. diff --git a/src/main/resources/assets/lotr/armor/dorwinionelite_1.png b/src/main/resources/assets/lotr/armor/dorwinionelite_1.png deleted file mode 100644 index 4d3756dc0d4be5d995ffc8c7003331fa4cdf61f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1047 zcmV+y1nB#TP)Px&w@E}nRA@u(S6fIFVH7?~6jBLZVhzzSEON=Uhor#VG$NKr0x#iHNlDR53ffbq zlvXcgluuDqR8J9Vgb@~z+uA}=52mt0N|GYEcv-MQGMo60oMCo$+fkOyVCR2vcIKRa z&UZQIA1xH)%M#=G$t1vZK#VhBwm^&ee1NW)C-W^drhRGlR;1iRQ`K85&jvMAg(^Y-F z-OBnDE5Bl_{}koy>5Qlz!{qiyw-f>Yzc?VxDf$G60{|Xtxm!Rh$UkWT zBRlIIBJrNqG1?Jtr^z`#4b6^FUTLbjmA0kiX4jPw+7y>TgR{eGyu_`uT4}=P;}*mc zM}{KcVUt5ym32goE8JTW*5!sRU_=0hl34Q7fH$B({1E5J5XHTN#rp|;+}GR3@c<~f z+IRrPGsMF3()+l6(*BH!9Pfi#;NvT&(&5gfyj|NlH`|^cT>{_$M?nFD5rsBq+0>!| z3_!3vZ$9u}6bI7WE|*Feij@VmWzx%D*k9`e5S3|p9dru70Yl1eKDCe=bpkLWpeTTf zdcwY_EW~KlMR8D3>j)?d@B$Qs2@vi6P~O}9gGN6S)!qp_2AhvLl(daRw*1vJG*M=F zYDL@vG9+(b@C5ZaoB@>uxF|gSbOjZjP7fjs&&4qyO;kot;~K!R9@jh7+0xN-HvmJ? zwxddBTskGMOrR~!cEj(4hzY<8oe2&eUMUCWxj^lZL*a0Q0OD3?9pg9@iiJFVjyCRa z*&r(l;8+daHH)enwdo1c&$LBtq)*cRZp^=`$fU14o2T})3^#2*ixc1gO#Dv2dtoM& zrt)AEn}aae|JU#y!qGak7Gy)1TX+o`?E079yZ3l-C0fRUmS5%PaU1;-js+)W8Jb zhxSWNdo6)~d%oQN8!ScbP_cgiiq1|yr#Znn0000EWmrjOO-%qQ00008000000002e RQjngvF) zzz7e4(JU~+6ToOKFq#EMvjAEM)Y#z$*J6Ts{~H=rR0$%sBJ|V6NxZ|Df3C;u2@LbMrPlws{j?Go)q2Gt8Q? z5KezyAj%*m%YVnP^TS~VP|5%W($dQ_hIR@7mHM#Q2gN)HfIJpbXAF*c(?*;zkhwk@ch{W zhK|^E;4FYG`Gd-WtE=BKR4fi+kd#tj;N+G9tL5hA8Tu&zR`P@LH4K0Xxo@KHuyz%= zUJHTC2@n|aWx$ooNB-Zwah*X`Lz6*5Tnz5v!v_z7#jpX8dJq6*jjFoVp`8LK?G5_q zCxZJ9$bTSEDg?}Z`0W;$mgiCf)9atDA=x@w_eCgvRDdmIAdA6L49EbpQYW delta 658 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 V1$viz0*;Vi$^--}`E#%*vz zK$?}*v>5K)y2b!9;LWR73~epl5CcGxAPuS-nqZSb8e64?bHTR^b@ viveWkV|4*?v}R@{VMHB41CZkwW*E9Aoaum^oDBenyawV<`AXdPlQID&&=##k diff --git a/src/main/resources/assets/lotr/textures/items/bodyIsildur.png b/src/main/resources/assets/lotr/textures/items/bodyIsildur.png new file mode 100644 index 0000000000000000000000000000000000000000..4867974c77f14d981cb7623f358eaa7b87f7df3c GIT binary patch literal 638 zcmV-^0)hRBP)Px%9!W$&R5*>zkD;X_{m*$8lXx`umUFY;0^I9*@^~w#YQix>_kE3-bk0N{LcR zE?v9;fL3ej=`sW$9BuJi{#-oI#$!$V(omb zRv^?u!Z4V6`h?b*JiA<*k~IuKVd2%kf%SA5(znkLrIgG}=VfekM6R|X6A$i7BGMoy z^@xm(j>yb(UQE*rKn5EuuUHy@QcA31kz^{3wWE`%@$2kw4%0n+g-mvk_e)E7o=5kd zP8_F#?FU@GHXRB-gRK?=4c65 zj7uED5Rk$*uWtQczk2q6bOW%7V>JMz8JhthF_7z!4aRB!NKso;HHt!*7tqDA8i38I zFt35+aJm3l5jHP?T!zhXuq)6tqx%&k4{|?KqX8-&r-z{3D!08A0G eMz{hf16d6|b?EvAIUfM~CfXu#kiEZ?2>~XS3rM;E delta 227 zcmV<90384O0j~m(F@MiVL_t(IPh(`D5HM1xpMm-Yq{IaNhq-FblJ#H;eGGf}RmpJ$62k)g}QHVfp|7 diff --git a/src/main/resources/assets/lotr/textures/items/helmetDorwinionElite.png b/src/main/resources/assets/lotr/textures/items/helmetDorwinionElite.png index faea42511b6467173f873904b879591f77764e69..518d01a5d23db6189cff6f38d374344317cab01d 100644 GIT binary patch delta 239 zcmVkqNw>+{jH_3=q`<@DXpdu&ZpxT!$Hp! zSrEivSx<*u2ms`?R@;7M)bV;gM!-+v=i_FG1;7b=7ec}NHDn201(6s4{~95>_x&<5 z0pvuvEC5BDSs5YhJMC6Dy8t>k|HD{Q##;E3Ot0`I3`=0Vau?WfuSd delta 348 zcmV-i0i*u80;L0xFn<9>Nkl{ zAPpdpmt9Dj0a3`d!r~lc7%WPWqZ7jgF^RDZB4T22Z;)gFNHHiTK!$*9tFLVV>u+qX uK}nGWQzFO^kRni$MoyVTr9@=YiD6^S3&d!IsR01XQn(TO#by_i69Fdq%99EJ diff --git a/src/main/resources/assets/lotr/textures/items/legsDorwinionElite.png b/src/main/resources/assets/lotr/textures/items/legsDorwinionElite.png index 36a4e52f56e2c769a5a727b7924188789b53ab55..644791044d52627d02c08532ff8e03b957a45cdb 100644 GIT binary patch delta 327 zcmV-N0l5C)0+9odF@G^hL_t(IPh(`D5HM1xp8>;w^{Z$9$7g6@Xex>x6b?x9sq(L2 z{VM9JDCXR`c^k~;`~b@NS+I!^3a4 z7(fPnWcmp;wl$gN(xD0*t^aaDN{l`)Cpm0E% zz5TryZ0+qCrn>EAxbo!;gQ12A!}%L$7^2!Oz~WKi@hFC17|_wz$#D4KL554Me;8P0 z7{HoAhWNGXGTgp#oniX4dH4+gxj8W63qXoz zCGACtLZZR|6pb%lz5<7~oU{bkc2EM!%t|603vP~<|NAC&WB3)9ILL66galHEoQz?~ c7MD1N0pw&XiVJfi0ChOA5eg9jypwAICiLWkvj6}9