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.
This commit is contained in:
Ziggeh
2014-04-13 19:15:17 +02:00
parent b1f413e382
commit cbefc25121
7 changed files with 141 additions and 155 deletions
+6 -6
View File
@@ -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:
+21 -9
View File
@@ -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"
@@ -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
+36 -92
View File
@@ -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;
}
}
}
-6
View File
@@ -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());
+69 -34
View File
@@ -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);
+2 -8
View File
@@ -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);