From 42449bf5910225573c92c3b9551b7d00b72cca4a Mon Sep 17 00:00:00 2001 From: Shinare Date: Sat, 2 Nov 2024 01:38:28 +0200 Subject: [PATCH] Frozen Dungeon update --- .gitignore | 1 + diffs | 5 + .../com/zivilon/cinder_loe/CinderLoE.java | 175 ++++++- .../com/zivilon/cinder_loe/Materials.java | 6 + .../cinder_loe/blocks/EnchantedIce.java | 47 ++ .../cinder_loe/blocks/ForgingStation.java | 279 +++++++++++ .../zivilon/cinder_loe/blocks/IceCage.java | 221 +++++++++ .../zivilon/cinder_loe/blocks/ShadowTile.java | 71 +++ .../model/{ => armor}/ModelBodyJade.java | 0 .../model/{ => armor}/ModelBodySerpent.java | 0 .../{ => armor}/ModelBreeKettleHelmet.java | 0 .../model/{ => armor}/ModelBrokenHalo.java | 0 .../model/{ => armor}/ModelJadeHelmet.java | 0 .../model/{ => armor}/ModelLegsJade.java | 0 .../{ => armor}/ModelNexFireChestplate.java | 0 .../{ => armor}/ModelNexIceChestplate.java | 0 .../{ => armor}/ModelNexToxinChestplate.java | 0 .../{ => armor}/ModelRedDwarfHelmet.java | 0 .../model/{ => armor}/ModelRhudaurHelmet.java | 0 .../model/{ => armor}/ModelUsurperHelmet.java | 0 .../model/{ => armor}/ModelWarlordHelmet.java | 0 .../model/block/ModelForgingStation.java | 72 +++ .../{ => block}/Modelverticalweaponrack.java | 0 .../model/{ => block}/barricade_post.java | 0 .../{ => entity}/ModelFangornAuroch.java | 0 .../model/{ => entity}/ModelFangornElk.java | 0 .../model/{ => entity}/ModelFangornWolf.java | 0 .../client/model/entity/ModelNex.java | 200 ++++++++ .../client/render/block/RenderIceCage.java | 69 +++ .../render/effect/RenderNimveilBolt.java | 136 ++++++ .../render/{ => entity}/RenderBattleNun.java | 2 +- .../render/{ => entity}/RenderDarkSpider.java | 4 +- .../{ => entity}/RenderFangornAuroch.java | 4 +- .../{ => entity}/RenderFangornBear.java | 2 +- .../render/{ => entity}/RenderFangornElk.java | 4 +- .../{ => entity}/RenderFangornWildBoar.java | 2 +- .../{ => entity}/RenderFangornWolf.java | 2 +- .../render/{ => entity}/RenderLimwaith.java | 4 +- .../{ => entity}/RenderLimwaithShaman.java | 2 +- .../client/render/entity/RenderNex.java | 136 ++++++ .../client/render/entity/RenderNexCloud.java | 50 ++ .../render/entity/RenderNexMiniboss.java | 49 ++ .../render/{ => entity}/RenderRenegade.java | 2 +- .../{ => entity}/RenderTamedCrocodile.java | 2 +- .../{ => entity}/RenderUtumnoSlave.java | 2 +- .../render/{ => entity}/RenderWraith.java | 2 +- .../client/render/item/TrollClubRenderer.java | 59 +++ .../RenderSarumanFireball.java | 0 .../TileEntityForgingStationRenderer.java | 113 +++++ .../coremod/LOTRMaterialTransformer.java | 6 + .../cinder_loe/coremod/LOTRWeaponLinker.java | 3 +- .../entity/effect/NimveilLightningBolt.java | 84 ++++ .../entity/npc/frozen_dungeon/Nex.java | 413 ++++++++++++++++ .../entity/npc/frozen_dungeon/NexCloud.java | 180 +++++++ .../entity/npc/frozen_dungeon/NexFire.java | 67 +++ .../entity/npc/frozen_dungeon/NexIce.java | 68 +++ .../npc/frozen_dungeon/NexMiniboss.java | 151 ++++++ .../entity/npc/frozen_dungeon/NexShadow.java | 85 ++++ .../entity/npc/frozen_dungeon/NexToxin.java | 73 +++ .../cinder_loe/items/AulendurHammer.java | 26 + .../zivilon/cinder_loe/items/Celeiniss.java | 26 + .../cinder_loe/items/CinderLoESpawnEgg.java | 6 + .../zivilon/cinder_loe/items/IceThawer.java | 27 ++ .../com/zivilon/cinder_loe/items/Nimveil.java | 458 ++++++++++++++++++ .../zivilon/cinder_loe/items/NimveilPart.java | 128 +++++ .../zivilon/cinder_loe/items/ToxicCore.java | 17 + .../zivilon/cinder_loe/items/WeaponPart.java | 127 +++++ .../mixins/MixinEntityLivingBase.java | 22 +- .../cinder_loe/mixins/MixinItemRenderer.java | 14 + .../mixins/MixinLOTRRenderLargeItem.java | 111 ++++- .../cinder_loe/mixins/MixinSlotCrafting.java | 6 +- .../cinder_loe/recipe/ForgingRecipe.java | 57 +++ .../cinder_loe/recipe/ForgingRecipes.java | 85 ++++ .../recipe/ToxicCoreArrowsRecipe.java | 81 ++++ .../java/com/zivilon/cinder_loe/recipes.java | 240 ++++----- .../tileentity/TileEntityForgingStation.java | 127 +++++ .../tileentity/TileEntityShadowTile.java | 37 ++ .../cinder_loe/util/DurableItemCrafter.java | 4 +- .../util/LOTREnchantmentExclusions.java | 1 + .../zivilon/cinder_loe/util/Utilities.java | 32 ++ .../zivilon/cinder_loe/util/VT_additions.java | 6 +- .../lotr/textures/blocks/nex_ice_crystal.png | Bin 6683 -> 0 bytes .../lotr/textures/items/aulendur_hammer.png | Bin 0 -> 4475 bytes .../assets/lotr/textures/items/celeiniss.png | Bin 6530 -> 4692 bytes .../textures/items/large/aulendur_hammer.png | Bin 0 -> 4520 bytes .../lotr/textures/items/large/celeiniss.png | Bin 6727 -> 0 bytes .../lotr/textures/items/large2/celeiniss.png | Bin 0 -> 4692 bytes .../textures/items/large2/nimveil_ancient.png | Bin 0 -> 4897 bytes .../items/large2/nimveil_ancient_glow.png | Bin 0 -> 5152 bytes .../textures/items/large2/nimveil_mortals.png | Bin 0 -> 4687 bytes .../items/large2/nimveil_mortals_glow.png | Bin 0 -> 4951 bytes .../textures/items/large2/nimveil_sauron.png | Bin 0 -> 4899 bytes .../items/large2/nimveil_sauron_glow.png | Bin 0 -> 5146 bytes .../textures/items/large2/nimveil_udun.png | Bin 0 -> 4896 bytes .../items/large2/nimveil_udun_glow.png | Bin 0 -> 5155 bytes .../textures/items/large2/nimveil_valar.png | Bin 0 -> 4896 bytes .../items/large2/nimveil_valar_glow.png | Bin 0 -> 5154 bytes .../lotr/textures/items/nimveil_ancient.png | Bin 0 -> 4688 bytes ...d_dwarven.png => nimveil_ancient_glow.png} | Bin 5808 -> 4957 bytes .../lotr/textures/items/nimveil_blade.png | Bin 0 -> 4469 bytes .../lotr/textures/items/nimveil_hilt.png | Bin 0 -> 4704 bytes .../lotr/textures/items/nimveil_mortals.png | Bin 0 -> 4687 bytes .../textures/items/nimveil_mortals_glow.png | Bin 0 -> 4943 bytes .../lotr/textures/items/nimveil_sauron.png | Bin 0 -> 4468 bytes .../textures/items/nimveil_sauron_glow.png | Bin 0 -> 4715 bytes .../lotr/textures/items/nimveil_udun.png | Bin 0 -> 4467 bytes .../lotr/textures/items/nimveil_udun_glow.png | Bin 0 -> 4720 bytes .../lotr/textures/items/nimveil_valar.png | Bin 0 -> 4471 bytes 108 files changed, 4335 insertions(+), 156 deletions(-) create mode 100644 diffs create mode 100644 src/main/java/com/zivilon/cinder_loe/blocks/EnchantedIce.java create mode 100644 src/main/java/com/zivilon/cinder_loe/blocks/ForgingStation.java create mode 100644 src/main/java/com/zivilon/cinder_loe/blocks/IceCage.java create mode 100644 src/main/java/com/zivilon/cinder_loe/blocks/ShadowTile.java rename src/main/java/com/zivilon/cinder_loe/client/model/{ => armor}/ModelBodyJade.java (100%) rename src/main/java/com/zivilon/cinder_loe/client/model/{ => armor}/ModelBodySerpent.java (100%) rename src/main/java/com/zivilon/cinder_loe/client/model/{ => armor}/ModelBreeKettleHelmet.java (100%) rename src/main/java/com/zivilon/cinder_loe/client/model/{ => armor}/ModelBrokenHalo.java (100%) rename src/main/java/com/zivilon/cinder_loe/client/model/{ => armor}/ModelJadeHelmet.java (100%) rename src/main/java/com/zivilon/cinder_loe/client/model/{ => armor}/ModelLegsJade.java (100%) rename src/main/java/com/zivilon/cinder_loe/client/model/{ => armor}/ModelNexFireChestplate.java (100%) rename src/main/java/com/zivilon/cinder_loe/client/model/{ => armor}/ModelNexIceChestplate.java (100%) rename src/main/java/com/zivilon/cinder_loe/client/model/{ => armor}/ModelNexToxinChestplate.java (100%) rename src/main/java/com/zivilon/cinder_loe/client/model/{ => armor}/ModelRedDwarfHelmet.java (100%) rename src/main/java/com/zivilon/cinder_loe/client/model/{ => armor}/ModelRhudaurHelmet.java (100%) rename src/main/java/com/zivilon/cinder_loe/client/model/{ => armor}/ModelUsurperHelmet.java (100%) rename src/main/java/com/zivilon/cinder_loe/client/model/{ => armor}/ModelWarlordHelmet.java (100%) create mode 100644 src/main/java/com/zivilon/cinder_loe/client/model/block/ModelForgingStation.java rename src/main/java/com/zivilon/cinder_loe/client/model/{ => block}/Modelverticalweaponrack.java (100%) rename src/main/java/com/zivilon/cinder_loe/client/model/{ => block}/barricade_post.java (100%) rename src/main/java/com/zivilon/cinder_loe/client/model/{ => entity}/ModelFangornAuroch.java (100%) rename src/main/java/com/zivilon/cinder_loe/client/model/{ => entity}/ModelFangornElk.java (100%) rename src/main/java/com/zivilon/cinder_loe/client/model/{ => entity}/ModelFangornWolf.java (100%) create mode 100644 src/main/java/com/zivilon/cinder_loe/client/model/entity/ModelNex.java create mode 100644 src/main/java/com/zivilon/cinder_loe/client/render/block/RenderIceCage.java create mode 100644 src/main/java/com/zivilon/cinder_loe/client/render/effect/RenderNimveilBolt.java rename src/main/java/com/zivilon/cinder_loe/client/render/{ => entity}/RenderBattleNun.java (96%) rename src/main/java/com/zivilon/cinder_loe/client/render/{ => entity}/RenderDarkSpider.java (89%) rename src/main/java/com/zivilon/cinder_loe/client/render/{ => entity}/RenderFangornAuroch.java (94%) rename src/main/java/com/zivilon/cinder_loe/client/render/{ => entity}/RenderFangornBear.java (96%) rename src/main/java/com/zivilon/cinder_loe/client/render/{ => entity}/RenderFangornElk.java (94%) rename src/main/java/com/zivilon/cinder_loe/client/render/{ => entity}/RenderFangornWildBoar.java (92%) rename src/main/java/com/zivilon/cinder_loe/client/render/{ => entity}/RenderFangornWolf.java (92%) rename src/main/java/com/zivilon/cinder_loe/client/render/{ => entity}/RenderLimwaith.java (96%) rename src/main/java/com/zivilon/cinder_loe/client/render/{ => entity}/RenderLimwaithShaman.java (94%) create mode 100644 src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderNex.java create mode 100644 src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderNexCloud.java create mode 100644 src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderNexMiniboss.java rename src/main/java/com/zivilon/cinder_loe/client/render/{ => entity}/RenderRenegade.java (97%) rename src/main/java/com/zivilon/cinder_loe/client/render/{ => entity}/RenderTamedCrocodile.java (92%) rename src/main/java/com/zivilon/cinder_loe/client/render/{ => entity}/RenderUtumnoSlave.java (95%) rename src/main/java/com/zivilon/cinder_loe/client/render/{ => entity}/RenderWraith.java (96%) create mode 100644 src/main/java/com/zivilon/cinder_loe/client/render/item/TrollClubRenderer.java rename src/main/java/com/zivilon/cinder_loe/client/render/{ => projectile}/RenderSarumanFireball.java (100%) create mode 100644 src/main/java/com/zivilon/cinder_loe/client/render/tileentity/TileEntityForgingStationRenderer.java create mode 100644 src/main/java/com/zivilon/cinder_loe/entity/effect/NimveilLightningBolt.java create mode 100644 src/main/java/com/zivilon/cinder_loe/entity/npc/frozen_dungeon/Nex.java create mode 100644 src/main/java/com/zivilon/cinder_loe/entity/npc/frozen_dungeon/NexCloud.java create mode 100644 src/main/java/com/zivilon/cinder_loe/entity/npc/frozen_dungeon/NexFire.java create mode 100644 src/main/java/com/zivilon/cinder_loe/entity/npc/frozen_dungeon/NexIce.java create mode 100644 src/main/java/com/zivilon/cinder_loe/entity/npc/frozen_dungeon/NexMiniboss.java create mode 100644 src/main/java/com/zivilon/cinder_loe/entity/npc/frozen_dungeon/NexShadow.java create mode 100644 src/main/java/com/zivilon/cinder_loe/entity/npc/frozen_dungeon/NexToxin.java create mode 100644 src/main/java/com/zivilon/cinder_loe/items/AulendurHammer.java create mode 100644 src/main/java/com/zivilon/cinder_loe/items/Celeiniss.java create mode 100644 src/main/java/com/zivilon/cinder_loe/items/IceThawer.java create mode 100644 src/main/java/com/zivilon/cinder_loe/items/Nimveil.java create mode 100644 src/main/java/com/zivilon/cinder_loe/items/NimveilPart.java create mode 100644 src/main/java/com/zivilon/cinder_loe/items/ToxicCore.java create mode 100644 src/main/java/com/zivilon/cinder_loe/items/WeaponPart.java create mode 100644 src/main/java/com/zivilon/cinder_loe/recipe/ForgingRecipe.java create mode 100644 src/main/java/com/zivilon/cinder_loe/recipe/ForgingRecipes.java create mode 100644 src/main/java/com/zivilon/cinder_loe/recipe/ToxicCoreArrowsRecipe.java create mode 100644 src/main/java/com/zivilon/cinder_loe/tileentity/TileEntityForgingStation.java create mode 100644 src/main/java/com/zivilon/cinder_loe/tileentity/TileEntityShadowTile.java delete mode 100644 src/main/resources/assets/lotr/textures/blocks/nex_ice_crystal.png create mode 100644 src/main/resources/assets/lotr/textures/items/aulendur_hammer.png create mode 100644 src/main/resources/assets/lotr/textures/items/large/aulendur_hammer.png delete mode 100644 src/main/resources/assets/lotr/textures/items/large/celeiniss.png create mode 100644 src/main/resources/assets/lotr/textures/items/large2/celeiniss.png create mode 100644 src/main/resources/assets/lotr/textures/items/large2/nimveil_ancient.png create mode 100644 src/main/resources/assets/lotr/textures/items/large2/nimveil_ancient_glow.png create mode 100644 src/main/resources/assets/lotr/textures/items/large2/nimveil_mortals.png create mode 100644 src/main/resources/assets/lotr/textures/items/large2/nimveil_mortals_glow.png create mode 100644 src/main/resources/assets/lotr/textures/items/large2/nimveil_sauron.png create mode 100644 src/main/resources/assets/lotr/textures/items/large2/nimveil_sauron_glow.png create mode 100644 src/main/resources/assets/lotr/textures/items/large2/nimveil_udun.png create mode 100644 src/main/resources/assets/lotr/textures/items/large2/nimveil_udun_glow.png create mode 100644 src/main/resources/assets/lotr/textures/items/large2/nimveil_valar.png create mode 100644 src/main/resources/assets/lotr/textures/items/large2/nimveil_valar_glow.png create mode 100644 src/main/resources/assets/lotr/textures/items/nimveil_ancient.png rename src/main/resources/assets/lotr/textures/items/{war_red_dwarven.png => nimveil_ancient_glow.png} (53%) create mode 100644 src/main/resources/assets/lotr/textures/items/nimveil_blade.png create mode 100644 src/main/resources/assets/lotr/textures/items/nimveil_hilt.png create mode 100644 src/main/resources/assets/lotr/textures/items/nimveil_mortals.png create mode 100644 src/main/resources/assets/lotr/textures/items/nimveil_mortals_glow.png create mode 100644 src/main/resources/assets/lotr/textures/items/nimveil_sauron.png create mode 100644 src/main/resources/assets/lotr/textures/items/nimveil_sauron_glow.png create mode 100644 src/main/resources/assets/lotr/textures/items/nimveil_udun.png create mode 100644 src/main/resources/assets/lotr/textures/items/nimveil_udun_glow.png create mode 100644 src/main/resources/assets/lotr/textures/items/nimveil_valar.png diff --git a/.gitignore b/.gitignore index 91ea741..12ddda9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ build .gradle +.idea diff --git a/diffs b/diffs new file mode 100644 index 0000000..39598da --- /dev/null +++ b/diffs @@ -0,0 +1,5 @@ +Files src/main/java/com/zivilon/cinder_loe/CinderLoE.java and ../CinderLoE-Nex/src/main/java/com/zivilon/cinder_loe/CinderLoE.java differ + +Files src/main/java/com/zivilon/cinder_loe/util/DurableItemCrafter.java and ../CinderLoE-Nex/src/main/java/com/zivilon/cinder_loe/util/DurableItemCrafter.java differ +Files src/main/resources/assets/cinder_loe/lang/en_US.lang and ../CinderLoE-Nex/src/main/resources/assets/cinder_loe/lang/en_US.lang differ + diff --git a/src/main/java/com/zivilon/cinder_loe/CinderLoE.java b/src/main/java/com/zivilon/cinder_loe/CinderLoE.java index 9e42c5c..f127abe 100644 --- a/src/main/java/com/zivilon/cinder_loe/CinderLoE.java +++ b/src/main/java/com/zivilon/cinder_loe/CinderLoE.java @@ -4,18 +4,21 @@ import com.zivilon.cinder_loe.blocks.*; import com.zivilon.cinder_loe.character.CharacterEventListener; import com.zivilon.cinder_loe.character.CharacterRoleAPI; import com.zivilon.cinder_loe.client.render.*; +import com.zivilon.cinder_loe.client.render.block.*; import com.zivilon.cinder_loe.client.render.corrupt.*; +import com.zivilon.cinder_loe.client.render.effect.*; +import com.zivilon.cinder_loe.client.render.entity.*; import com.zivilon.cinder_loe.client.render.projectile.*; +import com.zivilon.cinder_loe.client.render.tileentity.*; import com.zivilon.cinder_loe.command.CommandCinderCharacter; import com.zivilon.cinder_loe.entity.*; import com.zivilon.cinder_loe.entity.corrupt.*; +import com.zivilon.cinder_loe.entity.effect.*; import com.zivilon.cinder_loe.entity.npc.*; -import com.zivilon.cinder_loe.entity.npc.dwarf.RedDwarfArbalest; -import com.zivilon.cinder_loe.entity.npc.dwarf.RedDwarfBannerBearer; -import com.zivilon.cinder_loe.entity.npc.dwarf.RedDwarfCommander; -import com.zivilon.cinder_loe.entity.npc.dwarf.RedDwarfWarrior; -import com.zivilon.cinder_loe.entity.npc.elf.Sirrandrai; +import com.zivilon.cinder_loe.entity.npc.dwarf.*; +import com.zivilon.cinder_loe.entity.npc.elf.*; import com.zivilon.cinder_loe.entity.npc.evil_human.*; +import com.zivilon.cinder_loe.entity.npc.frozen_dungeon.*; import com.zivilon.cinder_loe.entity.npc.good_human.*; import com.zivilon.cinder_loe.entity.npc.orc.MorgulOrc; import com.zivilon.cinder_loe.entity.npc.orc.NorthernOrc; @@ -73,6 +76,7 @@ import lotr.common.world.spawning.LOTRSpawnList; import net.minecraft.block.Block; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.client.renderer.entity.RenderLightningBolt; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.passive.EntityWolf; import net.minecraft.init.Blocks; @@ -116,9 +120,15 @@ public class CinderLoE { public static LOTRMaterial MATERIAL_USURPER; public static LOTRMaterial MATERIAL_WARLORD; public static LOTRMaterial MATERIAL_JADE; + public static LOTRMaterial MATERIAL_NEX_ICE; + public static LOTRMaterial MATERIAL_NEX_FIRE; + public static LOTRMaterial MATERIAL_NEX_TOXIN; + public static LOTRMaterial MATERIAL_NEX_SHADOW; + public static LOTRMaterial MATERIAL_NIMVEIL; + public static LOTRMaterial MATERIAL_FROZEN; // Blocks - // public static Block barricade; + //public static Block barricade; public static Block cinderBlock; public static Block ivoryBlock; public static Block blockRedDwarfSteel; @@ -129,7 +139,7 @@ public class CinderLoE { public static Block reedBale; public static Block dwarvenBrickRuned; public static Block fishBarrel; - ///public static Block rustedsword; + //public static Block rustedsword; public static Block mistBlock; public static Block cutDrystone; public static Block cindercobble; @@ -148,14 +158,20 @@ public class CinderLoE { //public static Block verticalWeaponRack; - //Gates + // Frozen Dungeon Blocks + public static Block shadowTile; + public static Block iceCage; + public static Block enchantedIce; + public static Block forgingStation; + + // Gates //public static Block gatecharredportcullis; - //Food Crop blocks + // Food Crop blocks public static Block onionCrop; public static Block cabbageCrop; - //Food! Yum :P + // Food! Yum :P public static Item onion; public static Item cabbage; public static Item pelmen; @@ -193,6 +209,37 @@ public class CinderLoE { public static Item legsJade; public static Item bootsJade; + // Frozen Dungeon + public static Item helmetNexIce; + public static Item bodyNexIce; + public static Item legsNexIce; + public static Item bootsNexIce; + public static Item helmetNexFire; + public static Item bodyNexFire; + public static Item legsNexFire; + public static Item bootsNexFire; + public static Item helmetNexToxin; + public static Item bodyNexToxin; + public static Item legsNexToxin; + public static Item bootsNexToxin; + public static Item helmetNexShadow; + public static Item bodyNexShadow; + public static Item legsNexShadow; + public static Item bootsNexShadow; + public static Item celeiniss; + public static Item nimveil; + public static Item nimveilPart; + public static Item aulendurHammer; + public static Item toxicCore; + public static Item iceThawer; + public static Item demonbloodVial; + public static Item mugDemonicHealthPotion; + public static Item deceiverBlade; + public static Item anaroreBow; + public static Item trollChieftainClub; + public static Item glaechirSpear; + public static Item weaponPart; + // Misc public static Item forgingKit; public static Item cinderFurItem; @@ -333,10 +380,15 @@ public class CinderLoE { Utilities.initialize_reflects(); recipes.registerRecipes(); setupTradeEntries(); - LOTRWeaponStats.registerMeleeReach(Whip.class, 1.5F); + setWeaponStats(); LoECreativeTabs.setupIcons(); } + public void setWeaponStats() { + LOTRWeaponStats.registerMeleeReach(Whip.class, 1.5F); + LOTRWeaponStats.registerMeleeReach(Celeiniss.class, 1.8F); + LOTRWeaponStats.registerMeleeSpeed(Celeiniss.class, 1.0F); + } @Mod.EventHandler public void serverStarting(FMLServerStartingEvent event) { @@ -347,6 +399,8 @@ public class CinderLoE { public void registerEntities() { // Last ID added: 58 ///GameRegistry.registerTileEntity(TileEntityMistBlock.class, "TileEntityMistBlock"); ///.registerBlock(TileEntityRustedSword, "TileEntityRustedSword"); + GameRegistry.registerTileEntity(TileEntityShadowTile.class, "TileEntityShadowTile"); + GameRegistry.registerTileEntity(TileEntityForgingStation.class, "TileEntityForgingStation"); int entityID = 7320; // Always increment entityID by 1 over the last entity to ensure unique IDs @@ -415,6 +469,14 @@ public class CinderLoE { EntityRegistry.registerModEntity(TauredainTrueBlood.class, "TauredainTrueBlood", (entityID + 57), this, 64, 1, true); EntityRegistry.registerModEntity(Sirrandrai.class, "Sirrandrai", (entityID + 58), this, 64, 1, true); + // Frozen Dungeon + EntityRegistry.registerModEntity(Nex.class, "Nex", (entityID + 45), this, 64, 1, true); + EntityRegistry.registerModEntity(NexShadow.class, "NexShadow", (entityID + 46), this, 64, 1, true); + EntityRegistry.registerModEntity(NexIce.class, "NexIce", (entityID + 47), this, 64, 1, true); + EntityRegistry.registerModEntity(NexFire.class, "NexFire", (entityID + 48), this, 64, 1, true); + EntityRegistry.registerModEntity(NexToxin.class, "NexToxin", (entityID + 49), this, 64, 1, true); + EntityRegistry.registerModEntity(NexCloud.class, "NexCloud", (entityID + 50), this, 64, 1, true); + EntityRegistry.registerModEntity(NimveilLightningBolt.class, "NimveilLightningBolt", (entityID + 51), this, 64, 1, true); } public void registerBlocks() { @@ -486,6 +548,16 @@ public class CinderLoE { entityBarrier = (new EntityBarrier()); GameRegistry.registerBlock(entityBarrier, "entity_barrier"); + // Frozen Dungeon + shadowTile = (new ShadowTile()); + GameRegistry.registerBlock(shadowTile, "shadow_tile"); + iceCage = (new IceCage()); + GameRegistry.registerBlock(iceCage, "ice_cage"); + enchantedIce = (new EnchantedIce()); + GameRegistry.registerBlock(enchantedIce, "enchanted_ice"); + forgingStation = (new ForgingStation()); + GameRegistry.registerBlock(forgingStation, "forging_station"); + // Building Blocks cutDrystone = (new cutDrystone()); GameRegistry.registerBlock(cutDrystone, "cutDrystone"); @@ -919,6 +991,78 @@ public class CinderLoE { System.err.println("Failed to find ARNOR material for armor initialization."); } linkLOTRWeapon(maceArnor, "maceArnor"); + + // Frozen Dungeon + MATERIAL_NEX_ICE = getLOTRMaterialByName("NEX_ICE"); + MATERIAL_NEX_FIRE = getLOTRMaterialByName("NEX_FIRE"); + MATERIAL_NEX_TOXIN = getLOTRMaterialByName("NEX_TOXIN"); + MATERIAL_NEX_SHADOW = getLOTRMaterialByName("NEX_SHADOW"); + MATERIAL_NIMVEIL = getLOTRMaterialByName("NIMVEIL"); + MATERIAL_FROZEN = getLOTRMaterialByName("FROZEN"); + if (MATERIAL_NEX_ICE != null && MATERIAL_NEX_FIRE != null && MATERIAL_NEX_TOXIN != null && MATERIAL_NEX_SHADOW != null && MATERIAL_NIMVEIL != null && MATERIAL_FROZEN != null) { + helmetNexIce = (new LoEArmor(MATERIAL_NEX_ICE, 0, enchantedIce)).setUnlocalizedName("lotr:helmetNexIce").setTextureName("lotr:helmetNexIce"); + bodyNexIce = (new LoEArmor(MATERIAL_NEX_ICE, 1, enchantedIce)).setUnlocalizedName("lotr:bodyNexIce").setTextureName("lotr:bodyNexIce"); + legsNexIce = (new LoEArmor(MATERIAL_NEX_ICE, 2, enchantedIce)).setUnlocalizedName("lotr:legsNexIce").setTextureName("lotr:legsNexIce"); + bootsNexIce = (new LoEArmor(MATERIAL_NEX_ICE, 3, enchantedIce)).setUnlocalizedName("lotr:bootsNexIce").setTextureName("lotr:bootsNexIce"); + helmetNexFire = (new LoEArmor(MATERIAL_NEX_FIRE, 0, enchantedIce)).setUnlocalizedName("lotr:helmetNexFire").setTextureName("lotr:helmetNexFire"); + bodyNexFire = (new LoEArmor(MATERIAL_NEX_FIRE, 1, enchantedIce)).setUnlocalizedName("lotr:bodyNexFire").setTextureName("lotr:bodyNexFire"); + legsNexFire = (new LoEArmor(MATERIAL_NEX_FIRE, 2, enchantedIce)).setUnlocalizedName("lotr:legsNexFire").setTextureName("lotr:legsNexFire"); + bootsNexFire = (new LoEArmor(MATERIAL_NEX_FIRE, 3, enchantedIce)).setUnlocalizedName("lotr:bootsNexFire").setTextureName("lotr:bootsNexFire"); + helmetNexToxin = (new LoEArmor(MATERIAL_NEX_TOXIN, 0, enchantedIce)).setUnlocalizedName("lotr:helmetNexToxin").setTextureName("lotr:helmetNexToxin"); + bodyNexToxin = (new LoEArmor(MATERIAL_NEX_TOXIN, 1, enchantedIce)).setUnlocalizedName("lotr:bodyNexToxin").setTextureName("lotr:bodyNexToxin"); + legsNexToxin = (new LoEArmor(MATERIAL_NEX_TOXIN, 2, enchantedIce)).setUnlocalizedName("lotr:legsNexToxin").setTextureName("lotr:legsNexToxin"); + bootsNexToxin = (new LoEArmor(MATERIAL_NEX_TOXIN, 3, enchantedIce)).setUnlocalizedName("lotr:bootsNexToxin").setTextureName("lotr:bootsNexToxin"); + helmetNexShadow = (new LoEArmor(MATERIAL_NEX_SHADOW, 0, enchantedIce)).setUnlocalizedName("lotr:helmetNexShadow").setTextureName("lotr:helmetNexShadow"); + bodyNexShadow = (new LoEArmor(MATERIAL_NEX_SHADOW, 1, enchantedIce)).setUnlocalizedName("lotr:bodyNexShadow").setTextureName("lotr:bodyNexShadow"); + legsNexShadow = (new LoEArmor(MATERIAL_NEX_SHADOW, 2, enchantedIce)).setUnlocalizedName("lotr:legsNexShadow").setTextureName("lotr:legsNexShadow"); + bootsNexShadow = (new LoEArmor(MATERIAL_NEX_SHADOW, 3, enchantedIce)).setUnlocalizedName("lotr:bootsNexShadow").setTextureName("lotr:bootsNexShadow"); + celeiniss = (new Celeiniss()); + aulendurHammer = (new AulendurHammer()); + nimveil = (new Nimveil()); + nimveilPart = (new NimveilPart()); + toxicCore = (new ToxicCore()); + iceThawer = (new IceThawer()); + demonbloodVial = (new Item()).setUnlocalizedName("lotr:demonbloodVial").setCreativeTab(LoECreativeTabs.tabMiscLoE).setTextureName("lotr:demonbloodVial"); + mugDemonicHealthPotion = (new LoEItemMug(0.0F)).setDrinkStats(20, 1.0F).addPotionEffect(Potion.field_76434_w.id, 28800).setUnlocalizedName("lotr:mugDemonicHealthPotion"); + ((LoEItemMug)mugDemonicHealthPotion).setTextureNameFromUnlocalizedName(); + deceiverBlade = (new LoESword(LOTRMaterial.MORGUL, enchantedIce).setWeaponDamage(8.0F)).setUnlocalizedName("deceiver_blade").setTextureName("lotr:deceiver_blade").setMaxDamage(1000); + anaroreBow = (new LoEBow(MATERIAL_FROZEN, enchantedIce, 2.0D).setDrawTime(16)).setUnlocalizedName("anarore_bow").setTextureName("lotr:anarore_bow").setMaxDamage(1000); + trollChieftainClub = (new LoEHammer(MATERIAL_FROZEN, enchantedIce)).setUnlocalizedName("troll_chieftain_club").setTextureName("lotr:troll_chieftain_club").setMaxDamage(1000); + glaechirSpear = (new LoESpear(MATERIAL_FROZEN, enchantedIce)).setUnlocalizedName("glaechir_spear").setTextureName("lotr:glaechir_spear").setMaxDamage(1000); + weaponPart = (new WeaponPart()); + linkLOTRWeapon(celeiniss, "celeiniss"); + linkLOTRWeapon(nimveil, "nimveil"); + + ItemRegistration.register(helmetNexIce,"helmetNexIce",7200); + ItemRegistration.register(bodyNexIce,"bodyNexIce",7201); + ItemRegistration.register(legsNexIce,"legsNexIce",7202); + ItemRegistration.register(bootsNexIce,"bootsNexIce",7203); + ItemRegistration.register(helmetNexFire,"helmetNexFire",7204); + ItemRegistration.register(bodyNexFire,"bodyNexFire",7205); + ItemRegistration.register(legsNexFire,"legsNexFire",7206); + ItemRegistration.register(bootsNexFire,"bootsNexFire",7207); + ItemRegistration.register(helmetNexToxin,"helmetNexToxin",7208); + ItemRegistration.register(bodyNexToxin,"bodyNexToxin",7209); + ItemRegistration.register(legsNexToxin,"legsNexToxin",7210); + ItemRegistration.register(bootsNexToxin,"bootsNexToxin",7211); + ItemRegistration.register(helmetNexShadow,"helmetNexShadow",7212); + ItemRegistration.register(bodyNexShadow,"bodyNexShadow",7213); + ItemRegistration.register(legsNexShadow,"legsNexShadow",7214); + ItemRegistration.register(bootsNexShadow,"bootsNexShadow",7215); + ItemRegistration.register(celeiniss, "celeiniss",7220); + ItemRegistration.register(nimveil, "nimveil",7221); + ItemRegistration.register(nimveilPart, "nimveilPart",7222); + ItemRegistration.register(aulendurHammer, "aulendurHammer",7223); + ItemRegistration.register(deceiverBlade, "deceiverBlade",7224); + ItemRegistration.register(anaroreBow, "anaroreBow",7225); + ItemRegistration.register(trollChieftainClub, "trollChieftainClub",7226); + ItemRegistration.register(glaechirSpear, "glaechirSpear",7227); + ItemRegistration.register(weaponPart, "weaponPart", 7228); + ItemRegistration.register(toxicCore,"toxicCore",7229); + ItemRegistration.register(iceThawer, "iceThawer",7230); + ItemRegistration.register(demonbloodVial, "demonbloodVial",7231); + ItemRegistration.register(mugDemonicHealthPotion, "mugDemonicHealthPotion",7232); + } } public static ModContainer getModContainer() { @@ -1006,6 +1150,15 @@ public class CinderLoE { RenderingRegistry.registerEntityRenderingHandler(EsgarothSoldier.class, new LOTRRenderDaleMan()); RenderingRegistry.registerEntityRenderingHandler(MorgulOrc.class, new LOTRRenderOrc()); RenderingRegistry.registerEntityRenderingHandler(NorthernOrc.class, new LOTRRenderOrc()); + + RenderingRegistry.registerEntityRenderingHandler(NexCloud.class, new RenderNexCloud()); + RenderingRegistry.registerEntityRenderingHandler(NexFire.class, new RenderNexMiniboss()); + RenderingRegistry.registerEntityRenderingHandler(NexIce.class, new RenderNexMiniboss()); + RenderingRegistry.registerEntityRenderingHandler(NexShadow.class, new RenderNexMiniboss()); + RenderingRegistry.registerEntityRenderingHandler(NexToxin.class, new RenderNexMiniboss()); + RenderingRegistry.registerEntityRenderingHandler(Nex.class, new RenderNex()); + RenderingRegistry.registerEntityRenderingHandler(NimveilLightningBolt.class, new RenderNimveilBolt()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityForgingStation.class, (TileEntitySpecialRenderer)new TileEntityForgingStationRenderer()); } } diff --git a/src/main/java/com/zivilon/cinder_loe/Materials.java b/src/main/java/com/zivilon/cinder_loe/Materials.java index 1c6d44f..8cc5e7a 100644 --- a/src/main/java/com/zivilon/cinder_loe/Materials.java +++ b/src/main/java/com/zivilon/cinder_loe/Materials.java @@ -25,6 +25,12 @@ public class Materials { modifyMaterial("USURPER",650, 2.0F, 0.6F, 2, 6.0F, 10, Items.iron_ingot); modifyMaterial("WARLORD", 650, 2.0F, 0.6F, 2, 6.0F, 10, LOTRMod.bronze); modifyMaterial("JADE",2400, 5.0F, 0.8F, 0, 9.0F, 10, LOTRMod.emerald); + modifyMaterial("NEX_ICE",1500, 0.0F, 0.8F, 0, 9.0F, 10, Item.getItemFromBlock(CinderLoE.enchantedIce)); + modifyMaterial("NEX_FIRE",1500, 0.0F, 0.8F, 0, 9.0F, 10, Item.getItemFromBlock(CinderLoE.enchantedIce)); + modifyMaterial("NEX_TOXIN",1500, 0.0F, 0.8F, 0, 9.0F, 10, Item.getItemFromBlock(CinderLoE.enchantedIce)); + modifyMaterial("NEX_SHADOW",1500, 0.0F, 0.8F, 0, 9.0F, 10, Item.getItemFromBlock(CinderLoE.enchantedIce)); + modifyMaterial("NIMVEIL",300, 6.0F, 0.0F, 0, 0.0F, 10, Item.getItemFromBlock(CinderLoE.enchantedIce)); + modifyMaterial("FROZEN",1000, 5.0F, 0.0F, 0, 0.0F, 10, Item.getItemFromBlock(CinderLoE.enchantedIce)); } public static void modifyMaterial(String fieldName, int uses, float weapon_damage, float protection, int harvest_level, float speed, int enchantability, Item crafting_item) { diff --git a/src/main/java/com/zivilon/cinder_loe/blocks/EnchantedIce.java b/src/main/java/com/zivilon/cinder_loe/blocks/EnchantedIce.java new file mode 100644 index 0000000..4ee562f --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/blocks/EnchantedIce.java @@ -0,0 +1,47 @@ +package com.zivilon.cinder_loe.blocks; + +import com.zivilon.cinder_loe.LoECreativeTabs; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockIce; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +import java.lang.reflect.Field; +import java.util.Random; + +public class EnchantedIce extends BlockIce { + public IIcon baseIcon; + + public EnchantedIce() { + super(); + this.setTickRandomly(false); + this.setCreativeTab(LoECreativeTabs.tabBlockLoE); + setBlockTextureName("minecraft:ice"); + setBlockName("lotr:enchantedIce"); + setLightLevel(0.25F); + } + + @Override + public void registerBlockIcons(IIconRegister iconRegister) { + this.baseIcon = iconRegister.registerIcon(this.getTextureName()); + } + + @Override + public IIcon getIcon(int side, int meta) { + return this.baseIcon; + } + + public IIcon getBaseIcon() { + return this.baseIcon; + } + + @Override + public void updateTick(World p_149674_1_, int p_149674_2_, int p_149674_3_, int p_149674_4_, Random p_149674_5_) {} +} diff --git a/src/main/java/com/zivilon/cinder_loe/blocks/ForgingStation.java b/src/main/java/com/zivilon/cinder_loe/blocks/ForgingStation.java new file mode 100644 index 0000000..f39e06a --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/blocks/ForgingStation.java @@ -0,0 +1,279 @@ +package com.zivilon.cinder_loe.blocks; + +import com.zivilon.cinder_loe.CinderLoE; +import com.zivilon.cinder_loe.LoECreativeTabs; +import com.zivilon.cinder_loe.items.NimveilPart; +import com.zivilon.cinder_loe.items.Nimveil; +import com.zivilon.cinder_loe.recipe.ForgingRecipe; +import com.zivilon.cinder_loe.recipe.ForgingRecipes; +import com.zivilon.cinder_loe.tileentity.TileEntityForgingStation; + +import lotr.common.item.LOTRItemHammer; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; + +public class ForgingStation extends BlockContainer { + + public ForgingStation() { + super(Material.anvil); + setHardness(10.0F); + setResistance(10.0F); + setBlockName("forging_station"); + setCreativeTab(LoECreativeTabs.tabDecoLoE); + setBlockBounds(0, 0, 0, 1, 1, 1); // Set the block bounds to cover 1x1x1 for each individual part + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public int getRenderType() { + return -1; // Use custom renderer + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityForgingStation(); + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase placer, ItemStack itemStack) { + int direction = MathHelper.floor_double((double)(placer.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3; + + // Middle part (placed block) + world.setBlockMetadataWithNotify(x, y, z, (direction << 2) | 1, 2); + + // Right and right parts based on orientation + if (direction == 0) { // South + world.setBlock(x - 1, y, z, this, (direction << 2) | 0, 2); // Right part + world.setBlock(x + 1, y, z, this, (direction << 2) | 2, 2); // Left part + } else if (direction == 1) { // West + world.setBlock(x, y, z - 1, this, (direction << 2) | 0, 2); // Right part + world.setBlock(x, y, z + 1, this, (direction << 2) | 2, 2); // Left part + } else if (direction == 2) { // North + world.setBlock(x + 1, y, z, this, (direction << 2) | 0, 2); // Right part + world.setBlock(x - 1, y, z, this, (direction << 2) | 2, 2); // Left part + } else if (direction == 3) { // East + world.setBlock(x, y, z + 1, this, (direction << 2) | 0, 2); // Right part + world.setBlock(x, y, z - 1, this, (direction << 2) | 2, 2); // Left part + } + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + int direction = meta >> 2; + int part = meta & 3; + + if (direction == 0) { // South + if (part == 1) { // Middle + world.setBlockToAir(x - 1, y, z); // Right part + world.setBlockToAir(x + 1, y, z); // Left part + } else if (part == 0) { // Right + world.setBlockToAir(x + 1, y, z); // Middle part + world.setBlockToAir(x + 2, y, z); // Left part + } else if (part == 2) { // Left + world.setBlockToAir(x - 1, y, z); // Middle part + world.setBlockToAir(x - 2, y, z); // Right part + } + } else if (direction == 1) { // West + if (part == 1) { // Middle + world.setBlockToAir(x, y, z - 1); // Right part + world.setBlockToAir(x, y, z + 1); // Left part + } else if (part == 0) { // Right + world.setBlockToAir(x, y, z + 1); // Middle part + world.setBlockToAir(x, y, z + 2); // Left part + } else if (part == 2) { // Left + world.setBlockToAir(x, y, z - 1); // Middle part + world.setBlockToAir(x, y, z - 2); // Right part + } + } else if (direction == 2) { // North + if (part == 1) { // Middle + world.setBlockToAir(x + 1, y, z); // Right part + world.setBlockToAir(x - 1, y, z); // Left part + } else if (part == 0) { // Right + world.setBlockToAir(x - 1, y, z); // Middle part + world.setBlockToAir(x - 2, y, z); // Left part + } else if (part == 2) { // Left + world.setBlockToAir(x + 1, y, z); // Middle part + world.setBlockToAir(x + 2, y, z); // Right part + } + } else if (direction == 3) { // East + if (part == 1) { // Middle + world.setBlockToAir(x, y, z + 1); // Right part + world.setBlockToAir(x, y, z - 1); // Left part + } else if (part == 0) { // Right + world.setBlockToAir(x, y, z - 1); // Middle part + world.setBlockToAir(x, y, z - 2); // Left part + } else if (part == 2) { // Left + world.setBlockToAir(x, y, z + 1); // Middle part + world.setBlockToAir(x, y, z + 2); // Right part + } + } + + super.breakBlock(world, x, y, z, block, meta); + } + + public TileEntityForgingStation getCentralTileEntity(World world, int x, int y, int z) { + int meta = world.getBlockMetadata(x, y, z); + int direction = meta >> 2; // Extract the direction + int part = meta & 3; // Extract the part (0, 1, 2) + + int centralX = x, centralZ = z; + + switch (direction) { + case 0: // South + if (part == 0) { + centralX = x + 1; // Right part, middle is to the left + } else if (part == 2) { + centralX = x - 1; // Left part, middle is to the right + } + break; + case 1: // West + if (part == 0) { + centralZ = z + 1; // Right part, middle is to the front + } else if (part == 2) { + centralZ = z - 1; // Left part, middle is to the back + } + break; + case 2: // North + if (part == 0) { + centralX = x - 1; // Right part, middle is to the right + } else if (part == 2) { + centralX = x + 1; // Left part, middle is to the left + } + break; + case 3: // East + if (part == 0) { + centralZ = z - 1; // Right part, middle is to the back + } else if (part == 2) { + centralZ = z + 1; // Left part, middle is to the front + } + break; + } + + TileEntity tileEntity = world.getTileEntity(centralX, y, centralZ); + return (tileEntity instanceof TileEntityForgingStation) ? (TileEntityForgingStation) tileEntity : null; + } + + @Override + public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player) { + ItemStack heldStack = player.getHeldItem(); + if (heldStack == null) return; + + boolean isBlessedHammer = heldStack.getItem() == CinderLoE.aulendurHammer; + boolean isRegularHammer = heldStack.getItem() instanceof LOTRItemHammer; + + if (!isBlessedHammer && !isRegularHammer) return; + + TileEntityForgingStation tileentity = getCentralTileEntity(world, x, y, z); + if (tileentity == null) return; + + ItemStack left = tileentity.getLeftItem(); + ItemStack middle = tileentity.getMiddleItem(); + ItemStack right = tileentity.getRightItem(); + + // Iterate through available recipes and find a match + for (ForgingRecipe recipe : ForgingRecipes.getAllRecipes()) { + + if (recipe.matches(left, middle, right, isBlessedHammer)) { + // Clear the inputs if the recipe matches + tileentity.setLeftItem(null); + tileentity.setRightItem(null); + tileentity.setMiddleItem(recipe.getOutput()); + + // Damage the hammer by 1 + if (heldStack.attemptDamageItem(1, player.getRNG())) { + player.inventory.setInventorySlotContents(player.inventory.currentItem, null); + } else { + player.inventory.markDirty(); + } + return; + } + } + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + if (!world.isRemote) { + TileEntityForgingStation tileentity = getCentralTileEntity(world, x, y, z); + if (tileentity == null) return true; + + int meta = world.getBlockMetadata(x, y, z); + int part = meta & 3; + + ItemStack stack = null; + if (part == 0) stack = tileentity.getRightItem(); + else if (part == 1) stack = tileentity.getMiddleItem(); + else if (part == 2) stack = tileentity.getLeftItem(); + + if (stack != null) { + // Try to pick up the item + boolean hasSpace = player.inventory.addItemStackToInventory(stack); + if (hasSpace) { + if (part == 0) tileentity.setRightItem(null); + else if (part == 1) tileentity.setMiddleItem(null); + else if (part == 2) tileentity.setLeftItem(null); + + if (player instanceof EntityPlayerMP) { + ((EntityPlayerMP) player).sendContainerToPlayer(player.inventoryContainer); + } + } else { + player.addChatMessage(new ChatComponentText("You need more inventory space")); + } + } else { + // Try to place an item + ItemStack heldStack = player.getHeldItem(); + if (heldStack == null) return true; + + boolean itemPlaced = false; + + // Check all recipes to see if the held item matches any input slot + for (ForgingRecipe recipe : ForgingRecipes.getAllRecipes()) { + if (part == 0 && recipe.matchesItem(recipe.rightInput, heldStack)) { + tileentity.setRightItem(heldStack.splitStack(1)); + itemPlaced = true; + } else if (part == 1 && recipe.matchesItem(recipe.middleInput, heldStack)) { + tileentity.setMiddleItem(heldStack.splitStack(1)); + itemPlaced = true; + } else if (part == 2 && recipe.matchesItem(recipe.leftInput, heldStack)) { + tileentity.setLeftItem(heldStack.splitStack(1)); + itemPlaced = true; + } + + if (itemPlaced) { + tileentity.markDirty(); + if (heldStack.stackSize <= 0) { + player.inventory.setInventorySlotContents(player.inventory.currentItem, null); + } + player.inventory.markDirty(); + break; + } + } + + if (!itemPlaced) { + player.addChatMessage(new ChatComponentText("This item does not fit here.")); + } + } + } + return true; + } + +} diff --git a/src/main/java/com/zivilon/cinder_loe/blocks/IceCage.java b/src/main/java/com/zivilon/cinder_loe/blocks/IceCage.java new file mode 100644 index 0000000..75a2bf5 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/blocks/IceCage.java @@ -0,0 +1,221 @@ +package com.zivilon.cinder_loe.blocks; + +import com.zivilon.cinder_loe.CinderLoE; +import com.zivilon.cinder_loe.LoECreativeTabs; +import com.zivilon.cinder_loe.util.Utilities; +import com.zivilon.cinder_loe.client.render.block.RenderIceCage; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; + +import java.util.List; +import java.util.Random; + +public class IceCage extends Block { + @SideOnly(Side.CLIENT) + private IIcon blockIcon; + @SideOnly(Side.CLIENT) + private IIcon emptyIcon; + + public IceCage() { + super(Material.ice); + setHardness(2.0F); + setResistance(1.0F); + setStepSound(soundTypeGlass); + setBlockTextureName(Utilities.toSnakeCase("lotr:iceCage")); + setBlockName(Utilities.toSnakeCase("lotr:iceCage")); + setLightOpacity(5); // Semi-transparent + setCreativeTab(CreativeTabs.tabBlock); + setCreativeTab(LoECreativeTabs.tabDecoLoE); + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public int getRenderType() { + return RenderIceCage.RENDER_ID; // Use the custom render type + } + + @Override + @SideOnly(Side.CLIENT) + public int getRenderBlockPass() { + return 1; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + this.blockIcon = iconRegister.registerIcon("lotr:ice_cage"); + this.emptyIcon = iconRegister.registerIcon("lotr:invisible"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { +/* if ((meta == 0 && side == 1) || (meta == 1 && side == 0)) { + return this.blockIcon; + }*/ + return this.blockIcon; + } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { + return AxisAlignedBB.getBoundingBox(x, y, z, x + 1.0F, y + 1.0F, z + 1.0F); + } + + @Override + public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB aabb, List list, Entity entity) { + int meta = world.getBlockMetadata(x, y, z); + if (meta == 0) { // Lower part + float thickness = 0.0625F; // 1/16th of a block thickness + + AxisAlignedBB[] boundingBoxes = new AxisAlignedBB[]{ + AxisAlignedBB.getBoundingBox(x, y, z, x + thickness, y + 1.0F, z + 1.0F), // Left wall + AxisAlignedBB.getBoundingBox(x + 1.0F - thickness, y, z, x + 1.0F, y + 1.0F, z + 1.0F), // Right wall + AxisAlignedBB.getBoundingBox(x, y, z, x + 1.0F, y + 1.0F, z + thickness), // Front wall + AxisAlignedBB.getBoundingBox(x, y, z + 1.0F - thickness, x + 1.0F, y + 1.0F, z + 1.0F) // Back wall + }; + + for (AxisAlignedBB boundingBox : boundingBoxes) { + if (boundingBox != null && aabb.intersectsWith(boundingBox)) { + list.add(boundingBox); + } + } + } else if (meta == 1) { // Upper partplayer.addPotionEffect(new PotionEffect(Potion.digSlowdown.id, 20, 2, true)); // Mining Fatigue III + float thickness = 0.0625F; // 1/16th of a block thickness + + AxisAlignedBB[] boundingBoxes = new AxisAlignedBB[]{ + AxisAlignedBB.getBoundingBox(x, y, z, x + thickness, y + 1.0F, z + 1.0F), // Left wall + AxisAlignedBB.getBoundingBox(x + 1.0F - thickness, y, z, x + 1.0F, y + 1.0F, z + 1.0F), // Right wall + AxisAlignedBB.getBoundingBox(x, y, z, x + 1.0F, y + 1.0F, z + thickness), // Front wall + AxisAlignedBB.getBoundingBox(x, y, z + 1.0F - thickness, x + 1.0F, y + 1.0F, z + 1.0F), // Back wall + AxisAlignedBB.getBoundingBox(x, y + 1.0F - thickness, z, x + 1.0F, y + 1.0F, z + 1.0F) // Ceiling + }; + + for (AxisAlignedBB boundingBox : boundingBoxes) { + if (boundingBox != null && aabb.intersectsWith(boundingBox)) { + list.add(boundingBox); + } + } + } + } + + @Override + public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) { + if (entity instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer) entity; + AxisAlignedBB blockBounds = AxisAlignedBB.getBoundingBox(x, y, z, x + 1.0F, y + 1.0F, z + 1.0F); + if (blockBounds != null && blockBounds.intersectsWith(player.boundingBox)) { + player.motionX = 0; + player.motionY = 0; + player.motionZ = 0; + player.addPotionEffect(new PotionEffect(Potion.digSlowdown.id, 20, 2, true)); // Mining Fatigue III + } + } + } + + @Override + public void updateTick(World world, int x, int y, int z, Random random) { + int meta = world.getBlockMetadata(x, y, z); + if (meta == 0) { // Lower part + List players = world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1.0F, y + 2.0F, z + 1.0F)); + for (EntityPlayer player : players) { + player.motionX = 0; + player.motionY = 0; + player.motionZ = 0; + player.addPotionEffect(new PotionEffect(Potion.digSlowdown.id, 20, 2, true)); // Mining Fatigue III + } + } + world.scheduleBlockUpdate(x, y, z, this, this.tickRate(world)); + } + + @Override + public int tickRate(World world) { + return 1; // Adjust the tick rate as needed + } + + @Override + @SideOnly(Side.CLIENT) + public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { + return true; + } + + @Override + public boolean canPlaceBlockAt(World world, int x, int y, int z) { + return world.isAirBlock(x, y, z) && world.isAirBlock(x, y + 1, z); + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase placer, ItemStack itemStack) { + world.setBlockMetadataWithNotify(x, y, z, 0, 2); // Lower part + world.setBlock(x, y + 1, z, this, 1, 2); // Upper part + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int p_149727_6_, float p_149727_7_, float p_149727_8_, float p_149727_9_) { + if (player.getHeldItem() != null && player.getHeldItem().getItem() == CinderLoE.iceThawer) { + if (!player.capabilities.isCreativeMode) { + player.getHeldItem().stackSize--; + if (player.getHeldItem().stackSize <= 0) { + player.inventory.setInventorySlotContents(player.inventory.currentItem, null); + } + } + + world.func_147480_a(x, y, z, false); + + return true; + } + return false; + } + + + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, Block neighbor) { + int meta = world.getBlockMetadata(x, y, z); + if (meta == 0) { // Lower part + if (world.getBlock(x, y + 1, z) != this) { + world.setBlockToAir(x, y, z); + } + } else if (meta == 1) { // Upper part + if (world.getBlock(x, y - 1, z) != this) { + world.setBlockToAir(x, y, z); + } + } + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + if (meta == 0) { // Lower part + if (world.getBlock(x, y + 1, z) == this) { + world.setBlockToAir(x, y + 1, z); + } + } else if (meta == 1) { // Upper part + if (world.getBlock(x, y - 1, z) == this) { + world.setBlockToAir(x, y - 1, z); + } + } + super.breakBlock(world, x, y, z, block, meta); + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/blocks/ShadowTile.java b/src/main/java/com/zivilon/cinder_loe/blocks/ShadowTile.java new file mode 100644 index 0000000..9ada9e9 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/blocks/ShadowTile.java @@ -0,0 +1,71 @@ +package com.zivilon.cinder_loe.blocks; + +import lotr.common.LOTRCreativeTabs; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.world.World; +import net.minecraft.block.BlockPressurePlate; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.DamageSource; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import com.zivilon.cinder_loe.LoECreativeTabs; +import com.zivilon.cinder_loe.LoEDamage; +import com.zivilon.cinder_loe.tileentity.TileEntityShadowTile; + +import java.lang.reflect.Field; +import java.util.Random; + +public class ShadowTile extends BlockPressurePlate { + public int ticksLived = 0; + + public ShadowTile() { + super("lotr:shadow_tile", Material.rock, BlockPressurePlate.Sensitivity.players); + this.setCreativeTab(LoECreativeTabs.tabMiscLoE); + setBlockTextureName("lotr:shadow_tile"); + setBlockName("lotr:shadowTile"); + this.isBlockContainer = true; + } + + @Override + public boolean hasTileEntity(int metadata) { + return true; + } + + @Override + public TileEntity createTileEntity(World world, int metadata) { + return new TileEntityShadowTile(); + } + + @Override + public void onBlockAdded(World world, int x, int y, int z) { + super.onBlockAdded(world, x, y, z); + + // Manually create and initialize the tile entity + if (!world.isRemote) { + world.setTileEntity(x, y, z, createTileEntity(world, world.getBlockMetadata(x, y, z))); + } + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + super.breakBlock(world, x, y, z, block, meta); + world.removeTileEntity(x, y, z); // Clean up the tile entity + } + + @Override + public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) { + if (entity instanceof EntityPlayer && !world.isRemote) { + EntityPlayer player = (EntityPlayer)entity; + player.attackEntityFrom(LoEDamage.shadow, 10.0F); + player.addPotionEffect(new PotionEffect(15, 6*20, 0, false)); + world.setBlockToAir(x, y, z); + } + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/client/model/ModelBodyJade.java b/src/main/java/com/zivilon/cinder_loe/client/model/armor/ModelBodyJade.java similarity index 100% rename from src/main/java/com/zivilon/cinder_loe/client/model/ModelBodyJade.java rename to src/main/java/com/zivilon/cinder_loe/client/model/armor/ModelBodyJade.java diff --git a/src/main/java/com/zivilon/cinder_loe/client/model/ModelBodySerpent.java b/src/main/java/com/zivilon/cinder_loe/client/model/armor/ModelBodySerpent.java similarity index 100% rename from src/main/java/com/zivilon/cinder_loe/client/model/ModelBodySerpent.java rename to src/main/java/com/zivilon/cinder_loe/client/model/armor/ModelBodySerpent.java diff --git a/src/main/java/com/zivilon/cinder_loe/client/model/ModelBreeKettleHelmet.java b/src/main/java/com/zivilon/cinder_loe/client/model/armor/ModelBreeKettleHelmet.java similarity index 100% rename from src/main/java/com/zivilon/cinder_loe/client/model/ModelBreeKettleHelmet.java rename to src/main/java/com/zivilon/cinder_loe/client/model/armor/ModelBreeKettleHelmet.java diff --git a/src/main/java/com/zivilon/cinder_loe/client/model/ModelBrokenHalo.java b/src/main/java/com/zivilon/cinder_loe/client/model/armor/ModelBrokenHalo.java similarity index 100% rename from src/main/java/com/zivilon/cinder_loe/client/model/ModelBrokenHalo.java rename to src/main/java/com/zivilon/cinder_loe/client/model/armor/ModelBrokenHalo.java diff --git a/src/main/java/com/zivilon/cinder_loe/client/model/ModelJadeHelmet.java b/src/main/java/com/zivilon/cinder_loe/client/model/armor/ModelJadeHelmet.java similarity index 100% rename from src/main/java/com/zivilon/cinder_loe/client/model/ModelJadeHelmet.java rename to src/main/java/com/zivilon/cinder_loe/client/model/armor/ModelJadeHelmet.java diff --git a/src/main/java/com/zivilon/cinder_loe/client/model/ModelLegsJade.java b/src/main/java/com/zivilon/cinder_loe/client/model/armor/ModelLegsJade.java similarity index 100% rename from src/main/java/com/zivilon/cinder_loe/client/model/ModelLegsJade.java rename to src/main/java/com/zivilon/cinder_loe/client/model/armor/ModelLegsJade.java diff --git a/src/main/java/com/zivilon/cinder_loe/client/model/ModelNexFireChestplate.java b/src/main/java/com/zivilon/cinder_loe/client/model/armor/ModelNexFireChestplate.java similarity index 100% rename from src/main/java/com/zivilon/cinder_loe/client/model/ModelNexFireChestplate.java rename to src/main/java/com/zivilon/cinder_loe/client/model/armor/ModelNexFireChestplate.java diff --git a/src/main/java/com/zivilon/cinder_loe/client/model/ModelNexIceChestplate.java b/src/main/java/com/zivilon/cinder_loe/client/model/armor/ModelNexIceChestplate.java similarity index 100% rename from src/main/java/com/zivilon/cinder_loe/client/model/ModelNexIceChestplate.java rename to src/main/java/com/zivilon/cinder_loe/client/model/armor/ModelNexIceChestplate.java diff --git a/src/main/java/com/zivilon/cinder_loe/client/model/ModelNexToxinChestplate.java b/src/main/java/com/zivilon/cinder_loe/client/model/armor/ModelNexToxinChestplate.java similarity index 100% rename from src/main/java/com/zivilon/cinder_loe/client/model/ModelNexToxinChestplate.java rename to src/main/java/com/zivilon/cinder_loe/client/model/armor/ModelNexToxinChestplate.java diff --git a/src/main/java/com/zivilon/cinder_loe/client/model/ModelRedDwarfHelmet.java b/src/main/java/com/zivilon/cinder_loe/client/model/armor/ModelRedDwarfHelmet.java similarity index 100% rename from src/main/java/com/zivilon/cinder_loe/client/model/ModelRedDwarfHelmet.java rename to src/main/java/com/zivilon/cinder_loe/client/model/armor/ModelRedDwarfHelmet.java diff --git a/src/main/java/com/zivilon/cinder_loe/client/model/ModelRhudaurHelmet.java b/src/main/java/com/zivilon/cinder_loe/client/model/armor/ModelRhudaurHelmet.java similarity index 100% rename from src/main/java/com/zivilon/cinder_loe/client/model/ModelRhudaurHelmet.java rename to src/main/java/com/zivilon/cinder_loe/client/model/armor/ModelRhudaurHelmet.java diff --git a/src/main/java/com/zivilon/cinder_loe/client/model/ModelUsurperHelmet.java b/src/main/java/com/zivilon/cinder_loe/client/model/armor/ModelUsurperHelmet.java similarity index 100% rename from src/main/java/com/zivilon/cinder_loe/client/model/ModelUsurperHelmet.java rename to src/main/java/com/zivilon/cinder_loe/client/model/armor/ModelUsurperHelmet.java diff --git a/src/main/java/com/zivilon/cinder_loe/client/model/ModelWarlordHelmet.java b/src/main/java/com/zivilon/cinder_loe/client/model/armor/ModelWarlordHelmet.java similarity index 100% rename from src/main/java/com/zivilon/cinder_loe/client/model/ModelWarlordHelmet.java rename to src/main/java/com/zivilon/cinder_loe/client/model/armor/ModelWarlordHelmet.java diff --git a/src/main/java/com/zivilon/cinder_loe/client/model/block/ModelForgingStation.java b/src/main/java/com/zivilon/cinder_loe/client/model/block/ModelForgingStation.java new file mode 100644 index 0000000..98afa2d --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/client/model/block/ModelForgingStation.java @@ -0,0 +1,72 @@ +package com.zivilon.cinder_loe.client.model.blocks; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +/** + * forging_station - Shinare + * Created using Tabula 4.1.1 + */ +public class ModelForgingStation extends ModelBase { + public ModelRenderer middle_block; + public ModelRenderer left_block; + public ModelRenderer right_block; + public ModelRenderer left_leg; + public ModelRenderer left_leg_top; + public ModelRenderer left_leg_base; + public ModelRenderer right_leg_front; + public ModelRenderer right_leg_back; + + public ModelForgingStation() { + this.textureWidth = 128; + this.textureHeight = 64; + this.right_leg_back = new ModelRenderer(this, 0, 0); + this.right_leg_back.setRotationPoint(4.0F, 10.0F, 0.0F); + this.right_leg_back.addBox(0.0F, 0.0F, -2.0F, 2, 2, 16, 0.0F); + this.setRotateAngle(right_leg_back, 0.7853981633974483F, 0.0F, 0.0F); + this.left_leg = new ModelRenderer(this, 0, 32); + this.left_leg.setRotationPoint(6.0F, 2.0F, 6.0F); + this.left_leg.addBox(0.0F, 0.0F, 0.0F, 4, 14, 4, 0.0F); + this.left_leg_top = new ModelRenderer(this, 0, 32); + this.left_leg_top.setRotationPoint(-1.0F, 0.0F, -1.0F); + this.left_leg_top.addBox(0.0F, 0.0F, 0.0F, 6, 2, 6, 0.0F); + this.left_block = new ModelRenderer(this, 64, 32); + this.left_block.setRotationPoint(16.0F, 0.0F, 0.0F); + this.left_block.addBox(0.0F, 0.0F, 0.0F, 16, 2, 16, 0.0F); + this.setRotateAngle(left_block, 0.0F, 3.141592653589793F, 0.0F); + this.right_leg_front = new ModelRenderer(this, 0, 0); + this.right_leg_front.setRotationPoint(11.0F, 10.0F, 0.0F); + this.right_leg_front.addBox(0.0F, 0.0F, -2.0F, 2, 2, 16, 0.0F); + this.setRotateAngle(right_leg_front, 0.7853981633974483F, 0.0F, 0.0F); + this.left_leg_base = new ModelRenderer(this, 0, 32); + this.left_leg_base.setRotationPoint(-1.0F, 12.0F, -1.0F); + this.left_leg_base.addBox(0.0F, 0.0F, 0.0F, 6, 2, 6, 0.0F); + this.right_block = new ModelRenderer(this, 64, 0); + this.right_block.setRotationPoint(0.0F, 0.0F, 16.0F); + this.right_block.addBox(0.0F, 0.0F, 0.0F, 16, 2, 16, 0.0F); + this.middle_block = new ModelRenderer(this, 0, 0); + this.middle_block.setRotationPoint(-8.0F, 8.0F, -8.0F); + this.middle_block.addBox(0.0F, 0.0F, 0.0F, 16, 16, 16, 0.0F); + this.right_block.addChild(this.right_leg_back); + this.left_block.addChild(this.left_leg); + this.left_leg.addChild(this.left_leg_top); + this.middle_block.addChild(this.left_block); + this.right_block.addChild(this.right_leg_front); + this.left_leg.addChild(this.left_leg_base); + this.middle_block.addChild(this.right_block); + } + + public void render(float f5) { + this.middle_block.render(f5); + } + + /** + * This is a helper function from Tabula to set the rotation of model parts + */ + public void setRotateAngle(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/Modelverticalweaponrack.java b/src/main/java/com/zivilon/cinder_loe/client/model/block/Modelverticalweaponrack.java similarity index 100% rename from src/main/java/com/zivilon/cinder_loe/client/model/Modelverticalweaponrack.java rename to src/main/java/com/zivilon/cinder_loe/client/model/block/Modelverticalweaponrack.java diff --git a/src/main/java/com/zivilon/cinder_loe/client/model/barricade_post.java b/src/main/java/com/zivilon/cinder_loe/client/model/block/barricade_post.java similarity index 100% rename from src/main/java/com/zivilon/cinder_loe/client/model/barricade_post.java rename to src/main/java/com/zivilon/cinder_loe/client/model/block/barricade_post.java diff --git a/src/main/java/com/zivilon/cinder_loe/client/model/ModelFangornAuroch.java b/src/main/java/com/zivilon/cinder_loe/client/model/entity/ModelFangornAuroch.java similarity index 100% rename from src/main/java/com/zivilon/cinder_loe/client/model/ModelFangornAuroch.java rename to src/main/java/com/zivilon/cinder_loe/client/model/entity/ModelFangornAuroch.java diff --git a/src/main/java/com/zivilon/cinder_loe/client/model/ModelFangornElk.java b/src/main/java/com/zivilon/cinder_loe/client/model/entity/ModelFangornElk.java similarity index 100% rename from src/main/java/com/zivilon/cinder_loe/client/model/ModelFangornElk.java rename to src/main/java/com/zivilon/cinder_loe/client/model/entity/ModelFangornElk.java diff --git a/src/main/java/com/zivilon/cinder_loe/client/model/ModelFangornWolf.java b/src/main/java/com/zivilon/cinder_loe/client/model/entity/ModelFangornWolf.java similarity index 100% rename from src/main/java/com/zivilon/cinder_loe/client/model/ModelFangornWolf.java rename to src/main/java/com/zivilon/cinder_loe/client/model/entity/ModelFangornWolf.java diff --git a/src/main/java/com/zivilon/cinder_loe/client/model/entity/ModelNex.java b/src/main/java/com/zivilon/cinder_loe/client/model/entity/ModelNex.java new file mode 100644 index 0000000..2c5d794 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/client/model/entity/ModelNex.java @@ -0,0 +1,200 @@ +package com.zivilon.cinder_loe.client.model; + +import lotr.common.LOTRConfig; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.util.MathHelper; + +public class ModelNex extends ModelBase { + public ModelRenderer body; + + public ModelRenderer neck; + + public ModelRenderer head; + + public ModelRenderer rightArm; + + public ModelRenderer leftArm; + + public ModelRenderer rightLeg; + + public ModelRenderer leftLeg; + + public ModelRenderer tail; + + public ModelRenderer rightWing; + + public ModelRenderer leftWing; + + private boolean isFireModel; + + public int heldItemRight; + + public ModelNex() { + this(0.0F); + } + + public ModelNex(float f) { + this.textureWidth = 128; + this.textureHeight = 256; + this.body = new ModelRenderer(this, 0, 38); + this.body.setRotationPoint(0.0F, 7.0F, 3.0F); + this.body.addBox(-8.0F, -15.0F, -6.0F, 16, 18, 12, f); + this.body.setTextureOffset(0, 207); + this.body.addBox(-9.0F, -6.5F, -7.0F, 7, 1, 14, f); + this.body.addBox(-9.0F, -9.5F, -7.0F, 7, 1, 14, f); + this.body.addBox(-9.0F, -12.5F, -7.0F, 7, 1, 14, f); + this.body.mirror = true; + this.body.addBox(2.0F, -6.5F, -7.0F, 7, 1, 14, f); + this.body.addBox(2.0F, -9.5F, -7.0F, 7, 1, 14, f); + this.body.addBox(2.0F, -12.5F, -7.0F, 7, 1, 14, f); + this.body.mirror = false; + this.body.setTextureOffset(0, 0).addBox(-9.0F, -29.0F, -7.0F, 18, 14, 15, f); + this.body.setTextureOffset(81, 163).addBox(-2.0F, -21.0F, 5.5F, 4, 25, 2, f); + this.neck = new ModelRenderer(this, 76, 0); + this.neck.setRotationPoint(0.0F, -25.0F, -3.0F); + this.neck.addBox(-6.0F, -5.0F, -10.0F, 12, 12, 14, f); + this.body.addChild(this.neck); + this.head = new ModelRenderer(this, 92, 48); + this.head.setRotationPoint(0.0F, 0.0F, -10.0F); + this.head.addBox(-4.0F, -6.0F, -6.0F, 8, 10, 7, f); + this.head.setTextureOffset(57, 58).addBox(-6.0F, -7.0F, -4.0F, 12, 4, 4, f); + this.head.rotateAngleX = (float)Math.toRadians(10.0D); + this.neck.addChild(this.head); + ModelRenderer rightHorn1 = new ModelRenderer(this, 57, 47); + rightHorn1.setRotationPoint(-6.0F, -5.0F, -2.0F); + rightHorn1.addBox(-7.0F, -1.5F, -1.5F, 8, 3, 3, f); + rightHorn1.rotateAngleY = (float)Math.toRadians(-35.0D); + this.head.addChild(rightHorn1); + ModelRenderer rightHorn2 = new ModelRenderer(this, 57, 35); + rightHorn2.setRotationPoint(-7.0F, 0.0F, 0.0F); + rightHorn2.addBox(-1.0F, -1.0F, -6.0F, 2, 2, 6, f); + rightHorn2.rotateAngleY = (float)Math.toRadians(45.0D); + rightHorn1.addChild(rightHorn2); + ModelRenderer leftHorn1 = new ModelRenderer(this, 57, 47); + leftHorn1.setRotationPoint(6.0F, -5.0F, -2.0F); + leftHorn1.mirror = true; + leftHorn1.addBox(-1.0F, -1.5F, -1.5F, 8, 3, 3, f); + leftHorn1.rotateAngleY = (float)Math.toRadians(35.0D); + this.head.addChild(leftHorn1); + ModelRenderer leftHorn2 = new ModelRenderer(this, 57, 35); + leftHorn2.setRotationPoint(7.0F, 0.0F, 0.0F); + leftHorn2.mirror = true; + leftHorn2.addBox(-1.0F, -1.0F, -6.0F, 2, 2, 6, f); + leftHorn2.rotateAngleY = (float)Math.toRadians(-45.0D); + leftHorn1.addChild(leftHorn2); + this.rightArm = new ModelRenderer(this, 59, 136); + this.rightArm.setRotationPoint(-9.0F, -25.0F, 0.0F); + this.rightArm.addBox(-7.0F, -2.0F, -4.0F, 7, 10, 8, f); + this.rightArm.setTextureOffset(93, 136).addBox(-6.5F, 8.0F, -3.0F, 6, 16, 6, f); + this.body.addChild(this.rightArm); + this.leftArm = new ModelRenderer(this, 59, 136); + this.leftArm.setRotationPoint(9.0F, -25.0F, 0.0F); + this.leftArm.mirror = true; + this.leftArm.addBox(0.0F, -2.0F, -4.0F, 7, 10, 8, f); + this.leftArm.setTextureOffset(93, 136).addBox(0.5F, 8.0F, -3.0F, 6, 16, 6, f); + this.body.addChild(this.leftArm); + this.rightLeg = new ModelRenderer(this, 46, 230); + this.rightLeg.setRotationPoint(-6.0F, 6.0F, 3.0F); + this.rightLeg.addBox(-7.0F, -2.0F, -4.0F, 7, 9, 8, f); + this.rightLeg.setTextureOffset(46, 208).addBox(-6.5F, 2.0F, 4.0F, 6, 13, 5, f); + ModelRenderer rightFoot = new ModelRenderer(this, 0, 243); + rightFoot.setRotationPoint(0.0F, 0.0F, 0.0F); + rightFoot.addBox(-7.0F, 15.0F, -6.0F, 7, 3, 9, f); + rightFoot.rotateAngleX = (float)Math.toRadians(25.0D); + this.rightLeg.addChild(rightFoot); + this.leftLeg = new ModelRenderer(this, 46, 230); + this.leftLeg.setRotationPoint(6.0F, 6.0F, 3.0F); + this.leftLeg.mirror = true; + this.leftLeg.addBox(0.0F, -2.0F, -4.0F, 7, 9, 8, f); + this.leftLeg.setTextureOffset(46, 208).addBox(0.5F, 2.0F, 4.0F, 6, 13, 5, f); + ModelRenderer leftFoot = new ModelRenderer(this, 0, 243); + leftFoot.setRotationPoint(0.0F, 0.0F, 0.0F); + leftFoot.mirror = true; + leftFoot.addBox(0.0F, 15.0F, -6.0F, 7, 3, 9, f); + leftFoot.rotateAngleX = (float)Math.toRadians(25.0D); + this.leftLeg.addChild(leftFoot); + this.tail = new ModelRenderer(this, 79, 200); + this.tail.setRotationPoint(0.0F, -3.0F, 3.0F); + this.tail.addBox(-3.5F, -3.0F, 2.0F, 7, 7, 10, f); + this.tail.setTextureOffset(80, 225).addBox(-2.5F, -2.5F, 11.0F, 5, 5, 14, f); + this.tail.setTextureOffset(96, 175).addBox(-1.5F, -2.0F, 24.0F, 3, 3, 12, f); + this.body.addChild(this.tail); + this.rightWing = new ModelRenderer(this, 0, 137); + this.rightWing.setRotationPoint(-6.0F, -27.0F, 4.0F); + this.rightWing.addBox(-1.5F, -1.5F, 0.0F, 3, 3, 25, f); + this.rightWing.setTextureOffset(0, 167).addBox(-1.0F, -2.0F, 25.0F, 2, 24, 2, f); + this.rightWing.setTextureOffset(0, 30).addBox(-0.5F, -7.0F, 25.5F, 1, 5, 1, f); + this.rightWing.setTextureOffset(0, 69).addBox(0.0F, 0.0F, 0.0F, 0, 35, 25, f); + this.body.addChild(this.rightWing); + this.leftWing = new ModelRenderer(this, 0, 137); + this.leftWing.setRotationPoint(6.0F, -27.0F, 4.0F); + this.leftWing.mirror = true; + this.leftWing.addBox(-1.5F, -1.5F, 0.0F, 3, 3, 25, f); + this.leftWing.setTextureOffset(0, 167).addBox(-1.0F, -2.0F, 25.0F, 2, 24, 2, f); + this.leftWing.setTextureOffset(0, 30).addBox(-0.5F, -7.0F, 25.5F, 1, 5, 1, f); + this.leftWing.setTextureOffset(0, 69).addBox(0.0F, 0.0F, 0.0F, 0, 35, 25, f); + this.body.addChild(this.leftWing); + } + + public void setFireModel() { + this.isFireModel = true; + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + this.rightWing.showModel = true; + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.body.render(f5); + this.rightLeg.render(f5); + this.leftLeg.render(f5); + } + + public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) { + this.neck.rotateAngleX = (float)Math.toRadians(-10.0D); + this.neck.rotateAngleY = 0.0F; + this.neck.rotateAngleX += f4 / (float)Math.toDegrees(1.0D); + this.neck.rotateAngleY += f3 / (float)Math.toDegrees(1.0D); + this.body.rotateAngleX = (float)Math.toRadians(10.0D); + this.body.rotateAngleX += MathHelper.cos(f2 * 0.03F) * 0.15F; + this.rightArm.rotateAngleX = 0.0F; + this.leftArm.rotateAngleX = 0.0F; + this.rightArm.rotateAngleZ = 0.0F; + this.leftArm.rotateAngleZ = 0.0F; + this.rightArm.rotateAngleX += MathHelper.cos(f * 0.4F + 3.1415927F) * 0.8F * f1; + this.leftArm.rotateAngleX += MathHelper.cos(f * 0.4F) * 0.8F * f1; + this.rightArm.rotateAngleZ += MathHelper.cos(f2 * 0.09F) * 0.05F + 0.05F; + this.leftArm.rotateAngleZ -= MathHelper.cos(f2 * 0.09F) * 0.05F + 0.05F; + if (this.onGround > -9990.0F) { + float f6 = this.onGround; + this.rightArm.rotateAngleY += this.body.rotateAngleY; + this.leftArm.rotateAngleY += this.body.rotateAngleY; + this.leftArm.rotateAngleX += this.body.rotateAngleY; + f6 = 1.0F - this.onGround; + f6 *= f6; + f6 *= f6; + f6 = 1.0F - f6; + float f7 = MathHelper.sin(f6 * 3.1415927F); + float f8 = MathHelper.sin(this.onGround * 3.1415927F) * -(this.head.rotateAngleX - 0.7F) * 0.75F; + this.rightArm.rotateAngleX = (float)(this.rightArm.rotateAngleX - f7 * 1.2D + f8); + this.rightArm.rotateAngleY += this.body.rotateAngleY * 2.0F; + this.rightArm.rotateAngleZ = MathHelper.sin(this.onGround * 3.1415927F) * -0.4F; + } + if (this.heldItemRight != 0) + this.rightArm.rotateAngleX = this.rightArm.rotateAngleX * 0.5F - 0.31415927F * this.heldItemRight; + this.rightLeg.rotateAngleX = (float)Math.toRadians(-25.0D); + this.leftLeg.rotateAngleX = (float)Math.toRadians(-25.0D); + this.rightLeg.rotateAngleX += MathHelper.sin(f * 0.4F) * 1.2F * f1; + this.leftLeg.rotateAngleX += MathHelper.sin(f * 0.4F + 3.1415927F) * 1.2F * f1; + this.rightWing.rotateAngleX = (float)Math.toRadians(40.0D); + this.leftWing.rotateAngleX = (float)Math.toRadians(40.0D); + this.rightWing.rotateAngleY = (float)Math.toRadians(-40.0D); + this.leftWing.rotateAngleY = (float)Math.toRadians(40.0D); + this.rightWing.rotateAngleY += MathHelper.cos(f2 * 0.04F) * 0.5F; + this.leftWing.rotateAngleY -= MathHelper.cos(f2 * 0.04F) * 0.5F; + this.tail.rotateAngleX = (float)Math.toRadians(-40.0D); + this.tail.rotateAngleY = 0.0F; + this.tail.rotateAngleY += MathHelper.cos(f2 * 0.05F) * 0.15F; + this.tail.rotateAngleY += MathHelper.sin(f * 0.1F) * 0.6F * f1; + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/client/render/block/RenderIceCage.java b/src/main/java/com/zivilon/cinder_loe/client/render/block/RenderIceCage.java new file mode 100644 index 0000000..bfb8b72 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/client/render/block/RenderIceCage.java @@ -0,0 +1,69 @@ +package com.zivilon.cinder_loe.client.render.block; + +import com.zivilon.cinder_loe.blocks.IceCage; +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import cpw.mods.fml.client.registry.RenderingRegistry; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.world.IBlockAccess; +import org.lwjgl.opengl.GL11; + +public class RenderIceCage implements ISimpleBlockRenderingHandler { + + public static final int RENDER_ID = RenderingRegistry.getNextAvailableRenderId(); + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { + if (modelID != RENDER_ID) return; + + // Render inventory block as flat texture icon + renderer.renderBlockAsItem(block, metadata, 1.0F); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + if (!(block instanceof IceCage) || modelId != RENDER_ID) { + return false; + } + + int meta = world.getBlockMetadata(x, y, z); + float thickness = 0.0625F; // 1/16th of a block thickness + + // Render the bounding boxes as defined in the block class + if (meta == 0) { // Lower part + renderer.setRenderBounds(0, 0, 0, thickness, 1, 1); // Left wall + renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(1 - thickness, 0, 0, 1, 1, 1); // Right wall + renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(0, 0, 0, 1, 1, thickness); // Front wall + renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(0, 0, 1 - thickness, 1, 1, 1); // Back wall + renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(0, 0, 0, 1, thickness, 1); // Floor + renderer.renderStandardBlock(block, x, y, z); + } else if (meta == 1) { // Upper part + renderer.setRenderBounds(0, 0, 0, thickness, 1, 1); // Left wall + renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(1 - thickness, 0, 0, 1, 1, 1); // Right wall + renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(0, 0, 0, 1, 1, thickness); // Front wall + renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(0, 0, 1 - thickness, 1, 1, 1); // Back wall + renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(0, 1, 0, 1, 1 + thickness, 1); // Ceiling + renderer.renderStandardBlock(block, x, y, z); + } + + return true; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return false; // Do not render as 3D in inventory + } + + @Override + public int getRenderId() { + return RENDER_ID; + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/client/render/effect/RenderNimveilBolt.java b/src/main/java/com/zivilon/cinder_loe/client/render/effect/RenderNimveilBolt.java new file mode 100644 index 0000000..908fb5d --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/client/render/effect/RenderNimveilBolt.java @@ -0,0 +1,136 @@ +package com.zivilon.cinder_loe.client.render.effect; + +import com.zivilon.cinder_loe.entity.effect.NimveilLightningBolt; + +import net.minecraft.client.renderer.entity.RenderLightningBolt; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.Random; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderNimveilBolt extends RenderLightningBolt { + + public void doRender(NimveilLightningBolt p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_, float p_76986_8_, float p_76986_9_) { + Tessellator tessellator = Tessellator.instance; + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + double[] adouble = new double[8]; + double[] adouble1 = new double[8]; + double d3 = 0.0D; + double d4 = 0.0D; + Random random = new Random(p_76986_1_.boltVertex); + + for (int i = 7; i >= 0; --i) { + adouble[i] = d3; + adouble1[i] = d4; + d3 += (double)(random.nextInt(11) - 5); + d4 += (double)(random.nextInt(11) - 5); + } + + for (int k1 = 0; k1 < 4; ++k1) { + Random random1 = new Random(p_76986_1_.boltVertex); + + for (int j = 0; j < 3; ++j) { + int k = 7; + int l = 0; + + if (j > 0) { + k = 7 - j; + } + + if (j > 0) { + l = k - 2; + } + + double d5 = adouble[k] - d3; + double d6 = adouble1[k] - d4; + + for (int i1 = k; i1 >= l; --i1) { + double d7 = d5; + double d8 = d6; + + if (j == 0) { + d5 += (double)(random1.nextInt(11) - 5); + d6 += (double)(random1.nextInt(11) - 5); + } else { + d5 += (double)(random1.nextInt(31) - 15); + d6 += (double)(random1.nextInt(31) - 15); + } + + tessellator.startDrawing(5); + float f2 = 0.5F; + tessellator.setColorRGBA_F(0.9F * f2, 0.9F * f2, 1.0F * f2, 0.3F); + double d9 = 0.1D + (double)k1 * 0.2D; + + if (j == 0) { + d9 *= (double)i1 * 0.1D + 1.0D; + } + + double d10 = 0.1D + (double)k1 * 0.2D; + + if (j == 0) { + d10 *= (double)(i1 - 1) * 0.1D + 1.0D; + } + + for (int j1 = 0; j1 < 5; ++j1) { + double d11 = p_76986_2_ + 0.5D - d9; + double d12 = p_76986_6_ + 0.5D - d9; + + if (j1 == 1 || j1 == 2) { + d11 += d9 * 2.0D; + } + + if (j1 == 2 || j1 == 3) { + d12 += d9 * 2.0D; + } + + double d13 = p_76986_2_ + 0.5D - d10; + double d14 = p_76986_6_ + 0.5D - d10; + + if (j1 == 1 || j1 == 2) { + d13 += d10 * 2.0D; + } + + if (j1 == 2 || j1 == 3) { + d14 += d10 * 2.0D; + } + + tessellator.addVertex(d13 + d5, p_76986_4_ + (double)(i1 * 16), d14 + d6); + tessellator.addVertex(d11 + d7, p_76986_4_ + (double)((i1 + 1) * 16), d12 + d8); + } + + tessellator.draw(); + } + } + } + + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_TEXTURE_2D); + } + + /** + * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture. + */ + public ResourceLocation getEntityTexture(NimveilLightningBolt p_110775_1_) { + return null; + } + + /** + * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture. + */ + public ResourceLocation getEntityTexture(Entity p_110775_1_) { + return this.getEntityTexture((NimveilLightningBolt)p_110775_1_); + } + + public void doRender(Entity p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_, float p_76986_8_, float p_76986_9_) + { + this.doRender((NimveilLightningBolt)p_76986_1_, p_76986_2_, p_76986_4_, p_76986_6_, p_76986_8_, p_76986_9_); + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/client/render/RenderBattleNun.java b/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderBattleNun.java similarity index 96% rename from src/main/java/com/zivilon/cinder_loe/client/render/RenderBattleNun.java rename to src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderBattleNun.java index bb0cfae..334e75c 100644 --- a/src/main/java/com/zivilon/cinder_loe/client/render/RenderBattleNun.java +++ b/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderBattleNun.java @@ -1,4 +1,4 @@ -package com.zivilon.cinder_loe.client.render; +package com.zivilon.cinder_loe.client.render.entity; import com.zivilon.cinder_loe.entity.npc.good_human.BattleNun; import lotr.client.model.LOTRModelHuman; diff --git a/src/main/java/com/zivilon/cinder_loe/client/render/RenderDarkSpider.java b/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderDarkSpider.java similarity index 89% rename from src/main/java/com/zivilon/cinder_loe/client/render/RenderDarkSpider.java rename to src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderDarkSpider.java index 0dbe36d..673df6f 100644 --- a/src/main/java/com/zivilon/cinder_loe/client/render/RenderDarkSpider.java +++ b/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderDarkSpider.java @@ -1,4 +1,4 @@ -package com.zivilon.cinder_loe.client.render; +package com.zivilon.cinder_loe.client.render.entity; import lotr.client.render.entity.LOTRRenderSpiderBase; import lotr.client.render.entity.LOTRRenderUtumnoIceSpider; @@ -11,4 +11,4 @@ public class RenderDarkSpider extends LOTRRenderUtumnoIceSpider { protected ResourceLocation getEntityTexture(Entity entity) { return spiderSkin; } -} \ No newline at end of file +} diff --git a/src/main/java/com/zivilon/cinder_loe/client/render/RenderFangornAuroch.java b/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderFangornAuroch.java similarity index 94% rename from src/main/java/com/zivilon/cinder_loe/client/render/RenderFangornAuroch.java rename to src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderFangornAuroch.java index 8378879..11922b2 100644 --- a/src/main/java/com/zivilon/cinder_loe/client/render/RenderFangornAuroch.java +++ b/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderFangornAuroch.java @@ -1,4 +1,4 @@ -package com.zivilon.cinder_loe.client.render; +package com.zivilon.cinder_loe.client.render.entity; import lotr.client.render.entity.LOTRRandomSkins; import lotr.common.entity.LOTRRandomSkinEntity; @@ -23,4 +23,4 @@ public class RenderFangornAuroch extends RenderLiving { ResourceLocation skin = aurochsSkins.getRandomSkin((LOTRRandomSkinEntity)aurochs); return skin; } -} \ No newline at end of file +} diff --git a/src/main/java/com/zivilon/cinder_loe/client/render/RenderFangornBear.java b/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderFangornBear.java similarity index 96% rename from src/main/java/com/zivilon/cinder_loe/client/render/RenderFangornBear.java rename to src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderFangornBear.java index 332c86f..0e4a67b 100644 --- a/src/main/java/com/zivilon/cinder_loe/client/render/RenderFangornBear.java +++ b/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderFangornBear.java @@ -1,4 +1,4 @@ -package com.zivilon.cinder_loe.client.render; +package com.zivilon.cinder_loe.client.render.entity; import com.zivilon.cinder_loe.entity.npc.radagast.FangornBear; diff --git a/src/main/java/com/zivilon/cinder_loe/client/render/RenderFangornElk.java b/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderFangornElk.java similarity index 94% rename from src/main/java/com/zivilon/cinder_loe/client/render/RenderFangornElk.java rename to src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderFangornElk.java index a34b632..f952b96 100644 --- a/src/main/java/com/zivilon/cinder_loe/client/render/RenderFangornElk.java +++ b/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderFangornElk.java @@ -1,4 +1,4 @@ -package com.zivilon.cinder_loe.client.render; +package com.zivilon.cinder_loe.client.render.entity; import lotr.common.entity.LOTRRandomSkinEntity; import lotr.client.render.entity.LOTRRandomSkins; @@ -26,4 +26,4 @@ public class RenderFangornElk extends RenderLiving { ResourceLocation elkSkin = elkSkins.getRandomSkin((LOTRRandomSkinEntity)elk); return elkSkin; } -} \ No newline at end of file +} diff --git a/src/main/java/com/zivilon/cinder_loe/client/render/RenderFangornWildBoar.java b/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderFangornWildBoar.java similarity index 92% rename from src/main/java/com/zivilon/cinder_loe/client/render/RenderFangornWildBoar.java rename to src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderFangornWildBoar.java index b6dd3e0..890974a 100644 --- a/src/main/java/com/zivilon/cinder_loe/client/render/RenderFangornWildBoar.java +++ b/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderFangornWildBoar.java @@ -1,4 +1,4 @@ -package com.zivilon.cinder_loe.client.render; +package com.zivilon.cinder_loe.client.render.entity; import lotr.client.model.LOTRModelBoar; diff --git a/src/main/java/com/zivilon/cinder_loe/client/render/RenderFangornWolf.java b/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderFangornWolf.java similarity index 92% rename from src/main/java/com/zivilon/cinder_loe/client/render/RenderFangornWolf.java rename to src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderFangornWolf.java index 454233e..762a7b1 100644 --- a/src/main/java/com/zivilon/cinder_loe/client/render/RenderFangornWolf.java +++ b/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderFangornWolf.java @@ -1,4 +1,4 @@ -package com.zivilon.cinder_loe.client.render; +package com.zivilon.cinder_loe.client.render.entity; import net.minecraft.client.model.ModelBase; import net.minecraft.client.renderer.entity.RenderLiving; diff --git a/src/main/java/com/zivilon/cinder_loe/client/render/RenderLimwaith.java b/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderLimwaith.java similarity index 96% rename from src/main/java/com/zivilon/cinder_loe/client/render/RenderLimwaith.java rename to src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderLimwaith.java index df82b8e..f759d9a 100644 --- a/src/main/java/com/zivilon/cinder_loe/client/render/RenderLimwaith.java +++ b/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderLimwaith.java @@ -1,4 +1,4 @@ -package com.zivilon.cinder_loe.client.render; +package com.zivilon.cinder_loe.client.render.entity; import lotr.client.model.LOTRModelHuman; import lotr.client.render.entity.LOTRRenderBiped; @@ -38,4 +38,4 @@ public class RenderLimwaith extends LOTRRenderBiped { Limwaith limwaith = (Limwaith)entity; return super.shouldRenderPass((EntityLiving)limwaith, pass, f); } -} \ No newline at end of file +} diff --git a/src/main/java/com/zivilon/cinder_loe/client/render/RenderLimwaithShaman.java b/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderLimwaithShaman.java similarity index 94% rename from src/main/java/com/zivilon/cinder_loe/client/render/RenderLimwaithShaman.java rename to src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderLimwaithShaman.java index 7b92011..be35147 100644 --- a/src/main/java/com/zivilon/cinder_loe/client/render/RenderLimwaithShaman.java +++ b/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderLimwaithShaman.java @@ -1,4 +1,4 @@ -package com.zivilon.cinder_loe.client.render; +package com.zivilon.cinder_loe.client.render.entity; import com.zivilon.cinder_loe.entity.npc.evil_human.Limwaith; import lotr.client.render.entity.LOTRRandomSkins; diff --git a/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderNex.java b/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderNex.java new file mode 100644 index 0000000..11bd230 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderNex.java @@ -0,0 +1,136 @@ +package com.zivilon.cinder_loe.client.render.entity; + +import com.zivilon.cinder_loe.client.model.ModelNex; +import com.zivilon.cinder_loe.entity.npc.frozen_dungeon.Nex; +import lotr.client.render.entity.LOTRRandomSkins; +import lotr.common.entity.LOTRRandomSkinEntity; +import lotr.common.entity.npc.LOTREntityBalrog; +import lotr.client.render.entity.LOTRRandomSkins; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.entity.RenderLiving; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MathHelper; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +public class RenderNex extends RenderLiving { + private static LOTRRandomSkins balrogSkins; + + private static LOTRRandomSkins balrogSkinsBright; + + private static final ResourceLocation fireTexture = new ResourceLocation("lotr:mob/balrog/fire.png"); + + private ModelNex balrogModel; + + private ModelNex balrogModelBright; + + private ModelNex fireModel; + + public RenderNex() { + super((ModelBase)new ModelNex(), 0.5F); + this.balrogModel = (ModelNex)this.mainModel; + this.balrogModelBright = new ModelNex(0.05F); + this.fireModel = new ModelNex(0.0F); + this.fireModel.setFireModel(); + balrogSkins = LOTRRandomSkins.loadSkinsList("lotr:mob/balrog/balrog"); + balrogSkinsBright = LOTRRandomSkins.loadSkinsList("lotr:mob/balrog/balrog_bright"); + } + + protected ResourceLocation getEntityTexture(Entity entity) { + return balrogSkins.getRandomSkin((LOTRRandomSkinEntity)entity); + } + + public void doRender(Entity entity, double d, double d1, double d2, float f, float f1) { + Nex balrog = (Nex)entity; + ItemStack heldItem = balrog.getHeldItem(); + this.fireModel.heldItemRight = (heldItem == null) ? 0 : 2; + doRender((EntityLiving)balrog, d, d1, d2, f, f1); + } + + protected void preRenderCallback(EntityLivingBase entity, float f) { + Nex balrog = (Nex)entity; + float scale = 2.0F; + GL11.glScalef(scale, scale, scale); + } + + private void setupFullBright() { + int light = 15728880; + int lx = light % 65536; + int ly = light / 65536; + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, lx / 1.0F, ly / 1.0F); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + } + + protected int shouldRenderPass(EntityLivingBase entity, int pass, float f) { + Nex balrog = (Nex)entity; + if (pass == 1) { + float alpha; + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240.0F, 240.0F); + GL11.glMatrixMode(5890); + GL11.glLoadIdentity(); + float f1 = balrog.ticksExisted + f; + float f2 = f1 * 0.01F; + float f3 = f1 * 0.01F; + GL11.glTranslatef(f2, f3, 0.0F); + GL11.glMatrixMode(5888); + GL11.glAlphaFunc(516, 0.01F); + GL11.glEnable(3042); + GL11.glBlendFunc(1, 1); + alpha = 0.3F + MathHelper.sin(f1 * 0.05F) * 0.15F; + GL11.glColor4f(alpha, alpha, alpha, 1.0F); + GL11.glDisable(2896); + GL11.glDepthMask(false); + setRenderPassModel((ModelBase)this.fireModel); + bindTexture(fireTexture); + return 1; + } + if (pass == 2) { + GL11.glMatrixMode(5890); + GL11.glLoadIdentity(); + GL11.glMatrixMode(5888); + GL11.glAlphaFunc(516, 0.1F); + GL11.glDisable(3042); + GL11.glEnable(2896); + GL11.glDepthMask(true); + GL11.glDisable(2896); + setupFullBright(); + setRenderPassModel((ModelBase)this.balrogModelBright); + bindTexture(balrogSkinsBright.getRandomSkin((LOTRRandomSkinEntity)balrog)); + GL11.glEnable(3042); + GL11.glBlendFunc(770, 771); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + return 1; + } + if (pass == 3) { + GL11.glEnable(2896); + GL11.glDisable(3042); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + } + return -1; + } + + protected void renderEquippedItems(EntityLivingBase entity, float f) { + GL11.glColor3f(1.0F, 1.0F, 1.0F); + ItemStack heldItem = entity.getHeldItem(); + if (heldItem != null) { + GL11.glPushMatrix(); + this.balrogModel.body.postRender(0.0625F); + this.balrogModel.rightArm.postRender(0.0625F); + GL11.glTranslatef(-0.25F, 1.5F, -0.125F); + float scale = 1.25F; + GL11.glScalef(scale, -scale, scale); + GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); + this.renderManager.itemRenderer.renderItem(entity, heldItem, 0); + if (heldItem.getItem().requiresMultipleRenderPasses()) + for (int x = 1; x < heldItem.getItem().getRenderPasses(heldItem.getItemDamage()); x++) + this.renderManager.itemRenderer.renderItem(entity, heldItem, x); + GL11.glPopMatrix(); + } + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderNexCloud.java b/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderNexCloud.java new file mode 100644 index 0000000..01df339 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderNexCloud.java @@ -0,0 +1,50 @@ +package com.zivilon.cinder_loe.client.render.entity; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +import com.zivilon.cinder_loe.entity.npc.frozen_dungeon.NexCloud; + +public class RenderNexCloud extends Render { + + public static ResourceLocation GREEN_PIXEL_TEXTURE = new ResourceLocation("cinder_loe:mob/green.png"); + public ModelBase model = new ModelBase() {}; // Create an empty ModelBase instance + public ModelRenderer cube; + + public RenderNexCloud() { + this.cube = new ModelRenderer(this.model, 0, 0); + this.cube.addBox(-8F, -8F, -8F, 16, 16, 16); // Define a cube of 16x16x16 pixels + } + + @Override + protected ResourceLocation getEntityTexture(Entity entity) { + return GREEN_PIXEL_TEXTURE; + } + + @Override + public void doRender(Entity entity, double x, double y, double z, float entityYaw, float partialTicks) { + GL11.glPushMatrix(); + GL11.glTranslatef((float) x, (float) y + entity.height / 2, (float) z); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glDisable(GL11.GL_CULL_FACE); // Disable face culling + + this.bindEntityTexture(entity); // Bind the single-pixel texture + + NexCloud nexCloud = (NexCloud) entity; + GL11.glColor4f(1.0F, 1.0F, 1.0F, nexCloud.opacity); // Use the opacity from the entity + + // Render the cube model + GL11.glScalef(entity.width, entity.height, entity.width); + this.cube.render(0.0625F); // Render the cube with a scaling factor + + GL11.glEnable(GL11.GL_CULL_FACE); // Re-enable face culling + GL11.glDisable(GL11.GL_BLEND); + GL11.glPopMatrix(); + } + +} diff --git a/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderNexMiniboss.java b/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderNexMiniboss.java new file mode 100644 index 0000000..6c47914 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderNexMiniboss.java @@ -0,0 +1,49 @@ +package com.zivilon.cinder_loe.client.render.entity; + +import com.zivilon.cinder_loe.entity.npc.frozen_dungeon.*; + +import lotr.client.model.LOTRModelHuman; +import lotr.client.render.entity.LOTRRenderBiped; +import net.minecraft.client.model.ModelBiped; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +public class RenderNexMiniboss extends LOTRRenderBiped { + public static ResourceLocation SHADOW_TEXTURE = new ResourceLocation("cinder_loe:mob/nex/shadow.png"); + public static ResourceLocation FIRE_TEXTURE = new ResourceLocation("cinder_loe:mob/nex/fire.png"); + public static ResourceLocation ICE_TEXTURE = new ResourceLocation("cinder_loe:mob/nex/ice.png"); + public static ResourceLocation TOXIN_TEXTURE = new ResourceLocation("cinder_loe:mob/nex/toxin.png"); + + public RenderNexMiniboss() { + super(new LOTRModelHuman(), 0.0F); + } + + @Override + protected ResourceLocation getEntityTexture(Entity entity) { + if (entity instanceof NexToxin) { + return TOXIN_TEXTURE; + } else if (entity instanceof NexFire) { + return FIRE_TEXTURE; + } else if (entity instanceof NexIce) { + return ICE_TEXTURE; + } else { + return SHADOW_TEXTURE; + } + } + + @Override + protected void preRenderCallback(EntityLivingBase entity, float partialTickTime) { + super.preRenderCallback(entity, partialTickTime); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.5F); // Apply 50% transparency + } + + @Override + protected void renderModel(EntityLivingBase entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch, float scaleFactor) { + super.renderModel(entity, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, scaleFactor); + GL11.glDisable(GL11.GL_BLEND); + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/client/render/RenderRenegade.java b/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderRenegade.java similarity index 97% rename from src/main/java/com/zivilon/cinder_loe/client/render/RenderRenegade.java rename to src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderRenegade.java index 37b9ae3..1359057 100644 --- a/src/main/java/com/zivilon/cinder_loe/client/render/RenderRenegade.java +++ b/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderRenegade.java @@ -1,4 +1,4 @@ -package com.zivilon.cinder_loe.client.render; +package com.zivilon.cinder_loe.client.render.entity; import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.ModelBiped; diff --git a/src/main/java/com/zivilon/cinder_loe/client/render/RenderTamedCrocodile.java b/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderTamedCrocodile.java similarity index 92% rename from src/main/java/com/zivilon/cinder_loe/client/render/RenderTamedCrocodile.java rename to src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderTamedCrocodile.java index 8aefe9c..79a3659 100644 --- a/src/main/java/com/zivilon/cinder_loe/client/render/RenderTamedCrocodile.java +++ b/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderTamedCrocodile.java @@ -1,4 +1,4 @@ -package com.zivilon.cinder_loe.client.render; +package com.zivilon.cinder_loe.client.render.entity; import lotr.client.model.LOTRModelBoar; import lotr.client.model.LOTRModelCrocodile; diff --git a/src/main/java/com/zivilon/cinder_loe/client/render/RenderUtumnoSlave.java b/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderUtumnoSlave.java similarity index 95% rename from src/main/java/com/zivilon/cinder_loe/client/render/RenderUtumnoSlave.java rename to src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderUtumnoSlave.java index ecabba9..86004b8 100644 --- a/src/main/java/com/zivilon/cinder_loe/client/render/RenderUtumnoSlave.java +++ b/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderUtumnoSlave.java @@ -1,4 +1,4 @@ -package com.zivilon.cinder_loe.client.render; +package com.zivilon.cinder_loe.client.render.entity; import lotr.client.model.LOTRModelHuman; import lotr.client.render.entity.LOTRRenderBiped; diff --git a/src/main/java/com/zivilon/cinder_loe/client/render/RenderWraith.java b/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderWraith.java similarity index 96% rename from src/main/java/com/zivilon/cinder_loe/client/render/RenderWraith.java rename to src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderWraith.java index d9ad866..9ac378e 100644 --- a/src/main/java/com/zivilon/cinder_loe/client/render/RenderWraith.java +++ b/src/main/java/com/zivilon/cinder_loe/client/render/entity/RenderWraith.java @@ -1,4 +1,4 @@ -package com.zivilon.cinder_loe.client.render; +package com.zivilon.cinder_loe.client.render.entity; import lotr.client.model.LOTRModelMarshWraith; import net.minecraft.client.model.ModelBase; diff --git a/src/main/java/com/zivilon/cinder_loe/client/render/item/TrollClubRenderer.java b/src/main/java/com/zivilon/cinder_loe/client/render/item/TrollClubRenderer.java new file mode 100644 index 0000000..6067895 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/client/render/item/TrollClubRenderer.java @@ -0,0 +1,59 @@ +package com.zivilon.cinder_loe.client.render.item; + +import net.minecraft.util.ResourceLocation; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.item.ItemStack; +import net.minecraftforge.client.IItemRenderer; +import org.lwjgl.opengl.GL11; +import net.minecraft.client.model.ModelBase; + +public class TrollClubRenderer implements IItemRenderer { + + public static ResourceLocation texture = new ResourceLocation("lotr", "textures/items/troll_chieftain_club.png"); + + public ModelBase model; +/* public ModelTrollChieftainClub model; + + public TrollClubRenderer(ModelTrollChieftainClub model) { + this.model = model; + }*/ + public TrollClubRenderer() { + this.model = null; + } + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + return type == ItemRenderType.EQUIPPED || type == ItemRenderType.EQUIPPED_FIRST_PERSON; + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return false; + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + GL11.glPushMatrix(); + + // Position the model correctly + if (type == ItemRenderType.EQUIPPED_FIRST_PERSON) { + GL11.glTranslatef(0.5F, 0.5F, 0.5F); + } else { + GL11.glTranslatef(0.7F, 0.4F, 0.5F); + } + + // Rotate and scale the model as needed + GL11.glScalef(1.0F, 1.0F, 1.0F); + + // Bind the texture + RenderManager.instance.renderEngine.bindTexture(texture); + + // Render the model + model.render(null, 0, 0, 0, 0, 0, 0.0625F); + + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/client/render/RenderSarumanFireball.java b/src/main/java/com/zivilon/cinder_loe/client/render/projectile/RenderSarumanFireball.java similarity index 100% rename from src/main/java/com/zivilon/cinder_loe/client/render/RenderSarumanFireball.java rename to src/main/java/com/zivilon/cinder_loe/client/render/projectile/RenderSarumanFireball.java diff --git a/src/main/java/com/zivilon/cinder_loe/client/render/tileentity/TileEntityForgingStationRenderer.java b/src/main/java/com/zivilon/cinder_loe/client/render/tileentity/TileEntityForgingStationRenderer.java new file mode 100644 index 0000000..38d2291 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/client/render/tileentity/TileEntityForgingStationRenderer.java @@ -0,0 +1,113 @@ +package com.zivilon.cinder_loe.client.render.tileentity; + +import com.zivilon.cinder_loe.client.model.blocks.ModelForgingStation; +import com.zivilon.cinder_loe.tileentity.TileEntityForgingStation; +import com.zivilon.cinder_loe.client.render.item.RenderHelper; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; +import net.minecraft.util.ChatComponentText; + +public class TileEntityForgingStationRenderer extends TileEntitySpecialRenderer { + public ModelForgingStation model = new ModelForgingStation(); + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float partialTick) { + + if (tileEntity instanceof TileEntityForgingStation) { + TileEntityForgingStation tile = (TileEntityForgingStation) tileEntity; + + // Get the metadata to determine if this is the middle part + int meta = tile.getBlockMetadata(); + int direction = meta >> 2; + int part = meta & 3; + float rotation = 270F; + if (part != 1) return; + + rotation = direction * 90F - 90F; + + GL11.glPushMatrix(); + GL11.glDisable(GL11.GL_CULL_FACE); + GL11.glTranslatef((float)x + 0.5F, (float)y + 1.5F, (float)z + 0.5F); + GL11.glScalef(-1.0F, -1.0F, 1.0F); + GL11.glRotatef(rotation, 0F, 1F, 0F); // Adjust rotation as needed + bindTexture(new ResourceLocation("lotr:textures/blocks/forging_station.png")); + this.model.render(0.0625F); // Render the model + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glPopMatrix(); + + + // Render the items above each part of the Forging Station + float offset = 0F; + switch (direction) { + case 1: + case 3: + offset -= 180F; + break; + } + renderStoredItems(tile, x, y, z, direction * 90F + offset); + } + } + + public void renderStoredItems(TileEntityForgingStation tile, double x, double y, double z, float rotation) { + GL11.glPushMatrix(); + GL11.glTranslatef((float) x + 0.5F, (float) y + 1.0F, (float) z + 0.5F); // Adjust the position + GL11.glRotatef(rotation, 0F, 1F, 0F); // Rotate to match the block's orientation + + ItemStack left = tile.getLeftItem(); + ItemStack middle = tile.getMiddleItem(); + ItemStack right = tile.getRightItem(); + + // Render left item + if (left != null) { + renderItemInWorld(left, 1.0, 0.0, 0.0); + } + + // Render middle item + if (middle != null) { + renderItemInWorld(middle, 0.0, 0.0, 0.0); + } + + // Render right item + if (right != null) { + renderItemInWorld(right, -1.0, 0.0, 0.0); + } + + GL11.glPopMatrix(); + } + + public void renderItemInWorld(ItemStack stack, double x, double y, double z) { + if (stack != null) { + GL11.glPushMatrix(); + GL11.glTranslated(x, y, z); + GL11.glScalef(1.0F, 1.0F, 1.0F); // Adjust the item size + + // Bind the item texture + Minecraft.getMinecraft().getTextureManager().bindTexture(TextureMap.locationItemsTexture); + IIcon icon = stack.getIconIndex(); + Tessellator tessellator = Tessellator.instance; + + // Set up the item rendering parameters + float minU = icon.getMinU(); + float maxU = icon.getMaxU(); + float minV = icon.getMinV(); + float maxV = icon.getMaxV(); + + // Render the item in 2D + GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F); + GL11.glTranslatef(-0.25F, -0.25F, 0.0F); + GL11.glScalef(0.5F, 0.5F, 0.5F); + + RenderHelper.customRenderItemIn2D(tessellator, maxU, minV, minU, maxV, icon.getIconWidth(), icon.getIconHeight(), 0.0625F, false); + + GL11.glPopMatrix(); + } + } +} 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 95f4a23..63aa60c 100644 --- a/src/main/java/com/zivilon/cinder_loe/coremod/LOTRMaterialTransformer.java +++ b/src/main/java/com/zivilon/cinder_loe/coremod/LOTRMaterialTransformer.java @@ -67,6 +67,12 @@ public class LOTRMaterialTransformer implements IClassTransformer { addMaterial("USURPER", classNode); addMaterial("WARLORD",classNode); addMaterial("JADE",classNode); + addMaterial("NEX_ICE",classNode); + addMaterial("NEX_FIRE",classNode); + addMaterial("NEX_TOXIN",classNode); + addMaterial("NEX_SHADOW",classNode); + addMaterial("NIMVEIL",classNode); + addMaterial("FROZEN",classNode); // Protection Conversion diff --git a/src/main/java/com/zivilon/cinder_loe/coremod/LOTRWeaponLinker.java b/src/main/java/com/zivilon/cinder_loe/coremod/LOTRWeaponLinker.java index 75f95db..db60d07 100644 --- a/src/main/java/com/zivilon/cinder_loe/coremod/LOTRWeaponLinker.java +++ b/src/main/java/com/zivilon/cinder_loe/coremod/LOTRWeaponLinker.java @@ -25,7 +25,8 @@ public class LOTRWeaponLinker implements IClassTransformer { "frostblade", "spearsolidgold", "whip", "spearUnnamed", "welfRelic", "daggerVoid", "swordBree", "maceArnor", - "daggerAsh","bowAsh","hammerAsh","pikeAsh","battleaxeAsh","swordAsh","spearAsh", "staffAsh", "cleaver"); + "daggerAsh","bowAsh","hammerAsh","pikeAsh","battleaxeAsh","swordAsh","spearAsh", "staffAsh", "cleaver", + "celeiniss", "nimveil"); } return basicClass; } diff --git a/src/main/java/com/zivilon/cinder_loe/entity/effect/NimveilLightningBolt.java b/src/main/java/com/zivilon/cinder_loe/entity/effect/NimveilLightningBolt.java new file mode 100644 index 0000000..a716f48 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/entity/effect/NimveilLightningBolt.java @@ -0,0 +1,84 @@ +package com.zivilon.cinder_loe.entity.effect; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.effect.EntityWeatherEffect; +import net.minecraft.entity.passive.EntityPig; +import net.minecraft.entity.monster.EntityCreeper; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; +import net.minecraft.world.World; + +import java.util.List; + +public class NimveilLightningBolt extends EntityWeatherEffect { + /** Declares which state the lightning bolt is in. Whether it's in the air, hit the ground, etc. */ + public int lightningState; + /** A random long that is used to change the vertex of the lightning rendered in RenderLightningBolt */ + public long boltVertex; + /** Determines the time before the NimveilLightningBolt is destroyed. It is a random integer decremented over time. */ + public int boltLivingTime; + + public NimveilLightningBolt(World world, double x, double y, double z) { + super(world); + this.setLocationAndAngles(x, y, z, 0.0F, 0.0F); + this.lightningState = 2; + this.boltVertex = this.rand.nextLong(); + this.boltLivingTime = this.rand.nextInt(3) + 1; + } + public NimveilLightningBolt(World world) { + this(world, 0, 0, 0);// Summon line of custom lightning bolts + // Must not place fire or affect any non-EntityLivingBase targets + // Probably the most work of all of these + } + + /** + * Called to update the entity's position/logic. + */ + public void onUpdate() { + super.onUpdate(); + + if (this.lightningState == 2) { + this.worldObj.playSoundEffect(this.posX, this.posY, this.posZ, "ambient.weather.thunder", 10000.0F, 0.8F + this.rand.nextFloat() * 0.2F); + this.worldObj.playSoundEffect(this.posX, this.posY, this.posZ, "random.explode", 2.0F, 0.5F + this.rand.nextFloat() * 0.2F); + } + + --this.lightningState; + + if (this.lightningState < 0) { + if (this.boltLivingTime == 0) { + this.setDead(); + } else if (this.lightningState < -this.rand.nextInt(10)) { + --this.boltLivingTime; + this.lightningState = 1; + this.boltVertex = this.rand.nextLong(); + } + } + + if (this.lightningState >= 0) { + if (this.worldObj.isRemote) { + this.worldObj.lastLightningBolt = 2; + } else { + double d0 = 3.0D; + List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, AxisAlignedBB.getBoundingBox(this.posX - d0, this.posY - d0, this.posZ - d0, this.posX + d0, this.posY + 6.0D + d0, this.posZ + d0)); + list.removeIf(entity -> !(entity instanceof EntityLivingBase)); + list.removeIf(entity -> (entity instanceof EntityPig)); + list.removeIf(entity -> (entity instanceof EntityCreeper)); + + for (int l = 0; l < list.size(); ++l) { + Entity entity = (Entity)list.get(l); + if (entity.isImmuneToFire() == false) { + entity.attackEntityFrom(DamageSource.inFire, 20.0F); + entity.setFire(8); + } + System.out.println("Striking " + entity.getCommandSenderName()); + } + } + } + } + + public void entityInit() {} + public void readEntityFromNBT(NBTTagCompound p_70037_1_) {} + public void writeEntityToNBT(NBTTagCompound p_70014_1_) {} +} diff --git a/src/main/java/com/zivilon/cinder_loe/entity/npc/frozen_dungeon/Nex.java b/src/main/java/com/zivilon/cinder_loe/entity/npc/frozen_dungeon/Nex.java new file mode 100644 index 0000000..339fcd8 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/entity/npc/frozen_dungeon/Nex.java @@ -0,0 +1,413 @@ +package com.zivilon.cinder_loe.entity.npc.frozen_dungeon; + +import lotr.common.LOTRDamage; +import lotr.common.entity.ai.LOTREntityAIAttackOnCollide; +import lotr.common.entity.npc.LOTREntityNPC; +import lotr.common.fac.LOTRFaction; + +import net.minecraft.block.Block; +import net.minecraft.entity.EnumCreatureAttribute; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.entity.ai.EntityAIBase; +import net.minecraft.entity.ai.EntityAILookIdle; +import net.minecraft.entity.ai.EntityAIWander; +import net.minecraft.entity.ai.EntityAIWatchClosest; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.util.DamageSource; +import net.minecraft.util.EntityDamageSource; +import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; + +import com.zivilon.cinder_loe.CinderLoE; +import com.zivilon.cinder_loe.entity.ai.LoEPreciseAttackOnCollide; +import com.zivilon.cinder_loe.util.BlockPos; +import com.zivilon.cinder_loe.util.Utilities; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class Nex extends LOTREntityNPC { + public EntityAIBase normal_attack_ai; + public EntityAIBase desperate_attack_ai; + public static double normal_attack_damage = 30.0D; + public static double desperate_attack_damage = 50.0D; + public static int normal_attack_speed = 20; + public static int desperate_attack_speed = 10; + + public static List> nex_instances = new ArrayList<>(); + + public AxisAlignedBB collisionBox; + public AxisAlignedBB hitbox; + public int phase = 0; + public ChunkCoordinates currentFlightTarget; + public EntityPlayer playerTarget; + public int tickCounter = 0; + + public Nex(World world) { + super(world); + setSize(1.5F, 3.0F); + normal_attack_ai = (EntityAIBase) new LoEPreciseAttackOnCollide(this, 1.3D, 3.0D, normal_attack_speed, false); + desperate_attack_ai = (EntityAIBase) new LoEPreciseAttackOnCollide(this, 1.3D, 3.0D, desperate_attack_speed, false); + ((EntityLiving) this).tasks.addTask(2, normal_attack_ai); + ((EntityLiving) this).tasks.addTask(2, (EntityAIBase) new EntityAIWander(this, 1.0D)); + ((EntityLiving) this).tasks.addTask(3, (EntityAIBase) new EntityAILookIdle((EntityLiving) this)); + addTargetTasks(true); + store_nex_instance(); + clear_shadow_tiles(); + } + protected void entityInit() { + super.entityInit(); + this.dataWatcher.addObject(31, Integer.valueOf(0)); + } + + public void clear_shadow_tiles() { + if (!this.worldObj.isRemote) { + int xz_range = 100; + int y_range = 10; + int i = MathHelper.floor_double(this.posX); + int j = MathHelper.floor_double(this.posY); + int k = MathHelper.floor_double(this.posZ); + for (int i1 = i - xz_range; i1 <= i + xz_range; i1++) { + for (int j1 = j - y_range; j1 <= j + y_range; j1++) { + for (int k1 = k - xz_range; k1 <= k + xz_range; k1++) { + Block block = this.worldObj.getBlock(i1, j1, k1); + if (block == CinderLoE.shadowTile) + this.worldObj.setBlockToAir(i1, j1, k1); + } + } + } + } + } + + + protected void applyEntityAttributes() { + super.applyEntityAttributes(); + getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(5000.0D); + getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.2D); + getEntityAttribute(SharedMonsterAttributes.knockbackResistance).setBaseValue(1.0D); + getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(100.0D); + getEntityAttribute(npcAttackDamage).setBaseValue(normal_attack_damage); + } + + public int getPhase() { + phase = this.dataWatcher.getWatchableObjectInt(31); + return phase; + } + public void setPhase(int i) { + phase = i; + this.dataWatcher.updateObject(31, Integer.valueOf(phase)); + } + + public void next_phase() { + Utilities.setInvulnerable((Entity)this, false); + phase = getPhase(); + switch(phase) { + case 0: // Move to Toxic phase + clear_shadow_tiles(); + setPhase(phase + 1); + return; + case 1: // Move to Ice phase + setPhase(phase + 1); + return; + case 2: // Move to Fire phase + setPhase(phase + 1); + return; + case 3: // Move to Desperation phase + setPhase(phase + 1); + this.tasks.removeTask(normal_attack_ai); + this.tasks.addTask(2, desperate_attack_ai); + getEntityAttribute(npcAttackDamage).setBaseValue(desperate_attack_damage); + return; + default: + System.out.println("[CinderLoE] Nex phase shift past phase 4???"); + } + } + + public LOTRFaction getFaction() { + return LOTRFaction.UTUMNO; + } + + public void writeEntityToNBT(NBTTagCompound nbt) { + super.writeEntityToNBT(nbt); + nbt.setInteger("NexPhase", getPhase()); + } + + public void readEntityFromNBT(NBTTagCompound nbt) { + super.readEntityFromNBT(nbt); + setPhase(nbt.getInteger("NexPhase")); + } + + public boolean canBePushed() { + return false; + } + + protected void fall(float f) {} + + protected void updateFallState(double d, boolean flag) {} + + protected boolean canDespawn() { + return false; + } + + // Phase 0 - Shadow + // Phase 1 - Toxin + // Phase 2 - Ice + // Phase 3 - Fire + // Phase 4 - Desperation + + public void release_miniboss() { + Utilities.setInvulnerable((Entity)this, true); + System.out.println("Set Nex invulnerable: " + this.isEntityInvulnerable()); + Class phaseClass = null; + switch (phase) { + case 0: + phaseClass = NexShadow.class; + break; + case 1: + phaseClass = NexToxin.class; + break; + case 2: + phaseClass = NexIce.class; + break; + case 3: + phaseClass = NexFire.class; + break; + default: + this.setDead(); + System.out.println("ERROR! Invalid Nex phase change: " + phase); + return; + } + + System.out.println("Miniboss class: " + phaseClass.getSimpleName()); + List entityList = this.worldObj.getEntitiesWithinAABB(NexMiniboss.class, this.boundingBox.expand(100, 10, 100)); + for (Entity entity : entityList) { + if (phaseClass.isInstance(entity)) { + System.out.println("Found correct miniboss class"); + NexMiniboss miniboss = (NexMiniboss) entity; + miniboss.unbind(); + return; + } + } + System.out.println("ERROR! Nex is missing miniboss of type " + phaseClass.getSimpleName()); + } + + @Override + public void onUpdate() { + super.onUpdate(); + tickCounter++; + + switch (phase) { + case 0: + runShadowTasks(); + break; + case 1: + runToxinTasks(); + break; + case 2: + runIceTasks(); + break; + case 3: + runFireTasks(); + break; + default: + break; + } + } + + public void runShadowTasks() { + if (tickCounter >= 100) { // 5 seconds (100 ticks) + tickCounter = 0; + + // Find air blocks with solid blocks underneath and place ShadowTile + placeShadowTiles(); + } + } + public void runToxinTasks() { + if (tickCounter >= 200) { + tickCounter = 0; + spawnToxicCloud(); + } + } + public void runIceTasks() {} + public void runFireTasks() {} + + public List getValidPositions() { + int radius = 64; // Radius to search for valid blocks + + List validPositions = new ArrayList<>(); + + // Iterate over blocks in a specific area + for (int x = -radius; x <= radius; x++) { + for (int y = -4; y <= 4; y++) { + for (int z = -radius; z <= radius; z++) { + BlockPos pos = new BlockPos(MathHelper.floor_double(this.posX) + x, MathHelper.floor_double(this.posY) + y, MathHelper.floor_double(this.posZ) + z); + BlockPos below = pos.down(); + + if (worldObj.isAirBlock(pos.x, pos.y, pos.z) && worldObj.getBlock(below.x, below.y, below.z).isOpaqueCube()) { + validPositions.add(pos); + } + } + } + } + return validPositions; + } + + public void spawnToxicCloud() { + if (this.worldObj.isRemote) return; + int toxicCloudsToPlace = 4; + if (countToxicClouds() >= toxicCloudsToPlace) return; + + List validPositions = getValidPositions(); + + // Place NexCloud in 2 random valid positions + for (int i = 0; i < toxicCloudsToPlace && !validPositions.isEmpty(); i++) { + int randomIndex = worldObj.rand.nextInt(validPositions.size()); + BlockPos pos = validPositions.remove(randomIndex); + + NexCloud cloud = new NexCloud(this.worldObj); + cloud.setPosition(pos.x + 0.5, pos.y + 1.5, pos.z + 0.5); + this.worldObj.spawnEntityInWorld(cloud); + } + } + + public boolean attackEntityAsMob(Entity entity) { + if (super.attackEntityAsMob(entity)) { + if (entity instanceof EntityPlayerMP) + LOTRDamage.doFrostDamage((EntityPlayerMP)entity); + if (entity instanceof EntityLivingBase) { + int difficulty = this.worldObj.difficultySetting.getDifficultyId(); + int duration = difficulty * (difficulty + 5) / 2; + if (duration > 0) + ((EntityLivingBase)entity).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, duration * 20, 0)); + } + return true; + } + return false; + } + + public int countToxicClouds() { + List clouds = worldObj.getEntitiesWithinAABB(NexCloud.class, this.boundingBox.expand(100.0, 10.0, 100.0)); + return clouds.size(); + } + + public void placeShadowTiles() { + if (this.worldObj.isRemote) return; + int shadowTilesToPlace = 8; // Number of shadow tiles to place + + List validPositions = getValidPositions(); + + // Place ShadowTile in 4 random valid positions + for (int i = 0; i < shadowTilesToPlace && !validPositions.isEmpty(); i++) { + int randomIndex = worldObj.rand.nextInt(validPositions.size()); + BlockPos pos = validPositions.remove(randomIndex); + worldObj.setBlock(pos.x, pos.y, pos.z, CinderLoE.shadowTile); + } + } + + @Override + public boolean attackEntityFrom(DamageSource source, float dmg) { + super.attackEntityFrom(source, dmg); + int current_phase = (int) (this.getHealth() + dmg) / 1000; + int new_phase = (int) this.getHealth() / 1000; + System.out.println("Damage received: " + dmg + "while at health " + this.getHealth()); + if (phase == 3) { + if (source instanceof EntityDamageSource) { + Entity attacker = ((EntityDamageSource)source).getEntity(); + if (Utilities.has_fire_weapon(attacker)) { + attacker.attackEntityFrom(DamageSource.causeMobDamage(this), dmg); + attacker.setFire(10); + return false; + } + } + } + if (current_phase != new_phase && current_phase != 5) { + System.out.println("New phase should occur. Current phase health: " + current_phase + " and new phase health: " + new_phase); + if (phase != 4) + release_miniboss(); + } + return true; + } + + protected void dropFewItems(boolean flag, int i) { + return; + } + + protected String getHurtSound() { + return "lotr:wight.hurt"; + } + + protected String getDeathSound() { + return "lotr:wight.death"; + } + + @Override + public void heal(float amount) {} + + @Override + public void attackEntityWithRangedAttack(EntityLivingBase target, float distanceFactor) {} + + @Override + public ItemStack getPickedResult(MovingObjectPosition target) { + return null; + } + + // Scripting data methods, VT hooks into these. See util.VT_additions + public void store_nex_instance() { + cleanup_instances(); + nex_instances.add(new WeakReference<>(this)); + } + public static Nex get_nex_instance() { + cleanup_instances(); + if (!nex_instances.isEmpty()) { + return nex_instances.get(0).get(); + } + return null; // or handle this scenario accordingly + } + public static int get_nex_phase() { + Nex nex = get_nex_instance(); + if (nex == null) { + return -404; + } + return nex.phase; + } + + public static int get_nex_health() { + Nex nex = get_nex_instance(); + if (nex == null) { + return -404; + } + return (int)nex.getHealth(); + } + public static void cleanup_instances() { + for (int i = nex_instances.size() - 1; i >= 0; i--) { + WeakReference weakRef = nex_instances.get(i); + Nex listed_instance = weakRef.get(); + if (listed_instance == null || !listed_instance.isEntityAlive()) { + nex_instances.remove(i); + } + } + } + + public static boolean is_nex_fire_phase_nearby(EntityLivingBase entity) { + List entityList = entity.worldObj.getEntitiesWithinAABB(Nex.class, entity.boundingBox.expand(100, 10, 100)); + for (Nex nex : entityList) { // We don't actually need to iterate, checking the first object is enough + if (nex.phase == 3) return true; + return false; + } + return false; + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/entity/npc/frozen_dungeon/NexCloud.java b/src/main/java/com/zivilon/cinder_loe/entity/npc/frozen_dungeon/NexCloud.java new file mode 100644 index 0000000..34e7c0d --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/entity/npc/frozen_dungeon/NexCloud.java @@ -0,0 +1,180 @@ +package com.zivilon.cinder_loe.entity.npc.frozen_dungeon; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.DamageSource; +import net.minecraft.world.World; +import lotr.common.entity.npc.LOTREntityNPC; +import lotr.common.fac.LOTRFaction; +import net.minecraft.util.AxisAlignedBB; + +import java.util.List; + +public class NexCloud extends Entity { + public int tickCounter = 0; + public float opacity = 0.0F; + public boolean unbound = false; + + public NexCloud(World world) { + super(world); + this.setSize(5.0F, 3.0F); // Set the size of the cloud + this.noClip = true; // Disable hitbox + } + + @Override + protected void entityInit() { + this.dataWatcher.addObject(20, 0.0F); // Index 20, initial opacity + } + + @Override + protected void readEntityFromNBT(NBTTagCompound nbt) { + // Load entity data from NBT + } + + @Override + protected void writeEntityToNBT(NBTTagCompound nbt) { + // Save entity data to NBT + } + + public void syncOpacityToClient() { + this.dataWatcher.updateObject(20, this.opacity); + } + + @Override + public void onUpdate() { + super.onUpdate(); + this.noClip = true; + if (worldObj.isRemote) { + this.opacity = this.dataWatcher.getWatchableObjectFloat(20); + // Update the client's position to match the server's position + this.setPosition(this.posX, this.posY, this.posZ); + return; + } + syncOpacityToClient(); + tickCounter++; + + if (tickCounter <= 100) { + // Increase opacity from 0.0F to 0.5F over the first 100 ticks + opacity = 0.5F * (tickCounter / 100.0F); + } else if (tickCounter <= 200) { + // Maintain opacity at 0.5F for the next 100 ticks + opacity = 0.5F; + } + + if (unbound) { + followNearestPlayer(); + // Apply the motion to the entity's position + this.posX += this.motionX; + this.posY += this.motionY; + this.posZ += this.motionZ; + + this.setPosition(this.posX, this.posY, this.posZ); // Update the entity's position + } + + if (tickCounter % 10 == 0) { + if (tickCounter > 60 && tickCounter < 240) + applyPoisonEffect(); + unbound = isMinibossUnbound(); + if (unbound && tickCounter > 100) { + tickCounter = 100; + return; + } + } + + if (unbound) { + return; + } + + if (tickCounter <= 300 && tickCounter > 200) { + // Decrease opacity from 0.5F to 0.0F over the next 100 ticks + opacity = 0.5F * ((300 - tickCounter) / 100.0F); + return; + } + if (tickCounter > 300) { + // Set the entity as dead after 300 ticks + System.out.println("Setting cloud dead. Ticks: " + tickCounter + " and unbound state: " + unbound); + this.setDead(); + return; + } + + } + + @Override + public void moveEntity(double x, double y, double z) { + if (this.noClip) { + this.setPosition(this.posX + x, this.posY + y, this.posZ + z); + } else { + super.moveEntity(x, y, z); + } + } + + + public boolean isMinibossUnbound() { + List entities = worldObj.getEntitiesWithinAABB(Entity.class, this.boundingBox.expand(100.0, 10.0, 100.0)); + for (Entity entity : entities) { + if (entity instanceof NexToxin) { + NexToxin miniboss = (NexToxin) entity; +// System.out.println("Found miniboss. Is unbound: " + !miniboss.bound); + return !miniboss.bound; + } + } +// System.out.println("Miniboss not found"); + return false; + } + + public void applyPoisonEffect() { + List entities = worldObj.getEntitiesWithinAABB(EntityLivingBase.class, this.boundingBox); + for (Entity entity : entities) { + if (entity != this && !(entity instanceof LOTREntityNPC && ((LOTREntityNPC) entity).getFaction() == LOTRFaction.UTUMNO)) { + if (entity instanceof EntityLivingBase) { + EntityLivingBase livingEntity = (EntityLivingBase) entity; + livingEntity.attackEntityFrom(DamageSource.magic, 2.0F); + livingEntity.addPotionEffect(new PotionEffect(Potion.poison.id, 200, 1)); // 10 seconds of poison (200 ticks) + } + } + } + } + + @Override + public AxisAlignedBB getBoundingBox() { + return null; + } + + + public void followNearestPlayer() { + List players = worldObj.getEntitiesWithinAABB(EntityPlayer.class, this.boundingBox.expand(100.0, 4.0, 100.0)); + if (!players.isEmpty()) { + EntityPlayer nearestPlayer = players.get(0); + double minDistance = this.getDistanceToEntity(nearestPlayer); + for (EntityPlayer player : players) { + double distance = this.getDistanceToEntity(player); + if (distance < minDistance) { + nearestPlayer = player; + minDistance = distance; + } + } + double speed = 0.01; + this.motionX = (nearestPlayer.posX - this.posX) * speed; + this.motionY = (nearestPlayer.posY - this.posY) * speed; + this.motionZ = (nearestPlayer.posZ - this.posZ) * speed; + } else { + this.motionX = 0; + this.motionY = 0; + this.motionZ = 0; + } + } + + @Override + public boolean canBeCollidedWith() { + return false; + } + + @Override + public boolean canBePushed() { + return false; + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/entity/npc/frozen_dungeon/NexFire.java b/src/main/java/com/zivilon/cinder_loe/entity/npc/frozen_dungeon/NexFire.java new file mode 100644 index 0000000..8c7f19e --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/entity/npc/frozen_dungeon/NexFire.java @@ -0,0 +1,67 @@ +package com.zivilon.cinder_loe.entity.npc.frozen_dungeon; + +import com.zivilon.cinder_loe.CinderLoE; +import com.zivilon.cinder_loe.util.Utilities; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; +import lotr.common.LOTRMod; +import lotr.common.enchant.LOTREnchantmentHelper; +import lotr.common.enchant.LOTREnchantment; +import net.minecraft.item.ItemStack; + +public class NexFire extends NexMiniboss { + public String entity_name = "§4Naira"; + + public NexFire(World world) { + super(world); + } + + @Override + public void setupEquipment() { + ItemStack weapon = new ItemStack(LOTRMod.hammerUtumno, 0); + ItemStack boots = new ItemStack(CinderLoE.bootsNexFire, 0); + ItemStack legs = new ItemStack(CinderLoE.legsNexFire, 0); + ItemStack body = new ItemStack(CinderLoE.bodyNexFire, 0); + ItemStack helmet = new ItemStack(CinderLoE.helmetNexFire, 0); + Utilities.setAppliedRandomEnchants(weapon); + Utilities.setLOTREnchant(weapon, LOTREnchantment.strong4); + Utilities.setLOTREnchant(weapon, LOTREnchantment.strong4); + Utilities.setLOTREnchant(weapon, LOTREnchantment.strong4); + Utilities.setLOTREnchant(weapon, LOTREnchantment.strong2); + Utilities.setLOTREnchant(weapon, LOTREnchantment.strong1); + Utilities.setLOTREnchant(weapon, LOTREnchantment.meleeReach1); + Utilities.setLOTREnchant(weapon, LOTREnchantment.meleeSpeed1); + Utilities.setLOTREnchant(weapon, LOTREnchantment.fire); + + this.npcItemsInv.setIdleItem(weapon); + this.npcItemsInv.setMeleeWeapon(weapon); + setCurrentItemOrArmor(0, weapon); + setCurrentItemOrArmor(1, boots); + setCurrentItemOrArmor(2, legs); + setCurrentItemOrArmor(3, body); + setCurrentItemOrArmor(4, helmet); + } + + @Override + public String getNPCName() { + return entity_name; + } + @Override + public String getNPCFormattedName(String npcName, String entityName) { + return entity_name; + } + + @Override + public String getSpeechBank(EntityPlayer entityplayer) { + return "nex/fire"; + } + + @Override + public void onBoundUpdate(int x, int y, int z) { + } + + @Override + public void onUnboundUpdate() { + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/entity/npc/frozen_dungeon/NexIce.java b/src/main/java/com/zivilon/cinder_loe/entity/npc/frozen_dungeon/NexIce.java new file mode 100644 index 0000000..a2d676e --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/entity/npc/frozen_dungeon/NexIce.java @@ -0,0 +1,68 @@ +package com.zivilon.cinder_loe.entity.npc.frozen_dungeon; + +import com.zivilon.cinder_loe.CinderLoE; +import com.zivilon.cinder_loe.util.Utilities; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; +import lotr.common.LOTRMod; +import lotr.common.enchant.LOTREnchantmentHelper; +import lotr.common.enchant.LOTREnchantment; +import net.minecraft.item.ItemStack; + + +public class NexIce extends NexMiniboss { + public String entity_name = "§bNinquë"; + + public NexIce(World world) { + super(world); + } + + @Override + public void setupEquipment() { + ItemStack weapon = new ItemStack(LOTRMod.spearUtumno, 0); + ItemStack boots = new ItemStack(CinderLoE.bootsNexIce, 0); + ItemStack legs = new ItemStack(CinderLoE.legsNexIce, 0); + ItemStack body = new ItemStack(CinderLoE.bodyNexIce, 0); + ItemStack helmet = new ItemStack(CinderLoE.helmetNexIce, 0); + Utilities.setAppliedRandomEnchants(weapon); + Utilities.setLOTREnchant(weapon, LOTREnchantment.strong4); + Utilities.setLOTREnchant(weapon, LOTREnchantment.strong4); + Utilities.setLOTREnchant(weapon, LOTREnchantment.strong4); + Utilities.setLOTREnchant(weapon, LOTREnchantment.strong3); + Utilities.setLOTREnchant(weapon, LOTREnchantment.strong1); + Utilities.setLOTREnchant(weapon, LOTREnchantment.meleeReach1); + Utilities.setLOTREnchant(weapon, LOTREnchantment.meleeSpeed1); + Utilities.setLOTREnchant(weapon, LOTREnchantment.chill); + + this.npcItemsInv.setIdleItem(weapon); + this.npcItemsInv.setMeleeWeapon(weapon); + setCurrentItemOrArmor(0, weapon); + setCurrentItemOrArmor(1, boots); + setCurrentItemOrArmor(2, legs); + setCurrentItemOrArmor(3, body); + setCurrentItemOrArmor(4, helmet); + } + + @Override + public String getNPCName() { + return entity_name; + } + @Override + public String getNPCFormattedName(String npcName, String entityName) { + return entity_name; + } + + @Override + public String getSpeechBank(EntityPlayer entityplayer) { + return "nex/ice"; + } + + @Override + public void onBoundUpdate(int x, int y, int z) { + } + + @Override + public void onUnboundUpdate() { + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/entity/npc/frozen_dungeon/NexMiniboss.java b/src/main/java/com/zivilon/cinder_loe/entity/npc/frozen_dungeon/NexMiniboss.java new file mode 100644 index 0000000..583dd4f --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/entity/npc/frozen_dungeon/NexMiniboss.java @@ -0,0 +1,151 @@ +package com.zivilon.cinder_loe.entity.npc.frozen_dungeon; + +import com.zivilon.cinder_loe.CinderLoE; +import com.zivilon.cinder_loe.util.Utilities; +import com.zivilon.cinder_loe.entity.ai.LoEPreciseAttackOnCollide; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.EntityAIBase; +import net.minecraft.entity.ai.EntityAIWatchClosest; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; + +import lotr.common.entity.npc.LOTREntityMan; +import lotr.common.fac.LOTRFaction; + +import java.util.List; + +public abstract class NexMiniboss extends LOTREntityMan { + public String entity_name = "UNDEFINED"; + public boolean bound = true; + + public NexMiniboss(World world) { + super(world); + setSize(0.6F, 1.8F); + ((EntityLiving) this).tasks.addTask(2, (EntityAIBase) new LoEPreciseAttackOnCollide(this, 1.3D, 1.0D, 40, false)); + ((EntityLiving) this).tasks.addTask(8, (EntityAIBase) new EntityAIWatchClosest((EntityLiving) this, Nex.class, 8.0F, 0.02F)); + addTargetTasks(true); + setupEquipment(); + } + + @Override + public void attackEntityWithRangedAttack(EntityLivingBase target, float distanceFactor) { + } + + @Override + protected void applyEntityAttributes() { + super.applyEntityAttributes(); + getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(200.0D); + getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.225D); + getEntityAttribute(SharedMonsterAttributes.knockbackResistance).setBaseValue(1.0D); + getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(100.0D); + } + + @Override + public LOTRFaction getFaction() { + return LOTRFaction.UTUMNO; + } + + @Override + protected boolean canDespawn() { + return false; + } + + @Override + public String getNPCName() { + return entity_name; + } + @Override + public String getNPCFormattedName(String npcName, String entityName) { + return entity_name; + } + + @Override + protected void dropFewItems(boolean flag, int i) { + } + + @Override + public boolean getCanSpawnHere() { + return false; + } + + @Override + public String getSpeechBank(EntityPlayer entityplayer) { + return "nex/undefined"; + } + + @Override + public void setupNPCName() { + } + + @Override + public ItemStack getPickedResult(MovingObjectPosition target) { + return null; + } + + @Override + public void onDeath(DamageSource source) { + List entityList = this.worldObj.getEntitiesWithinAABB(Nex.class, this.boundingBox.expand(100, 10, 100)); + for (Nex nex : entityList) { + nex.next_phase(); + return; + } + } + + public void unbind() { + System.out.println("Unbinding " + this.getClass().getSimpleName()); + + int x = MathHelper.floor_double(this.posX); + int y = MathHelper.floor_double(this.posY); + int z = MathHelper.floor_double(this.posZ); + + Block blockAtFeet = this.worldObj.getBlock(x, y, z); + Block blockAtHead = this.worldObj.getBlock(x, y + 1, z); + if (blockAtFeet == CinderLoE.iceCage) { + this.worldObj.setBlock(x, y, z, Blocks.air); + } + if (blockAtHead == CinderLoE.iceCage) { + this.worldObj.setBlock(x, y, z, Blocks.air); + } + bound = false; + } + + @Override + public void onUpdate() { + super.onUpdate(); + checkInsideIceCage(); + } + + public void checkInsideIceCage() { + int x = MathHelper.floor_double(this.posX); + int y = MathHelper.floor_double(this.posY); + int z = MathHelper.floor_double(this.posZ); + + + Block blockAtFeet = this.worldObj.getBlock(x, y, z); + Block blockAtHead = this.worldObj.getBlock(x, y + 1, z); + + if (blockAtFeet == CinderLoE.iceCage || blockAtHead == CinderLoE.iceCage) { + onBoundUpdate(x, y, z); + Utilities.setInvulnerable((Entity)this, true); +// System.out.println("Nex Miniboss vulnerable: " + this.isEntityInvulnerable()); + } else { + onUnboundUpdate(); + Utilities.setInvulnerable((Entity)this, false); +// System.out.println("Nex Miniboss vulnerable: " + this.isEntityInvulnerable()); + } + } + + public abstract void onBoundUpdate(int x, int y, int z); + public abstract void onUnboundUpdate(); + public abstract void setupEquipment(); +} diff --git a/src/main/java/com/zivilon/cinder_loe/entity/npc/frozen_dungeon/NexShadow.java b/src/main/java/com/zivilon/cinder_loe/entity/npc/frozen_dungeon/NexShadow.java new file mode 100644 index 0000000..3ef6a13 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/entity/npc/frozen_dungeon/NexShadow.java @@ -0,0 +1,85 @@ +package com.zivilon.cinder_loe.entity.npc.frozen_dungeon; + +import com.zivilon.cinder_loe.CinderLoE; +import com.zivilon.cinder_loe.util.Utilities; + +import lotr.common.LOTRMod; +import lotr.common.enchant.LOTREnchantmentHelper; +import lotr.common.enchant.LOTREnchantment; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; + +import java.util.List; + +public class NexShadow extends NexMiniboss { + public String entity_name = "§7Fuinë"; + + public NexShadow(World world) { + super(world); + } + + @Override + public void setupEquipment() { + ItemStack weapon = new ItemStack(LOTRMod.swordUtumno, 0); + ItemStack boots = new ItemStack(CinderLoE.bootsNexShadow, 0); + ItemStack legs = new ItemStack(CinderLoE.legsNexShadow, 0); + ItemStack body = new ItemStack(CinderLoE.bodyNexShadow, 0); + ItemStack helmet = new ItemStack(CinderLoE.helmetNexShadow, 0); + Utilities.setAppliedRandomEnchants(weapon); + Utilities.setLOTREnchant(weapon, LOTREnchantment.strong4); + Utilities.setLOTREnchant(weapon, LOTREnchantment.strong4); + Utilities.setLOTREnchant(weapon, LOTREnchantment.strong4); + Utilities.setLOTREnchant(weapon, LOTREnchantment.strong1); + Utilities.setLOTREnchant(weapon, LOTREnchantment.meleeReach1); + Utilities.setLOTREnchant(weapon, LOTREnchantment.meleeSpeed1); + + this.npcItemsInv.setIdleItem(weapon); + this.npcItemsInv.setMeleeWeapon(weapon); + setCurrentItemOrArmor(0, weapon); + setCurrentItemOrArmor(1, boots); + setCurrentItemOrArmor(2, legs); + setCurrentItemOrArmor(3, body); + setCurrentItemOrArmor(4, helmet); + } + + @Override + public String getNPCName() { + return entity_name; + } + @Override + public String getNPCFormattedName(String npcName, String entityName) { + return entity_name; + } + + @Override + public String getSpeechBank(EntityPlayer entityplayer) { + return "nex/shadow"; + } + + @Override + public void onBoundUpdate(int x, int y, int z) { + this.motionX = 0; + this.motionY = 0; + this.motionZ = 0; + this.setPosition(x + 0.5, y, z + 0.5); + } + + @Override + public void onUnboundUpdate() { + List players = this.worldObj.getEntitiesWithinAABB(EntityPlayer.class, this.boundingBox.expand(100.0D, 100.0D, 100.0D)); + + for (EntityPlayer player : players) { + int playerLightLevel = this.worldObj.getBlockLightValue(MathHelper.floor_double(player.posX), MathHelper.floor_double(player.posY), MathHelper.floor_double(player.posZ)); + double playerDistanceY = player.posY - this.posY; + + if (playerLightLevel < 4 && Math.abs(playerDistanceY) <= 4.0D) { + player.addPotionEffect(new PotionEffect(Potion.blindness.id, 100)); // 5 seconds of blindness + } + } + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/entity/npc/frozen_dungeon/NexToxin.java b/src/main/java/com/zivilon/cinder_loe/entity/npc/frozen_dungeon/NexToxin.java new file mode 100644 index 0000000..aa82377 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/entity/npc/frozen_dungeon/NexToxin.java @@ -0,0 +1,73 @@ +package com.zivilon.cinder_loe.entity.npc.frozen_dungeon; + +import com.zivilon.cinder_loe.CinderLoE; +import com.zivilon.cinder_loe.util.Utilities; + +import lotr.common.LOTRMod; +import lotr.common.enchant.LOTREnchantmentHelper; +import lotr.common.enchant.LOTREnchantment; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class NexToxin extends NexMiniboss { + public String entity_name = "§2Hloirë"; + + public NexToxin(World world) { + super(world); + } + + @Override + protected void applyEntityAttributes() { + super.applyEntityAttributes(); + getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(200.0D); + getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.25D); + } + + @Override + public void setupEquipment() { + ItemStack weapon = new ItemStack(LOTRMod.daggerUtumnoPoisoned, 0); + ItemStack boots = new ItemStack(CinderLoE.bootsNexToxin, 0); + ItemStack legs = new ItemStack(CinderLoE.legsNexToxin, 0); + ItemStack body = new ItemStack(CinderLoE.bodyNexToxin, 0); + ItemStack helmet = new ItemStack(CinderLoE.helmetNexToxin, 0); + Utilities.setAppliedRandomEnchants(weapon); + Utilities.setLOTREnchant(weapon, LOTREnchantment.strong4); + Utilities.setLOTREnchant(weapon, LOTREnchantment.strong4); + Utilities.setLOTREnchant(weapon, LOTREnchantment.strong4); + Utilities.setLOTREnchant(weapon, LOTREnchantment.strong1); + Utilities.setLOTREnchant(weapon, LOTREnchantment.meleeReach1); + Utilities.setLOTREnchant(weapon, LOTREnchantment.meleeSpeed1); + + this.npcItemsInv.setIdleItem(weapon); + this.npcItemsInv.setMeleeWeapon(weapon); + setCurrentItemOrArmor(0, weapon); + setCurrentItemOrArmor(1, boots); + setCurrentItemOrArmor(2, legs); + setCurrentItemOrArmor(3, body); + setCurrentItemOrArmor(4, helmet); + } + + @Override + public String getNPCName() { + return entity_name; + } + @Override + public String getNPCFormattedName(String npcName, String entityName) { + return entity_name; + } + + @Override + public String getSpeechBank(EntityPlayer entityplayer) { + return "nex/toxin"; + } + + @Override + public void onBoundUpdate(int x, int y, int z) { + } + + @Override + public void onUnboundUpdate() { + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/items/AulendurHammer.java b/src/main/java/com/zivilon/cinder_loe/items/AulendurHammer.java new file mode 100644 index 0000000..45a0ee8 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/items/AulendurHammer.java @@ -0,0 +1,26 @@ +package com.zivilon.cinder_loe.items; + +import com.zivilon.cinder_loe.CinderLoE; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; + +import java.util.List; + +public class AulendurHammer extends LoEHammer { + public AulendurHammer() { + super(CinderLoE.MATERIAL_NIMVEIL, CinderLoE.enchantedIce); + this.setTextureName("lotr:aulendur_hammer"); + } + + @Override + public String getUnlocalizedName(ItemStack item) { + return "item.aulendur_hammer"; + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean advanced) { + list.add(EnumChatFormatting.GRAY + "This blacksmith hammer is brimming with power"); + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/items/Celeiniss.java b/src/main/java/com/zivilon/cinder_loe/items/Celeiniss.java new file mode 100644 index 0000000..4205d76 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/items/Celeiniss.java @@ -0,0 +1,26 @@ +package com.zivilon.cinder_loe.items; + +import com.zivilon.cinder_loe.CinderLoE; +import com.zivilon.cinder_loe.LoECreativeTabs; + +import lotr.common.item.LOTRItemPolearm; +import lotr.common.item.LOTRWeaponStats; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +public class Celeiniss extends LOTRItemPolearm { + public Celeiniss() { + super(CinderLoE.MATERIAL_NEX_ICE); + this.lotrWeaponDamage = 11.5F; + this.setUnlocalizedName("lotr:firstAgeGlaive"); + this.setTextureName("lotr:firstAgeGlaive"); + this.setCreativeTab(LoECreativeTabs.tabCombatLoE); + LOTRWeaponStats.registerMeleeReach(Celeiniss.class, 1.8F); + LOTRWeaponStats.registerMeleeSpeed(Celeiniss.class, 1.0F); + } + + public boolean getIsRepairable(ItemStack itemstack, ItemStack repairItem) { + return (repairItem.getItem() == Item.getItemFromBlock(CinderLoE.enchantedIce)); + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/items/CinderLoESpawnEgg.java b/src/main/java/com/zivilon/cinder_loe/items/CinderLoESpawnEgg.java index 9a63149..828df48 100644 --- a/src/main/java/com/zivilon/cinder_loe/items/CinderLoESpawnEgg.java +++ b/src/main/java/com/zivilon/cinder_loe/items/CinderLoESpawnEgg.java @@ -9,6 +9,7 @@ import com.zivilon.cinder_loe.entity.npc.dwarf.RedDwarfBannerBearer; import com.zivilon.cinder_loe.entity.npc.dwarf.RedDwarfCommander; import com.zivilon.cinder_loe.entity.npc.dwarf.RedDwarfWarrior; import com.zivilon.cinder_loe.entity.npc.evil_human.*; +import com.zivilon.cinder_loe.entity.npc.frozen_dungeon.*; import com.zivilon.cinder_loe.entity.npc.good_human.*; import com.zivilon.cinder_loe.entity.npc.radagast.*; import com.zivilon.cinder_loe.entity.trader.*; @@ -96,6 +97,11 @@ public class CinderLoESpawnEgg extends Item { ENTITY_CLASSES.add(CorruptMan.class); ENTITY_CLASSES.add(CorruptOrc.class); ENTITY_CLASSES.add(HobbitBannerBearer.class); + ENTITY_CLASSES.add(NexShadow.class); + ENTITY_CLASSES.add(NexIce.class); + ENTITY_CLASSES.add(NexFire.class); + ENTITY_CLASSES.add(NexToxin.class); + ENTITY_CLASSES.add(Nex.class); } @Override diff --git a/src/main/java/com/zivilon/cinder_loe/items/IceThawer.java b/src/main/java/com/zivilon/cinder_loe/items/IceThawer.java new file mode 100644 index 0000000..0cf0b9a --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/items/IceThawer.java @@ -0,0 +1,27 @@ +package com.zivilon.cinder_loe.items; + +import com.zivilon.cinder_loe.LoECreativeTabs; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.entity.player.EntityPlayer; + +import java.util.List; + +public class IceThawer extends Item { + + public IceThawer() { + this.setUnlocalizedName("ice_thawer"); + this.setTextureName("lotr:ice_thawer"); + setCreativeTab(LoECreativeTabs.tabMiscLoE); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean advanced) { + list.add(EnumChatFormatting.DARK_PURPLE + "You feel like if you held this"); + list.add(EnumChatFormatting.DARK_PURPLE + "against a frozen body, it might melt."); + list.add(EnumChatFormatting.DARK_PURPLE + "But why would you need such thing?"); + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/items/Nimveil.java b/src/main/java/com/zivilon/cinder_loe/items/Nimveil.java new file mode 100644 index 0000000..654f408 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/items/Nimveil.java @@ -0,0 +1,458 @@ +package com.zivilon.cinder_loe.items; + +import com.zivilon.cinder_loe.CinderLoE; +import com.zivilon.cinder_loe.LoECreativeTabs; +import com.zivilon.cinder_loe.entity.effect.NimveilLightningBolt; +import com.zivilon.cinder_loe.potion.LoEPotions; +import com.zivilon.cinder_loe.util.Utilities; + +import lotr.common.LOTRLevelData; +import lotr.common.entity.npc.LOTREntityNPC; +import lotr.common.fac.LOTRFaction; +import lotr.common.item.LOTRItemSword; +import lotr.common.item.LOTRMaterial; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +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.nbt.NBTTagCompound; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.DamageSource; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +import java.util.List; + +public class Nimveil extends LOTRItemSword { + public static String NBT_STATE = "NimveilState"; + public static String NBT_VARIANT = "NimveilVariant"; + public static String NBT_TICK = "Tick"; + public IIcon[] icons; + + public Nimveil() { + super(CinderLoE.MATERIAL_NIMVEIL); + this.setHasSubtypes(true); + this.canRepair = false; + this.setMaxDamage(300); + setCreativeTab(LoECreativeTabs.tabCombatLoE); + } + + public boolean getIsRepairable(ItemStack nimveil, ItemStack repair_material) { + if (repair_material.getItem() == Item.getItemFromBlock(CinderLoE.enchantedIce)) + return true; + return false; + } + + @Override + public boolean showDurabilityBar(ItemStack stack) { + return true; // Always show the durability bar + } + + @Override + public double getDurabilityForDisplay(ItemStack stack) { + int state = get_state(stack); + + // No charges found, show recharge meter + if (state == 0) { + double damage = ((double) stack.getItemDamage() / (double) stack.getMaxDamage()); + return damage; + } + + // The only variant where state is > 1 is "ancient". So we skip an NBT read here. + if (state > 1) { + double ancient_charges = 1.0D - (10.0D - (double)state) / 10.0D; + return 1.0D - ancient_charges; + } + + // If variant is not "ancient", then it can't have more than 1 charge. We already checked that there is charge, so it's at max + String variant = get_variant(stack); + if (!variant.equals("ancient")) + return 0.0D; + + // If variant is "ancient" and state is 1, we know the bar is at 0.9. + return 0.9D; + } + + /** + * Nimveil state handling + */ + public static byte get_state(ItemStack stack) { + if (stack.hasTagCompound()) { + NBTTagCompound tag = stack.getTagCompound(); + return tag.getByte(NBT_STATE); + } + return 0; + } + public static void set_state(ItemStack stack, byte state) { + NBTTagCompound tag = stack.getTagCompound(); + if (tag == null) { + tag = new NBTTagCompound(); + stack.setTagCompound(tag); + } + tag.setByte(NBT_STATE, state); + } + public static boolean decrement_state(ItemStack stack) { + NBTTagCompound tag = stack.getTagCompound(); + if (tag == null) { + return false; + } + byte state = tag.getByte(NBT_STATE); + if (state > 0) { + if (state == 1) + stack.setItemDamage(300); + tag.setByte(NBT_STATE, --state); + return true; + } + return false; + } + public static int tick(ItemStack stack) { + NBTTagCompound tag = stack.getTagCompound(); + if (tag == null) { + tag = new NBTTagCompound(); + stack.setTagCompound(tag); + } + int tick = tag.getInteger(NBT_TICK); + if (tick >= 20) { + tick = 0; + } else { + tick++; + } + tag.setInteger(NBT_TICK, tick); + return tick; + } + + /** + * Methods to put all variants under one item type + */ + public IIcon getIconIndex(ItemStack stack) + { + int icon_index = 0; + if (get_state(stack) != 0) + icon_index += 5; + switch(get_variant(stack)) { + case "valar": + break; + case "mortals": + icon_index += 1; + break; + case "udun": + icon_index += 2; + break; + case "sauron": + icon_index += 3; + break; + case "ancient": + icon_index += 4; + break; + default: + break; + } + return icons[icon_index]; + } + @Override + public void registerIcons(IIconRegister iconRegister) { + this.icons = new IIcon[10]; + this.icons[0] = iconRegister.registerIcon("lotr:nimveil_valar"); + this.icons[1] = iconRegister.registerIcon("lotr:nimveil_mortals"); + this.icons[2] = iconRegister.registerIcon("lotr:nimveil_udun"); + this.icons[3] = iconRegister.registerIcon("lotr:nimveil_sauron"); + this.icons[4] = iconRegister.registerIcon("lotr:nimveil_ancient"); + this.icons[5] = iconRegister.registerIcon("lotr:nimveil_valar_glow"); + this.icons[6] = iconRegister.registerIcon("lotr:nimveil_mortals_glow"); + this.icons[7] = iconRegister.registerIcon("lotr:nimveil_udun_glow"); + this.icons[8] = iconRegister.registerIcon("lotr:nimveil_sauron_glow"); + this.icons[9] = iconRegister.registerIcon("lotr:nimveil_ancient_glow"); + } + + + + @Override + public String getUnlocalizedName(ItemStack item) { +// return "item.nimveil_" + get_variant(item); + return "lotr:nimveil"; + } + public static String get_variant(ItemStack stack) { + if (stack.hasTagCompound()) { + NBTTagCompound tag = stack.getTagCompound(); + return tag.getString(NBT_VARIANT); + } + return "invalid"; + } + public static ItemStack init_variant(ItemStack stack, String variant) { + NBTTagCompound tag = stack.getTagCompound(); + if (tag == null) { + tag = new NBTTagCompound(); + stack.setTagCompound(tag); + } + tag.setString(NBT_VARIANT, variant); + tag.setByte(NBT_STATE, (byte)0); + return stack; + } + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean advanced) { + switch(get_variant(stack)) { + case "valar": + list.add(EnumChatFormatting.AQUA + "Valar"); + list.add(""); + list.add(EnumChatFormatting.GOLD + "Special Attack:"); + list.add(EnumChatFormatting.YELLOW + " Cast a line of lightning strikes"); + return; + case "mortals": + list.add(EnumChatFormatting.DARK_GREEN + "Mortals"); + list.add(""); + list.add(EnumChatFormatting.GOLD + "Special Attack:"); + list.add(EnumChatFormatting.YELLOW + " Deal 25% of your missing health as damage"); + return; + case "udun": + list.add(EnumChatFormatting.DARK_RED + "Udûn"); + list.add(""); + list.add(EnumChatFormatting.GOLD + "Special Attack:"); + list.add(EnumChatFormatting.YELLOW + " +20% Attack Damage"); + list.add(EnumChatFormatting.YELLOW + " Reverse Knockback"); + return; + case "sauron": + list.add(EnumChatFormatting.DARK_PURPLE + "Sauron"); + list.add(EnumChatFormatting.GOLD + "Special Attack:"); + list.add(EnumChatFormatting.YELLOW + " Apply Corrupting effect for 60 seconds"); + list.add(EnumChatFormatting.YELLOW + " Causes all NPCs to be hostile"); + return; + case "ancient": + list.add(EnumChatFormatting.DARK_AQUA + "Ancient"); + list.add(EnumChatFormatting.GOLD + "Special Attack:"); + list.add(EnumChatFormatting.YELLOW + " For each outnumbering non-allied NPC nearby"); + list.add(EnumChatFormatting.YELLOW + " +5% damage vs NPCs"); + list.add(EnumChatFormatting.YELLOW + " +1.25% damage vs players"); + return; + default: + list.add(EnumChatFormatting.GRAY + "Invalid"); + return; + } + } + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + list.add(init_variant(new ItemStack(item, 1), "ancient")); + list.add(init_variant(new ItemStack(item, 1), "valar")); + list.add(init_variant(new ItemStack(item, 1), "mortals")); + list.add(init_variant(new ItemStack(item, 1), "udun")); + list.add(init_variant(new ItemStack(item, 1), "sauron")); + } + + /** + * Modify sword mechanics to those unique to Nimveil + */ + @Override + public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) { + if (attacker.worldObj.isRemote) return false; + if (stack.getItemDamage() != 0) return false; + + if (decrement_state(stack)) { + special_damage(stack, target, attacker); + } + return false; + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + if (world.isRemote) return stack; + if (stack.getItemDamage() != 0) return stack; + + byte state = get_state(stack); + if (state == 0) { + special_action(stack, world, player); + } + return stack; + } + + + /** + * Unused but here to remind they exist for later + */ + @Override + public EnumAction getItemUseAction(ItemStack p_77661_1_) { + return EnumAction.none; // might be modified later, it's here so I remember it exists, + } + + /** + * Recharging durability (special attack) bar + */ + @Override + public void onUpdate(ItemStack stack, World world, Entity entity, int itemSlot, boolean isSelected) { + super.onUpdate(stack, world, entity, itemSlot, isSelected); + + // Only run on the server-side to prevent conflicts with client-side rendering + if (!world.isRemote && get_state(stack) == 0) { + int tick = tick(stack); + if (tick == 20 && stack.getItemDamage() > 0) { + stack.setItemDamage(stack.getItemDamage() - 1); + } + } + } + + /** + * Generic redirects for Nimveil special actions + */ + public void special_action(ItemStack stack, World world, EntityPlayer player) { + String variant = get_variant(stack); + switch(variant) { + case "valar": + special_action_valar(stack, world, player); + return; + case "mortals": + special_action_mortals(stack, world, player); + return; + case "udun": + special_action_udun(stack, world, player); + return; + case "sauron": + special_action_sauron(stack, world, player); + return; + case "ancient": + special_action_ancient(stack, world, player); + return; + default: + return; + } + } + public void special_damage(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) { + String variant = get_variant(stack); + switch(variant) { + case "mortals": + special_damage_mortals(stack, target, attacker); + return; + case "udun": + special_damage_udun(stack, target, attacker); + return; + case "sauron": + special_damage_sauron(stack, target, attacker); + return; + case "ancient": + special_damage_ancient(stack, target, attacker); + return; + case "valar": + special_damage_valar(stack, target, attacker); + return; + default: + return; + } + } + + /** + * Valar Nimveil special actions + */ + public void special_action_valar(ItemStack stack, World world, EntityPlayer player) { + // No charges because this triggers immediately. Set damage to max + stack.setItemDamage(stack.getMaxDamage()); + System.out.println("Triggering Valar action. Also max damage is " + stack.getMaxDamage()); + summon_lightning_line(world, player); + } + public void special_damage_valar(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) { + // Do nothing, this method should never run but exists for consistency and extensibility + } + public void summon_lightning_line(World world, EntityPlayer player) { + // Get the player's facing direction + float yaw = player.rotationYaw; + + // Calculate the initial position, 4 blocks in front + double x = player.posX - Math.sin(Math.toRadians(yaw)) * 7; + double z = player.posZ + Math.cos(Math.toRadians(yaw)) * 7; + double y = player.posY; + + // Summon the first lightning bolt + world.spawnEntityInWorld(new NimveilLightningBolt(world, x, y, z)); + + // Summon 6 more lightning bolts, each 3 blocks apart + for (int i = 1; i < 7; i++) { + x -= Math.sin(Math.toRadians(yaw)) * 5; + z += Math.cos(Math.toRadians(yaw)) * 5; + world.spawnEntityInWorld(new NimveilLightningBolt(world, x, y, z)); + } + } + + /** + * Udûn Nimveil special actions + */ + public void special_action_udun(ItemStack stack, World world, EntityPlayer player) { + // Set 1 charge + set_state(stack, (byte)1); + } + public void special_damage_udun(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) { + double damage = Utilities.calculate_melee_damage_on_entity(target, attacker); + target.attackEntityFrom(DamageSource.causeMobDamage(attacker), 0.2F * (float)damage); + Utilities.knockback(target, attacker, -3.0D); + target.worldObj.playSoundAtEntity(target, "lotr:item.maceSauron", 1.0F, 1.3F); + } + + /** + * Mortals Nimveil special actions + */ + public void special_action_mortals(ItemStack stack, World world, EntityPlayer player) { + // Set 1 charge + set_state(stack, (byte)1); + } + public void special_damage_mortals(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) { + // Set 1 charge + float max_health = attacker.getMaxHealth(); + float current_health = attacker.getHealth(); + target.attackEntityFrom(DamageSource.causeMobDamage(attacker).setDamageBypassesArmor(), 0.25F * (max_health - current_health)); + } + + /** + * Sauron Nimveil special actions + */ + public void special_action_sauron(ItemStack stack, World world, EntityPlayer player) { + // Set 1 charge + set_state(stack, (byte)1); + } + public void special_damage_sauron(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) { + // Check if the target is an instance of EntityPlayer + if (target instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer) target; + + // Apply the Corrupting potion effect + player.addPotionEffect(new PotionEffect(LoEPotions.corrupting.id, 1200, 0)); // 60 seconds duration (20 ticks per second) + } + } + + /** + * Ancient Nimveil special actions + */ + public void special_action_ancient(ItemStack stack, World world, EntityPlayer player) { + // Set 10 charges + this.set_state(stack, ((byte)10)); + } + public void special_damage_ancient(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) { + if (!(attacker instanceof EntityPlayer)) return; + LOTRFaction pledged_faction = LOTRLevelData.getData(((EntityPlayer)attacker)).getPledgeFaction(); + if (pledged_faction == null) { + ((EntityPlayer)attacker).addChatMessage(new ChatComponentText("You need to be pledged to a faction to use this")); + return; + } + List entity_list = attacker.worldObj.getEntitiesWithinAABB(LOTREntityNPC.class, attacker.boundingBox.expand(100, 10, 100)); + int friendly_count = 0; + int total_count = entity_list.size(); + double damage = 0.0D; + for (LOTREntityNPC npc : entity_list) { + if (npc.getFaction().isGoodRelation(pledged_faction)) + friendly_count++; + } + int outnumber_count = Math.min(total_count - friendly_count * 2, 20); + if (outnumber_count > 0) + damage = Utilities.calculate_melee_damage_on_entity(target, attacker); + float final_damage = 0.0F; + if (!(target instanceof EntityPlayer)) { + final_damage = 0.05F * (float)outnumber_count * (float)damage; + target.attackEntityFrom(DamageSource.causeMobDamage(attacker), final_damage); + return; + } + final_damage = 0.0125F * ((float)outnumber_count) * ((float)damage); + target.attackEntityFrom(DamageSource.causeMobDamage(attacker), final_damage); + return; + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/items/NimveilPart.java b/src/main/java/com/zivilon/cinder_loe/items/NimveilPart.java new file mode 100644 index 0000000..c902139 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/items/NimveilPart.java @@ -0,0 +1,128 @@ +package com.zivilon.cinder_loe.items; + +import com.zivilon.cinder_loe.entity.projectile.EntityWarDart; +import com.zivilon.cinder_loe.LoECreativeTabs; + +import lotr.common.dispenser.LOTRDispenseThrowingAxe; +import lotr.common.enchant.LOTREnchantment; +import lotr.common.enchant.LOTREnchantmentHelper; +import lotr.common.entity.projectile.LOTREntityThrowingAxe; +import lotr.common.item.LOTRMaterial; +import lotr.common.recipe.LOTRRecipes; +import net.minecraft.block.BlockDispenser; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.EnumCreatureAttribute; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.util.IIcon; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.creativetab.CreativeTabs; +import java.util.List; + +public class NimveilPart extends Item { + public IIcon[] icons; + + public NimveilPart() { + this.setHasSubtypes(true); + setCreativeTab(LoECreativeTabs.tabMiscLoE); + } + + @Override + public IIcon getIconFromDamage(int damage) { + if (damage < 0 || damage >= icons.length) { + damage = 0; + } + return this.icons[damage]; + } + + @Override + public void registerIcons(IIconRegister iconRegister) { + this.icons = new IIcon[7]; + this.icons[0] = iconRegister.registerIcon("lotr:nimveil_hilt"); + this.icons[1] = iconRegister.registerIcon("lotr:nimveil_blade"); + this.icons[2] = iconRegister.registerIcon("lotr:nimveil_gem_valar"); + this.icons[3] = iconRegister.registerIcon("lotr:nimveil_gem_mortals"); + this.icons[4] = iconRegister.registerIcon("lotr:nimveil_gem_udun"); + this.icons[5] = iconRegister.registerIcon("lotr:nimveil_gem_sauron"); + this.icons[6] = iconRegister.registerIcon("lotr:nimveil_gem_ancient"); + } + + public static String get_part_type(ItemStack item) { + switch(item.getItemDamage()) { + case 0: + return "hilt"; + case 1: + return "blade"; + case 2: + case 3: + case 4: + case 5: + case 6: + return "gem"; + default: + return "hilt"; + } + } + + public static String get_gem_type(ItemStack item) { + switch(item.getItemDamage()) { + case 0: + case 1: + return "invalid"; + case 2: + return "valar"; + case 3: + return "mortals"; + case 4: + return "udun"; + case 5: + return "sauron"; + case 6: + return "ancient"; + default: + return "invalid"; + } + } + + @Override + public String getUnlocalizedName(ItemStack item) { + return "item.nimveil_" + get_part_type(item); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean advanced) { + switch(get_gem_type(stack)) { + case "valar": + list.add(EnumChatFormatting.AQUA + "Valar"); + return; + case "mortals": + list.add(EnumChatFormatting.DARK_GREEN + "Mortals"); + return; + case "udun": + list.add(EnumChatFormatting.DARK_RED + "Udûn"); + return; + case "sauron": + list.add(EnumChatFormatting.DARK_PURPLE + "Sauron"); + return; + case "ancient": + list.add(EnumChatFormatting.DARK_AQUA + "Ancient"); + return; + default: + return; + } + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + for (int i = 0; i < icons.length; i++) { + list.add(new ItemStack(item, 1, i)); + } + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/items/ToxicCore.java b/src/main/java/com/zivilon/cinder_loe/items/ToxicCore.java new file mode 100644 index 0000000..8c5df91 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/items/ToxicCore.java @@ -0,0 +1,17 @@ +package com.zivilon.cinder_loe.items; + +import com.zivilon.cinder_loe.LoECreativeTabs; + +import net.minecraft.item.Item; + +public class ToxicCore extends Item { + + public ToxicCore() { + this.setUnlocalizedName("lotr:toxicCore"); + this.setTextureName("lotr:toxic_core"); + setCreativeTab(LoECreativeTabs.tabMiscLoE); + this.setMaxDamage(10000); + this.setNoRepair(); + this.setMaxStackSize(1); + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/items/WeaponPart.java b/src/main/java/com/zivilon/cinder_loe/items/WeaponPart.java new file mode 100644 index 0000000..d047f44 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/items/WeaponPart.java @@ -0,0 +1,127 @@ +package com.zivilon.cinder_loe.items; + +import com.zivilon.cinder_loe.entity.projectile.EntityWarDart; +import com.zivilon.cinder_loe.LoECreativeTabs; + +import lotr.common.dispenser.LOTRDispenseThrowingAxe; +import lotr.common.enchant.LOTREnchantment; +import lotr.common.enchant.LOTREnchantmentHelper; +import lotr.common.entity.projectile.LOTREntityThrowingAxe; +import lotr.common.item.LOTRMaterial; +import lotr.common.recipe.LOTRRecipes; +import net.minecraft.block.BlockDispenser; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.EnumCreatureAttribute; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.util.IIcon; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.creativetab.CreativeTabs; +import java.util.List; + +public class WeaponPart extends Item { + public IIcon[] icons; + + public WeaponPart() { + this.setHasSubtypes(true); + setCreativeTab(LoECreativeTabs.tabMiscLoE); + } + + @Override + public IIcon getIconFromDamage(int damage) { + if (damage < 0 || damage >= icons.length) { + damage = 0; + } + return this.icons[damage]; + } + + @Override + public void registerIcons(IIconRegister iconRegister) { + this.icons = new IIcon[12]; + this.icons[0] = iconRegister.registerIcon("lotr:deceiver_blade_blade"); + this.icons[1] = iconRegister.registerIcon("lotr:deceiver_blade_guard"); + this.icons[2] = iconRegister.registerIcon("lotr:deceiver_blade_hilt"); + this.icons[3] = iconRegister.registerIcon("lotr:anarore_bow_top"); + this.icons[4] = iconRegister.registerIcon("lotr:anarore_bow_bottom"); + this.icons[5] = iconRegister.registerIcon("lotr:anarore_bow_bowstring"); + this.icons[6] = iconRegister.registerIcon("lotr:chieftain_club_???"); + this.icons[7] = iconRegister.registerIcon("lotr:chieftain_club_???"); + this.icons[8] = iconRegister.registerIcon("lotr:chieftain_club_???"); + this.icons[9] = iconRegister.registerIcon("lotr:glaechir_spear_tip"); + this.icons[10] = iconRegister.registerIcon("lotr:glaechir_spear_shaft"); + this.icons[11] = iconRegister.registerIcon("lotr:glaechir_spear_???"); + } + + public static String get_part(ItemStack item) { + switch(item.getItemDamage()) { + case 0: + return "blade"; + case 1: + return "guard"; + case 2: + return "hilt"; + case 3: + return "top"; + case 4: + return "bottom"; + case 5: + return "bowstring"; + case 6: + return "club"; + case 7: + return "spikes"; + case 8: + return "???"; + case 9: + return "tip"; + case 10: + return "shaft"; + case 11: + return "???"; + default: + return "invalid"; + } + } + + public static String get_weapon(ItemStack item) { + switch(item.getItemDamage()) { + case 0: + case 1: + case 2: + return "deceiver_blade"; + case 3: + case 4: + case 5: + return "anarore_bow"; + case 6: + case 7: + case 8: + return "troll_chieftain_club"; + case 9: + case 10: + case 11: + return "glaechir_spear"; + default: + return "invalid"; + } + } + + @Override + public String getUnlocalizedName(ItemStack item) { + return "item." + get_weapon(item) + "_" + get_part(item); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + for (int i = 0; i < icons.length; i++) { + list.add(new ItemStack(item, 1, i)); + } + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/mixins/MixinEntityLivingBase.java b/src/main/java/com/zivilon/cinder_loe/mixins/MixinEntityLivingBase.java index a566896..f1d815b 100644 --- a/src/main/java/com/zivilon/cinder_loe/mixins/MixinEntityLivingBase.java +++ b/src/main/java/com/zivilon/cinder_loe/mixins/MixinEntityLivingBase.java @@ -2,6 +2,8 @@ package com.zivilon.cinder_loe.mixins; import com.zivilon.cinder_loe.util.*; +import com.zivilon.cinder_loe.entity.npc.frozen_dungeon.*; + import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.injection.callback.*; @@ -79,6 +81,7 @@ public abstract class MixinEntityLivingBase extends Entity { /** * @author Shinare * @reason Adding damage event method + * Added Nex fire damage modifiers */ @Overwrite public boolean attackEntityFrom(DamageSource source, float damage) { @@ -88,7 +91,24 @@ public abstract class MixinEntityLivingBase extends Entity { this.entityAge = 0; if (this.getHealth() <= 0.0F) return false; - if (source.isFireDamage() && isPotionActive(Potion.fireResistance)) return false; + if (source.isFireDamage()) { + if ((EntityLivingBase)(Object)this instanceof Nex || (EntityLivingBase)(Object)this instanceof NexMiniboss) return false; + boolean fire_phase = Nex.is_nex_fire_phase_nearby((EntityLivingBase)(Object)this); + if (this.isPotionActive(Potion.fireResistance)) { + if (!fire_phase) return false; + damage *= 0.5F; + } + if (fire_phase) { + damage *= 3.0F; + List list = this.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, this.boundingBox.expand(5, 5, 5)); + for (EntityLivingBase entity : list) { + if (!(entity instanceof Nex || entity instanceof NexMiniboss)) { + entity.setFire(10); + } + } + } + } + if (!(checked_cauldron)) { check_cauldron(); diff --git a/src/main/java/com/zivilon/cinder_loe/mixins/MixinItemRenderer.java b/src/main/java/com/zivilon/cinder_loe/mixins/MixinItemRenderer.java index b44dd96..73b081f 100644 --- a/src/main/java/com/zivilon/cinder_loe/mixins/MixinItemRenderer.java +++ b/src/main/java/com/zivilon/cinder_loe/mixins/MixinItemRenderer.java @@ -281,4 +281,18 @@ public abstract class MixinItemRenderer { // Redirect to new custom renderer. This should not be necessary but works as failsafe RenderHelper.customRenderItemIn2D(p_78439_0_, p_78439_1_, p_78439_2_, p_78439_3_, p_78439_4_, p_78439_5_, p_78439_6_, p_78439_7_, false); } + + /** + * Making recharging Nimveil not be constantly in the item change animation + */ + @Inject(method = "renderItemInFirstPerson", at = @At("HEAD"), cancellable = true) + public void inject(float f, CallbackInfo ci) { + if (itemToRender != null && itemToRender.getItem() == CinderLoE.nimveil) { + EntityClientPlayerMP entityclientplayermp = this.mc.thePlayer; + ItemStack itemstack = entityclientplayermp.inventory.getCurrentItem(); + equippedProgress = 1.0F; + prevEquippedProgress = 1.0F; + itemToRender = itemstack; + } + } } diff --git a/src/main/java/com/zivilon/cinder_loe/mixins/MixinLOTRRenderLargeItem.java b/src/main/java/com/zivilon/cinder_loe/mixins/MixinLOTRRenderLargeItem.java index e7d994e..62add57 100644 --- a/src/main/java/com/zivilon/cinder_loe/mixins/MixinLOTRRenderLargeItem.java +++ b/src/main/java/com/zivilon/cinder_loe/mixins/MixinLOTRRenderLargeItem.java @@ -1,6 +1,7 @@ package com.zivilon.cinder_loe.mixins; import com.zivilon.cinder_loe.client.render.item.RenderHelper; +import com.zivilon.cinder_loe.items.Nimveil; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -30,15 +31,121 @@ import java.util.Map; @Mixin(LOTRRenderLargeItem.class) public abstract class MixinLOTRRenderLargeItem { + private static IIcon[] nimveil_icons; + + @Shadow(remap = false) + private Item theItem; + @Shadow(remap = false) + private IIcon largeIcon; + @Shadow(remap = false) + private String folderName; + @Shadow(remap = false) + private static Map sizeFolders; + + @Shadow(remap = false) + private static ResourceLocation getLargeTexturePath(Item item, String folder) { + return null; + }; /** * @author Shinare * @reason Added support for transparent textures */ @Redirect(method = "renderLargeItem(Lnet/minecraft/util/IIcon;)V", remap = false, - at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/renderer/ItemRenderer;func_78439_a(Lnet/minecraft/client/renderer/Tessellator;FFFFIIF)V")) + at = @At(value = "INVOKE", + target = "Lnet/minecraft/client/renderer/ItemRenderer;func_78439_a(Lnet/minecraft/client/renderer/Tessellator;FFFFIIF)V")) private void onRenderItemIn2D(Tessellator tessellator, float f1, float f2, float f, float f3, int width, int height, float thickness) { RenderHelper.customRenderItemIn2D(tessellator, f1, f2, f, f3, width, height, thickness, false); } + + /** + * @author Shinare + * @reason Added support for NBT based subtyping for Nimveil + */ + @Overwrite(remap = false) + private IIcon registerLargeIcon(IIconRegister register, String extra) { + String prefix = "lotr:"; + if (this.theItem instanceof Nimveil) { + String itemName = "lotr:nimveil"; + itemName = itemName.substring(itemName.indexOf(prefix) + prefix.length()); + String path = prefix + this.folderName + "/" + itemName; + nimveil_icons = new IIcon[10]; + nimveil_icons[0] = register.registerIcon(path + "_valar"); + nimveil_icons[1] = register.registerIcon(path + "_mortals"); + nimveil_icons[2] = register.registerIcon(path + "_udun"); + nimveil_icons[3] = register.registerIcon(path + "_sauron"); + nimveil_icons[4] = register.registerIcon(path + "_ancient"); + nimveil_icons[5] = register.registerIcon(path + "_valar_glow"); + nimveil_icons[6] = register.registerIcon(path + "_mortals_glow"); + nimveil_icons[7] = register.registerIcon(path + "_udun_glow"); + nimveil_icons[8] = register.registerIcon(path + "_sauron_glow"); + nimveil_icons[9] = register.registerIcon(path + "_ancient_glow"); + System.out.println("Registering large icon for " + this.theItem.getClass().getSimpleName() + " at " + path); + return nimveil_icons[0]; + } else { + String itemName = this.theItem.getUnlocalizedName(); + itemName = itemName.substring(itemName.indexOf(prefix) + prefix.length()); + String path = prefix + this.folderName + "/" + itemName; + if (!StringUtils.isNullOrEmpty(extra)) + path = path + "_" + extra; + System.out.println("Registering large icon for " + this.theItem.getClass().getSimpleName() + " at " + path); + return register.registerIcon(path); + } + } + + /** + * @author Shinare + * @reason Added support for NBT based subtyping for Nimveil + */ + @Overwrite(remap = false) + public static LOTRRenderLargeItem getRendererIfLarge(Item item) { + if (item instanceof Nimveil) + return new LOTRRenderLargeItem(item, "large", 2.0F); + for (String folder : sizeFolders.keySet()) { + float iconScale = ((Float)sizeFolders.get(folder)).floatValue(); + try { + ResourceLocation resLoc = getLargeTexturePath(item, folder); + IResource res = Minecraft.getMinecraft().getResourceManager().getResource(resLoc); + if (res != null) + return new LOTRRenderLargeItem(item, folder, iconScale); + } catch (IOException iOException) {} + } + return null; + } + + + /** + * @author Shinare + * @reason Added support for NBT based subtyping for Nimveil + */ + @Inject(method = "renderItem", + at = @At(value = "HEAD"), + cancellable = true, remap = false) + public void getNimveilIcon(IItemRenderer.ItemRenderType type, ItemStack itemstack, Object[] data, CallbackInfo ci) { + if (itemstack.getItem() instanceof Nimveil) { + int icon_index = 0; + if (Nimveil.get_state(itemstack) != 0) + icon_index += 5; + switch(Nimveil.get_variant(itemstack)) { + case "valar": + break; + case "mortals": + icon_index += 1; + break; + case "udun": + icon_index += 2; + break; + case "sauron": + icon_index += 3; + break; + case "ancient": + icon_index += 4; + break; + default: + this.largeIcon = nimveil_icons[0]; + break; + } + this.largeIcon = nimveil_icons[icon_index]; + } + } } diff --git a/src/main/java/com/zivilon/cinder_loe/mixins/MixinSlotCrafting.java b/src/main/java/com/zivilon/cinder_loe/mixins/MixinSlotCrafting.java index 2a8148c..2ebd594 100644 --- a/src/main/java/com/zivilon/cinder_loe/mixins/MixinSlotCrafting.java +++ b/src/main/java/com/zivilon/cinder_loe/mixins/MixinSlotCrafting.java @@ -58,7 +58,11 @@ public abstract class MixinSlotCrafting { if (itemstack1 != null) { if (!hasExceptionItem && DurableItemCrafter.customItems.contains(itemstack1.getItem())) { - damage_item(itemstack1, i, 1, craftMatrix); + if (itemstack1.getItem() == CinderLoE.toxicCore && arrow_count > 0) { + damage_item(itemstack1, i, arrow_count, craftMatrix); + } else { + damage_item(itemstack1, i, 1, craftMatrix); + } } else { craftMatrix.decrStackSize(i, 1); } diff --git a/src/main/java/com/zivilon/cinder_loe/recipe/ForgingRecipe.java b/src/main/java/com/zivilon/cinder_loe/recipe/ForgingRecipe.java new file mode 100644 index 0000000..3680377 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/recipe/ForgingRecipe.java @@ -0,0 +1,57 @@ +package com.zivilon.cinder_loe.recipe; + +import net.minecraft.item.ItemStack; + +public class ForgingRecipe { + + public boolean isBlessed; + public ItemStack leftInput; + public ItemStack middleInput; + public ItemStack rightInput; + public ItemStack output; + + public ForgingRecipe(ItemStack leftInput, ItemStack middleInput, ItemStack rightInput, ItemStack output, boolean isBlessed) { + this.leftInput = leftInput; + this.middleInput = middleInput; + this.rightInput = rightInput; + this.output = output; + this.isBlessed = isBlessed; + } + + public boolean matches(ItemStack left, ItemStack middle, ItemStack right, boolean isBlessedHammer) { + if (this.isBlessed && !isBlessedHammer) { + return false; + } + + return matchesItem(leftInput, left) && + matchesItem(middleInput, middle) && + matchesItem(rightInput, right); + } + + public boolean matchesItem(ItemStack recipeInput, ItemStack stationInput) { + if (recipeInput == null && stationInput == null) { + return true; + } + if (recipeInput == null || stationInput == null) { + return false; + } + return recipeInput.getItem() == stationInput.getItem() && + recipeInput.getItemDamage() == stationInput.getItemDamage(); + } + + public ItemStack getOutput() { + return output.copy(); + } + + public static String getSafeName(ItemStack stack) { + if (stack == null) return "null"; + return stack.getUnlocalizedName(); + } + + public static void printRecipeDetails(ForgingRecipe recipe) { + System.out.println("Left: " + getSafeName(recipe.leftInput)); + System.out.println("Middle: " + getSafeName(recipe.middleInput)); + System.out.println("Right: " + getSafeName(recipe.rightInput)); + } + +} diff --git a/src/main/java/com/zivilon/cinder_loe/recipe/ForgingRecipes.java b/src/main/java/com/zivilon/cinder_loe/recipe/ForgingRecipes.java new file mode 100644 index 0000000..bcac2bd --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/recipe/ForgingRecipes.java @@ -0,0 +1,85 @@ +package com.zivilon.cinder_loe.recipe; + +import com.zivilon.cinder_loe.CinderLoE; +import com.zivilon.cinder_loe.items.Nimveil; +import com.zivilon.cinder_loe.util.Utilities; + +import lotr.common.enchant.LOTREnchantment; + +import net.minecraft.item.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class ForgingRecipes { + public static List recipes = new ArrayList(); + + public static void register_recipe(ForgingRecipe recipe) { + recipes.add(recipe); + } + + public static void register_recipes() { + register_recipe(new ForgingRecipe( + new ItemStack(CinderLoE.nimveilPart, 1, 2), + new ItemStack(CinderLoE.nimveilPart, 1, 1), + new ItemStack(CinderLoE.nimveilPart, 1, 0), + Nimveil.init_variant(new ItemStack(CinderLoE.nimveil, 1), "valar"), + true + )); + register_recipe(new ForgingRecipe( + new ItemStack(CinderLoE.nimveilPart, 1, 3), + new ItemStack(CinderLoE.nimveilPart, 1, 1), + new ItemStack(CinderLoE.nimveilPart, 1, 0), + Nimveil.init_variant(new ItemStack(CinderLoE.nimveil, 1), "mortals"), + true + )); + register_recipe(new ForgingRecipe( + new ItemStack(CinderLoE.nimveilPart, 1, 4), + new ItemStack(CinderLoE.nimveilPart, 1, 1), + new ItemStack(CinderLoE.nimveilPart, 1, 0), + Nimveil.init_variant(new ItemStack(CinderLoE.nimveil, 1), "udun"), + true + )); + register_recipe(new ForgingRecipe( + new ItemStack(CinderLoE.nimveilPart, 1, 5), + new ItemStack(CinderLoE.nimveilPart, 1, 1), + new ItemStack(CinderLoE.nimveilPart, 1, 0), + Nimveil.init_variant(new ItemStack(CinderLoE.nimveil, 1), "sauron"), + true + )); + register_recipe(new ForgingRecipe( + new ItemStack(CinderLoE.nimveilPart, 1, 6), + new ItemStack(CinderLoE.nimveilPart, 1, 1), + new ItemStack(CinderLoE.nimveilPart, 1, 0), + Nimveil.init_variant(new ItemStack(CinderLoE.nimveil, 1), "ancient"), + true + )); + register_recipe(new ForgingRecipe( + null, + new ItemStack(CinderLoE.nimveil, 1), + null, + new ItemStack(CinderLoE.nimveilPart, 1, 1), + true + )); + register_recipe(new ForgingRecipe( + new ItemStack(CinderLoE.weaponPart, 1, 0), + new ItemStack(CinderLoE.weaponPart, 1, 1), + new ItemStack(CinderLoE.weaponPart, 1, 2), + deceiver_blade(), + false + )); + } + + public static ItemStack deceiver_blade() { + ItemStack blade = new ItemStack(CinderLoE.deceiverBlade, 1); + Utilities.setAppliedRandomEnchants(blade); + Utilities.setLOTREnchant(blade, LOTREnchantment.strong4); + Utilities.setLOTREnchant(blade, LOTREnchantment.meleeSpeed1); + Utilities.setLOTREnchant(blade, LOTREnchantment.meleeReach1); + return blade; + } + + public static List getAllRecipes() { + return recipes; + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/recipe/ToxicCoreArrowsRecipe.java b/src/main/java/com/zivilon/cinder_loe/recipe/ToxicCoreArrowsRecipe.java new file mode 100644 index 0000000..12c51ae --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/recipe/ToxicCoreArrowsRecipe.java @@ -0,0 +1,81 @@ +package com.zivilon.cinder_loe.recipe; + +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.world.World; +import com.zivilon.cinder_loe.CinderLoE; + +public class ToxicCoreArrowsRecipe implements IRecipe { + + private final ItemStack result; + + public ToxicCoreArrowsRecipe(ItemStack result) { + this.result = result; + } + + @Override + public boolean matches(InventoryCrafting inv, World worldIn) { + ItemStack toxicCore = null; + int arrowCount = 0; + + for (int i = 0; i < inv.getSizeInventory(); i++) { + ItemStack itemstack = inv.getStackInSlot(i); + + if (itemstack != null) { + if (itemstack.getItem() == CinderLoE.toxicCore) { + if (toxicCore != null) { + return false; // Only one toxic core allowed + } + toxicCore = itemstack; + } else if (itemstack.getItem() == Items.arrow) { + arrowCount++; + } else { + return false; // Invalid item in grid + } + } + } + + if (toxicCore != null && arrowCount > 0) { + return toxicCore.getItemDamage() + arrowCount <= toxicCore.getMaxDamage(); + } + + return false; + } + + @Override + public ItemStack getCraftingResult(InventoryCrafting inv) { + ItemStack toxicCore = null; + int arrowCount = 0; + + for (int i = 0; i < inv.getSizeInventory(); i++) { + ItemStack itemstack = inv.getStackInSlot(i); + + if (itemstack != null) { + if (itemstack.getItem() == CinderLoE.toxicCore) { + toxicCore = itemstack; + } else if (itemstack.getItem() == Items.arrow) { + arrowCount++; + } + } + } + + if (toxicCore != null && arrowCount > 0) { + ItemStack resultStack = new ItemStack(result.getItem(), arrowCount); + return resultStack; + } + + return null; + } + + @Override + public int getRecipeSize() { + return 9; + } + + @Override + public ItemStack getRecipeOutput() { + return result; + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/recipes.java b/src/main/java/com/zivilon/cinder_loe/recipes.java index 196a5e2..2527bab 100644 --- a/src/main/java/com/zivilon/cinder_loe/recipes.java +++ b/src/main/java/com/zivilon/cinder_loe/recipes.java @@ -7,6 +7,7 @@ import lotr.common.recipe.LOTRMillstoneRecipes; import lotr.common.recipe.LOTRRecipePoisonWeapon; import lotr.common.recipe.LOTRRecipes; import com.zivilon.cinder_loe.CinderLoE; +import com.zivilon.cinder_loe.recipe.*; import com.zivilon.cinder_loe.mixins.MixinLOTRBrewingRecipes; import lotr.common.item.LOTRItemFood; @@ -41,59 +42,49 @@ public class recipes { public static void registerGeneralRecipes() { GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.bowAsh), " XS", "X S", " XS", - 'X', CinderLoE.ingotAsh, 'S', Items.string)); + 'X', CinderLoE.ingotAsh, 'S', Items.string)); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.spearAsh), " X", " Y ", "Y ", - 'X', CinderLoE.ingotAsh, 'Y', "stickWood")); + 'X', CinderLoE.ingotAsh, 'Y', "stickWood")); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.swordAsh), " X ", " X ", " Y ", - 'X', CinderLoE.ingotAsh, 'Y', "stickWood")); + 'X', CinderLoE.ingotAsh, 'Y', "stickWood")); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.staffAsh), " XX", " YX", "Y ", - 'X', CinderLoE.ingotAsh, 'Y', "stickWood")); + 'X', CinderLoE.ingotAsh, 'Y', "stickWood")); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.battleaxeAsh), "XXX", "XYX", " Y ", - 'X', CinderLoE.ingotAsh, 'Y', "stickWood")); + 'X', CinderLoE.ingotAsh, 'Y', "stickWood")); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.pikeAsh), " X", " YX", "Y ", - 'X', CinderLoE.ingotAsh, 'Y', "stickWood")); + 'X', CinderLoE.ingotAsh, 'Y', "stickWood")); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.hammerAsh), "XYX", "XYX", " Y ", - 'X', CinderLoE.ingotAsh, 'Y', "stickWood")); + 'X', CinderLoE.ingotAsh, 'Y', "stickWood")); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.daggerAsh), "X ", "Y ", - 'X', CinderLoE.ingotAsh, 'Y', "stickWood")); + 'X', CinderLoE.ingotAsh, 'Y', "stickWood")); GameRegistry.addRecipe((IRecipe)new ShapedOreRecipe(new ItemStack(CinderLoE.bowAsh), new Object[] { " XS", "X S", " XS", - Character.valueOf('X'), CinderLoE.ingotAsh, Character.valueOf('S'), Items.string })); + Character.valueOf('X'), CinderLoE.ingotAsh, Character.valueOf('S'), Items.string })); GameRegistry.addRecipe((IRecipe)new ShapedOreRecipe(new ItemStack(CinderLoE.spearAsh), new Object[] { " X", " Y ", "Y ", - Character.valueOf('X'), CinderLoE.ingotAsh, Character.valueOf('Y'), "stickWood" })); + Character.valueOf('X'), CinderLoE.ingotAsh, Character.valueOf('Y'), "stickWood" })); GameRegistry.addRecipe((IRecipe)new ShapedOreRecipe(new ItemStack(CinderLoE.swordAsh), new Object[] { " X ", " X ", " Y ", - Character.valueOf('X'), CinderLoE.ingotAsh, Character.valueOf('Y'), "stickWood" })); + Character.valueOf('X'), CinderLoE.ingotAsh, Character.valueOf('Y'), "stickWood" })); GameRegistry.addRecipe((IRecipe)new ShapedOreRecipe(new ItemStack(CinderLoE.staffAsh), new Object[] { " XX", " YX", "Y ", - Character.valueOf('X'), CinderLoE.ingotAsh, Character.valueOf('Y'), "stickWood" })); + Character.valueOf('X'), CinderLoE.ingotAsh, Character.valueOf('Y'), "stickWood" })); GameRegistry.addRecipe((IRecipe)new ShapedOreRecipe(new ItemStack(CinderLoE.battleaxeAsh), new Object[] { "XXX", "XYX", " Y ", - Character.valueOf('X'), CinderLoE.ingotAsh, Character.valueOf('Y'), "stickWood" })); + Character.valueOf('X'), CinderLoE.ingotAsh, Character.valueOf('Y'), "stickWood" })); GameRegistry.addRecipe((IRecipe)new ShapedOreRecipe(new ItemStack(CinderLoE.pikeAsh), new Object[] { " X", " YX", "Y ", - Character.valueOf('X'), CinderLoE.ingotAsh, Character.valueOf('Y'), "stickWood" })); + Character.valueOf('X'), CinderLoE.ingotAsh, Character.valueOf('Y'), "stickWood" })); GameRegistry.addRecipe((IRecipe)new ShapedOreRecipe(new ItemStack(CinderLoE.hammerAsh), new Object[] { "XYX", "XYX", " Y ", - Character.valueOf('X'), CinderLoE.ingotAsh, Character.valueOf('Y'), "stickWood" })); + Character.valueOf('X'), CinderLoE.ingotAsh, Character.valueOf('Y'), "stickWood" })); GameRegistry.addRecipe((IRecipe)new ShapedOreRecipe(new ItemStack(CinderLoE.daggerAsh), new Object[] { "X ", "Y ", - Character.valueOf('X'), CinderLoE.ingotAsh, Character.valueOf('Y'), "stickWood" })); + Character.valueOf('X'), CinderLoE.ingotAsh, Character.valueOf('Y'), "stickWood" })); GameRegistry.addRecipe((IRecipe)new ShapedOreRecipe(new ItemStack(CinderLoE.warDart, 1, 0), new Object[] { " Y", "X ", Character.valueOf('X'), "feather", Character.valueOf('Y'), "stickWood" })); - GameRegistry.addRecipe((IRecipe)new ShapedOreRecipe(new ItemStack(CinderLoE.warDart, 1, 0), new Object[] { " Y", "X ", - Character.valueOf('X'), "feather", Character.valueOf('Y'), "stickWood" })); + GameRegistry.addRecipe(new ToxicCoreArrowsRecipe(new ItemStack(LOTRMod.arrowPoisoned))); GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(CinderLoE.spicedHam), CinderLoE.spice, Items.cooked_porkchop)); GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(CinderLoE.warDartHeads, 2, 1), LOTRMod.copper, new ItemStack(LOTRMod.chisel, 1, OreDictionary.WILDCARD_VALUE))); GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(CinderLoE.warDartHeads, 2, 2), LOTRMod.bronze, new ItemStack(LOTRMod.chisel, 1, OreDictionary.WILDCARD_VALUE))); GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(CinderLoE.warDartHeads, 2, 3), Items.iron_ingot, new ItemStack(LOTRMod.chisel, 1, OreDictionary.WILDCARD_VALUE))); -// GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(CinderLoE.warDartHeads, 2, 4), LOTRMod.orcSteel, new ItemStack(LOTRMod.chisel, 1, OreDictionary.WILDCARD_VALUE))); -// GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(CinderLoE.warDartHeads, 2, 5), LOTRMod.dwarfSteel, new ItemStack(LOTRMod.chisel, 1, OreDictionary.WILDCARD_VALUE))); -// GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(CinderLoE.warDartHeads, 2, 6), LOTRMod.urukSteel, new ItemStack(LOTRMod.chisel, 1, OreDictionary.WILDCARD_VALUE))); -// GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(CinderLoE.warDartHeads, 2, 7), LOTRMod.blueDwarfSteel, new ItemStack(LOTRMod.chisel, 1, OreDictionary.WILDCARD_VALUE))); -// GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(CinderLoE.warDartHeads, 2, 8), LOTRMod.blackUrukSteel, new ItemStack(LOTRMod.chisel, 1, OreDictionary.WILDCARD_VALUE))); -// GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(CinderLoE.warDartHeads, 2, 9), LOTRMod.elfSteel, new ItemStack(LOTRMod.chisel, 1, OreDictionary.WILDCARD_VALUE))); -// GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(CinderLoE.warDartHeads, 2, 10), LOTRMod.gildedIron, new ItemStack(LOTRMod.chisel, 1, OreDictionary.WILDCARD_VALUE))); -// GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(CinderLoE.warDartHeads, 2, 11), CinderLoE.redDwarfSteel, new ItemStack(LOTRMod.chisel, 1, OreDictionary.WILDCARD_VALUE))); GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(CinderLoE.warDartHeads, 2, 12), LOTRMod.mithril, new ItemStack(LOTRMod.chisel, 1, OreDictionary.WILDCARD_VALUE))); -// GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(CinderLoE.warDartHeads, 2, 14), LOTRMod.morgulSteel, new ItemStack(LOTRMod.chisel, 1, OreDictionary.WILDCARD_VALUE))); GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(CinderLoE.warDart, 1, 1), new ItemStack(CinderLoE.warDart, 1, 0), new ItemStack(CinderLoE.warDartHeads, 1, 1))); GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(CinderLoE.warDart, 1, 2), new ItemStack(CinderLoE.warDart, 1, 0), new ItemStack(CinderLoE.warDartHeads, 1, 2))); @@ -156,136 +147,136 @@ public class recipes { GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(CinderLoE.pelmen), Items.wheat, "meat", LOTRMod.salt)); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.cinderBlock), "XXX", "XYX", "XXX", - 'X', Blocks.stone, 'Y', LOTRMod.balrogFire)); + 'X', Blocks.stone, 'Y', LOTRMod.balrogFire)); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.reedBale), "XXX", "XXX", "XXX", - 'X', LOTRMod.reeds)); + 'X', LOTRMod.reeds)); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.leatherBundle), "XXX", "XXX", "XXX", - 'X', Items.leather)); + 'X', Items.leather)); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.pretzel, 2), "XYX", " X ", - 'X', CinderLoE.dough, 'Y', LOTRMod.salt)); + 'X', CinderLoE.dough, 'Y', LOTRMod.salt)); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.dough, 8), "XXX", "XYX", "XXX", - 'X', CinderLoE.flour, 'Y', Items.water_bucket)); + 'X', CinderLoE.flour, 'Y', Items.water_bucket)); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.fishBarrel), "XXX", "XXX", "XXX", - 'X', Items.fish)); + 'X', Items.fish)); //GameRegistry.addRecipe((IRecipe)new ShapedOreRecipe(new ItemStack(CinderLoE.rustedsword, 8), new Object[] { "X", "y", "y", //Character.valueOf('Y'), Items.iron_ingot, Character.valueOf('X'), "stickWood"})); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.silverChain, 8), "X", "X", "X", - 'X', LOTRMod.silver)); + 'X', LOTRMod.silver)); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.goldChain, 8), "X", "X", "X", - 'X', Items.gold_ingot)); + 'X', Items.gold_ingot)); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.ironChain, 8), "X", "X", "X", - 'X', Items.iron_ingot)); + 'X', Items.iron_ingot)); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.bronzeChain, 8), "X", "X", "X", - 'X', LOTRMod.bronze)); + 'X', LOTRMod.bronze)); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.cindercobble, 4, 0), "XX", "XX", - 'X', LOTRMod.cobblebrick)); + 'X', LOTRMod.cobblebrick)); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.cutDrystone, 4), "XX", "XX", - 'X', new ItemStack(CinderLoE.cindercobble, 1, 0))); + 'X', new ItemStack(CinderLoE.cindercobble, 1, 0))); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(LOTRMod.cobblebrick, 4, 0), "XX", "XX", - 'X', CinderLoE.cutDrystone)); + 'X', CinderLoE.cutDrystone)); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.reeflessCoral, 1), "X", - 'X', LOTRMod.coralReef)); + 'X', LOTRMod.coralReef)); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.plaster, 4), "XYX", "YXY", "XYX", - 'X', Items.paper, 'Y', Blocks.clay)); + 'X', Items.paper, 'Y', Blocks.clay)); // Cinder Stony Blocks GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.cindercobble, 4, 1), "XY", "YX", - 'X', new ItemStack(LOTRMod.rock, 1, 0), 'Y', LOTRMod.mordorGravel)); + 'X', new ItemStack(LOTRMod.rock, 1, 0), 'Y', LOTRMod.mordorGravel)); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(LOTRMod.banner, 1, 44), " Y ", " X ", " Z ", - 'X', "stickWood", 'Y', new ItemStack(Blocks.wool, 1, 14), 'Z', "plankWood")); + 'X', "stickWood", 'Y', new ItemStack(Blocks.wool, 1, 14), 'Z', "plankWood")); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(LOTRMod.banner, 1, 45), " Y ", " X ", " Z ", - 'X', "stickWood", 'Y', new ItemStack(Blocks.wool, 1, 11), 'Z', "plankWood")); + 'X', "stickWood", 'Y', new ItemStack(Blocks.wool, 1, 11), 'Z', "plankWood")); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(LOTRMod.banner, 1, 46), " Y ", " X ", " Z ", - 'X', "stickWood", 'Y', new ItemStack(Blocks.wool, 1, 13), 'Z', "plankWood")); + 'X', "stickWood", 'Y', new ItemStack(Blocks.wool, 1, 13), 'Z', "plankWood")); // Furs and then carpets GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.cinderfur, 2, 0), "XX", "XX", - 'X', new ItemStack(LOTRMod.fur, 1))); + 'X', new ItemStack(LOTRMod.fur, 1))); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.furCarpet, 3, 0), "XX", - 'X', new ItemStack(CinderLoE.cinderfur, 1, 0))); + 'X', new ItemStack(CinderLoE.cinderfur, 1, 0))); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.cinderfur, 2, 1), "XX", "XX", - 'X', new ItemStack(CinderLoE.cinderFurItem, 1, 0))); + 'X', new ItemStack(CinderLoE.cinderFurItem, 1, 0))); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.furCarpet, 3, 1), "XX", - 'X', new ItemStack(CinderLoE.cinderfur, 1, 1))); + 'X', new ItemStack(CinderLoE.cinderfur, 1, 1))); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.cinderfur, 2, 2), "XX", "XX", - 'X', new ItemStack(CinderLoE.cinderFurItem, 1, 1))); + 'X', new ItemStack(CinderLoE.cinderFurItem, 1, 1))); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.furCarpet, 3, 2), "XX", - 'X', new ItemStack(CinderLoE.cinderfur, 1, 2))); + 'X', new ItemStack(CinderLoE.cinderfur, 1, 2))); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.cinderfur, 2, 3), "XX", "XX", - 'X', new ItemStack(CinderLoE.cinderFurItem, 1, 2))); + 'X', new ItemStack(CinderLoE.cinderFurItem, 1, 2))); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.furCarpet, 3, 3), "XX", - 'X', new ItemStack(CinderLoE.cinderfur, 1, 3))); + 'X', new ItemStack(CinderLoE.cinderfur, 1, 3))); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.cinderfur, 2, 4), "XX", "XX", - 'X', new ItemStack(CinderLoE.cinderFurItem, 1, 3))); + 'X', new ItemStack(CinderLoE.cinderFurItem, 1, 3))); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.furCarpet, 3, 4), "XX", - 'X', new ItemStack(CinderLoE.cinderfur, 1, 4))); + 'X', new ItemStack(CinderLoE.cinderfur, 1, 4))); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.cinderfur, 2, 5), "XX", "XX", - 'X', new ItemStack(CinderLoE.cinderFurItem, 1, 4))); + 'X', new ItemStack(CinderLoE.cinderFurItem, 1, 4))); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.furCarpet, 3, 5), "XX", - 'X', new ItemStack(CinderLoE.cinderfur, 1, 5))); + 'X', new ItemStack(CinderLoE.cinderfur, 1, 5))); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.cinderfur, 2, 6), "XX", "XX", - 'X', new ItemStack(CinderLoE.cinderFurItem, 1, 5))); + 'X', new ItemStack(CinderLoE.cinderFurItem, 1, 5))); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.furCarpet, 3, 6), "XX", - 'X', new ItemStack(CinderLoE.cinderfur, 1, 6))); + 'X', new ItemStack(CinderLoE.cinderfur, 1, 6))); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.cinderfur, 2, 7), "XX", "XX", - 'X', new ItemStack(LOTRMod.lionFur, 1))); + 'X', new ItemStack(LOTRMod.lionFur, 1))); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.furCarpet, 3, 7), "XX", - 'X', new ItemStack(CinderLoE.cinderfur, 1, 7))); + 'X', new ItemStack(CinderLoE.cinderfur, 1, 7))); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.cinderfur, 2, 8), "XX", "XX", - 'X', new ItemStack(CinderLoE.cinderFurItem, 1, 6))); + 'X', new ItemStack(CinderLoE.cinderFurItem, 1, 6))); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.furCarpet, 3, 8), "XX", - 'X', new ItemStack(CinderLoE.cinderfur, 1, 8))); + 'X', new ItemStack(CinderLoE.cinderfur, 1, 8))); } public static void registerRedDwarvenRecipes() { LOTRRecipes.dwarvenRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.helmetRedDwarf), "XXX", "X X", - Character.valueOf('X'), CinderLoE.redDwarfSteel)); + Character.valueOf('X'), CinderLoE.redDwarfSteel)); LOTRRecipes.dwarvenRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.bodyRedDwarf), "X X", "XXX", "XXX", - Character.valueOf('X'), CinderLoE.redDwarfSteel)); + Character.valueOf('X'), CinderLoE.redDwarfSteel)); LOTRRecipes.dwarvenRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.legsRedDwarf), "XXX", "X X", "X X", - Character.valueOf('X'), CinderLoE.redDwarfSteel)); + Character.valueOf('X'), CinderLoE.redDwarfSteel)); LOTRRecipes.dwarvenRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.bootsRedDwarf), "X X", "X X", - Character.valueOf('X'), CinderLoE.redDwarfSteel)); + Character.valueOf('X'), CinderLoE.redDwarfSteel)); LOTRRecipes.dwarvenRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.spearRedDwarf), " X", " Y ", "Y ", - Character.valueOf('X'), CinderLoE.redDwarfSteel, Character.valueOf('Y'), "stickWood")); + Character.valueOf('X'), CinderLoE.redDwarfSteel, Character.valueOf('Y'), "stickWood")); LOTRRecipes.dwarvenRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.swordRedDwarf), " X ", " X ", " Y ", - Character.valueOf('X'), CinderLoE.redDwarfSteel, Character.valueOf('Y'), "stickWood")); + Character.valueOf('X'), CinderLoE.redDwarfSteel, Character.valueOf('Y'), "stickWood")); LOTRRecipes.dwarvenRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.battleaxeRedDwarf), "XXX", "XYX", " Y ", - Character.valueOf('X'), CinderLoE.redDwarfSteel, Character.valueOf('Y'), "stickWood")); + Character.valueOf('X'), CinderLoE.redDwarfSteel, Character.valueOf('Y'), "stickWood")); LOTRRecipes.dwarvenRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.pikeRedDwarf), " X", " YX", "Y ", - Character.valueOf('X'), CinderLoE.redDwarfSteel, Character.valueOf('Y'), "stickWood")); + Character.valueOf('X'), CinderLoE.redDwarfSteel, Character.valueOf('Y'), "stickWood")); LOTRRecipes.dwarvenRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.hammerRedDwarf), "XYX", "XYX", " Y ", - Character.valueOf('X'), CinderLoE.redDwarfSteel, Character.valueOf('Y'), "stickWood")); + Character.valueOf('X'), CinderLoE.redDwarfSteel, Character.valueOf('Y'), "stickWood")); LOTRRecipes.dwarvenRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.daggerRedDwarf), "X ", "Y ", - Character.valueOf('X'), CinderLoE.redDwarfSteel, Character.valueOf('Y'), "stickWood")); + Character.valueOf('X'), CinderLoE.redDwarfSteel, Character.valueOf('Y'), "stickWood")); LOTRRecipes.dwarvenRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.crossbowRedDwarf), "XXY", "ZYX", "YZX", - Character.valueOf('X'), CinderLoE.redDwarfSteel, Character.valueOf('Y'), "stickWood", Character.valueOf('Z'), "string")); + Character.valueOf('X'), CinderLoE.redDwarfSteel, Character.valueOf('Y'), "stickWood", Character.valueOf('Z'), "string")); LOTRRecipes.dwarvenRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.boarArmorRedDwarf), "X ", "XYX", "XXX", - Character.valueOf('X'), CinderLoE.redDwarfSteel, Character.valueOf('Y'), "leather")); + Character.valueOf('X'), CinderLoE.redDwarfSteel, Character.valueOf('Y'), "leather")); LOTRRecipes.dwarvenRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.blockRedDwarfSteel), "XXX", "XXX", "XXX", - Character.valueOf('X'), CinderLoE.redDwarfSteel)); + Character.valueOf('X'), CinderLoE.redDwarfSteel)); LOTRRecipes.dwarvenRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.redDwarfSteel), "X ", " ", - Character.valueOf('X'), CinderLoE.redDwarfSteel)); + Character.valueOf('X'), CinderLoE.redDwarfSteel)); LOTRRecipes.dwarvenRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.chandelierRedDwarf, 2), " X ", "ZYZ", " ", - Character.valueOf('X'), "stickWood", Character.valueOf('Y'), CinderLoE.redDwarfSteel, Character.valueOf('Z'), Blocks.torch)); + Character.valueOf('X'), "stickWood", Character.valueOf('Y'), CinderLoE.redDwarfSteel, Character.valueOf('Z'), Blocks.torch)); LOTRRecipes.dwarvenRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.barsRedDwarf, 16), "XXX", "XXX", " ", - Character.valueOf('X'), CinderLoE.redDwarfSteel)); + Character.valueOf('X'), CinderLoE.redDwarfSteel)); LOTRRecipes.dwarvenRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.dwarvenBrickRuned, 4), " X ", "XYX", " X ", - Character.valueOf('X'), new ItemStack(LOTRMod.brick, 1, 6), Character.valueOf('Y'), Items.gold_nugget)); + Character.valueOf('X'), new ItemStack(LOTRMod.brick, 1, 6), Character.valueOf('Y'), Items.gold_nugget)); GameRegistry.addShapelessRecipe(new ItemStack(CinderLoE.redDwarfSteel, 9), new ItemStack(CinderLoE.blockRedDwarfSteel)); GameRegistry.addRecipe(new ItemStack(CinderLoE.blockRedDwarfSteel, 1), "XXX", "XXX", "XXX", - Character.valueOf('X'), CinderLoE.redDwarfSteel); + Character.valueOf('X'), CinderLoE.redDwarfSteel); LOTRRecipes.dwarvenRecipes.add(new ShapedOreRecipe(new ItemStack(LOTRMod.banner, 1, 42), " YR", " X ", " Z ", - Character.valueOf('X'), "stickWood", Character.valueOf('Y'), Blocks.wool, Character.valueOf('Z'), "plankWood", Character.valueOf('R'), "dyeRed")); + Character.valueOf('X'), "stickWood", Character.valueOf('Y'), Blocks.wool, Character.valueOf('Z'), "plankWood", Character.valueOf('R'), "dyeRed")); GameRegistry.addRecipe(new LOTRRecipePoisonWeapon(CinderLoE.daggerRedDwarf, CinderLoE.daggerRedDwarfPoisoned)); } @@ -300,87 +291,96 @@ public class recipes { OreDictionary.registerOre("bone", LOTRMod.wargBone); LOTRRecipes.moredainRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.helmetLimwaith), "XXX", "Y Y", - Character.valueOf('X'), LOTRMod.driedReeds, Character.valueOf('Y'), new ItemStack(LOTRMod.planks, 1, 15))); + Character.valueOf('X'), LOTRMod.driedReeds, Character.valueOf('Y'), new ItemStack(LOTRMod.planks, 1, 15))); LOTRRecipes.moredainRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.bodyLimwaith), "X X", "YYY", "XXX", - Character.valueOf('X'), LOTRMod.driedReeds, Character.valueOf('Y'), new ItemStack(LOTRMod.planks, 1, 15))); + Character.valueOf('X'), LOTRMod.driedReeds, Character.valueOf('Y'), new ItemStack(LOTRMod.planks, 1, 15))); LOTRRecipes.moredainRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.legsLimwaith), "XXX", "Y Y", "X X", - Character.valueOf('X'), LOTRMod.driedReeds, Character.valueOf('Y'), new ItemStack(LOTRMod.planks, 1, 15))); + Character.valueOf('X'), LOTRMod.driedReeds, Character.valueOf('Y'), new ItemStack(LOTRMod.planks, 1, 15))); LOTRRecipes.moredainRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.bootsLimwaith), "Y Y", "X X", - Character.valueOf('X'), LOTRMod.driedReeds, Character.valueOf('Y'), new ItemStack(LOTRMod.planks, 1, 15))); + Character.valueOf('X'), LOTRMod.driedReeds, Character.valueOf('Y'), new ItemStack(LOTRMod.planks, 1, 15))); LOTRRecipes.moredainRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.spearLimwaith), " X", " Y ", "Y ", - Character.valueOf('X'), "bone", Character.valueOf('Y'), "stickWood")); + Character.valueOf('X'), "bone", Character.valueOf('Y'), "stickWood")); LOTRRecipes.moredainRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.truncheonLimwaith), " X ", " X ", " Y ", - Character.valueOf('X'), "bone", Character.valueOf('Y'), "stickWood")); + Character.valueOf('X'), "bone", Character.valueOf('Y'), "stickWood")); LOTRRecipes.moredainRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.battleaxeLimwaith), "XXX", "XYX", " Y ", - Character.valueOf('X'), "bone", Character.valueOf('Y'), "stickWood")); + Character.valueOf('X'), "bone", Character.valueOf('Y'), "stickWood")); LOTRRecipes.moredainRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.tridentLimwaith), " XX", " YX", "Y ", - Character.valueOf('X'), "bone", Character.valueOf('Y'), "stickWood")); + Character.valueOf('X'), "bone", Character.valueOf('Y'), "stickWood")); LOTRRecipes.moredainRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.daggerLimwaith), "X ", "Y ", - Character.valueOf('X'), "bone", Character.valueOf('Y'), "stickWood")); + Character.valueOf('X'), "bone", Character.valueOf('Y'), "stickWood")); LOTRRecipes.moredainRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.blowgunLimwaith), "YXX", " ", " ", - Character.valueOf('X'), LOTRMod.reeds, Character.valueOf('Y'), "stickWood")); + Character.valueOf('X'), LOTRMod.reeds, Character.valueOf('Y'), "stickWood")); GameRegistry.addRecipe(new LOTRRecipePoisonWeapon(CinderLoE.daggerLimwaith, CinderLoE.daggerLimwaithPoisoned)); LOTRRecipes.moredainRecipes.add(new ShapelessOreRecipe(new ItemStack(CinderLoE.bonemold), "bone", new ItemStack(Items.dye, 1, 15), new ItemStack(Items.dye, 1, 15))); LOTRRecipes.moredainRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.helmetboneLimwaith), "XXX", "Y Y", - Character.valueOf('X'), "bone", Character.valueOf('Y'), CinderLoE.bonemold)); + Character.valueOf('X'), "bone", Character.valueOf('Y'), CinderLoE.bonemold)); LOTRRecipes.moredainRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.bodyboneLimwaith), "X X", "YYY", "XXX", - Character.valueOf('X'), "bone", Character.valueOf('Y'), CinderLoE.bonemold)); + Character.valueOf('X'), "bone", Character.valueOf('Y'), CinderLoE.bonemold)); LOTRRecipes.moredainRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.legsboneLimwaith), "XXX", "Y Y", "X X", - Character.valueOf('X'), "bone", Character.valueOf('Y'), CinderLoE.bonemold)); + Character.valueOf('X'), "bone", Character.valueOf('Y'), CinderLoE.bonemold)); LOTRRecipes.moredainRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.bootsboneLimwaith), "Y Y", "X X", - Character.valueOf('X'), "bone", Character.valueOf('Y'), CinderLoE.bonemold)); + Character.valueOf('X'), "bone", Character.valueOf('Y'), CinderLoE.bonemold)); LOTRRecipes.moredainRecipes.add(new ShapedOreRecipe(new ItemStack(LOTRMod.banner, 1, 43), " YR", " X ", " Z ", - Character.valueOf('X'), "stickWood", Character.valueOf('Y'), Blocks.wool, Character.valueOf('Z'), "plankWood", Character.valueOf('R'), LOTRMod.reeds)); + Character.valueOf('X'), "stickWood", Character.valueOf('Y'), Blocks.wool, Character.valueOf('Z'), "plankWood", Character.valueOf('R'), LOTRMod.reeds)); } public static void registerBreeRecipes() { LOTRRecipes.breeRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.helmetBreeKettle), "XYX", - Character.valueOf('X'), Items.iron_ingot, Character.valueOf('Y'), CinderLoE.helmetBree)); + Character.valueOf('X'), Items.iron_ingot, Character.valueOf('Y'), CinderLoE.helmetBree)); LOTRRecipes.breeRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.helmetBree), "XXX", "X X", - Character.valueOf('X'), Items.iron_ingot)); + Character.valueOf('X'), Items.iron_ingot)); LOTRRecipes.breeRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.bodyBree), "X X", "XXX", "XXX", - Character.valueOf('X'), Items.iron_ingot)); + Character.valueOf('X'), Items.iron_ingot)); LOTRRecipes.breeRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.legsBree), "XXX", "X X", "X X", - Character.valueOf('X'), Items.iron_ingot)); + Character.valueOf('X'), Items.iron_ingot)); LOTRRecipes.breeRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.bootsBree), "X X", "X X", - Character.valueOf('X'), Items.iron_ingot)); + Character.valueOf('X'), Items.iron_ingot)); LOTRRecipes.breeRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.swordBree), " X ", " X ", " Y ", - Character.valueOf('X'), Items.iron_ingot, Character.valueOf('Y'), "stickWood")); + Character.valueOf('X'), Items.iron_ingot, Character.valueOf('Y'), "stickWood")); } public static void registerAngmarRecipes() { LOTRRecipes.angmarRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.helmetRhudaur), "XXX", "X X", - Character.valueOf('X'), Items.iron_ingot)); + Character.valueOf('X'), Items.iron_ingot)); LOTRRecipes.angmarRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.bodyRhudaur), "X X", "XXX", "XXX", - Character.valueOf('X'), Items.iron_ingot)); + Character.valueOf('X'), Items.iron_ingot)); LOTRRecipes.angmarRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.legsRhudaur), "XXX", "X X", "X X", - Character.valueOf('X'), Items.iron_ingot)); + 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)); + Character.valueOf('X'), Items.iron_ingot)); } public static void registerArnorRecipes() { LOTRRecipes.rangerRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.helmetArnorBanner), "YYY", "Y Y", - Character.valueOf('X'), Items.iron_ingot, Character.valueOf('Y'), Items.leather)); + Character.valueOf('X'), Items.iron_ingot, Character.valueOf('Y'), Items.leather)); LOTRRecipes.rangerRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.bodyArnorBanner), "Y Y", "XXX", "YYY", - Character.valueOf('X'), Items.iron_ingot, Character.valueOf('Y'), Items.leather)); + Character.valueOf('X'), Items.iron_ingot, Character.valueOf('Y'), Items.leather)); LOTRRecipes.rangerRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.legsArnorBanner), "YYY", "X X", "Y Y", - Character.valueOf('X'), Items.iron_ingot, Character.valueOf('Y'), Items.leather)); + Character.valueOf('X'), Items.iron_ingot, Character.valueOf('Y'), Items.leather)); LOTRRecipes.rangerRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.bootsArnorBanner), "X X", "X X", - Character.valueOf('X'), Items.iron_ingot, Character.valueOf('Y'), Items.leather)); + Character.valueOf('X'), Items.iron_ingot, Character.valueOf('Y'), Items.leather)); LOTRRecipes.rangerRecipes.add(new ShapedOreRecipe(new ItemStack(CinderLoE.maceArnor), " XX", " XX", "Y ", - Character.valueOf('X'), Items.iron_ingot, Character.valueOf('Y'), "stickWood")); + Character.valueOf('X'), Items.iron_ingot, Character.valueOf('Y'), "stickWood")); } public static void registerBrewingRecipes() { System.out.println("[CinderLoE] Registering Brewing recipes... We like to drink! jk I hate alcohol"); - CinderBrewingRecipes.addCustomBrewingRecipe(new ItemStack(LOTRMod.mugTauredainCocoa, BARREL_CAPACITY), - new ItemStack(Items.dye, 1, 3), - new ItemStack(Items.dye, 1, 3), - new ItemStack(Items.dye, 1, 3), - new ItemStack(LOTRMod.doubleFlower, 1, 2), - new ItemStack(LOTRMod.doubleFlower, 1, 3), - new ItemStack(LOTRMod.mugMilk)); + CinderBrewingRecipes.addCustomBrewingRecipe(new ItemStack(LOTRMod.mugTauredainCocoa, BARREL_CAPACITY), + new ItemStack(Items.dye, 1, 3), + new ItemStack(Items.dye, 1, 3), + new ItemStack(Items.dye, 1, 3), + new ItemStack(LOTRMod.doubleFlower, 1, 2), + new ItemStack(LOTRMod.doubleFlower, 1, 3), + new ItemStack(LOTRMod.mugMilk)); + + MixinLOTRBrewingRecipes.addRecipe(new ItemStack(CinderLoE.mugDemonicHealthPotion, 2), + new Object[] { CinderLoE.demonbloodVial, + new ItemStack(LOTRMod.tallGrass, 1, 4), + new ItemStack(LOTRMod.tallGrass, 1, 4), + new ItemStack(LOTRMod.tallGrass, 1, 4), + new ItemStack(CinderLoE.chocolatebar), + new ItemStack(CinderLoE.chocolatebar), + }); } public static void registerMillstoneRecipes() { diff --git a/src/main/java/com/zivilon/cinder_loe/tileentity/TileEntityForgingStation.java b/src/main/java/com/zivilon/cinder_loe/tileentity/TileEntityForgingStation.java new file mode 100644 index 0000000..c7313c5 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/tileentity/TileEntityForgingStation.java @@ -0,0 +1,127 @@ +package com.zivilon.cinder_loe.tileentity; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.util.AxisAlignedBB; + +public class TileEntityForgingStation extends TileEntity { + + public ItemStack leftItem; + public ItemStack middleItem; + public ItemStack rightItem; + + @Override + public AxisAlignedBB getRenderBoundingBox() { + return AxisAlignedBB.getBoundingBox( + xCoord - 1, yCoord, zCoord - 1, + xCoord + 2, yCoord + 1, zCoord + 2 + ); + } + + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound tag = new NBTTagCompound(); + writeToNBT(tag); + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 1, tag); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + readFromNBT(pkt.func_148857_g()); + } + + + // Getters and Setters for the items + public ItemStack getLeftItem() { + return leftItem; + } + + public void setLeftItem(ItemStack leftItem) { + this.leftItem = leftItem; + markDirty(); // Mark the tile entity as dirty to ensure the world saves the changes + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + + public ItemStack getMiddleItem() { + return middleItem; + } + + public void setMiddleItem(ItemStack middleItem) { + this.middleItem = middleItem; + markDirty(); // Mark the tile entity as dirty to ensure the world saves the changes + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + + public ItemStack getRightItem() { + return rightItem; + } + + public void setRightItem(ItemStack rightItem) { + this.rightItem = rightItem; + markDirty(); // Mark the tile entity as dirty to ensure the world saves the changes + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + + // Method to write data to NBT + @Override + public void writeToNBT(NBTTagCompound compound) { + super.writeToNBT(compound); + + if (leftItem != null) { + NBTTagCompound leftTag = new NBTTagCompound(); + leftItem.writeToNBT(leftTag); + compound.setTag("LeftItem", leftTag); + } else { + compound.removeTag("LeftItem"); + } + + if (middleItem != null) { + NBTTagCompound middleTag = new NBTTagCompound(); + middleItem.writeToNBT(middleTag); + compound.setTag("MiddleItem", middleTag); + } else { + compound.removeTag("MiddleItem"); + } + + if (rightItem != null) { + NBTTagCompound rightTag = new NBTTagCompound(); + rightItem.writeToNBT(rightTag); + compound.setTag("RightItem", rightTag); + } else { + compound.removeTag("RightItem"); + } + } + + + // Method to read data from NBT + @Override + public void readFromNBT(NBTTagCompound compound) { + super.readFromNBT(compound); + + if (compound.hasKey("LeftItem")) { + NBTTagCompound leftTag = compound.getCompoundTag("LeftItem"); + leftItem = ItemStack.loadItemStackFromNBT(leftTag); + } else { + leftItem = null; + } + + if (compound.hasKey("MiddleItem")) { + NBTTagCompound middleTag = compound.getCompoundTag("MiddleItem"); + middleItem = ItemStack.loadItemStackFromNBT(middleTag); + } else { + middleItem = null; + } + + if (compound.hasKey("RightItem")) { + NBTTagCompound rightTag = compound.getCompoundTag("RightItem"); + rightItem = ItemStack.loadItemStackFromNBT(rightTag); + } else { + rightItem = null; + } + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/tileentity/TileEntityShadowTile.java b/src/main/java/com/zivilon/cinder_loe/tileentity/TileEntityShadowTile.java new file mode 100644 index 0000000..c66a0b2 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/tileentity/TileEntityShadowTile.java @@ -0,0 +1,37 @@ +package com.zivilon.cinder_loe.tileentity; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; + +public class TileEntityShadowTile extends TileEntity { + public long spawnTime; + public static long REMOVAL_DELAY_MS = 15000; + + @Override + public void updateEntity() { + if (!worldObj.isRemote) { + if (spawnTime == 0) { + spawnTime = System.currentTimeMillis(); + } + + long currentTime = System.currentTimeMillis(); + if (currentTime >= spawnTime + REMOVAL_DELAY_MS) { + worldObj.setBlockToAir(xCoord, yCoord, zCoord); + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); // Force the client to update + worldObj.removeTileEntity(xCoord, yCoord, zCoord); // Clean up the tile entity + } + } + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setLong("spawnTime", spawnTime); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + spawnTime = nbt.getLong("spawnTime"); + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/util/DurableItemCrafter.java b/src/main/java/com/zivilon/cinder_loe/util/DurableItemCrafter.java index e91aedb..b231fef 100644 --- a/src/main/java/com/zivilon/cinder_loe/util/DurableItemCrafter.java +++ b/src/main/java/com/zivilon/cinder_loe/util/DurableItemCrafter.java @@ -14,6 +14,8 @@ public class DurableItemCrafter { static { customItems.add(LOTRMod.rollingPin); customItems.add(LOTRMod.chisel); - customItems.add(CinderLoE.cleaver); + customItems.add(CinderLoE.toxicCore); + + exceptionItems.add(LOTRMod.ithildin); } } diff --git a/src/main/java/com/zivilon/cinder_loe/util/LOTREnchantmentExclusions.java b/src/main/java/com/zivilon/cinder_loe/util/LOTREnchantmentExclusions.java index 7c811cf..dcf9277 100644 --- a/src/main/java/com/zivilon/cinder_loe/util/LOTREnchantmentExclusions.java +++ b/src/main/java/com/zivilon/cinder_loe/util/LOTREnchantmentExclusions.java @@ -10,5 +10,6 @@ import com.zivilon.cinder_loe.CinderLoE; public class LOTREnchantmentExclusions { public static List exclusions = new ArrayList<>(); static { + exclusions.add(CinderLoE.celeiniss); } } diff --git a/src/main/java/com/zivilon/cinder_loe/util/Utilities.java b/src/main/java/com/zivilon/cinder_loe/util/Utilities.java index b64a548..9e7fe34 100644 --- a/src/main/java/com/zivilon/cinder_loe/util/Utilities.java +++ b/src/main/java/com/zivilon/cinder_loe/util/Utilities.java @@ -200,6 +200,38 @@ public class Utilities { return LOTREnchantmentHelper.hasEnchant(held_item, LOTREnchantment.fire); } + public static int[] countNexArmor(String player_name) { + EntityPlayer player = getPlayerByName(player_name); + int[] nexPieces = new int[4]; + + if (player == null) { + System.out.println("[CinderLoE] Warning! Player not found: " + player_name); + return nexPieces; + } + + for (ItemStack armor : player.inventory.armorInventory) { + if (armor != null && armor.getItem() instanceof LOTRItemArmor) { + LOTRItemArmor itemArmor = (LOTRItemArmor) armor.getItem(); + if (itemArmor.getLOTRArmorMaterial() == CinderLoE.MATERIAL_NEX_ICE) { + nexPieces[0]++; + } else if (itemArmor.getLOTRArmorMaterial() == CinderLoE.MATERIAL_NEX_FIRE) { + nexPieces[1]++; + } else if (itemArmor.getLOTRArmorMaterial() == CinderLoE.MATERIAL_NEX_SHADOW) { + nexPieces[2]++; + } else if (itemArmor.getLOTRArmorMaterial() == CinderLoE.MATERIAL_NEX_TOXIN) { + nexPieces[3]++; + } + } + } + + if (nexPieces[0] == 4) nexPieces[0] = 5; + if (nexPieces[1] == 4) nexPieces[1] = 5; + if (nexPieces[2] == 4) nexPieces[2] = 5; + if (nexPieces[3] == 4) nexPieces[3] = 5; + + return nexPieces; + } + public static double calculate_melee_damage_on_entity(EntityLivingBase target, EntityLivingBase attacker) { if (attacker == null) return 0.0D; if (attacker.getEntityAttribute(SharedMonsterAttributes.attackDamage) == null) return 0.0D; diff --git a/src/main/java/com/zivilon/cinder_loe/util/VT_additions.java b/src/main/java/com/zivilon/cinder_loe/util/VT_additions.java index cc34e81..1e1143b 100644 --- a/src/main/java/com/zivilon/cinder_loe/util/VT_additions.java +++ b/src/main/java/com/zivilon/cinder_loe/util/VT_additions.java @@ -1,9 +1,11 @@ package com.zivilon.cinder_loe.util; +import com.zivilon.cinder_loe.entity.npc.frozen_dungeon.Nex; + public class VT_additions { public static String applyCustomPlaceholders(String scriptLine) { -/* scriptLine = scriptLine.replace("", String.valueOf(Nex.get_nex_phase())); - scriptLine = scriptLine.replace("", String.valueOf(Nex.get_nex_health()));*/ + scriptLine = scriptLine.replace("", String.valueOf(Nex.get_nex_phase())); + scriptLine = scriptLine.replace("", String.valueOf(Nex.get_nex_health())); return scriptLine; } } diff --git a/src/main/resources/assets/lotr/textures/blocks/nex_ice_crystal.png b/src/main/resources/assets/lotr/textures/blocks/nex_ice_crystal.png deleted file mode 100644 index 571d58d1ffdc69f665195bac49ed2c942b69a297..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6683 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 diff --git a/src/main/resources/assets/lotr/textures/items/aulendur_hammer.png b/src/main/resources/assets/lotr/textures/items/aulendur_hammer.png new file mode 100644 index 0000000000000000000000000000000000000000..fcaff5ea6074d4f3b2de11c7a766e2f1408bd15d GIT binary patch literal 4475 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 U7EXWsLT&(Yc(kZ#)y9&)0UO7OLI3~& literal 6530 zcmeHKeRLC57N0b2lBO+C8nCSu(i9~{lgvyeA2T*^N|Mqbg{D*r9P}_rChb6*q)AHB z9#AMyByd!|w6IkmqCoj@D!???iIWWZDWKF(57D#eu;s#NR2AH@j@)l(=gMR5v4DNGCV^ETXw z2wah57X;CWhoWM^^5(q`f;uJ90Gld(X>zU-`?ce?8do=HEIGz4i9{9~}GeqrV?Naq`p`r@#E_%-M5apTGF8 zOWl{RT)lSvdyW^!Gv1=i{)1OK@JdKbh*Ni83WcIy^n@`SlFQG6 zp2%3ul2ATe4w2L4;a!G7FoN8I@LM5r;}L2UM6&kRL=um(`&D`P&)WNe(UZdp&5{cG z%bXn&>$GPdgP4$86yDc%^_V7Rg>fd*(yCuG(_&q0(9aQta?t$xw5&6o;8)qLlu>Q@~ zh0AvB9I&%ddX4|ZH=l1hC%gO8rzO)nf~PKyKJwbx?>?P3ziSJ6`24yg;uGx$Z!Ky* zyd$)+Vo~~jWNhZDwamMgGVvRi>n6Qk9;kixtIw`hUT&>l#^bFBK9%)C$-csZ*V#K; zt}cCU`-p8FXFE>c^U#ymR$K^mx?7ehQwr3xobO-iu-e*=9~dv(wQ_6vr1Z}6lFf5- zFSNZ~ziii(t!*C}uBYVH&tukJ*xj_EL-v%ka8YCS+gtV*waj@&lEPAxu3cL)qur!j zJcB{K_iYfTy>vm?v+%QBd&H|U9xfZf^SA4dbczO@Oj=jhd42SpmNUtN<_dOpzubNj zagMgUxOdO-^sc>WGiL17Fauxtm?v1DdSdlM`Na>&CG)SUzkea8>(P|%?e)Id&z$b& z9qQU%rrUoY7oEQ8o4WOZCHJ4b;+{17kufuCz3ZQkT zlMdOK(c*$21pqaSpOyw|s$D)RXplv4DbTrYl}s8j@y|BMro#7{(d}iVgpyFA3UiR1 zgUd#Xr3GGxlPWV6#US9xAgl8GJ(Nln2n3V?wbJdaRAD4Zs!&{o;|j1)`08DLI;e2@ z@;HbnhKcdny{yO2x?NHZleW3*{05l}#-;K2YCI(+z3?tyEDMkiRgm_mFeR$0sZsUy z@cGSi03;UBPkQ*u>phIBjPbeaymrPshjIDy`a(GDz5bp$Z*_!@!>(egnHn(l!K~O# zQ*vLny&hZ&D%l!O#0!#rlck?^-bmI>v2i02I(-8H_g>tatmE7x#$Z)aLYdt5Ixakm z$sptAryOoO>!2d4T}xsZ=5Q!%7^+baq?S?W9Sox&^g5kQPwQ;7P2C5|;_~@vm!09D z09?rej*X_ZIEkYQHBDj)LZibJw1y-VG-{OB4TSLQgvNd!iqw=^aBLiH*slrl= zL53^Q8$G4fwBHF12H6DGRTsQ5P|nscll?T8O-zU58VyWE5*UtRQQ8r_DU8<#mB?X6 z&L|OgZdoWG1Bs=%It748KX9RpUWWF&z2$CqwL#WrZ)N%eXM39TS+R7Yzm6D zM=AK|IgBF`CtyW~>{Ya@l7Y8JtX$*$>`#;eN)Qg4L!(uYIy! zsv%LkCRz%;=svg8AE3QVVI|}das}lXISEST6|BqQ4*2qKjwVpWaO(gmQ=qs4)0Sg! zP}EYGMyC4x>DknTmekrv1?f;bV2coH*eq&Xfnp?7x|5)_8r{v|{%?AbI{X=Odf*qY z2QpR9h8%%nnm_rsc!A-~KqSDe&UM*uI|c*PJ@I z)wg{4>MG|8Y*;K2>(&g<Z8e0BY_OlUJNP6!?LsP+@9QjjUz W>MlI6d1VD~L@efsrk!JFHvSu~`chE< diff --git a/src/main/resources/assets/lotr/textures/items/large/aulendur_hammer.png b/src/main/resources/assets/lotr/textures/items/large/aulendur_hammer.png new file mode 100644 index 0000000000000000000000000000000000000000..aa65433413f9457deda3952eab8db1fefc067010 GIT binary patch literal 4520 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/items/large/celeiniss.png b/src/main/resources/assets/lotr/textures/items/large/celeiniss.png deleted file mode 100644 index 4401d3cd76489eca6bf3d209978925f85c75ff3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6727 zcmeHLYgiLk8lDg!BoGUjSVhzjZ(Pi6GP#zh2vI^s2n2!_tdnF0qU1snAW&^Bf>da` zrHU7didHJ3#ZpD7)?2+`-PWSD7O7RyZLw-stys0YTlP%C&E4)UxZCI19}dr%Idjf; z-tT+g^PQ79tVoaa ziLe2MG@$N5B12@*wj7i|P$z7N5=8QHJzod)(LME5pdQ*|LyQrSJRmxFR)YeAIs-iG zK{1xPeH{e#R#1Fge;yhFpCe%1wuJr1pJd~ z`Xd5EAu9AMg1ky31z$o)R_Z#kUZR&vBcP(dI^Pa&>MSq zTlW>nKW?UKCU8Uu1a95mK+%wow>QPx%ZEatP^msNKL*{;*Vk`U;P7V{V}izw9TOBB z%$mTR%wkU&9~>Mi37f(fAP6#UvP>a`Be_BZCO}A3D%H=|ZzP>Q5)KItfror`ABF;a zh?vMEHsldNA_tJVk3r)=oL(f?<)#AOJ;R$Q{Y^tBabZ?9Zcxq8jobyb_+ z-BSDB*1B!=AMV=Sv}bSgNBcfGdhGa#mXn{JI{W3hug-tncA>rF>a{<8_kHK}A8y?J z>0a0UpC3GY^b5g@;Mse*nf(K=0Km(`)06B;A$XBI@(JPro?amW@4zTE1XOw!`y-^bD=CW|l!OTd%&HOdV zVQE_$n3vV*bX^t`ME1f=vC!P1WTXW4TMcHO|1XiwXnpMTh_xvMJzG#oK`kTo%o7T~ zJLQw$qj4SccBiJ~WiMo2?NX=PHwsqf(?U1bL=8G0h}>cRkPBCq#dT!dXC6L3Y59-N z0}O3?=Vyj*KLLx>|B2F7yF_Uft*FsfsgzOKKLKyeWqD4oJY&>4StbA9)u!bVmL-N&I zSGHVdPrS5-G4GhO zpQ(~)2k+-59MI(FZ20c-gUtK&1?41Cg>&_&_u@Z}iacN(UHxFiyE`UqKh}Bd+N6xP z9#-5eYq3<9bA2O)3-Pn}j;VExZAaoLyWZXwkPy(KiQl?7s>*G7G&QgKd#e9p?}n~DhuR^0s%q!nrnZ3Az4Y|-y&~+H z=8GinjeZwaWrW2(AIezzK={jh!L6_OcI_yzFIs=Ci*&MeN0Q|5kr4j8Ew^$v=9fO# z`LiWq(aX~oI!E}x@x8uMWGR2nPNX29i1F*AE0z?*`d z<#1T#JYIf&J~v;;wb(Lw0+~$47Gg;%~`{2#?9uqI)N2g;zA&$QS~D40&83C+ZKR&%Dy2O+pTDp93i!(4uUOJX+az`+0o zd$!S>>+J8)7)@BR10~cHNMKkb63V1vsZ0VRf_|e^%w`9fNMO27POcteTI7HX5Edo! z6acu|0T+3+4MQCko5o_vRn zjCjF+vL+S}D-zg)DUUVUf&T(mlY2!aV>#|O_iMJ%wUk&a*P@W4dN&0-nui%&aRMxN zmp%(MXJTOY=t3`yUoay^x6ND2(e z_-S@Mm1{@}49WOucKy%fqV=B^F*Eqc%Liw{-JSGv;3Vm-dwy076b6YP$<9AGUIr~x zYwTP*ID8%^3Tff_6;#kjaj4>zlbYqG{5VJ^MDN{ls54yEex}ZGOMuWG5|+lf22wp zYsWT6?c`L^UtrxRyF0QwtXjQ8%PEh=4unsx**Cv3@U^dRUha4>s^+f?U(C?fHFUR= T;&Q8iN{~u9C#GS>f}+0zNb!`p diff --git a/src/main/resources/assets/lotr/textures/items/large2/celeiniss.png b/src/main/resources/assets/lotr/textures/items/large2/celeiniss.png new file mode 100644 index 0000000000000000000000000000000000000000..6a82c7eec9a0ad7b6a159828aeb8ef75dc64d697 GIT binary patch literal 4692 zcmeHKdsGu=7N3anh=8rE0%|3U?iPe(CND_Fgogwr2Ls4M9zJj~nZT61NCpyIs|d9y z+wH=tTdiW%L#1mKty+szG~%u=6cE{JJu9N3wMzk?3xc})O+bXxp0meuw*N6XGxN>& z-TS-u{=R$f$+saPZh;4T8XJNj4`qxZ5xi06c6A2N)N#*Bz^i^`avGh8TRA4PQA_Da z4qad(Ii!u!LXhpcJ|S}QX^!jh$E9JBEDzaP(T@w)H2>hesq(9?#+u0dtYZ7im0|7o z>=*51`QER8=M)qa5;WW6NTW3O2T%6-?j*lB*8XU}s@4a7FIG8!6n}W{(xQ%;_1MG< zJi$?f)PzUZ|O2Qg1!`@)&ZoZvVA4uDMkU&u@u2 z19gu=L)^iR&2|^(kkikDoIb@ zw4rIkyL2t*;jF8_Ex9TAMECDU7Z2`GHF=e6SeNJ>yX@kH+Ih058Rb(pKdO_Kkc~^W zZ+@@h>z?zOKEYoE`Bq<<5j`$82A;s0{I4%|vb`2%q$IjmQsLdV{l0n;XjXRYEi5Nk z;()jG;eCG3yT1#Fi3&4v8t-gzaOc3aLmBTD_W0H$&V8BTwPj#--Q~;h zf{5(tH8tJYEi+BWoZQ2y-Ms66{?nds(#E$n-QV`e-p*}4dGE=0ZD)UUD*L?pFUG>+ zs1?T*-*@tQx;wkOZVJ0zu7+xH^Xc$~<ur8l#%z+4LrmcMv2C zx0!Gvhom`bGK(_E;ht|#!W>E?hf~EWRAq`Hv#FSsW-@7ITr#mThmdOE@G!Q_h5-OQ zN#h)wUT3giHaYCT#lV=EMqrLZgwBz}X{rQHl+jFbL_84>n5DS10#D<#?J`Y9odSs-Ag^tb#AVUuQqJ||I zR4I~3T8w#Sf{e~54fL#$5E^1w-;`(8Il|Ep2&p6WK-2=P@<*9mpj0IcYcLdKQF@a@ z3y?iZlBTq;$r|Mwv*HM6q$5Cm7;6h0~9?v2XlOfBozz~i_CMe~wfQP=GNzmc6 z7ASxkpbQ$L)$)2NnbMO4Z}prAB3jVo}P1fZxugrQQ5FHRN+ zF;t8RBta-2Lr2IPHI%mCe@Qdt!;uYcdJJU&_6r-he(ESkF>yGKvcPa+ zFa!&pPih=~0<6I$A{#ekk)VGJCG4wt>KBqhBf$kEAwjt~DkQlgF-mgPL@2@4gz&Yf z803_gAV#BGj9S`?o5{#5z$4%aB&dTcPQcJs1&)@tW|Pc50Lr+ilsinB5QUMUU=gNc zyoy$a{EQEoLtsRU0eXXTpml*xhzz&FA-XyZ&!WCcg1WT|%*IA%GkV;3l(|1iIubyXX|jGHMY z-2y=qy_lN?eY)KTOuEoYRkX`}w@Fhc%zRFyegqEF_mqmr#h!`rBihlU_8)` ztVep&;_DHx}9g+MF9rV)If$*@r7wC1PYPnyy;O)d5>KjgHn-S^1!r59ZJwl8nY_x~)j z{yM7wF!{LM}!uy?Xx? zo_}X~@7{>4of-Z8;`gPKGWv@;Cbx&4(N7`Rtg!MRzp<6vxz1TB({Hlko9pjpo`KDCOzq?(VT=A&i`J2+@ zSm%lptL?eVYZfoRB|SKBVQ%lWGSnlu*HhsXG-qDq*)yq5@Ga|(wE>TJ!?UrFxxQs? zZI9g*TfL|Ff3LoCzVPCMlZ_ER0>6Ro%+=kJb5m6RY+I_7A8hcPo#RYqB|>FEA$V^_ zi*eg#&sLS!)QE@9*XkAr9KCbK_0l^o*5ZMLp9<=4AMPsuxOK_7&Ra#I(#~ni!s{nh xuoR_F!k@au?FgR}B;3;rlE9NpQ)*QzXbu>=f}6Qol9-%Uk@Q{tEye$6){f literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/items/large2/nimveil_ancient.png b/src/main/resources/assets/lotr/textures/items/large2/nimveil_ancient.png new file mode 100644 index 0000000000000000000000000000000000000000..5d17ad5e7df849438953b868dae058f3efc49099 GIT binary patch literal 4897 zcmeHLdsGu=79SJ=!Dj&%UDP4as>mdh$>cQ<0SQ8cXhezvb?YRVz$kf;3?xudv<08h z0@Zb01+4;mtXl0+>jM?mYE{5jeU$0~QYdIw5wuI)RoQRCLp3?tX0j48tFd49fF{difDNp_(s{cn+y0{Fyz^4@Ku!^zmSO|t+2^#)X`}a z%w(A;n6lA22(o>rSB1ZI7Iv$6vTjDWlXtOZ8&ekA_GJCc>jB^FNI$nIC35k9D&BwW zQ(044s<@d{v~sieN$*169P^xztW|&i;z{J{vtdPT*7-~BHvF{A`R7~v1Iyv8{6p`J zY`O5~WL1cKxBp?a9k#Qa%z`yMAGuyP*{@3={%d_wY`|A`>}?IF z!zDGy!udE1Ah zBi1aItILX`dAi2L_q%SyWc=ZW#QK~Sw{i=`;~PEK?v51)HH~b#P*!TGpEBx;!aZY3 zJm-#Q!keNFRCCXybBUnGH9HFwwVtkPIjC)Ui)pB)n88y9cy%-dJ(-ilmaQhGkA ztC=^V`N(GcHf{Ic_;$d@AGwVeell-m9{O;?w0Gi|NlzYclD-T$t~GD2x^O5rFg|+Y zAG9KAeg<}RqBDp92=f=Z>Mv(41}>^bq8?4=s1mJ>R|J;X);06oQ! zuuY$4un;yG$AL?LYu3!;zz!E?sf@Ewse&VnW(vl+I2T1CZFDBanc)tHn6)}0PCly_ z0^G?ssSINxcs#4s%C!o(Mso^}FO^DpD8|Du1b85pECWN@5QD{^h3LVMQx=VxHZio( z0JE5++L*z}I2^DJ_vNQIDV6>321_psfDfLHH1YUcl&9D821Zzz$V>pzo6s*tSmMEu z^5Q6qF~h8(A~Pui<3A8WtLcw7Wth_(i8Cv&>tk-g5R~+RGOaz4YhwY*x2r}fl)hGhBVi!mX_7YK2Q02hly!dFfSl-UBb$fEL5u0Y~gVH-n$asag? zt5g8su!Cxd2s1@8MsvK;m?q<}Nx^Jn|FRMcl$K;jImu7}6fjPpQUc}2V<;g67vkxt zfItWM8@049>;HMP;{%8EG(DQOfc>)^rkj$wjf$5;@grl$l8nMw6@ z9ANb0c0oTC71elz>7|39dtcoPZ8=d<+o^1gw;VLNyY+d=(67~04lKh>(TNra^6+HePSCdPKEUY8 zD3p<|ZNr_$2D|NR+By#WSJ1AIhsUSZKiqOC=8vS$>J`^=8_T$h4#$u9n{VyCouv`i zVC|Yk&6k8Ru-Emv@Ia0qF}3P`4dXIo9HyN;mT->Xx#(B#KD_0lxVX`u!LCbQ4$a!} z)`nrhPfs?_csA+Sy;JvWk6tXVXm@pU9uhvKw8pbAgu76%#^5|5{{L`vHK~dMyK7L<2zD-Lcrp(kYp;T<2? z>2E6bHJ|mUu03H$KFB*T&1bp&Wz^Z9bV z**5f4_njB>vPP7iaz7gSZV0sVKAlbY`EPd4Zm2MKCD@1U+0s@sJ#c)PVq5VKKW1P3 z`1Vu0c6wk*XFlCI{ffTz`@JP|pB;Npe*U>N`*QG6*I6z6eN(VU|2Wt+wlHU6dqo&L g2GGB<(aAKFzdcC&<>VwYPy?ihoFhLlbMdPG0uE6Nk^lez literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/items/large2/nimveil_ancient_glow.png b/src/main/resources/assets/lotr/textures/items/large2/nimveil_ancient_glow.png new file mode 100644 index 0000000000000000000000000000000000000000..e79fb8126fbc006b6972c9b0cfa3e1fd1316e248 GIT binary patch literal 5152 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/items/large2/nimveil_mortals_glow.png b/src/main/resources/assets/lotr/textures/items/large2/nimveil_mortals_glow.png new file mode 100644 index 0000000000000000000000000000000000000000..d1c63c9615b603a3042e20a7a431d75004c61013 GIT binary patch literal 4951 zcmeHLc~BE+7H?3wEI9q=_ieeZu zbQFU!DHRZ8YEVZ8jILqW9O+o)7qIZVrxWULZ0O!v$M%vGhhKMEyne3JqAjlrCQbC@ zJd2u|a`E`Fb0s@HMo)W`hd#|4raRj{w$#CWTyDa4a!+%o$?cbI^M2a2y5-@COqaE{ z5;VcxqcTIz7F}3#WldrEs9RevYIA>#x|k3@|6t(#@=1|@drj!84V4eo1z(5$;LeO6 zPV$!@-4F@SDR8MI8nu_^m& z-_V+w6HX;WZ})Nun2~2Za|!=vP|$=~E(M9-?sJ)!iX3_|vILvz$@*$V%JJiWKeaQb zU~h#(#R|q7i#xynR@Tb&=w^HF%X|6T!O2hBecPKX0=J!r**o3t`x2_`4vKD^?~=Wz zwH66>635HROGDX;OQ}n4)zn-+Y*Y7WX?q>|eT&q}B);=my?ucx$COroS@>j(b-W}h zuP%SOeHG)`l&3Mu#(4EPM+M>cB*?|uss!%=pMK$cvZf0TW!^w+KJ1G7H|%oOKgds>EboD z*0I~V`Y>-~eYB>?-|EHD8?Qp#p0-(Ds8TPR+?due{HfotxOt5UYRIsq?0Vz8RvWhl zD^^8g$r0-X?T|d8iVXd#WxJ=d-LbB5+0hPehelXkyV*3aOOOq5u3UX?uhZFtJ9}pR zeEx73p4Ig_d{_148=m^QK$ZVy2y%#30(r$t!*RJ*%_2yxjAEJ8pi$uP@i*xRc?xA@ z$fzWx#+Uiza5a;mBz>82JSig8iKt{{Xr`Wu&YT@1&rFdENv6M_osS6z0BXueFidKd z#(FKO=E=#LVVxvN#kd1KI91aXTU_*w+NSI)aVG0e=gCV92a=lV#RBAO0 z8k3M|Q;oh%CKzY*<)_w3rTy?4LoW+}54MTWu~8PnR;$?qBMio%Gyu|@&>uz^V!$e8 zM^OfCs$Nb7rBNE=lz|YWygy!-s#lrIA?0jJMX7=8Q z_8?EAQt^STLAlW*=5hum0>b-o2YL6^ZgvJ!vOSSC{lU<@NsScq^iSjOjb6+DcTp$c*Ultg1N5*j&0LjiD>65t59ToUE-xiE)B z~Vg?z9?stBV31b{W5 z)R5YA!-t_5rJ9O15;UKvH;2y`@(}?K6L=%&fcU>sdIQiRjfx^HuD~2lHwFjg0BQ+Z zsQ|!i2i4#rJw+I``WUTN<;$d#V$hNO!&0!INWw^n2_pqS0pmC##8E*Ehl67R9KmKF zD2@#9*OE#_#((psmk-0Ir|F?e1DHR z={UgZ8ImUxnj{MBAH9O@vn&5V3^H#yBB!_%j0i9V4CI6Y9iSYT$K}#e;_+lCW@e!u z-Jn$%(+NElkOX)HTmgZaxng|Q+bYk&{^`jS-3MBvh!9557}OgFWN|Sj`_q?)DG(0H z^A^AgLN0?bgoD5Wk`TfIAz#5KWh5cPxP#OE-^%--2wq=#K5TkJ>}#eE`#;*<<1kI-_zghgc@u>H^_N?aY_trMUEdypeJGc-*+<$GWS}Hk+S2Q*i%|Dgn>Hp4a z!L}K<_tz~N`(^E6C+Eej?c;6A-?p?>&pH3n6@t#!6+_Eq4=>$)Cu1*-=q~bzs*~C z`gyo^>!R4g`Dceg`#i=q6s=ysam*+ipPRmJ%JcAU3sGD$2)G$GDW!{Ygv3`zU6p}< z2cEo&sBPJ>`_}^Y^z=usLY%JfFFxD7r0va$!tMiIqDP3st8;0u>o@#4cZ%2N)s~hC z{)he&JEkPuR{GO{2vyjQB4rd_eD86_rNW4$e>iWv+_{#$VOsU`n`up#T>S3YFLW2h zwZ7Z9-Z@qTfAjvq1h=S_m4fQ_*3SvQeYV9sns#ZCO*2)$UwMDnSp(ypNj}ok?3$ovYhj6y%?D6dSA4w*Yx!=9N z@7~}2ec#E~v2uJG8H!viakWYmRJI{PmYV zx+y=3Q_+X=LqvvqF|n;bhNg^r5OZhE+G|<6q!aFq+Vtrn>70fU4ONGVZFgpl{AyQ` zd%>uP30y!!@R!xXiew=<=huq|cB*SexokR5yHroUxG-m-U#MrKcB_5E7uBv!$fXa8 zzgyngC>q{amPcG?w|Z@xK5fVPArmBjUYxxFeLT^7MkF_-<=5@<*V9hwt$CGIrCC1O zkZtd^xnVJa>(TjNETTrL-(Vv$&k01w2LZsMpk#ANg0Av!Tsj7?`{ zEgWk$!8|5Kn^QQ2Kmf+!?);3Fu&^F@ldX#dz=tS}vWPGtDl!^Hy(4T~&?*4ZmC)}- z*tB4oiXs`CImN1Df>tpm&Z{?sUe^8Vu;0Y5*fH|tnE z>G&y@iz$r2E#f{3uPK$TQd@2q$zJ%B@`3$2n;yd2!2IbBQ|Fpm!X$TIbzUa1j>QDSj%7hoy3P`8 z)GDU4;{dC3NS8pF;u)}ibP2ZG&i;-VXem$ugEI&!BMb7}ZI4>oMgvJO5 z3q9yIvw=&ctV}>W;1O^I1nS@lp4HVV@4o)22@Kx{UZkiT0hD1lk%}2YOcQd#fJ^(P`#+c0r3hJfd43{(L+oy*pXfi@-RaP4 z2L-fr+Q7~XHhNLdPT$2BXvMpHb;;~qP65OHle`tb{dD!y^;QhLm25eV2QL-e30^rqRS51Po$1hE71Y7M50sbW0?SZKNQ@1FhK=G6Cur}! z@xbW9sl$R?ei`cY2l*vx28;Re(0(&g0z`p_8cb7b<3Eha+r?CD(c2@{u;# z`Uco{wC5$E)l%b8TM=@WOBI6-&A!y)MDwJ7Lbcju1oqOOg$uc46gixq9P<%8$ludY)X?Aa@;=NF_8zL1PsZpVGKFXQXmyM}H( zh}#nO$zQxGJ)3m&d811tw#Qi+;RHQT&wW^y6|;W0;%Z)#^!(l*Gsnd)52{Ytp*DYN zFRnbsIz`!=i|fK~TPL50u3&v%PmIV>zDUZ`%*s3~)TJMqdD%L-Q3@U|{dRW!=2`Yh zTXqyE7QFn&Z>szl?#|QG#o9$rR3S^x>IdQAQ{+QMG_^rnwztWSq|~`Bn3+r*+qUtl zSM8+nFYZ3s?)~#;PwGm`V*di2x%eP~j;wq@Y7}^T`O+oW$=PJf-tgVV+&wkTDT;*Z zPk!>ONhAyGyNxZgYmH4K6lY6L7Y2W(=qS%`$$y-UF`j##eZ5xt=&mNua(Au>Fh3yM dA3ovI=G0t;P%RnIQJ@A$9TcwmGB9r4zX4Cy4{iVe literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/items/large2/nimveil_sauron_glow.png b/src/main/resources/assets/lotr/textures/items/large2/nimveil_sauron_glow.png new file mode 100644 index 0000000000000000000000000000000000000000..58eaee4b3e6fc2447ffee6be97af65121445911e GIT binary patch literal 5146 zcmeHLc~BE+7H`1eT<}Ekq=_(!ZYSMI=jtUQ5RQyQv%su?uGs1BKn8M{1PCaj3!{Q~ z;jxwsr@(Aa_NCJPI69c6W9J-?Q!8mxIHZ%$Qh96qybiO$LoNg@G*@ zMh0fAS`7qQZ|hV+!>VBC6KyM|1^xMNE#vBLZtmJv%bTKDA6Y+i!KS#OpKX1WKViH- z|9O;ea?R;e7Yg_I4g2_UF4mIkU_AeH)D{n)(MuC{&R82zcoTI@HOD3q6y&_GO=CVh+{DO$xKAhM= zv}no6%_`)N`9rU|={`NUF*U4W_}Fum(&lZvA0NkktlQKhUef_zsvy)GsUUPO& zPX3`%kJ4=TwcUfC?-w_5{JMDlhjagV|ETw~r?RJa?SjAlF6PiA*Ik87@dFI|a*k)# zfu?FSY^Xd|U9u&Dr@5TEsG+K={v%EiUkCpgTViJ9*cyfr`cjB9z zy>2^lOYan(aGLuRqGpxT5vv<__>XWs)iF9N+QaMEM~*kXzZ>5n$%6RTuD7}yjn0uH z{1;YSJl;Vp?06Nqx6=Ejzo|AjCGaZ<8jNd!zG9V;1ZB{1N!p-hxK^DJ2oHh+0<;1mT_ham8jAf!X#-UGEGc$=FAu>GntaooWNxhN89)u!<|(_G;I6RjbljMCY4HgD4)mYBftYOXXq`Y715g~vJl-Ea>h)Vv_^~8 zpodvZQf)}J$T%D@4)^A#Gb)vR@OpC(3xE%vl{E4&F3QvCc>N>Hme4c+(v#4yMwnwj zoAROUy`*7d!?ycSC47`*|LT;c^+4K~08Hb&ppbeCkCTypC zDWAk}ffP}zH4+5JX$+B~d>m1WL;{Tvr`4E-?gypNn=PcCVpu2u&eZ}OoT0=RLkbX5 zgpvr3@)?B0DKWy}8opXelN2At`$5byX@M%ql>S+;r8TE;_0hVwgNTrZ*_+0d@MU_HYG#~)< zfL2c%(#>y&VzfFY+Cs8?Vq(5XBo#_f48w5|CVcDkC&pw3T4Yf%lq-3ut~veWZ$q7G!#u*NI7X?04QLbK&1pGiQ)4JTtHyb zsVGLE{rnBIR+I7HyxI1F1G*PILTd)|XV^^LJr&I?=)UT{Owrn!35IQLL6B5;31%{l z>0WVw)jdQdk@`di+&_8*+iTbUiWt;l3Z)nUgP;;zg8(^Uh(v?&5urf9N=YbGW8Grt zLpK{VmUPm@1SJ9<0arkvHm=~wJxk?pW3A6WJ&9r0ffXq#MNljT6BB?e0nXul`0_AR zq^3l)6v0rb2*DXff~bX*5E1hkoUg{ExJDp;H{JiaJU&VY#RQPt|DikyjfylhUy6vu zG=<=5p&C)s5(*ItF`AUBafwh${g&nR37(JjmKVTd@Ati04dDHUn!6qPJs`lUciX^& z2Rz4keGjr8IRNE+$gQV~KI9ZIJTS?7@jF1*0A26Jz|;6*pE;Y9&>Np@7v2$w@|*w40#o$G~04Y7I^`qlSQEn zb!u`M<~h~#RL&6r_$Q=UArFd4y4(EM${Axxujz6Ih z#sfz9>PyaNWt4{b)VF>#*R{RmV0LBa#jOwTwfQHsnz?VJZ5vz7J|`Qi%jBVRuf)!! z3Og6a)m~Y<=KBg61hq94Jvy}HR&q?VgZu88iRs0+<9tVkU*7|7KDSLp%pX&jzj2Z8 z$OHAC?zMmNb72_g+2vae`MMwfaO0adEjeWYbz^tMd+y`zvx7EJ<6RvOmbbW^tml<= zUHm3=OWc#rnoBCYaqqWlISV76M6A0};2Zk#CZUUu?QEnCJGbkzuCLi&8h2RHe8j0K z^Rr*(9UFXh(dY!x#bHp>ZoIvN`F)N3*^q`?hh$?~g@GM|-oXVj<*a$|5WxLkrnmg= ssNKqAqeXRl53T@O@L*yU8l@7N0?wVm&TdzuS?NHE(3$em;Q87A29xws@&Et; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/items/large2/nimveil_udun.png b/src/main/resources/assets/lotr/textures/items/large2/nimveil_udun.png new file mode 100644 index 0000000000000000000000000000000000000000..3d1e3d6231336c252f03273a287a3976169231a9 GIT binary patch literal 4896 zcmeHLYfuwe7H+^11Oa!!H={8=M$jbPoeoKQh=K$mLL_1o5MAk{JJ3QNBpnh_5ZnP@ z3kvR7mW!a{_?Q`C97o+1pBY6_#OI*nqma#j=&A#v4(0e@Z^A>YovJNs*MFp{)7|Hu z^WAg4^W9syS)-U8>Fqhn6M`UbS(G#m++oM%F%W#myS`WjZa-ux6PP%{!ZH~38aka~ zF-r{;i?Y%h2(sSNDw2Fou?D}q6qq@n9r_{T{w>)NThWQotCba+L4J>FLX%$}UEDT; z<-cL!!2@w6VOy|&%}+HxJGYr^AFzsQS?9AVY|@i&=SDwk#mBfDH-FO}7*$S8jo%?_ zddQi~wLf9+R~2p>78avR9>8?Y50XE8;Z?h-Qn46b{qVxH8NZ}_6?{zaw;Ji_@t>$Q z&)wS+T<=t*ZY*B-OKDooo*Zs3OC0Bo+Or_YC7%utSIEM{d#V97lx7!y z8g)wHU(mU0t#1%}n14o%V(X(X;sTvs> zcaIMnvOHJxsVJ~2YE8?e{9(wLf81H$S=QOoU~<_$hxq#D(2taLXxx*{o9impO1{1S zXW#JE$x_v>vM8RWF>!InkJ0Ag_YxbjS6t665sqy1TeBlZIMwcLui3TJ)bNSV{*o_; zl>5bwWWwx`m9^Xx8C-m7+l6h#vN}KaHPtHj+K(^HDwq`#9T2B1Y|r0Y>)FD&xMb&< z1szSi!A%E0$8OMt@f4#ET;>TCSfPY6|8W*kz!$7j0*Y~9S~g@Qp%(@(guds z>sSsXb23$1ZoPw`ar}QX`o6Xy>C_yC=x)y0=^j4AVLnTA}|i7!Gs)w z3=ZZ{d?7}uLuTPh-9Z9hqk-fumu%JkSA*2LD0Z_m=4vTRZQKB#|5aEbu z3e3mhKK^==)-3&R-j3zN3h8Qk6m0_YFLj!_*3?`oqwB5fHJx@YCKk)NEO0{IRf37g zq`Eo|u)2oSse~?t0{cg|V0-NJ?}$MqRKseDPjO%orr`iNAsmqgK{*0G-ytP|K-DdV zUUZXQ!&nF-6_x^c1Y7}uI=Ny^?rv3}leJ!dODg5)gF~dSm;)$7gn&4lkFj|lzC3}L z6cHE#v`zt8Vk!y-GRMRmjL(NDRHZ^tRPb)P|8sd=ia?Q`@gWdl1i*ywq^JAF4_fZ7lF>6Y1toPx#bpX9yx?We1suJ>Z#y`1~i)lb)ZG4Ni_ z{p$L^(dGH}tVrp=4?GJv3BuRSHgJj@sEUr1LJd$56f~~Iup3wg8KM$R5ai|OxLlwu zr6YjRosr2S-0u%^`2#-mdS`VJ_^;rxOd6(4ZFsy1i5gA#pY1Hpt-MtoHhGro0w0rf z$O8rD;d3Rzr!vts(LRYBa(bN9eW!U=X-RJ523sJPZELJnm__OH{EJVAPpQcpRb?)@ z5ol9hwzZbLYyasS2i6U zmA|ldcS**$yZ-mo{8zP|4Q2MZ)8Z$i8!f>La#F3X1;n=I6W}^*fZo z2IGd5Ly4o?-H3AO*sLlS=(lFKYiTaudqm8OT~s#w`udOSEqOHoLA&y*e+p`koVZJF z+F#-;y|=_%jU_iot|l~2!SQ8n(Y5UFb5_gGw8zA5Q;kZ9CL!qBibb0Xyw*quUfrG9 zl(TtL4S(ImhBJT6&yM5F$hj#`TI6=1UJ#mdQ~RJ)Pdq7p`1I$hs`}>Yjzj3|H+Pa6 zLR*rK+?~>~eP8z4A1{982HDSH&zDhqm%FWPF8{URYoc5^e5)*CqWnf+SiB1iGlj>Vy5@zl fhIkBEX*oIlbqgGHzpSYZXaSN%%$8QpNM8AGMuiXf literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/items/large2/nimveil_udun_glow.png b/src/main/resources/assets/lotr/textures/items/large2/nimveil_udun_glow.png new file mode 100644 index 0000000000000000000000000000000000000000..82298d58b3f4f092d5c0185d1202fdaa04fb7bcd GIT binary patch literal 5155 zcmeHLc~leU79X$((yB;Nu@Bpvs31y`naLz1BSDZgY9K-s6fMpq6PTKfWF&#Q0F}aX z1ze~I)V6Mq=TeKxajA%kindZcS}PXhA#PQR8?{P>_f1%Y^LoxZo>$*rBxkn!-TV8# z`@6q8lgZzeQ4xb(-*bf^Xs|poGzJ`Dc5@jB_HmBSbHL$bx+ve*{G#;6o*MO zQ5?!fYaz&1r&k8MpWwJ0d9pk(c%I6(n!dQPeRHi~f_&}tD=A?cW)G_iY#AxTV>C^3 zw2kT`h>DLqg$!8ga(a zjX(G)Z@ApeP8Dks2EWr9rQ>wm+V{!P=3}!b4thGe5rQ0+(IFv9c}PfiJ|K(Y#rd+x z6G2|pi3wXL3=bB1q?}Psx*8VdwRL&e*UCEAUHE5nUpOh=EASW@QMJFZ@ick4s(N;u zb6l|7A5coFDTc{+?j{Y57@IdD0N2=v<^v6UncfFfj4L8p0)) z>xaZfYe$qn^h$j8@KG!ORQZwGm(qdjvudEvBLhw|C%6rq(yRNJ^KB;`Cr)#HBz?3j zc;wh6&4=zk{@d+>6H7{cJ+D3u*c;@x;ZXdq$2 zbo+5-a6*l#T(2gB9qVuPD$2qO^dV5E3cJuF5 z9gWrsZOTU%6|U8p4I{6$dpc(w4*Dl??fU5h^|*s$?XmSgKDttL?7q+4RjWrx9X~yg zx#Hex?-qx`NkPBM3*V{9cf?*+b001VzrM~n+>n_ms;KxaFzSO0zlHl34e;`Eyx>ml z`S{4;J%=ln*6wR-b2uMnK3CV~@dpGA#b}_fc*S&FZPfD#jgh4IHoXZ54}t2(GRZj*8CxHvdx%>pjR?!qjPapM(APKeP=aWFo{hk0Q(Iu+#xx^e={8Z90Z8r}r~ zu4LR~hB4s+fz@i|TZMe1IZ1#>rBVTm3Q&{>Jb0Eg14Gz&2Fn;0q7x&OvZ&3piJ^@K z4vR^U#)XWG%LU_{?)B+S3PlgR!P3P7;6q>|Oag=t3-o$H?+6PMmI^?+7WAhP78Phy zK@4RvE;OsDuvE&xjOh)bQTN1~7MgYTbTn!KrK9w~)dFTk`b-%iS15ZTSPGJ8y~!R0 z$nN9G(ArmI^;sJ`Vo#^{LO^&AZXfUN-0jZ5OQFC+jp~K$^5mg1E;~Q2F{)_|Za+n( zD1l%?DUT$z5*~(W5S|o9F&-%v3$-FlLn2yDFDSXe!Vm^E#XwtYAOokfqNEnxmMyQ#CMVyTqQtIkUuZEq$H$KDn=q3%q3S^&Udy>(UHx>u76Y&4+^?>`j4sz#ufmi8 z{C>597u}k#4h#Y>$pgu05us2A``!HQ_O-w=$P_u-0zq%T%We)(QL!g5Ix})bnDd=M z?jHWwg2a4h@K4BZ^3Y&aa>IiSmD9$|@W_t#&itvYdd~PAV>i2tzv2!c)oy+l<@3cI zLHFO_K4D)}=H&d8x22$MeJMX^ zQpVQF86MfUN=udF+`8+x0gf(-t2H#bk65N>Wh+59*<)V-YkRy#*Q$hEvi0k zPWPSc^h2cNIHNmT5On7D7j?J1p^Ww?tLewzy>A(IIicW}E0<#v{>7Jgg`Yn|>X=~( zK5^4SEMFH49g?%+c5!}o%G&MijXswyiEhLvgqT}hHm$t5u|2amzuN3K2=Yv42p9fI zQf{j&%Wn`)&rcHLZTD_?JWg9arn#_wU0KT()ncFLRK-7JwOhiM&MV$fT(Wz}bk)2Y z_uGGb3XL`@D#HxbQMbIFT(8wbZmWFmsB>0sG#>l4b?5@?$7gQ)jw;E_m|CKGjwvg2eQ8Xs-E_ctPV=mltN3%QCysuam>L(5 zmKnqWm2j+@)Htfc!`0`-o%#_#6ho+ZxmKZoCV+Dnu(6+uv8;w5d015F?kV%L{ta2h BRy_a! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/items/large2/nimveil_valar.png b/src/main/resources/assets/lotr/textures/items/large2/nimveil_valar.png new file mode 100644 index 0000000000000000000000000000000000000000..92c03342641f37c0c279a02a6e5b82f7b2527147 GIT binary patch literal 4896 zcmeHLdr%YC8eg!AA_@*5zKUy5D_l0&&4WBl5F}^<1`wivdX-If7q;YOvOus3_y7y_ zf%a>N1Q4g4x#LXzkIZa#_nhzh zo$vd7zwb;=3gcp?4{;ym4nfcmwMrQe?kIZ=900x(UE5cJ+v!ExBqkouf-P1vMH@(% z$+nO%X{RX&vj1R=n>+Lj?D4EVF!Qa)(E3{q6(43Ue>>OZQuzUDkhg)Dn)2+#f=72@ zpW=BHNr7LFn>ej*u*TbnP8=z(!rR+-p23TwJ1Re$@Zh1$-^G?bza^nK^h{EDfx7t~ zGReQGaai`jX~mIVmxZY74;{0E%6{v}C!-VZ&TA;VR}(t*LF#9rCqHD$YPjqeOSw0@V@ zHt*PxOnB4u@>=exgsq4Jm3eW1?YTrH|RS+eQ9uu!!{WyPrt@|D1!n?cA z&1q}qc{EpS5MHHM2dtSezIesJk)nUhT$+!zjtZO@&-nlPXsz_c_+x~1Lv_u;ydbS= z&DajlociyA&(Ek-FCEeFTz74(cUV2QVgI!!Z3m6wSg2EA*mIsQFSDMzIDYju2pT$z2J%YM%#i8LMlMd6btKnrv;f^fkbH{W zg6q>s2G)_Ov`N8vSb2&A(}aSPDAJ%BO9Yuls}@Og5Qa!ExZqz%x6{CRCSAcv(!{|LW-AE`xk4_AMB3?0J}1;2mRku*7O$Mv z1p(d^oHT~9$auW0tSoMpfNQp<@-V4X%0u})J|6)Vh%MX1;C94h3t%Cf7)sKnx6&4d zHk)7;6W5tD7zKv|=Hc%6j24Zi2i|1sVgc~Mv*Q*X#zlEXBd@oIjfuzygs@J!NK zae(EV(x>63R1)kTU4rc%r~gC@I5V^h4B%QK)^~#B+_9*2Mayu zHZ#R!;Z`y{74QhS0s?h#1yAZKRp6`kS!pC&2Ueu06akcBVnCcsAms4ge0rFa6jBmG zj1UqL9}(ghXdECK1jsf-gy{v8Smf0DUzc8&BKY0u$$9LC*j-FH?+@j68uZ#h0WHok zurq^=p4YR}cku;ceUqOqnZ3y+V7PCQ*W$O2u0Fb6i-FfN?o(GEU9ZK!YZ>>c>o23r z{pDGaG=U#@S>Pl{f8KBqoFWJ4qNgh%Pe=gmT9xm$5sVD7sFH0EG}xQHT%au_Bfy{= zqt-;a-5umIY;sWcvhN>*{|Z{w%5ZI3W9vpmbihoXf*(~?)4Xn+i}C3V|p5_)IAZpXV1jUiQ?5zkNW5i}i~r z)P2tVQlk92TbU%mqrT*s^+Nx*T$gU&D7nuaF*NYMUwnBgH!NoI;gjOb3Xl8<_Z#xi zkG2_d)(&vXS=Snyl2{wJ?}{6AR6fNG3a*RkSGDrNa<)to`j#;MiFT?Uv5j_1U#g^5#DH_hQ4@FGoKSbR61uyVP$W gAU_QDTHNo2OBg5kr-;qwQlJG$9T}r6pPI7lf9ui#mjD0& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/items/large2/nimveil_valar_glow.png b/src/main/resources/assets/lotr/textures/items/large2/nimveil_valar_glow.png new file mode 100644 index 0000000000000000000000000000000000000000..1998ca9fd99099e186af6ebeba58c5bdded17abe GIT binary patch literal 5154 zcmeHLc~BH*7H?1iQP8M}x6LR+H!!#NzI4iXp_yh?lefR?$O8DJ1u4?Iv( ziASjknn*T?S&SN2vmOYD$7&_(u`%m`i6T?+OJJ7HqJjyF*6I1Lei@4QLF-E^;;<-7o>!!R_8~z|zOR2^P zW7cJ!^g3O>cCdGkz7~5=${jiV&@ZdE#LOzKOBF8MX_}|$dGjB=H?LWxosqUZdUDgA z4XYwXR*s1Ka{s$oBd&(&lo<`vLQ=>6D0^qx-a|Lb5|fuU(T?iOn#Qw>OHo^&&;_w( z1)M)tACpw`?iax(vR|lub!Fe4b(c40pANqMWXh;tiWlC6Ag{$jOiYqKCgw#xAd8Lp ztF#G+BZnNFnX-9IP}JB$*YVTTh1l336M~9neY!hnY8JY$u}3j6GEDmZqRg6_4~~`> z6z$p`xP1}))a%;aE2Xz2q0ePuy9*y***pBfeeL~AUeTW&GVXfY|MOz5^cse3m==`3 z@(l0AN2K2 z(tbKLsNs^Fph-TcAhr8k#%Ibzyba3hcpjS2lEBrvQzt~vTFx1^ze z`d7)!w!BBdKR48lFTO(*6f)hrj|_>93*d~iLZY|Etytdg-m(2pj}4u_dOE)E>sfVa zkwIfd9_#hox4MGtaVEvOI>M*1>im=V0YBaIKC$02fB41hhOR$_cS)Ukai#@wZYn)@ zaq2C<0kuBT?H7v=_)fnMF_ZSQ3Gdf!4(sQCuw`I=O5lKf-F(h|e`#uqDj&kX`{$zo zyWMYMzp%W@Zz@`-yq2bkTdRkk4|AM~Hb;C6LA?k8=qt@Ikz#BXDb3nUoYZZx1K~lC zCcTF{H@F8>4b{Qr`WfqI9V}#Qcn+-tP7WA7D zP9tbjSu*FeWjPowHk-4$Ms$Q=nf7>lmc#5xhh=1(nX>>_Czus`Wy*NHA*nq=q##|e z*ga8z>{mQp0{@b%SJozuc+%;(5D?yu`-=CA+&#{~%V3~%HYQ74o?fSwi1SmdjS*PN zbBe2R8YARt#AM=C2tlwIqDFB7F)0*so+MZk#fwlbUu1;C{Oz`-yDj}dAP zkz+iH5GcwZG{dVAmC3}gJc*K+3hMwd$sqt$(&mn<5}{ZCg_3eL&SOdhHPHk@@Prbf zS%m`OwyEWZ2AQDbRCF!*iT#CN5B$;U!4+20B z2v*jX<9s<}6f9hdix&CBl(<5nCgmilAV`u_zjXQo=Wqfoil`VWm8(1>Vqqwd4xpA6 zl?nhnc90Df{{)=RVCX(kxottmL^Y_7H9 z0IPL~$)K(29Jqh93HF6u_zf|blnlynat=XN1djkYVTg*yaD@qogR)-q?#h||3`XqmN20N$s$SUc)x$4RgLUF)ZFUO;Q;}v-f9C69`GEKwLi$( z26P$;)I|ceZ}1iD&9B%7=2xOL#*$u?tOwr zD1V^xFN1$V9_w{c#*9n%)?o?LqK5pfI-$fbStz=4#e|mJpoh(IPViGLmYUo?lxuuQ zBBeiA61YN@u)Cir(oZ)MG3jsj?wSATZvXHVL0yuME|5Gb#7Y9M!SlCtyWeP+}=q;k#RG2eYiiGYhHHb#Iz0HciX(H`uO$wQ6FsG zu=k@;IXCtVS~C5cap6P#n~P85e>qwG>}q{{h%JA1^T62XIn2Oci}L1a68A)KHO7TY zqv^7*a#wftwl2SPeySH#`#kJS-A9v0f1xT*9y-Z7R(fs)J20T`qZtxxAbH))qmNLyXMK;X6{yB)eMd- zh{rXNcbGG__2X8~I6*&8Kj{sv%6O0Z7{6Htsqe{~%)Rz*F0XHV5>`5UQ0$+usw!Wu zIf00)%=h2)sJ!gq*i)8A^wF9v^U~%d|FGWNE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/items/nimveil_ancient.png b/src/main/resources/assets/lotr/textures/items/nimveil_ancient.png new file mode 100644 index 0000000000000000000000000000000000000000..4c8b4c9c8fc0107cc6dfda6693a2de2a1a728c83 GIT binary patch literal 4688 zcmeHLe^3*57GHvc8mrP%{8g^*1+{=~b~nFwAyoOHWH3k}SFtdK&F(jGCE1P1LV{yO zu~w{|o`BbmSX-;MWf;dggNVOQ1?rD_GsTWq?MM$j>Iqe=(w6#*llyK02y>meai;!9 zGW+X&-}}7xKJUHnWV0zNbJ2L^3?+gf<1Oi_+3*@EA7dimdFIc347{|gvgJzIj34!Q zMF;N!s8s3!C&dFwlB0l=ek3x0(&NF!Y(Pi5+J4}fhm1lK3 z9+0yBuqD4CH?Avk((dcYD|e00j9njdGG|`tA?3BWU$;AJXFqIR-Fzxezx07)Piw5J zsA*Pj&zaa4JCdG1{B6tG<_dmF_Ot^Juz8>MJl^o*$tZfF)IlG^tFPqNiDK)A+^+SL zc5Cau3Oh72Oi;Us(%r_x?=@}1=5%l9ZM!h`zM`#n+4Q7~m3jmTdy`K|$+D!R45R~- z_~4C7b9&4C=u-tb4e?Q<6Dmwx?U8TO(xNk>HWz+;AnLVZ;_xryYIL*W)bExTH8uU^ zRNeZ`_4_95D@X5#b=+ufsXu0PiLA1Y$&u`iL2(xbr<=6Nx)Rd|i=e4`_B zu0`2Rb?;d)b=I0|M{fP}Lg%g)MeB3ZxBVk=Wkv41lKtN`?d58}(0;+BeG^-7_Q+mO zd&k~aSL`ib^0>M1^*oDj$Mx8b++>BNV#_Nj)1z`L&ev7iRcVjNiG3B{FR99yvvm49 z(c@~9H(a~l)OXe2=wMczvno%oy*;(<@w9No(fRd4+m$m1|Ct!p+j{b^7k^#)!pZMm z`l09Glq5w&M*mh?$A{Cicxz;Q+Mf3txr`D+nEG@v7XjDl`G||gB z=nXUKXU406~fw3c<01_MT#|E0_+);=l#mP}K*$lEYjsvRJbQEo2IuyxSAB zf@BZVlz7JzvWCSbuLRQ>8VEEW#2uzRkb6)WYFVvxs>l}0;aO76D%n5Hi7e02!CRfy zs5Maz7UOh4hv~Gyj+yjEBL?ggp)qiTfiY-@Kv@Kz#0V^qp&+=Lhd4UIZUP2qV<0Il zreg^MW_M5w#sRy7BTWQp((8vnEb;QND;d|&sAMP(LNPi@qjl&h%w#Y+U^FHIGf{xU z?0O?-*RaqJWeP%ZEWJ?lx*1qb-px1x?h%~91(|SqL6*g=(x{0ik}MY^IiLZY0bbxl zzwgPCjdz0_iIMpvjT*hipfMQ;ilj6o^+f4a;Pt^?lu=1Stqlbs7lwxEKx!GeQz1am z0%k*}cmX4cUYjVo%qlr3RJI&kw!(qp7>P+`BmhAPjgBTLn$Xxt0`f`gskwxfCWh#X z9PcRof7WR81-5`tL^WN-z&XPN5BjR(@VtV4RN5DiTMANJESmV2ZgkRWN>GO8$CX_ z)A#cQV||vN{x*A-E>LvD$y4z=Le~ggPsPAfDUWp52whLbz*8xYbl2}jm-5NGA`svY zJU@IB+*DAN4BsLn>=}zvkv{pm^KYM3L&;cA`Z6DajGH7MVMxsf)1Yv)WU;1=?i#BY z9fzF15ZMO*D)^%%b%D+F_irl648_W6r_0KU-Ypka@UKjMGvV$*!Y}m7Sg~ zwfOn1zLu{GGZu{bci~mlY`>@0rW=#&iGFcZM7Lo_-i^aOi|-`#ws-!kG^(gJKVEsW zE z32ighf85e^JYs*gBC4UR@A#?0uE)J?hs2_X6nA=!t(zDt0klT literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/items/war_red_dwarven.png b/src/main/resources/assets/lotr/textures/items/nimveil_ancient_glow.png similarity index 53% rename from src/main/resources/assets/lotr/textures/items/war_red_dwarven.png rename to src/main/resources/assets/lotr/textures/items/nimveil_ancient_glow.png index 7ee04b785064de27e1cb1ffd69b5efeed970c063..4f45f68b9f2216693e435c032174e8db71cb2552 100644 GIT binary patch delta 1389 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�WcN?k%Q}y|)S%Vhnfdz7q}EDDS=H#zjwI~`SK9x4@EQ>?sROh8}-L4O(zS}Hu_#|iC+HD{LX~aHKSCIPf9yirMABv^oFy%Jnqn;f6q&gc{R4M zapmZ!s8QiF&b;jNdU8En_jcCj8@+0Yd++yk7_7UHA{Lfcj^%lR@v&fQsQb$P>=LIKt z2?*ez1%P-Rb|+7G^-@1B0iQ*&T#EQjgnYd;$6`ecoSQ~eGL;NNQ@m`ELOL%PNpMpP zkzq{jg@A8*=?Xz`5puc5)U=LnMDS{xq0sX88 zp9Q;AoHc{hGXK*0Uy&rdobzkm&V`ycu5JrwH6vHzc^-^(ug5pS)BK(g4 zQvp&-k*Ez*t58*(N`>0Aj1pA>pkNf38fO^AASknw7l4zbMJNa^V5v)ZMZ^XLe~gg!(w1q#v|1=Lf5bu7?$x! zb^YJy3LZF2(N6da$ODf`)aBqBc+3j4El4v;y2VfZXS+8-$vBs32``b14;QZhN!`{+ zC=3$JmXx4x#zln2gzpM_w-TPEgUrVHSvk$*^2p^)riCq&ZY4jN{(Vg1s??au(C>1) z6LHz??$wvL8{Up`L-(?%eNU9v1Rcm3JeZGlP%t``(Kw;)zmz*iEP*` zJ6;`iK~|mJeRtDezCw5BADn7!$@_AvHW}sYv!lH&G2f=gM7DUI(Hd*+#J-*5ym7t7 z_294iz+IX{cQX$oi|53LMm@^SdLgY~zj6cl>AR~#o4<|sMarVv4F_7Mm>aL2on8T2 zKi)P$9`o|f=k_Znet73uUDL^P_Y%W*W6j4Na39rO-@Ing?OV~E?X#Y(xwlCfmj6Sw z{*~@6k>@^LKc#VHQ|z1N0gWposwx&GEtE($;T;W+Z|)QSEtyE?m>G*jG6z17g_k(a RXNsgs%qi){kCT^I{0A5KTG#*p literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/items/nimveil_hilt.png b/src/main/resources/assets/lotr/textures/items/nimveil_hilt.png new file mode 100644 index 0000000000000000000000000000000000000000..d7174077c319a340f893193d4c408a1dae0eb54e GIT binary patch literal 4704 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 ame;sro4ompcb5U`Ad@k}uqQQt$-e>q8mL(S literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/items/nimveil_mortals_glow.png b/src/main/resources/assets/lotr/textures/items/nimveil_mortals_glow.png new file mode 100644 index 0000000000000000000000000000000000000000..a032ecdefe14bb97e5be484ee2b4cde46750a74d GIT binary patch literal 4943 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/items/nimveil_udun.png b/src/main/resources/assets/lotr/textures/items/nimveil_udun.png new file mode 100644 index 0000000000000000000000000000000000000000..27a6c1c8772d90a341d60b2cb2c02056b81ae85c GIT binary patch literal 4467 zcmeHKdsGu=77toMkcV9ml%kHorNBCwNium&39kepU=$%f09%>NOu|(1Fd0a|7qS(E zEm*CdqD3g{>(ni6?XIn2U8EFi7eQTw-L6$BKCmjQZqLd&Zjt>ayia@19?seRN6ty+ zoA2KHyZ8RSd+*6tmbyIA$1B*2$K&~ElGJJ7Ih*^=bO*l+e;6ddqp480mQ5oZkkw`} zFu63u7FcPBb}|MY&-o8i>NTHc$oofQd1ZIdmv5>L=VCzcgZq5MOBAOc|5lrj7pWNQK?3f0Vz~( z+5JjVb80}z;L&owNPb|z#tW$jAO1cqBxTO;vg`gdCo>N{{r#*1*y0F5W$}ilrmys! zO)VK~Jl4d`-drSqMIOnhqKo7e4Mc4(PwNsmv@g`-F8H(vJr zWY6K*wf-ySv2i_#AGQh_Hwy42k1xKrThr$6QP!gOXq|sCxgpV@yK@xFa>ANDtD(P(^x5H*lG{mJGvn)cpVwZI-6{Gm>%DDl2eTf89P^7UF`V2y zJtSn>+X;Vpt>5Xe^nUxik7;}4(Nt_Ze`Rq+EvUMD22|Ht?J}ISm;?l6(bEE_$qLGj z$BT+_S_yIk%|d$G$e5M3W^^S?G@$3 z0f32S3CL;6HQRBglJCOB!J6Af_>fD5-Js;J)uuu!i;adb0VY7<1SgX(;zxTyQ8vne zr>U0?Lx49WKZj+lID$AF4uL}~u-J@V4wlp3(PFxgw6I)4q^yHP1{Ku zV`UkO8R9Sry(N!T^7%jxjl^fNYPF;AX8SM;fDgn;SP`KBMNB4SyoH@j$Oj<90sX9n zT?d*JNu%wSJR3obU9v7ZQt>kn5amqq66z*D* z6eh;>QVf<$#3+nWQYoy!WKtL`FsVqcAZVF*9F)dvX9+V&b5H5R2s~SjfkeR?{{+s6`G{hzi6*67FDdkPe`h;3^dW zxGX?6xXMNoti`6YSaOwoE+~kz92ILpLs0}vs0o$^pr{DLQ3Z|)bs`~-N^r60H>em# z$LU)r#!&FTw7K?yqJ|DViLnF!1+J~3o=T@T4!sS%<}$8kf*@C0-~>68f}O~xDOa2T zYe+=q5N0C{=Ercsj_fl(Qw)S&BnRhBz$^wjxz!t0au_vU0gxo!$%b{QQwh6bLRjk1EBC2Wnw-uoGijkjFD`kke~1oNKmG2My%v5&m)5FzT&Brk}Urlb`30It*?_G#>H}_?? z`+a+ddwW8Sgt fJL@-hiUy`JrALh~C9mxO^zk$a%heyoXBYn$F0f*E literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/items/nimveil_udun_glow.png b/src/main/resources/assets/lotr/textures/items/nimveil_udun_glow.png new file mode 100644 index 0000000000000000000000000000000000000000..fc1c99053393b9dac20ecea6975e7a2c13cb498b GIT binary patch literal 4720 zcmeHLc~BH*7H>Q_g*8MJvsg5Pl!EqjPtUotsBb8J-Z^NW_|S7p}dIofA~h1^KABe4*mOI$6cq`h+mf=b6l*!AZHhhn z+P2+?YPJMrCIxmCn2JNctxoKmU(6e z9V^1te%RYaq(7(2WB#}+6E}C3t-0LVdf}*l$2aTxI%NBA7<}Ejp84m3H@mCd<>$II zcb@ml)92K5Y?>F`jP^%g0KdDco;7Et+kE1)`mZ-l{*?Ks`l}FgOlr)osF2tL=}%J5 zgIDj*EdFZ_`={0SW)0lGw7BkDMRg4u5HL3?B|R9JilR~uroX;v#_hJ|$8B?7eyf0N zI#YBbZ&6s>+_s;6?|1yDGU!~c?X4u=2Q3#LWrW|oJ?U@F)|Vr@%kNLQn>hK!{O&?4 z;(D+CLU(?zfA}R|X+wA2Cw>Ke2%Fu^Wxjc1Z|sb~6N9tY=7xkfP4zwh&nx+Z>a_^@ z#h3Sj9S;AcGh$aCYd<A~ZX7h|0rDVC%^AV|nE9@bZ$VJXGhtx}q^GeGLL zI$+@;NJ5g^L9?YmKp9ZX+q9B9M~_QTp3_QRR2m3_BNdeJnX8;2cU6{&T~*3zI7w1s zV1k>109GK-sM~6>xhS_*;=!fhSQO(D)T1JlY9)CFBbsV=0#qSYNC_;>&6kss#6UE` z$(gAfUHT9NeA7xw1i?Y!ctu5pv_dYmJBx9dMx((A5+_LvYGAHPn?SoUn=4v`@M7qI zi*@o2fw$XG5tC-@Wr9{Bf%E9Fe^!UVFamFL4Y2_Ez}>V1mq`iSYQ@J|xP-KF2r}f* zPg=N4uubtC;IfxFS&&u^Y(n%{2#y`Gca%9To^Uu82Nqz3sxG*yY}}F=dV_JqLZqOW zw>mslknC}q0&gBAYn*T5j3=D2jzIGf+;Q5&v3r!Emcc;j>};9no?fSwi0f0Fo#i>o zGh{i1T*0Umm|7_(Fa@VlVH!oe3WEcMid1W85HBACrMI~R+QtGA3W7^{hyxg4W;v3> z2##big$i0TW;ut+ITfd*<&2tOnK2OAP99bzZ5iv82*p7tCBw-$m4?I=G^d78Dmlh5 z42LnCSw+&UQmtkc9w?5b((O(w4b#b6>0*F8Y{i}lk#H*6sMktJDKRQBT4=!x4PX!O zHqKt*8l5unR*);uBA>E&Ql-+w%jGgsrBD#+QKer2rwi7ih$Ezmkz01%WQ6%?VNWNH&BrwBErBo+`d ziWsAB=Xi7Ff72G*2TkxMJ(G9A^(#FhZ%^fdm%MM@R}1fHCKUCw1x2&o5L|RQ;5>dp zEbkOsLfeV~+&_j2c395;L^03|sV3A48eMr>piyfW2DXbgX(QzQZ{dwrglssx1YFz@hm)Cr|0vyFg)uuQq{S

>z zj-C~P4gSEZfG5GXHyChuiu7fcWay9|#Lw7lH&mFWx>#-Og|*^b_=k zG{4?}(3$@7272HT{Hs8s*Cm_O?WfNrEom*9-qvq_p}0Sr+SIu>>eUqa463p0c2H(v za{Sd4-&sef#+wCE>Mu?w2VP3vv$;f%9-f+3zs>l@y9>k4X!h=~Uhgq{H!ZTSF>>pv z$T-t7{i+zOc5zzPsp;#33`@4|Xxi!SJGQ+Y=(nsmFp%9C(AAQVy)}uBSy^ASBF0DU z90*+WL4LvdmlW3rDj%$7K3*1j{9iR!UG=}j7T;UfNY&Q8TiE<4y-Rm8$i6PJv}LpW z$+epehW5&W#Mws6!MPik@9ypo&ya^)jeh^;_S%*sp_93)&v)9|uHQPJn_d{VZ}1nt ze>iaIwUtXd%Thl+@|S5FrG8BdPvrl6{^t+vE8}NR`*n{x>tPa!Y+Sx*FeHaXeq&w- tOzq$Jh0dy-=5yn=4iXpw^7Lkd0f~cSe|U>mSFXr6qEE}xHKY_({Rem~q#*zR literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/items/nimveil_valar.png b/src/main/resources/assets/lotr/textures/items/nimveil_valar.png new file mode 100644 index 0000000000000000000000000000000000000000..b3b739340d8e83b450995e2269d44d60946f6508 GIT binary patch literal 4471 zcmeHKdr(tX8o%PMAU?n%f-Va&Vl6H=_vZb8D43v0Aqp{5Mcvi=3f@9;L+*tHY7w-s zYAY>T8Hf4+MX2w`7A;B_SqH0&C~T{)i)AQ-qHF5|w`IE(*>l5t+L;|@w*Qft`})rB z`*af5;&ZUl}@7s zT$Y0pP;S}^LGFLp5?4k=XiUe z-fM>vu9_}0>?$dlSReD7gx5BwpD*kQV9tIvrzL8SIR%$l zZw2S}_&B6V-aD16K1x+wKe!8@-TOV~)p|QD+0T5q{RRY$%cpg^M59hOkPFCQ&)Y>& zhD(Xl3wkTI`OO#3n4W$maql+=%pviC@2)HRByd#*TK#ZRi7Y%qRJbX%uI_XEW?g;q z3hx!M{u^>tQL2dZhOM2i=Fbp^etP%)-hI8Dt?an6B<#qYz+YP$CFWB8J`h!Ke_eojkj`lC}*|>Y(1EujBKCMex>3N+d6ORnH}Z+ z`vaEEGoM;f$ri(O@Pp_3085;w;pHnzD{DXIVX39TI%F9Q;ofYw_nG1dX^nLZq@M_YztM1C_-1!zm zVb}}5oEx_yuO(bC<^?zP;4NVRF*ig_$6CJcK5bJjgLl*boz7;;uEDuZhFH!JVue!aSMW8>b{k3uT_VhXHP8^(u(cmRz^E~fMD%Wvt%C*F0NoR^!!x9o0v+R|1Tv9Kgu-!dI#VKC;46rBl2(mbzqp?Q zd})R2InJR$5SPm(a!EyuGX)W=)oKKlAQA}-5HOo%=P);HXXo$~eH?me&XtOsiWJ&Kqq zmdS7uR9q%y=jIHjAc;YLM}{-alMYEBR2pRiP!`N89x>$-qbYIFgO?zMwmCdrKNXiAJqZB0`5OiD?*T1rDGGXgkTc z*r6c{ZKIZR7_X;TDUnOWQk4uvl?u67IRtuxaaatHAO)KPs67Zgb!zR#BB*tNSjH3W4Dv@bWwFVViBw`IJ)yP%919x;7 zo*`*#*8f8D?IVcpTXX}>g88#NroNt9PNnyK^?jz%o@NpVJZ+)Dh`tn9ER!NVaRRQs zA!0pdPocp6(O<9wcKTfM1^tY+Ya{L3-IzeErDK~kvvy?p;-V43JJB(o4SDS*Gm zK_z>Ffzg{Yn&P}4OdR*hub_XIy%P%#({qjbSc|IRW>IatS9$>C!aZ77MJ8- zQ&$$|-|@G$rY6Uh>n{WHHtS41D)Fe#8=a#nExq(P314G{yDc)9mm|Mf1+ye8HTu$q!{_g@%d( zC*_^$`s22J({hhAzX9D_lkN4d8u2;g_uo}6kGrvjnAN_!;6s*v)?N81;A-l#!>5CK z>K@g0J^rNnPEGs8=#C%CF6TFwJf8gVwtYqA#RrnkJ59;H=R=Akj=y+7y< z+SyFz=;Pa77s4jAy!E3rNSkg5-*M)Z?ak?MrUHkga}#rZbTJLwns@8gmHwqh