Added support for enchanting shields properly

This commit is contained in:
gamer147
2025-11-04 12:37:16 -05:00
parent 8f60079e6e
commit 732ee9a953
2 changed files with 83 additions and 60 deletions

View File

@@ -1,17 +1,17 @@
apply plugin: 'java' apply plugin: 'java'
group "mod.sin" group "mod.sin"
version "4.1" version "4.2"
repositories { repositories {
mavenCentral() mavenCentral()
mavenLocal() mavenLocal()
maven { url "https://dl.bdew.net/agorepo/" }
maven { url 'https://jitpack.io' } maven { url 'https://jitpack.io' }
maven { url "http://gotti.no-ip.org/maven/repository" }
} }
dependencies { dependencies {
compile 'org.gotti.wurmunlimited:server-modlauncher:0.40' compile 'com.github.ago1024:WurmServerModLauncher:v0.46'
compile 'com.github.Sindusk:sindusklibrary:v2.1' compile 'com.github.Sindusk:sindusklibrary:v2.1'
} }

View File

@@ -2,6 +2,8 @@ package mod.sin.armoury;
import java.util.logging.Logger; import java.util.logging.Logger;
import com.wurmonline.server.spells.EnchantUtil;
import com.wurmonline.server.spells.Spell;
import mod.sin.lib.Util; import mod.sin.lib.Util;
import org.gotti.wurmunlimited.modloader.classhooks.HookManager; import org.gotti.wurmunlimited.modloader.classhooks.HookManager;
@@ -17,55 +19,67 @@ import javassist.CtClass;
import javassist.NotFoundException; import javassist.NotFoundException;
public class ShieldsTweaks { 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)) { if ((shield != null)) {
return (shield.getSpellSpeedBonus() > Server.rand.nextInt(500)); return (shield.getSpellSpeedBonus() > Server.rand.nextInt(500));
} }
return false; return false;
} }
public static void doSharedPain(Creature attacker, Creature defender, Item shield){ public static void doSharedPain(Creature attacker, Creature defender, Item shield) {
if(shield.getSpellPainShare() > 0f){ if (shield.getSpellPainShare() > 0f) {
float powerReq = Server.rand.nextInt(300); float powerReq = Server.rand.nextInt(300);
if(!(powerReq < shield.getSpellPainShare())){ if (!(powerReq < shield.getSpellPainShare())) {
return; return;
} }
boolean playSound = false; boolean playSound = false;
if(shield.getBonusForSpellEffect(Enchants.BUFF_ROTTING_TOUCH) > 0f){ if (shield.getBonusForSpellEffect(Enchants.BUFF_ROTTING_TOUCH) > 0f) {
double damage = shield.getBonusForSpellEffect(Enchants.BUFF_ROTTING_TOUCH)*31d; double damage = shield.getBonusForSpellEffect(Enchants.BUFF_ROTTING_TOUCH) * 31d;
attacker.addWoundOfType(defender, Wound.TYPE_INFECTION, 0, true, 1.0f, true, damage); attacker.addWoundOfType(defender, Wound.TYPE_INFECTION, 0, true, 1.0f, true, damage, 0, 0, false, true);
playSound = true; playSound = true;
}else if(shield.getBonusForSpellEffect(Enchants.BUFF_FLAMING_AURA) > 0f){ } else if (shield.getBonusForSpellEffect(Enchants.BUFF_FLAMING_AURA) > 0f) {
double damage = shield.getBonusForSpellEffect(Enchants.BUFF_FLAMING_AURA)*27d; double damage = shield.getBonusForSpellEffect(Enchants.BUFF_FLAMING_AURA) * 27d;
attacker.addWoundOfType(defender, Wound.TYPE_BURN, 0, true, 1.0f, true, damage); attacker.addWoundOfType(defender, Wound.TYPE_BURN, 0, true, 1.0f, true, damage, 0, 0, false, true);
playSound = true; playSound = true;
}else if(shield.getBonusForSpellEffect(Enchants.BUFF_FROSTBRAND) > 0f){ } else if (shield.getBonusForSpellEffect(Enchants.BUFF_FROSTBRAND) > 0f) {
double damage = shield.getBonusForSpellEffect(Enchants.BUFF_FROSTBRAND)*28d; double damage = shield.getBonusForSpellEffect(Enchants.BUFF_FROSTBRAND) * 28d;
attacker.addWoundOfType(defender, Wound.TYPE_COLD, 0, true, 1.0f, true, damage); attacker.addWoundOfType(defender, Wound.TYPE_COLD, 0, true, 1.0f, true, damage, 0, 0, false, true);
playSound = true; playSound = true;
}else if(shield.getBonusForSpellEffect(Enchants.BUFF_VENOM) > 0f){ } else if (shield.getBonusForSpellEffect(Enchants.BUFF_VENOM) > 0f) {
double damage = shield.getBonusForSpellEffect(Enchants.BUFF_VENOM)*30d; double damage = shield.getBonusForSpellEffect(Enchants.BUFF_VENOM) * 30d;
attacker.addWoundOfType(defender, Wound.TYPE_POISON, 0, true, 1.0f, true, damage); attacker.addWoundOfType(defender, Wound.TYPE_POISON, 0, true, 1.0f, true, damage, 0, 0, false, true);
playSound = true; playSound = true;
} }
if(playSound){ if (playSound) {
SoundPlayer.playSound(attacker.getTemplate().getHitSound(attacker.getSex()), attacker.getTileX(), attacker.getTileY(), attacker.isOnSurface(), 0.3f); SoundPlayer.playSound(attacker.getTemplate().getHitSound(attacker.getSex()), attacker.getTileX(), attacker.getTileY(), attacker.isOnSurface(), 0.3f);
} }
} }
} }
public static void preInit(){ 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 { try {
ClassPool classPool = HookManager.getInstance().getClassPool(); ClassPool classPool = HookManager.getInstance().getClassPool();
Class<ShieldsTweaks> thisClass = ShieldsTweaks.class; Class<ShieldsTweaks> thisClass = ShieldsTweaks.class;
if(ArmouryModMain.enableShieldDamageEnchants){ if (ArmouryModMain.enableShieldDamageEnchants) {
CtClass ctCombatHandler = classPool.get("com.wurmonline.server.creatures.CombatHandler"); CtClass ctCombatHandler = classPool.get("com.wurmonline.server.creatures.CombatHandler");
String replace = ShieldsTweaks.class.getName()+".doSharedPain(this.creature, defender, defShield);" String replace = ShieldsTweaks.class.getName() + ".doSharedPain(this.creature, defender, defShield);"
+ "$_ = $proceed($$);"; + "$_ = $proceed($$);";
Util.setReason("Enable shield damage enchants."); Util.setReason("Enable shield damage enchants.");
Util.instrumentDeclared(thisClass, ctCombatHandler, "checkShield", "setDamage", replace); Util.instrumentDeclared(thisClass, ctCombatHandler, "checkShield", "setDamage", replace);
/*ctCombatHandler.getDeclaredMethod("checkShield").instrument(new ExprEditor(){ /*ctCombatHandler.getDeclaredMethod("checkShield").instrument(new ExprEditor(){
public void edit(MethodCall m) throws CannotCompileException { public void edit(MethodCall m) throws CannotCompileException {
if (m.getMethodName().equals("setDamage")) { if (m.getMethodName().equals("setDamage")) {
@@ -75,21 +89,30 @@ public class ShieldsTweaks {
} }
} }
});*/ });*/
}
if(ArmouryModMain.enableShieldSpeedEnchants){ CtClass ctSpell = classPool.get("com.wurmonline.server.spells.Spell");
CtClass ctCombatHandler = classPool.get("com.wurmonline.server.creatures.CombatHandler"); String shieldSpellCheck = ShieldsTweaks.class.getName() + ".shieldIsValidItemType(this, performer, target)";
String insert = "if("+ShieldsTweaks.class.getName()+".checkShieldSpeed(defender.getShield())){" String spellCheckReplace = "if (" + shieldSpellCheck + ") {" +
+ " defender.getCombatHandler().usedShieldThisRound--;" "return true;" +
+ "}"; "}";
Util.setReason("Enable shield speed enchants."); Util.setReason("Enable enchanting shields with damage enchants.");
Util.insertBeforeDeclared(thisClass, ctCombatHandler, "checkShield", insert); 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("" /*ctCombatHandler.getDeclaredMethod("checkShield").insertBefore(""
+ "if("+ShieldsTweaks.class.getName()+".checkShieldSpeed(defender.getShield())){" + "if("+ShieldsTweaks.class.getName()+".checkShieldSpeed(defender.getShield())){"
+ " defender.getCombatHandler().usedShieldThisRound--;" + " defender.getCombatHandler().usedShieldThisRound--;"
+ "}");*/ + "}");*/
} }
}catch (NotFoundException e) { } catch (NotFoundException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
} }