From cbefc251213f3f528c58ccd5b41cbbf36f5f0b67 Mon Sep 17 00:00:00 2001 From: Ziggeh Date: Sun, 13 Apr 2014 19:15:17 +0200 Subject: [PATCH] Refactored WeaponObject The scripting of weapons should be much, much easier now. See the included examples in DevService. Attributes such as attack speed and range are now being read/written to the actual items attributes. --- scripts/commands/co_hw_dot.py | 12 +- scripts/equipment/weapon_critical.py | 30 ++-- .../creature/creature_default_weapon.py | 7 + .../objects/weapon/WeaponObject.java | 128 +++++------------- src/services/CharacterService.java | 6 - src/services/DevService.java | 103 +++++++++----- src/services/EquipmentService.java | 10 +- 7 files changed, 141 insertions(+), 155 deletions(-) diff --git a/scripts/commands/co_hw_dot.py b/scripts/commands/co_hw_dot.py index 7b9a8aac..3ce9825c 100644 --- a/scripts/commands/co_hw_dot.py +++ b/scripts/commands/co_hw_dot.py @@ -18,7 +18,7 @@ def run(core, actor, target, commandString): elementalType = weapon.getElementalType() commandName = '' - if elementalType == '@obj_attr_n:elemental_heat': + if elementalType == 'heat': if actor.getLevel() >= 58: commandName = 'co_hw_dot_fire_1' if actor.getLevel() >= 60: @@ -29,7 +29,7 @@ def run(core, actor, target, commandString): commandName = 'co_hw_dot_fire_4' if actor.getLevel() >= 90: commandName = 'co_hw_dot_fire_5' - elif elementalType == '@obj_attr_n:elemental_cold': + elif elementalType == 'cold': if actor.getLevel() >= 58: commandName = 'co_hw_dot_cold_1' if actor.getLevel() >= 60: @@ -40,7 +40,7 @@ def run(core, actor, target, commandString): commandName = 'co_hw_dot_cold_4' if actor.getLevel() >= 90: commandName = 'co_hw_dot_cold_5' - elif elementalType == '@obj_attr_n:elemental_acid': + elif elementalType == 'acid': if actor.getLevel() >= 58: commandName = 'co_hw_dot_acid_1' if actor.getLevel() >= 60: @@ -51,7 +51,7 @@ def run(core, actor, target, commandString): commandName = 'co_hw_dot_acid_4' if actor.getLevel() >= 90: commandName = 'co_hw_dot_acid_5' - elif elementalType == '@obj_attr_n:elemental_electricity': + elif elementalType == 'electricity': if actor.getLevel() >= 58: commandName = 'co_hw_dot_electrical_1' if actor.getLevel() >= 60: @@ -62,7 +62,7 @@ def run(core, actor, target, commandString): commandName = 'co_hw_dot_electrical_4' if actor.getLevel() >= 90: commandName = 'co_hw_dot_electrical_5' - elif elementalType == '@obj_attr_n:elemental_energy': + elif elementalType == 'energy': if actor.getLevel() >= 58: commandName = 'co_hw_dot_energy_1' if actor.getLevel() >= 60: @@ -73,7 +73,7 @@ def run(core, actor, target, commandString): commandName = 'co_hw_dot_energy_4' if actor.getLevel() >= 90: commandName = 'co_hw_dot_energy_5' - elif elementalType =='@obj_attr_n:elemental_kinetic': + elif elementalType =='kinetic': if actor.getLevel() >= 58: commandName = 'co_hw_dot_kinetic_1' if actor.getLevel() >= 60: diff --git a/scripts/equipment/weapon_critical.py b/scripts/equipment/weapon_critical.py index 683c4692..9f392f34 100644 --- a/scripts/equipment/weapon_critical.py +++ b/scripts/equipment/weapon_critical.py @@ -1,25 +1,37 @@ import sys -def Rifle(): +def weap_0(): return "expertise_critical_rifle" -def Carbine(): +def weap_1(): return "expertise_critical_carbine" -def Pistol(): +def weap_2(): return "expertise_critical_pistol" -def OneHandedMelee(): +def weap_4(): return "expertise_critical_1h" -def TwoHandedMelee(): +def weap_5(): return "expertise_critical_2h" -def Unarmed(): +def weap_6(): return "expertise_critical_unarmed" -def Polearm(): +def weap_7(): return "expertise_critical_polearm" - -def FreeTargetingHeavyWeapon(): + +def weap_9(): + return "" + +def weap_10(): + return "" + +def weap_11(): + return "" + +def weap_12(): return "expertise_critical_heavy" + +def weap_13(): + return "expertise_critical_heavy" \ No newline at end of file diff --git a/scripts/object/weapon/creature/creature_default_weapon.py b/scripts/object/weapon/creature/creature_default_weapon.py index ccad8904..811f1296 100644 --- a/scripts/object/weapon/creature/creature_default_weapon.py +++ b/scripts/object/weapon/creature/creature_default_weapon.py @@ -1,4 +1,11 @@ import sys def setup(core, object): + object.setAttackSpeed(1) + object.setDamageType("kinetic") + object.setMinDamage(50) + object.setMaxDamage(100) + object.setMaxRange(5) + object.setWeaponType(6) + return \ No newline at end of file diff --git a/src/resources/objects/weapon/WeaponObject.java b/src/resources/objects/weapon/WeaponObject.java index 17325be5..392c206a 100644 --- a/src/resources/objects/weapon/WeaponObject.java +++ b/src/resources/objects/weapon/WeaponObject.java @@ -31,7 +31,7 @@ import engine.resources.scene.Planet; import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; -@Persistent(version=0) +@Persistent(version=1) public class WeaponObject extends TangibleObject { // TODO: Thread safety @@ -39,53 +39,24 @@ public class WeaponObject extends TangibleObject { @NotPersistent private WeaponMessageBuilder messageBuilder; - private float attackSpeed = 1; - private float maxRange; - public WeaponObject(long objectID, Planet planet, String template) { super(objectID, planet, template, new Point3D(0, 0, 0), new Quaternion(1, 0, 1, 0)); messageBuilder = new WeaponMessageBuilder(this); if (this.getClass().getSimpleName().equals("WeaponObject")) setIntAttribute("volume", 1); - calculateRange(); - calculateAttackSpeed(); + setStringAttribute("cat_wpn_damage.damage", "0-0"); } public WeaponObject(long objectID, Planet planet, String template, Point3D position, Quaternion orientation) { super(objectID, planet, template, position, orientation); messageBuilder = new WeaponMessageBuilder(this); if (this.getClass().getSimpleName().equals("WeaponObject")) setIntAttribute("volume", 1); - calculateRange(); - calculateAttackSpeed(); + setStringAttribute("cat_wpn_damage.damage", "0-0"); } public WeaponObject() { super(); messageBuilder = new WeaponMessageBuilder(this); - //calculateRange(); - } - - private void calculateRange() { - - int weaponType = getWeaponType(); - - switch(weaponType) { - - case 0: maxRange = 64; break; - case 1: maxRange = 50; break; - case 2: maxRange = 35; break; - case 12: maxRange = 64; break; - case 4: maxRange = 5; break; - case 5: maxRange = 5; break; - case 6: maxRange = 5; break; - case 7: maxRange = 5; break; - case 8: maxRange = 64; break; - case 9: maxRange = 5; break; - case 10: maxRange = 5; break; - case 11: maxRange = 5; break; - - } - } public int getIncapTimer() { @@ -118,7 +89,9 @@ public class WeaponObject extends TangibleObject { } public void setMaxDamage(int maxDamage) { + setStringAttribute("cat_wpn_damage.damage", String.valueOf(getMinDamage()) + "-" + String.valueOf(maxDamage)); + setIntAttribute("cat_wpn_damage.dps", getDamagePerSecond()); } public int getMinDamage() { @@ -126,7 +99,9 @@ public class WeaponObject extends TangibleObject { } public void setMinDamage(int minDamage) { + setStringAttribute("cat_wpn_damage.damage", String.valueOf(minDamage) + "-" + String.valueOf(getMaxDamage())); + setIntAttribute("cat_wpn_damage.dps", getDamagePerSecond()); } public int getElementalDamage() { @@ -135,14 +110,17 @@ public class WeaponObject extends TangibleObject { public void setElementalDamage(int elementalDamage) { setIntAttribute("cat_wpn_damage.wpn_elemental_value", elementalDamage); + setIntAttribute("cat_wpn_damage.dps", getDamagePerSecond()); } public String getElementalType() { - return getStringAttribute("cat_wpn_damage.wpn_elemental_type"); + if (getStringAttribute("cat_wpn_damage.wpn_elemental_type") != null ) + return getStringAttribute("cat_wpn_damage.wpn_elemental_type").replace("@obj_attr_n:elemental_", ""); + return null; } public void setElementalType(String elementalType) { - setStringAttribute("cat_wpn_damage.wpn_elemental_type", elementalType); + setStringAttribute("cat_wpn_damage.wpn_elemental_type", "@obj_attr_n:elemental_" + elementalType); } public String getDamageType() { @@ -150,43 +128,26 @@ public class WeaponObject extends TangibleObject { } public void setDamageType(String damageType) { - setStringAttribute("cat_wpn_damage.wpn_damage_type", damageType); + setStringAttribute("cat_wpn_damage.wpn_damage_type", "@obj_attr_n:armor_eff_" + damageType); } public int getDamagePerSecond() { - if (getElementalType() != null) + if(getAttributes().containsKey("cat_wpn_damage.damage") && getAttributes().containsKey("cat_wpn_damage.wpn_attack_speed")) { + + if (getElementalType() != null ) return (int) (((getMaxDamage() + getElementalDamage() + getMinDamage() + getElementalDamage()) / 2 + getElementalDamage()) * (1 / getAttackSpeed())); - else - return (int) (((getMaxDamage() + getMinDamage()) / 2 ) * (1 / getAttackSpeed())); + else + return (int) (((getMaxDamage() + getMinDamage()) / 2 ) * (1 / getAttackSpeed())); + } else + return 0; } public int getWeaponType() { - - int weaponType = -1; - - String template = getTemplate(); - - if(template == null) - return weaponType; - - if(template.contains("rifle")) weaponType = 0; - if(template.contains("carbine")) weaponType = 1; - if(template.contains("pistol")) weaponType = 2; - if(template.contains("heavy")) weaponType = 12; - if(template.contains("sword") || template.contains("baton")) weaponType = 4; - if(template.contains("2h_sword") || template.contains("axe")) weaponType = 5; - if(template.contains("unarmed")) weaponType = 6; - if(template.contains("polearm") || template.contains("lance")) weaponType = 7; - if(template.contains("thrown")) weaponType = 8; - if(template.contains("lightsaber_one_handed")) weaponType = 9; - if(template.contains("lightsaber_two_handed")) weaponType = 10; - if(template.contains("lightsaber_polearm")) weaponType = 11; - - if(weaponType == -1) - weaponType = 6; - - return weaponType; - + return Integer.parseInt(getStringAttribute("cat_wpn_damage.wpn_category").replace("@obj_attr_n:wpn_category_", "")); + } + + public void setWeaponType(int weaponType) { + setStringAttribute("cat_wpn_damage.wpn_category", "@obj_attr_n:wpn_category_" + weaponType); } @Override @@ -204,11 +165,15 @@ public class WeaponObject extends TangibleObject { } public float getAttackSpeed() { - return attackSpeed; + return getFloatAttribute("cat_wpn_damage.wpn_attack_speed"); } public void setAttackSpeed(float attackSpeed) { - this.attackSpeed = attackSpeed; + if((int) attackSpeed != attackSpeed) + setFloatAttribute("cat_wpn_damage.wpn_attack_speed", attackSpeed); + else + setIntAttribute("cat_wpn_damage.wpn_attack_speed", (int) attackSpeed); + } public WeaponMessageBuilder getMessageBuilder() { @@ -216,11 +181,14 @@ public class WeaponObject extends TangibleObject { } public float getMaxRange() { - return maxRange; + return Float.parseFloat(getStringAttribute("cat_wpn_damage.wpn_range").replace("0-", "").replace("m", "")); } public void setMaxRange(float maxRange) { - this.maxRange = maxRange; + if((int) maxRange != maxRange) + setStringAttribute("cat_wpn_damage.wpn_range", "0-" + String.valueOf(maxRange) + "m"); + else + setStringAttribute("cat_wpn_damage.wpn_range", "0-" + String.valueOf((int) maxRange) + "m"); } public boolean isMelee() { @@ -244,29 +212,5 @@ public class WeaponObject extends TangibleObject { return false; } - - private void calculateAttackSpeed() { - - int weaponType = getWeaponType(); - - switch(weaponType) { - - case 0: attackSpeed = 0.8f; break; - case 1: attackSpeed = 0.6f; break; - case 2: attackSpeed = 0.4f; break; - case 12: attackSpeed = 1; break; - case 4: attackSpeed = 1; break; - case 5: attackSpeed = 1; break; - case 6: attackSpeed = 1; break; - case 7: attackSpeed = 1; break; - case 8: attackSpeed = 1; break; - case 9: attackSpeed = 1; break; - case 10: attackSpeed = 1; break; - case 11: attackSpeed = 1; break; - - } - - } - } diff --git a/src/services/CharacterService.java b/src/services/CharacterService.java index 9a00b424..67c67f51 100644 --- a/src/services/CharacterService.java +++ b/src/services/CharacterService.java @@ -331,13 +331,7 @@ public class CharacterService implements INetworkDispatch { object.addObjectToEquipList(appInventory); WeaponObject defaultWeapon = (WeaponObject) core.objectService.createObject("object/weapon/creature/shared_creature_default_weapon.iff", object.getPlanet()); - defaultWeapon.setDamageType("@obj_attr_n:armor_eff_kinetic"); - defaultWeapon.setStringAttribute("cat_wpn_damage.damage", "0-0"); - defaultWeapon.setMaxDamage(100); - defaultWeapon.setMinDamage(50); - object.addObjectToEquipList(defaultWeapon); - object._add(defaultWeapon); object.setWeaponId(defaultWeapon.getObjectID()); diff --git a/src/services/DevService.java b/src/services/DevService.java index 58c9fea4..b8ef3c31 100644 --- a/src/services/DevService.java +++ b/src/services/DevService.java @@ -43,6 +43,7 @@ import resources.objects.deed.Player_House_Deed; import resources.objects.player.PlayerObject; import resources.objects.tangible.TangibleObject; import resources.objects.tool.SurveyTool; +import resources.objects.weapon.WeaponObject; import services.sui.SUIWindow; import services.sui.SUIService.ListBoxType; import services.sui.SUIWindow.SUICallback; @@ -96,6 +97,7 @@ public class DevService implements INetworkDispatch { suiOptions.put((long) 30, "Jedi Weapons"); suiOptions.put((long) 31, "Melee Weapons"); suiOptions.put((long) 32, "Ranged Weapons"); + suiOptions.put((long) 33, "Heavy Weapons"); break; case 4: // [Items] Misc Items suiOptions.put((long) 40, "Unity Ring"); @@ -202,26 +204,35 @@ public class DevService implements INetworkDispatch { // [Items] Weapons case 30: // Jedi Weapons - TangibleObject lightsaber1 = (TangibleObject) core.objectService.createObject("object/weapon/melee/sword/crafted_saber/shared_sword_lightsaber_one_handed_gen5.iff", planet); + WeaponObject lightsaber1 = (WeaponObject) core.objectService.createObject("object/weapon/melee/sword/crafted_saber/shared_sword_lightsaber_one_handed_gen5.iff", planet); lightsaber1.setIntAttribute("required_combat_level", 90); - lightsaber1.setFloatAttribute("cat_wpn_damage.wpn_attack_speed", 1); lightsaber1.setStringAttribute("class_required", "Jedi"); - lightsaber1.setStringAttribute("cat_wpn_damage.wpn_damage_type", "Energy"); - lightsaber1.setStringAttribute("cat_wpn_damage.damage", "689-1379"); + lightsaber1.setAttackSpeed(1); + lightsaber1.setDamageType("energy"); + lightsaber1.setMaxRange(5); + lightsaber1.setMinDamage(689); + lightsaber1.setMaxDamage(1379); + lightsaber1.setWeaponType(9); - TangibleObject lightsaber2 = (TangibleObject) core.objectService.createObject("object/weapon/melee/2h_sword/crafted_saber/shared_sword_lightsaber_two_handed_gen5.iff", planet); + WeaponObject lightsaber2 = (WeaponObject) core.objectService.createObject("object/weapon/melee/2h_sword/crafted_saber/shared_sword_lightsaber_two_handed_gen5.iff", planet); lightsaber2.setIntAttribute("required_combat_level", 90); - lightsaber2.setFloatAttribute("cat_wpn_damage.wpn_attack_speed", 1); lightsaber2.setStringAttribute("class_required", "Jedi"); - lightsaber2.setStringAttribute("cat_wpn_damage.wpn_damage_type", "Energy"); - lightsaber2.setStringAttribute("cat_wpn_damage.damage", "689-1379"); + lightsaber2.setAttackSpeed(1); + lightsaber2.setDamageType("energy"); + lightsaber2.setMaxRange(5); + lightsaber2.setMinDamage(689); + lightsaber2.setMaxDamage(1379); + lightsaber2.setWeaponType(10); - TangibleObject lightsaber3 = (TangibleObject) core.objectService.createObject("object/weapon/melee/polearm/crafted_saber/shared_sword_lightsaber_polearm_gen5.iff", planet); + WeaponObject lightsaber3 = (WeaponObject) core.objectService.createObject("object/weapon/melee/polearm/crafted_saber/shared_sword_lightsaber_polearm_gen5.iff", planet); lightsaber3.setIntAttribute("required_combat_level", 90); - lightsaber3.setFloatAttribute("cat_wpn_damage.wpn_attack_speed", 1); lightsaber3.setStringAttribute("class_required", "Jedi"); - lightsaber3.setStringAttribute("cat_wpn_damage.wpn_damage_type", "Energy"); - lightsaber3.setStringAttribute("cat_wpn_damage.damage", "689-1379"); + lightsaber3.setAttackSpeed(1); + lightsaber3.setDamageType("energy"); + lightsaber3.setMaxRange(5); + lightsaber3.setMinDamage(689); + lightsaber3.setMaxDamage(1379); + lightsaber3.setWeaponType(11); Random random = new Random(); @@ -234,43 +245,67 @@ public class DevService implements INetworkDispatch { inventory.add(lightsaber3); return; case 31: // Melee Weapons - SWGObject sword1 = core.objectService.createObject("object/weapon/melee/sword/shared_sword_01.iff", planet); + WeaponObject sword1 = (WeaponObject) core.objectService.createObject("object/weapon/melee/sword/shared_sword_01.iff", planet); sword1.setIntAttribute("required_combat_level", 90); - sword1.setFloatAttribute("cat_wpn_damage.wpn_attack_speed", 1); - sword1.setStringAttribute("class_required", "None"); - sword1.setStringAttribute("cat_wpn_damage.wpn_damage_type", "Energy"); - sword1.setStringAttribute("cat_wpn_damage.damage", "1100-1200"); + sword1.setAttackSpeed(1); + sword1.setMaxRange(5); + sword1.setDamageType("kinetic"); + sword1.setMinDamage(1100); + sword1.setMaxDamage(1200); + sword1.setWeaponType(4); inventory.add(sword1); return; case 32: // Ranged Weapons - SWGObject rifle1 = core.objectService.createObject("object/weapon/ranged/rifle/shared_rifle_e11.iff", planet); + WeaponObject rifle1 = (WeaponObject) core.objectService.createObject("object/weapon/ranged/rifle/shared_rifle_e11.iff", planet); rifle1.setIntAttribute("required_combat_level", 90); - rifle1.setFloatAttribute("cat_wpn_damage.wpn_attack_speed", (float) 0.8); - rifle1.setStringAttribute("class_required", "None"); - rifle1.setStringAttribute("cat_wpn_damage.wpn_damage_type", "Energy"); - rifle1.setStringAttribute("cat_wpn_damage.damage", "800-1250"); + rifle1.setAttackSpeed((float) 0.8); + rifle1.setMaxRange(64); + rifle1.setDamageType("energy"); + rifle1.setMinDamage(800); + rifle1.setMaxDamage(1250); + rifle1.setWeaponType(0); inventory.add(rifle1); - SWGObject pistol = core.objectService.createObject("object/weapon/ranged/pistol/shared_pistol_cdef.iff", planet); + WeaponObject carbine1 = (WeaponObject) core.objectService.createObject("object/weapon/ranged/carbine/shared_carbine_cdef.iff", planet); + carbine1.setIntAttribute("required_combat_level", 90); + carbine1.setAttackSpeed((float) 0.6); + carbine1.setMaxRange(50); + carbine1.setDamageType("energy"); + carbine1.setMinDamage(600); + carbine1.setMaxDamage(937); + carbine1.setWeaponType(1); + + inventory.add(carbine1); + + WeaponObject pistol = (WeaponObject) core.objectService.createObject("object/weapon/ranged/pistol/shared_pistol_cdef.iff", planet); pistol.setIntAttribute("required_combat_level", 90); - pistol.setFloatAttribute("cat_wpn_damage.wpn_attack_speed", (float) 0.4); - pistol.setStringAttribute("class_required", "None"); - pistol.setStringAttribute("cat_wpn_damage.wpn_damage_type", "Energy"); - pistol.setStringAttribute("cat_wpn_damage.damage", "400-559"); + pistol.setAttackSpeed((float) 0.4); + pistol.setMaxRange(35); + pistol.setDamageType("energy"); + pistol.setMinDamage(400); + pistol.setMaxDamage(625); + pistol.setWeaponType(2); inventory.add(pistol); + return; - /* == Disabled until Elemental Damage is implemented. == - SWGObject heavy = core.objectService.createObject("object/weapon/ranged/heavy/shared_som_lava_cannon_generic.iff", planet); + case 33: + WeaponObject heavy = (WeaponObject) core.objectService.createObject("object/weapon/ranged/heavy/shared_som_lava_cannon_generic.iff", planet); heavy.setIntAttribute("required_combat_level", 90); - heavy.setFloatAttribute("cat_wpn_damage.wpn_attack_speed", 1); - heavy.setStringAttribute("class_required", "Commando"); - heavy.setStringAttribute("cat_wpn_damage.wpn_damage_type", "Energy"); - heavy.setStringAttribute("cat_wpn_damage.damage", "700-1400"); - inventory.add(heavy);*/ + heavy.setStringAttribute("class_required", "Commando"); + heavy.setDamageType("kinetic"); + heavy.setMinDamage(700); + heavy.setMaxDamage(1400); + heavy.setMaxRange(64); + heavy.setAttackSpeed(1); + heavy.setElementalType("heat"); + heavy.setElementalDamage(200); + heavy.setWeaponType(12); + + inventory.add(heavy); return; case 40: TangibleObject ring = (TangibleObject) core.objectService.createObject("object/tangible/wearables/ring/shared_ring_s01.iff", planet); diff --git a/src/services/EquipmentService.java b/src/services/EquipmentService.java index 12764c94..380dae39 100644 --- a/src/services/EquipmentService.java +++ b/src/services/EquipmentService.java @@ -278,14 +278,8 @@ public class EquipmentService implements INetworkDispatch { private int getWeaponCriticalChance(CreatureObject actor, SWGObject item) { int weaponCriticalChance = 0; - String weaponCriticalSkillMod = (core.scriptService.getMethod("scripts/equipment/", "weapon_critical", item.getStringAttribute("cat_wpn_damage.wpn_category")).__call__().asString()); - - if(weaponCriticalSkillMod.contains(" ")) - weaponCriticalSkillMod.replace(" ", ""); - - if(weaponCriticalSkillMod.contains("-")) - weaponCriticalSkillMod.replace("-", ""); - + String weaponCriticalSkillMod = (core.scriptService.getMethod("scripts/equipment/", "weapon_critical", "weap_" + item.getStringAttribute("cat_wpn_damage.wpn_category").replace("@obj_attr_n:wpn_category_", "")).__call__().asString()); + if(actor.getSkillMod(weaponCriticalSkillMod) != null) weaponCriticalChance = actor.getSkillModBase(weaponCriticalSkillMod);