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 eb077d1f..b32e90e3 100644 --- a/scripts/object/tangible/deed/vehicle_deed/speederbike_swoop_deed.py +++ b/scripts/object/tangible/deed/vehicle_deed/speederbike_swoop_deed.py @@ -7,12 +7,12 @@ 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 = 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) diff --git a/scripts/radial/vehicle.py b/scripts/radial/vehicle.py index ca1f4311..a1e5a7b2 100644 --- a/scripts/radial/vehicle.py +++ b/scripts/radial/vehicle.py @@ -1,4 +1,5 @@ from resources.common import RadialOptions + import sys def createRadial(core, owner, target, radials): @@ -11,7 +12,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/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 7fbac962..1c8cddf2 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; @@ -185,6 +187,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); @@ -1775,6 +1780,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 d3b64cd4..b33717d0 100644 --- a/src/resources/objects/tangible/TangibleObject.java +++ b/src/resources/objects/tangible/TangibleObject.java @@ -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; @@ -483,6 +485,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/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; } } 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) {