From a207cfc4beae992381faedff1cad2369b69dccd9 Mon Sep 17 00:00:00 2001 From: portocol Date: Sat, 12 Apr 2014 21:23:34 -0400 Subject: [PATCH 01/32] Added heroic jewelry set bonus scripts --- scripts/buffs/set_bonus_jedi_utility_b_1.py | 16 +++++++++++ scripts/buffs/set_bonus_jedi_utility_b_2.py | 18 ++++++++++++ scripts/buffs/set_bonus_jedi_utility_b_3.py | 20 +++++++++++++ .../equipment/bonus_sets/set_bonus_bh_dps.py | 28 +++++++++++++++++++ .../bonus_sets/set_bonus_bh_utility_a.py | 28 +++++++++++++++++++ .../bonus_sets/set_bonus_bh_utility_b.py | 28 +++++++++++++++++++ .../bonus_sets/set_bonus_jedi_utility_b.py | 28 +++++++++++++++++++ .../bonus_sets/set_bonus_medic_dps.py | 28 +++++++++++++++++++ .../bonus_sets/set_bonus_medic_utility_a.py | 28 +++++++++++++++++++ .../bonus_sets/set_bonus_medic_utility_b.py | 28 +++++++++++++++++++ .../equipment/bonus_sets/set_bonus_spy_dps.py | 28 +++++++++++++++++++ .../bonus_sets/set_bonus_spy_utility_a.py | 28 +++++++++++++++++++ .../bonus_sets/set_bonus_spy_utility_b.py | 28 +++++++++++++++++++ 13 files changed, 334 insertions(+) create mode 100644 scripts/buffs/set_bonus_jedi_utility_b_1.py create mode 100644 scripts/buffs/set_bonus_jedi_utility_b_2.py create mode 100644 scripts/buffs/set_bonus_jedi_utility_b_3.py create mode 100644 scripts/equipment/bonus_sets/set_bonus_bh_dps.py create mode 100644 scripts/equipment/bonus_sets/set_bonus_bh_utility_a.py create mode 100644 scripts/equipment/bonus_sets/set_bonus_bh_utility_b.py create mode 100644 scripts/equipment/bonus_sets/set_bonus_jedi_utility_b.py create mode 100644 scripts/equipment/bonus_sets/set_bonus_medic_dps.py create mode 100644 scripts/equipment/bonus_sets/set_bonus_medic_utility_a.py create mode 100644 scripts/equipment/bonus_sets/set_bonus_medic_utility_b.py create mode 100644 scripts/equipment/bonus_sets/set_bonus_spy_dps.py create mode 100644 scripts/equipment/bonus_sets/set_bonus_spy_utility_a.py create mode 100644 scripts/equipment/bonus_sets/set_bonus_spy_utility_b.py diff --git a/scripts/buffs/set_bonus_jedi_utility_b_1.py b/scripts/buffs/set_bonus_jedi_utility_b_1.py new file mode 100644 index 00000000..d13f83cc --- /dev/null +++ b/scripts/buffs/set_bonus_jedi_utility_b_1.py @@ -0,0 +1,16 @@ +import sys + +def setup(core, actor, buff): + return + +def add(core, actor, buff): + core.skillModService.addSkillMod(actor, 'constitution_modified', 25) + core.skillModService.addSkillMod(actor, 'combat_critical_hit_reduction', 1) + core.skillModService.addSkillMod(actor, 'display_only_expertise_critical_hit_reduction', 100) + return + +def remove(core, actor, buff): + core.skillModService.deductSkillMod(actor, 'constitution_modified', 25) + core.skillModService.deductSkillMod(actor, 'combat_critical_hit_reduction', 1) + core.skillModService.deductSkillMod(actor, 'display_only_expertise_critical_hit_reduction', 100) + return diff --git a/scripts/buffs/set_bonus_jedi_utility_b_2.py b/scripts/buffs/set_bonus_jedi_utility_b_2.py new file mode 100644 index 00000000..c682aaa7 --- /dev/null +++ b/scripts/buffs/set_bonus_jedi_utility_b_2.py @@ -0,0 +1,18 @@ +import sys + +def setup(core, actor, buff): + return + +def add(core, actor, buff): + core.skillModService.addSkillMod(actor, 'constitution_modified', 50) + core.skillModService.addSkillMod(actor, 'combat_critical_hit_reduction', 3) + core.skillModService.addSkillMod(actor, 'display_only_expertise_critical_hit_reduction', 300) + core.skillModService.addSkillMod(actor, 'expertise_action_all', 5) + return + +def remove(core, actor, buff): + core.skillModService.deductSkillMod(actor, 'constitution_modified', 50) + core.skillModService.deductSkillMod(actor, 'combat_critical_hit_reduction', 3) + core.skillModService.deductSkillMod(actor, 'display_only_expertise_critical_hit_reduction', 300) + core.skillModService.deductSkillMod(actor, 'expertise_action_all', 5) + return diff --git a/scripts/buffs/set_bonus_jedi_utility_b_3.py b/scripts/buffs/set_bonus_jedi_utility_b_3.py new file mode 100644 index 00000000..f2709736 --- /dev/null +++ b/scripts/buffs/set_bonus_jedi_utility_b_3.py @@ -0,0 +1,20 @@ +import sys + +def setup(core, actor, buff): + return + +def add(core, actor, buff): + core.skillModService.addSkillMod(actor, 'constitution_modified', 150) + core.skillModService.addSkillMod(actor, 'combat_critical_hit_reduction', 5) + core.skillModService.addSkillMod(actor, 'display_only_expertise_critical_hit_reduction', 500) + core.skillModService.addSkillMod(actor, 'expertise_action_all', 10) + #actor.addAbility("fs_set_heroic_taunt_1") + return + +def remove(core, actor, buff): + core.skillModService.deductSkillMod(actor, 'constitution_modified', 150) + core.skillModService.deductSkillMod(actor, 'combat_critical_hit_reduction', 5) + core.skillModService.deductSkillMod(actor, 'display_only_expertise_critical_hit_reduction', 500) + core.skillModService.deductSkillMod(actor, 'expertise_action_all', 10) + #actor.removeAbility("fs_set_heroic_taunt_1") + return diff --git a/scripts/equipment/bonus_sets/set_bonus_bh_dps.py b/scripts/equipment/bonus_sets/set_bonus_bh_dps.py new file mode 100644 index 00000000..61b48b47 --- /dev/null +++ b/scripts/equipment/bonus_sets/set_bonus_bh_dps.py @@ -0,0 +1,28 @@ +import sys +from services.equipment import BonusSetTemplate +from java.util import Vector + +def addBonusSet(core): + bonusSet = BonusSetTemplate("set_bonus_bh_dps") + + bonusSet.addRequiredItem("item_band_set_bh_dps_01_01") + bonusSet.addRequiredItem("item_ring_set_bh_dps_01_01") + bonusSet.addRequiredItem("item_necklace_set_bh_dps_01_01") + bonusSet.addRequiredItem("item_bracelet_r_set_bh_dps_01_01") + bonusSet.addRequiredItem("item_bracelet_l_set_bh_dps_01_01") + + core.equipmentService.addBonusSetTemplate(bonusSet) + +def handleChange(core, creature, set): + wornItems = set.getWornTemplateCount(creature) + + if wornItems == 3: + core.buffService.addBuffToCreature(creature, "set_bonus_bh_dps_1", creature) + elif wornItems == 4: + core.buffService.addBuffToCreature(creature, "set_bonus_bh_dps_2", creature) + elif wornItems == 5: + core.buffService.addBuffToCreature(creature, "set_bonus_bh_dps_3", creature) + else: + core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_bh_dps_1") + core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_bh_dps_2") + core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_bh_dps_3") \ No newline at end of file diff --git a/scripts/equipment/bonus_sets/set_bonus_bh_utility_a.py b/scripts/equipment/bonus_sets/set_bonus_bh_utility_a.py new file mode 100644 index 00000000..609c2d28 --- /dev/null +++ b/scripts/equipment/bonus_sets/set_bonus_bh_utility_a.py @@ -0,0 +1,28 @@ +import sys +from services.equipment import BonusSetTemplate +from java.util import Vector + +def addBonusSet(core): + bonusSet = BonusSetTemplate("set_bonus_bh_utility_a") + + bonusSet.addRequiredItem("item_band_set_bh_utility_a_01_01") + bonusSet.addRequiredItem("item_ring_set_bh_utility_a_01_01") + bonusSet.addRequiredItem("item_necklace_set_bh_utility_a_01_01") + bonusSet.addRequiredItem("item_bracelet_r_set_bh_utility_a_01_01") + bonusSet.addRequiredItem("item_bracelet_l_set_bh_utility_a_01_01") + + core.equipmentService.addBonusSetTemplate(bonusSet) + +def handleChange(core, creature, set): + wornItems = set.getWornTemplateCount(creature) + + if wornItems == 3: + core.buffService.addBuffToCreature(creature, "set_bonus_bh_utility_a_1", creature) + elif wornItems == 4: + core.buffService.addBuffToCreature(creature, "set_bonus_bh_utility_a_2", creature) + elif wornItems == 5: + core.buffService.addBuffToCreature(creature, "set_bonus_bh_utility_a_3", creature) + else: + core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_bh_utility_a_1") + core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_bh_utility_a_2") + core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_bh_utility_a_3") \ No newline at end of file diff --git a/scripts/equipment/bonus_sets/set_bonus_bh_utility_b.py b/scripts/equipment/bonus_sets/set_bonus_bh_utility_b.py new file mode 100644 index 00000000..5f9e272d --- /dev/null +++ b/scripts/equipment/bonus_sets/set_bonus_bh_utility_b.py @@ -0,0 +1,28 @@ +import sys +from services.equipment import BonusSetTemplate +from java.util import Vector + +def addBonusSet(core): + bonusSet = BonusSetTemplate("set_bonus_bh_utility_b") + + bonusSet.addRequiredItem("item_band_set_bh_utility_b_01_01") + bonusSet.addRequiredItem("item_ring_set_bh_utility_b_01_01") + bonusSet.addRequiredItem("item_necklace_set_bh_utility_b_01_01") + bonusSet.addRequiredItem("item_bracelet_r_set_bh_utility_b_01_01") + bonusSet.addRequiredItem("item_bracelet_l_set_bh_utility_b_01_01") + + core.equipmentService.addBonusSetTemplate(bonusSet) + +def handleChange(core, creature, set): + wornItems = set.getWornTemplateCount(creature) + + if wornItems == 3: + core.buffService.addBuffToCreature(creature, "set_bonus_bh_utility_b_1", creature) + elif wornItems == 4: + core.buffService.addBuffToCreature(creature, "set_bonus_bh_utility_b_2", creature) + elif wornItems == 5: + core.buffService.addBuffToCreature(creature, "set_bonus_bh_utility_b_3", creature) + else: + core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_bh_utility_b_1") + core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_bh_utility_b_2") + core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_bh_utility_b_3") \ No newline at end of file diff --git a/scripts/equipment/bonus_sets/set_bonus_jedi_utility_b.py b/scripts/equipment/bonus_sets/set_bonus_jedi_utility_b.py new file mode 100644 index 00000000..b344bf0a --- /dev/null +++ b/scripts/equipment/bonus_sets/set_bonus_jedi_utility_b.py @@ -0,0 +1,28 @@ +import sys +from services.equipment import BonusSetTemplate +from java.util import Vector + +def addBonusSet(core): + bonusSet = BonusSetTemplate("set_bonus_jedi_utility_b") + + bonusSet.addRequiredItem("item_band_set_jedi_utility_b_01_01") + bonusSet.addRequiredItem("item_ring_set_jedi_utility_b_01_01") + bonusSet.addRequiredItem("item_necklace_set_jedi_utility_b_01_01") + bonusSet.addRequiredItem("item_bracelet_r_set_jedi_utility_b_01_01") + bonusSet.addRequiredItem("item_bracelet_l_set_jedi_utility_b_01_01") + + core.equipmentService.addBonusSetTemplate(bonusSet) + +def handleChange(core, creature, set): + wornItems = set.getWornTemplateCount(creature) + + if wornItems == 3: + core.buffService.addBuffToCreature(creature, "set_bonus_jedi_utility_b_1", creature) + elif wornItems == 4: + core.buffService.addBuffToCreature(creature, "set_bonus_jedi_utility_b_2", creature) + elif wornItems == 5: + core.buffService.addBuffToCreature(creature, "set_bonus_jedi_utility_b_3", creature) + else: + core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_jedi_utility_b_1") + core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_jedi_utility_b_2") + core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_jedi_utility_b_3") diff --git a/scripts/equipment/bonus_sets/set_bonus_medic_dps.py b/scripts/equipment/bonus_sets/set_bonus_medic_dps.py new file mode 100644 index 00000000..f1966755 --- /dev/null +++ b/scripts/equipment/bonus_sets/set_bonus_medic_dps.py @@ -0,0 +1,28 @@ +import sys +from services.equipment import BonusSetTemplate +from java.util import Vector + +def addBonusSet(core): + bonusSet = BonusSetTemplate("set_bonus_medic_dps") + + bonusSet.addRequiredItem("item_band_set_medic_dps_01_01") + bonusSet.addRequiredItem("item_ring_set_medic_dps_01_01") + bonusSet.addRequiredItem("item_necklace_set_medic_dps_01_01") + bonusSet.addRequiredItem("item_bracelet_r_set_medic_dps_01_01") + bonusSet.addRequiredItem("item_bracelet_l_set_medic_dps_01_01") + + core.equipmentService.addBonusSetTemplate(bonusSet) + +def handleChange(core, creature, set): + wornItems = set.getWornTemplateCount(creature) + + if wornItems == 3: + core.buffService.addBuffToCreature(creature, "set_bonus_medic_dps_1", creature) + elif wornItems == 4: + core.buffService.addBuffToCreature(creature, "set_bonus_medic_dps_2", creature) + elif wornItems == 5: + core.buffService.addBuffToCreature(creature, "set_bonus_medic_dps_3", creature) + else: + core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_medic_dps_1") + core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_medic_dps_2") + core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_medic_dps_3") \ No newline at end of file diff --git a/scripts/equipment/bonus_sets/set_bonus_medic_utility_a.py b/scripts/equipment/bonus_sets/set_bonus_medic_utility_a.py new file mode 100644 index 00000000..c21b2adb --- /dev/null +++ b/scripts/equipment/bonus_sets/set_bonus_medic_utility_a.py @@ -0,0 +1,28 @@ +import sys +from services.equipment import BonusSetTemplate +from java.util import Vector + +def addBonusSet(core): + bonusSet = BonusSetTemplate("set_bonus_medic_utility_a") + + bonusSet.addRequiredItem("item_band_set_medic_utility_a_01_01") + bonusSet.addRequiredItem("item_ring_set_medic_utility_a_01_01") + bonusSet.addRequiredItem("item_necklace_set_medic_utility_a_01_01") + bonusSet.addRequiredItem("item_bracelet_r_set_medic_utility_a_01_01") + bonusSet.addRequiredItem("item_bracelet_l_set_medic_utility_a_01_01") + + core.equipmentService.addBonusSetTemplate(bonusSet) + +def handleChange(core, creature, set): + wornItems = set.getWornTemplateCount(creature) + + if wornItems == 3: + core.buffService.addBuffToCreature(creature, "set_bonus_medic_utility_a_1", creature) + elif wornItems == 4: + core.buffService.addBuffToCreature(creature, "set_bonus_medic_utility_a_2", creature) + elif wornItems == 5: + core.buffService.addBuffToCreature(creature, "set_bonus_medic_utility_a_3", creature) + else: + core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_medic_utility_a_1") + core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_medic_utility_a_2") + core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_medic_utility_a_3") \ No newline at end of file diff --git a/scripts/equipment/bonus_sets/set_bonus_medic_utility_b.py b/scripts/equipment/bonus_sets/set_bonus_medic_utility_b.py new file mode 100644 index 00000000..cc02a043 --- /dev/null +++ b/scripts/equipment/bonus_sets/set_bonus_medic_utility_b.py @@ -0,0 +1,28 @@ +import sys +from services.equipment import BonusSetTemplate +from java.util import Vector + +def addBonusSet(core): + bonusSet = BonusSetTemplate("set_bonus_medic_utility_b") + + bonusSet.addRequiredItem("item_band_set_medic_utility_b_01_01") + bonusSet.addRequiredItem("item_ring_set_medic_utility_b_01_01") + bonusSet.addRequiredItem("item_necklace_set_medic_utility_b_01_01") + bonusSet.addRequiredItem("item_bracelet_r_set_medic_utility_b_01_01") + bonusSet.addRequiredItem("item_bracelet_l_set_medic_utility_b_01_01") + + core.equipmentService.addBonusSetTemplate(bonusSet) + +def handleChange(core, creature, set): + wornItems = set.getWornTemplateCount(creature) + + if wornItems == 3: + core.buffService.addBuffToCreature(creature, "set_bonus_medic_utility_b_1", creature) + elif wornItems == 4: + core.buffService.addBuffToCreature(creature, "set_bonus_medic_utility_b_2", creature) + elif wornItems == 5: + core.buffService.addBuffToCreature(creature, "set_bonus_medic_utility_b_3", creature) + else: + core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_medic_utility_b_1") + core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_medic_utility_b_2") + core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_medic_utility_b_3") \ No newline at end of file diff --git a/scripts/equipment/bonus_sets/set_bonus_spy_dps.py b/scripts/equipment/bonus_sets/set_bonus_spy_dps.py new file mode 100644 index 00000000..0cd1747e --- /dev/null +++ b/scripts/equipment/bonus_sets/set_bonus_spy_dps.py @@ -0,0 +1,28 @@ +import sys +from services.equipment import BonusSetTemplate +from java.util import Vector + +def addBonusSet(core): + bonusSet = BonusSetTemplate("set_bonus_spy_dps") + + bonusSet.addRequiredItem("item_band_set_spy_dps_01_01") + bonusSet.addRequiredItem("item_ring_set_spy_dps_01_01") + bonusSet.addRequiredItem("item_necklace_set_spy_dps_01_01") + bonusSet.addRequiredItem("item_bracelet_r_set_spy_dps_01_01") + bonusSet.addRequiredItem("item_bracelet_l_set_spy_dps_01_01") + + core.equipmentService.addBonusSetTemplate(bonusSet) + +def handleChange(core, creature, set): + wornItems = set.getWornTemplateCount(creature) + + if wornItems == 3: + core.buffService.addBuffToCreature(creature, "set_bonus_spy_dps_1", creature) + elif wornItems == 4: + core.buffService.addBuffToCreature(creature, "set_bonus_spy_dps_2", creature) + elif wornItems == 5: + core.buffService.addBuffToCreature(creature, "set_bonus_spy_dps_3", creature) + else: + core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_spy_dps_1") + core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_spy_dps_2") + core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_spy_dps_3") \ No newline at end of file diff --git a/scripts/equipment/bonus_sets/set_bonus_spy_utility_a.py b/scripts/equipment/bonus_sets/set_bonus_spy_utility_a.py new file mode 100644 index 00000000..7ecc68fa --- /dev/null +++ b/scripts/equipment/bonus_sets/set_bonus_spy_utility_a.py @@ -0,0 +1,28 @@ +import sys +from services.equipment import BonusSetTemplate +from java.util import Vector + +def addBonusSet(core): + bonusSet = BonusSetTemplate("set_bonus_spy_utility_a") + + bonusSet.addRequiredItem("item_band_set_spy_utility_a_01_01") + bonusSet.addRequiredItem("item_ring_set_spy_utility_a_01_01") + bonusSet.addRequiredItem("item_necklace_set_spy_utility_a_01_01") + bonusSet.addRequiredItem("item_bracelet_r_set_spy_utility_a_01_01") + bonusSet.addRequiredItem("item_bracelet_l_set_spy_utility_a_01_01") + + core.equipmentService.addBonusSetTemplate(bonusSet) + +def handleChange(core, creature, set): + wornItems = set.getWornTemplateCount(creature) + + if wornItems == 3: + core.buffService.addBuffToCreature(creature, "set_bonus_spy_utility_a_1", creature) + elif wornItems == 4: + core.buffService.addBuffToCreature(creature, "set_bonus_spy_utility_a_2", creature) + elif wornItems == 5: + core.buffService.addBuffToCreature(creature, "set_bonus_spy_utility_a_3", creature) + else: + core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_spy_utility_a_1") + core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_spy_utility_a_2") + core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_spy_utility_a_3") \ No newline at end of file diff --git a/scripts/equipment/bonus_sets/set_bonus_spy_utility_b.py b/scripts/equipment/bonus_sets/set_bonus_spy_utility_b.py new file mode 100644 index 00000000..09536bd4 --- /dev/null +++ b/scripts/equipment/bonus_sets/set_bonus_spy_utility_b.py @@ -0,0 +1,28 @@ +import sys +from services.equipment import BonusSetTemplate +from java.util import Vector + +def addBonusSet(core): + bonusSet = BonusSetTemplate("set_bonus_spy_utility_b") + + bonusSet.addRequiredItem("item_band_set_spy_utility_b_01_01") + bonusSet.addRequiredItem("item_ring_set_spy_utility_b_01_01") + bonusSet.addRequiredItem("item_necklace_set_spy_utility_b_01_01") + bonusSet.addRequiredItem("item_bracelet_r_set_spy_utility_b_01_01") + bonusSet.addRequiredItem("item_bracelet_l_set_spy_utility_b_01_01") + + core.equipmentService.addBonusSetTemplate(bonusSet) + +def handleChange(core, creature, set): + wornItems = set.getWornTemplateCount(creature) + + if wornItems == 3: + core.buffService.addBuffToCreature(creature, "set_bonus_spy_utility_b_1", creature) + elif wornItems == 4: + core.buffService.addBuffToCreature(creature, "set_bonus_spy_utility_b_2", creature) + elif wornItems == 5: + core.buffService.addBuffToCreature(creature, "set_bonus_spy_utility_b_3", creature) + else: + core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_spy_utility_b_1") + core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_spy_utility_b_2") + core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_spy_utility_b_3") \ No newline at end of file From 13495e3f3501150363be7dbdec3d0f54c74c8b48 Mon Sep 17 00:00:00 2001 From: CharonInferar Date: Sun, 13 Apr 2014 02:22:45 +0200 Subject: [PATCH 02/32] first work on swoop deed --- .../deed/vehicle_deed/speederbike_swoop_deed.py | 8 ++++---- scripts/radial/vehicle.py | 13 ++++++++++++- src/services/DevService.java | 5 +++++ 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/scripts/object/tangible/deed/vehicle_deed/speederbike_swoop_deed.py b/scripts/object/tangible/deed/vehicle_deed/speederbike_swoop_deed.py index eb077d1f..abd61184 100644 --- a/scripts/object/tangible/deed/vehicle_deed/speederbike_swoop_deed.py +++ b/scripts/object/tangible/deed/vehicle_deed/speederbike_swoop_deed.py @@ -7,13 +7,13 @@ def setup(core, object): def use(core, actor, object): datapad = actor.getSlottedObject('datapad') - pcd = core.objectService.createObject('object/intangible/vehicle/shared_speederbike_swoop_pcd.iff', actor.getPlanet(), actor.getPosition()) - + pcd = core.objectService.createObject('object/intangible/vehicle/shared_speederbike_swoop_pcd.iff', actor.getPlanet(), actor.getPosition().x, actor.getPosition().z,actor.getPosition().y) + actor.sendSystemMessage('actor.getObjectID() %s' % actor.getObjectID(), 0) if datapad and pcd: datapad.add(pcd) core.objectService.destroyObject(object) - vehicle = createObject('object/mobile/vehicle/shared_speederbike_swoop.iff', pcd.getAttachment('vehicleId'), actor.getPlanet(), actor.getPosition(), actor.getOrientation()) - vehicle.setOwnerId(actor.getObjectID()) + vehicle = core.objectService.createObject('object/mobile/vehicle/shared_speederbike_swoop.iff', actor.getPlanet(), actor.getPosition().x, actor.getPosition().z,actor.getPosition().y) + vehicle.setOwner(actor) core.simulationService.add(vehicle, vehicle.getPosition().x, vehicle.getPosition().z, True) return \ No newline at end of file diff --git a/scripts/radial/vehicle.py b/scripts/radial/vehicle.py index ca1f4311..2585a9ef 100644 --- a/scripts/radial/vehicle.py +++ b/scripts/radial/vehicle.py @@ -1,4 +1,6 @@ from resources.common import RadialOptions +from resources.common import RadialOptions +from services.ai import Vehicles import sys def createRadial(core, owner, target, radials): @@ -11,7 +13,16 @@ def createRadial(core, owner, target, radials): def handleSelection(core, owner, target, option): if target: if option == 21 or option == 40: - core.objectService.useObject(owner, target) + #owner.setPosture(16) + owner.setMounted(1) + #owner.setParent(target) + target.initMount(owner) + #target.add(owner) + #target.setOwner(owner) + #Vehicles.testbike(owner,target) + + #target.unmount(owner) + #core.objectService.useObject(owner, target) if option == 60: core.objectService.destroyObject(target) return \ No newline at end of file diff --git a/src/services/DevService.java b/src/services/DevService.java index da4a5561..58c9fea4 100644 --- a/src/services/DevService.java +++ b/src/services/DevService.java @@ -89,6 +89,7 @@ public class DevService implements INetworkDispatch { suiOptions.put((long) 26, "Installations"); suiOptions.put((long) 110, "Survey Devices"); if(creature.getClient().isGM()) suiOptions.put((long) 120, "House Deeds"); + if(creature.getClient().isGM()) suiOptions.put((long) 130, "Vehicle Deeds"); //suiOptions.put((long) 120, "House Deeds"); break; case 3: // [Items] Weapons @@ -1203,6 +1204,10 @@ public class DevService implements INetworkDispatch { deed.setAttributes(); inventory.add(deed); + return; + case 130: + TangibleObject swoopDeed = (TangibleObject) core.objectService.createObject("object/tangible/deed/vehicle_deed/shared_speederbike_swoop_deed.iff", planet); + inventory.add(swoopDeed); return; } } From cb3f4e826aa53542928277f9aece0d5e349862e2 Mon Sep 17 00:00:00 2001 From: Treeku Date: Sun, 13 Apr 2014 01:39:18 +0100 Subject: [PATCH 03/32] Moved Empty_Hopper to HarvesterService --- src/services/command/CommandService.java | 46 +++----------------- src/services/resources/HarvesterService.java | 43 ++++++++++++++++++ 2 files changed, 49 insertions(+), 40 deletions(-) diff --git a/src/services/command/CommandService.java b/src/services/command/CommandService.java index a08b267d..b7fb6c04 100644 --- a/src/services/command/CommandService.java +++ b/src/services/command/CommandService.java @@ -120,6 +120,10 @@ public class CommandService implements INetworkDispatch { String name = commandArgs.split(" ")[0]; target = core.objectService.getObjectByFirstName(name); + + if (target == actor) { + target = null; + } } break; @@ -191,6 +195,8 @@ public class CommandService implements INetworkDispatch { x = Integer.valueOf(args[0]); y = Integer.valueOf(args[1]); z = Integer.valueOf(args[2]); + } else { + return false; } } catch (NumberFormatException e) { return false; @@ -596,46 +602,6 @@ public class CommandService implements INetworkDispatch { }); - objControllerOpcodes.put(ObjControllerOpcodes.RESOURCE_EMPTY_HOPPER, new INetworkRemoteEvent() { - - @Override - public void handlePacket(IoSession session, IoBuffer data) throws Exception { - data.order(ByteOrder.LITTLE_ENDIAN); - Client client = core.getClient(session); - CommandEnqueue commandEnqueue = new CommandEnqueue(); - -// StringBuilder sb = new StringBuilder(); -// for (byte b : data.array()) { -// sb.append(String.format("%02X ", b)); -// } -// System.out.println(sb.toString()); - - /* - 05 00 46 5E CE 80 83 00 00 00 ED 00 00 00 3E 45 - 04 00 00 00 00 00 00 00 00 00 3E 45 04 00 00 00 - 00 00 90 52 05 00 00 00 00 00 D7 35 05 00 00 00 - 00 00 01 00 00 00 00 07 - */ - - long playerId = data.getLong(); // 3E 45 04 00 00 00 00 00 - data.getInt(); // 00 00 00 00 - data.getLong(); // 3E 45 04 00 00 00 00 00 - long harvesterId = data.getLong(); // 1E 55 05 00 00 00 00 00 - //long containerId = data.getLong(); // 1E 55 05 00 00 00 00 00 Resources ID - long resourceId = data.getLong(); // 1E 55 05 00 00 00 00 00 Resources ID - int stackCount = data.getInt(); // Stack count - byte actionMode = data.get(); // 0 for retrieving, 1 for discarding - byte updateCount = data.get(); // updateCount - - CreatureObject actor = (CreatureObject) client.getParent(); - SWGObject target = core.objectService.getObject(harvesterId); - - core.harvesterService.handleEmptyHopper(actor,target,harvesterId,resourceId,stackCount,actionMode,updateCount); - } - }); - - - } public void shutdown() { diff --git a/src/services/resources/HarvesterService.java b/src/services/resources/HarvesterService.java index d8e028fc..71d2a276 100644 --- a/src/services/resources/HarvesterService.java +++ b/src/services/resources/HarvesterService.java @@ -21,6 +21,7 @@ ******************************************************************************/ package services.resources; +import java.nio.ByteOrder; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -34,11 +35,16 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; +import org.apache.mina.core.buffer.IoBuffer; +import org.apache.mina.core.session.IoSession; + import protocol.swg.EnterStructurePlacementModeMessage; import protocol.swg.SceneCreateObjectByCrc; import protocol.swg.SceneDestroyObject; import protocol.swg.SceneEndBaselines; +import protocol.swg.objectControllerObjects.CommandEnqueue; import main.NGECore; +import engine.clients.Client; import engine.resources.common.CRC; import engine.resources.container.Traverser; import engine.resources.objects.SWGObject; @@ -46,6 +52,7 @@ import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; import engine.resources.service.INetworkDispatch; import engine.resources.service.INetworkRemoteEvent; +import resources.common.ObjControllerOpcodes; import resources.objects.creature.CreatureObject; import resources.objects.deed.Harvester_Deed; import resources.objects.harvester.HarvesterMessageBuilder; @@ -92,6 +99,42 @@ public class HarvesterService implements INetworkDispatch { @Override public void insertOpcodes(Map swgOpcodes, Map objControllerOpcodes) { + objControllerOpcodes.put(ObjControllerOpcodes.RESOURCE_EMPTY_HOPPER, new INetworkRemoteEvent() { + + @Override + public void handlePacket(IoSession session, IoBuffer data) throws Exception { + data.order(ByteOrder.LITTLE_ENDIAN); + Client client = core.getClient(session); + +// StringBuilder sb = new StringBuilder(); +// for (byte b : data.array()) { +// sb.append(String.format("%02X ", b)); +// } +// System.out.println(sb.toString()); + + /* + 05 00 46 5E CE 80 83 00 00 00 ED 00 00 00 3E 45 + 04 00 00 00 00 00 00 00 00 00 3E 45 04 00 00 00 + 00 00 90 52 05 00 00 00 00 00 D7 35 05 00 00 00 + 00 00 01 00 00 00 00 07 + */ + + long playerId = data.getLong(); // 3E 45 04 00 00 00 00 00 + data.getInt(); // 00 00 00 00 + data.getLong(); // 3E 45 04 00 00 00 00 00 + long harvesterId = data.getLong(); // 1E 55 05 00 00 00 00 00 + //long containerId = data.getLong(); // 1E 55 05 00 00 00 00 00 Resources ID + long resourceId = data.getLong(); // 1E 55 05 00 00 00 00 00 Resources ID + int stackCount = data.getInt(); // Stack count + byte actionMode = data.get(); // 0 for retrieving, 1 for discarding + byte updateCount = data.get(); // updateCount + + CreatureObject actor = (CreatureObject) client.getParent(); + SWGObject target = core.objectService.getObject(harvesterId); + + handleEmptyHopper(actor, target, harvesterId, resourceId, stackCount, actionMode, updateCount); + } + }); } From 343569ed38a64d391a8f208d25d41401936f7520 Mon Sep 17 00:00:00 2001 From: CharonInferar Date: Sun, 13 Apr 2014 03:50:45 +0200 Subject: [PATCH 04/32] Swoop is mountable for further tests --- .../vehicle/speederbike_swoop_pcd.py | 14 ++--- .../vehicle_deed/speederbike_swoop_deed.py | 4 +- scripts/radial/vehicle.py | 3 +- .../creature/CreatureMessageBuilder.java | 3 +- .../objects/creature/CreatureObject.java | 62 ++++++++++++++++++- .../objects/tangible/TangibleObject.java | 10 +++ src/services/SimulationService.java | 4 ++ src/services/object/ObjectService.java | 28 ++++++--- 8 files changed, 104 insertions(+), 24 deletions(-) diff --git a/scripts/object/intangible/vehicle/speederbike_swoop_pcd.py b/scripts/object/intangible/vehicle/speederbike_swoop_pcd.py index 94a561f7..ec2deccd 100644 --- a/scripts/object/intangible/vehicle/speederbike_swoop_pcd.py +++ b/scripts/object/intangible/vehicle/speederbike_swoop_pcd.py @@ -1,23 +1,21 @@ import sys def setup(core, object): - object.setAttachment('vehicleId', core.objectService.generateObjectID()) + #object.setAttachment('vehicleId', core.objectService.generateObjectID()) object.setAttachment('radial_filename', 'item') return def use(core, actor, object): if object: - vehicleId = object.getAttachment('vehicleId') + vehicleId = object.getObjectID() + #vehicleId = object.getAttachment('vehicleId') if not vehicleId: return vehicle = core.objectService.getObject(vehicleId) - - if vehicle: - core.objectService.destroyObject(vehicle) - else: - core.objectService.createObject('object/mobile/vehicles/shared_speederbike_swoop.iff', vehicleId, actor.getPlanet(), actor.getPosition(), actor.getOrientation()) - core.simulationService.add(vehicle, vehicle.getPosition().x, vehicle.getPosition().z, True) + + swoop = core.objectService.createObject('object/mobile/vehicles/shared_speederbike_swoop.iff', vehicleId, actor.getPlanet(), actor.getPosition(), actor.getOrientation()) + core.simulationService.add(swoop, swoop.getPosition().x, swoop.getPosition().z, True) return \ No newline at end of file diff --git a/scripts/object/tangible/deed/vehicle_deed/speederbike_swoop_deed.py b/scripts/object/tangible/deed/vehicle_deed/speederbike_swoop_deed.py index abd61184..b32e90e3 100644 --- a/scripts/object/tangible/deed/vehicle_deed/speederbike_swoop_deed.py +++ b/scripts/object/tangible/deed/vehicle_deed/speederbike_swoop_deed.py @@ -8,12 +8,12 @@ def use(core, actor, object): datapad = actor.getSlottedObject('datapad') pcd = core.objectService.createObject('object/intangible/vehicle/shared_speederbike_swoop_pcd.iff', actor.getPlanet(), actor.getPosition().x, actor.getPosition().z,actor.getPosition().y) - actor.sendSystemMessage('actor.getObjectID() %s' % actor.getObjectID(), 0) + #actor.sendSystemMessage('actor.getObjectID() %s' % actor.getObjectID(), 0) if datapad and pcd: datapad.add(pcd) core.objectService.destroyObject(object) vehicle = core.objectService.createObject('object/mobile/vehicle/shared_speederbike_swoop.iff', actor.getPlanet(), actor.getPosition().x, actor.getPosition().z,actor.getPosition().y) - vehicle.setOwner(actor) + vehicle.setOwnerId(actor.getObjectID()) core.simulationService.add(vehicle, vehicle.getPosition().x, vehicle.getPosition().z, True) return \ No newline at end of file diff --git a/scripts/radial/vehicle.py b/scripts/radial/vehicle.py index 2585a9ef..a1e5a7b2 100644 --- a/scripts/radial/vehicle.py +++ b/scripts/radial/vehicle.py @@ -1,6 +1,5 @@ from resources.common import RadialOptions -from resources.common import RadialOptions -from services.ai import Vehicles + import sys def createRadial(core, owner, target, radials): diff --git a/src/resources/objects/creature/CreatureMessageBuilder.java b/src/resources/objects/creature/CreatureMessageBuilder.java index d70cf87c..18ae40e8 100644 --- a/src/resources/objects/creature/CreatureMessageBuilder.java +++ b/src/resources/objects/creature/CreatureMessageBuilder.java @@ -1149,7 +1149,8 @@ public class CreatureMessageBuilder extends ObjectMessageBuilder { buffer.putLong(ownerId); int size = buffer.position(); buffer.flip(); - buffer = createDelta("CREO", (byte) 3, (short) 1, (short) 0x0D, buffer, size + 4); + //buffer = createDelta("CREO", (byte) 3, (short) 1, (short) 0x0D, buffer, size + 4); 0F,12 doesnt crash + buffer = createDelta("CREO", (byte) 3, (short) 1, (short) 0x0F, buffer, size + 4); // checked from 0xA up to 0x1F return buffer; } diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index 6173600b..2d2cc731 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -34,6 +34,7 @@ import org.apache.mina.core.buffer.IoBuffer; import protocol.swg.ObjControllerMessage; import protocol.swg.PlayMusicMessage; +import protocol.swg.UpdateContainmentMessage; import protocol.swg.UpdatePostureMessage; import protocol.swg.UpdatePVPStatusMessage; import protocol.swg.chat.ChatSystemMessage; @@ -50,6 +51,7 @@ import main.NGECore; import engine.clients.Client; import resources.common.Cooldown; import resources.common.OutOfBand; +import resources.datatables.Options; import resources.objects.Buff; import resources.objects.DamageOverTime; import resources.objects.SWGList; @@ -66,7 +68,7 @@ import resources.objects.player.PlayerObject; import resources.objects.tangible.TangibleObject; import services.command.BaseSWGCommand; -@Entity(version=6) +@Entity(version=7) public class CreatureObject extends TangibleObject implements IPersistent { @NotPersistent @@ -186,6 +188,9 @@ public class CreatureObject extends TangibleObject implements IPersistent { @NotPersistent private ConcurrentHashMap cooldowns = new ConcurrentHashMap(); + public boolean mounted = false; + public CreatureObject mountedVehicle; + public CreatureObject(long objectID, Planet planet, Point3D position, Quaternion orientation, String Template) { super(objectID, planet, Template, position, orientation); messageBuilder = new CreatureMessageBuilder(this); @@ -1781,6 +1786,61 @@ public class CreatureObject extends TangibleObject implements IPersistent { return (PlayerObject) this.getSlottedObject("ghost"); } + public boolean isMounted() { + return mounted; + } + + public void setMounted(boolean mounted) { + this.mounted = mounted; + } + + public CreatureObject getMountedVehicle() { + return mountedVehicle; + } + + public void setMountedVehicle(CreatureObject mountedVehicle) { + this.mountedVehicle = mountedVehicle; + } + + public void mount(CreatureObject owner) { + synchronized(objectMutex) { + if ((this.getOptionsBitmask() & Options.MOUNT) == Options.MOUNT){ + UpdateContainmentMessage updateContainmentMessage= new UpdateContainmentMessage(owner.getObjectID(), this.getObjectID(), -1); + owner.getClient().getSession().write(updateContainmentMessage.serialize()); + owner.setParent(this); + } + } + } + + public void unmount(CreatureObject owner) { + synchronized(objectMutex) { + if ((this.getOptionsBitmask() & Options.MOUNT) == Options.MOUNT){ + UpdateContainmentMessage updateContainmentMessage= new UpdateContainmentMessage(owner.getObjectID(), this.getObjectID(), -1); + owner.getClient().getSession().write(updateContainmentMessage.serialize()); + } + } + } + + public void initMount(CreatureObject owner) { + synchronized(objectMutex) { + this.ownerId = owner.getObjectID(); + setStateBitmask(0x10000000); + owner.setParent(this); + owner.getClient().getSession().write(messageBuilder.buildOwnerIdDelta(ownerId)); + owner.setMountedVehicle(this); + this.setOwnerId(owner.getObjectID()); + //this.add(owner); // NPE at engine.resources.objects.SWGObject.getCorrectArrangementId(kd:844) + this.mount(owner); + // setStateBitmask(28); + // owner.setStateBitmask(27); + owner.setStateBitmask(0x8000000); + this.setPosture((byte)10); + + //this.sendBaselines(owner.getClient()); + + } + } + //public float getCooldown(String cooldownGroup) { //return ((float) getCooldown(cooldownGroup) / (float) 1000); //} diff --git a/src/resources/objects/tangible/TangibleObject.java b/src/resources/objects/tangible/TangibleObject.java index de1b586b..62f3f00d 100644 --- a/src/resources/objects/tangible/TangibleObject.java +++ b/src/resources/objects/tangible/TangibleObject.java @@ -82,6 +82,8 @@ public class TangibleObject extends SWGObject { private boolean looted = false; private boolean lootLock = false; + private String serialNumber; + @NotPersistent private TangibleObject killer = null; @@ -470,6 +472,14 @@ public class TangibleObject extends SWGObject { this.lootLock = lootLock; } + public String getSerialNumber() { + return serialNumber; + } + + public void setSerialNumber(String serialNumber) { + this.serialNumber = serialNumber; + } + @Override public void sendBaselines(Client destination) { diff --git a/src/services/SimulationService.java b/src/services/SimulationService.java index e76920c7..5009c159 100644 --- a/src/services/SimulationService.java +++ b/src/services/SimulationService.java @@ -332,6 +332,10 @@ public class SimulationService implements INetworkDispatch { } CreatureObject object = (CreatureObject) client.getParent(); + + if (object.mounted) + object=object.getMountedVehicle(); + Point3D newPos; Point3D oldPos; synchronized(object.getMutex()) { diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index f993e851..f4385f18 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -428,24 +428,32 @@ public class ObjectService implements INetworkDispatch { if (Template.startsWith("object/creature/") || Template.startsWith("object/mobile/")) { if (Template.startsWith("object/mobile/")) { ((CreatureObject) object).setOptionsBitmask(Options.ATTACKABLE); - } else if (Template.startsWith("object/mobile/beast_master/")) { + } + if (Template.startsWith("object/mobile/beast_master/")) { ((CreatureObject) object).setOptionsBitmask(Options.NONE); - } else if (Template.startsWith("object/mobile/vendor/")) { + } + if (Template.startsWith("object/mobile/vendor/")) { ((CreatureObject) object).setOptionsBitmask(Options.INVULNERABLE | Options.USABLE); - } else if (Template.startsWith("object/mobile/vehicle/")) { + } + if (Template.startsWith("object/mobile/vehicle/")) { ((CreatureObject) object).setOptionsBitmask(Options.ATTACKABLE | Options.MOUNT); - System.err.println("Options.MOUNT"); - } else if (Template.startsWith("object/mobile/hologram/")) { + } + if (Template.startsWith("object/mobile/hologram/")) { ((CreatureObject) object).setOptionsBitmask(Options.INVULNERABLE); - } else if (Template.startsWith("object/creature/npc/theme_park/")) { + } + if (Template.startsWith("object/creature/npc/theme_park/")) { ((CreatureObject) object).setOptionsBitmask(Options.INVULNERABLE); - } else if (Template.startsWith("object/creature/npc/general/")) { + } + if (Template.startsWith("object/creature/npc/general/")) { ((CreatureObject) object).setOptionsBitmask(Options.INVULNERABLE | Options.CONVERSABLE); - } else if (Template.startsWith("object/creature/droid/crafted/")) { + } + if (Template.startsWith("object/creature/droid/crafted/")) { ((CreatureObject) object).setOptionsBitmask(Options.NONE); - } else if (Template.startsWith("object/creature/droid/")) { + } + if (Template.startsWith("object/creature/droid/")) { ((CreatureObject) object).setOptionsBitmask(Options.ATTACKABLE | Options.INVULNERABLE); - } else if (Template.startsWith("object/creature/player/")) { + } + if (Template.startsWith("object/creature/player/")) { ((CreatureObject) object).setOptionsBitmask(Options.ATTACKABLE); } } else if (object instanceof TangibleObject) { From 32cb035e2ee1624216abede4bb7f661716e9da3e Mon Sep 17 00:00:00 2001 From: CharonInferar Date: Sun, 13 Apr 2014 05:05:18 +0200 Subject: [PATCH 05/32] Increased TANO persistence version fix --- src/resources/objects/tangible/TangibleObject.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/resources/objects/tangible/TangibleObject.java b/src/resources/objects/tangible/TangibleObject.java index 62f3f00d..7f7e7908 100644 --- a/src/resources/objects/tangible/TangibleObject.java +++ b/src/resources/objects/tangible/TangibleObject.java @@ -53,7 +53,7 @@ import engine.resources.scene.Planet; import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; -@Persistent(version=5) +@Persistent(version=6) public class TangibleObject extends SWGObject { // TODO: Thread safety From 1aae7efe108ab75069f40e21157e5dbc1cd3b840 Mon Sep 17 00:00:00 2001 From: Treeku Date: Sun, 13 Apr 2014 11:05:39 +0100 Subject: [PATCH 06/32] Fixed error in getfriendlist.py --- scripts/commands/getfriendlist.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/commands/getfriendlist.py b/scripts/commands/getfriendlist.py index 5826dfac..41188658 100644 --- a/scripts/commands/getfriendlist.py +++ b/scripts/commands/getfriendlist.py @@ -1,4 +1,4 @@ -from protocol.swg import ChatOnGetFriendsList +from protocol.swg.chat import ChatOnGetFriendsList import sys def setup(): From b001ebb9ba53b4c706624a1a2785679644f51a45 Mon Sep 17 00:00:00 2001 From: Treeku Date: Sun, 13 Apr 2014 11:06:27 +0100 Subject: [PATCH 07/32] Moved factionStatus from CREO to TANO --- .../objects/creature/CreatureObject.java | 12 +++--------- .../objects/tangible/TangibleObject.java | 15 ++++++++++++++- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index 2d2cc731..1c8cddf2 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -83,7 +83,6 @@ public class CreatureObject extends TangibleObject implements IPersistent { // CREO 3 private byte posture = 0; - private int factionStatus = 0; private float height; private int battleFatigue = 0; private long stateBitmask = 0; @@ -474,13 +473,8 @@ public class CreatureObject extends TangibleObject implements IPersistent { notifyObservers(messageBuilder.buildFactionDelta(faction), true); //updatePvpStatus(); } - - public int getFactionStatus() { - synchronized(objectMutex) { - return factionStatus; - } - } - + + @Override public void setFactionStatus(int factionStatus) { synchronized(objectMutex) { this.factionStatus = factionStatus; @@ -489,7 +483,7 @@ public class CreatureObject extends TangibleObject implements IPersistent { notifyObservers(messageBuilder.buildFactionStatusDelta(factionStatus), true); //updatePvpStatus(); } - + public float getHeight() { synchronized(objectMutex) { return height; diff --git a/src/resources/objects/tangible/TangibleObject.java b/src/resources/objects/tangible/TangibleObject.java index 7f7e7908..b33717d0 100644 --- a/src/resources/objects/tangible/TangibleObject.java +++ b/src/resources/objects/tangible/TangibleObject.java @@ -68,6 +68,7 @@ public class TangibleObject extends SWGObject { private int maxDamage = 1000; private boolean staticObject = true; protected String faction = ""; // Says you're "Imperial Special Forces" if it's 0 for some reason + protected int factionStatus = 0; @NotPersistent private Vector defendersList = new Vector(); // unused in packets but useful for the server @NotPersistent @@ -311,7 +312,19 @@ public class TangibleObject extends SWGObject { updatePvpStatus(); } - + + public int getFactionStatus() { + synchronized(objectMutex) { + return factionStatus; + } + } + + public void setFactionStatus(int factionStatus) { + synchronized(objectMutex) { + this.factionStatus = factionStatus; + } + } + public Vector getDefendersList() { synchronized(objectMutex) { return defendersList; From 5f1022543e9c05e8d32ca134ee7e9937febe2788 Mon Sep 17 00:00:00 2001 From: Treeku Date: Sun, 13 Apr 2014 13:17:23 +0100 Subject: [PATCH 08/32] godLevel is now set and used --- scripts/commands/setgodmode.py | 11 ++ scripts/conversation/demo.py | 18 +- src/main/NGECore.java | 7 +- .../objects/harvester/HarvesterObject.java | 14 -- .../objects/player/PlayerMessageBuilder.java | 18 +- .../objects/player/PlayerObject.java | 17 +- src/services/combat/CombatService.java | 5 +- src/services/command/BaseSWGCommand.java | 184 +----------------- src/services/command/CombatCommand.java | 183 ++++++++++++++++- src/services/command/CommandService.java | 84 ++++---- 10 files changed, 279 insertions(+), 262 deletions(-) diff --git a/scripts/commands/setgodmode.py b/scripts/commands/setgodmode.py index 18c5f4f2..84f981c7 100644 --- a/scripts/commands/setgodmode.py +++ b/scripts/commands/setgodmode.py @@ -29,6 +29,13 @@ def run(core, actor, target, commandString): if not command: return + if actor.getClient().isGM() is False: + return + + if playerObject.getGodLevel() == 0: + actor.addAbility("admin") + playerObject.setGodLevel(50) + if command == 'giveExperience' and arg1: core.playerService.giveExperience(actor, int(arg1)) @@ -103,4 +110,8 @@ def run(core, actor, target, commandString): playerObject.setHoloEmote('holoemote_' + arg1) playerObject.setHoloEmoteUses(20) actor.sendSystemMessage('Holo-Emote Generator set to ' + 'holoemote_' + arg1, 0) + elif command == 'off': + if playerObject.getGodLevel > 0: + actor.removeAbility("admin") + playerObject.setGodLevel(0) return diff --git a/scripts/conversation/demo.py b/scripts/conversation/demo.py index 802329db..35ab97b6 100644 --- a/scripts/conversation/demo.py +++ b/scripts/conversation/demo.py @@ -7,11 +7,11 @@ import sys def startConversation(core, actor, npc): convSvc = core.conversationService - convSvc.sendConversationMessage(actor, npc, OutOfBand(ProsePackage('conversation/respecseller', 's_31'))) + convSvc.sendConversationMessage(actor, npc, OutOfBand(ProsePackage('conversation/respecseller:s_31'))) options = Vector() - options.add(ConversationOption(OutOfBand(ProsePackage('conversation/respecseller', 's_32')), 0)) - options.add(ConversationOption(OutOfBand(ProsePackage('conversation/respecseller', 's_33')), 1)) + options.add(ConversationOption(OutOfBand(ProsePackage('conversation/respecseller:s_32')), 0)) + options.add(ConversationOption(OutOfBand(ProsePackage('conversation/respecseller:s_33')), 1)) convSvc.sendConversationOptions(actor, npc, options, handleFirstScreen) return @@ -22,19 +22,19 @@ def handleFirstScreen(core, actor, npc, selection): # TODO: check for prices if selection == 0: # respec - convSvc.sendConversationMessage(actor, npc, OutOfBand(ProsePackage('conversation/respecseller', 's_58'))) + convSvc.sendConversationMessage(actor, npc, OutOfBand(ProsePackage('conversation/respecseller:s_58'))) options = Vector() - options.add(ConversationOption(OutOfBand(ProsePackage('conversation/respecseller', 's_60')), 0)) - options.add(ConversationOption(OutOfBand(ProsePackage('conversation/respecseller', 's_64')), 1)) + options.add(ConversationOption(OutOfBand(ProsePackage('conversation/respecseller:s_60')), 0)) + options.add(ConversationOption(OutOfBand(ProsePackage('conversation/respecseller:s_64')), 1)) convSvc.sendConversationOptions(actor, npc, options, handleRespecScreen) if selection == 1: # expertise reset - convSvc.sendConversationMessage(actor, npc, OutOfBand(ProsePackage('conversation/respecseller', 's_35'))) + convSvc.sendConversationMessage(actor, npc, OutOfBand(ProsePackage('conversation/respecseller:s_35'))) options = Vector() - options.add(ConversationOption(OutOfBand(ProsePackage('conversation/respecseller', 's_71')), 0)) - options.add(ConversationOption(OutOfBand(ProsePackage('conversation/respecseller', 's_72')), 1)) + options.add(ConversationOption(OutOfBand(ProsePackage('conversation/respecseller:s_71')), 0)) + options.add(ConversationOption(OutOfBand(ProsePackage('conversation/respecseller:s_72')), 1)) convSvc.sendConversationOptions(actor, npc, options, handleResetScreen) return diff --git a/src/main/NGECore.java b/src/main/NGECore.java index 56f33e88..ee431544 100644 --- a/src/main/NGECore.java +++ b/src/main/NGECore.java @@ -355,7 +355,12 @@ public class NGECore { zoneDispatch.addService(entertainmentService); //zoneDispatch.addService(missionService); zoneDispatch.addService(bazaarService); - + + if (optionsConfigLoaded && options.getInt("LOAD.RESOURCE.SYSTEM") == 1) { + zoneDispatch.addService(surveyService); + zoneDispatch.addService(resourceService); + } + zoneServer = new MINAServer(zoneDispatch, config.getInt("ZONE.PORT")); zoneServer.start(); staticService = new StaticService(this); diff --git a/src/resources/objects/harvester/HarvesterObject.java b/src/resources/objects/harvester/HarvesterObject.java index 7fe12cbb..8964d7e1 100644 --- a/src/resources/objects/harvester/HarvesterObject.java +++ b/src/resources/objects/harvester/HarvesterObject.java @@ -21,35 +21,21 @@ ******************************************************************************/ package resources.objects.harvester; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; import java.util.Vector; import main.NGECore; -import protocol.swg.SceneCreateObjectByCrc; -import protocol.swg.SceneDestroyObject; -import protocol.swg.SceneEndBaselines; -import protocol.swg.UpdatePVPStatusMessage; import com.sleepycat.persist.model.Persistent; -import services.chat.WaypointAttachment; import engine.clients.Client; -import engine.resources.common.CRC; -import engine.resources.objects.SWGObject; import engine.resources.scene.Planet; import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; import resources.objects.creature.CreatureObject; import resources.objects.installation.InstallationMessageBuilder; import resources.objects.installation.InstallationObject; -import resources.objects.player.PlayerObject; import resources.objects.resource.GalacticResource; import resources.objects.resource.ResourceContainerObject; -import resources.objects.waypoint.WaypointObject; -import services.chat.Mail; - /** * @author Charon diff --git a/src/resources/objects/player/PlayerMessageBuilder.java b/src/resources/objects/player/PlayerMessageBuilder.java index aae6f5c3..7e518a32 100644 --- a/src/resources/objects/player/PlayerMessageBuilder.java +++ b/src/resources/objects/player/PlayerMessageBuilder.java @@ -107,12 +107,10 @@ public class PlayerMessageBuilder extends ObjectMessageBuilder { buffer.setAutoExpand(true); buffer.putShort((short) 0x11); buffer.putInt((short) 0x43); - buffer.put(getAsciiString("string_id_table")); - - buffer.put((byte) 0); // unk - buffer.putShort((short) 0); // unk - buffer.putInt(0); // unk + buffer.putInt(0); // probably stringId + buffer.putShort((short) 0); // detailedDescription + buffer.put(player.getGodLevel()); buffer.putInt(0); // unk buffer.putInt(0); // unk buffer.putInt(0); // unk @@ -654,6 +652,16 @@ public class PlayerMessageBuilder extends ObjectMessageBuilder { buffer = createDelta("PLAY", (byte) 3, (short) 1, (short) 19, buffer, size + 4); return buffer; } + + public IoBuffer buildGodLevelDelta(byte godLevel) { + IoBuffer buffer = bufferPool.allocate(1, false).order(ByteOrder.LITTLE_ENDIAN); + buffer.put(godLevel); + int size = buffer.position(); + buffer.flip(); + buffer = createDelta("PLAY", (byte) 6, (short) 1, (short) 0x02, buffer, size + 4); + return buffer; + + } @Override public void sendListDelta(byte viewType, short updateType, IoBuffer buffer) { diff --git a/src/resources/objects/player/PlayerObject.java b/src/resources/objects/player/PlayerObject.java index d1c23985..7c956d6f 100644 --- a/src/resources/objects/player/PlayerObject.java +++ b/src/resources/objects/player/PlayerObject.java @@ -44,7 +44,7 @@ import engine.resources.scene.Planet; import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; -@Persistent(version=10) +@Persistent(version=11) public class PlayerObject extends IntangibleObject { // PLAY 3 @@ -140,6 +140,8 @@ public class PlayerObject extends IntangibleObject { private SurveyTool lastUsedSurveyTool; private ResourceContainerObject recentContainer; + private byte godLevel = 0; + public PlayerObject() { super(); messageBuilder = new PlayerMessageBuilder(this); @@ -849,4 +851,17 @@ public class PlayerObject extends IntangibleObject { { return this.lotsRemaining; } + + public byte getGodLevel() { + return godLevel; + } + + public void setGodLevel(int godLevel) { + this.godLevel = (byte) godLevel; + + if (getContainer() != null) { + getContainer().getClient().getSession().write(messageBuilder.buildGodLevelDelta((byte) godLevel)); + } + } + } diff --git a/src/services/combat/CombatService.java b/src/services/combat/CombatService.java index f8cbb7fc..87bfcd31 100644 --- a/src/services/combat/CombatService.java +++ b/src/services/combat/CombatService.java @@ -51,7 +51,6 @@ import resources.objects.waypoint.WaypointObject; import resources.objects.weapon.WeaponObject; import services.ai.AIActor; import services.combat.CombatEvents.DamageTaken; -import services.command.BaseSWGCommand; import services.command.CombatCommand; import services.sui.SUIService.MessageBoxType; import services.sui.SUIWindow; @@ -402,7 +401,7 @@ public class CombatService implements INetworkDispatch { } - private void sendCombatPackets(CreatureObject attacker, TangibleObject target, WeaponObject weapon, BaseSWGCommand command, int actionCounter, float damage, int armorAbsorbed, int hitType) { + private void sendCombatPackets(CreatureObject attacker, TangibleObject target, WeaponObject weapon, CombatCommand command, int actionCounter, float damage, int armorAbsorbed, int hitType) { String animationStr = command.getRandomAnimation(weapon); CombatAction combatAction = new CombatAction(CRC.StringtoCRC(animationStr), attacker.getObjectID(), weapon.getObjectID(), target.getObjectID(), command.getCommandCRC()); @@ -431,7 +430,7 @@ public class CombatService implements INetworkDispatch { } - private void sendHealPackets(CreatureObject attacker, CreatureObject target, WeaponObject weapon, BaseSWGCommand command, int actionCounter) { + private void sendHealPackets(CreatureObject attacker, CreatureObject target, WeaponObject weapon, CombatCommand command, int actionCounter) { CombatAction combatAction = new CombatAction(CRC.StringtoCRC(command.getDefaultAnimations()[0]), attacker.getObjectID(), weapon.getObjectID(), target.getObjectID(), command.getCommandCRC()); ObjControllerMessage objController = new ObjControllerMessage(0x1B, combatAction); diff --git a/src/services/command/BaseSWGCommand.java b/src/services/command/BaseSWGCommand.java index 3205bd5e..9c2d639f 100644 --- a/src/services/command/BaseSWGCommand.java +++ b/src/services/command/BaseSWGCommand.java @@ -27,9 +27,6 @@ import engine.resources.common.CRC; import java.util.ArrayList; import java.util.List; -import java.util.Random; - -import resources.objects.weapon.WeaponObject; public class BaseSWGCommand implements Cloneable { @@ -57,22 +54,8 @@ public class BaseSWGCommand implements Cloneable { private Byte[] invalidPostures; private Long[] invalidStates; - private String[] defaultAnimations = new String[]{}; - private String[] oneHandedAnimations = new String[]{}; - private String[] twoHandedAnimations = new String[]{}; - private String[] polearmAnimations = new String[]{}; - private String[] unarmedAnimations = new String[]{}; - private String[] pistolAnimations = new String[]{}; - private String[] carbineAnimations = new String[]{}; - private String[] lightRifleAnimations = new String[]{}; - private String[] rifleAnimations = new String[]{}; - private String[] heavyWpnAnimations = new String[]{}; - private String[] oneHandedLSAnimations = new String[]{}; - private String[] twoHandedLSAnimations = new String[]{}; - private String[] polearmLSAnimations = new String[]{}; - private String[] thrownAnimations = new String[]{}; - public BaseSWGCommand(String commandName) { + commandName.toLowerCase(); setCommandName(commandName); setCommandCRC(CRC.StringtoCRC(commandName)); @@ -375,169 +358,4 @@ public class BaseSWGCommand implements Cloneable { this.warmupTime = warmupTime; } - public String[] getDefaultAnimations() { - return defaultAnimations; - } - - public void setDefaultAnimations(String[] defaultAnimations) { - this.defaultAnimations = defaultAnimations; - } - - public String[] getOneHandedAnimations() { - return oneHandedAnimations; - } - - public void setOneHandedAnimations(String[] oneHandedAnimations) { - this.oneHandedAnimations = oneHandedAnimations; - } - - public String[] getTwoHandedAnimations() { - return twoHandedAnimations; - } - - public void setTwoHandedAnimations(String[] twoHandedAnimations) { - this.twoHandedAnimations = twoHandedAnimations; - } - - public String[] getPolearmAnimations() { - return polearmAnimations; - } - - public void setPolearmAnimations(String[] polearmAnimations) { - this.polearmAnimations = polearmAnimations; - } - - public String[] getUnarmedAnimations() { - return unarmedAnimations; - } - - public void setUnarmedAnimations(String[] unarmedAnimations) { - this.unarmedAnimations = unarmedAnimations; - } - - public String[] getPistolAnimations() { - return pistolAnimations; - } - - public void setPistolAnimations(String[] pistolAnimations) { - this.pistolAnimations = pistolAnimations; - } - - public String[] getCarbineAnimations() { - return carbineAnimations; - } - - public void setCarbineAnimations(String[] carbineAnimations) { - this.carbineAnimations = carbineAnimations; - } - - public String[] getLightRifleAnimations() { - return lightRifleAnimations; - } - - public void setLightRifleAnimations(String[] lightRifleAnimations) { - this.lightRifleAnimations = lightRifleAnimations; - } - - public String[] getRifleAnimations() { - return rifleAnimations; - } - - public void setRifleAnimations(String[] rifleAnimations) { - this.rifleAnimations = rifleAnimations; - } - - public String[] getHeavyWpnAnimations() { - return heavyWpnAnimations; - } - - public void setHeavyWpnAnimations(String[] heavyWpnAnimations) { - this.heavyWpnAnimations = heavyWpnAnimations; - } - - public String[] getOneHandedLSAnimations() { - return oneHandedLSAnimations; - } - - public void setOneHandedLSAnimations(String[] oneHandedLSAnimations) { - this.oneHandedLSAnimations = oneHandedLSAnimations; - } - - public String[] getTwoHandedLSAnimations() { - return twoHandedLSAnimations; - } - - public void setTwoHandedLSAnimations(String[] twoHandedLSAnimations) { - this.twoHandedLSAnimations = twoHandedLSAnimations; - } - - public String[] getPolearmLSAnimations() { - return polearmLSAnimations; - } - - public void setPolearmLSAnimations(String[] polearmLSAnimations) { - this.polearmLSAnimations = polearmLSAnimations; - } - - public String[] getThrownAnimations() { - return thrownAnimations; - } - - public void setThrownAnimations(String[] thrownAnimations) { - this.thrownAnimations = thrownAnimations; - } - - public String getRandomAnimation(WeaponObject weapon) { - int weaponType = weapon.getWeaponType(); - String[] animations; - - switch (weaponType) { - case 0: - animations = rifleAnimations; - break; - case 1: - animations = carbineAnimations; - break; - case 2: - animations = pistolAnimations; - break; - case 3: - animations = heavyWpnAnimations; - break; - case 4: - animations = oneHandedAnimations; - break; - case 5: - animations = twoHandedAnimations; - break; - case 6: - animations = defaultAnimations; - break; - case 7: - animations = polearmAnimations; - break; - case 8: - animations = thrownAnimations; - break; - case 9: - animations = oneHandedLSAnimations; - break; - case 10: - animations = twoHandedLSAnimations; - break; - case 11: - animations = polearmLSAnimations; - break; - default: - animations = defaultAnimations; - break; - } - - if (animations.length == 0) { - animations = defaultAnimations; - } - - return animations[new Random().nextInt(animations.length)]; - } - } diff --git a/src/services/command/CombatCommand.java b/src/services/command/CombatCommand.java index 77ecde00..dd761b02 100644 --- a/src/services/command/CombatCommand.java +++ b/src/services/command/CombatCommand.java @@ -21,6 +21,9 @@ ******************************************************************************/ package services.command; +import java.util.Random; + +import resources.objects.weapon.WeaponObject; import engine.clientdata.ClientFileManager; import engine.clientdata.visitors.DatatableVisitor; @@ -60,6 +63,21 @@ public class CombatCommand extends BaseSWGCommand { private float criticalChance; private int attack_rolls; + private String[] defaultAnimations = new String[]{}; + private String[] oneHandedAnimations = new String[]{}; + private String[] twoHandedAnimations = new String[]{}; + private String[] polearmAnimations = new String[]{}; + private String[] unarmedAnimations = new String[]{}; + private String[] pistolAnimations = new String[]{}; + private String[] carbineAnimations = new String[]{}; + private String[] lightRifleAnimations = new String[]{}; + private String[] rifleAnimations = new String[]{}; + private String[] heavyWpnAnimations = new String[]{}; + private String[] oneHandedLSAnimations = new String[]{}; + private String[] twoHandedLSAnimations = new String[]{}; + private String[] polearmLSAnimations = new String[]{}; + private String[] thrownAnimations = new String[]{}; + public CombatCommand(String commandName) { super(commandName); try { @@ -490,6 +508,169 @@ public class CombatCommand extends BaseSWGCommand { this.attack_rolls = attack_rolls; } + public String[] getDefaultAnimations() { + return defaultAnimations; + } + + public void setDefaultAnimations(String[] defaultAnimations) { + this.defaultAnimations = defaultAnimations; + } + + public String[] getOneHandedAnimations() { + return oneHandedAnimations; + } + + public void setOneHandedAnimations(String[] oneHandedAnimations) { + this.oneHandedAnimations = oneHandedAnimations; + } + + public String[] getTwoHandedAnimations() { + return twoHandedAnimations; + } + + public void setTwoHandedAnimations(String[] twoHandedAnimations) { + this.twoHandedAnimations = twoHandedAnimations; + } + + public String[] getPolearmAnimations() { + return polearmAnimations; + } + + public void setPolearmAnimations(String[] polearmAnimations) { + this.polearmAnimations = polearmAnimations; + } + + public String[] getUnarmedAnimations() { + return unarmedAnimations; + } + + public void setUnarmedAnimations(String[] unarmedAnimations) { + this.unarmedAnimations = unarmedAnimations; + } + + public String[] getPistolAnimations() { + return pistolAnimations; + } + + public void setPistolAnimations(String[] pistolAnimations) { + this.pistolAnimations = pistolAnimations; + } + + public String[] getCarbineAnimations() { + return carbineAnimations; + } + + public void setCarbineAnimations(String[] carbineAnimations) { + this.carbineAnimations = carbineAnimations; + } + + public String[] getLightRifleAnimations() { + return lightRifleAnimations; + } + + public void setLightRifleAnimations(String[] lightRifleAnimations) { + this.lightRifleAnimations = lightRifleAnimations; + } + + public String[] getRifleAnimations() { + return rifleAnimations; + } + + public void setRifleAnimations(String[] rifleAnimations) { + this.rifleAnimations = rifleAnimations; + } + + public String[] getHeavyWpnAnimations() { + return heavyWpnAnimations; + } + + public void setHeavyWpnAnimations(String[] heavyWpnAnimations) { + this.heavyWpnAnimations = heavyWpnAnimations; + } + + public String[] getOneHandedLSAnimations() { + return oneHandedLSAnimations; + } + + public void setOneHandedLSAnimations(String[] oneHandedLSAnimations) { + this.oneHandedLSAnimations = oneHandedLSAnimations; + } + + public String[] getTwoHandedLSAnimations() { + return twoHandedLSAnimations; + } + + public void setTwoHandedLSAnimations(String[] twoHandedLSAnimations) { + this.twoHandedLSAnimations = twoHandedLSAnimations; + } + + public String[] getPolearmLSAnimations() { + return polearmLSAnimations; + } + + public void setPolearmLSAnimations(String[] polearmLSAnimations) { + this.polearmLSAnimations = polearmLSAnimations; + } + + public String[] getThrownAnimations() { + return thrownAnimations; + } + + public void setThrownAnimations(String[] thrownAnimations) { + this.thrownAnimations = thrownAnimations; + } + + public String getRandomAnimation(WeaponObject weapon) { + int weaponType = weapon.getWeaponType(); + String[] animations; + + switch (weaponType) { + case 0: + animations = rifleAnimations; + break; + case 1: + animations = carbineAnimations; + break; + case 2: + animations = pistolAnimations; + break; + case 3: + animations = heavyWpnAnimations; + break; + case 4: + animations = oneHandedAnimations; + break; + case 5: + animations = twoHandedAnimations; + break; + case 6: + animations = defaultAnimations; + break; + case 7: + animations = polearmAnimations; + break; + case 8: + animations = thrownAnimations; + break; + case 9: + animations = oneHandedLSAnimations; + break; + case 10: + animations = twoHandedLSAnimations; + break; + case 11: + animations = polearmLSAnimations; + break; + default: + animations = defaultAnimations; + break; + } + + if (animations.length == 0) { + animations = defaultAnimations; + } + + return animations[new Random().nextInt(animations.length)]; + } - } diff --git a/src/services/command/CommandService.java b/src/services/command/CommandService.java index b7fb6c04..809570bb 100644 --- a/src/services/command/CommandService.java +++ b/src/services/command/CommandService.java @@ -47,7 +47,6 @@ import protocol.swg.objectControllerObjects.CommandEnqueue; import protocol.swg.objectControllerObjects.CommandEnqueueRemove; import protocol.swg.objectControllerObjects.StartTask; import resources.objects.creature.CreatureObject; -import resources.objects.harvester.HarvesterObject; import resources.objects.tangible.TangibleObject; import resources.objects.weapon.WeaponObject; @@ -75,7 +74,7 @@ public class CommandService implements INetworkDispatch { return false; } - if (command.getCharacterAbility().length() > 0 && !actor.hasAbility(command.getCharacterAbility()) && !command.getCharacterAbility().equals("admin") && actor.getClient() != null) { + if (command.getCharacterAbility().length() > 0 && !actor.hasAbility(command.getCharacterAbility()) && actor.getClient() != null) { return false; } @@ -83,7 +82,7 @@ public class CommandService implements INetworkDispatch { return false; } - if (command.getGodLevel() > 0 && (actor.getClient() == null || !actor.getClient().isGM())) { + if (actor.getClient() != null && command.getGodLevel() > actor.getPlayerObject().getGodLevel()) { return false; } @@ -148,15 +147,15 @@ public class CommandService implements INetworkDispatch { break; case 2: // Anyone (objectId/targetName) - if (actor.getClient() == null) { - break; - } - if (target == null) { if (commandArgs != null && !commandArgs.equals("")) { String name = commandArgs.split(" ")[0]; target = core.objectService.getObjectByFirstName(name); + + if (target == actor) { + target = null; + } } break; @@ -240,14 +239,20 @@ public class CommandService implements INetworkDispatch { TangibleObject object = (TangibleObject) target; - if(object instanceof CreatureObject && actor.getFactionStatus() < ((CreatureObject) object).getFactionStatus()) + if (!object.getFaction().equals("") && !object.getFaction().equals(actor.getFaction())) { return false; + } - if (object.isAttackableBy(actor) || (!object.getFaction().equals("") && !object.getFaction().equals(actor.getFaction()))) { + if (actor.getFactionStatus() < object.getFactionStatus()) { + return false; + } + + if (object.isAttackableBy(actor)) { return false; } // Without this we could be buffing ally NPCs and such + // Think this is checked later on if (actor.getSlottedObject("ghost") != null && object.getSlottedObject("ghost") == null) { return false; } @@ -270,7 +275,7 @@ public class CommandService implements INetworkDispatch { default: break; } - + if (command.shouldCallOnTarget()) { if (target == null || !(target instanceof CreatureObject)) { return false; @@ -279,7 +284,7 @@ public class CommandService implements INetworkDispatch { actor = (CreatureObject) target; } - long warmupTime = (long) (command.getWarmupTime() * 1000F); + long warmupTime = (long) (command.getWarmupTime() * 1000f); if(warmupTime > 0) { try { @@ -320,19 +325,7 @@ public class CommandService implements INetworkDispatch { String name = ((String) visitor.getObject(i, 0)).toLowerCase(); if (CRC.StringtoCRC(name) == commandCRC) { - int sub = 0; - - boolean hasCharacterAbility = (((String) visitor.getObject(i, 7-sub)).length() > 0); - - if (tableArray[n].startsWith("client_") || tableArray[n].startsWith("command_table_")) { - sub += 7; - } - - if (tableArray[n].equals("client_command_table_space")) { - sub += 5; - } - - if (hasCharacterAbility || isCombatCommand(name)) { + if (isCombatCommand(name)) { CombatCommand command = new CombatCommand(name.toLowerCase()); commandLookup.add(command); return command; @@ -376,19 +369,7 @@ public class CommandService implements INetworkDispatch { String commandName = ((String) visitor.getObject(i, 0)).toLowerCase(); if (commandName.equalsIgnoreCase(name)) { - int sub = 0; - - boolean hasCharacterAbility = (((String) visitor.getObject(i, 7-sub)).length() > 0); - - if (tableArray[n].startsWith("client_") || tableArray[n].startsWith("command_table_")) { - sub += 7; - } - - if (tableArray[n].equals("client_command_table_space")) { - sub += 5; - } - - if (/*hasCharacterAbility ||*/ isCombatCommand(commandName)) { + if (isCombatCommand(commandName)) { CombatCommand command = new CombatCommand(commandName); commandLookup.add(command); return command; @@ -425,9 +406,10 @@ public class CommandService implements INetworkDispatch { } public void processCommand(CreatureObject actor, SWGObject target, BaseSWGCommand command, int actionCounter, String commandArgs) { - if(command.getCooldown() > 0) + if (command.getCooldown() > 0f) { actor.addCooldown(command.getCooldownGroup(), command.getCooldown()); - + } + if (command instanceof CombatCommand) { processCombatCommand(actor, target, (CombatCommand) command, actionCounter, commandArgs); } else { @@ -608,13 +590,25 @@ public class CommandService implements INetworkDispatch { } - public BaseSWGCommand registerCombatCommand(String name) { return getCommandByName(name); } - public BaseSWGCommand registerCommand(String name) { return getCommandByName(name); } - public BaseSWGCommand registerGmCommand(String name) { + public BaseSWGCommand registerCommand(String name) { + return getCommandByName(name); + } + + public CombatCommand registerCombatCommand(String name) { BaseSWGCommand command = getCommandByName(name); - if(command != null) - command.setGodLevel(5); - return command; + + if (command instanceof CombatCommand) { + return (CombatCommand) command; + } + + return null; + } + + public BaseSWGCommand registerGmCommand(String name) { + BaseSWGCommand command = getCommandByName(name); + //if(command != null) + //command.setGodLevel(5); // not sure if still needed after more recent commits + return command; } } From a90dd74b809b8f3a444628b32af80f6aebd91c70 Mon Sep 17 00:00:00 2001 From: CharonInferar Date: Sun, 13 Apr 2014 14:38:39 +0200 Subject: [PATCH 09/32] Exception handling for Harvester Service future executor handler This should show any runtime exceptions of the Runnable(), because something kills the task after some time, probably an exception. --- src/services/object/ObjectService.java | 3 +- src/services/resources/HarvesterService.java | 42 +++++++++++++++++--- 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index f4385f18..4dd8d8d5 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -397,8 +397,7 @@ public class ObjectService implements INetworkDispatch { float positionY = core.terrainService.getHeight(planet.getID(), position.x, position.z)-1f; Point3D newpoint = new Point3D(position.x,positionY,position.z); - object = new HarvesterObject(objectID, planet, Template, newpoint, orientation); - core.harvesterService.addHarvester(object); + object = new HarvesterObject(objectID, planet, Template, newpoint, orientation); } else { return null; diff --git a/src/services/resources/HarvesterService.java b/src/services/resources/HarvesterService.java index 71d2a276..95cee397 100644 --- a/src/services/resources/HarvesterService.java +++ b/src/services/resources/HarvesterService.java @@ -30,6 +30,7 @@ import java.util.List; import java.util.Map; import java.util.Random; import java.util.Vector; +import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; @@ -149,14 +150,39 @@ public class HarvesterService implements INetworkDispatch { } }, 10, 5000, TimeUnit.MILLISECONDS); - + + ExecutionSurveillanceThread executionSurveillance = new ExecutionSurveillanceThread(task); + executionSurveillance.start(); } + class ExecutionSurveillanceThread extends Thread { + ScheduledFuture task; + + public ExecutionSurveillanceThread(ScheduledFuture task) { + this.task = task; + } + + public void run() { + try { + try { + task.get(); + } catch (InterruptedException e1) { + System.err.println("InterruptedException IN HARVESTERSERVICE !!! " + e1.getMessage()); + } + } catch (ExecutionException e2) { + System.err.println("EXCEPTION IN HARVESTERSERVICE !!! " + e2.getMessage()); + System.err.println("EXCEPTION CAUSE : " + e2.getCause()); + } + } + } + public void ServiceProcessing(){ synchronized(allHarvesters){ for (HarvesterObject harvester : allHarvesters){ - updateHarvester(harvester); + if (harvester!=null) + updateHarvester(harvester); } + allHarvesters.removeAll(Collections.singleton(null)); } synchronized(allConstructors){ Vector removeConstructors = new Vector(); @@ -166,19 +192,22 @@ public class HarvesterService implements INetworkDispatch { removeConstructors.add(constructor); } allConstructors.removeAll(removeConstructors); + allConstructors.removeAll(Collections.singleton(null)); } } public void addHarvester(SWGObject harvester){ synchronized(allHarvesters){ - allHarvesters.add((HarvesterObject)harvester); + if (harvester!=null) + allHarvesters.add((HarvesterObject)harvester); } } public void removeHarvester(SWGObject harvester){ synchronized(allHarvesters){ - allHarvesters.remove((HarvesterObject)harvester); + if (harvester!=null) + allHarvesters.remove((HarvesterObject)harvester); } } @@ -432,6 +461,7 @@ public class HarvesterService implements INetworkDispatch { deed.setSurplusPower((int)harvester.getPowerLevel()); deed.setAttributes(); + removeHarvester(harvester); core.objectService.destroyObject(harvester.getObjectID()); SWGObject crafterInventory = owner.getSlottedObject("inventory"); @@ -969,6 +999,8 @@ public class HarvesterService implements INetworkDispatch { float positionY = NGECore.getInstance().terrainService.getHeight(actor.getPlanetId(), object.getPosition().x, object.getPosition().z); harvester.setPosition(new Point3D(object.getPosition().x,positionY, object.getPosition().z)); core.simulationService.add(harvester, harvester.getPosition().x, harvester.getPosition().z, true); + addHarvester(harvester); + PlayerObject player = (PlayerObject) actor.getSlottedObject("ghost"); WaypointObject constructionWaypoint = (WaypointObject)NGECore.getInstance().objectService.createObject("object/waypoint/shared_world_waypoint_blue.iff", actor.getPlanet(), harvester.getPosition().x, 0 ,harvester.getPosition().z); String displayname = "@installation_n:"+harvester.getStfName(); @@ -1020,7 +1052,7 @@ public class HarvesterService implements INetworkDispatch { public void enterStructurePlacementMode(SWGObject object, CreatureObject actor){ - if (!core.terrainService.canBuildAtPosition(actor,actor.getPosition().x,actor.getPosition().z)){ + if (!actor.getClient().isGM() && !core.terrainService.canBuildAtPosition(actor,actor.getPosition().x,actor.getPosition().z)){ actor.sendSystemMessage("@player_structure:not_permitted", (byte) 0); return; } From 2805c8c6538377d0ceafefd3270f216463a6747f Mon Sep 17 00:00:00 2001 From: portocol Date: Sun, 13 Apr 2014 11:16:27 -0400 Subject: [PATCH 10/32] Delete set_bonus_jedi_utility_b_1.py --- scripts/buffs/set_bonus_jedi_utility_b_1.py | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 scripts/buffs/set_bonus_jedi_utility_b_1.py diff --git a/scripts/buffs/set_bonus_jedi_utility_b_1.py b/scripts/buffs/set_bonus_jedi_utility_b_1.py deleted file mode 100644 index d13f83cc..00000000 --- a/scripts/buffs/set_bonus_jedi_utility_b_1.py +++ /dev/null @@ -1,16 +0,0 @@ -import sys - -def setup(core, actor, buff): - return - -def add(core, actor, buff): - core.skillModService.addSkillMod(actor, 'constitution_modified', 25) - core.skillModService.addSkillMod(actor, 'combat_critical_hit_reduction', 1) - core.skillModService.addSkillMod(actor, 'display_only_expertise_critical_hit_reduction', 100) - return - -def remove(core, actor, buff): - core.skillModService.deductSkillMod(actor, 'constitution_modified', 25) - core.skillModService.deductSkillMod(actor, 'combat_critical_hit_reduction', 1) - core.skillModService.deductSkillMod(actor, 'display_only_expertise_critical_hit_reduction', 100) - return From 62624850cae8facc3ad306494b48f5841e05ce7a Mon Sep 17 00:00:00 2001 From: portocol Date: Sun, 13 Apr 2014 11:17:18 -0400 Subject: [PATCH 11/32] Delete set_bonus_jedi_utility_b_2.py --- scripts/buffs/set_bonus_jedi_utility_b_2.py | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 scripts/buffs/set_bonus_jedi_utility_b_2.py diff --git a/scripts/buffs/set_bonus_jedi_utility_b_2.py b/scripts/buffs/set_bonus_jedi_utility_b_2.py deleted file mode 100644 index c682aaa7..00000000 --- a/scripts/buffs/set_bonus_jedi_utility_b_2.py +++ /dev/null @@ -1,18 +0,0 @@ -import sys - -def setup(core, actor, buff): - return - -def add(core, actor, buff): - core.skillModService.addSkillMod(actor, 'constitution_modified', 50) - core.skillModService.addSkillMod(actor, 'combat_critical_hit_reduction', 3) - core.skillModService.addSkillMod(actor, 'display_only_expertise_critical_hit_reduction', 300) - core.skillModService.addSkillMod(actor, 'expertise_action_all', 5) - return - -def remove(core, actor, buff): - core.skillModService.deductSkillMod(actor, 'constitution_modified', 50) - core.skillModService.deductSkillMod(actor, 'combat_critical_hit_reduction', 3) - core.skillModService.deductSkillMod(actor, 'display_only_expertise_critical_hit_reduction', 300) - core.skillModService.deductSkillMod(actor, 'expertise_action_all', 5) - return From f28777421cd79461857f199c453fc7e1d4534ecd Mon Sep 17 00:00:00 2001 From: portocol Date: Sun, 13 Apr 2014 11:17:42 -0400 Subject: [PATCH 12/32] Delete set_bonus_jedi_utility_b_3.py --- scripts/buffs/set_bonus_jedi_utility_b_3.py | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 scripts/buffs/set_bonus_jedi_utility_b_3.py diff --git a/scripts/buffs/set_bonus_jedi_utility_b_3.py b/scripts/buffs/set_bonus_jedi_utility_b_3.py deleted file mode 100644 index f2709736..00000000 --- a/scripts/buffs/set_bonus_jedi_utility_b_3.py +++ /dev/null @@ -1,20 +0,0 @@ -import sys - -def setup(core, actor, buff): - return - -def add(core, actor, buff): - core.skillModService.addSkillMod(actor, 'constitution_modified', 150) - core.skillModService.addSkillMod(actor, 'combat_critical_hit_reduction', 5) - core.skillModService.addSkillMod(actor, 'display_only_expertise_critical_hit_reduction', 500) - core.skillModService.addSkillMod(actor, 'expertise_action_all', 10) - #actor.addAbility("fs_set_heroic_taunt_1") - return - -def remove(core, actor, buff): - core.skillModService.deductSkillMod(actor, 'constitution_modified', 150) - core.skillModService.deductSkillMod(actor, 'combat_critical_hit_reduction', 5) - core.skillModService.deductSkillMod(actor, 'display_only_expertise_critical_hit_reduction', 500) - core.skillModService.deductSkillMod(actor, 'expertise_action_all', 10) - #actor.removeAbility("fs_set_heroic_taunt_1") - return From e827b8fa36da200b9eb708a3bb4c814d2156610a Mon Sep 17 00:00:00 2001 From: portocol Date: Sun, 13 Apr 2014 11:18:28 -0400 Subject: [PATCH 13/32] Delete set_bonus_jedi_utility_b.py --- .../bonus_sets/set_bonus_jedi_utility_b.py | 28 ------------------- 1 file changed, 28 deletions(-) delete mode 100644 scripts/equipment/bonus_sets/set_bonus_jedi_utility_b.py diff --git a/scripts/equipment/bonus_sets/set_bonus_jedi_utility_b.py b/scripts/equipment/bonus_sets/set_bonus_jedi_utility_b.py deleted file mode 100644 index b344bf0a..00000000 --- a/scripts/equipment/bonus_sets/set_bonus_jedi_utility_b.py +++ /dev/null @@ -1,28 +0,0 @@ -import sys -from services.equipment import BonusSetTemplate -from java.util import Vector - -def addBonusSet(core): - bonusSet = BonusSetTemplate("set_bonus_jedi_utility_b") - - bonusSet.addRequiredItem("item_band_set_jedi_utility_b_01_01") - bonusSet.addRequiredItem("item_ring_set_jedi_utility_b_01_01") - bonusSet.addRequiredItem("item_necklace_set_jedi_utility_b_01_01") - bonusSet.addRequiredItem("item_bracelet_r_set_jedi_utility_b_01_01") - bonusSet.addRequiredItem("item_bracelet_l_set_jedi_utility_b_01_01") - - core.equipmentService.addBonusSetTemplate(bonusSet) - -def handleChange(core, creature, set): - wornItems = set.getWornTemplateCount(creature) - - if wornItems == 3: - core.buffService.addBuffToCreature(creature, "set_bonus_jedi_utility_b_1", creature) - elif wornItems == 4: - core.buffService.addBuffToCreature(creature, "set_bonus_jedi_utility_b_2", creature) - elif wornItems == 5: - core.buffService.addBuffToCreature(creature, "set_bonus_jedi_utility_b_3", creature) - else: - core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_jedi_utility_b_1") - core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_jedi_utility_b_2") - core.buffService.removeBuffFromCreatureByName(creature, "set_bonus_jedi_utility_b_3") From 7cee1990b56ce03e7527c6a2b26c50235b10f525 Mon Sep 17 00:00:00 2001 From: Treeku Date: Sun, 13 Apr 2014 16:33:18 +0100 Subject: [PATCH 14/32] Serial number uses attribute --- src/protocol/swg/chat/ChatQueryRoomResults.java | 1 - .../objects/building/BuildingMessageBuilder.java | 1 - .../objects/creature/CreatureMessageBuilder.java | 3 +-- .../objects/harvester/HarvesterMessageBuilder.java | 1 - .../objects/installation/InstallationObject.java | 1 - src/resources/objects/tangible/TangibleObject.java | 7 ++----- src/services/LootService.java | 3 --- src/services/SkillService.java | 2 -- src/services/bazaar/BazaarService.java | 2 -- src/services/chat/ChatService.java | 5 ----- src/services/housing/HousingService.java | 13 ------------- src/services/object/ObjectService.java | 2 +- src/services/resources/HarvesterService.java | 11 ----------- src/services/spawn/SpawnService.java | 1 - 14 files changed, 4 insertions(+), 49 deletions(-) diff --git a/src/protocol/swg/chat/ChatQueryRoomResults.java b/src/protocol/swg/chat/ChatQueryRoomResults.java index 33d29f77..530438ca 100644 --- a/src/protocol/swg/chat/ChatQueryRoomResults.java +++ b/src/protocol/swg/chat/ChatQueryRoomResults.java @@ -29,7 +29,6 @@ import main.NGECore; import org.apache.mina.core.buffer.IoBuffer; import protocol.swg.SWGMessage; -import resources.objects.creature.CreatureObject; import services.chat.ChatRoom; public class ChatQueryRoomResults extends SWGMessage { diff --git a/src/resources/objects/building/BuildingMessageBuilder.java b/src/resources/objects/building/BuildingMessageBuilder.java index b3639d99..8dbf7ec8 100644 --- a/src/resources/objects/building/BuildingMessageBuilder.java +++ b/src/resources/objects/building/BuildingMessageBuilder.java @@ -27,7 +27,6 @@ import java.util.Vector; import org.apache.mina.core.buffer.IoBuffer; import resources.objects.ObjectMessageBuilder; -import resources.objects.harvester.HarvesterObject; public class BuildingMessageBuilder extends ObjectMessageBuilder { diff --git a/src/resources/objects/creature/CreatureMessageBuilder.java b/src/resources/objects/creature/CreatureMessageBuilder.java index 18ae40e8..8d6a01c6 100644 --- a/src/resources/objects/creature/CreatureMessageBuilder.java +++ b/src/resources/objects/creature/CreatureMessageBuilder.java @@ -1149,8 +1149,7 @@ public class CreatureMessageBuilder extends ObjectMessageBuilder { buffer.putLong(ownerId); int size = buffer.position(); buffer.flip(); - //buffer = createDelta("CREO", (byte) 3, (short) 1, (short) 0x0D, buffer, size + 4); 0F,12 doesnt crash - buffer = createDelta("CREO", (byte) 3, (short) 1, (short) 0x0F, buffer, size + 4); // checked from 0xA up to 0x1F + buffer = createDelta("CREO", (byte) 3, (short) 1, (short) 0x0F, buffer, size + 4); // This is the correct one return buffer; } diff --git a/src/resources/objects/harvester/HarvesterMessageBuilder.java b/src/resources/objects/harvester/HarvesterMessageBuilder.java index 98daa62a..cbe9b4d9 100644 --- a/src/resources/objects/harvester/HarvesterMessageBuilder.java +++ b/src/resources/objects/harvester/HarvesterMessageBuilder.java @@ -29,7 +29,6 @@ import org.apache.mina.core.buffer.IoBuffer; import engine.resources.objects.SWGObject; import resources.objects.ObjectMessageBuilder; -import resources.objects.building.BuildingObject; import resources.objects.creature.CreatureObject; import resources.objects.resource.GalacticResource; import resources.objects.resource.ResourceContainerObject; diff --git a/src/resources/objects/installation/InstallationObject.java b/src/resources/objects/installation/InstallationObject.java index 856eeb59..4d78229d 100644 --- a/src/resources/objects/installation/InstallationObject.java +++ b/src/resources/objects/installation/InstallationObject.java @@ -22,7 +22,6 @@ package resources.objects.installation; import com.sleepycat.persist.model.Entity; -import com.sleepycat.persist.model.Persistent; import engine.clients.Client; import engine.resources.scene.Planet; diff --git a/src/resources/objects/tangible/TangibleObject.java b/src/resources/objects/tangible/TangibleObject.java index b33717d0..ef276709 100644 --- a/src/resources/objects/tangible/TangibleObject.java +++ b/src/resources/objects/tangible/TangibleObject.java @@ -83,8 +83,6 @@ public class TangibleObject extends SWGObject { private boolean looted = false; private boolean lootLock = false; - private String serialNumber; - @NotPersistent private TangibleObject killer = null; @@ -486,14 +484,13 @@ public class TangibleObject extends SWGObject { } public String getSerialNumber() { - return serialNumber; + return getStringAttribute("serial_number"); } public void setSerialNumber(String serialNumber) { - this.serialNumber = serialNumber; + setStringAttribute("serial_number", serialNumber); } - @Override public void sendBaselines(Client destination) { diff --git a/src/services/LootService.java b/src/services/LootService.java index a0929b07..b0d64bc0 100644 --- a/src/services/LootService.java +++ b/src/services/LootService.java @@ -27,10 +27,7 @@ import java.nio.file.DirectoryStream; import java.nio.file.DirectoryStream.Filter; import java.nio.file.FileSystems; import java.nio.file.Files; -import java.nio.file.LinkOption; import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.attribute.BasicFileAttributeView; import java.util.ArrayList; import java.util.Iterator; import java.util.List; diff --git a/src/services/SkillService.java b/src/services/SkillService.java index 2b57ed5f..a61116b3 100644 --- a/src/services/SkillService.java +++ b/src/services/SkillService.java @@ -167,8 +167,6 @@ public class SkillService implements INetworkDispatch { creature.addAbility(ability); } - // When leveling, add all new unadded expertise abilities - // It's up to the script to not add abilities that are already added for (String expertiseName : creature.getSkills()) { if (expertiseName.startsWith("expertise")) { if (FileUtilities.doesFileExist("scripts/expertise/" + expertiseName + ".py")) { diff --git a/src/services/bazaar/BazaarService.java b/src/services/bazaar/BazaarService.java index 1700aa64..3aa4e789 100644 --- a/src/services/bazaar/BazaarService.java +++ b/src/services/bazaar/BazaarService.java @@ -33,9 +33,7 @@ import engine.resources.service.INetworkRemoteEvent; import resources.common.Opcodes; import resources.objects.building.BuildingObject; import resources.objects.creature.CreatureObject; -import protocol.swg.ClientIdMsg; import protocol.swg.auctionManagerClientListener.CommoditiesItemTypeListResponse; -import protocol.swg.auctionManagerClientListener.CommoditiesResourceTypeListResponse; import protocol.swg.auctionManagerClientListener.CreateAuctionMessage; import protocol.swg.auctionManagerClientListener.IsVendorOwnerMessage; import protocol.swg.auctionManagerClientListener.IsVendorOwnerResponseMessage; diff --git a/src/services/chat/ChatService.java b/src/services/chat/ChatService.java index 38476166..04fefd99 100644 --- a/src/services/chat/ChatService.java +++ b/src/services/chat/ChatService.java @@ -24,7 +24,6 @@ package services.chat; import java.nio.ByteOrder; import java.util.Date; import java.util.HashSet; -import java.util.List; import java.util.Map; import java.util.Random; import java.util.Vector; @@ -41,7 +40,6 @@ import engine.resources.config.Config; import engine.resources.config.DefaultConfig; import engine.resources.database.ObjectDatabase; import engine.resources.objects.SWGObject; -import engine.resources.scene.Planet; import engine.resources.scene.Point3D; import engine.resources.service.INetworkDispatch; import engine.resources.service.INetworkRemoteEvent; @@ -51,7 +49,6 @@ import resources.objects.creature.CreatureObject; import resources.objects.player.PlayerObject; import protocol.swg.AddIgnoreMessage; import protocol.swg.ObjControllerMessage; -import protocol.swg.chat.ChatCreateRoom; import protocol.swg.chat.ChatDeletePersistentMessage; import protocol.swg.chat.ChatEnterRoomById; import protocol.swg.chat.ChatFriendsListUpdate; @@ -59,7 +56,6 @@ import protocol.swg.chat.ChatInstantMessageToCharacter; import protocol.swg.chat.ChatInstantMessagetoClient; import protocol.swg.chat.ChatOnAddFriend; import protocol.swg.chat.ChatOnChangeFriendStatus; -import protocol.swg.chat.ChatOnCreateRoom; import protocol.swg.chat.ChatOnEnteredRoom; import protocol.swg.chat.ChatOnSendInstantMessage; import protocol.swg.chat.ChatOnSendPersistentMessage; @@ -70,7 +66,6 @@ import protocol.swg.chat.ChatRequestPersistentMessage; import protocol.swg.chat.ChatRoomList; import protocol.swg.chat.ChatRoomMessage; import protocol.swg.chat.ChatSendToRoom; -import protocol.swg.chat.ChatServerStatus; import protocol.swg.chat.ChatSystemMessage; import protocol.swg.objectControllerObjects.PlayerEmote; import protocol.swg.objectControllerObjects.SpatialChat; diff --git a/src/services/housing/HousingService.java b/src/services/housing/HousingService.java index 3367c412..1c6611d8 100644 --- a/src/services/housing/HousingService.java +++ b/src/services/housing/HousingService.java @@ -37,19 +37,14 @@ import java.util.concurrent.ConcurrentHashMap; import main.NGECore; import protocol.swg.EnterStructurePlacementModeMessage; -import protocol.swg.SceneCreateObjectByCrc; -import protocol.swg.SceneDestroyObject; import resources.objects.building.BuildingObject; import resources.objects.creature.CreatureObject; -import resources.objects.deed.Harvester_Deed; import resources.objects.deed.Player_House_Deed; -import resources.objects.harvester.HarvesterObject; import resources.objects.player.PlayerObject; import resources.objects.tangible.TangibleObject; import services.sui.SUIWindow; import services.sui.SUIWindow.SUICallback; import services.sui.SUIWindow.Trigger; -import engine.resources.common.CRC; import engine.resources.objects.SWGObject; import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; @@ -217,7 +212,6 @@ public class HousingService implements INetworkDispatch { Vector returnList = new Vector(); returnList.add("List.lstList:SelectedRow"); window.addHandler(0, "", Trigger.TRIGGER_OK, returnList, new SUICallback() { - @SuppressWarnings("unchecked") @Override public void process(SWGObject owner, int eventType, Vector returnList) { core.suiService.closeSUIWindow(owner, 0); @@ -225,7 +219,6 @@ public class HousingService implements INetworkDispatch { } }); window.addHandler(1, "", Trigger.TRIGGER_CANCEL, returnList, new SUICallback() { - @SuppressWarnings("unchecked") @Override public void process(SWGObject owner, int eventType, Vector returnList) { core.suiService.closeSUIWindow(owner, 0); @@ -255,7 +248,6 @@ public class HousingService implements INetworkDispatch { returnList.add("txtInput:LocalText"); window.addHandler(0, "", Trigger.TRIGGER_OK, returnList, new SUICallback() { - @SuppressWarnings("unchecked") @Override public void process(SWGObject owner, int eventType, Vector returnList) { CreatureObject crafter = (CreatureObject)owner; @@ -294,7 +286,6 @@ public class HousingService implements INetworkDispatch { } }); window.addHandler(1, "", Trigger.TRIGGER_CANCEL, returnList, new SUICallback() { - @SuppressWarnings("unchecked") @Override public void process(SWGObject owner, int eventType, Vector returnList) { core.suiService.closeSUIWindow(owner, 0); @@ -341,7 +332,6 @@ public class HousingService implements INetworkDispatch { returnList.add("transaction.txtInputFrom:Text"); returnList.add("transaction.txtInputTo:Text"); window.addHandler(0, "", Trigger.TRIGGER_OK, returnList, new SUICallback() { - @SuppressWarnings("unchecked") @Override public void process(SWGObject owner, int eventType, Vector returnList) { CreatureObject crafter = (CreatureObject)owner; @@ -355,7 +345,6 @@ public class HousingService implements INetworkDispatch { } }); window.addHandler(1, "", Trigger.TRIGGER_CANCEL, returnList, new SUICallback() { - @SuppressWarnings("unchecked") @Override public void process(SWGObject owner, int eventType, Vector returnList) { core.suiService.closeSUIWindow(owner, 0); @@ -370,7 +359,6 @@ public class HousingService implements INetworkDispatch { returnList.add("txtInput:LocalText"); final TangibleObject outerSurveyTool = target; window.addHandler(0, "", Trigger.TRIGGER_OK, returnList, new SUICallback() { - @SuppressWarnings("unchecked") @Override public void process(SWGObject owner, int eventType, Vector returnList) { core.housingService.handleSetName((CreatureObject)owner, (TangibleObject)outerSurveyTool,returnList.get(0)); @@ -429,7 +417,6 @@ public class HousingService implements INetworkDispatch { returnList.add("List.lstList:SelectedRow"); window.addHandler(0, "", Trigger.TRIGGER_OK, returnList, new SUICallback() { - @SuppressWarnings("unchecked") @Override public void process(SWGObject owner, int eventType, Vector returnList) { core.suiService.closeSUIWindow(owner, 0); diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index f4385f18..59640e4a 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -659,7 +659,7 @@ public class ObjectService implements INetworkDispatch { return core.getCreatureODB().get(new Long(objectId), Long.class, CreatureObject.class); } - private long generateObjectID() { + public long generateObjectID() { /*Random random = new Random(); long objectID = random.nextInt(); diff --git a/src/services/resources/HarvesterService.java b/src/services/resources/HarvesterService.java index 71d2a276..313bfdfe 100644 --- a/src/services/resources/HarvesterService.java +++ b/src/services/resources/HarvesterService.java @@ -42,7 +42,6 @@ import protocol.swg.EnterStructurePlacementModeMessage; import protocol.swg.SceneCreateObjectByCrc; import protocol.swg.SceneDestroyObject; import protocol.swg.SceneEndBaselines; -import protocol.swg.objectControllerObjects.CommandEnqueue; import main.NGECore; import engine.clients.Client; import engine.resources.common.CRC; @@ -243,7 +242,6 @@ public class HarvesterService implements INetworkDispatch { returnList.add("List.lstList:SelectedRow"); window.addHandler(0, "", Trigger.TRIGGER_OK, returnList, new SUICallback() { - @SuppressWarnings("unchecked") @Override public void process(SWGObject owner, int eventType, Vector returnList) { core.suiService.closeSUIWindow(owner, 0); @@ -290,7 +288,6 @@ public class HarvesterService implements INetworkDispatch { returnList.add("transaction.txtInputFrom:Text"); returnList.add("transaction.txtInputTo:Text"); window.addHandler(0, "", Trigger.TRIGGER_OK, returnList, new SUICallback() { - @SuppressWarnings("unchecked") @Override public void process(SWGObject owner, int eventType, Vector returnList) { CreatureObject crafter = (CreatureObject)owner; @@ -305,7 +302,6 @@ public class HarvesterService implements INetworkDispatch { } }); window.addHandler(1, "", Trigger.TRIGGER_CANCEL, returnList, new SUICallback() { - @SuppressWarnings("unchecked") @Override public void process(SWGObject owner, int eventType, Vector returnList) { CreatureObject crafter = (CreatureObject)owner; @@ -322,7 +318,6 @@ public class HarvesterService implements INetworkDispatch { returnList.add("txtInput:LocalText"); final TangibleObject outerSurveyTool = target; window.addHandler(0, "", Trigger.TRIGGER_OK, returnList, new SUICallback() { - @SuppressWarnings("unchecked") @Override public void process(SWGObject owner, int eventType, Vector returnList) { core.harvesterService.handleSetName((CreatureObject)owner, (TangibleObject)outerSurveyTool,returnList.get(0)); @@ -370,7 +365,6 @@ public class HarvesterService implements INetworkDispatch { Vector returnList = new Vector(); returnList.add("List.lstList:SelectedRow"); window.addHandler(0, "", Trigger.TRIGGER_OK, returnList, new SUICallback() { - @SuppressWarnings("unchecked") @Override public void process(SWGObject owner, int eventType, Vector returnList) { core.suiService.closeSUIWindow(owner, 0); @@ -378,7 +372,6 @@ public class HarvesterService implements INetworkDispatch { } }); window.addHandler(1, "", Trigger.TRIGGER_CANCEL, returnList, new SUICallback() { - @SuppressWarnings("unchecked") @Override public void process(SWGObject owner, int eventType, Vector returnList) { core.suiService.closeSUIWindow(owner, 0); @@ -409,7 +402,6 @@ public class HarvesterService implements INetworkDispatch { returnList.add("txtInput:LocalText"); window.addHandler(0, "", Trigger.TRIGGER_OK, returnList, new SUICallback() { - @SuppressWarnings("unchecked") @Override public void process(SWGObject owner, int eventType, Vector returnList) { CreatureObject crafter = (CreatureObject)owner; @@ -450,7 +442,6 @@ public class HarvesterService implements INetworkDispatch { } }); window.addHandler(1, "", Trigger.TRIGGER_CANCEL, returnList, new SUICallback() { - @SuppressWarnings("unchecked") @Override public void process(SWGObject owner, int eventType, Vector returnList) { core.suiService.closeSUIWindow(owner, 0); @@ -510,7 +501,6 @@ public class HarvesterService implements INetworkDispatch { returnList.add("transaction.txtInputFrom:Text"); returnList.add("transaction.txtInputTo:Text"); window.addHandler(0, "", Trigger.TRIGGER_OK, returnList, new SUICallback() { - @SuppressWarnings("unchecked") @Override public void process(SWGObject owner, int eventType, Vector returnList) { CreatureObject crafter = (CreatureObject)owner; @@ -522,7 +512,6 @@ public class HarvesterService implements INetworkDispatch { } }); window.addHandler(1, "", Trigger.TRIGGER_CANCEL, returnList, new SUICallback() { - @SuppressWarnings("unchecked") @Override public void process(SWGObject owner, int eventType, Vector returnList) { core.suiService.closeSUIWindow(owner, 0); diff --git a/src/services/spawn/SpawnService.java b/src/services/spawn/SpawnService.java index 96d45123..d25ec70c 100644 --- a/src/services/spawn/SpawnService.java +++ b/src/services/spawn/SpawnService.java @@ -47,7 +47,6 @@ import resources.objects.tangible.TangibleObject; import resources.objects.weapon.WeaponObject; import services.ai.AIActor; import services.ai.LairActor; -import engine.resources.container.CreatureContainerPermissions; import engine.resources.container.StaticContainerPermissions; import engine.resources.scene.Planet; import engine.resources.scene.Point3D; From 0e3a0bd151329fc5d906857e43eec44efb5b8a53 Mon Sep 17 00:00:00 2001 From: Treeku Date: Sun, 13 Apr 2014 16:36:35 +0100 Subject: [PATCH 15/32] Fixed profession respec exit bug --- src/services/PlayerService.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/services/PlayerService.java b/src/services/PlayerService.java index 4861b185..ba55e5d6 100644 --- a/src/services/PlayerService.java +++ b/src/services/PlayerService.java @@ -537,7 +537,11 @@ public class PlayerService implements INetworkDispatch { PlayerObject player = (PlayerObject) creature.getSlottedObject("ghost"); int level = 0; - if (player == null) { + if (creature == null || player == null) { + return; + } + + if (profession == null || profession.equals("")) { return; } From 1c654f8696381a02312c7059a18b5f88989e8d2b Mon Sep 17 00:00:00 2001 From: Treeku Date: Sun, 13 Apr 2014 16:50:19 +0100 Subject: [PATCH 16/32] Buffs removed only if removeOnRespec flag present --- src/services/PlayerService.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/services/PlayerService.java b/src/services/PlayerService.java index ba55e5d6..68f07722 100644 --- a/src/services/PlayerService.java +++ b/src/services/PlayerService.java @@ -566,6 +566,7 @@ public class PlayerService implements INetworkDispatch { } grantLevel(creature, level); + player.setProfessionIcon(Professions.get(profession)); } @@ -602,7 +603,11 @@ public class PlayerService implements INetworkDispatch { //core.equipmentService.unequip(creature, equipment); //} - core.buffService.clearBuffs(creature); + for (Buff buff : creature.getBuffList()) { + if (buff.isRemoveOnRespec()) { + core.buffService.removeBuffFromCreature(creature, buff); + } + } try { String[] skills; From e3c03329249144a6b46d2080b0cee6fe7c416c4a Mon Sep 17 00:00:00 2001 From: Treeku Date: Sun, 13 Apr 2014 17:29:05 +0100 Subject: [PATCH 17/32] serverTemplates now load on login Make sure your script setup() funcs don't have anything in them that can't be run twice --- src/services/object/ObjectService.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index 59640e4a..7c512e91 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -656,7 +656,21 @@ public class ObjectService implements INetworkDispatch { } public CreatureObject getCreatureFromDB(long objectId) { - return core.getCreatureODB().get(new Long(objectId), Long.class, CreatureObject.class); + CreatureObject object = core.getCreatureODB().get(new Long(objectId), Long.class, CreatureObject.class); + + if (object != null && getObject(object.getObjectID()) == null) { + loadServerTemplate(object); + + object.viewChildren(object, true, true, new Traverser() { + + public void process(SWGObject child) { + loadServerTemplate(child); + } + + }); + } + + return object; } public long generateObjectID() { From cbefc251213f3f528c58ccd5b41cbbf36f5f0b67 Mon Sep 17 00:00:00 2001 From: Ziggeh Date: Sun, 13 Apr 2014 19:15:17 +0200 Subject: [PATCH 18/32] 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); From 1b1294136a92ff147dbe184e10457923938f5a51 Mon Sep 17 00:00:00 2001 From: Seefo Date: Sun, 13 Apr 2014 13:37:54 -0400 Subject: [PATCH 19/32] Fixed a bunch of vehicle bugs - will probably change the way vehicles are being handled soon to account for other vehicle templates --- scripts/commands/dismount.py | 16 +++++++++++ scripts/commands/mount.py | 16 +++++++++++ .../vehicle/speederbike_swoop_pcd.py | 9 ++++--- .../vehicle_deed/speederbike_swoop_deed.py | 15 +++++++---- scripts/radial/vehicle.py | 14 +++++++--- scripts/radial/vehicle_pcd.py | 27 +++++++++++++++++++ .../objects/creature/CreatureObject.java | 26 +++++++++--------- src/services/SimulationService.java | 9 +++++++ 8 files changed, 108 insertions(+), 24 deletions(-) create mode 100644 scripts/commands/dismount.py create mode 100644 scripts/commands/mount.py create mode 100644 scripts/radial/vehicle_pcd.py diff --git a/scripts/commands/dismount.py b/scripts/commands/dismount.py new file mode 100644 index 00000000..df9f2733 --- /dev/null +++ b/scripts/commands/dismount.py @@ -0,0 +1,16 @@ +import sys + +def setup(): + return + +def run(core, actor, target, commandString): + if actor.canMount(target) is False: return + + if not actor.isMounted(): + actor.setMounted(1) + target.initMount(actor) + else: + target.unmount(actor) + + return + diff --git a/scripts/commands/mount.py b/scripts/commands/mount.py new file mode 100644 index 00000000..14a0f3e4 --- /dev/null +++ b/scripts/commands/mount.py @@ -0,0 +1,16 @@ +import sys + +def setup(): + return + +def run(core, actor, target, commandString): + if actor.canMount(target) is False: return + + if not actor.isMounted(): + actor.setMounted(1) + target.initMount(actor) + else: + target.unmount(actor) + + return + diff --git a/scripts/object/intangible/vehicle/speederbike_swoop_pcd.py b/scripts/object/intangible/vehicle/speederbike_swoop_pcd.py index cf931bea..ace4cdfc 100644 --- a/scripts/object/intangible/vehicle/speederbike_swoop_pcd.py +++ b/scripts/object/intangible/vehicle/speederbike_swoop_pcd.py @@ -1,12 +1,15 @@ import sys def setup(core, object): - object.setAttachment('radial_filename', 'item') + object.setAttachment('radial_filename', 'vehicle_pcd') return def use(core, actor, object): - if object: + if object and actor.getAttachment('activeVehicleID') == None: swoop = core.objectService.createObject('object/mobile/vehicle/shared_speederbike_swoop.iff', 0, actor.getPlanet(), actor.getPosition(), actor.getOrientation()) + + swoop.setOwnerId(actor.getObjectID()) + actor.setAttachment('activeVehicleID', swoop.getObjectID()) + core.simulationService.add(swoop, swoop.getPosition().x, swoop.getPosition().z, True) - return \ No newline at end of file diff --git a/scripts/object/tangible/deed/vehicle_deed/speederbike_swoop_deed.py b/scripts/object/tangible/deed/vehicle_deed/speederbike_swoop_deed.py index b32e90e3..4b0e320f 100644 --- a/scripts/object/tangible/deed/vehicle_deed/speederbike_swoop_deed.py +++ b/scripts/object/tangible/deed/vehicle_deed/speederbike_swoop_deed.py @@ -6,14 +6,19 @@ def setup(core, object): def use(core, actor, object): datapad = actor.getSlottedObject('datapad') - pcd = core.objectService.createObject('object/intangible/vehicle/shared_speederbike_swoop_pcd.iff', actor.getPlanet(), actor.getPosition().x, actor.getPosition().z,actor.getPosition().y) - #actor.sendSystemMessage('actor.getObjectID() %s' % actor.getObjectID(), 0) + if datapad and pcd: + datapad.add(pcd) core.objectService.destroyObject(object) - vehicle = core.objectService.createObject('object/mobile/vehicle/shared_speederbike_swoop.iff', actor.getPlanet(), actor.getPosition().x, actor.getPosition().z,actor.getPosition().y) - vehicle.setOwnerId(actor.getObjectID()) - core.simulationService.add(vehicle, vehicle.getPosition().x, vehicle.getPosition().z, True) + + vehicleId = actor.getAttachment('activeVehicleID') + + if vehicleId == None: + vehicle = core.objectService.createObject('object/mobile/vehicle/shared_speederbike_swoop.iff', actor.getPlanet(), actor.getPosition().x, actor.getPosition().z,actor.getPosition().y) + vehicle.setOwnerId(actor.getObjectID()) + core.simulationService.add(vehicle, vehicle.getPosition().x, vehicle.getPosition().z, True) + actor.setAttachment('activeVehicleID', vehicle.getObjectID()) return \ No newline at end of file diff --git a/scripts/radial/vehicle.py b/scripts/radial/vehicle.py index cd47f7b2..2cf9f19b 100644 --- a/scripts/radial/vehicle.py +++ b/scripts/radial/vehicle.py @@ -4,14 +4,18 @@ import sys def createRadial(core, owner, target, radials): radials.add(RadialOptions(0, 7, 1, '')) - radials.add(RadialOptions(1, 40, 3, '@pet/pet_menu:menu_enter_exit')) - radials.add(RadialOptions(0, 21, 1, '')) - radials.add(RadialOptions(0, 60, 3, '@pet/pet_menu:menu_store')) + + if owner.canMount(target): + radials.add(RadialOptions(0, 208, 1, '@pet/pet_menu:menu_enter_exit')) + + if target.getOwnerId() == owner.getObjectID(): + radials.add(RadialOptions(0, 60, 3, '@pet/pet_menu:menu_store')) + return def handleSelection(core, owner, target, option): if target: - if option == 21 or option == 40: + if option == 208: if not owner.isMounted(): owner.setMounted(1) target.initMount(owner) @@ -19,5 +23,7 @@ def handleSelection(core, owner, target, option): target.unmount(owner) if option == 60: + if owner.isMounted(): vehicleObject.unmount(owner) core.objectService.destroyObject(target) + owner.setAttachment('activeVehicleID', None) return \ No newline at end of file diff --git a/scripts/radial/vehicle_pcd.py b/scripts/radial/vehicle_pcd.py new file mode 100644 index 00000000..5f09ba10 --- /dev/null +++ b/scripts/radial/vehicle_pcd.py @@ -0,0 +1,27 @@ +from resources.common import RadialOptions +import sys + +def createRadial(core, owner, target, radials): + radials.add(RadialOptions(0, 62, 1, '')) + radials.add(RadialOptions(0, 7, 1, '')) + return + +def handleSelection(core, owner, target, option): + + if option == 61 and target: + core.objectService.useObject(owner, target) + + if option == 62 and target: + + vehicleId = long(owner.getAttachment('activeVehicleID')) + + if vehicleId != None: + vehicleObject = core.objectService.getObject(vehicleId) + + if owner.isMounted(): vehicleObject.unmount(owner) + + core.objectService.destroyObject(vehicleId) + owner.setAttachment('activeVehicleID', None) + + return + \ No newline at end of file diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index 0dd25c94..fc44c02e 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -1798,18 +1798,26 @@ public class CreatureObject extends TangibleObject implements IPersistent { this.mountedVehicle = mountedVehicle; } + public boolean canMount(CreatureObject vehicle) + { + if(vehicle.getOwnerId() == this.getObjectId()) return true; + return false; + } + public void mount(CreatureObject owner) { boolean remove = false; - synchronized(objectMutex) { - if ((this.getOptionsBitmask() & Options.MOUNT) == Options.MOUNT){ + synchronized(objectMutex) + { + if ((this.getOptionsBitmask() & Options.MOUNT) == Options.MOUNT) + { remove = true; _add(owner); UpdateContainmentMessage updateContainmentMessage = new UpdateContainmentMessage(owner.getObjectID(), this.getObjectID(), 4); notifyObservers(updateContainmentMessage, true); } } - if(remove) - NGECore.getInstance().simulationService.remove(owner, owner.getWorldPosition().x, owner.getWorldPosition().z, false); + + if(remove) NGECore.getInstance().simulationService.remove(owner, owner.getWorldPosition().x, owner.getWorldPosition().z, false); } public void unmount(CreatureObject owner) { @@ -1834,19 +1842,13 @@ public class CreatureObject extends TangibleObject implements IPersistent { public void initMount(CreatureObject owner) { synchronized(objectMutex) { - this.ownerId = owner.getObjectID(); setStateBitmask(0x10000000); owner.setMountedVehicle(this); - this.setOwnerId(owner.getObjectID()); - //this.add(owner); // NPE at engine.resources.objects.SWGObject.getCorrectArrangementId(kd:844) + this.mount(owner); - // setStateBitmask(28); - // owner.setStateBitmask(27); + owner.setStateBitmask(0x8000000); this.setPosture((byte)10); - - //this.sendBaselines(owner.getClient()); - } } diff --git a/src/services/SimulationService.java b/src/services/SimulationService.java index 5009c159..67406a06 100644 --- a/src/services/SimulationService.java +++ b/src/services/SimulationService.java @@ -763,6 +763,15 @@ public class SimulationService implements INetworkDispatch { core.combatService.handleEndDuel(object, opponent, true); } } + System.out.print(object.getAttachment("activeVehicleID")); + + if(object.getAttachment("activeVehicleID") != null) + { + if(object.isMounted()) object.getMountedVehicle().unmount(object); + long vehicleID = ((java.math.BigInteger) object.getAttachment("activeVehicleID")).longValue(); + core.objectService.destroyObject(vehicleID); + object.setAttachment("activeVehicleID", null); + } /* object.createTransaction(core.getCreatureODB().getEnvironment()); From 90fb528d5f54fcece31c4af57a6fc2996db2a2c3 Mon Sep 17 00:00:00 2001 From: Seefo Date: Sun, 13 Apr 2014 14:38:42 -0400 Subject: [PATCH 20/32] Fixed #423 --- scripts/commands/transferitemmisc.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/scripts/commands/transferitemmisc.py b/scripts/commands/transferitemmisc.py index dbe46f8a..69673dd5 100644 --- a/scripts/commands/transferitemmisc.py +++ b/scripts/commands/transferitemmisc.py @@ -11,11 +11,17 @@ def run(core, actor, target, commandString): container = objService.getObject(containerID) actorContainer = actor.getContainer() + if container == None: return + if actorContainer != None and (container.getTemplate() == "object/cell/shared_cell.iff") & core.housingService.getPermissions(actor, actorContainer): target.getContainer().transferTo(actor, container, target) core.simulationService.teleport(target, actor.getPosition(), Quaternion(1,0,0,0), containerID) - #core.housingService.addItemToHouseItemList(target,actorContainer) return + + elif target.getContainer().getTemplate() == "object/cell/shared_cell.iff" and core.housingService.getPermissions(actor, target.getContainer()): + target.getContainer().transferTo(actor, container, target) + return + elif actorContainer != None and container.getTemplate() == "object/cell/shared_cell.iff": actor.sendSystemMessage("You do not have permission to access that container!", 0) return From 53c1ea65e94f11db0b0d026ae14871bca7757e2b Mon Sep 17 00:00:00 2001 From: CharonInferar Date: Sun, 13 Apr 2014 20:39:36 +0200 Subject: [PATCH 21/32] merge conflict fix 2 --- .../vehicle/speederbike_swoop_pcd.py | 19 -------- .../vehicle_deed/speederbike_swoop_deed.py | 12 ----- scripts/radial/vehicle.py | 14 ------ .../objects/creature/CreatureObject.java | 45 ------------------- 4 files changed, 90 deletions(-) diff --git a/scripts/object/intangible/vehicle/speederbike_swoop_pcd.py b/scripts/object/intangible/vehicle/speederbike_swoop_pcd.py index b3b28d66..ace4cdfc 100644 --- a/scripts/object/intangible/vehicle/speederbike_swoop_pcd.py +++ b/scripts/object/intangible/vehicle/speederbike_swoop_pcd.py @@ -1,34 +1,15 @@ import sys def setup(core, object): -<<<<<<< HEAD - #object.setAttachment('vehicleId', core.objectService.generateObjectID()) - object.setAttachment('radial_filename', 'item') - return - -def use(core, actor, object): - if object: - vehicleId = object.getObjectID() - #vehicleId = object.getAttachment('vehicleId') -======= object.setAttachment('radial_filename', 'vehicle_pcd') return def use(core, actor, object): if object and actor.getAttachment('activeVehicleID') == None: swoop = core.objectService.createObject('object/mobile/vehicle/shared_speederbike_swoop.iff', 0, actor.getPlanet(), actor.getPosition(), actor.getOrientation()) ->>>>>>> upstream/master swoop.setOwnerId(actor.getObjectID()) actor.setAttachment('activeVehicleID', swoop.getObjectID()) -<<<<<<< HEAD - vehicle = core.objectService.getObject(vehicleId) - - swoop = core.objectService.createObject('object/mobile/vehicles/shared_speederbike_swoop.iff', vehicleId, actor.getPlanet(), actor.getPosition(), actor.getOrientation()) core.simulationService.add(swoop, swoop.getPosition().x, swoop.getPosition().z, True) - -======= - core.simulationService.add(swoop, swoop.getPosition().x, swoop.getPosition().z, True) ->>>>>>> upstream/master return \ No newline at end of file diff --git a/scripts/object/tangible/deed/vehicle_deed/speederbike_swoop_deed.py b/scripts/object/tangible/deed/vehicle_deed/speederbike_swoop_deed.py index 70ce99d9..4b0e320f 100644 --- a/scripts/object/tangible/deed/vehicle_deed/speederbike_swoop_deed.py +++ b/scripts/object/tangible/deed/vehicle_deed/speederbike_swoop_deed.py @@ -6,23 +6,12 @@ def setup(core, object): def use(core, actor, object): datapad = actor.getSlottedObject('datapad') -<<<<<<< HEAD - - pcd = core.objectService.createObject('object/intangible/vehicle/shared_speederbike_swoop_pcd.iff', actor.getPlanet(), actor.getPosition().x, actor.getPosition().z,actor.getPosition().y) - #actor.sendSystemMessage('actor.getObjectID() %s' % actor.getObjectID(), 0) -======= pcd = core.objectService.createObject('object/intangible/vehicle/shared_speederbike_swoop_pcd.iff', actor.getPlanet(), actor.getPosition().x, actor.getPosition().z,actor.getPosition().y) ->>>>>>> upstream/master if datapad and pcd: datapad.add(pcd) core.objectService.destroyObject(object) -<<<<<<< HEAD - vehicle = core.objectService.createObject('object/mobile/vehicle/shared_speederbike_swoop.iff', actor.getPlanet(), actor.getPosition().x, actor.getPosition().z,actor.getPosition().y) - vehicle.setOwnerId(actor.getObjectID()) - core.simulationService.add(vehicle, vehicle.getPosition().x, vehicle.getPosition().z, True) -======= vehicleId = actor.getAttachment('activeVehicleID') @@ -31,6 +20,5 @@ def use(core, actor, object): vehicle.setOwnerId(actor.getObjectID()) core.simulationService.add(vehicle, vehicle.getPosition().x, vehicle.getPosition().z, True) actor.setAttachment('activeVehicleID', vehicle.getObjectID()) ->>>>>>> upstream/master return \ No newline at end of file diff --git a/scripts/radial/vehicle.py b/scripts/radial/vehicle.py index e03a2f0b..2cf9f19b 100644 --- a/scripts/radial/vehicle.py +++ b/scripts/radial/vehicle.py @@ -15,19 +15,6 @@ def createRadial(core, owner, target, radials): def handleSelection(core, owner, target, option): if target: -<<<<<<< HEAD - if option == 21 or option == 40: - #owner.setPosture(16) - owner.setMounted(1) - #owner.setParent(target) - target.initMount(owner) - #target.add(owner) - #target.setOwner(owner) - #Vehicles.testbike(owner,target) - - #target.unmount(owner) - #core.objectService.useObject(owner, target) -======= if option == 208: if not owner.isMounted(): owner.setMounted(1) @@ -35,7 +22,6 @@ def handleSelection(core, owner, target, option): else: target.unmount(owner) ->>>>>>> upstream/master if option == 60: if owner.isMounted(): vehicleObject.unmount(owner) core.objectService.destroyObject(target) diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index c2963b96..fc44c02e 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -68,11 +68,7 @@ import resources.objects.player.PlayerObject; import resources.objects.tangible.TangibleObject; import services.command.BaseSWGCommand; -<<<<<<< HEAD -@Entity(version=7) -======= @Entity(version=8) ->>>>>>> upstream/master public class CreatureObject extends TangibleObject implements IPersistent { @NotPersistent @@ -192,10 +188,7 @@ public class CreatureObject extends TangibleObject implements IPersistent { private ConcurrentHashMap cooldowns = new ConcurrentHashMap(); public boolean mounted = false; -<<<<<<< HEAD -======= @NotPersistent ->>>>>>> upstream/master public CreatureObject mountedVehicle; public CreatureObject(long objectID, Planet planet, Point3D position, Quaternion orientation, String Template) { @@ -1805,25 +1798,6 @@ public class CreatureObject extends TangibleObject implements IPersistent { this.mountedVehicle = mountedVehicle; } -<<<<<<< HEAD - public void mount(CreatureObject owner) { - synchronized(objectMutex) { - if ((this.getOptionsBitmask() & Options.MOUNT) == Options.MOUNT){ - UpdateContainmentMessage updateContainmentMessage= new UpdateContainmentMessage(owner.getObjectID(), this.getObjectID(), -1); - owner.getClient().getSession().write(updateContainmentMessage.serialize()); - owner.setParent(this); - } - } - } - - public void unmount(CreatureObject owner) { - synchronized(objectMutex) { - if ((this.getOptionsBitmask() & Options.MOUNT) == Options.MOUNT){ - UpdateContainmentMessage updateContainmentMessage= new UpdateContainmentMessage(owner.getObjectID(), this.getObjectID(), -1); - owner.getClient().getSession().write(updateContainmentMessage.serialize()); - } - } -======= public boolean canMount(CreatureObject vehicle) { if(vehicle.getOwnerId() == this.getObjectId()) return true; @@ -1864,28 +1838,10 @@ public class CreatureObject extends TangibleObject implements IPersistent { NGECore.getInstance().simulationService.add(owner, getWorldPosition().x, getWorldPosition().z, false); NGECore.getInstance().simulationService.teleport(owner, getWorldPosition(), getOrientation(), 0); } ->>>>>>> upstream/master } public void initMount(CreatureObject owner) { synchronized(objectMutex) { -<<<<<<< HEAD - this.ownerId = owner.getObjectID(); - setStateBitmask(0x10000000); - owner.setParent(this); - owner.getClient().getSession().write(messageBuilder.buildOwnerIdDelta(ownerId)); - owner.setMountedVehicle(this); - this.setOwnerId(owner.getObjectID()); - //this.add(owner); // NPE at engine.resources.objects.SWGObject.getCorrectArrangementId(kd:844) - this.mount(owner); - // setStateBitmask(28); - // owner.setStateBitmask(27); - owner.setStateBitmask(0x8000000); - this.setPosture((byte)10); - - //this.sendBaselines(owner.getClient()); - -======= setStateBitmask(0x10000000); owner.setMountedVehicle(this); @@ -1893,7 +1849,6 @@ public class CreatureObject extends TangibleObject implements IPersistent { owner.setStateBitmask(0x8000000); this.setPosture((byte)10); ->>>>>>> upstream/master } } From 1decfaa0819847c9b25a5c13ccf3fb6476e37a40 Mon Sep 17 00:00:00 2001 From: CharonInferar Date: Sun, 13 Apr 2014 22:29:02 +0200 Subject: [PATCH 22/32] first commit of addidtions --- .../objects/tangible/TangibleObject.java | 24 ++- src/services/DevService.java | 8 +- src/services/command/CommandService.java | 176 ++++++++++++++++++ src/services/object/ObjectService.java | 33 ++-- 4 files changed, 220 insertions(+), 21 deletions(-) diff --git a/src/resources/objects/tangible/TangibleObject.java b/src/resources/objects/tangible/TangibleObject.java index ef276709..8569fc4f 100644 --- a/src/resources/objects/tangible/TangibleObject.java +++ b/src/resources/objects/tangible/TangibleObject.java @@ -53,7 +53,7 @@ import engine.resources.scene.Planet; import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; -@Persistent(version=6) +@Persistent(version=7) public class TangibleObject extends SWGObject { // TODO: Thread safety @@ -83,6 +83,8 @@ public class TangibleObject extends SWGObject { private boolean looted = false; private boolean lootLock = false; + private String serialNumber; + @NotPersistent private TangibleObject killer = null; @@ -484,13 +486,29 @@ public class TangibleObject extends SWGObject { } public String getSerialNumber() { - return getStringAttribute("serial_number"); + return serialNumber; } public void setSerialNumber(String serialNumber) { - setStringAttribute("serial_number", serialNumber); + this.serialNumber = serialNumber; } + public void sendDelta3(Client destination) { + destination.getSession().write(messageBuilder.buildDelta3()); + //tools.CharonPacketUtils.printAnalysis(messageBuilder.buildDelta3(),"TANO3 Delta"); + } + + public void sendAssemblyDelta3(Client destination) { + destination.getSession().write(messageBuilder.buildAssemblyDelta3()); + //tools.CharonPacketUtils.printAnalysis(messageBuilder.buildAssemblyDelta3(),"TANO3 Assembly Delta"); + } + + public void sendCustomizationDelta3(Client destination, String enteredName){ + destination.getSession().write(messageBuilder.buildCustomNameDelta(enteredName)); + //tools.CharonPacketUtils.printAnalysis(messageBuilder.buildCustomNameDelta(enteredName),"TANO3 Customization Delta"); + } + + @Override public void sendBaselines(Client destination) { diff --git a/src/services/DevService.java b/src/services/DevService.java index 58c9fea4..e99172e0 100644 --- a/src/services/DevService.java +++ b/src/services/DevService.java @@ -89,8 +89,9 @@ public class DevService implements INetworkDispatch { suiOptions.put((long) 26, "Installations"); suiOptions.put((long) 110, "Survey Devices"); if(creature.getClient().isGM()) suiOptions.put((long) 120, "House Deeds"); + if(creature.getClient().isGM()) suiOptions.put((long) 125, "Crafting Tools"); if(creature.getClient().isGM()) suiOptions.put((long) 130, "Vehicle Deeds"); - //suiOptions.put((long) 120, "House Deeds"); + break; case 3: // [Items] Weapons suiOptions.put((long) 30, "Jedi Weapons"); @@ -1203,7 +1204,10 @@ public class DevService implements INetworkDispatch { deed.setBMR(15); deed.setAttributes(); inventory.add(deed); - + case 125: + TangibleObject genericCraftingTool = (TangibleObject) core.objectService.createObject("object/tangible/crafting/station/shared_generic_tool.iff", planet); + genericCraftingTool.setCustomName("Generic Crafting Tool"); + inventory.add(genericCraftingTool); return; case 130: TangibleObject swoopDeed = (TangibleObject) core.objectService.createObject("object/tangible/deed/vehicle_deed/shared_speederbike_swoop_deed.iff", planet); diff --git a/src/services/command/CommandService.java b/src/services/command/CommandService.java index 809570bb..e8f6afe8 100644 --- a/src/services/command/CommandService.java +++ b/src/services/command/CommandService.java @@ -21,6 +21,7 @@ ******************************************************************************/ package services.command; +import java.io.UnsupportedEncodingException; import java.nio.ByteOrder; import java.util.Map; import java.util.Vector; @@ -584,6 +585,181 @@ public class CommandService implements INetworkDispatch { }); + objControllerOpcodes.put(ObjControllerOpcodes.CRAFT_FILLSLOT, new INetworkRemoteEvent() { + + @Override + public void handlePacket(IoSession session, IoBuffer data) throws Exception { + + data.order(ByteOrder.LITTLE_ENDIAN); + Client client = core.getClient(session); + + if(client == null) { + System.out.println("NULL Client"); + return; + } + + CommandEnqueue commandEnqueue = new CommandEnqueue(); + CreatureObject actor = (CreatureObject) client.getParent(); + SWGObject target = core.objectService.getObject(commandEnqueue.getTargetID()); + +// StringBuilder sb = new StringBuilder(); +// for (byte b : data.array()) { +// sb.append(String.format("%02X ", b)); +// } +// System.out.println(sb.toString()); + +// 05 00 46 5E CE 80 83 00 00 00 07 01 00 00 72 14 +// 09 00 00 00 00 00 00 00 00 00 04 2A 09 00 00 00 +// 00 00 01 00 00 00 00 00 00 00 04 00 00 00 00 00 +// 00 00 00 00 00 00 00 00 00 00 00 00 + + long playerId = data.getLong(); + data.getInt(); // 00 00 00 00 + long ingredientId = data.getLong(); + int slotNumber = data.getInt(); + int option = data.getInt(); + byte sequence = data.get(); + core.craftingService.handleCraftFillSlot(playerId, ingredientId, slotNumber, option, sequence); + } + + }); + + /* + NGE break by cAble + + 05 00 #Operand + 46 5E CE 80 #ObjCon + 83 00 00 00 + 07 01 00 00 #CraftFillSlot + 00 2E E9 E9 31 00 00 00 + 00 00 00 00 #unknown + 16 A5 C8 50 32 00 00 00 #ObjectID for Ingredient + 01 00 00 00 #Slot01 + 00 00 00 00 #Option + 85 #sequence + + + + 05 00 #Operand + 46 5E CE 80 #ObjCon + 83 00 00 00 + 07 01 00 00 #CraftFillSlot + 00 2E E9 E9 31 00 00 00 #CharacterID + 00 00 00 00 #Unknown + 9D 3F EB F9 3A 00 00 00 #ObjectID for Ingredient + 02 00 00 00 #Slot02 + 00 00 00 00 #Option + 86 #Sequence + */ + + + objControllerOpcodes.put(ObjControllerOpcodes.CRAFT_EMPTYSLOT, new INetworkRemoteEvent() { + + @Override + public void handlePacket(IoSession session, IoBuffer data) throws Exception { + + data.order(ByteOrder.LITTLE_ENDIAN); + Client client = core.getClient(session); + + if(client == null) { + System.out.println("NULL Client"); + return; + } + + CommandEnqueue commandEnqueue = new CommandEnqueue(); + CreatureObject actor = (CreatureObject) client.getParent(); + SWGObject target = core.objectService.getObject(commandEnqueue.getTargetID()); + +// System.out.println("CRAFTEMPTY"); +// StringBuilder sb = new StringBuilder(); +// for (byte b : data.array()) { +// sb.append(String.format("%02X ", b)); +// } +// System.out.println(sb.toString()); + + +// 05 00 46 5E CE 80 83 00 00 00 08 01 00 00 B4 A1 +// 0B 00 00 00 00 00 00 00 00 00 01 00 00 00 B7 A1 +// 0B 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 +// 00 00 00 00 00 00 00 00 00 00 00 00 + + long playerId = data.getLong(); + data.getInt(); // 00 00 00 00 + int slotNumber = data.getInt(); + long ingredientId = data.getLong(); + byte sequence = data.get(); + core.craftingService.handleCraftEmptySlot(playerId, ingredientId, slotNumber, sequence); + } + + }); + + + objControllerOpcodes.put(ObjControllerOpcodes.CRAFT_CUSTOMIZATION, new INetworkRemoteEvent() { + @Override + public void handlePacket(IoSession session, IoBuffer data) throws Exception { + data.order(ByteOrder.LITTLE_ENDIAN); + Client client = core.getClient(session); + if(client == null) { + System.out.println("NULL Client"); + return; + } + +// StringBuilder sb = new StringBuilder(); +// for (byte b : data.array()) { +// sb.append(String.format("%02X ", b)); +// } +// System.out.println(sb.toString()); + + long playerId = data.getLong(); + data.getInt(); // 00 00 00 00 UTF-16LE + + String enteredName = ""; + int length = 2*data.order(ByteOrder.LITTLE_ENDIAN).getInt(); + int bufferPosition = data.position(); + try + { + enteredName = new String(data.array(), bufferPosition, length, "UTF-16LE"); + } + catch (UnsupportedEncodingException e) + { + System.err.println("UnsupportedEncodingException while reading crafting customization name "); + } + + System.err.println("enteredName " + enteredName); + data.position(bufferPosition + length); + + byte modelNumber = data.get(); + int schematicQuantity = data.getInt(); + byte customizationList = data.get(); + for (int i=0;i<(int)customizationList;i++){ + int customizationSlot = data.getInt(); + int customizationValue = data.getInt(); + } + + core.craftingService.handleCraftCustomization(playerId,enteredName,modelNumber,schematicQuantity,customizationList); + } + + }); + +// 05 00 46 5E CE 80 83 00 00 00 5A 01 00 00 75 59 +// 0F 00 00 00 00 00 00 00 00 00 1D 00 00 00 63 00 +// 72 00 61 00 66 00 74 00 69 00 6E 00 67 00 3A 00 +// 5B 00 65 00 78 00 6F 00 5F 00 70 00 72 00 6F 00 +// 74 00 65 00 69 00 6E 00 5F 00 77 00 61 00 66 00 +// 65 00 72 00 73 00 5D 00 FF E8 03 00 00 00 00 00 +// 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +// 00 00 00 00 00 00 00 00 00 00 00 00 + +// USTRING: CustomName +// BYTE: ModelNumber +// INT: SchematicQuantity +// BYTE: CustomizationList +// { +// INT: CustomizationSlot +// INT: CustomizationValue +// } + + } public void shutdown() { diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index e1fa31b6..841579c1 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -98,14 +98,17 @@ import main.NGECore; import resources.objects.Delta; import resources.objects.building.BuildingObject; import resources.objects.cell.CellObject; +import resources.objects.craft.DraftSchematic; import resources.objects.creature.CreatureObject; import resources.objects.deed.Harvester_Deed; import resources.objects.deed.Player_House_Deed; +import resources.objects.factorycrate.FactoryCrateObject; import resources.objects.group.GroupObject; import resources.objects.guild.GuildObject; import resources.objects.harvester.HarvesterObject; import resources.objects.installation.InstallationObject; import resources.objects.intangible.IntangibleObject; +import resources.objects.manufacture.ManufactureSchematicObject; import resources.objects.mission.MissionObject; import resources.objects.player.PlayerObject; import resources.objects.resource.GalacticResource; @@ -385,6 +388,18 @@ public class ObjectService implements INetworkDispatch { object = new ResourceContainerObject(objectID, planet, Template, position, orientation); + } else if(Template.startsWith("object/factory/shared_factory_crate")) { + + object = new FactoryCrateObject(objectID, planet, Template, position, orientation); + + } else if(Template.startsWith("object/draft_schematic")) { + + object = new DraftSchematic(objectID, planet, Template, position, orientation); + + } else if(Template.startsWith("object/manufacture_schematic")) { + + object = new ManufactureSchematicObject(objectID, planet, Template, position, orientation); + } else if(Template.startsWith("object/installation/mining_ore/construction")) { float positionY = core.terrainService.getHeight(planet.getID(), position.x, position.z)-1f; @@ -655,24 +670,10 @@ public class ObjectService implements INetworkDispatch { } public CreatureObject getCreatureFromDB(long objectId) { - CreatureObject object = core.getCreatureODB().get(new Long(objectId), Long.class, CreatureObject.class); - - if (object != null && getObject(object.getObjectID()) == null) { - loadServerTemplate(object); - - object.viewChildren(object, true, true, new Traverser() { - - public void process(SWGObject child) { - loadServerTemplate(child); - } - - }); - } - - return object; + return core.getCreatureODB().get(new Long(objectId), Long.class, CreatureObject.class); } - public long generateObjectID() { + private long generateObjectID() { /*Random random = new Random(); long objectID = random.nextInt(); From afcec36cc110b006f75363a284cd615a45cd0755 Mon Sep 17 00:00:00 2001 From: CharonInferar Date: Sun, 13 Apr 2014 22:46:02 +0200 Subject: [PATCH 23/32] second commit --- src/protocol/swg/ObjControllerMessage.java | 8 + .../objects/craft/DraftSchematic.java | 46 ++++ .../FactoryCrateMessageBuilder.java | 152 ++++++++++- .../factorycrate/FactoryCrateObject.java | 241 +++++++++++++++++- .../ManufactureSchematicObject.java | 20 +- 5 files changed, 463 insertions(+), 4 deletions(-) create mode 100644 src/resources/objects/craft/DraftSchematic.java diff --git a/src/protocol/swg/ObjControllerMessage.java b/src/protocol/swg/ObjControllerMessage.java index 1c94c6b7..a9f541b8 100644 --- a/src/protocol/swg/ObjControllerMessage.java +++ b/src/protocol/swg/ObjControllerMessage.java @@ -66,6 +66,14 @@ public class ObjControllerMessage extends SWGMessage { public static final int STOP_CONVERSATION = 0x00DE; public static final int CONVERSATION_MESSAGE = 0x00DF; public static final int CONVERSATION_OPTIONS = 0x00E0; + public static final int DRAFT_SCHEMATICS = 0x0102; + public static final int DRAFT_SLOTS = 0x0103; + public static final int CRAFT_EXPERIMENT = 0x0106; + public static final int CRAFT_ACKNOWLEDGE = 0x010C; + public static final int CRAFT_CUSTOMIZATION = 0x015A; + public static final int NEXT_CRAFTING_STAGE_RESULT = 0x01BE; + public static final int DRAFT_SLOTS_QUERY_RESPONSE = 0x01BF; + public static final int RESOURCE_WEIGHTS = 0x0207; public ObjControllerMessage() { diff --git a/src/resources/objects/craft/DraftSchematic.java b/src/resources/objects/craft/DraftSchematic.java new file mode 100644 index 00000000..3e47ae31 --- /dev/null +++ b/src/resources/objects/craft/DraftSchematic.java @@ -0,0 +1,46 @@ +/******************************************************************************* + * Copyright (c) 2013 + * + * This File is part of NGECore2. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + * + * Using NGEngine to work with NGECore2 is making a combined work based on NGEngine. + * Therefore all terms and conditions of the GNU Lesser General Public License cover the combination. + ******************************************************************************/ +package resources.objects.craft; + +import com.sleepycat.persist.model.Persistent; +import engine.clients.Client; +import engine.resources.objects.SWGObject; +import engine.resources.scene.Planet; +import engine.resources.scene.Point3D; +import engine.resources.scene.Quaternion; + +@Persistent +public class DraftSchematic extends SWGObject { + + + public DraftSchematic(long objectID, Planet planet, String template, Point3D position, Quaternion orientation){ + super(objectID, planet, position, orientation, template); + } + + @Override + public void sendBaselines(Client arg0) { + // TODO Auto-generated method stub + + } + + +} diff --git a/src/resources/objects/factorycrate/FactoryCrateMessageBuilder.java b/src/resources/objects/factorycrate/FactoryCrateMessageBuilder.java index dbb1e565..59c39cbe 100644 --- a/src/resources/objects/factorycrate/FactoryCrateMessageBuilder.java +++ b/src/resources/objects/factorycrate/FactoryCrateMessageBuilder.java @@ -21,6 +21,156 @@ ******************************************************************************/ package resources.objects.factorycrate; -public class FactoryCrateMessageBuilder { +import java.nio.ByteOrder; +import org.apache.mina.core.buffer.IoBuffer; + +import resources.objects.ObjectMessageBuilder; +import resources.objects.resource.GalacticResource; +import resources.objects.resource.ResourceContainerObject; + +/** + * @author Charon + */ + +public class FactoryCrateMessageBuilder extends ObjectMessageBuilder{ + + public FactoryCrateMessageBuilder(FactoryCrateObject factoryCrateObject) { + setObject(factoryCrateObject); + } + + + public IoBuffer buildBaseline3() { + FactoryCrateObject factoryCrateObject = (FactoryCrateObject) object; + IoBuffer buffer = IoBuffer.allocate(10).order(ByteOrder.LITTLE_ENDIAN); + buffer.setAutoExpand(true); + + buffer.putShort((short)0x0D); + buffer.putFloat(1.0f); //op0 + buffer.put(getAsciiString("factory_n")); + buffer.putInt(0); + buffer.put(getAsciiString("food_crate")); + + if (factoryCrateObject.getCustomName().length()>0) + buffer.put(getUnicodeString(factoryCrateObject.getCustomName())); + else + buffer.putInt(0); + + buffer.putInt(1); + buffer.putShort((short)0); + + buffer.putInt(0); + buffer.putInt(0); + buffer.putInt(0); + buffer.putInt(0); + + buffer.putInt(0x2100); // optionsbitmask + buffer.putInt((int)factoryCrateObject.getQuantity()); // Quantity // op9 + buffer.putInt(0); + buffer.putInt(0x64); // condition maybe + + buffer.put((byte)1); + + int size = buffer.position(); + buffer = bufferPool.allocate(size, false).put(buffer.array(), 0, size); + + buffer.flip(); + buffer = createBaseline("TYCF", (byte) 3, buffer, size); + + return buffer; + +// 01 00 00 00 +// 00 00 +// 00 00 00 00 +// 00 00 00 00 +// 00 00 00 00 +// 00 00 00 00 +// 00 21 00 00 +// 2A 00 00 00 +// 00 00 00 00 +// 64 00 00 00 +// 01 + + } + + public IoBuffer buildBaseline6() { + FactoryCrateObject factoryCrateObject = (FactoryCrateObject) object; + IoBuffer buffer = IoBuffer.allocate(10).order(ByteOrder.LITTLE_ENDIAN); + buffer.setAutoExpand(true); + + buffer.putShort((short)6); + buffer.putInt(3); + + buffer.putInt(0); + buffer.putInt(0); + + buffer.putInt(0); + buffer.putInt(0); + buffer.putInt(0); + buffer.putInt(0); + buffer.putInt(0); + buffer.putInt(0); + buffer.putInt(0); + buffer.putInt(0); + buffer.putInt(0); + + buffer.put((byte)0); + + int size = buffer.position(); + buffer = bufferPool.allocate(size, false).put(buffer.array(), 0, size); + + buffer.flip(); + buffer = createBaseline("TYCF", (byte) 6, buffer, size); + + return buffer; + } + + + public IoBuffer buildBaseline8() { + IoBuffer buffer = IoBuffer.allocate(10).order(ByteOrder.LITTLE_ENDIAN); + buffer.setAutoExpand(true); + buffer.putShort((short)0); + int size = buffer.position(); + buffer = bufferPool.allocate(size, false).put(buffer.array(), 0, size); + buffer.flip(); + buffer = createBaseline("RCNO", (byte) 8, buffer, size); + return buffer; + } + + public IoBuffer buildBaseline9() { + IoBuffer buffer = IoBuffer.allocate(10).order(ByteOrder.LITTLE_ENDIAN); + buffer.setAutoExpand(true); + buffer.putShort((short)0); + int size = buffer.position(); + buffer = bufferPool.allocate(size, false).put(buffer.array(), 0, size); + buffer.flip(); + buffer = createBaseline("TYCF", (byte) 9, buffer, size); + return buffer; + } + + public IoBuffer buildDelta3() { + FactoryCrateObject factoryCrateObject = (FactoryCrateObject) object; + IoBuffer buffer = IoBuffer.allocate(10).order(ByteOrder.LITTLE_ENDIAN); + buffer.setAutoExpand(true); + + buffer.putInt(factoryCrateObject.getQuantity()); + int size = buffer.position(); + buffer.flip(); + buffer = createDelta("TYCF", (byte) 3, (short) 1, (short) 9, buffer, size + 4); + + return buffer; + } + + @Override + public void sendListDelta(byte viewType, short updateType, IoBuffer buffer) { + // TODO Auto-generated method stub + + } + + + @Override + public void sendBaselines() { + // TODO Auto-generated method stub + + } } diff --git a/src/resources/objects/factorycrate/FactoryCrateObject.java b/src/resources/objects/factorycrate/FactoryCrateObject.java index 8e7d3c75..d7b7b7d6 100644 --- a/src/resources/objects/factorycrate/FactoryCrateObject.java +++ b/src/resources/objects/factorycrate/FactoryCrateObject.java @@ -21,11 +21,250 @@ ******************************************************************************/ package resources.objects.factorycrate; +import java.util.Map; +import java.util.Vector; + +import main.NGECore; + +import protocol.swg.SceneCreateObjectByCrc; +import protocol.swg.SceneDestroyObject; +import protocol.swg.SceneEndBaselines; +import protocol.swg.UpdateContainmentMessage; +import protocol.swg.UpdatePVPStatusMessage; + +import com.sleepycat.persist.model.NotPersistent; import com.sleepycat.persist.model.Persistent; +import engine.clients.Client; +import engine.resources.common.CRC; +import engine.resources.objects.SWGObject; +import engine.resources.scene.Planet; +import engine.resources.scene.Point3D; +import engine.resources.scene.Quaternion; + +import resources.objects.creature.CreatureObject; import resources.objects.tangible.TangibleObject; +/** + * @author Charon + */ + @Persistent(version=0) public class FactoryCrateObject extends TangibleObject { + + private Vector contents; + private byte capacity; + private byte contentObjectQuantity; + private int contentCRC; + private TangibleObject contentObjectType; + + @NotPersistent + private FactoryCrateMessageBuilder messageBuilder; + + public FactoryCrateObject() { + + } + + public FactoryCrateObject(long objectID, Planet planet, String template, Point3D position, Quaternion orientation) { + super(objectID, planet, template, position, orientation); + this.messageBuilder = new FactoryCrateMessageBuilder(this); + this.contents = new Vector(); + this.contentObjectQuantity = 0; + this.capacity = 25; + this.getAttributes().put("@obj_attr_n:condition", "100/100"); + this.getAttributes().put("@obj_attr_n:volume", "1"); + this.getAttributes().put("@obj_attr_n:quantity", "1"); + this.getAttributes().put("@obj_attr_n:factory_count", "1"); + this.getAttributes().put("@obj_attr_n:factory_attribs", "------------"); + this.getAttributes().put("@obj_attr_n:type", "@got_n:component"); + this.getAttributes().put("@obj_attr_n:serial_number", "123"); + + + } + + public boolean setContentType(TangibleObject contentObject) { + synchronized(objectMutex) { + this.contentObjectType = contentObject; + if (contentObject.getTemplate().length()>0) + this.contentCRC = CRC.StringtoCRC(contentObject.getTemplate()); + else + this.contentCRC = 0; + + Map contentAttributes = contentObject.getAttributes(); + for (Map.Entry entry : contentAttributes.entrySet()) + { + //if (!entry.getKey().equals(@obj_attr_n:condition)) + this.getAttributes().put(entry.getKey(), entry.getValue()); + } + + return true; + } + } + + public TangibleObject getContentType() { + return this.contentObjectType; + } + + public boolean setContentTypeAndQuantity(TangibleObject contentObject, int quantity) { + synchronized(objectMutex) { + this.contentObjectType = contentObject; + if (contentObject.getTemplate().length()>0) + this.contentCRC = CRC.StringtoCRC(contentObject.getTemplate()); + else{ + this.contentCRC = 0; + return false; // Does it make sense to continue anyway? + } + + Map contentAttributes = contentObject.getAttributes(); + for (Map.Entry entry : contentAttributes.entrySet()) + { + //if (!entry.getKey().equals(@obj_attr_n:condition)) + this.getAttributes().put(entry.getKey(), entry.getValue()); + System.out.println(entry.getKey() + " " + entry.getValue()); + } + if (quantity0){ + TangibleObject contentType = this.getContentType(); + if (contentType==null) + return; // Bad, crate had no content type set + TangibleObject contentItem = (TangibleObject) core.objectService.createObject(contentType.getTemplate(), player.getPlanet()); + contentItem.setOptions(resources.datatables.Options.SERIAL, true); + int crc = this.getContentCRC();//CRC.StringtoCRC("object/tangible/food/crafted/shared_drink_alcohol.iff"); + SceneCreateObjectByCrc createObjectMsg = new SceneCreateObjectByCrc(contentItem.getObjectID(), player.getOrientation().x, player.getOrientation().y, player.getOrientation().z, player.getOrientation().w, player.getPosition().x, player.getPosition().y, player.getPosition().z, crc, (byte) 0); + player.getClient().getSession().write(createObjectMsg.serialize()); + contentItem.sendBaselines(player.getClient()); // TANO 3,6,8,9 Baselines + SceneEndBaselines sceneEndBaselinesMsg = new SceneEndBaselines(contentItem.getObjectID()); + player.getClient().getSession().write(sceneEndBaselinesMsg.serialize()); + + long parentId = this.getParentId(); + SWGObject parentContainer = core.objectService.getObject(parentId); + if (parentContainer==null) + return; // crate has no parent, error + UpdateContainmentMessage updateContainmentMessage= new UpdateContainmentMessage(contentItem.getObjectID(), parentContainer.getObjectID(), -1); + player.getClient().getSession().write(updateContainmentMessage.serialize()); + + this.sendSetQuantity(player.getClient(),this.getQuantity()-1); + if (this.getQuantity()==0){ // Crate is empty now, delete it + parentContainer._remove(this); + SceneDestroyObject destroyObjectMsg = new SceneDestroyObject(this.getObjectID()); + player.getClient().getSession().write(destroyObjectMsg.serialize()); + core.objectService.destroyObject(this); + } + } else { // should give players the chance to clean faulty, empty crates from their containers + long parentId = this.getParentId(); + SWGObject parentContainer = core.objectService.getObject(parentId); + if (parentContainer==null) + return; // crate has no parent, error + parentContainer._remove(this); + SceneDestroyObject destroyObjectMsg = new SceneDestroyObject(this.getObjectID()); + player.getClient().getSession().write(destroyObjectMsg.serialize()); + core.objectService.destroyObject(this); + } + } + } + + public byte getQuantity() { + return contentObjectQuantity; + } + + public String getSerialNumber() { + if (!contents.isEmpty()) { + return contents.firstElement().getSerialNumber(); + } + return ""; + } + + public int getContentCRC() { + return contentCRC; + } -} + public void setContentCRC(int contentCRC) { + synchronized(objectMutex) { + this.contentCRC = contentCRC; + } + } + + public void handleSplit(){ + + } + + public void sendAddItem(Client destination) { + destination.getSession().write(messageBuilder.buildDelta3()); + this.getAttributes().put("@obj_attr_n:factory_count", ""+this.getQuantity()); + this.getAttributes().put("@obj_attr_n:quantity", ""+this.getQuantity()); + //services.CharonPacketUtils.printAnalysis(messageBuilder.buildDelta3(),"FCYT3 Delta"); + } + + public void sendSetQuantity(Client destination,int quantity) { + contentObjectQuantity = (byte) quantity; + destination.getSession().write(messageBuilder.buildDelta3()); + this.getAttributes().put("@obj_attr_n:factory_count", ""+quantity); + this.getAttributes().put("@obj_attr_n:quantity", ""+this.getQuantity()); + //services.CharonPacketUtils.printAnalysis(messageBuilder.buildDelta3(),"FCYT3 Delta"); + } + + + @Override + public void sendBaselines(Client destination) { + + + if(destination == null || destination.getSession() == null) { + System.out.println("NULL destination"); + return; + } + + destination.getSession().write(messageBuilder.buildBaseline3()); + destination.getSession().write(messageBuilder.buildBaseline6()); + destination.getSession().write(messageBuilder.buildBaseline8()); + destination.getSession().write(messageBuilder.buildBaseline9()); + +// services.CharonPacketUtils.printAnalysis(messageBuilder.buildBaseline3(),"FCYT3 Baseline"); +// services.CharonPacketUtils.printAnalysis(messageBuilder.buildBaseline6(),"FCYT6 Baseline"); +// services.CharonPacketUtils.printAnalysis(messageBuilder.buildBaseline8(),"FCYT8 Baseline"); +// services.CharonPacketUtils.printAnalysis(messageBuilder.buildBaseline9(),"FCYT9 Baseline"); + } + + public void sendDelta3(Client destination) { + destination.getSession().write(messageBuilder.buildDelta3()); + this.getAttributes().put("@obj_attr_n:factory_count", ""+this.getQuantity()); + //services.CharonPacketUtils.printAnalysis(messageBuilder.buildDelta3(),"FCYT3 Delta"); + } +} \ No newline at end of file diff --git a/src/resources/objects/manufacture/ManufactureSchematicObject.java b/src/resources/objects/manufacture/ManufactureSchematicObject.java index 35e558de..4ed340ef 100644 --- a/src/resources/objects/manufacture/ManufactureSchematicObject.java +++ b/src/resources/objects/manufacture/ManufactureSchematicObject.java @@ -21,11 +21,27 @@ ******************************************************************************/ package resources.objects.manufacture; -import com.sleepycat.persist.model.Persistent; import resources.objects.intangible.IntangibleObject; +import com.sleepycat.persist.model.Persistent; +import engine.resources.scene.Planet; +import engine.resources.scene.Point3D; +import engine.resources.scene.Quaternion; + + +/** + * @author Charon + */ @Persistent(version=0) -public class ManufactureSchematicObject extends IntangibleObject { +public class ManufactureSchematicObject extends IntangibleObject{ + + //@NotPersistent + //private ManufactureSchematicMessageBuilder messageBuilder; + public ManufactureSchematicObject(long objectID, Planet planet, String template, Point3D position, Quaternion orientation) { + super(objectID, planet, position, orientation, template); + //messageBuilder = new ManufactureSchematicMessageBuilder(this); + } + } From 7091c4bbb31919d8f5fc622c08ff05b9b555af5e Mon Sep 17 00:00:00 2001 From: CharonInferar Date: Sun, 13 Apr 2014 22:59:31 +0200 Subject: [PATCH 24/32] more preparations Preparations for crafting --- .../common/ObjControllerOpcodes.java | 11 ++++ .../tangible/TangibleMessageBuilder.java | 43 ++++++++++++++ src/services/command/CommandService.java | 57 ++----------------- 3 files changed, 58 insertions(+), 53 deletions(-) diff --git a/src/resources/common/ObjControllerOpcodes.java b/src/resources/common/ObjControllerOpcodes.java index 1c7b626b..8cc142fd 100644 --- a/src/resources/common/ObjControllerOpcodes.java +++ b/src/resources/common/ObjControllerOpcodes.java @@ -43,5 +43,16 @@ public class ObjControllerOpcodes { public static final int NPC_CONVERSATION_OPTIONS = 0xE0000000; public static final int SET_PROFESSION_TEMPLATE = 0x5C040000; public static final int RESOURCE_EMPTY_HOPPER = 0xED000000; + public static final int DRAFT_SCHEMATICS = 0x0102; + public static final int DRAFT_SLOTS = 0x0103; + public static final int CRAFT_EXPERIMENT = 0x0106; + public static final int CRAFT_FILLSLOT = 0x7010000; + public static final int CRAFT_EMPTYSLOT = 0x8010000; + public static final int CRAFT_ACKNOWLEDGE = 0x010C; + public static final int CRAFT_CUSTOMIZATION = 0x5a010000; + public static final int NEXT_CRAFTING_STAGE_RESULT = 0x01BE; + public static final int DRAFT_SLOTS_QUERY_RESPONSE = 0x01BF; + public static final int RESOURCE_WEIGHTS = 0x0207; + } diff --git a/src/resources/objects/tangible/TangibleMessageBuilder.java b/src/resources/objects/tangible/TangibleMessageBuilder.java index 44ae16ff..f18dd482 100644 --- a/src/resources/objects/tangible/TangibleMessageBuilder.java +++ b/src/resources/objects/tangible/TangibleMessageBuilder.java @@ -161,6 +161,49 @@ public class TangibleMessageBuilder extends ObjectMessageBuilder { return buffer; } + public IoBuffer buildDelta3() { + IoBuffer buffer = bufferPool.allocate(2, false).order(ByteOrder.LITTLE_ENDIAN); + buffer.setAutoExpand(true); + buffer.putShort((short)5); + buffer.putInt(0x12862153); + buffer.putLong(getObject().getObjectID()); + buffer.putInt(0x54414E4F); + buffer.put((byte)3); + buffer.putInt(8);//buffer.putInt(8+6); + + buffer.putShort((short) 2); + buffer.putShort((short)8); + buffer.put((byte)0); + buffer.putShort((short) 0x21); + buffer.put((byte)0); + +// buffer.putShort((short) 0); +// buffer.putFloat(4.0F); + + int size = buffer.position(); + buffer.flip(); + return IoBuffer.allocate(size).put(buffer.array(), 0, size).flip(); + } + + public IoBuffer buildAssemblyDelta3() { + IoBuffer buffer = bufferPool.allocate(2, false).order(ByteOrder.LITTLE_ENDIAN); + buffer.setAutoExpand(true); + buffer.putShort((short)5); + buffer.putInt(0x12862153); + buffer.putLong(getObject().getObjectID()); + buffer.putInt(0x54414E4F); + buffer.put((byte)3); + buffer.putInt(8);//buffer.putInt(8+6); + + buffer.putShort((short) 1); + buffer.putShort((short)0x0B); + buffer.putInt(0x000003E8); // ? + + int size = buffer.position(); + buffer.flip(); + return IoBuffer.allocate(size).put(buffer.array(), 0, size).flip(); + } + @Override public void sendListDelta(byte viewType, short updateType, IoBuffer buffer) { // TODO Auto-generated method stub diff --git a/src/services/command/CommandService.java b/src/services/command/CommandService.java index e8f6afe8..01610e70 100644 --- a/src/services/command/CommandService.java +++ b/src/services/command/CommandService.java @@ -619,40 +619,10 @@ public class CommandService implements INetworkDispatch { int slotNumber = data.getInt(); int option = data.getInt(); byte sequence = data.get(); - core.craftingService.handleCraftFillSlot(playerId, ingredientId, slotNumber, option, sequence); +//core.craftingService.handleCraftFillSlot(playerId, ingredientId, slotNumber, option, sequence); } + }); - }); - - /* - NGE break by cAble - - 05 00 #Operand - 46 5E CE 80 #ObjCon - 83 00 00 00 - 07 01 00 00 #CraftFillSlot - 00 2E E9 E9 31 00 00 00 - 00 00 00 00 #unknown - 16 A5 C8 50 32 00 00 00 #ObjectID for Ingredient - 01 00 00 00 #Slot01 - 00 00 00 00 #Option - 85 #sequence - - - - 05 00 #Operand - 46 5E CE 80 #ObjCon - 83 00 00 00 - 07 01 00 00 #CraftFillSlot - 00 2E E9 E9 31 00 00 00 #CharacterID - 00 00 00 00 #Unknown - 9D 3F EB F9 3A 00 00 00 #ObjectID for Ingredient - 02 00 00 00 #Slot02 - 00 00 00 00 #Option - 86 #Sequence - */ - - objControllerOpcodes.put(ObjControllerOpcodes.CRAFT_EMPTYSLOT, new INetworkRemoteEvent() { @Override @@ -670,25 +640,12 @@ public class CommandService implements INetworkDispatch { CreatureObject actor = (CreatureObject) client.getParent(); SWGObject target = core.objectService.getObject(commandEnqueue.getTargetID()); -// System.out.println("CRAFTEMPTY"); -// StringBuilder sb = new StringBuilder(); -// for (byte b : data.array()) { -// sb.append(String.format("%02X ", b)); -// } -// System.out.println(sb.toString()); - - -// 05 00 46 5E CE 80 83 00 00 00 08 01 00 00 B4 A1 -// 0B 00 00 00 00 00 00 00 00 00 01 00 00 00 B7 A1 -// 0B 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 -// 00 00 00 00 00 00 00 00 00 00 00 00 - long playerId = data.getLong(); data.getInt(); // 00 00 00 00 int slotNumber = data.getInt(); long ingredientId = data.getLong(); byte sequence = data.get(); - core.craftingService.handleCraftEmptySlot(playerId, ingredientId, slotNumber, sequence); +//core.craftingService.handleCraftEmptySlot(playerId, ingredientId, slotNumber, sequence); } }); @@ -704,12 +661,6 @@ public class CommandService implements INetworkDispatch { return; } -// StringBuilder sb = new StringBuilder(); -// for (byte b : data.array()) { -// sb.append(String.format("%02X ", b)); -// } -// System.out.println(sb.toString()); - long playerId = data.getLong(); data.getInt(); // 00 00 00 00 UTF-16LE @@ -736,7 +687,7 @@ public class CommandService implements INetworkDispatch { int customizationValue = data.getInt(); } - core.craftingService.handleCraftCustomization(playerId,enteredName,modelNumber,schematicQuantity,customizationList); +//core.craftingService.handleCraftCustomization(playerId,enteredName,modelNumber,schematicQuantity,customizationList); } }); From a95b8964f048c75660805ae29200686c96fc4152 Mon Sep 17 00:00:00 2001 From: CharonInferar Date: Sun, 13 Apr 2014 23:03:40 +0200 Subject: [PATCH 25/32] access modifer changed back --- src/services/object/ObjectService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index 841579c1..1d6caa71 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -673,7 +673,7 @@ public class ObjectService implements INetworkDispatch { return core.getCreatureODB().get(new Long(objectId), Long.class, CreatureObject.class); } - private long generateObjectID() { + public long generateObjectID() { /*Random random = new Random(); long objectID = random.nextInt(); From a99edcc2bcbe63bc603ba88f9d54a8ba0bb512c7 Mon Sep 17 00:00:00 2001 From: CharonInferar Date: Sun, 13 Apr 2014 23:08:29 +0200 Subject: [PATCH 26/32] restored file --- src/services/object/ObjectService.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index 1d6caa71..45f79bdd 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -670,7 +670,21 @@ public class ObjectService implements INetworkDispatch { } public CreatureObject getCreatureFromDB(long objectId) { - return core.getCreatureODB().get(new Long(objectId), Long.class, CreatureObject.class); + CreatureObject object = core.getCreatureODB().get(new Long(objectId), Long.class, CreatureObject.class); + + if (object != null && getObject(object.getObjectID()) == null) { + loadServerTemplate(object); + + object.viewChildren(object, true, true, new Traverser() { + + public void process(SWGObject child) { + loadServerTemplate(child); + } + + }); + } + + return object; } public long generateObjectID() { From 0c1aebb58a50f5f940112be9809aecb9390e35e6 Mon Sep 17 00:00:00 2001 From: CharonInferar Date: Sun, 13 Apr 2014 23:12:32 +0200 Subject: [PATCH 27/32] someone changed serial number data type --- src/resources/objects/tangible/TangibleObject.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/resources/objects/tangible/TangibleObject.java b/src/resources/objects/tangible/TangibleObject.java index 8569fc4f..294d62e7 100644 --- a/src/resources/objects/tangible/TangibleObject.java +++ b/src/resources/objects/tangible/TangibleObject.java @@ -486,11 +486,11 @@ public class TangibleObject extends SWGObject { } public String getSerialNumber() { - return serialNumber; + return getStringAttribute("serial_number"); } public void setSerialNumber(String serialNumber) { - this.serialNumber = serialNumber; + setStringAttribute("serial_number", serialNumber); } public void sendDelta3(Client destination) { From aea688044229833a99cb76707650ada4825f4251 Mon Sep 17 00:00:00 2001 From: Mesagoppinmypants Date: Mon, 14 Apr 2014 10:19:38 -0400 Subject: [PATCH 28/32] Cloaked Attacks Now Grants Correct Abilities --- .../expertise_sp_cloaked_attacks_1.py | 81 ++++++++++--------- 1 file changed, 41 insertions(+), 40 deletions(-) diff --git a/scripts/expertise/expertise_sp_cloaked_attacks_1.py b/scripts/expertise/expertise_sp_cloaked_attacks_1.py index d26c9bc6..9f979c33 100644 --- a/scripts/expertise/expertise_sp_cloaked_attacks_1.py +++ b/scripts/expertise/expertise_sp_cloaked_attacks_1.py @@ -1,51 +1,52 @@ import sys def addAbilities(core, actor, player): - if actor.getLevel() >= 4: - actor.addAbility("sp_hd_melee_0") - if actor.getLevel() >= 12: - actor.addAbility("sp_hd_melee_1") + if actor.getLevel() >= 10: + actor.addAbility("sp_stealth_melee_0") if actor.getLevel() >= 20: - actor.addAbility("sp_hd_melee_2") - if actor.getLevel() >= 30: - actor.addAbility("sp_hd_melee_3") - if actor.getLevel() >= 38: - actor.addAbility("sp_hd_melee_4") - if actor.getLevel() >= 52: - actor.addAbility("sp_hd_melee_5") - if actor.getLevel() >= 62: - actor.addAbility("sp_hd_melee_6") + actor.addAbility("sp_stealth_melee_1") + if actor.getLevel() >= 32: + actor.addAbility("sp_stealth_melee_2") + if actor.getLevel() >= 46: + actor.addAbility("sp_stealth_melee_3") + if actor.getLevel() >= 60: + actor.addAbility("sp_stealth_melee_4") + if actor.getLevel() >= 70: + actor.addAbility("sp_stealth_melee_5") + if actor.getLevel() >= 86: + actor.addAbility("sp_stealth_melee_6") - if actor.getLevel() >= 4: - actor.addAbility("sp_hd_range_0") - if actor.getLevel() >= 12: - actor.addAbility("sp_hd_range_1") + if actor.getLevel() >= 10: + actor.addAbility("sp_stealth_ranged_0") if actor.getLevel() >= 20: - actor.addAbility("sp_hd_range_2") - if actor.getLevel() >= 30: - actor.addAbility("sp_hd_range_3") - if actor.getLevel() >= 38: - actor.addAbility("sp_hd_range_4") - if actor.getLevel() >= 52: - actor.addAbility("sp_hd_range_5") - if actor.getLevel() >= 62: - actor.addAbility("sp_hd_range_6") + actor.addAbility("sp_stealth_ranged_1") + if actor.getLevel() >= 32: + actor.addAbility("sp_stealth_ranged_2") + if actor.getLevel() >= 46: + actor.addAbility("sp_stealth_ranged_3") + if actor.getLevel() >= 60: + actor.addAbility("sp_stealth_ranged_4") + if actor.getLevel() >= 70: + actor.addAbility("sp_stealth_ranged_5") + if actor.getLevel() >= 86: + actor.addAbility("sp_stealth_ranged_6") return def removeAbilities(core, actor, player): - actor.removeAbility("sp_hd_melee_0") - actor.removeAbility("sp_hd_melee_1") - actor.removeAbility("sp_hd_melee_2") - actor.removeAbility("sp_hd_melee_3") - actor.removeAbility("sp_hd_melee_4") - actor.removeAbility("sp_hd_melee_5") - actor.removeAbility("sp_hd_melee_6") + actor.removeAbility("sp_stealth_melee_0") + actor.removeAbility("sp_stealth_melee_1") + actor.removeAbility("sp_stealth_melee_2") + actor.removeAbility("sp_stealth_melee_3") + actor.removeAbility("sp_stealth_melee_4") + actor.removeAbility("sp_stealth_melee_5") + actor.removeAbility("sp_stealth_melee_6") - actor.removeAbility("sp_hd_range_0") - actor.removeAbility("sp_hd_range_1") - actor.removeAbility("sp_hd_range_2") - actor.removeAbility("sp_hd_range_3") - actor.removeAbility("sp_hd_range_4") - actor.removeAbility("sp_hd_range_5") - actor.removeAbility("sp_hd_range_6") + actor.removeAbility("sp_stealth_ranged_0") + actor.removeAbility("sp_stealth_ranged_1") + actor.removeAbility("sp_stealth_ranged_2") + actor.removeAbility("sp_stealth_ranged_3") + actor.removeAbility("sp_stealth_ranged_4") + actor.removeAbility("sp_stealth_ranged_5") + actor.removeAbility("sp_stealth_ranged_6") return + From 3b1724c570c0f62264aa1cf703ed3bdd95c31795 Mon Sep 17 00:00:00 2001 From: Mesagoppinmypants Date: Mon, 14 Apr 2014 10:21:54 -0400 Subject: [PATCH 29/32] Hidden Daggers Now Grants Correct Abilities --- .../expertise_sp_hidden_daggers_1.py | 46 ++++++++++++++++++- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/scripts/expertise/expertise_sp_hidden_daggers_1.py b/scripts/expertise/expertise_sp_hidden_daggers_1.py index 9aaf8abb..38c849d5 100644 --- a/scripts/expertise/expertise_sp_hidden_daggers_1.py +++ b/scripts/expertise/expertise_sp_hidden_daggers_1.py @@ -1,9 +1,51 @@ import sys def addAbilities(core, actor, player): - actor.addAbility("sp_hd_ability_1") + if actor.getLevel() >= 10: + actor.addAbility("sp_hd_melee_0") + if actor.getLevel() >= 18: + actor.addAbility("sp_hd_melee_1") + if actor.getLevel() >= 32: + actor.addAbility("sp_hd_melee_2") + if actor.getLevel() >= 46: + actor.addAbility("sp_hd_melee_3") + if actor.getLevel() >= 58: + actor.addAbility("sp_hd_melee_4") + if actor.getLevel() >= 70: + actor.addAbility("sp_hd_melee_5") + if actor.getLevel() >= 84: + actor.addAbility("sp_hd_melee_6") + + if actor.getLevel() >= 10: + actor.addAbility("sp_hd_range_0") + if actor.getLevel() >= 18: + actor.addAbility("sp_hd_range_1") + if actor.getLevel() >= 32: + actor.addAbility("sp_hd_range_2") + if actor.getLevel() >= 46: + actor.addAbility("sp_hd_range_3") + if actor.getLevel() >= 58: + actor.addAbility("sp_hd_range_4") + if actor.getLevel() >= 70: + actor.addAbility("sp_hd_range_5") + if actor.getLevel() >= 84: + actor.addAbility("sp_hd_range_6") return def removeAbilities(core, actor, player): - actor.removeAbility("sp_hd_ability_1") + actor.removeAbility("sp_hd_melee_0") + actor.removeAbility("sp_hd_melee_1") + actor.removeAbility("sp_hd_melee_2") + actor.removeAbility("sp_hd_melee_3") + actor.removeAbility("sp_hd_melee_4") + actor.removeAbility("sp_hd_melee_5") + actor.removeAbility("sp_hd_melee_6") + + actor.removeAbility("sp_hd_range_0") + actor.removeAbility("sp_hd_range_1") + actor.removeAbility("sp_hd_range_2") + actor.removeAbility("sp_hd_range_3") + actor.removeAbility("sp_hd_range_4") + actor.removeAbility("sp_hd_range_5") + actor.removeAbility("sp_hd_range_6") return From 7ed61990cb601ecea6bec530fa52b7be772e8e10 Mon Sep 17 00:00:00 2001 From: Mesagoppinmypants Date: Mon, 14 Apr 2014 10:23:46 -0400 Subject: [PATCH 30/32] Improved Spys Fang Now Grants Abilities at Correct Levels --- .../expertise/expertise_sp_improved_spys_fang_1.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/scripts/expertise/expertise_sp_improved_spys_fang_1.py b/scripts/expertise/expertise_sp_improved_spys_fang_1.py index c30afb6b..5a085702 100644 --- a/scripts/expertise/expertise_sp_improved_spys_fang_1.py +++ b/scripts/expertise/expertise_sp_improved_spys_fang_1.py @@ -1,17 +1,17 @@ import sys def addAbilities(core, actor, player): - if actor.getLevel() >= 26: + if actor.getLevel() >= 10: actor.addAbility("sp_dot_0") - if actor.getLevel() >= 34: + if actor.getLevel() >= 28: actor.addAbility("sp_dot_1") - if actor.getLevel() >= 48: + if actor.getLevel() >= 46: actor.addAbility("sp_dot_2") - if actor.getLevel() >= 62: + if actor.getLevel() >= 58: actor.addAbility("sp_dot_3") - if actor.getLevel() >= 76: + if actor.getLevel() >= 72: actor.addAbility("sp_dot_4") - if actor.getLevel() >= 90: + if actor.getLevel() >= 88: actor.addAbility("sp_dot_5") return From c87dfa31553ea3374f4ce1934256573c8028c699 Mon Sep 17 00:00:00 2001 From: Mesagoppinmypants Date: Mon, 14 Apr 2014 10:52:54 -0400 Subject: [PATCH 31/32] Cloaked Recovery Now Grants At Correct Levels --- scripts/expertise/expertise_sp_cloaked_recovery_1.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/expertise/expertise_sp_cloaked_recovery_1.py b/scripts/expertise/expertise_sp_cloaked_recovery_1.py index 1e39f694..5e8ffb01 100644 --- a/scripts/expertise/expertise_sp_cloaked_recovery_1.py +++ b/scripts/expertise/expertise_sp_cloaked_recovery_1.py @@ -1,15 +1,15 @@ import sys def addAbilities(core, actor, player): - if actor.getLevel() >= 26: + if actor.getLevel() >= 10: actor.addAbility("sp_cloaked_recovery_0") - if actor.getLevel() >= 34: + if actor.getLevel() >= 28: actor.addAbility("sp_cloaked_recovery_1") - if actor.getLevel() >= 48: + if actor.getLevel() >= 54: actor.addAbility("sp_cloaked_recovery_2") - if actor.getLevel() >= 62: + if actor.getLevel() >= 70: actor.addAbility("sp_cloaked_recovery_3") - if actor.getLevel() >= 76: + if actor.getLevel() >= 86: actor.addAbility("sp_cloaked_recovery_4") return From 48a3f85aef0356f25317ab70c5665663dedf4c6d Mon Sep 17 00:00:00 2001 From: Mesagoppinmypants Date: Mon, 14 Apr 2014 15:29:10 -0400 Subject: [PATCH 32/32] Armor Sprint Now Grants Correct Ability --- scripts/expertise/expertise_bh_armor_sprint_1.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/expertise/expertise_bh_armor_sprint_1.py b/scripts/expertise/expertise_bh_armor_sprint_1.py index ecedc9e6..b0ebf1ec 100644 --- a/scripts/expertise/expertise_bh_armor_sprint_1.py +++ b/scripts/expertise/expertise_bh_armor_sprint_1.py @@ -1,9 +1,9 @@ import sys def addAbilities(core, actor, player): - actor.addAbility("bh_shields_1") + actor.addAbility("bh_armor_sprint_1") return def removeAbilities(core, actor, player): - actor.removeAbility("bh_shields_1") + actor.removeAbility("bh_armor_sprint_1") return