From 732ee9a953d89a3836b4ac7b191d13be84e1381f Mon Sep 17 00:00:00 2001 From: gamer147 Date: Tue, 4 Nov 2025 12:37:16 -0500 Subject: [PATCH] Added support for enchanting shields properly --- build.gradle | 6 +- .../java/mod/sin/armoury/ShieldsTweaks.java | 137 ++++++++++-------- 2 files changed, 83 insertions(+), 60 deletions(-) diff --git a/build.gradle b/build.gradle index ec8abba..43975c4 100644 --- a/build.gradle +++ b/build.gradle @@ -1,17 +1,17 @@ apply plugin: 'java' group "mod.sin" -version "4.1" +version "4.2" repositories { mavenCentral() mavenLocal() - maven { url "https://dl.bdew.net/agorepo/" } maven { url 'https://jitpack.io' } + maven { url "http://gotti.no-ip.org/maven/repository" } } dependencies { - compile 'org.gotti.wurmunlimited:server-modlauncher:0.40' + compile 'com.github.ago1024:WurmServerModLauncher:v0.46' compile 'com.github.Sindusk:sindusklibrary:v2.1' } diff --git a/src/main/java/mod/sin/armoury/ShieldsTweaks.java b/src/main/java/mod/sin/armoury/ShieldsTweaks.java index 4b86587..07d9a1d 100644 --- a/src/main/java/mod/sin/armoury/ShieldsTweaks.java +++ b/src/main/java/mod/sin/armoury/ShieldsTweaks.java @@ -2,6 +2,8 @@ package mod.sin.armoury; import java.util.logging.Logger; +import com.wurmonline.server.spells.EnchantUtil; +import com.wurmonline.server.spells.Spell; import mod.sin.lib.Util; import org.gotti.wurmunlimited.modloader.classhooks.HookManager; @@ -17,55 +19,67 @@ import javassist.CtClass; import javassist.NotFoundException; public class ShieldsTweaks { - public static Logger logger = Logger.getLogger(ShieldsTweaks.class.getName()); + public static Logger logger = Logger.getLogger(ShieldsTweaks.class.getName()); - public static boolean checkShieldSpeed(Item shield){ + public static boolean checkShieldSpeed(Item shield) { if ((shield != null)) { return (shield.getSpellSpeedBonus() > Server.rand.nextInt(500)); } - return false; - } - - public static void doSharedPain(Creature attacker, Creature defender, Item shield){ - if(shield.getSpellPainShare() > 0f){ - float powerReq = Server.rand.nextInt(300); - if(!(powerReq < shield.getSpellPainShare())){ - return; - } - boolean playSound = false; - if(shield.getBonusForSpellEffect(Enchants.BUFF_ROTTING_TOUCH) > 0f){ - double damage = shield.getBonusForSpellEffect(Enchants.BUFF_ROTTING_TOUCH)*31d; - attacker.addWoundOfType(defender, Wound.TYPE_INFECTION, 0, true, 1.0f, true, damage); - playSound = true; - }else if(shield.getBonusForSpellEffect(Enchants.BUFF_FLAMING_AURA) > 0f){ - double damage = shield.getBonusForSpellEffect(Enchants.BUFF_FLAMING_AURA)*27d; - attacker.addWoundOfType(defender, Wound.TYPE_BURN, 0, true, 1.0f, true, damage); - playSound = true; - }else if(shield.getBonusForSpellEffect(Enchants.BUFF_FROSTBRAND) > 0f){ - double damage = shield.getBonusForSpellEffect(Enchants.BUFF_FROSTBRAND)*28d; - attacker.addWoundOfType(defender, Wound.TYPE_COLD, 0, true, 1.0f, true, damage); - playSound = true; - }else if(shield.getBonusForSpellEffect(Enchants.BUFF_VENOM) > 0f){ - double damage = shield.getBonusForSpellEffect(Enchants.BUFF_VENOM)*30d; - attacker.addWoundOfType(defender, Wound.TYPE_POISON, 0, true, 1.0f, true, damage); - playSound = true; - } - if(playSound){ - SoundPlayer.playSound(attacker.getTemplate().getHitSound(attacker.getSex()), attacker.getTileX(), attacker.getTileY(), attacker.isOnSurface(), 0.3f); - } - } - } - - public static void preInit(){ + return false; + } + + public static void doSharedPain(Creature attacker, Creature defender, Item shield) { + if (shield.getSpellPainShare() > 0f) { + float powerReq = Server.rand.nextInt(300); + if (!(powerReq < shield.getSpellPainShare())) { + return; + } + boolean playSound = false; + if (shield.getBonusForSpellEffect(Enchants.BUFF_ROTTING_TOUCH) > 0f) { + double damage = shield.getBonusForSpellEffect(Enchants.BUFF_ROTTING_TOUCH) * 31d; + attacker.addWoundOfType(defender, Wound.TYPE_INFECTION, 0, true, 1.0f, true, damage, 0, 0, false, true); + playSound = true; + } else if (shield.getBonusForSpellEffect(Enchants.BUFF_FLAMING_AURA) > 0f) { + double damage = shield.getBonusForSpellEffect(Enchants.BUFF_FLAMING_AURA) * 27d; + attacker.addWoundOfType(defender, Wound.TYPE_BURN, 0, true, 1.0f, true, damage, 0, 0, false, true); + playSound = true; + } else if (shield.getBonusForSpellEffect(Enchants.BUFF_FROSTBRAND) > 0f) { + double damage = shield.getBonusForSpellEffect(Enchants.BUFF_FROSTBRAND) * 28d; + attacker.addWoundOfType(defender, Wound.TYPE_COLD, 0, true, 1.0f, true, damage, 0, 0, false, true); + playSound = true; + } else if (shield.getBonusForSpellEffect(Enchants.BUFF_VENOM) > 0f) { + double damage = shield.getBonusForSpellEffect(Enchants.BUFF_VENOM) * 30d; + attacker.addWoundOfType(defender, Wound.TYPE_POISON, 0, true, 1.0f, true, damage, 0, 0, false, true); + playSound = true; + } + if (playSound) { + SoundPlayer.playSound(attacker.getTemplate().getHitSound(attacker.getSex()), attacker.getTileX(), attacker.getTileY(), attacker.isOnSurface(), 0.3f); + } + } + } + + public static boolean shieldIsValidItemType(Spell spell, Creature performer, Item target) { + if (spell.isTargetArmour() && target.isShield()) { + return true; + } + + if (spell.isTargetWeapon() && target.isShield()) { + return true; + } + + return false; + } + + public static void preInit() { try { - ClassPool classPool = HookManager.getInstance().getClassPool(); - Class thisClass = ShieldsTweaks.class; - if(ArmouryModMain.enableShieldDamageEnchants){ - CtClass ctCombatHandler = classPool.get("com.wurmonline.server.creatures.CombatHandler"); - String replace = ShieldsTweaks.class.getName()+".doSharedPain(this.creature, defender, defShield);" - + "$_ = $proceed($$);"; - Util.setReason("Enable shield damage enchants."); - Util.instrumentDeclared(thisClass, ctCombatHandler, "checkShield", "setDamage", replace); + ClassPool classPool = HookManager.getInstance().getClassPool(); + Class thisClass = ShieldsTweaks.class; + if (ArmouryModMain.enableShieldDamageEnchants) { + CtClass ctCombatHandler = classPool.get("com.wurmonline.server.creatures.CombatHandler"); + String replace = ShieldsTweaks.class.getName() + ".doSharedPain(this.creature, defender, defShield);" + + "$_ = $proceed($$);"; + Util.setReason("Enable shield damage enchants."); + Util.instrumentDeclared(thisClass, ctCombatHandler, "checkShield", "setDamage", replace); /*ctCombatHandler.getDeclaredMethod("checkShield").instrument(new ExprEditor(){ public void edit(MethodCall m) throws CannotCompileException { if (m.getMethodName().equals("setDamage")) { @@ -75,21 +89,30 @@ public class ShieldsTweaks { } } });*/ - } - if(ArmouryModMain.enableShieldSpeedEnchants){ - CtClass ctCombatHandler = classPool.get("com.wurmonline.server.creatures.CombatHandler"); - String insert = "if("+ShieldsTweaks.class.getName()+".checkShieldSpeed(defender.getShield())){" - + " defender.getCombatHandler().usedShieldThisRound--;" - + "}"; - Util.setReason("Enable shield speed enchants."); - Util.insertBeforeDeclared(thisClass, ctCombatHandler, "checkShield", insert); + + CtClass ctSpell = classPool.get("com.wurmonline.server.spells.Spell"); + String shieldSpellCheck = ShieldsTweaks.class.getName() + ".shieldIsValidItemType(this, performer, target)"; + String spellCheckReplace = "if (" + shieldSpellCheck + ") {" + + "return true;" + + "}"; + Util.setReason("Enable enchanting shields with damage enchants."); + Util.insertBeforeDeclared(thisClass, ctSpell, "isValidItemType", spellCheckReplace); + + } + if (ArmouryModMain.enableShieldSpeedEnchants) { + CtClass ctCombatHandler = classPool.get("com.wurmonline.server.creatures.CombatHandler"); + String insert = "if(" + ShieldsTweaks.class.getName() + ".checkShieldSpeed(defender.getShield())){" + + " defender.getCombatHandler().usedShieldThisRound--;" + + "}"; + Util.setReason("Enable shield speed enchants."); + Util.insertBeforeDeclared(thisClass, ctCombatHandler, "checkShield", insert); /*ctCombatHandler.getDeclaredMethod("checkShield").insertBefore("" + "if("+ShieldsTweaks.class.getName()+".checkShieldSpeed(defender.getShield())){" + " defender.getCombatHandler().usedShieldThisRound--;" + "}");*/ - } - }catch (NotFoundException e) { - e.printStackTrace(); - } - } + } + } catch (NotFoundException e) { + e.printStackTrace(); + } + } }