From cc80be23dcea63501e6a68c74f73d2d5cc212149 Mon Sep 17 00:00:00 2001 From: Shinare Date: Sat, 21 Jun 2025 15:48:38 +0300 Subject: [PATCH 1/2] LOTRMaterialTransformer can now modify weapon damages --- .../coremod/LOTRMaterialTransformer.java | 61 +++++++++++-------- 1 file changed, 36 insertions(+), 25 deletions(-) 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 59dc1d7..3357fcf 100644 --- a/src/main/java/com/zivilon/cinder_loe/coremod/LOTRMaterialTransformer.java +++ b/src/main/java/com/zivilon/cinder_loe/coremod/LOTRMaterialTransformer.java @@ -20,38 +20,38 @@ public class LOTRMaterialTransformer implements IClassTransformer { reader.accept(classNode, 0); - modifyMaterial("ANGMAR", 350, 0.6F, classNode); //Original Durability = 350 | Add 81 | 162 if Upgraded Armory | 1/4 (Unupgraded) - modifyMaterial("URUK", 550, 0.7F, classNode); //Original Durability = 550 | Add 56 | 112 if Upgraded Armory | 1/4 (Unupgraded) - modifyMaterial("BLACK_URUK", 550, 0.7F, classNode); //Original Durability = 550 | Add 56 | 112 if Upgraded Armory | 2/4 (Unupgraded) - modifyMaterial("HALF_TROLL", 350, 0.6F, classNode); //Original Durability = 300 | Add 87 | 175 if Upgraded Armory | 1/4 (Unupgraded) + modifyMaterial("ANGMAR", 350, 0.6F, 2.5F, classNode); //Original Durability = 350 | Add 81 | 162 if Upgraded Armory | 1/4 (Unupgraded) + modifyMaterial("URUK", 550, 0.7F, 3.0F, classNode); //Original Durability = 550 | Add 56 | 112 if Upgraded Armory | 1/4 (Unupgraded) + modifyMaterial("BLACK_URUK", 550, 0.7F, 3.0F, classNode); //Original Durability = 550 | Add 56 | 112 if Upgraded Armory | 2/4 (Unupgraded) + modifyMaterial("HALF_TROLL", 350, 0.6F, 2.5F, classNode); //Original Durability = 300 | Add 87 | 175 if Upgraded Armory | 1/4 (Unupgraded) // Good Humans - modifyMaterial("DALE", 350, 0.6F, classNode); //Original Durability = 300 | Add 87 | 175 if Upgraded Armory | 1/4 (Unupgraded) - modifyMaterial("GONDOR", 450, 0.6F, classNode); //Original Durability = 450 | Add 68 | 137 if Upgraded Armory | 3/4 (Unupgraded) - modifyMaterial("DORWINION_ELF", 500, 0.6F, classNode); //Original Durability = 500 | Add 62 | 125 if Upgraded Armory | 3/4 (Unupgraded) - modifyMaterial("ROHAN", 350, 0.6F, classNode); //Original Durability = 300 | Add 87 | 175 if Upgraded Armory | 0/4 - modifyMaterial("TAUREDAIN", 350, 0.6F, classNode); //Original Durability = 300 | Add 87 | 175 if Upgraded Armory | 0/4 - modifyMaterial("DORWINION", 400, 0.6F, classNode); //Original Durability = 400 | Add 75 | 150 if Upgraded Armory | 0/4 - modifyMaterial("LOSSARNACH", 350, 0.6F, classNode); //Original Durability = 300 | Add 87 | 175 if Upgraded Armory 0/4 - modifyMaterial("LAMEDON", 350, 0.6F, classNode); //Original Durability = 300 | Add 87 | 175 if Upgraded Armory | 0/4 + modifyMaterial("DALE", 350, 0.6F, 2.5F, classNode); //Original Durability = 300 | Add 87 | 175 if Upgraded Armory | 1/4 (Unupgraded) + modifyMaterial("GONDOR", 450, 0.6F, 2.5F, classNode); //Original Durability = 450 | Add 68 | 137 if Upgraded Armory | 3/4 (Unupgraded) + modifyMaterial("DORWINION_ELF", 500, 0.6F, 3.0F, classNode); //Original Durability = 500 | Add 62 | 125 if Upgraded Armory | 3/4 (Unupgraded) + modifyMaterial("ROHAN", 350, 0.6F, 2.5F, classNode); //Original Durability = 300 | Add 87 | 175 if Upgraded Armory | 0/4 + modifyMaterial("TAUREDAIN", 350, 0.6F, 2.5F, classNode); //Original Durability = 300 | Add 87 | 175 if Upgraded Armory | 0/4 + modifyMaterial("DORWINION", 400, 0.6F, 2.5F, classNode); //Original Durability = 400 | Add 75 | 150 if Upgraded Armory | 0/4 + modifyMaterial("LOSSARNACH", 350, 0.6F, 2.5F, classNode); //Original Durability = 300 | Add 87 | 175 if Upgraded Armory 0/4 + modifyMaterial("LAMEDON", 350, 0.6F, 2.0F, classNode); //Original Durability = 300 | Add 87 | 175 if Upgraded Armory | 0/4 // Evil Humans - modifyMaterial("RHUN_GOLD", 450, 0.6F, classNode); //Original Durability = 450 | Add 68 | 137 if Upgraded Armory | 0/4 - modifyMaterial("RHUN", 400, 0.6F, classNode); //Original Durability = 400 | Add 75 | 150 if Upgraded Armory | 0/4 - modifyMaterial("DUNLENDING", 350, 0.6F, classNode); //Original Durability = 250 | Add 93 | 187 if Upgraded Armory | 1/4 (Unupgraded) - modifyMaterial("NEAR_HARAD", 450, 0.6F, classNode); //Original Durability = 300 | Add 87 | 175 if Upgraded Armory | 3/4 (Unupgraded) - modifyMaterial("HARNEDOR", 350, 0.6F, classNode); //Original Durability = 250 | Add 93 | 187 if Upgraded Armory | 0/4 - modifyMaterial("CORSAIR", 350, 0.6F, classNode); //Original Durability = 300 | Add 87 | 175 if Upgraded Armory | 0/4 - modifyMaterial("GULF_HARAD", 350, 0.6F, classNode); //Original Durability = 350 | Add 81 | 162 if Upgraded Armory | 0/4 - modifyMaterial("UMBAR", 450, 0.6F, classNode); //Original Durability = 450 | Add 68 | 137 if Upgraded Armory | 2/4 (Unupgraded) - modifyMaterial("MOREDAIN", 350, 0.6F, classNode); //Original Durability = 250 | Add 93 | 187 if Upgraded Armory | 0/4 + modifyMaterial("RHUN_GOLD", 450, 0.6F, 2.5F, classNode); //Original Durability = 450 | Add 68 | 137 if Upgraded Armory | 0/4 + modifyMaterial("RHUN", 400, 0.6F, 2.5F, classNode); //Original Durability = 400 | Add 75 | 150 if Upgraded Armory | 0/4 + modifyMaterial("DUNLENDING", 350, 0.6F, 2.0F, classNode); //Original Durability = 250 | Add 93 | 187 if Upgraded Armory | 1/4 (Unupgraded) + modifyMaterial("NEAR_HARAD", 450, 0.6F, 2.5F, classNode); //Original Durability = 300 | Add 87 | 175 if Upgraded Armory | 3/4 (Unupgraded) + modifyMaterial("HARNEDOR", 350, 0.6F, 2.0F, classNode); //Original Durability = 250 | Add 93 | 187 if Upgraded Armory | 0/4 + modifyMaterial("CORSAIR", 350, 0.6F, 2.5F, classNode); //Original Durability = 300 | Add 87 | 175 if Upgraded Armory | 0/4 + modifyMaterial("GULF_HARAD", 350, 0.6F, 2.5F, classNode); //Original Durability = 350 | Add 81 | 162 if Upgraded Armory | 0/4 + modifyMaterial("UMBAR", 450, 0.6F, 2.5F, classNode); //Original Durability = 450 | Add 68 | 137 if Upgraded Armory | 2/4 (Unupgraded) + modifyMaterial("MOREDAIN", 350, 0.6F, 2.0F, classNode); //Original Durability = 250 | Add 93 | 187 if Upgraded Armory | 0/4 //Elves - modifyMaterial("WOOD_ELVEN", 500, 0.6F, classNode); //Original Durability = 500 | Add 62 | 125 if Upgraded Armory | 4/4 (Unupgraded) + modifyMaterial("WOOD_ELVEN", 500, 0.6F, 3.0F, classNode); //Original Durability = 500 | Add 62 | 125 if Upgraded Armory | 4/4 (Unupgraded) // Custom - modifyMaterial("UTUMNO", 1500, 0.7F, classNode); + modifyMaterial("UTUMNO", 1500, 0.7F, 3.5F, classNode); addMaterial("RED_DWARF", classNode); addMaterial("WIZARD", classNode); @@ -96,11 +96,12 @@ public class LOTRMaterialTransformer implements IClassTransformer { classNode.fields.add(field); } - public void modifyMaterial(String fieldName, int durability, float protection, ClassNode classNode) { + public void modifyMaterial(String fieldName, int durability, float protection, float weapon_damage, ClassNode classNode) { MethodNode clinit = null; boolean foundField = false; boolean durabilityModified = false; boolean protectionModified = false; + boolean damageModified = false; // First, find the method for (MethodNode method : classNode.methods) { @@ -152,7 +153,17 @@ public class LOTRMaterialTransformer implements IClassTransformer { } } - if (durabilityModified && protectionModified) { + if (foundField && !damageModified && insn instanceof MethodInsnNode && ((MethodInsnNode) insn).name.equals("setDamage")) { + AbstractInsnNode damage_insn = insn.getPrevious(); + + if (damage_insn instanceof LdcInsnNode) { + ((LdcInsnNode) damage_insn).cst = weapon_damage; + System.out.println("[CinderLoE] Updated damage for " + fieldName + " to " + weapon_damage); + damageModified = true; + } + } + + if (durabilityModified && protectionModified && damageModified) { return; } } From 54c2dbec62eea5c638b3b671aa445c4c6d7542d0 Mon Sep 17 00:00:00 2001 From: Shinare Date: Mon, 23 Jun 2025 15:25:58 +0300 Subject: [PATCH 2/2] Added stronger variant of Hill-troll Chieftain. Fixed Hill-troll Chieftain phases --- .../com/zivilon/cinder_loe/CinderLoE.java | 6 ++- .../npc/boss/StrongHillTrollChieftain.java | 16 +++++++ ...MixinLOTREntityMountainTrollChieftain.java | 48 +++++++++++++++++++ .../zivilon/cinder_loe/util/DamageEvent.java | 41 ++++++++++++++-- .../zivilon/cinder_loe/util/IBossEntity.java | 5 ++ src/main/resources/mixins.cinder_loe.json | 3 +- 6 files changed, 111 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/zivilon/cinder_loe/entity/npc/boss/StrongHillTrollChieftain.java create mode 100644 src/main/java/com/zivilon/cinder_loe/mixins/MixinLOTREntityMountainTrollChieftain.java create mode 100644 src/main/java/com/zivilon/cinder_loe/util/IBossEntity.java diff --git a/src/main/java/com/zivilon/cinder_loe/CinderLoE.java b/src/main/java/com/zivilon/cinder_loe/CinderLoE.java index 3ad96ea..5622b07 100644 --- a/src/main/java/com/zivilon/cinder_loe/CinderLoE.java +++ b/src/main/java/com/zivilon/cinder_loe/CinderLoE.java @@ -19,6 +19,7 @@ import com.zivilon.cinder_loe.entity.animals.Monkey; import com.zivilon.cinder_loe.entity.boss.CryptBoss; import com.zivilon.cinder_loe.entity.corrupt.*; import com.zivilon.cinder_loe.entity.npc.*; +import com.zivilon.cinder_loe.entity.npc.boss.*; import com.zivilon.cinder_loe.entity.npc.dwarf.RedDwarfArbalest; import com.zivilon.cinder_loe.entity.npc.dwarf.RedDwarfBannerBearer; import com.zivilon.cinder_loe.entity.npc.dwarf.RedDwarfCommander; @@ -407,7 +408,7 @@ public class CinderLoE { // event.registerServerCommand(new CommandMobileSound()); } - public void registerEntities() { // Last ID added: 83 + public void registerEntities() { // Last ID added: 84 ///GameRegistry.registerTileEntity(TileEntityMistBlock.class, "TileEntityMistBlock"); ///.registerBlock(TileEntityRustedSword, "TileEntityRustedSword"); @@ -466,7 +467,7 @@ public class CinderLoE { EntityRegistry.registerModEntity(Monkey.class, "Monkey", (entityID + 62), this, 64, 1, true); EntityRegistry.registerModEntity(CryptBoss.class, "CryptBoss", (entityID + 66), this, 64, 1, true); EntityRegistry.registerModEntity(EntityMorgulBlast.class, "EntityMorgulBlast", (entityID + 65), this, 64, 1, true); - + EntityRegistry.registerModEntity(StrongHillTrollChieftain.class, "StrongHillTrollChieftain", (entityID + 84), this, 64, 1, true); // Faction Units @@ -1230,6 +1231,7 @@ public class CinderLoE { RenderingRegistry.registerEntityRenderingHandler(EsgarothSoldier.class, new LOTRRenderDaleMan()); RenderingRegistry.registerEntityRenderingHandler(MorgulOrc.class, new LOTRRenderOrc()); RenderingRegistry.registerEntityRenderingHandler(NorthernOrc.class, new LOTRRenderOrc()); + RenderingRegistry.registerEntityRenderingHandler(StrongHillTrollChieftain.class, new LOTRRenderMountainTrollChieftain()); } } diff --git a/src/main/java/com/zivilon/cinder_loe/entity/npc/boss/StrongHillTrollChieftain.java b/src/main/java/com/zivilon/cinder_loe/entity/npc/boss/StrongHillTrollChieftain.java new file mode 100644 index 0000000..f45c8fa --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/entity/npc/boss/StrongHillTrollChieftain.java @@ -0,0 +1,16 @@ +package com.zivilon.cinder_loe.entity.npc.boss; + +import lotr.common.entity.npc.LOTREntityMountainTrollChieftain; +import net.minecraft.world.World; +import net.minecraft.entity.SharedMonsterAttributes; + +public class StrongHillTrollChieftain extends LOTREntityMountainTrollChieftain { + public StrongHillTrollChieftain(World world) { + super(world); + } + + public void applyEntityAttributes() { + super.applyEntityAttributes(); + getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(150.0D); + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/mixins/MixinLOTREntityMountainTrollChieftain.java b/src/main/java/com/zivilon/cinder_loe/mixins/MixinLOTREntityMountainTrollChieftain.java new file mode 100644 index 0000000..7656578 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/mixins/MixinLOTREntityMountainTrollChieftain.java @@ -0,0 +1,48 @@ +package com.zivilon.cinder_loe.mixins; + +import lotr.common.LOTRMod; +import lotr.common.entity.npc.LOTREntityMountainTrollChieftain; +import lotr.common.entity.npc.LOTREntityMountainTroll; +import net.minecraft.entity.Entity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; +import net.minecraft.util.DamageSource; +import net.minecraft.entity.SharedMonsterAttributes; +import com.zivilon.cinder_loe.util.IBossEntity; + +@Mixin(LOTREntityMountainTrollChieftain.class) +public class MixinLOTREntityMountainTrollChieftain extends LOTREntityMountainTroll implements IBossEntity { + @Shadow + public int getTrollArmorLevel() {return 1;} + @Shadow + public void setTrollArmorLevel(int i) {} + + public MixinLOTREntityMountainTrollChieftain(World world) { + super(world); + } + + @Overwrite + protected void damageEntity(DamageSource damagesource, float f) { + super.damageEntity(damagesource, f); + } + + public void change_phase() { + if (!this.worldObj.isRemote) { + setTrollArmorLevel(getTrollArmorLevel() - 1); + if (getTrollArmorLevel() == 0) { + double speed = getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue(); + speed *= 1.5D; + getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(speed); + } + double maxHealth = getEntityAttribute(SharedMonsterAttributes.maxHealth).getAttributeValue(); + maxHealth *= 2.0D; + getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(maxHealth); + setHealth(getMaxHealth()); + this.worldObj.setEntityState((Entity)this, (byte)21); + } + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/util/DamageEvent.java b/src/main/java/com/zivilon/cinder_loe/util/DamageEvent.java index 20c1e6d..d12689d 100644 --- a/src/main/java/com/zivilon/cinder_loe/util/DamageEvent.java +++ b/src/main/java/com/zivilon/cinder_loe/util/DamageEvent.java @@ -4,6 +4,8 @@ import net.minecraft.entity.*; import net.minecraft.entity.player.*; import net.minecraft.util.DamageSource; + +import com.zivilon.cinder_loe.util.IBossEntity; import com.zivilon.cinder_loe.mixins.MixinLOTREnchantment; import lotr.common.enchant.LOTREnchantment; import lotr.common.enchant.LOTREnchantmentHelper; @@ -11,6 +13,7 @@ import lotr.common.enchant.LOTREnchantmentHelper; import lotr.common.item.*; import net.minecraft.item.*; import net.minecraft.world.World; +import lotr.common.entity.npc.LOTREntityMountainTrollChieftain; public class DamageEvent { public DamageSource source; @@ -27,12 +30,20 @@ public class DamageEvent { public static Pair run_events(DamageEvent event) { boolean cancel = false; - World world = event.defender.worldObj; + cancel = (cancel || attack_block_task(event)); + cancel = (cancel || fire_armor_repair_task(event)); + cancel = (cancel || fix_hill_troll_chieftain_task(event)); + + return new Pair<>(event, cancel); + } + public static boolean attack_block_task(DamageEvent event) { + boolean cancel = false; + World world = event.defender.worldObj; if (event.defender instanceof EntityPlayer && !event.source.isUnblockable()) { EntityPlayerMP player = (EntityPlayerMP) event.defender; ItemStack sword = player.getHeldItem(); - if (!(event.attacker instanceof EntityLivingBase)) return new Pair<>(event, cancel); + if (!(event.attacker instanceof EntityLivingBase)) return cancel; EntityLivingBase attacker = (EntityLivingBase)event.attacker; float playerYaw = player.getRotationYawHead(); @@ -72,6 +83,10 @@ public class DamageEvent { } } } + return cancel; + } + public static boolean fire_armor_repair_task(DamageEvent event) { + boolean cancel = false; if (event.source.isFireDamage() && event.defender instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) event.defender; for (ItemStack armor : player.inventory.armorInventory) { @@ -79,15 +94,31 @@ public class DamageEvent { int currentDamage = armor.getItemDamage(); int reduction = (int) event.damage; int newDamage = currentDamage - 2*reduction; - + if (newDamage < 0) { newDamage = 0; } - + armor.setItemDamage(newDamage); } } } - return new Pair<>(event, cancel); + return cancel; + } + public static boolean fix_hill_troll_chieftain_task(DamageEvent event) { + boolean cancel = false; + if (event.defender instanceof LOTREntityMountainTrollChieftain) { + LOTREntityMountainTrollChieftain defender = (LOTREntityMountainTrollChieftain)event.defender; + if (defender.getTrollArmorLevel() > 0) + if (defender.getHealth() - event.damage <= 0.0F) { + ((IBossEntity)(Object)(defender)).change_phase(); + cancel = true; + } + } + return cancel; + } + public static boolean template_task(DamageEvent event) { + boolean cancel = false; + return cancel; } } diff --git a/src/main/java/com/zivilon/cinder_loe/util/IBossEntity.java b/src/main/java/com/zivilon/cinder_loe/util/IBossEntity.java new file mode 100644 index 0000000..3776d67 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/util/IBossEntity.java @@ -0,0 +1,5 @@ +package com.zivilon.cinder_loe.util; + +public interface IBossEntity { + public void change_phase(); +} diff --git a/src/main/resources/mixins.cinder_loe.json b/src/main/resources/mixins.cinder_loe.json index 1f8e142..2f89148 100644 --- a/src/main/resources/mixins.cinder_loe.json +++ b/src/main/resources/mixins.cinder_loe.json @@ -63,7 +63,8 @@ "MixinLOTRItemMug", "MixinLOTREntityHorse", "MixinLOTRGuiMap", - "MixinLOTREntityAIOrcSkirmish" + "MixinLOTREntityAIOrcSkirmish", + "MixinLOTREntityMountainTrollChieftain" ], "client": [] }