From 866f0db5503b86a6547bb7896257c3d498170936 Mon Sep 17 00:00:00 2001 From: Shinare Date: Fri, 2 Aug 2024 16:48:58 +0300 Subject: [PATCH] WIP Nex and durability recipes --- .gradle/8.2.1/checksums/checksums.lock | Bin 17 -> 0 bytes .../dependencies-accessors.lock | Bin 17 -> 0 bytes .../dependencies-accessors/gc.properties | 0 .gradle/8.2.1/fileChanges/last-build.bin | Bin 1 -> 0 bytes .gradle/8.2.1/fileHashes/fileHashes.lock | 1 - .gradle/8.2.1/gc.properties | 0 .gradle/vcs-1/gc.properties | 0 .../com/zivilon/cinder_loe/CinderLoE.java | 100 ++++++++- .../com/zivilon/cinder_loe/Materials.java | 6 +- .../cinder_loe/ShapelessDurabilityRecipe.java | 107 ++++++++++ .../cinder_loe/blocks/EntityBarrier.java | 84 ++++++++ .../zivilon/cinder_loe/blocks/IceCage.java | 200 ++++++++++++++++++ .../zivilon/cinder_loe/blocks/ShadowTile.java | 44 ++++ .../cinder_loe/client/model/ModelNex.java | 200 ++++++++++++++++++ .../cinder_loe/client/render/RenderNex.java | 134 ++++++++++++ .../client/render/block/RenderIceCage.java | 76 +++++++ .../render/projectile/RenderWarDart.java | 53 +++++ .../coremod/LOTRMaterialTransformer.java | 5 +- .../cinder_loe/coremod/LOTRWeaponLinker.java | 3 +- .../com/zivilon/cinder_loe/entity/Nex.java | 117 ++++++++++ .../entity/projectile/EntityWarDart.java | 159 ++++++++++++++ .../zivilon/cinder_loe/items/ToxicCore.java | 12 ++ .../com/zivilon/cinder_loe/items/WarDart.java | 150 +++++++++++++ .../cinder_loe/items/WarDartHeads.java | 70 ++++++ .../cinder_loe/mixins/MixinSlotCrafting.java | 94 ++++++++ .../recipe/ToxicCoreArrowsRecipe.java | 81 +++++++ .../java/com/zivilon/cinder_loe/recipes.java | 61 +++++- .../cinder_loe/util/DurableItemCrafter.java | 19 ++ .../zivilon/cinder_loe/util/Utilities.java | 77 +++++++ .../assets/cinder_loe/lang/en_US.lang | 30 +++ .../assets/lotr/armor/nex_fire_1.png | Bin 0 -> 5483 bytes .../assets/lotr/armor/nex_fire_2.png | Bin 0 -> 4583 bytes .../resources/assets/lotr/armor/nex_ice_1.png | Bin 0 -> 5721 bytes .../resources/assets/lotr/armor/nex_ice_2.png | Bin 0 -> 4695 bytes .../assets/lotr/armor/nex_shadow_1.png | Bin 0 -> 5376 bytes .../assets/lotr/armor/nex_shadow_2.png | Bin 0 -> 4586 bytes .../assets/lotr/armor/nex_toxin_1.png | Bin 0 -> 5286 bytes .../assets/lotr/armor/nex_toxin_2.png | Bin 0 -> 4583 bytes .../assets/lotr/textures/blocks/ice_cage.png | Bin 0 -> 5790 bytes .../assets/lotr/textures/blocks/invisible.png | Bin 0 -> 567 bytes .../lotr/textures/blocks/shadow_tile.png | Bin 0 -> 464 bytes .../lotr/textures/items/firstAgeGlaive.png | Bin 0 -> 6530 bytes .../textures/items/large/firstAgeGlaive.png | Bin 0 -> 6727 bytes .../assets/lotr/textures/items/toxicCore.png | Bin 0 -> 6394 bytes .../lotr/textures/items/war_dart_ancient.png | Bin 0 -> 4383 bytes .../textures/items/war_dart_black_uruk.png | Bin 0 -> 4392 bytes .../textures/items/war_dart_blue_dwarven.png | Bin 0 -> 4383 bytes .../lotr/textures/items/war_dart_bronze.png | Bin 0 -> 4388 bytes .../lotr/textures/items/war_dart_copper.png | Bin 0 -> 4383 bytes .../lotr/textures/items/war_dart_dwarven.png | Bin 0 -> 4382 bytes .../lotr/textures/items/war_dart_elven.png | Bin 0 -> 4367 bytes .../textures/items/war_dart_gilded_iron.png | Bin 0 -> 4376 bytes .../lotr/textures/items/war_dart_headless.png | Bin 0 -> 4323 bytes .../lotr/textures/items/war_dart_heads_0.png | Bin 0 -> 4637 bytes .../lotr/textures/items/war_dart_heads_1.png | Bin 0 -> 4485 bytes .../textures/items/war_dart_heads_1_alt.png | Bin 0 -> 4495 bytes .../lotr/textures/items/war_dart_heads_2.png | Bin 0 -> 4519 bytes .../lotr/textures/items/war_dart_heads_3.png | Bin 0 -> 4547 bytes .../lotr/textures/items/war_dart_heads_4.png | Bin 0 -> 4577 bytes .../lotr/textures/items/war_dart_heads_5.png | Bin 0 -> 4608 bytes .../lotr/textures/items/war_dart_iron.png | Bin 0 -> 4382 bytes .../lotr/textures/items/war_dart_mithril.png | Bin 0 -> 4377 bytes .../lotr/textures/items/war_dart_orc.png | Bin 0 -> 4385 bytes .../textures/items/war_dart_red_dwarven.png | Bin 0 -> 4385 bytes .../lotr/textures/items/war_dart_uruk.png | Bin 0 -> 4386 bytes src/main/resources/mixins.cinder_loe.json | 5 +- 66 files changed, 1877 insertions(+), 11 deletions(-) delete mode 100644 .gradle/8.2.1/checksums/checksums.lock delete mode 100644 .gradle/8.2.1/dependencies-accessors/dependencies-accessors.lock delete mode 100644 .gradle/8.2.1/dependencies-accessors/gc.properties delete mode 100644 .gradle/8.2.1/fileChanges/last-build.bin delete mode 100644 .gradle/8.2.1/fileHashes/fileHashes.lock delete mode 100644 .gradle/8.2.1/gc.properties delete mode 100644 .gradle/vcs-1/gc.properties create mode 100644 src/main/java/com/zivilon/cinder_loe/ShapelessDurabilityRecipe.java create mode 100644 src/main/java/com/zivilon/cinder_loe/blocks/EntityBarrier.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 create mode 100644 src/main/java/com/zivilon/cinder_loe/client/model/ModelNex.java create mode 100644 src/main/java/com/zivilon/cinder_loe/client/render/RenderNex.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/projectile/RenderWarDart.java create mode 100644 src/main/java/com/zivilon/cinder_loe/entity/Nex.java create mode 100644 src/main/java/com/zivilon/cinder_loe/entity/projectile/EntityWarDart.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/WarDart.java create mode 100644 src/main/java/com/zivilon/cinder_loe/items/WarDartHeads.java create mode 100644 src/main/java/com/zivilon/cinder_loe/mixins/MixinSlotCrafting.java create mode 100644 src/main/java/com/zivilon/cinder_loe/recipe/ToxicCoreArrowsRecipe.java create mode 100644 src/main/java/com/zivilon/cinder_loe/util/DurableItemCrafter.java create mode 100644 src/main/resources/assets/lotr/armor/nex_fire_1.png create mode 100644 src/main/resources/assets/lotr/armor/nex_fire_2.png create mode 100644 src/main/resources/assets/lotr/armor/nex_ice_1.png create mode 100644 src/main/resources/assets/lotr/armor/nex_ice_2.png create mode 100644 src/main/resources/assets/lotr/armor/nex_shadow_1.png create mode 100644 src/main/resources/assets/lotr/armor/nex_shadow_2.png create mode 100644 src/main/resources/assets/lotr/armor/nex_toxin_1.png create mode 100644 src/main/resources/assets/lotr/armor/nex_toxin_2.png create mode 100644 src/main/resources/assets/lotr/textures/blocks/ice_cage.png create mode 100644 src/main/resources/assets/lotr/textures/blocks/invisible.png create mode 100644 src/main/resources/assets/lotr/textures/blocks/shadow_tile.png create mode 100644 src/main/resources/assets/lotr/textures/items/firstAgeGlaive.png create mode 100644 src/main/resources/assets/lotr/textures/items/large/firstAgeGlaive.png create mode 100644 src/main/resources/assets/lotr/textures/items/toxicCore.png create mode 100644 src/main/resources/assets/lotr/textures/items/war_dart_ancient.png create mode 100644 src/main/resources/assets/lotr/textures/items/war_dart_black_uruk.png create mode 100644 src/main/resources/assets/lotr/textures/items/war_dart_blue_dwarven.png create mode 100644 src/main/resources/assets/lotr/textures/items/war_dart_bronze.png create mode 100644 src/main/resources/assets/lotr/textures/items/war_dart_copper.png create mode 100644 src/main/resources/assets/lotr/textures/items/war_dart_dwarven.png create mode 100644 src/main/resources/assets/lotr/textures/items/war_dart_elven.png create mode 100644 src/main/resources/assets/lotr/textures/items/war_dart_gilded_iron.png create mode 100644 src/main/resources/assets/lotr/textures/items/war_dart_headless.png create mode 100644 src/main/resources/assets/lotr/textures/items/war_dart_heads_0.png create mode 100644 src/main/resources/assets/lotr/textures/items/war_dart_heads_1.png create mode 100644 src/main/resources/assets/lotr/textures/items/war_dart_heads_1_alt.png create mode 100644 src/main/resources/assets/lotr/textures/items/war_dart_heads_2.png create mode 100644 src/main/resources/assets/lotr/textures/items/war_dart_heads_3.png create mode 100644 src/main/resources/assets/lotr/textures/items/war_dart_heads_4.png create mode 100644 src/main/resources/assets/lotr/textures/items/war_dart_heads_5.png create mode 100644 src/main/resources/assets/lotr/textures/items/war_dart_iron.png create mode 100644 src/main/resources/assets/lotr/textures/items/war_dart_mithril.png create mode 100644 src/main/resources/assets/lotr/textures/items/war_dart_orc.png create mode 100644 src/main/resources/assets/lotr/textures/items/war_dart_red_dwarven.png create mode 100644 src/main/resources/assets/lotr/textures/items/war_dart_uruk.png diff --git a/.gradle/8.2.1/checksums/checksums.lock b/.gradle/8.2.1/checksums/checksums.lock deleted file mode 100644 index 9982850ebb5bbe3fc3172a2bceba5addba99db63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 QcmZR6zke?nF+czh08$DDlmGw# diff --git a/.gradle/8.2.1/dependencies-accessors/dependencies-accessors.lock b/.gradle/8.2.1/dependencies-accessors/dependencies-accessors.lock deleted file mode 100644 index 451a4ce7c3441dff8e04046df053bc3ea74a0c7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 ScmZQ(soJTTyG6;B0SW*lb^`1G diff --git a/.gradle/8.2.1/dependencies-accessors/gc.properties b/.gradle/8.2.1/dependencies-accessors/gc.properties deleted file mode 100644 index e69de29..0000000 diff --git a/.gradle/8.2.1/fileChanges/last-build.bin b/.gradle/8.2.1/fileChanges/last-build.bin deleted file mode 100644 index f76dd238ade08917e6712764a16a22005a50573d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1 IcmZPo000310RR91 diff --git a/.gradle/8.2.1/fileHashes/fileHashes.lock b/.gradle/8.2.1/fileHashes/fileHashes.lock deleted file mode 100644 index 2a4130d..0000000 --- a/.gradle/8.2.1/fileHashes/fileHashes.lock +++ /dev/null @@ -1 +0,0 @@ -�[�i5�ï¿ûo \ No newline at end of file diff --git a/.gradle/8.2.1/gc.properties b/.gradle/8.2.1/gc.properties deleted file mode 100644 index e69de29..0000000 diff --git a/.gradle/vcs-1/gc.properties b/.gradle/vcs-1/gc.properties deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/java/com/zivilon/cinder_loe/CinderLoE.java b/src/main/java/com/zivilon/cinder_loe/CinderLoE.java index 9eeb0e9..8c9e31a 100644 --- a/src/main/java/com/zivilon/cinder_loe/CinderLoE.java +++ b/src/main/java/com/zivilon/cinder_loe/CinderLoE.java @@ -4,9 +4,12 @@ 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.projectile.*; import com.zivilon.cinder_loe.client.render.corrupt.*; import com.zivilon.cinder_loe.command.CommandCinderCharacter; import com.zivilon.cinder_loe.entity.*; +import com.zivilon.cinder_loe.entity.projectile.*; import com.zivilon.cinder_loe.entity.corrupt.*; import com.zivilon.cinder_loe.entity.npc.*; import com.zivilon.cinder_loe.entity.trader.BladorthinSmith; @@ -107,6 +110,10 @@ 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; // Blocks @@ -132,6 +139,9 @@ public class CinderLoE { public static Block bronzeChain; public static Block plaster; public static Block voidblock; + public static Block shadowTile; + public static Block entityBarrier; + public static Block iceCage; //public static Block verticalWeaponRack; @@ -177,11 +187,35 @@ 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 firstAgeGlaive; + public static Item toxicCore; + + + // Misc // Common tools/weapons public static Item whip; public static Item cleaver; + public static Item warDart; + public static Item warDartHeads; // Elite Armors public static Item helmetserpent; @@ -300,7 +334,6 @@ public class CinderLoE { public static Item BreeCaptainSpawnEgg; public static Item BreeSoldierBannerBearerSpawnEgg; public static Item BreeOutriderSpawnEgg; - public static Item SauronSpawnEgg; public static Item utumnoSlaveSpawnEgg; @@ -358,7 +391,7 @@ public class CinderLoE { event.registerServerCommand(new CommandCinderCharacter()); } - public void registerEntities() { // Last ID added: 43 + public void registerEntities() { // Last ID added: 45 ///GameRegistry.registerTileEntity(TileEntityMistBlock.class, "TileEntityMistBlock"); ///.registerBlock(TileEntityRustedSword, "TileEntityRustedSword"); @@ -376,6 +409,8 @@ public class CinderLoE { // Others EntityRegistry.registerModEntity(DarkSpider.class, "DarkSpider", (entityID + 42), this, 64, 1, true); + EntityRegistry.registerModEntity(Nex.class, "Nex", (entityID + 44), this, 64, 1, true); + EntityRegistry.registerModEntity(EntityWarDart.class, "WarDart", (entityID + 45), this, 64, 1, true); EntityRegistry.registerModEntity(CorruptDwarf.class, "CorruptDwarf", (entityID + 36), this, 64, 1, true); EntityRegistry.registerModEntity(CorruptElf.class, "CorruptElf", (entityID + 37), this, 64, 1, true); @@ -491,6 +526,12 @@ public class CinderLoE { GameRegistry.registerBlock(mistBlock, "mist"); voidblock = (new voidblock()); GameRegistry.registerBlock(voidblock, "voidblock"); + shadowTile = (new ShadowTile()); + GameRegistry.registerBlock(shadowTile, "shadow_tile"); + entityBarrier = (new EntityBarrier()); + GameRegistry.registerBlock(entityBarrier, "entity_barrier"); + iceCage = (new IceCage()); + GameRegistry.registerBlock(iceCage, "ice_cage"); // Building Blocks cutDrystone = (new cutDrystone()); @@ -594,7 +635,7 @@ public class CinderLoE { * Item Registation, add up the "last ID added" upon adding a new item * Weapons will need to be linked */ - // Last ID added: 127 + // Last ID added: 147 // ==Food Items== ItemRegistration.registerItem(onion, "onion", 89); @@ -671,6 +712,10 @@ public class CinderLoE { // Misc EVENT = getLOTRMaterialByName("EVENT"); MATERIAL_JADE = getLOTRMaterialByName("JADE"); + MATERIAL_NEX_ICE = getLOTRMaterialByName("NEX_ICE"); + MATERIAL_NEX_FIRE = getLOTRMaterialByName("NEX_FIRE"); + MATERIAL_NEX_TOXIN = getLOTRMaterialByName("NEX_TOXIN"); + MATERIAL_NEX_SHADOW = getLOTRMaterialByName("NEX_SHADOW"); frostblade = (new LOTRItemSword(EVENT)).setUnlocalizedName("lotr:frostblade").setTextureName("lotr:frostblade"); daggervoid = (new VoidDagger(EVENT)).addWeaponDamage(5.0F).setUnlocalizedName("lotr:daggerVoid").setTextureName("lotr:daggerVoid").setCreativeTab(null); @@ -683,6 +728,46 @@ public class CinderLoE { legsJade = (new LOTRItemArmor(MATERIAL_JADE, 2,"leggings")).setUnlocalizedName("lotr:legsJade").setTextureName("lotr:legsJade").setCreativeTab(null); bootsJade = (new LOTRItemArmor(MATERIAL_JADE, 3)).setUnlocalizedName("lotr:bootsJade").setTextureName("lotr:bootsJade").setCreativeTab(null); + helmetNexIce = (new LOTRItemArmor(MATERIAL_NEX_ICE, 0)).setUnlocalizedName("lotr:helmetNexIce").setTextureName("lotr:helmetNexIce").setCreativeTab(null); + bodyNexIce = (new LOTRItemArmor(MATERIAL_NEX_ICE, 1)).setUnlocalizedName("lotr:bodyNexIce").setTextureName("lotr:bodyNexIce").setCreativeTab(null); + legsNexIce = (new LOTRItemArmor(MATERIAL_NEX_ICE, 2)).setUnlocalizedName("lotr:legsNexIce").setTextureName("lotr:legsNexIce").setCreativeTab(null); + bootsNexIce = (new LOTRItemArmor(MATERIAL_NEX_ICE, 3)).setUnlocalizedName("lotr:bootsNexIce").setTextureName("lotr:bootsNexIce").setCreativeTab(null); + helmetNexFire = (new LOTRItemArmor(MATERIAL_NEX_FIRE, 0)).setUnlocalizedName("lotr:helmetNexFire").setTextureName("lotr:helmetNexFire").setCreativeTab(null); + bodyNexFire = (new LOTRItemArmor(MATERIAL_NEX_FIRE, 1)).setUnlocalizedName("lotr:bodyNexFire").setTextureName("lotr:bodyNexFire").setCreativeTab(null); + legsNexFire = (new LOTRItemArmor(MATERIAL_NEX_FIRE, 2)).setUnlocalizedName("lotr:legsNexFire").setTextureName("lotr:legsNexFire").setCreativeTab(null); + bootsNexFire = (new LOTRItemArmor(MATERIAL_NEX_FIRE, 3)).setUnlocalizedName("lotr:bootsNexFire").setTextureName("lotr:bootsNexFire").setCreativeTab(null); + helmetNexToxin = (new LOTRItemArmor(MATERIAL_NEX_TOXIN, 0)).setUnlocalizedName("lotr:helmetNexToxin").setTextureName("lotr:helmetNexToxin").setCreativeTab(null); + bodyNexToxin = (new LOTRItemArmor(MATERIAL_NEX_TOXIN, 1)).setUnlocalizedName("lotr:bodyNexToxin").setTextureName("lotr:bodyNexToxin").setCreativeTab(null); + legsNexToxin = (new LOTRItemArmor(MATERIAL_NEX_TOXIN, 2)).setUnlocalizedName("lotr:legsNexToxin").setTextureName("lotr:legsNexToxin").setCreativeTab(null); + bootsNexToxin = (new LOTRItemArmor(MATERIAL_NEX_TOXIN, 3)).setUnlocalizedName("lotr:bootsNexToxin").setTextureName("lotr:bootsNexToxin").setCreativeTab(null); + helmetNexShadow = (new LOTRItemArmor(MATERIAL_NEX_SHADOW, 0)).setUnlocalizedName("lotr:helmetNexShadow").setTextureName("lotr:helmetNexShadow").setCreativeTab(null); + bodyNexShadow = (new LOTRItemArmor(MATERIAL_NEX_SHADOW, 1)).setUnlocalizedName("lotr:bodyNexShadow").setTextureName("lotr:bodyNexShadow").setCreativeTab(null); + legsNexShadow = (new LOTRItemArmor(MATERIAL_NEX_SHADOW, 2)).setUnlocalizedName("lotr:legsNexShadow").setTextureName("lotr:legsNexShadow").setCreativeTab(null); + bootsNexShadow = (new LOTRItemArmor(MATERIAL_NEX_SHADOW, 3)).setUnlocalizedName("lotr:bootsNexShadow").setTextureName("lotr:bootsNexShadow").setCreativeTab(null); + firstAgeGlaive = (new LOTRItemPolearm(MATERIAL_NEX_SHADOW)).setUnlocalizedName("lotr:firstAgeGlaive").setTextureName("lotr:firstAgeGlaive").setCreativeTab(null); + toxicCore = (new ToxicCore()).setUnlocalizedName("lotr:toxicCore").setTextureName("lotr:toxicCore").setCreativeTab(null); + + linkLOTRWeapon(firstAgeGlaive, "firstAgeGlaive"); + + ItemRegistration.registerItem(helmetNexIce,"helmetNexIce",130); + ItemRegistration.registerItem(bodyNexIce,"bodyNexIce",131); + ItemRegistration.registerItem(legsNexIce,"legsNexIce",132); + ItemRegistration.registerItem(bootsNexIce,"bootsNexIce",133); + ItemRegistration.registerItem(helmetNexFire,"helmetNexFire",134); + ItemRegistration.registerItem(bodyNexFire,"bodyNexFire",135); + ItemRegistration.registerItem(legsNexFire,"legsNexFire",136); + ItemRegistration.registerItem(bootsNexFire,"bootsNexFire",137); + ItemRegistration.registerItem(helmetNexToxin,"helmetNexToxin",138); + ItemRegistration.registerItem(bodyNexToxin,"bodyNexToxin",139); + ItemRegistration.registerItem(legsNexToxin,"legsNexToxin",140); + ItemRegistration.registerItem(bootsNexToxin,"bootsNexToxin",141); + ItemRegistration.registerItem(helmetNexShadow,"helmetNexShadow",142); + ItemRegistration.registerItem(bodyNexShadow,"bodyNexShadow",143); + ItemRegistration.registerItem(legsNexShadow,"legsNexShadow",144); + ItemRegistration.registerItem(bootsNexShadow,"bootsNexShadow",145); + ItemRegistration.registerItem(firstAgeGlaive, "firstAgeGlaive",146); + ItemRegistration.registerItem(toxicCore,"toxicCore",147); + ItemRegistration.registerItem(frostblade, "frostblade", 30); ItemRegistration.registerItem(daggervoid, "daggerVoid", 96); ItemRegistration.registerItem(spearsolidgold, "spearsolidgold", 31); @@ -701,10 +786,16 @@ public class CinderLoE { // Common Tools/Weapons cleaver = (new LOTRItemDagger(GONDOR)).setUnlocalizedName("lotr:cleaver").setTextureName("lotr:cleaver"); + warDart = (new WarDart()).setUnlocalizedName("war_dart").setTextureName("lotr:war_dart"); + warDartHeads = (new WarDartHeads()).setUnlocalizedName("war_dart_heads").setTextureName("lotr:war_dart_heads_0"); ItemRegistration.registerItem(cleaver,"cleaver",127); linkLOTRWeapon(cleaver, "cleaver"); + ItemRegistration.registerItem(warDart,"warDart",128); + ItemRegistration.registerItem(warDartHeads,"warDartHeads",129); + + //ASH MATERIAL_ASH = getLOTRMaterialByName("ASH"); ingotAsh = new Item().setUnlocalizedName("lotr:ingotAsh").setTextureName("lotr:ingotAsh").setCreativeTab((CreativeTabs) materials); @@ -965,6 +1056,8 @@ public class CinderLoE { public void setup() { // RenderingRegistry.registerEntityRenderingHandler(HaradLevy.class, new LOTRRenderNearHaradrim()); // RenderingRegistry.registerEntityRenderingHandler(DwarfLevy.class, new LOTRRenderDwarf()); + RenderingRegistry.registerBlockHandler(new RenderIceCage()); + RenderingRegistry.registerEntityRenderingHandler(EntityWarDart.class, new RenderWarDart()); RenderingRegistry.registerEntityRenderingHandler(BladorthinSmith.class, new LOTRRenderDorwinionElfVintner()); @@ -981,6 +1074,7 @@ public class CinderLoE { RenderingRegistry.registerEntityRenderingHandler(Renegade.class, new RenderRenegade()); RenderingRegistry.registerEntityRenderingHandler(RenegadeCaptain.class, new RenderRenegade()); RenderingRegistry.registerEntityRenderingHandler(Wraith.class, new RenderWraith()); + RenderingRegistry.registerEntityRenderingHandler(Nex.class, new RenderNex()); RenderingRegistry.registerEntityRenderingHandler(RedDwarfWarrior.class, new LOTRRenderDwarf()); RenderingRegistry.registerEntityRenderingHandler(RedDwarfArbalest.class, new LOTRRenderDwarf()); diff --git a/src/main/java/com/zivilon/cinder_loe/Materials.java b/src/main/java/com/zivilon/cinder_loe/Materials.java index d63df85..4990c3a 100644 --- a/src/main/java/com/zivilon/cinder_loe/Materials.java +++ b/src/main/java/com/zivilon/cinder_loe/Materials.java @@ -25,8 +25,10 @@ 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("BRONZE", 2000, 0.0F, 0.6F, 2, 7.0F, 10, LOTRMod.bronze); + modifyMaterial("NEX_ICE",1500, 0.0F, 0.8F, 0, 9.0F, 10, null); + modifyMaterial("NEX_FIRE",1500, 0.0F, 0.8F, 0, 9.0F, 10, null); + modifyMaterial("NEX_TOXIN",1500, 0.0F, 0.8F, 0, 9.0F, 10, null); + modifyMaterial("NEX_SHADOW",1500, 0.0F, 0.8F, 0, 9.0F, 10, null); } 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/ShapelessDurabilityRecipe.java b/src/main/java/com/zivilon/cinder_loe/ShapelessDurabilityRecipe.java new file mode 100644 index 0000000..4e8bb1c --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/ShapelessDurabilityRecipe.java @@ -0,0 +1,107 @@ +package com.zivilon.cinder_loe; + +import java.util.List; +import java.util.ArrayList; + +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.ShapelessRecipes; +import net.minecraft.world.World; +import net.minecraft.item.crafting.IRecipe; + +public class ShapelessDurabilityRecipe implements IRecipe { + private final ItemStack recipeOutput; + private final List recipeItems; + private final Item toolItem; + + public ShapelessDurabilityRecipe(ItemStack result, Item toolItem, ItemStack... ingredients) { + this.recipeOutput = result; + this.recipeItems = new ArrayList<>(ingredients.length); + for (ItemStack ingredient : ingredients) { + this.recipeItems.add(ingredient); + } + this.toolItem = toolItem; + System.out.println("[CinderLoE] Created ShapelessDurabilityRecipe for: " + result.getUnlocalizedName()); + System.out.println("[CinderLoE] Ingredients: " + this.recipeItems); + } + + @Override + public boolean matches(InventoryCrafting inv, World worldIn) { + System.out.println("[CinderLoE] Checking matches for ShapelessDurabilityRecipe"); + + boolean hasTool = false; + List ingredientsCopy = new ArrayList<>(this.recipeItems); + + for (int i = 0; i < inv.getSizeInventory(); ++i) { + ItemStack stack = inv.getStackInSlot(i); + if (stack != null) { + if (stack.getItem() == toolItem) { + hasTool = true; + } else { + boolean matched = false; + for (ItemStack recipeStack : ingredientsCopy) { + if (stack.getItem() == recipeStack.getItem() && (recipeStack.getItemDamage() == 32767 || stack.getItemDamage() == recipeStack.getItemDamage())) { + matched = true; + ingredientsCopy.remove(recipeStack); + break; + } + } + if (!matched) { + System.out.println("[CinderLoE] Ingredient did not match: " + stack); + return false; + } + } + } + } + + boolean matches = hasTool && ingredientsCopy.isEmpty(); + System.out.println("[CinderLoE] ShapelessDurabilityRecipe match result: " + matches + ", has tool: " + hasTool); + return matches; + } + + @Override + public ItemStack getCraftingResult(InventoryCrafting inv) { + System.out.println("[CinderLoE] Getting crafting result for ShapelessDurabilityRecipe"); + return this.recipeOutput.copy(); + } + + @Override + public int getRecipeSize() { + return this.recipeItems.size(); + } + + @Override + public ItemStack getRecipeOutput() { + return this.recipeOutput; + } + + public ItemStack[] getRemainingItems(InventoryCrafting inv) { + System.out.println("[CinderLoE] Getting remaining items for ShapelessDurabilityRecipe"); + ItemStack[] remainingItems = new ItemStack[inv.getSizeInventory()]; + + for (int i = 0; i < remainingItems.length; ++i) { + ItemStack itemstack = inv.getStackInSlot(i); + + if (itemstack != null && itemstack.getItem() == toolItem) { + ItemStack tool = itemstack.copy(); + tool.setItemDamage(tool.getItemDamage() + 1); + System.out.println("[CinderLoE] Damaging tool: " + tool.getUnlocalizedName() + " | New Damage: " + tool.getItemDamage()); + + if (tool.getItemDamage() >= tool.getMaxDamage()) { + System.out.println("[CinderLoE] Tool is out of durability, breaking: " + tool.getUnlocalizedName()); + tool = null; + } + + remainingItems[i] = tool; + } else if (itemstack != null && itemstack.getItem().hasContainerItem(itemstack)) { + System.out.println("[CinderLoE] Consuming non-tool item " + itemstack.getUnlocalizedName()); + remainingItems[i] = itemstack.getItem().getContainerItem(itemstack); + } else { + remainingItems[i] = itemstack; + } + } + + return remainingItems; + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/blocks/EntityBarrier.java b/src/main/java/com/zivilon/cinder_loe/blocks/EntityBarrier.java new file mode 100644 index 0000000..aed9edd --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/blocks/EntityBarrier.java @@ -0,0 +1,84 @@ +package com.zivilon.cinder_loe.blocks; + +import com.zivilon.cinder_loe.util.Utilities; +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.util.IIcon; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import java.lang.reflect.Field; +import java.util.List; +import net.minecraft.client.Minecraft; +import cpw.mods.fml.common.FMLCommonHandler; + +public class EntityBarrier extends Block { + @SideOnly(Side.CLIENT) + public IIcon transparentIcon; + + public EntityBarrier() { + super(Material.rock); + setHardness(Float.MAX_VALUE); + setResistance(Float.MAX_VALUE); + setBlockTextureName(Utilities.toSnakeCase("lotr:entityBarrier")); + setBlockName(Utilities.toSnakeCase("lotr:entityBarrier")); + } + + @Override + public boolean isOpaqueCube() { + return false; + } + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public int getRenderType() { + return -1; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + this.transparentIcon = iconRegister.registerIcon("lotr:invisible"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + return this.transparentIcon; + } + + @SideOnly(Side.CLIENT) + private boolean isPlayerInSurvivalModeClientSide() { + EntityPlayer player = Minecraft.getMinecraft().thePlayer; + return player != null && !player.capabilities.isCreativeMode; + } + + @Override + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { + if (FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT && isPlayerInSurvivalModeClientSide()) { + this.setBlockBounds(0.5F, 1.0F, 0.5F, 0.5F, 0.0F, 0.5F); // Zero-sized bounding box for survival players + } else { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); // Full-sized bounding box for others + } + } + + @Override + public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB aabb, List list, Entity entity) { + if (entity instanceof EntityPlayer) { + return; + } + AxisAlignedBB boundingBox = AxisAlignedBB.getBoundingBox(x, y, z, x + 1.0F, y + 1.0F, z + 1.0F); + if (boundingBox != null && aabb.intersectsWith(boundingBox)) { + list.add(boundingBox); + } + } +} 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..a5cc3d5 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/blocks/IceCage.java @@ -0,0 +1,200 @@ +package com.zivilon.cinder_loe.blocks; + +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); + } + + @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.emptyIcon; + } + 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 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..7ad60e4 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/blocks/ShadowTile.java @@ -0,0 +1,44 @@ +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 cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +import java.lang.reflect.Field; + +public class ShadowTile extends BlockPressurePlate { + + public ShadowTile() { + super("lotr:shadow_tile", Material.rock, BlockPressurePlate.Sensitivity.players); + try { + Field tabField = LOTRCreativeTabs.class.getDeclaredField("tabMisc"); // Stupid workaround because ForgeGradle tries to obfuscate field LOTRCreativeTabs.tabBlock when it's not supposed to + LOTRCreativeTabs tab = (LOTRCreativeTabs)tabField.get(null); + setCreativeTab((CreativeTabs)tab); + } catch (NoSuchFieldException | IllegalAccessException e) { + e.printStackTrace(); + } + setBlockTextureName("lotr:shadow_tile"); + setBlockName("lotr:shadowTile"); + } + + @Override + public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) { + if (entity instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer)entity; + player.attackEntityFrom(new DamageSource("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/ModelNex.java b/src/main/java/com/zivilon/cinder_loe/client/model/ModelNex.java new file mode 100644 index 0000000..2c5d794 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/client/model/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/RenderNex.java b/src/main/java/com/zivilon/cinder_loe/client/render/RenderNex.java new file mode 100644 index 0000000..286829b --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/client/render/RenderNex.java @@ -0,0 +1,134 @@ +package lotr.client.render.entity; + +import com.zivilon.cinder_loe.client.model.ModelNex; +import com.zivilon.cinder_loe.entity.Nex; +import lotr.common.entity.LOTRRandomSkinEntity; +import lotr.common.entity.npc.LOTREntityBalrog; +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/block/RenderIceCage.java b/src/main/java/com/zivilon/cinder_loe/client/render/block/RenderIceCage.java new file mode 100644 index 0000000..a52b040 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/client/render/block/RenderIceCage.java @@ -0,0 +1,76 @@ +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 + + GL11.glPushMatrix(); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + + // 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); + } + + GL11.glDisable(GL11.GL_BLEND); + GL11.glPopMatrix(); + + 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/projectile/RenderWarDart.java b/src/main/java/com/zivilon/cinder_loe/client/render/projectile/RenderWarDart.java new file mode 100644 index 0000000..86bef56 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/client/render/projectile/RenderWarDart.java @@ -0,0 +1,53 @@ +package com.zivilon.cinder_loe.client.render.projectile; + +import com.zivilon.cinder_loe.entity.projectile.EntityWarDart; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.util.ResourceLocation;import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import org.lwjgl.opengl.GL11; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.ItemRenderer; + +public class RenderWarDart extends Render { + + protected ResourceLocation getEntityTexture(Entity entity) { + return TextureMap.locationItemsTexture; + } + + @Override + public void doRender(Entity entity, double d, double d1, double d2, float f, float f1) { + EntityWarDart dart = (EntityWarDart)entity; + GL11.glPushMatrix(); + GL11.glTranslatef((float)d, (float)d1, (float)d2); + GL11.glRotatef(dart.prevRotationYaw + (dart.rotationYaw - dart.prevRotationYaw) * f1 - 90.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(dart.prevRotationPitch + (dart.rotationPitch - dart.prevRotationPitch) * f1, 0.0F, 0.0F, 1.0F); + GL11.glEnable(32826); + GL11.glRotatef(-135.0F, 0.0F, 0.0F, 1.0F); + GL11.glTranslatef(0.0F, -1.0F, 0.0F); + float scale = 0.6F; + GL11.glScalef(scale, scale, scale); + GL11.glTranslatef(0.0F, 0.8F, 0.0F); + + if (dart.item != null) { + IIcon icon = dart.getDartIcon(); + if (icon != null) { + Tessellator tessellator = Tessellator.instance; + float minU = icon.getMinU(); + float maxU = icon.getMaxU(); + float minV = icon.getMinV(); + float maxV = icon.getMaxV(); + int width = icon.getIconWidth(); + int height = icon.getIconHeight(); + bindTexture(getEntityTexture((Entity)dart)); + ItemRenderer.renderItemIn2D(tessellator, maxU, minV, minU, maxV, width, height, 0.0625F); + } + } + + GL11.glDisable(32826); + 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 b5cdad5..abd5c93 100644 --- a/src/main/java/com/zivilon/cinder_loe/coremod/LOTRMaterialTransformer.java +++ b/src/main/java/com/zivilon/cinder_loe/coremod/LOTRMaterialTransformer.java @@ -67,7 +67,10 @@ 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); // 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 7df320c..8a31da6 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", "swordBree", "maceArnor", - "daggerAsh","bowAsh","hammerAsh","pikeAsh","battleaxeAsh","swordAsh","spearAsh", "staffAsh"); + "daggerAsh","bowAsh","hammerAsh","pikeAsh","battleaxeAsh","swordAsh","spearAsh", "staffAsh", + "firstAgeGlaive"); } return basicClass; } diff --git a/src/main/java/com/zivilon/cinder_loe/entity/Nex.java b/src/main/java/com/zivilon/cinder_loe/entity/Nex.java new file mode 100644 index 0000000..431f2db --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/entity/Nex.java @@ -0,0 +1,117 @@ +package com.zivilon.cinder_loe.entity; + +import java.util.UUID; + +import lotr.common.entity.ai.LOTREntityAIAttackOnCollide; +import lotr.common.entity.npc.LOTREntityNPC; +import lotr.common.fac.LOTRFaction; + +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.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.util.DamageSource; +import net.minecraft.world.World; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; + +import com.zivilon.cinder_loe.CinderLoE; + +public class Nex extends LOTREntityNPC { + public AxisAlignedBB collisionBox; + public AxisAlignedBB hitbox; + public int phase = 1; + public ChunkCoordinates currentFlightTarget; + public EntityPlayer playerTarget; + + public Nex(World world) { + super(world); + setSize(1.5F, 3.0F); + ((EntityLiving) this).tasks.addTask(2, (EntityAIBase) new LOTREntityAIAttackOnCollide(this, 1.3D, false)); + ((EntityLiving) this).tasks.addTask(5, (EntityAIBase) new EntityAIWander(this, 1.0D)); + ((EntityLiving) this).tasks.addTask(9, (EntityAIBase) new EntityAILookIdle((EntityLiving) this)); + addTargetTasks(true); + } + + protected void entityInit() { + super.entityInit(); + this.dataWatcher.addObject(31, Integer.valueOf(0)); + } + + protected void applyEntityAttributes() { + super.applyEntityAttributes(); + getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(1000.0D); + getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.2D); + } + + public int getPhase() { + return this.dataWatcher.getWatchableObjectInt(31); + } + public void setPhase(int i) { + this.dataWatcher.updateObject(31, Integer.valueOf(i)); + } + + 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; + } + + public void onLivingUpdate() { + super.onLivingUpdate(); + if (rand.nextBoolean()) + ((Entity)this).worldObj.spawnParticle("chill", ((Entity)this).posX + (rand.nextDouble() - 0.5D) * ((Entity)this).width, ((Entity)this).posY + rand.nextDouble() * ((Entity)this).height, ((Entity)this).posZ + (rand.nextDouble() - 0.5D) * ((Entity)this).width, 0.0D, 0.0D, 0.0D); + } + + protected void dropFewItems(boolean flag, int i) { + return; + } + + protected String getHurtSound() { + return "lotr:wight.hurt"; + } + + protected String getDeathSound() { + return "lotr:wight.death"; + } + + public void attackEntityWithRangedAttack(EntityLivingBase target, float distanceFactor) { + // Do nothing + } + + @Override + public ItemStack getPickedResult(MovingObjectPosition target) { + return null; + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/entity/projectile/EntityWarDart.java b/src/main/java/com/zivilon/cinder_loe/entity/projectile/EntityWarDart.java new file mode 100644 index 0000000..adcbc38 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/entity/projectile/EntityWarDart.java @@ -0,0 +1,159 @@ +package com.zivilon.cinder_loe.entity.projectile; + +import com.zivilon.cinder_loe.CinderLoE; +import com.zivilon.cinder_loe.items.WarDart; +import lotr.common.entity.projectile.LOTREntityProjectileBase; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.DamageSource; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; + +public class EntityWarDart extends LOTREntityProjectileBase { + + public static int POSITION_WATCHER_ID = 20; + public static int ITEMSTACK_WATCHER_ID = 18; + + public int xTile = -1; + public int yTile = -1; + public int zTile = -1; + public Block inTile; + public int inData = 0; + public boolean inGround = false; + public int shake = 0; + public Entity shootingEntity; + public int ticksInGround; + public int ticksInAir = 0; + public int canBePickedUp = 0; + public int knockbackStrength = 0; + + public ItemStack item; + public int damage; + + public EntityWarDart(World world) { + super(world); + } + + public EntityWarDart(World world, EntityLivingBase thrower, ItemStack item) { + super(world, thrower, item, 3.0F); + this.item = item.copy(); // Store a copy of the item stack + this.item.stackSize = 1; + this.damage = WarDart.getDamageFromMeta(item.getItemDamage()); + } + + @Override + protected void entityInit() { + this.dataWatcher.addObject(17, Byte.valueOf((byte)0)); + this.dataWatcher.addObjectByDataType(ITEMSTACK_WATCHER_ID, 5); + this.dataWatcher.addObject(POSITION_WATCHER_ID, ""); // Test adding object with ID + } + + @Override + public void setThrowableHeading(double x, double y, double z, float velocity, float inaccuracy) { + float f2 = MathHelper.sqrt_double(x * x + y * y + z * z); + x /= f2; + y /= f2; + z /= f2; + x += this.rand.nextGaussian() * 0.0075D * inaccuracy; + y += this.rand.nextGaussian() * 0.0075D * inaccuracy; + z += this.rand.nextGaussian() * 0.0075D * inaccuracy; + x *= velocity; + y *= velocity; + z *= velocity; + this.motionX = x; + this.motionY = y; + this.motionZ = z; + float f3 = MathHelper.sqrt_double(x * x + z * z); + this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(x, z) * 180.0D / Math.PI); + this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(y, f3) * 180.0D / Math.PI); + this.ticksInGround = 0; + } + + @Override + public void onUpdate() { + super.onUpdate(); + + if (!this.worldObj.isRemote) { + this.dataWatcher.updateObject(ITEMSTACK_WATCHER_ID, this.item); + if (this.inGround) { + String posString = this.xTile + "," + this.yTile + "," + this.zTile; + this.dataWatcher.updateObject(POSITION_WATCHER_ID, posString); + } + } else { + this.item = this.dataWatcher.getWatchableObjectItemStack(ITEMSTACK_WATCHER_ID); + String posString = this.dataWatcher.getWatchableObjectString(POSITION_WATCHER_ID); + if (!posString.equals("")) { + String[] coords = posString.split(","); + this.xTile = Integer.parseInt(coords[0]); + this.yTile = Integer.parseInt(coords[1]); + this.zTile = Integer.parseInt(coords[2]); + } + } + + // Ensure proper synchronization of position + if (this.inGround) { + this.motionX = this.motionY = this.motionZ = 0; + this.posX = this.xTile + 0.5; + this.posY = this.yTile + 0.5; + this.posZ = this.zTile + 0.5; + } + } + + @Override + public float getBaseImpactDamage(Entity entity, ItemStack itemStack) { + return this.damage; + } + + @Override + public void writeEntityToNBT(NBTTagCompound tagCompound) { + // Do not call super.writeEntityToNBT to avoid recursion issues + tagCompound.setInteger("xTile", this.xTile); + tagCompound.setInteger("yTile", this.yTile); + tagCompound.setInteger("zTile", this.zTile); + tagCompound.setInteger("inTile", Block.getIdFromBlock(this.inTile)); + tagCompound.setByte("inData", (byte)this.inData); + tagCompound.setByte("shake", (byte)this.shake); + tagCompound.setByte("inGround", (byte)(this.inGround ? 1 : 0)); + tagCompound.setByte("pickup", (byte)this.canBePickedUp); + tagCompound.setByte("Knockback", (byte)this.knockbackStrength); + if (this.item != null) { + NBTTagCompound itemTag = new NBTTagCompound(); + this.item.writeToNBT(itemTag); + tagCompound.setTag("Item", itemTag); + } + } + + @Override + public void readEntityFromNBT(NBTTagCompound tagCompound) { + // Do not call super.readEntityFromNBT to avoid recursion issues + this.xTile = tagCompound.getInteger("xTile"); + this.yTile = tagCompound.getInteger("yTile"); + this.zTile = tagCompound.getInteger("zTile"); + this.inTile = Block.getBlockById(tagCompound.getInteger("inTile")); + this.inData = tagCompound.getByte("inData"); + this.shake = tagCompound.getByte("shake"); + this.inGround = tagCompound.getByte("inGround") == 1; + this.canBePickedUp = tagCompound.getByte("pickup"); + this.knockbackStrength = tagCompound.getByte("Knockback"); + if (tagCompound.hasKey("Item")) { + this.item = ItemStack.loadItemStackFromNBT(tagCompound.getCompoundTag("Item")); + if (this.item != null) { + this.damage = WarDart.getDamageFromMeta(this.item.getItemDamage()); + this.dataWatcher.updateObject(ITEMSTACK_WATCHER_ID, this.item); // Ensure DataWatcher is updated with the deserialized ItemStack + } + } + } + + + + + public IIcon getDartIcon() { + WarDart itemDart = (WarDart) CinderLoE.warDart; + return itemDart.getIconFromDamage(this.item.getItemDamage()); + } +} 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..27ae090 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/items/ToxicCore.java @@ -0,0 +1,12 @@ +package com.zivilon.cinder_loe.items; + +import net.minecraft.item.Item; + +public class ToxicCore extends Item { + + public ToxicCore() { + this.setMaxDamage(100); + this.setNoRepair(); + this.setMaxStackSize(1); + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/items/WarDart.java b/src/main/java/com/zivilon/cinder_loe/items/WarDart.java new file mode 100644 index 0000000..ff0a344 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/items/WarDart.java @@ -0,0 +1,150 @@ +package com.zivilon.cinder_loe.items; + +import com.zivilon.cinder_loe.entity.projectile.EntityWarDart; + +import lotr.common.LOTRCreativeTabs; +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 java.util.List; + +public class WarDart extends Item { + public IIcon[] icons; + + public WarDart() { + this.setHasSubtypes(true); + setMaxStackSize(4); + this.setMaxDamage(0); + } + + @Override + public ItemStack onItemRightClick(ItemStack itemStack, World world, EntityPlayer player) { + if (itemStack.getItemDamage() > 0) { + if (!player.capabilities.isCreativeMode) { + --itemStack.stackSize; + } + + world.playSoundAtEntity(player, "lotr:item.dart", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F)); + + if (!world.isRemote) { + world.spawnEntityInWorld(new EntityWarDart(world, player, itemStack)); + } + } + return itemStack; + } + + @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[14]; + this.icons[0] = iconRegister.registerIcon("lotr:war_dart_headless"); + this.icons[1] = iconRegister.registerIcon("lotr:war_dart_copper"); + this.icons[2] = iconRegister.registerIcon("lotr:war_dart_bronze"); + this.icons[3] = iconRegister.registerIcon("lotr:war_dart_iron"); + this.icons[4] = iconRegister.registerIcon("lotr:war_dart_orc"); + this.icons[5] = iconRegister.registerIcon("lotr:war_dart_dwarven"); + this.icons[6] = iconRegister.registerIcon("lotr:war_dart_uruk"); + this.icons[7] = iconRegister.registerIcon("lotr:war_dart_blue_dwarven"); + this.icons[8] = iconRegister.registerIcon("lotr:war_dart_black_uruk"); + this.icons[9] = iconRegister.registerIcon("lotr:war_dart_elven"); + this.icons[10] = iconRegister.registerIcon("lotr:war_dart_gilded_iron"); + this.icons[11] = iconRegister.registerIcon("lotr:war_dart_red_dwarven"); + this.icons[12] = iconRegister.registerIcon("lotr:war_dart_mithril"); + this.icons[13] = iconRegister.registerIcon("lotr:war_dart_ancient"); + } + + public static String getDartMaterial(ItemStack item) { + switch(item.getItemDamage()) { + case 1: + return "copper"; + case 2: + return "bronze"; + case 3: + return "iron"; + case 4: + return "orc"; + case 5: + return "dwarven"; + case 6: + return "uruk"; + case 7: + return "blue_dwarven"; + case 8: + return "black_uruk"; + case 9: + return "elven"; + case 10: + return "gilded_iron"; + case 11: + return "red_dwarven"; + case 12: + return "mithril"; + case 13: + return "ancient"; + default: + return "headless"; + } + } + + @Override + public String getUnlocalizedName(ItemStack item) { + return "item.war_dart_" + getDartMaterial(item); + } + + @Override + public int getMetadata(int damage) { + return damage; + } + + public static int getDamageFromMeta(int meta) { + switch(meta) { + case 1: return 3; // Copper + case 2: return 3; // Bronze + case 3: return 4; // Iron + case 4: return 5; // Orc + case 5: return 6; // Dwarven + case 6: return 6; // Uruk + case 7: return 6; // Blue Dwarven + case 8: return 6; // Black Uruk + case 9: return 6; // Elven + case 10: return 5; // Gilded Iron + case 11: return 6; // Red Dwarven + case 12: return 10; // Mithril + case 13: return 12; // Ancient + default: return 0; + } + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean advanced) { + int damageMeta = stack.getItemDamage(); + double damagePercent = getDamageFromMeta(damageMeta) * (1.0 / 8) * 100.0; + double roundedDamagePercent = 5 * Math.round(damagePercent / 5.0); + list.add(EnumChatFormatting.DARK_GREEN + "Ranged damage: " + roundedDamagePercent + "%"); + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/items/WarDartHeads.java b/src/main/java/com/zivilon/cinder_loe/items/WarDartHeads.java new file mode 100644 index 0000000..a581680 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/items/WarDartHeads.java @@ -0,0 +1,70 @@ +package com.zivilon.cinder_loe.items; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; + +import java.util.List; + +public class WarDartHeads extends Item { + private IIcon[] icons; + + public WarDartHeads() { + super(); + setCreativeTab(CreativeTabs.tabMisc); + setHasSubtypes(true); // Allows for different metadata values + } + + @Override + public void registerIcons(IIconRegister iconRegister) { + icons = new IIcon[6]; // 6 icons for 0 to 5 count levels + for (int i = 0; i < icons.length; i++) { + icons[i] = iconRegister.registerIcon("lotr:war_dart_heads_" + i); + } + } + + @Override + public String getUnlocalizedName(ItemStack item) { + return "item.war_dart_heads_" + WarDart.getDartMaterial(item); + } + + @Override + public int getColorFromItemStack(ItemStack stack, int renderPass) { + int damage = stack.getItemDamage(); + + switch (damage) { + case 1: return 0xCA6C40; // Copper + case 2: return 0xC28336; // Bronze + case 3: return 0xD8D8D8; // Iron + case 4: return 0x5D685A; // Orc + case 5: return 0x6B787A; // Dwarven + case 6: return 0x4C4D34; // Uruk + case 7: return 0x577287; // Blue Dwarven + case 8: return 0x444138; // Black Uruk + case 9: return 0xD0C9AC; // Elven + case 10: return 0xFFFFB0; // Gilded Iron + case 11: return 0xFFC48B; // Red dwarven + case 12: return 0xAFB3D3; // Mithril + case 13: return 0x033346; // Ancient + default: return 0xFFFFFF; // Blank + } + } + + @Override + public IIcon getIconIndex(ItemStack item) { + return getIcon(item, 0); + } + + @Override + public IIcon getIcon(ItemStack stack, int renderPass) { + int count = stack.stackSize; + if (count > 5 || count < 1) { + return icons[0]; + } else { + return icons[count]; + } + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/mixins/MixinSlotCrafting.java b/src/main/java/com/zivilon/cinder_loe/mixins/MixinSlotCrafting.java new file mode 100644 index 0000000..891d0e6 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/mixins/MixinSlotCrafting.java @@ -0,0 +1,94 @@ +package com.zivilon.cinder_loe.mixins; + +import com.zivilon.cinder_loe.util.DurableItemCrafter; +import cpw.mods.fml.common.FMLCommonHandler; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.SlotCrafting; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.entity.player.PlayerDestroyItemEvent; +import org.spongepowered.asm.mixin.Dynamic; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Overwrite; + +import com.zivilon.cinder_loe.CinderLoE; + +@Mixin(SlotCrafting.class) +public abstract class MixinSlotCrafting { + @Shadow + private final IInventory craftMatrix; + @Shadow + private EntityPlayer thePlayer; + @Shadow + protected void onCrafting(ItemStack p_75210_1_) {} + + public MixinSlotCrafting() { + craftMatrix = null; + } + + @Overwrite + public void onPickupFromSlot(EntityPlayer p_82870_1_, ItemStack p_82870_2_) { + FMLCommonHandler.instance().firePlayerCraftingEvent(p_82870_1_, p_82870_2_, craftMatrix); + onCrafting(p_82870_2_); + boolean hasExceptionItem = false; + int arrow_count = 0; + + for (int i = 0; i < craftMatrix.getSizeInventory(); ++i) { + ItemStack itemstack1 = craftMatrix.getStackInSlot(i); + + if (itemstack1 != null && DurableItemCrafter.exceptionItems.contains(itemstack1.getItem())) { + hasExceptionItem = true; + } + if (itemstack1 != null && itemstack1.getItem() == Items.arrow) { + arrow_count++; + } + } + + for (int i = 0; i < craftMatrix.getSizeInventory(); ++i) { + ItemStack itemstack1 = craftMatrix.getStackInSlot(i); + + if (itemstack1 != null) { + if (!hasExceptionItem && DurableItemCrafter.customItems.contains(itemstack1.getItem())) { + 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); + } + + if (itemstack1 != null && itemstack1.getItem().hasContainerItem(itemstack1)) { + ItemStack itemstack2 = itemstack1.getItem().getContainerItem(itemstack1); + + if (itemstack2 != null && itemstack2.isItemStackDamageable() && itemstack2.getItemDamage() > itemstack2.getMaxDamage()) { + MinecraftForge.EVENT_BUS.post(new PlayerDestroyItemEvent(thePlayer, itemstack2)); + continue; + } + + if (!itemstack1.getItem().doesContainerItemLeaveCraftingGrid(itemstack1) || !thePlayer.inventory.addItemStackToInventory(itemstack2)) { + if (craftMatrix.getStackInSlot(i) == null) { + craftMatrix.setInventorySlotContents(i, itemstack2); + } else { + thePlayer.dropPlayerItemWithRandomChoice(itemstack2, false); + } + } + } + } + } + } + + @Dynamic + public void damage_item(ItemStack item, int i, int damage, IInventory matrix) { + item.setItemDamage(item.getItemDamage() + damage); + if (item.getItemDamage() >= item.getMaxDamage()) { + matrix.setInventorySlotContents(i, null); // Item breaks and is removed + } else { + matrix.setInventorySlotContents(i, item); + } + } +} 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 e2d36e7..9109ae3 100644 --- a/src/main/java/com/zivilon/cinder_loe/recipes.java +++ b/src/main/java/com/zivilon/cinder_loe/recipes.java @@ -4,15 +4,22 @@ import cpw.mods.fml.common.registry.GameRegistry; import lotr.common.LOTRMod; import lotr.common.recipe.LOTRRecipePoisonWeapon; import lotr.common.recipe.LOTRRecipes; +import com.zivilon.cinder_loe.CinderLoE; +import com.zivilon.cinder_loe.recipe.*; + +import lotr.common.item.LOTRItemFood; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; import net.minecraftforge.oredict.ShapedOreRecipe; import net.minecraftforge.oredict.ShapelessOreRecipe; +import net.minecraftforge.oredict.RecipeSorter; +import net.minecraftforge.oredict.RecipeSorter.Category; public class recipes { + public static void registerRecipes() { // Register a block recipe System.out.println("[CinderLoE] Registering recipes..."); @@ -24,7 +31,6 @@ public class recipes { registerAngmarRecipes(); } - public static void registerGeneralRecipes() { GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.bowAsh), " XS", "X S", " XS", 'X', CinderLoE.ingotAsh, 'S', Items.string)); @@ -43,7 +49,60 @@ public class recipes { GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(CinderLoE.daggerAsh), "X ", "Y ", '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 })); + GameRegistry.addRecipe((IRecipe)new ShapedOreRecipe(new ItemStack(CinderLoE.spearAsh), new Object[] { " X", " Y ", "Y ", + 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" })); + GameRegistry.addRecipe((IRecipe)new ShapedOreRecipe(new ItemStack(CinderLoE.staffAsh), new Object[] { " XX", " YX", "Y ", + 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" })); + GameRegistry.addRecipe((IRecipe)new ShapedOreRecipe(new ItemStack(CinderLoE.pikeAsh), new Object[] { " X", " YX", "Y ", + 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" })); + GameRegistry.addRecipe((IRecipe)new ShapedOreRecipe(new ItemStack(CinderLoE.daggerAsh), new Object[] { "X ", "Y ", + 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(new ToxicCoreArrowsRecipe(new ItemStack(LOTRMod.arrowPoisoned))); + + 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.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))); + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(CinderLoE.warDart, 1, 3), new ItemStack(CinderLoE.warDart, 1, 0), new ItemStack(CinderLoE.warDartHeads, 1, 3))); + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(CinderLoE.warDart, 1, 4), new ItemStack(CinderLoE.warDart, 1, 0), new ItemStack(CinderLoE.warDartHeads, 1, 4))); + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(CinderLoE.warDart, 1, 5), new ItemStack(CinderLoE.warDart, 1, 0), new ItemStack(CinderLoE.warDartHeads, 1, 5))); + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(CinderLoE.warDart, 1, 6), new ItemStack(CinderLoE.warDart, 1, 0), new ItemStack(CinderLoE.warDartHeads, 1, 6))); + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(CinderLoE.warDart, 1, 7), new ItemStack(CinderLoE.warDart, 1, 0), new ItemStack(CinderLoE.warDartHeads, 1, 7))); + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(CinderLoE.warDart, 1, 8), new ItemStack(CinderLoE.warDart, 1, 0), new ItemStack(CinderLoE.warDartHeads, 1, 8))); + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(CinderLoE.warDart, 1, 9), new ItemStack(CinderLoE.warDart, 1, 0), new ItemStack(CinderLoE.warDartHeads, 1, 9))); + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(CinderLoE.warDart, 1, 10), new ItemStack(CinderLoE.warDart, 1, 0), new ItemStack(CinderLoE.warDartHeads, 1, 10))); + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(CinderLoE.warDart, 1, 11), new ItemStack(CinderLoE.warDart, 1, 0), new ItemStack(CinderLoE.warDartHeads, 1, 11))); + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(CinderLoE.warDart, 1, 12), new ItemStack(CinderLoE.warDart, 1, 0), new ItemStack(CinderLoE.warDartHeads, 1, 12))); + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(CinderLoE.warDart, 1, 13), new ItemStack(CinderLoE.warDart, 1, 0), new ItemStack(CinderLoE.warDartHeads, 1, 13))); OreDictionary.registerOre("vegetable1", CinderLoE.onion); OreDictionary.registerOre("vegetable1", LOTRMod.leek); diff --git a/src/main/java/com/zivilon/cinder_loe/util/DurableItemCrafter.java b/src/main/java/com/zivilon/cinder_loe/util/DurableItemCrafter.java new file mode 100644 index 0000000..ec08bcb --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/util/DurableItemCrafter.java @@ -0,0 +1,19 @@ +package com.zivilon.cinder_loe.util; + +import net.minecraft.item.Item; +import java.util.ArrayList; +import java.util.List; + +import lotr.common.LOTRMod; +import com.zivilon.cinder_loe.CinderLoE; + +public class DurableItemCrafter { + public static final List customItems = new ArrayList<>(); + public static final List exceptionItems = new ArrayList<>(); + static { + customItems.add(LOTRMod.chisel); + customItems.add(CinderLoE.toxicCore); + + exceptionItems.add(LOTRMod.ithildin); + } +} 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 167f904..613f923 100644 --- a/src/main/java/com/zivilon/cinder_loe/util/Utilities.java +++ b/src/main/java/com/zivilon/cinder_loe/util/Utilities.java @@ -1,6 +1,7 @@ package com.zivilon.cinder_loe.util; import com.zivilon.cinder_loe.client.render.item.RenderHelper; +import com.zivilon.cinder_loe.CinderLoE; import java.io.BufferedWriter; import java.io.FileOutputStream; @@ -16,8 +17,14 @@ import java.util.Vector; import lotr.common.LOTRCreativeTabs; import lotr.common.world.biome.LOTRBiome; +import lotr.common.item.LOTRItemArmor; +import lotr.common.item.LOTRMaterial; +import lotr.common.enchant.LOTREnchantment; +import lotr.common.enchant.LOTREnchantmentHelper; +import net.minecraft.item.ItemStack; import net.minecraft.client.renderer.Tessellator; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.server.MinecraftServer; @@ -122,4 +129,74 @@ public class Utilities { } } + public static EntityPlayer getPlayerByName(String player_name) { + MinecraftServer server = MinecraftServer.getServer(); + if (server == null) { + return null; + } + + for (Object obj : server.getConfigurationManager().playerEntityList) { + if (obj instanceof EntityPlayerMP) { + EntityPlayer player = (EntityPlayer)obj; + String found_name = player.getCommandSenderName(); + if (found_name.equals(player_name)) { + return player; + } + } + } + return null; // Player not found or not online + } + + public static boolean hasFireWeapon(String player_name) { + EntityPlayer player = getPlayerByName(player_name); + + if (player == null) { + System.out.println("[CinderLoE] Warning! Player not found: " + player_name); + return false; + } + + ItemStack held_item = player.getHeldItem(); + boolean has_fire = LOTREnchantmentHelper.hasEnchant(held_item, LOTREnchantment.fire); + return has_fire; + } + + public static int[] countNexArmour(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 boolean isArrayEmpty(int[] array) { + for (int value : array) { + if (value != 0) return false; + } + return true; + } + } diff --git a/src/main/resources/assets/cinder_loe/lang/en_US.lang b/src/main/resources/assets/cinder_loe/lang/en_US.lang index fc813f3..c3e5e57 100644 --- a/src/main/resources/assets/cinder_loe/lang/en_US.lang +++ b/src/main/resources/assets/cinder_loe/lang/en_US.lang @@ -100,6 +100,36 @@ item.lotr:banner.red.name=Red Flag item.lotr:banner.blue.name=Blue Flag item.lotr:banner.green.name=Green Flag +item.war_dart_headless.name=Headless Dart +item.war_dart_copper.name=Copper Dart +item.war_dart_bronze.name=Bronze Dart +item.war_dart_iron.name=Iron Dart +item.war_dart_orc.name=Orc Dart +item.war_dart_dwarven.name=Dwarven Dart +item.war_dart_uruk.name=Uruk Dart +item.war_dart_blue_dwarven.name=Blue Dwarven Dart +item.war_dart_black_uruk.name=Black Uruk Dart +item.war_dart_elven.name=Elven Dart +item.war_dart_gilded_iron.name=Gilded Iron Dart +item.war_dart_red_dwarven.name=Red Dwarven Dart +item.war_dart_mithril.name=Mithril Dart +item.war_dart_ancient.name=Ancient Dart + +item.war_dart_heads_headless.name=??? Dart Heads +item.war_dart_heads_copper.name=Copper Dart Heads +item.war_dart_heads_bronze.name=Bronze Dart Heads +item.war_dart_heads_iron.name=Iron Dart Heads +item.war_dart_heads_orc.name=Orc Dart Heads +item.war_dart_heads_dwarven.name=Dwarven Dart Heads +item.war_dart_heads_uruk.name=Uruk Dart Heads +item.war_dart_heads_blue_dwarven.name=Blue Dwarven Dart Heads +item.war_dart_heads_black_uruk.name=Black Uruk Dart Heads +item.war_dart_heads_elven.name=Elven Dart Heads +item.war_dart_heads_gilded_iron.name=Gilded Iron Dart Heads +item.war_dart_heads_red_dwarven.name=Red Dwarven Dart Heads +item.war_dart_heads_mithril.name=Mithril Dart Heads +item.war_dart_heads_ancient.name=Ancient Dart Heads + item.spawn_egg_fangornauroch.name=Spawn Fangorn Auroch item.spawn_egg_fangornbear.name=Spawn Fangorn Bear item.spawn_egg_fangornwildboar.name=Spawn Fangorn Wild Boar diff --git a/src/main/resources/assets/lotr/armor/nex_fire_1.png b/src/main/resources/assets/lotr/armor/nex_fire_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d07300c99b720fc4725b8a8aff8a8540bf854b4d GIT binary patch literal 5483 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 DO=t#2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/armor/nex_fire_2.png b/src/main/resources/assets/lotr/armor/nex_fire_2.png new file mode 100644 index 0000000000000000000000000000000000000000..7f7e021a18c5b1bbb74a44ba1189c599c4003157 GIT binary patch literal 4583 zcmeHKdsGzH8Q*2)DIyq=C=kXW7BHEe+1dA&jUcSD>e?+Jfm33botcFZc4yd~Wmjqp zrapk8Vq@y#kOn+L+GumC(o=j?mY5vlK@XC)=0wHPq*m&qpioI#YkFr`UMD%HhjW_$ z*xkGLyZ3(I?|%39efQg)I_vt?^CFf+NFSOxV|I=0bsosVD@=U<2AC`cqw#*V*g^YxcUd?NTV?%#Z z8)pCI=OuBmmB%-vuH0dLq5W=&>+id+9$m^*RxT`_8@2Vtg2dt`kB5t$(=|W3G&IE& zm-g^=bBn1V^x}Vf-oeVzsOY=P+HNE&GPKJJmd6~xKZ{KpsgK^d^hgpJaq3D@(fSX( zTl$jypPo(ad9-5m&OonABMVwk*>I>}hwp7)^(mX{R?4EHANJPv)Llf*Ko65Y-LUu1 zy13#+zP7T~Jokt2iTpD1x4VmaKdF1SHu7oJM%? zY$psclo5VeZNV&D7G1{VRJ-WB>h<|#bvdc0;1w@Lr27m2z(Ml_@zeBU}jbD2sK`kV>wSV~EMeRN?ST5m35|vKw-O&bTJ&yuue$8By6mQH^MMjhsOPL za2Cr1ywe?E0q}wP2o6=qG1TEer&_pqQxyOSIP|R+?)=RhjpovB*5e{+Qx)yxlcz#Z z%MWk>WXyA2^V zTAac(G=>rQ6ezRP%@a z6o?P4KKMpJgkI@I=*} zShj%cL=ilZP4F}Tov6e4<8}B2OliQz+!x?1EXCM2|1WLf@<8c8AA~%IafAIgi&JAa zDvz!l8;uPs81X7Wka#H!1UYsDH&I1XqMrb3Y>6x*oTW6V9)WZnpJ%=$6?7P>RoiF~ zKhlnaY{C?XUaQw2TBVYrFcPE%rJj!NX6?L}aM78ifJeX;NKf$>3Q83Nl{Q`5TSf~} z0E8i!7Evn33DX1!Ljwm!g_<#b;&k*IoTQ5iQ;H0*8=C{g3)Dh%q8J7^6Uxqa_zJ}0 zJKO<4&u%g!erM^LrE5kE%t(1QyJqQ{5d$+)p3ScR8(k5Tk5jZ0{0s7eho#7Ua|*zN zR)}rw>TF4n?cJ9wH`>WG@nQ_w0=w3_Zoi*I;mC-jx!-LM(vY&sV9SSav z-Clp@WUwi@@SMN0H#{MVQST39{&pkb>80m6`%|U9Iko;s;IrmWLpS}44sL55#9eK5 zhvUO)l>HrW)KH&a$>rTnj^5U?a<%_P@SBpsjMT1>q2S0GQ-6HUsx8g;gWp@05!n>< z4lcXy-{yJ#x__TK*|zq;EvdVt>S%Xj_?|y_O7cdKtLSOjli>b213`NiTt2q;K~31@ zGrX$L`rIr3THILGPG70X*B;;VyW$oH>3`Lg`!hOXepF!neRlGy*+$zJTc_bB69TSwOc zkEMRU(-!WFN$HdQzUiyD;5h#~d@ZdniTAyAWuJ^9s(p$*+%j~?STKJMyBd?4*U zxzm6AneI1VZI^xTX~(^q?wE_qmQ^JT{b*}%=VwXon++W?yWgq-A(EI)>$BfqS@Onz E0k`Zz3jhEB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/armor/nex_ice_1.png b/src/main/resources/assets/lotr/armor/nex_ice_1.png new file mode 100644 index 0000000000000000000000000000000000000000..ea6891aad7644bf228e216d025bdb69c1d0708fe GIT binary patch literal 5721 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 ue_P4yS$^LB-#%zvP;>0CJ87u}v z60`ygfTq9?5&$V3G=W!!f$Ssjg?vH37qoC7b2?m$7A)iY{XmZK%D)7%$g9KINCiGn z5a_!=!+;zC`nN!%8>ja=4P@?F!GC@SOxA+YOrK>inqW*UMa41|utzbu22Ih(q%bDa zU0pP`ZlS9w2x7aQZ`Wp@OJDc?&+~hQk^V0= zt*{)sT^1Et^Xo05C-<0=2kw1gO5=Yn6M3k%w-uaWl^(9@kwT?)?KZS&r`zPq5 z5+`;Udi4AKKX}Z#$7(#mq4%EX`+U7LJte6yDeNG2Ei!R(U+CVr!?8p_|E1#M+_UZ- z*W=H8GAJ5;kmmVvl0qHzoT#udx)*?H#=`6tS;VsrD?eN1LR$JBL0&ttzW33 zN>;Od6}|bc^TOi=6~rG}im&{&`Djyor_FS_ZKCMTsrQQ|TZ$jP{>`3SUB^$IukF-j zmkC~Oi_6eQ#)x`e6#Zs-qB3tF)-w_E?#_;qq?5`sf0njljOgvyZ$fsutG-M~ICaFa zZe&MIS8EtNuu5L}%ERYJRV_b){~cJe7TI+&_@f=aD6OK~+`JjO1~EPA93C9}?79DVa{7m2 zFCKSZj5<2`8puJGE+}G(j5!*@ZWZIC-AsvDtAh&|l$ypmaH5K0U^7)t+qA;5!66|` zlUm_cg%LG6bW{bMUGJpw>vIc;`YJ+A3ez?Pq_P?SV5JxwX06pWmxk2}d0Y*UxoL?I z=2e&~t*{8>kMiD(r*I~j<0dT65v}p1&pYlS0kycp2Fb<7G;&!{mZkgEb zESE^tYPAH#Bp8MO4aBwG#^5YsbH#HI(-@hQi*V8ohPK;a4ih)qYZ1;}2Y$)~OgmA_xo61K3c39?q@AEi4KFHWQni9iArXZ_sYK)!)Pk551cAs& zvqFti3fzKO=0O>3E(W&|6bA*s#WcV%<8mTJE~OBq8Z#qu6eSV0OlC$>aGb;m8A)1{ z_&kVboixZwyn4P@925zlq-H{fp%x_~#pM(t$4LdElFFor45ctaE>)`tO9~G~5}K#% zPAd+=Nn7!9O5(7U^9vl|nhcXcE5yX;+>EIjXDq-#E6ky7wd~wN0d1x78JuHNnu1|+ zMT$ZpRbmPt%_$X9P8Y~T4wJ8){0bKq4LA%S7U%L50PyqREE=7Y!Wp}>z;3VB3TLbC z?6MJDClY7yOq`(r=xiM>n5o0bs7!-SyU)QH?Idm4{=c-j%LAtZeGu|&+6DIC&QDF> zsC=qsdNe((runM`!~CVt;KcM1TzDNt@_quW=_R59x0O?%dU(@yW}g0@RIpGMkPRSU zN?Z<7flx^ivs!IID8iy3P*jCdgn1#l%Wh%ZxRc5#2Rs6gB?Lz=6u>ymz_|j`S7wsvfn( zy?T+vI&yx@cOShMceQ2T*>L5^0r;IR=y6BbKRVVc?hhV=(yljUzB1tX+-KR1)AzU8 z1#gOwb~NzrgC0@Y#=ypNX!zZ~ha7kvHg0@W{pPi@7lfn7ijPPC)SPvx@1dXm)Bg37 zx0BEG6mB-B>#n}%H&m4&N<_PRp9qcmnV@uY<;QYAA3@n4OPOU6Z1VV;K>yA+qQ(S| zTQ-@3He9ay>Ow=QC+F+K$?2ibjRx<^9gb1%7+M)Ju6p|Eh`3M_d1QBc-50mF`AAZ? z>AKHf4OKbGOYyrKbj{bJo8)IQ9f_7(jMNWNq>#ddJ2RlDq^=w*F_u-B0<0_vpebbtD_V+&D?wjr=H zs_WlqZ@OQYVPXbS62AQ`(lIf7bi??CTjb#6=rs(?438#+-y99e@>IrvC_x5&Zsyxh Hmc962X{AA+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/armor/nex_toxin_1.png b/src/main/resources/assets/lotr/armor/nex_toxin_1.png new file mode 100644 index 0000000000000000000000000000000000000000..ff4c2bacb6640fb207d2d29c37a7acb038aede8a GIT binary patch literal 5286 zcmeHKX;f3!7QO+LNd^@VOD)&Xr=W(6Bq1gY5`7Z-HRtqEo!2-wv41gxV3?cx@ z4>ZD<3ag~s4eSR6VPrqMYxFAkLj{1b{^ zM`S?iDIJu7_|l~T0il9`09d6~N~AIjf^>x&b9uo(`n_MbHoS!BXud7WLUQC@>@3H` zZzA27WP~oPcoeICxV`o8TxnvWLyWcUrbSV6VhWRzRE}mp*xARK&kvmC@pQA`VBik( z`rmch-oyc0`$vB(ZJ$H+V=ahUFnu5Gx}(SQ&+Iej9m0ygG4*91x^_E+0TeZ8s z&v)S0u1jjBsmYAQ9eGh1y8XJ8a*_J>e5dG@m$LMq)|1Y_PuD+SMqj%8X<3$Az9O_H=jrPEXX~QLk)KCT*^=ZBG5-lLTq5TanhKvQi;^^nt3%bQ(ABvy#fNoYEY< zX>Z(fVRTWiQ`aXiQWARZKPLo-uWEF;d)MBX6xyG!udcqaVR&G9`FYpIlj_D14Za;=+d;)-OoqvUss?zazTwhv<0dQ&6vRp8Dx(!3`wdN8DtS%T8?hNyjN6$U2r!?( zeM5VE??z>yB@}Y_N^z1QJOQ6aH2CMBO0g8>7)5Wogv~%CUL-M{hLIR_ltS{Rick`T zDM47M#G6fHAd{d33Js1Z#FzmJfO|>-4u#DSV^naMUfxtHiQ&x3bGQBO^(U{g#sv)%|cOxzPm)f=hq_kGNc_NYcGth>*&$a2zqP zNoCP!3@?@!l}%@|80<;bQJ7i-GSPr(ter-4!?AF{W&p8>Ax{B-aUSf26QITrT&a#w zDrG$4MAe;G7J}=9A~?cFa14M>)ZvKnI=qlV=TJriFu)0ws8q84e`y;o56lJn;K+le z8sLAuaccBNg=2}MqtT&EYP?D?Y`hd4L_E3$4U&wZ#yA1i=#n@dQN&@OdW@y(_`LK_ zQbB@HF}gR4MWQpAED{4`21&#~y-27S!~t(4zo*Z++!tJkkn zm;(F@(t?+zJ@c7P;6-byXju>+GJ#$}5YOdiADFRJ1xITj$QHbY+tv^sEjd{WCe3ky zFwnfq+|^K=M@qt^Rvj$|3qs&4hZdiR*wC9L@ z*e8AI>Gn_RxAI+eKU;@ck^Qr*=7z5PCE{zhzR%e$*HPWIs_GYYan(n=U6Hj4{o>p0 zgFPcJTP%u~I+jf1-&SJEn$J(vx;Y00Urn=pvcf98$5g-iCDjRXNDD8r92Sn+9{^7W$y)9PCrRe_$Hk-%-4y=>l!IymLAs zqma8v9X$S9Nr5di*j)YFAzpV;cX`?6C0Stuwhywu$lGYsvDYJ6=C5jB zKJ-ybOKxL-+PsE>{+)+THj;u)NNoK4%tqwqyOch*u}*h8I9=PC{d4`=S~E}D}ARq*DYb}DP%?{UTC2I1?@aAPOo`E6JF}()@59`zG`!0 zKk6IHFXnGJ{1LBYt?&P2zBUz)TY7`nK&XU(^*j6VGFgENZcE6;8y??oPU6Sbj> zmjo6>nIj~0IQu<_SSMNiv{%qN@^q(xZIu_K|=^b+-TU`qi z8tR$7hr1UMhLf|h{SKrpD%jNy3r)psR?Gtm)^9wr#jZ8Jt8662vc`h!`+Vh=m?^(s zKi6bldSP+Y;Gh-K9aKBhv?H_gh1%-y_gl)2*Q}X#&;1`kJ@!LELoK!q8;)&oLmqYa z9ZbT%m+f;5Bk0d(QPIpxLd@@dN~wm;6%E~AHa1=ep4_boW5OP$vQDhwnD4B;PJ H61(+3f-$C( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/armor/nex_toxin_2.png b/src/main/resources/assets/lotr/armor/nex_toxin_2.png new file mode 100644 index 0000000000000000000000000000000000000000..f3d9ed22efec2f0085b8eb92510005ac2db9712a GIT binary patch literal 4583 zcmeHKdsGzH8J`6rFF|4j1WXy17#5P*-I;xlth|M7T(SXFh?FopGrK#1eXu*YE9GGz zDEI=6Cs9NXNtC2HiH*^=JUmJw#_DN`Gzp$qtE6cPS|UZUrZK6#Gc2#uoYTWO&40|E zyZ5{Ie&6qY_xFAG+npvuPF6@zbPxnVA-e30T+pY01_vwx->)C8c?oov=>nZer%Qwa zzyN3p{2&34Qa}@UWf;gl0$<1%^xHsN3S>@)Yte#7_@oDC}QfkHsv z1{wzBWuSi>G-mtcUT1*JJpugZJzx?AMpJ#3PH%uQF)9_y)WBYf$#JO)m!U8w!!ZSr z!Ty5w8IL%mVd-Eh@b4uiJ>8&7Plp{&yNM~IA;{BKy;qxkE@j2}=ktyU!~N?U159uI zr6e-E{GIipvzN{!XwC1S|j}^65R5-%@K3EcF_K(kuOc<}# zy_UJl|HAhk_gMM;(6C#pI{x$+nxabFkof4U*yrI16Fb7Tt$aO}3_AI7VPVdP?y5h> z^+fqorM+O1-OvKwi!$Lin$1|=nX90XZPv#^miGd8Votmmu{W+<(2 zqe3s$JJM+jlU?bg^D1-l$;whvLkW}D1SNTJ0AQtA0`^$TY%biR74o<^khy7z5aw0b zQmwE6o#l{jI#O8|QASN*~Xcy^Z94uqE!5k)Gv{$fNp%ARYQ~p^Udi^xK z&E;hQ@FDRK4hbrjN~~7NYzr5gxfy_X9r{5FSN;|UEy<-__6jFSXKto#Y}{-Jik!B0 zR5;7{<4~l8E~BkL)dhA%=WNN{xM>TH0yATE@K%8AIhrhEnjveBZ`=xhoY{^5^J&~U z+EZuem4TLCk7wA)3eG)UhE~Y!k5hJ%p>SSAY09J`<#I$#qB2Boq=2N9(g;c$6&R_Z zWh8~og3{SsEMX&Q4hn#a8GwVyXD z1WRNPEDb=X>u~;59ez?O!=;n%b8vb)#hAAIFKzDfz)3(Kggl#Zf&I7eQHC!J~rJOZvjdh)+eu!s*-!dz{)h329F2t%X* z6`dkX?Ild&J+OqU8B-@tlKdAZNxZ_WA_MFu=RolSwNNr$485FjW#>nHys`KZcL2}} zo6L*f1-cgKnim7}QeMce1-j^PwTE;cP;PNVN9x5BmBVqE+uSE*W}|T;H^M;}g+Rc;BVYk^O@aeII>#RBHa@ z$j!eh@49bqJ@nG+!LnZffcn6cpy{`EA~Dd)T!%cD?v=LFB~e zwib6!+Hgwnf%Abszj;CO{k>ma_1nn~*jJ}m>i6CVx$}Ue`qMwD?>&+QAC?DP?ajKT z!_iHFwbgGa1%%Le=+ml0mwxqk=nqdd{^pVJt3t)58-nD2J$#T@^zGJQ`SSzoSG`=) zs@W9y@a@$@{o5n)q4IN`k0-DA3NP7N``MMz$ZuNTjSIW@*&z@jNSB$DaXhW0?mzKg BIn)3E literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/blocks/ice_cage.png b/src/main/resources/assets/lotr/textures/blocks/ice_cage.png new file mode 100644 index 0000000000000000000000000000000000000000..cfdeb25c955afd2099d9a567fc89fb94311b4011 GIT binary patch literal 5790 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/blocks/invisible.png b/src/main/resources/assets/lotr/textures/blocks/invisible.png new file mode 100644 index 0000000000000000000000000000000000000000..3ccb57415c7f8ede6a70b30a20199953f543e7b8 GIT binary patch literal 567 zcmV-70?7S|P)EX>4Tx04R}tkv&MmKpe$iQ>7vm5j%*8WT;MdQ4!s06^c+H)C#RSm|XfHG-*gu zTpR`0f`cE6RR;V+0880*#vEd>=bb;{*sk16O*>U#SDrpQP7X zTJ#9$-3BhMTbi;5TeSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{000k3L_t&-(_>&51q=)f3;+QL00G208HoS@002ovPDHLk FV1mRi-HHGJ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/blocks/shadow_tile.png b/src/main/resources/assets/lotr/textures/blocks/shadow_tile.png new file mode 100644 index 0000000000000000000000000000000000000000..30d8fdf745e4cbec6281606b7092ecdb61ef9471 GIT binary patch literal 464 zcmV;>0WbcEP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv0003$NklG>KYcEs)4O=@X;)TiS zmvJ$qQ{YgVWb9u7Z8^LQwiWqA|{<3kd$Tb zbS{6ssQTWhiDIz0EXSZ*3b3uB7l#3?u4}sj4!>G)+x8Eb1DcJC>U|pk0000!???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< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/items/large/firstAgeGlaive.png b/src/main/resources/assets/lotr/textures/items/large/firstAgeGlaive.png new file mode 100644 index 0000000000000000000000000000000000000000..4401d3cd76489eca6bf3d209978925f85c75ff3b GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/items/toxicCore.png b/src/main/resources/assets/lotr/textures/items/toxicCore.png new file mode 100644 index 0000000000000000000000000000000000000000..3033850e884d47114060939f05448c6f53f4b0ab GIT binary patch literal 6394 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/items/war_dart_ancient.png b/src/main/resources/assets/lotr/textures/items/war_dart_ancient.png new file mode 100644 index 0000000000000000000000000000000000000000..ace2df4fc9f3dcfcacc7fb29bd86d1745fb75fbf GIT binary patch literal 4383 zcmeHKdvFuS89zb5j$)ISG1!p!=1fvUa=M3Jr;BCBksMpp0)rhe9jEc?Zco12(uvdA zmN8HQ43BBagTUlbHza@)CNz*VNyo${;NcOIM@b;Sgtm!+HZ^SqQ)~h$&A59fS+=K{ z>3Amj&(iGe?zi9f+i!p0x1V$y%jcD(o3qUrhNb&Ty$ex)o8D3i=G(noCn=q5EgPLi?c!FsnHWA6zp>_uv>pFVNHcc}6U!(Di#CQuD=OuJ>8^$yN zOGkYxYAhOOp#C+~qPsTUK;jDM`9;@fi^a+l|7zvpT~noR7H~OA%?|TS3K=5J@nwrBac=_U;xa#{rM$F zTW8(#>C)wYIrRRSj=balSbpjFr+dG;fAV$j`RUfO-^A9$q>~P=@6PpA3l?oWzVRnz z@8bW;Ju~&mFS%*enK7xm?A5O}dJYF(-n7*r6<6fGc<+?mFU@|SH>K3ci?=XLVA z+?tvh?d@UtgS#X9CZ@Twem}co^R`!>IzF*4IN)DWb2+p3(f(z1mo5yLN-Gv0o6*yA z+lGw1mi>o1TF$oIxK{Soft;Rf^+a2CXaMD4Os=fbs{CcVpoAmH}vU!!lvO2*f5`_ik{1}e_LQn&E zEL0zk@-a7I;PPm!izxy(RJ1xbQHAozqo@$KS!@=XERM;IEKy*_^Hove7kVE~K%kkM zsMWLxPf<-xO_nCBMNxwk<8rwunx$BlL>gqYIjn&g8II=a5OEAIj0&n8(PSlz>zE** zG-z&uKevQJR`84U;v> zH+{u8&PYd)c@lS&_R!f4Wu)cz^Ik=0(B1QS-GshBFDim8^2Sh-1S#O80coQp^away zByid}QkOd90BDEM>P-@pbmw=Ei%Fp9UKr`4m;^^NCIhd*(DONKq3PW+F1^Y z0Eof}i216FvJ%vf^h$>kbttRD>0&t>Njqs;hYFB@LoRUu1e_3B8K>Q9K#2nXu%d?J)>A3qkoL>=TsrmnD>z4=5NBSt_rE(PQ-)xBDH>v_IjnCrK zdfB*2IBr}D9tiOxL_s5r#~WeAmxNjn4nkBt66rc5m%k?!oG!c7!OAe#3ePhFHG8ynQ!Uh^fCxhwLRy(2 z!ng!sRN}ytUNeSHoKO7^C;5iLh$4gR;xbgcP%WgA#W2Ac^7qI5Bx3PnZh_AyKE#TU5z?cxv;T z<{~hC-L^q-M@HLcppbv2>tgl#Bk5Ib)$6~boITkeJ$9_-0cK7{)|ReW1t+ueT!T#W zwZH#!#kPX$%+ah}_EQ-jJ~#KbH&m&!^Nkm8#kjkAD|6D$-ZRi%w09b2UUDw)vOR2n zZf|4n$Da9r`nrF|!85>lI`8tS&#!FjI{mY$w>LbVzG_45=2>e&_pUE<-`QW)ci@F@ z3c4;Fv)%aO+F4@z>9fnvSD$-!@!j)Z*%?(!ysfVlns&@pO1LZ+IwywtisyOvJXEv# Ezqg0+)Bpeg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/items/war_dart_black_uruk.png b/src/main/resources/assets/lotr/textures/items/war_dart_black_uruk.png new file mode 100644 index 0000000000000000000000000000000000000000..1bbe9f1d900d9a1865c97d21cacc09d7fd593e39 GIT binary patch literal 4392 zcmeHLdvp_38lO;UYbafoLJMuNh@WTtIs zk*&N+j|;dw&K{NHg9RUp)(5LrDhs=`Qb8?($T_Q?E%?G0RZA70_0A+s%URFy^qlp- zCg%e9jA&)a9API18BW#nQtn274(=^`b{|x1&>bEaq^2(!aEOlKhtbxy4!Mo_}!X@ znhzem_TZkX?DK0@?%GPBPfuX(*wTOJXYA&*!-FX+KF0sFH}%yu+it6o&*oNDWwo~l zI_xu++g&wtUoyy}be^MCAbthw;sMN@J4vRATtdnaw0lGk+b zNJrCun!f+0WdEU@-pugHy_tcFFb5-YMWt5hE#X8ZVBsZ20G3D~q#qbkFfS6~#TuZY z0`SX0C)U?-2t#Gbi7m_blHQODRLjMUVNl+*$bwfsof5hYzYT79bx)gbxvvg(Lz2Vx)zt71cwKm_xs4p;oL40iq13N?lk4MfD)4 z<&K1q#JGK^E?jGbBZ&m41p%n4!d;Q$Yh zQx5QcK!k#RV?igJD=hUmG1@{7&y?2knhzQ{u@X607a3ltkOQDx<8?MEJ54jR&0%*q zY>bVz4=XJNVHIYgj%n0RV?{p}4h92><@G#;0LDCwg>!`guPNaQMX7aS@v0kN_QLBV z@fz>uH2^{5b+}@v4$mg792s?Ahx00u>|6C~+WO@|3!pwc@?u$q`>!&lqBp7>tc;GL z!&=$6N+@bv3XT_}A*g(P?64qKbV;n{gMI+3M=V{3=H*{V1*?q$g21vk&OM9(jdt|~sQfe(X1KjaZ|1=G{`hC=g{FblSS^Sn;py=2p zqvCgrt}(hs#lWbP$FggTu2C^CD&?{4`oGa-9)6qxLHH}E0X{5cAyW^-2dzZm#)WQV z95RR?&a8L7f-_f!ikGVhl6pjMrlZPZ5}ZuZJl>+D^GP`q*tE3I59og#ba~u`73}fT z+nzD6t(vl7>trwg$Te3VNZi=Lew~6JoZoapZ6EBNaA{KE@eOzUwXt~tHha;1w*5^%Qdao4F^x^K!rn%^|N@NVbR%I>@i z-95{Y`G1?09Z79T$T!asS RmcoD#Ptjs`+k&dKKLcWB?lu4b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/items/war_dart_blue_dwarven.png b/src/main/resources/assets/lotr/textures/items/war_dart_blue_dwarven.png new file mode 100644 index 0000000000000000000000000000000000000000..31ec4682422f539a0441d4c24536b7e6ca153f25 GIT binary patch literal 4383 zcmeHKdvp}#6`v&~n{FQEWyA!VaibWN+1YvQYnqkE?n<_1A&><^p*FKK-)_cz%(6Sl zZU|BYkC0;n$m0){(;^L(BN|kE1OtVVDAa0$a4c<4)zsHPYfWqL*_QOq>}HdkdX6XO z)c>-{m+#K~?)`oD{=WO&&9v7oT~cf)Ghi52?5%OHfO(oa3i9D^#n3Ph(|Oe34SKz| zU=lW2d~lpV0%IE z@b!JBTi$LsQg^T6kyTBv|K{BbWYdLRo!xdr*Hrz2(jz6N-@m|h8@3GSw;$WO=ivQ& zzc|%--uQ>D?`%5J^LclhzTi{(;^SSj4}9?4gFozhv9@Jp(Fx<`Z$7gaO21QuN{4Ve*PEkw`Vi852v@LgBPv#!I|3{mal5>Z@;DXrtdg?2GKDXq^LrcG0{F1P5s5JD%I`nGWC)egD zzj~RzB<;ZO@yuVerC{pHy><6>R6W7XD_!wS#o$0i%YSAZpOx5m`rK2S4eYtDihqA^ zQ!4!4qjOJoHqN=cY5o446#ir(d)JPkyFapb%sf3@wC)4qr-w>j*|hu4u=Ll;#>VpQ z?wIuQ_v6R&ik#OyJ+Ei?FMhSFKW{K}#kZ#MAElRnJhUPF@jF*^HTA21TRt!_ZTqaM zwv)X*ZGUe2*XOmzPE`z)B`zE)i(Y{mOiTU-rNLLr33AlLi*f*&($TnjU|98nbetE$ zNWlXrB*mP@!Jbn_ToRqe)fS)G7k8m1sb)h0)o)np7dC_ihiF`Io1r?*0YDTfJf4n5 zVo5ITG-|jU$f}w&;+lyPb{ZR?j$CpA;jD=@nF&u?YN3s{8Sv_a801#CZ_h%&lhfFw zC~=M?Q>m0G#hBzoh@>122Wh5BnkK-4NVdilK25}ul`2FA!;O+cLW(Pr9K%&iJ|H(M zPNNal@saqVai1>-A4_Ig06xexA15i3nT$rsu^vgq(*hvbfWFov>2HlAas^7t%?SZ{ zT2M@>919@|IsbTbBBG@u3M7i4D3~T;S8Cjr>W#~Js1$^xXk7CGvd38}QgD>4aj~f@ zS~_C`0rwp4IO~zzHDj>y`8c;MG^^ox-A<#rKPSq9ByyVQu<=ZQw(tb&;3J?sPld{n?OIsZd zinY)dyJOU76-p$b5>-sCcWNu@v2c(K5X-A|3ILiOa^YMF#4B>bFUt|9G1ql-%RabH zBCqgnUO@nw>%;z$K76a0;mn!vRXCq4O2O7|vQ{q-UJdqe`)7^rReAQhWj}3IUJ66_ls;4TV=}2Q_beEU6}>o&pd?m~8|@ zjSxm<2_v%!lWNZx$+(*QA5N+@gE378{4zRdUeF84Tr&9pOch>*Wp~srMB}ElW`mSDIuHXCo{U0st z%-iuQwl=l+PoJ%S literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/items/war_dart_bronze.png b/src/main/resources/assets/lotr/textures/items/war_dart_bronze.png new file mode 100644 index 0000000000000000000000000000000000000000..9bcaa1a8eb6a8961cfa823148ebc868a56427e35 GIT binary patch literal 4388 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 C5$m@A literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/items/war_dart_dwarven.png b/src/main/resources/assets/lotr/textures/items/war_dart_dwarven.png new file mode 100644 index 0000000000000000000000000000000000000000..42ce651f3b43a0983efe2804e9042d61d345bad0 GIT binary patch literal 4382 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/items/war_dart_gilded_iron.png b/src/main/resources/assets/lotr/textures/items/war_dart_gilded_iron.png new file mode 100644 index 0000000000000000000000000000000000000000..6b3e491da7ecb216ea4cb418a4a96765fb651e02 GIT binary patch literal 4376 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/items/war_dart_heads_0.png b/src/main/resources/assets/lotr/textures/items/war_dart_heads_0.png new file mode 100644 index 0000000000000000000000000000000000000000..3cb0e00a1ce04975d82d314378f59221c73708f0 GIT binary patch literal 4637 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 D5d-t~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/items/war_dart_heads_1_alt.png b/src/main/resources/assets/lotr/textures/items/war_dart_heads_1_alt.png new file mode 100644 index 0000000000000000000000000000000000000000..aba15a1d763fad2495514ae0872e250bed847daa GIT binary patch literal 4495 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/items/war_dart_heads_3.png b/src/main/resources/assets/lotr/textures/items/war_dart_heads_3.png new file mode 100644 index 0000000000000000000000000000000000000000..0a0b7f9e270a0491193b9d969d6c25f1805b4280 GIT binary patch literal 4547 zcmeHKe{2)i9X}@|gpAOp^cNJVw?mZ@==py5&i376P!gxuv<_BcSd#t`&Uf#e8@A8! zont46t&}CCqbkrMb*pH)(lQVopmyD$WI$V>X$7SnYu9C3D+EQ1say6#9c)R(zIS$h zX_cl-kciuSGYU8wRHHeTW-EJ zGW^`$Yt^3WT}7qs@zJHFbGkM+p8dti?TJC7=*A11mmj}+_{iqrH5VTBkv((f>&5qc z;tLHIJF}1dYF}Uc-KRd^_rR{zZ;me7)a~5>o_jtC$;nL<{6my`Dxm=j5C;*^tw^SYkyvUXxZ-vC02X0Rm<| zqQf*(B1L7hS!dSe)YCDF5d?vvS&C&z&>)TOq$%adq_Nb3$Yc1CA*Z#Jsp(1F!jz(V z#`F;ctmEVUB~qc#1boscumF5eIVnXkPMS(2sHql)+0X?b1&6-Y!iaRI5Y>bXJ(HGE zLl;V#OQ%98@`QaVlaAZrC^CiOC;_Sl?8;2r(z(Okq}iF+8rgME;mnditHhy ztQ(Q4;E@@HR#{0#Q=o!L!<3RTvY-ImsR0g(BARmx63HXlO>zv+kWnP5q$0C4Qg|LQ zUSSHvnzRO4DaEIHWkD$b#k*NA!+YJN*QrmQ&OtdiV+G(3x$09;7K&)itDFE1Vh()YVBgxd$5nYe_h>5B@u^fWy zq)4XZmrMkp6LmN;UWb>{E|Jc=Z^4ChMN_-~o3?d%@EXvEBM)c>?B8vR@;9m(b>?UJ zXzlT>>YNoJ6an zmuETB14kzd$m3gv)3vi5$T|fejHErJi-|D2 zNV6ix76_wmeTY1Z+%BGTlak_=AVk4U3XFhA1}U_Q;RNJm)#*ZQJ^L-gZd2Ro|>rl1dJ8{=bi0K+0QBr8Gvarau35Tf z#K4S{XR~XTt{E{fBjwrb`oGatKKaIolJG|_3-5!EEta2ycgfP|!>jyQHO6C}!`sd8 zf@EGQ&}zU7=qal?hV=ak2EK)A6#ZW`c5f%v8{bxU`ff%Yd2Tdy&hPUtIGBTdJf)okbja{Q8TnsU3>hV zZ7+|sjeP3*>c-DIV+Ttr|9N2ScfI}Jc=P@FL{p$gZCvR8gdTdSb?j{WZ*TKneel_N kpH=RRs^O3Kf4L)7H1LHm=jb(IKRAK~8yfwG>efI0Z_D!vQ~&?~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/items/war_dart_heads_4.png b/src/main/resources/assets/lotr/textures/items/war_dart_heads_4.png new file mode 100644 index 0000000000000000000000000000000000000000..6e26dcac86eaf73971da259499594937dd5a391b GIT binary patch literal 4577 zcmeHKYj6|S6<*n3J046i#A$#|vsq6jIA*2Y)vmO=u|lzAkdnw&Z9#4F!|dZq+9GL% zc4f&t+JI~9JSIR&r%g*7AT{og1SV-G5S&1YOCS^Dg4;knlcXL4P16^BOzX5JL+`F+ z*`8*m<4*Z!d9Lo=bI_ zW?#tXdjKhc4^Y!G53v|Ja9F0T3oM05A(ZWcV=-JCI>uOLnQzWd!}apqdLLY`$mtk1 zq@@5UgY$kkD7d~8&PU)-y0T}Tf@|YbV*U*kAjlHX+wv0AGTw8u^WdRV zuMMU)T=h!jkL*EfS1(!j%Z>Ne_t!u9#LDOUYHmu;v|`__J^H}i++BgLqLIIJ-1_N_ zk?;3@Qsu1LS5VX%ov19D*S4enz1L6gj`eE=pT4l8`mK+T9p5q1F#MPc-!gB3TKL5) zF8@fOHU0RdzFpDt&s^)fZ{NdjPb}TuWV!o|`MWNE@J8zAoBxGei>!Zc`RM4P@2zP1 z$H{a39iM3v$NL^Ueb4bz$um_8w_ZSyg^wx0X1&?}C@-lot01c)ux4TjBVkC*s!T$V zHUS+KL0E~qup9lSF;tOV*w+|8;ZL|hMDcD(f~GC?L21h-iIcHa50%zrcnA;!x`1Y4 z(YVHET$qW=!?hu{VW_F1Z*pPHu#Vhn5}>q|wi0+9A_ga8%5zz1J~N)x{$%+TBQMz#qa=4N-7CmQRAqADTr!H zcVQUZM<@M@CH($8d|b=10Qs61G^(Hr+zg>)Iel&Y{n>(1Ps=U~2@Lno3Hb zt_{TX%IOfYl($c$l2J1pS+apBh(T2io=VO*(ztPX3xk5N5=)p?kn9$8OoX^Xuq{zIv1e_?7ghRwdyMw`LS#shc z@ zz;r4xAq;GZc-Y)92t{uRM11vz=b`k#8a86ji3?(O}b#PNjfQtp-774 z91KHn^pw(ikknu$8klD9GLK@-}5Z2AeYvRhI_h=&2}9=URzlq;W83IYv6G$Yz^J4bUkEf67` zWhfeV!qiC|aI&PBr8SSPsUbZrB*E%1*o?L~nbaEFf22LDFs+Y5YO*repJBVV<@n4^o9Ni1XNP z{TonnN5b2p!57d0V_43qKa!!aSoitsiho;TSy=R7)7#tJQ1kDiSm z+tbW++$sMo>-ye%?z!JR=R4;fY4ucX&Dyfk2TL&wEA#ujbufR%R0-BaNn8nb6W|=ZBuoPm2AlnP=J{TK1MtjgwWcJ^L@zUJ52gb{DI>sKx zQh=2~e+U{2)BUbr2|ECzrOhSa_gnj!mFiEjDEiJ z$L-%fy1ysWRM$NJgO2m#uIs(SJ8xMk2Yee`{u7cNFF z`s<2&|CZW#CYavQd+ohj;f{BXUcip{4#{Q1#QS(nWNX=_@t@D%d~nlM?W(`s>bw0$ z>fANwCA6=ocL|dmX}wzVV#8mgV_l8sE_a4If7t(A{n_qxd{hnMgV{)(nUNI zjl?t|;~`930mg=yB5+eh-|itAAdjlzNrZD&&PtQj8MTEa9xcV)Nm&u7~78KxMX=P8<{Se670QfrOrVup-q%M6Gth8Jm4QcdV;Jcb*XVkn-{ zJp=*k_=J7YL?Dodk7+p;fDbAoCMd>AQ_(0jb%&-`w*W}apwHZ)1zQt{szX{lm6T9* z3ySH>rb5V4et#mBjF|4o5``it3aT2M%1k@bxN-R%1_fa?nlN_(+0!(2RhcAfnr+64 z>CRL`V0#{Sn)Zb6rZQ*+0)jU#r3~}@UJqfMFUWC8l?8K%_>j!dju08LIqW1SOHMMx zIuNPwPKl9eg%u?<1ky|vY)q<2k?njl}X~h+_~Ll38AH*f_glvzt(|B&>-i zqauV;jf!DJC1PQ7!5~~%UF-J{td*XW)J8;IfejvFgBnX^CKrNg6xHjZ!6xHmSv$+H zHkxCdG{a3QZAM8AGSR>^Yp1zlghc>nfLPJUQvfjK;EPa|M4}!~2IKLFhsamm{Bi)U zlPv0@SJV-J=Id~9q7JX5Z33M&-+&9mWmReYZ`#J?!QG$_A@`{ooZo7SvNx(8?a0ou z(}-$bB^);|g&;~<7c{X2$)=rvm0gmW#aI|Y^~j~`gk1fMR1i6&aQ2XmwDBBIaw4se zE<4MSP6(aEBd3cAWogZ$YjH(Si%GOP3_Jo?ke=oz6u#UHRK;{#(#^<-0uV;hPSVB% z8M{EU0>|bEqwcuR!WVeZ~=|=zWF1kn>Tr@wM z8G5>lZptW&6G3%T{}J}A!jw7+)MRB)pP}4S`Ffw@3_@}@U%7O>)Gacb2YM zx@N?{jFe}yYnHAVF)$MK2A{gKH0G=E1XMacKQoFIIusG3SXc z{c9kZm+&=e@Blh&G|Tz;aT$bjb$_6G?nfn-^0}o;ivsZD0(RQ(T^)42`R9W#mJQSQ z%sH~AIB{Xg+b6lv7u+3VH%eB#lPvyDB)D?X0t<0SS8rY`{OXy1?QYsneBwGV(0}~p zqdk>r%X+zgMcuk>N~dq=a~ZGl!Xhm3mHREbJ9TBvx_M)*SI!q7TX?hkM#H9|rC;nn zbA4ym?MDRV_Z2U_ytrJ5j;1VnA5Og2b-4TKhsQS57vA|}XX4r4J^60x+$+&tkJAJ0 x@{d^C@sIakPCB1^>#tiZ_}B(z@6h{g1vlCs-$JpU-U2T$e|3#_pmN(2{|3kuBcA{O literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/items/war_dart_iron.png b/src/main/resources/assets/lotr/textures/items/war_dart_iron.png new file mode 100644 index 0000000000000000000000000000000000000000..1a1752c6eeb09ca68d52ebc2f4c767a9d75ada78 GIT binary patch literal 4382 zcmeHKeQ*=U6+bzE!N%0MrU4Slq0p94PWPcZ>vXlS9m&Qb$Pw5Bc3o1R?pE?)ODF5j zk}$YXnh?h(5HL&_$EDCFrDG=bBu!}tk_MMh+R_w4Ahd)M=c7q!O5H+Im_p*dJIP@WX;XOFf7Mg?pXzWuF z>s^dZg$Za{CSevs2byKnIKy%Wb_d9|Ld%1(p<}eUmdR$n4aRq+$Gc&?D6M1I(3T7= z2l{Sk42<)k?}4T~lG^JRFgBj4=I5hq3|k4ap?;ay=f@cvP1)=`*i#HEP!7RP<1{DG zv_P@2zh(c3M+TCFUN{H-J*2qZey`h&M`LPGX+#*7>~7uZDnDL)_la*-K3%$aMm%@s z@BC|@?`Y@O&1&~AIG6Q|u=gAPp6r{uEC0@AeLwB*KN&dRccNxZ=9-e++gMXPx=P=f zH~2*U*I!OXFYQR&_+nxJJFrshI?rX-9|`}ka~l0*?JRfiRB`sqhv+ZcPwnk|Du3h2 z3$BcfFLqpCGN^6Z{vfB)IG%T!IsW{kj<$o2@OQ2+ZQ8v@-gC1%dFiR_yrS6Jf8Kmd zdlh{mVNy4C13bj^_9BS4EOfEZ}087vYV7$tDS1o>x;S9k9=j5xUjc(iT2(1 za(7j~oVT#e?|09c^@q0CdO8COe7B~}AKd@J6Tg1?@k7(gwok4)P!j*Rf73sX)*hmq zZ+)pWulPpCI~%uQ2iESdNpufLCzX9zU#Ne%dh1Y5-FuxMw$ygav$Vc(>_l^I<-azc znpfBVo5y{B+_Qy!_&!Ur=m+X=Eg%1^_;lBW+J^ZDKUci<$nrm7nU5T+-}&5y*30w$ z{D5Bpp z8bX$a?W4`HMl&2)B2gm>gQ^C*(qpzXZrreiK|x3fM@=grdyJ;81V_jkhb8%aSB>Jj;)Q zcp#=gR*H?Iy)vL=fO3dTfG^-hf?;_?uyjx+L_0$hl2j0ok%M;FIlBoZOG23%3yW}^ zN>~gbG8ze)3kKmriQnt8GB#>N;%^l7AQ-r;E0joca%7=O38P9~G}xpa420s~3koQP zVrj>S(rOgbAQKHtvv!&*#<2(x3=k_Cc?tlg9AXjNF(m40tV&fIUDn~MJG|_J>m-Z1 z=n-`Upu=^zYN!r>m9h&|%6$XQr^-rj{r}Q7E)QM^`f%jsiU#|yH$|x%Rf(EXv(&Uv zF|QJio0mcmrBn!-7)P?{Ct#(PqW^d)X6jyFY35%t=TFa`vLm0E4x*!8Pe~Pj>U`(3SzGGz z%XXYSbN2J{hOIwuKh%5XZ1$w>C8yu&DY}_aQSq3q@8SCP;=fwfeXt^gkbI$0+f!RgB$Idn9Y<}&|?HeC>=ft+- zfBuy$98|h4FWEV8B{-+y-3{xAtEcOvZS8FrkImTJR{zG~NhQbPFMj_gtuI`DsViR8 zS5x!Ro3|dU^_-h+U(rq6zLs56^Xe;e?wbzA-e DaDeIs literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/items/war_dart_mithril.png b/src/main/resources/assets/lotr/textures/items/war_dart_mithril.png new file mode 100644 index 0000000000000000000000000000000000000000..953f9287c9d5ae49cabb5f5488c0d8ea0a27d293 GIT binary patch literal 4377 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