From b80f26efe6197c0817486cb76c2a1231128a6200 Mon Sep 17 00:00:00 2001 From: Subsonic154 Date: Mon, 6 Apr 2026 19:14:16 -0400 Subject: [PATCH] Implement handling for spawn_pad and spawn_zone --- src/main/resources/zonemaps/map14.json | 25 ++++++++--- .../psforever/objects/GlobalDefinitions.scala | 6 ++- .../VirtualTrainingTeleporter.scala | 42 +++++++++++++++++++ .../VirtualTrainingTeleporterDefinition.scala | 11 +++++ .../game/objectcreate/ObjectClass.scala | 2 + .../scala/net/psforever/zones/Zones.scala | 5 +++ 6 files changed, 84 insertions(+), 7 deletions(-) create mode 100644 src/main/scala/net/psforever/objects/serverobject/structures/VirtualTrainingTeleporter.scala create mode 100644 src/main/scala/net/psforever/objects/serverobject/structures/VirtualTrainingTeleporterDefinition.scala diff --git a/src/main/resources/zonemaps/map14.json b/src/main/resources/zonemaps/map14.json index 8e08dbe6b..b04b32264 100644 --- a/src/main/resources/zonemaps/map14.json +++ b/src/main/resources/zonemaps/map14.json @@ -13,7 +13,7 @@ "IsChildObject": false }, { - "Id": 8, + "Id": 9, "ObjectName": "order_terminal", "ObjectType": "order_terminal", "Owner": 0, @@ -26,7 +26,7 @@ "IsChildObject": true }, { - "Id": 9, + "Id": 10, "ObjectName": "order_terminal", "ObjectType": "order_terminal", "Owner": 0, @@ -40,6 +40,19 @@ }, { "Id": 6, + "ObjectName": "spawn_pad", + "ObjectType": "spawn_pad", + "Owner": 0, + "AbsX": 500.0, + "AbsY": 530.0, + "AbsZ": 13.37697, + "Yaw": 180.0, + "GUID": 833, + "MapID": null, + "IsChildObject": true + }, + { + "Id": 7, "ObjectName": "order_terminal", "ObjectType": "order_terminal", "Owner": 0, @@ -52,7 +65,7 @@ "IsChildObject": true }, { - "Id": 10, + "Id": 11, "ObjectName": "order_terminal", "ObjectType": "order_terminal", "Owner": 0, @@ -65,7 +78,7 @@ "IsChildObject": true }, { - "Id": 11, + "Id": 12, "ObjectName": "order_terminal", "ObjectType": "order_terminal", "Owner": 0, @@ -78,7 +91,7 @@ "IsChildObject": true }, { - "Id": 7, + "Id": 8, "ObjectName": "order_terminal", "ObjectType": "order_terminal", "Owner": 0, @@ -104,7 +117,7 @@ "IsChildObject": true }, { - "Id": 12, + "Id": 13, "ObjectName": "order_terminal", "ObjectType": "order_terminal", "Owner": 0, diff --git a/src/main/scala/net/psforever/objects/GlobalDefinitions.scala b/src/main/scala/net/psforever/objects/GlobalDefinitions.scala index fcd572d8a..70e950f7e 100644 --- a/src/main/scala/net/psforever/objects/GlobalDefinitions.scala +++ b/src/main/scala/net/psforever/objects/GlobalDefinitions.scala @@ -18,7 +18,7 @@ import net.psforever.objects.serverobject.painbox.PainboxDefinition import net.psforever.objects.serverobject.terminals._ import net.psforever.objects.serverobject.tube.SpawnTubeDefinition import net.psforever.objects.serverobject.resourcesilo.ResourceSiloDefinition -import net.psforever.objects.serverobject.structures.{AmenityDefinition, BuildingDefinition, WarpGateDefinition} +import net.psforever.objects.serverobject.structures.{AmenityDefinition, BuildingDefinition, VirtualTrainingTeleporterDefinition, WarpGateDefinition} import net.psforever.objects.serverobject.terminals.capture.CaptureTerminalDefinition import net.psforever.objects.serverobject.terminals.implant.ImplantTerminalMechDefinition import net.psforever.objects.serverobject.turret.FacilityTurretDefinition @@ -1281,6 +1281,10 @@ object GlobalDefinitions { val obbasemesh: AmenityDefinition = new AmenityDefinition(598) {} + val spawn_pad = new VirtualTrainingTeleporterDefinition() + + val spawn_zone = new VirtualTrainingTeleporterDefinition() + val targeting_laser_dispenser = new OrderTerminalDefinition(851) val stationaryteleportpad = new GenericTeleportationDefinition(836) diff --git a/src/main/scala/net/psforever/objects/serverobject/structures/VirtualTrainingTeleporter.scala b/src/main/scala/net/psforever/objects/serverobject/structures/VirtualTrainingTeleporter.scala new file mode 100644 index 000000000..eb99dd23f --- /dev/null +++ b/src/main/scala/net/psforever/objects/serverobject/structures/VirtualTrainingTeleporter.scala @@ -0,0 +1,42 @@ +// Copyright (c) 2026 PSForever +package net.psforever.objects.serverobject.structures + +import akka.actor.ActorContext +import net.psforever.objects.GlobalDefinitions +import net.psforever.objects.serverobject.PlanetSideServerObject +import net.psforever.types.{PlanetSideEmpire, Vector3} + +class VirtualTrainingTeleporter extends PlanetSideServerObject { + def Definition: VirtualTrainingTeleporterDefinition = GlobalDefinitions.spawn_zone + + def Faction: PlanetSideEmpire.Value = PlanetSideEmpire.NEUTRAL +} + +object VirtualTrainingTeleporter { + + /** + * Overloaded constructor. + * @return the `VirtualTrainingTeleporter` object + */ + def apply(): VirtualTrainingTeleporter = { + new VirtualTrainingTeleporter() + } + + /** + * Instantiate an configure a `VirtualTrainingTeleporter` object + * @param id the unique id that will be assigned to this entity + * @param context a context to allow the object to properly set up `ActorSystem` functionality; + * not necessary for this object, but required by signature + * @return the `VirtualTrainingTeleporter` object + */ + def Constructor(id: Int, context: ActorContext): VirtualTrainingTeleporter = { + val obj = VirtualTrainingTeleporter() + obj + } + + def Constructor(pos: Vector3)(id: Int, context: ActorContext): VirtualTrainingTeleporter = { + val obj = VirtualTrainingTeleporter() + obj.Position = pos + obj + } +} diff --git a/src/main/scala/net/psforever/objects/serverobject/structures/VirtualTrainingTeleporterDefinition.scala b/src/main/scala/net/psforever/objects/serverobject/structures/VirtualTrainingTeleporterDefinition.scala new file mode 100644 index 000000000..f45d6a616 --- /dev/null +++ b/src/main/scala/net/psforever/objects/serverobject/structures/VirtualTrainingTeleporterDefinition.scala @@ -0,0 +1,11 @@ +// Copyright (c) 2026 PSForever +package net.psforever.objects.serverobject.structures + +import net.psforever.objects.definition.ObjectDefinition + +/** + * Shared definition for spawn_pad and spawn_zone objects. + */ +class VirtualTrainingTeleporterDefinition extends ObjectDefinition(815) { + Name = "spawn_zone" +} diff --git a/src/main/scala/net/psforever/packet/game/objectcreate/ObjectClass.scala b/src/main/scala/net/psforever/packet/game/objectcreate/ObjectClass.scala index 1be70996c..481cd014b 100644 --- a/src/main/scala/net/psforever/packet/game/objectcreate/ObjectClass.scala +++ b/src/main/scala/net/psforever/packet/game/objectcreate/ObjectClass.scala @@ -422,6 +422,8 @@ object ObjectClass { final val order_terminalb = 614 final val portable_ammo_terminal = 684 final val portable_order_terminal = 690 + final val spawn_pad = 800 + final val spawn_zone = 815 final val targeting_laser_dispenser = 851 final val teleportpad_terminal = 853 diff --git a/src/main/scala/net/psforever/zones/Zones.scala b/src/main/scala/net/psforever/zones/Zones.scala index f33c5fa26..000bb751c 100644 --- a/src/main/scala/net/psforever/zones/Zones.scala +++ b/src/main/scala/net/psforever/zones/Zones.scala @@ -22,6 +22,7 @@ import net.psforever.objects.serverobject.shuttle.OrbitalShuttlePad import net.psforever.objects.serverobject.structures.{Building, BuildingDefinition, FoundationBuilder, StructureType, WarpGate} import net.psforever.objects.serverobject.terminals.capture.{CaptureTerminal, CaptureTerminalDefinition} import net.psforever.objects.serverobject.terminals.implant.{ImplantTerminalInterface, ImplantTerminalMech} +import net.psforever.objects.serverobject.structures.VirtualTrainingTeleporter import net.psforever.objects.serverobject.tube.SpawnTube import net.psforever.objects.serverobject.turret.{FacilityTurret, FacilityTurretDefinition, VanuSentry} import net.psforever.objects.serverobject.zipline.ZipLinePath @@ -710,6 +711,10 @@ object Zones { ) zoneMap.linkShuttleToBay(obj.guid) + case "spawn_pad" | "spawn_zone" => + zoneMap + .addLocalObject(obj.guid, VirtualTrainingTeleporter.Constructor(obj.position)) + case _ => () }