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/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 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_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 diff --git a/scripts/object/intangible/vehicle/speederbike_swoop_pcd.py b/scripts/object/intangible/vehicle/speederbike_swoop_pcd.py index ec2deccd..ace4cdfc 100644 --- a/scripts/object/intangible/vehicle/speederbike_swoop_pcd.py +++ b/scripts/object/intangible/vehicle/speederbike_swoop_pcd.py @@ -1,21 +1,15 @@ import sys def setup(core, object): - #object.setAttachment('vehicleId', core.objectService.generateObjectID()) - object.setAttachment('radial_filename', 'item') + object.setAttachment('radial_filename', 'vehicle_pcd') return def use(core, actor, object): - if object: - vehicleId = object.getObjectID() - #vehicleId = object.getAttachment('vehicleId') + 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()) - if not vehicleId: - return + swoop.setOwnerId(actor.getObjectID()) + actor.setAttachment('activeVehicleID', swoop.getObjectID()) - 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) - 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 a1e5a7b2..2cf9f19b 100644 --- a/scripts/radial/vehicle.py +++ b/scripts/radial/vehicle.py @@ -4,24 +4,26 @@ 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: - #owner.setPosture(16) - owner.setMounted(1) - #owner.setParent(target) - target.initMount(owner) - #target.add(owner) - #target.setOwner(owner) - #Vehicles.testbike(owner,target) + if option == 208: + if not owner.isMounted(): + owner.setMounted(1) + target.initMount(owner) + else: + target.unmount(owner) - #target.unmount(owner) - #core.objectService.useObject(owner, target) 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 1c8cddf2..fc44c02e 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -68,7 +68,7 @@ import resources.objects.player.PlayerObject; import resources.objects.tangible.TangibleObject; import services.command.BaseSWGCommand; -@Entity(version=7) +@Entity(version=8) public class CreatureObject extends TangibleObject implements IPersistent { @NotPersistent @@ -188,6 +188,7 @@ public class CreatureObject extends TangibleObject implements IPersistent { private ConcurrentHashMap cooldowns = new ConcurrentHashMap(); public boolean mounted = false; + @NotPersistent public CreatureObject mountedVehicle; public CreatureObject(long objectID, Planet planet, Point3D position, Quaternion orientation, String Template) { @@ -540,6 +541,7 @@ public class CreatureObject extends TangibleObject implements IPersistent { synchronized(objectMutex) { this.ownerId = ownerId; } + notifyObservers(messageBuilder.buildOwnerIdDelta(ownerId), true); } public float getAccelerationMultiplierBase() { @@ -1796,42 +1798,57 @@ 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) { - 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); + boolean remove = false; + 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); } public void unmount(CreatureObject owner) { + boolean add = false; synchronized(objectMutex) { if ((this.getOptionsBitmask() & Options.MOUNT) == Options.MOUNT){ - UpdateContainmentMessage updateContainmentMessage= new UpdateContainmentMessage(owner.getObjectID(), this.getObjectID(), -1); - owner.getClient().getSession().write(updateContainmentMessage.serialize()); + add = true; + _remove(owner); + UpdateContainmentMessage updateContainmentMessage = new UpdateContainmentMessage(owner.getObjectID(), 0, -1); + notifyObservers(updateContainmentMessage, true); } } + if(add) { + owner.setMounted(false); + owner.setMountedVehicle(null); + owner.setStateBitmask(0); + owner.setPosture((byte) 0); + NGECore.getInstance().simulationService.add(owner, getWorldPosition().x, getWorldPosition().z, false); + NGECore.getInstance().simulationService.teleport(owner, getWorldPosition(), getOrientation(), 0); + } } 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()); - } } 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()); diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index 7c512e91..e1fa31b6 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; @@ -1027,7 +1026,6 @@ public class ObjectService implements INetworkDispatch { CrcStringTableVisitor crcTable = ClientFileManager.loadFile("misc/object_template_crc_string_table.iff", CrcStringTableVisitor.class); List persistentBuildings = new ArrayList(); Map duplicate = new HashMap(); - Transaction txn = core.getDuplicateIdODB().getEnvironment().beginTransaction(null, null); for (int i = 0; i < buildoutTable.getRowCount(); i++) { @@ -1107,16 +1105,14 @@ public class ObjectService implements INetworkDispatch { newObjectId = core.getDuplicateIdODB().get(key, String.class, DuplicateId.class).getObjectId(); } else { newObjectId = generateObjectID(); + Transaction txn = core.getDuplicateIdODB().getEnvironment().beginTransaction(null, null); core.getDuplicateIdODB().put(new DuplicateId(key, newObjectId), String.class, DuplicateId.class, txn); + txn.commitSync(); } duplicate.put(objectId, newObjectId); objectId = newObjectId; } - if(txn.isValid()) { - System.out.println("Committed doid transaction."); - txn.commitSync(); - } List containers = new ArrayList(); SWGObject object; diff --git a/src/services/resources/HarvesterService.java b/src/services/resources/HarvesterService.java index 313bfdfe..7dd955eb 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; @@ -148,14 +149,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(); @@ -165,19 +191,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); } } @@ -424,6 +453,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"); @@ -958,6 +988,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(); @@ -1009,7 +1041,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; }