Added support for enchanting shields properly
This commit is contained in:
@@ -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'
|
||||
}
|
||||
|
||||
|
||||
@@ -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<ShieldsTweaks> 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<ShieldsTweaks> 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user