From d0e6c44e587b0cf71454f47bd46faadc19288f79 Mon Sep 17 00:00:00 2001 From: Mazo Date: Tue, 26 Jan 2021 22:57:44 +0000 Subject: [PATCH] CaptureFlag + CaptureFlagSocket objects/converters/definitions --- .../psforever/objects/GlobalDefinitions.scala | 6 +++ .../converter/CaptureFlagConverter.scala | 25 +++++++++ .../serverobject/llu/CaptureFlag.scala | 54 +++++++++++++++++++ .../llu/CaptureFlagDefinition.scala | 11 ++++ .../serverobject/llu/CaptureFlagSocket.scala | 32 +++++++++++ .../llu/CaptureFlagSocketDefinition.scala | 11 ++++ 6 files changed, 139 insertions(+) create mode 100644 src/main/scala/net/psforever/objects/definition/converter/CaptureFlagConverter.scala create mode 100644 src/main/scala/net/psforever/objects/serverobject/llu/CaptureFlag.scala create mode 100644 src/main/scala/net/psforever/objects/serverobject/llu/CaptureFlagDefinition.scala create mode 100644 src/main/scala/net/psforever/objects/serverobject/llu/CaptureFlagSocket.scala create mode 100644 src/main/scala/net/psforever/objects/serverobject/llu/CaptureFlagSocketDefinition.scala diff --git a/src/main/scala/net/psforever/objects/GlobalDefinitions.scala b/src/main/scala/net/psforever/objects/GlobalDefinitions.scala index 7b967c10d..6861b335e 100644 --- a/src/main/scala/net/psforever/objects/GlobalDefinitions.scala +++ b/src/main/scala/net/psforever/objects/GlobalDefinitions.scala @@ -30,6 +30,7 @@ import net.psforever.objects.vital.prop.DamageWithPosition import net.psforever.objects.vital.{ComplexDeployableResolutions, MaxResolutions, SimpleResolutions} import net.psforever.types.{ExoSuitType, ImplantType, PlanetSideEmpire, Vector3} import net.psforever.types._ +import net.psforever.objects.serverobject.llu.{CaptureFlagDefinition, CaptureFlagSocketDefinition} import scala.collection.mutable import scala.concurrent.duration._ @@ -1060,6 +1061,11 @@ object GlobalDefinitions { val vanu_control_console = new CaptureTerminalDefinition(930) // Cavern CC + val llm_socket = new CaptureFlagSocketDefinition() + + val capture_flag = new CaptureFlagDefinition() + capture_flag.Packet = new CaptureFlagConverter + val lodestar_repair_terminal = new MedicalTerminalDefinition(461) val multivehicle_rearm_terminal = new OrderTerminalDefinition(576) diff --git a/src/main/scala/net/psforever/objects/definition/converter/CaptureFlagConverter.scala b/src/main/scala/net/psforever/objects/definition/converter/CaptureFlagConverter.scala new file mode 100644 index 000000000..93ef040ed --- /dev/null +++ b/src/main/scala/net/psforever/objects/definition/converter/CaptureFlagConverter.scala @@ -0,0 +1,25 @@ +package net.psforever.objects.definition.converter + +import net.psforever.objects.serverobject.llu.CaptureFlag +import net.psforever.objects.serverobject.structures.Building +import net.psforever.packet.game.objectcreate.{CaptureFlagData, PlacementData} + +import java.util.concurrent.TimeUnit +import scala.util.{Success, Try} + +class CaptureFlagConverter extends ObjectCreateConverter[CaptureFlag]() { + override def ConstructorData(obj : CaptureFlag) : Try[CaptureFlagData] = { + val hackInfo = obj.Owner.asInstanceOf[Building].CaptureTerminal.get.HackedBy.get + val millisecondsRemaining = TimeUnit.MILLISECONDS.convert(math.max(0, hackInfo.hackStartTime + hackInfo.hackDuration - System.nanoTime), TimeUnit.NANOSECONDS) + + Success( + CaptureFlagData( + new PlacementData(obj.Position, obj.Orientation, obj.Velocity), + obj.Faction, + obj.Owner.asInstanceOf[Building].GUID.guid, + obj.Target.GUID.guid, + millisecondsRemaining + ) + ) + } +} \ No newline at end of file diff --git a/src/main/scala/net/psforever/objects/serverobject/llu/CaptureFlag.scala b/src/main/scala/net/psforever/objects/serverobject/llu/CaptureFlag.scala new file mode 100644 index 000000000..f39223cbf --- /dev/null +++ b/src/main/scala/net/psforever/objects/serverobject/llu/CaptureFlag.scala @@ -0,0 +1,54 @@ +package net.psforever.objects.serverobject.llu + +import net.psforever.objects.serverobject.structures.{Amenity, AmenityOwner, Building} +import net.psforever.objects.{GlobalDefinitions, Player} +import net.psforever.types.{PlanetSideEmpire, Vector3} + +/** + * This object represents the LLU that gets spawned at a LLU socket when a LLU control console is hacked + */ +class CaptureFlag(tDef: CaptureFlagDefinition) extends Amenity { + def Definition : CaptureFlagDefinition = tDef + + private var target: Building = Building.NoBuilding + private var faction: PlanetSideEmpire.Value = PlanetSideEmpire.NEUTRAL + private var carrier: Option[Player] = None + + def Target: Building = target + def Target_=(new_target: Building): Building = { + target = new_target + target + } + + /** + * Since a LLU belongs to a base, but needs to be picked up by the enemy faction we need to be able to override the faction that owns the LLU to the hacker faction + */ + override def Faction: PlanetSideEmpire.Value = faction + override def Faction_=(new_faction: PlanetSideEmpire.Value): PlanetSideEmpire.Value = { + faction = new_faction + faction + } + + def Carrier: Option[Player] = carrier + def Carrier_=(new_carrier: Option[Player]) : Option[Player] = { + carrier = new_carrier + carrier + } +} + +object CaptureFlag { + def apply(tDef: CaptureFlagDefinition): CaptureFlag = { + new CaptureFlag(tDef) + } + + def Constructor(pos: Vector3, ori: Vector3, target: Building, owner: AmenityOwner, faction: PlanetSideEmpire.Value) : CaptureFlag = { + val obj = CaptureFlag(GlobalDefinitions.capture_flag) + obj.Position = pos + obj.Orientation = ori + obj.Target = target + obj.Owner = owner + obj.Faction = faction + + obj + } +} \ No newline at end of file diff --git a/src/main/scala/net/psforever/objects/serverobject/llu/CaptureFlagDefinition.scala b/src/main/scala/net/psforever/objects/serverobject/llu/CaptureFlagDefinition.scala new file mode 100644 index 000000000..ec6f5fb2c --- /dev/null +++ b/src/main/scala/net/psforever/objects/serverobject/llu/CaptureFlagDefinition.scala @@ -0,0 +1,11 @@ +package net.psforever.objects.serverobject.llu + +import net.psforever.objects.serverobject.structures.AmenityDefinition + +/** + * The definition for any 'CaptureFlag' + * Object Id 157 + */ +class CaptureFlagDefinition extends AmenityDefinition(157) { + Name = "capture_flag" +} \ No newline at end of file diff --git a/src/main/scala/net/psforever/objects/serverobject/llu/CaptureFlagSocket.scala b/src/main/scala/net/psforever/objects/serverobject/llu/CaptureFlagSocket.scala new file mode 100644 index 000000000..304775dbb --- /dev/null +++ b/src/main/scala/net/psforever/objects/serverobject/llu/CaptureFlagSocket.scala @@ -0,0 +1,32 @@ +package net.psforever.objects.serverobject.llu + +import akka.actor.ActorContext +import net.psforever.objects.GlobalDefinitions +import net.psforever.objects.serverobject.structures.Amenity +import net.psforever.types.Vector3 + + +/** + * Represents the LLU sockets found within bases that require LLU hacks. + * It is used as a position reference for spawning the LLU in the correct location when the base is hacked + * @param tDef the `ObjectDefinition` that constructs this object and maintains some of its immutable fields + */ +class CaptureFlagSocket(tDef: CaptureFlagSocketDefinition) extends Amenity { + def Definition : CaptureFlagSocketDefinition = tDef +} + +object CaptureFlagSocket { + def apply(tDef: CaptureFlagSocketDefinition) : CaptureFlagSocket = { + new CaptureFlagSocket(tDef) + } + + def Constructor(pos: Vector3)(id: Int, context: ActorContext) : CaptureFlagSocket = { + Constructor(GlobalDefinitions.llm_socket, pos)(id, context) + } + + def Constructor(tdef: CaptureFlagSocketDefinition, pos: Vector3)(id: Int, context: ActorContext) : CaptureFlagSocket = { + val obj = CaptureFlagSocket(tdef) + obj.Position = pos + obj + } +} \ No newline at end of file diff --git a/src/main/scala/net/psforever/objects/serverobject/llu/CaptureFlagSocketDefinition.scala b/src/main/scala/net/psforever/objects/serverobject/llu/CaptureFlagSocketDefinition.scala new file mode 100644 index 000000000..cee42b0fa --- /dev/null +++ b/src/main/scala/net/psforever/objects/serverobject/llu/CaptureFlagSocketDefinition.scala @@ -0,0 +1,11 @@ +package net.psforever.objects.serverobject.llu + +import net.psforever.objects.serverobject.structures.AmenityDefinition + +/** + * The definition for any 'CaptureFlagSocket' + * Object Id 450 + */ +class CaptureFlagSocketDefinition extends AmenityDefinition(450) { + Name = "llm_socket" +} \ No newline at end of file