IFF/Door orientation - Building MapID/GUID changes - Ishundar full config (#244)

* Move door orientation logic from the door itself to the IFF lock, as the lock has the correct orientation in the UBR files, whereas the door does not.

* Remove ModelID from buildings (is now GUID) and change "ID" to be "MapId". A building can also be constructed with both a GUID and MapID.

* Update Maps.scala and Zones.scala to (for the moment) only have Ishundar configured with Sounours V3 playtest base ownership. Default starting zone is also moved to Ishundar for now.

* Fix oopsie with West Zaqar Tower

* Add proximity terminal positions to constructors

* Offset vehicle spawning by the correct amount from game_objects.adb.lst

* Orient players correctly when spawning at a respawn tube

* Apply a 90 degree offset to tech plant garage locks, as these are the only locks where the orientation does not match the orientation of the door

* Add missing spawn terminals, repair/rearm terminals for both ground and air.

* Additional documentation for GOAM / PAM packets
This commit is contained in:
Mazo 2019-04-04 19:32:28 +01:00 committed by Fate-JH
parent 8313ce6491
commit 3738feec12
31 changed files with 6366 additions and 2106 deletions

View file

@ -12,29 +12,6 @@ import net.psforever.types.Vector3
*/ */
class Door(private val ddef : DoorDefinition) extends Amenity { class Door(private val ddef : DoorDefinition) extends Amenity {
private var openState : Option[Player] = None private var openState : Option[Player] = None
/** a vector in the direction of the "outside" of a room;
* typically, any locking utility is on that same "outside" */
private var outwards : Vector3 = Vector3.Zero
/**
* While setting the normal rotation angle for the door (?),
* use the angular data to determine an "inside" side and an "outside" side.<br>
* <br>
* Doors are always positioned with the frame perpendicular to the ground.
* The `i` and `j` components can be excused for this reason and only the `k` component (rotation around world-up) matters.
* Due to angle-corrected North, add 90 degrees before switching to radians and negate the cosine.
* @param orient the orientation of the door
* @return the clamped orientation of the door
*/
override def Orientation_=(orient : Vector3) : Vector3 = {
val ret = super.Orientation_=(orient)
//transform angular data into unit circle components
val rang = math.toRadians(orient.z + 90)
outwards = Vector3(-math.cos(rang).toFloat, math.sin(rang).toFloat, 0)
ret
}
def Outwards : Vector3 = outwards
def isOpen : Boolean = openState.isDefined def isOpen : Boolean = openState.isDefined
@ -128,18 +105,16 @@ object Door {
* Instantiate and configure a `Door` object that has knowledge of both its position and outwards-facing direction. * Instantiate and configure a `Door` object that has knowledge of both its position and outwards-facing direction.
* The assumption is that this door will be paired with an IFF Lock, thus, has conditions for opening. * The assumption is that this door will be paired with an IFF Lock, thus, has conditions for opening.
* @param pos the position of the door * @param pos the position of the door
* @param outwards_direction a vector in the direction of the door's outside
* @param id the unique id that will be assigned to this entity * @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 * @param context a context to allow the object to properly set up `ActorSystem` functionality
* @return the `Door` object * @return the `Door` object
*/ */
def Constructor(pos : Vector3, outwards_direction : Vector3)(id : Int, context : ActorContext) : Door = { def Constructor(pos : Vector3)(id : Int, context : ActorContext) : Door = {
import akka.actor.Props import akka.actor.Props
import net.psforever.objects.GlobalDefinitions import net.psforever.objects.GlobalDefinitions
val obj = Door(GlobalDefinitions.door) val obj = Door(GlobalDefinitions.door)
obj.Position = pos obj.Position = pos
obj.Orientation = outwards_direction
obj.Actor = context.actorOf(Props(classOf[DoorControl], obj), s"${GlobalDefinitions.door.Name}_$id") obj.Actor = context.actorOf(Props(classOf[DoorControl], obj), s"${GlobalDefinitions.door.Name}_$id")
obj obj
} }

View file

@ -4,6 +4,7 @@ package net.psforever.objects.serverobject.locks
import net.psforever.objects.serverobject.hackable.Hackable import net.psforever.objects.serverobject.hackable.Hackable
import net.psforever.objects.serverobject.structures.Amenity import net.psforever.objects.serverobject.structures.Amenity
import net.psforever.packet.game.TriggeredSound import net.psforever.packet.game.TriggeredSound
import net.psforever.types.Vector3
/** /**
* A structure-owned server object that is a "door lock."<br> * A structure-owned server object that is a "door lock."<br>
@ -19,6 +20,30 @@ class IFFLock(private val idef : IFFLockDefinition) extends Amenity with Hackabl
HackSound = TriggeredSound.HackDoor HackSound = TriggeredSound.HackDoor
HackEffectDuration = Array(60, 180, 300, 360) HackEffectDuration = Array(60, 180, 300, 360)
HackDuration = Array(5, 3, 1, 1) HackDuration = Array(5, 3, 1, 1)
/** a vector in the direction of the "outside" of a room;
* typically, any locking utility is on that same "outside" */
private var outwards : Vector3 = Vector3.Zero
/**
* While setting the normal rotation angle for the IFF lock for a door (?),
* use the angular data to determine an "inside" side and an "outside" side.<br>
* <br>
* Doors are always positioned with the frame perpendicular to the ground.
* The `i` and `j` components can be excused for this reason and only the `k` component (rotation around world-up) matters.
* Due to angle-corrected North, add 90 degrees before switching to radians and negate the cosine.
* @param orient the orientation of the door
* @return the clamped orientation of the door
*/
override def Orientation_=(orient : Vector3) : Vector3 = {
val ret = super.Orientation_=(orient)
//transform angular data into unit circle components
val rang = math.toRadians(orient.z + 90)
outwards = Vector3(-math.cos(rang).toFloat, math.sin(rang).toFloat, 0)
ret
}
def Outwards : Vector3 = outwards
} }
object IFFLock { object IFFLock {
@ -33,15 +58,20 @@ object IFFLock {
import akka.actor.ActorContext import akka.actor.ActorContext
/** /**
* Instantiate an configure a `IFFLock` object * Instantiate an configure a `IFFLock` object
* @param id the unique id that will be assigned to this entity *
* @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 * @param context a context to allow the object to properly set up `ActorSystem` functionality
* @param pos the position of the IFF lock
* @param outwards_direction a vector used to determine which direction is inside/outside for the linked door
* @return the `IFFLock` object * @return the `IFFLock` object
*/ */
def Constructor(id : Int, context : ActorContext) : IFFLock = { def Constructor(pos: Vector3, outwards_direction : Vector3)(id : Int, context : ActorContext) : IFFLock = {
import akka.actor.Props import akka.actor.Props
import net.psforever.objects.GlobalDefinitions import net.psforever.objects.GlobalDefinitions
val obj = IFFLock(GlobalDefinitions.lock_external) val obj = IFFLock(GlobalDefinitions.lock_external)
obj.Position = pos
obj.Orientation = outwards_direction
obj.Actor = context.actorOf(Props(classOf[IFFLockControl], obj), s"${GlobalDefinitions.lock_external.Name}_$id") obj.Actor = context.actorOf(Props(classOf[IFFLockControl], obj), s"${GlobalDefinitions.lock_external.Name}_$id")
obj obj
} }

View file

@ -43,7 +43,7 @@ class ResourceSiloControl(resourceSilo : ResourceSilo) extends Actor with Factio
case ResourceSilo.LowNtuWarning(enabled: Boolean) => case ResourceSilo.LowNtuWarning(enabled: Boolean) =>
resourceSilo.LowNtuWarningOn = enabled resourceSilo.LowNtuWarningOn = enabled
log.trace(s"LowNtuWarning: Silo ${resourceSilo.GUID} low ntu warning set to $enabled") log.trace(s"LowNtuWarning: Silo ${resourceSilo.GUID} low ntu warning set to $enabled")
avatarService ! AvatarServiceMessage(resourceSilo.Owner.asInstanceOf[Building].Zone.Id, AvatarAction.PlanetsideAttribute(PlanetSideGUID(resourceSilo.Owner.asInstanceOf[Building].ModelId), 47, if(resourceSilo.LowNtuWarningOn) 1 else 0)) avatarService ! AvatarServiceMessage(resourceSilo.Owner.asInstanceOf[Building].Zone.Id, AvatarAction.PlanetsideAttribute(resourceSilo.Owner.asInstanceOf[Building].GUID, 47, if(resourceSilo.LowNtuWarningOn) 1 else 0))
case ResourceSilo.UpdateChargeLevel(amount: Int) => case ResourceSilo.UpdateChargeLevel(amount: Int) =>
val siloChargeBeforeChange = resourceSilo.ChargeLevel val siloChargeBeforeChange = resourceSilo.ChargeLevel
@ -81,7 +81,7 @@ class ResourceSiloControl(resourceSilo : ResourceSilo) extends Actor with Factio
} else if (siloChargeBeforeChange == 0 && resourceSilo.ChargeLevel > 0) { } else if (siloChargeBeforeChange == 0 && resourceSilo.ChargeLevel > 0) {
// Power restored. Reactor Online. Sensors Online. Weapons Online. All systems nominal. // Power restored. Reactor Online. Sensors Online. Weapons Online. All systems nominal.
//todo: Check generator is online before starting up //todo: Check generator is online before starting up
avatarService ! AvatarServiceMessage(resourceSilo.Owner.asInstanceOf[Building].Zone.Id, AvatarAction.PlanetsideAttribute(PlanetSideGUID(resourceSilo.Owner.asInstanceOf[Building].ModelId), 48, 0)) avatarService ! AvatarServiceMessage(resourceSilo.Owner.asInstanceOf[Building].Zone.Id, AvatarAction.PlanetsideAttribute(resourceSilo.Owner.asInstanceOf[Building].GUID, 48, 0))
} }
case _ => ; case _ => ;
} }

View file

@ -8,17 +8,16 @@ import net.psforever.objects.zones.Zone
import net.psforever.packet.game.PlanetSideGUID import net.psforever.packet.game.PlanetSideGUID
import net.psforever.types.{PlanetSideEmpire, Vector3} import net.psforever.types.{PlanetSideEmpire, Vector3}
class Building(private val mapId : Int, private val zone : Zone, private val buildingType : StructureType.Value) extends PlanetSideServerObject { class Building(private val building_guid : Int, private val map_id : Int, private val zone : Zone, private val buildingType : StructureType.Value) extends PlanetSideServerObject {
/** /**
* The mapId is the identifier number used in BuildingInfoUpdateMessage. * The map_id is the identifier number used in BuildingInfoUpdateMessage. This is the index that the building appears in the MPO file starting from index 1
* The modelId is the identifier number used in SetEmpireMessage / Facility hacking / PlanetSideAttributeMessage. * The GUID is the identifier number used in SetEmpireMessage / Facility hacking / PlanetSideAttributeMessage.
*/ */
private var modelId : Option[Int] = None
private var faction : PlanetSideEmpire.Value = PlanetSideEmpire.NEUTRAL private var faction : PlanetSideEmpire.Value = PlanetSideEmpire.NEUTRAL
private var amenities : List[Amenity] = List.empty private var amenities : List[Amenity] = List.empty
GUID = PlanetSideGUID(0) GUID = PlanetSideGUID(building_guid)
def Id : Int = mapId def MapId : Int = map_id
def Faction : PlanetSideEmpire.Value = faction def Faction : PlanetSideEmpire.Value = faction
@ -37,15 +36,6 @@ class Building(private val mapId : Int, private val zone : Zone, private val bui
def Zone : Zone = zone def Zone : Zone = zone
def ModelId : Int = modelId.getOrElse(Id)
def ModelId_=(id : Int) : Int = ModelId_=(Some(id))
def ModelId_=(id : Option[Int]) : Int = {
modelId = id
ModelId
}
def BuildingType : StructureType.Value = buildingType def BuildingType : StructureType.Value = buildingType
override def Continent : String = zone.Id override def Continent : String = zone.Id
@ -56,29 +46,29 @@ class Building(private val mapId : Int, private val zone : Zone, private val bui
} }
object Building { object Building {
final val NoBuilding : Building = new Building(0, Zone.Nowhere, StructureType.Platform) { final val NoBuilding : Building = new Building(building_guid = 0, map_id = 0, Zone.Nowhere, StructureType.Platform) {
override def Faction_=(faction : PlanetSideEmpire.Value) : PlanetSideEmpire.Value = PlanetSideEmpire.NEUTRAL override def Faction_=(faction : PlanetSideEmpire.Value) : PlanetSideEmpire.Value = PlanetSideEmpire.NEUTRAL
override def Amenities_=(obj : Amenity) : List[Amenity] = Nil override def Amenities_=(obj : Amenity) : List[Amenity] = Nil
} }
final val BuildingDefinition : ObjectDefinition = new ObjectDefinition(0) { Name = "building" } final val BuildingDefinition : ObjectDefinition = new ObjectDefinition(0) { Name = "building" }
def apply(id : Int, zone : Zone, buildingType : StructureType.Value) : Building = { def apply(guid : Int, map_id : Int, zone : Zone, buildingType : StructureType.Value) : Building = {
new Building(id, zone, buildingType) new Building(guid, map_id, zone, buildingType)
} }
def Structure(buildingType : StructureType.Value, location : Vector3)(id : Int, zone : Zone, context : ActorContext) : Building = { def Structure(buildingType : StructureType.Value, location : Vector3)(guid : Int, map_id : Int, zone : Zone, context : ActorContext) : Building = {
import akka.actor.Props import akka.actor.Props
val obj = new Building(id, zone, buildingType) val obj = new Building(guid, map_id, zone, buildingType)
obj.Position = location obj.Position = location
obj.Actor = context.actorOf(Props(classOf[BuildingControl], obj), s"$id-$buildingType-building") obj.Actor = context.actorOf(Props(classOf[BuildingControl], obj), s"$map_id-$buildingType-building")
obj obj
} }
def Structure(buildingType : StructureType.Value)(id : Int, zone : Zone, context : ActorContext) : Building = { def Structure(buildingType : StructureType.Value)(guid: Int, map_id : Int, zone : Zone, context : ActorContext) : Building = {
import akka.actor.Props import akka.actor.Props
val obj = new Building(id, zone, buildingType) val obj = new Building(guid, map_id, zone, buildingType)
obj.Actor = context.actorOf(Props(classOf[BuildingControl], obj), s"$id-$buildingType-building") obj.Actor = context.actorOf(Props(classOf[BuildingControl], obj), s"$map_id-$buildingType-building")
obj obj
} }

View file

@ -29,7 +29,7 @@ class BuildingControl(building : Building) extends Actor with FactionAffinityBeh
private[this] val log = org.log4s.getLogger private[this] val log = org.log4s.getLogger
override def preStart = { override def preStart = {
log.info(s"Starting BuildingControl for ${building.GUID} / ${building.ModelId}") log.info(s"Starting BuildingControl for ${building.GUID} / ${building.MapId}")
ServiceManager.serviceManager ! Lookup("galaxy") ServiceManager.serviceManager ! Lookup("galaxy")
ServiceManager.serviceManager ! Lookup("local") ServiceManager.serviceManager ! Lookup("local")
} }
@ -37,10 +37,10 @@ class BuildingControl(building : Building) extends Actor with FactionAffinityBeh
def receive : Receive = checkBehavior.orElse { def receive : Receive = checkBehavior.orElse {
case ServiceManager.LookupResult("galaxy", endpoint) => case ServiceManager.LookupResult("galaxy", endpoint) =>
galaxyService = endpoint galaxyService = endpoint
log.info("BuildingControl: Building " + building.ModelId + " Got galaxy service " + endpoint) log.info("BuildingControl: Building " + building.GUID + " Got galaxy service " + endpoint)
case ServiceManager.LookupResult("local", endpoint) => case ServiceManager.LookupResult("local", endpoint) =>
localService = endpoint localService = endpoint
log.info("BuildingControl: Building " + building.ModelId + " Got local service " + endpoint) log.info("BuildingControl: Building " + building.GUID + " Got local service " + endpoint)
case FactionAffinity.ConvertFactionAffinity(faction) => case FactionAffinity.ConvertFactionAffinity(faction) =>
val originalAffinity = building.Faction val originalAffinity = building.Faction
if(originalAffinity != (building.Faction = faction)) { if(originalAffinity != (building.Faction = faction)) {
@ -48,7 +48,7 @@ class BuildingControl(building : Building) extends Actor with FactionAffinityBeh
} }
sender ! FactionAffinity.AssertFactionAffinity(building, faction) sender ! FactionAffinity.AssertFactionAffinity(building, faction)
case Building.SendMapUpdate(all_clients: Boolean) => case Building.SendMapUpdate(all_clients: Boolean) =>
log.info(s"Sending BuildingInfoUpdateMessage update. Zone: ${building.Zone.Number} - Building: ${building.ModelId}") log.info(s"Sending BuildingInfoUpdateMessage update. Zone: ${building.Zone.Number} - Building: ${building.GUID} / MapId: ${building.MapId}")
var ntuLevel = 0 var ntuLevel = 0
var is_hacked = false var is_hacked = false
var hack_time_remaining_ms = 0L; var hack_time_remaining_ms = 0L;
@ -80,7 +80,7 @@ class BuildingControl(building : Building) extends Actor with FactionAffinityBeh
val msg = BuildingInfoUpdateMessage( val msg = BuildingInfoUpdateMessage(
continent_id = building.Zone.Number, //Zone continent_id = building.Zone.Number, //Zone
building_id = building.Id, //Facility building_map_id = building.MapId, //Facility
ntu_level = ntuLevel, ntu_level = ntuLevel,
is_hacked, is_hacked,
hacked_by_faction, hacked_by_faction,

View file

@ -11,9 +11,9 @@ import net.psforever.objects.zones.Zone
* @see `Building` * @see `Building`
* @param constructor a curried function that eventually constructs a `Building` object * @param constructor a curried function that eventually constructs a `Building` object
*/ */
class FoundationBuilder(private val constructor : (Int, Zone, ActorContext)=>Building) { class FoundationBuilder(private val constructor : (Int, Int, Zone, ActorContext)=>Building) {
def Build(id : Int, zone : Zone)(implicit context : ActorContext = null) : Building = { def Build(guid : Int, map_id: Int, zone : Zone)(implicit context : ActorContext = null) : Building = {
val obj : Building = constructor(id, zone, context) val obj : Building = constructor(guid, map_id, zone, context)
obj obj
} }
} }
@ -24,7 +24,7 @@ object FoundationBuilder {
* @param constructor a curried function that eventually constructs a `Building` object * @param constructor a curried function that eventually constructs a `Building` object
* @return a `FoundationBuilder` object * @return a `FoundationBuilder` object
*/ */
def apply(constructor : (Int, Zone, ActorContext)=>Building) : FoundationBuilder = { def apply(constructor : (Int, Int, Zone, ActorContext)=>Building) : FoundationBuilder = {
new FoundationBuilder(constructor) new FoundationBuilder(constructor)
} }
} }

View file

@ -4,19 +4,19 @@ package net.psforever.objects.serverobject.structures
import akka.actor.ActorContext import akka.actor.ActorContext
import net.psforever.objects.zones.Zone import net.psforever.objects.zones.Zone
class WarpGate(id : Int, zone : Zone) extends Building(id, zone, StructureType.WarpGate) { class WarpGate(building_guid : Int, map_id : Int, zone : Zone) extends Building(building_guid, map_id, zone, StructureType.WarpGate) {
//TODO stuff later //TODO stuff later
} }
object WarpGate { object WarpGate {
def apply(id : Int, zone : Zone) : WarpGate = { def apply(guid : Int, map_id : Int, zone : Zone) : WarpGate = {
new WarpGate(id, zone) new WarpGate(guid, map_id, zone)
} }
def Structure(id : Int, zone : Zone, context : ActorContext) : WarpGate = { def Structure(guid : Int, map_id : Int, zone : Zone, context : ActorContext) : WarpGate = {
import akka.actor.Props import akka.actor.Props
val obj = new WarpGate(id, zone) val obj = new WarpGate(guid, map_id, zone)
obj.Actor = context.actorOf(Props(classOf[BuildingControl], obj), s"$id-gate") obj.Actor = context.actorOf(Props(classOf[BuildingControl], obj), s"$map_id-gate")
obj obj
} }
} }

View file

@ -312,6 +312,10 @@ class Zone(private val zoneId : String, zoneMap : ZoneMap, zoneNumber : Int) {
buildings.get(id) buildings.get(id)
} }
def BuildingByMapId(map_id : Int) : Building = {
buildings.filter(x => x._2.MapId == map_id).head._2
}
private def BuildLocalObjects(implicit context : ActorContext, guid : NumberPoolHub) : Unit = { private def BuildLocalObjects(implicit context : ActorContext, guid : NumberPoolHub) : Unit = {
Map.LocalObjects.foreach({ builderObject => builderObject.Build }) Map.LocalObjects.foreach({ builderObject => builderObject.Build })
} }
@ -350,7 +354,7 @@ class Zone(private val zoneId : String, zoneMap : ZoneMap, zoneNumber : Int) {
private def MakeBuildings(implicit context : ActorContext) : PairMap[Int, Building] = { private def MakeBuildings(implicit context : ActorContext) : PairMap[Int, Building] = {
val buildingList = Map.LocalBuildings val buildingList = Map.LocalBuildings
buildings = buildingList.map({case(building_id, constructor) => building_id -> constructor.Build(building_id, this) }) buildings = buildingList.map({case((building_guid, map_id), constructor) => building_guid -> constructor.Build(building_guid, map_id, this) })
buildings buildings
} }
@ -388,10 +392,10 @@ class Zone(private val zoneId : String, zoneMap : ZoneMap, zoneNumber : Int) {
def SpawnGroups() : Map[Building, List[SpawnTube]] = spawnGroups def SpawnGroups() : Map[Building, List[SpawnTube]] = spawnGroups
def SpawnGroups(building : Building) : List[SpawnTube] = SpawnGroups(building.Id) def SpawnGroups(building : Building) : List[SpawnTube] = SpawnGroups(building.MapId)
def SpawnGroups(buildingId : Int) : List[SpawnTube] = { def SpawnGroups(buildingId : Int) : List[SpawnTube] = {
spawnGroups.find({ case((building, _)) => building.Id == buildingId }) match { spawnGroups.find({ case((building, _)) => building.MapId == buildingId }) match {
case Some((_, list)) => case Some((_, list)) =>
list list
case None => case None =>

View file

@ -31,7 +31,7 @@ class ZoneMap(private val name : String) {
private var linkTerminalInterface : Map[Int, Int] = Map() private var linkTerminalInterface : Map[Int, Int] = Map()
private var linkDoorLock : Map[Int, Int] = Map() private var linkDoorLock : Map[Int, Int] = Map()
private var linkObjectBase : Map[Int, Int] = Map() private var linkObjectBase : Map[Int, Int] = Map()
private var buildings : Map[Int, FoundationBuilder] = Map() private var buildings : Map[(Int, Int), FoundationBuilder] = Map()
def Name : String = name def Name : String = name
@ -56,11 +56,11 @@ class ZoneMap(private val name : String) {
localObjects.size localObjects.size
} }
def LocalBuildings : Map[Int, FoundationBuilder] = buildings def LocalBuildings : Map[(Int, Int), FoundationBuilder] = buildings
def LocalBuilding(building_id : Int, constructor : FoundationBuilder) : Int = { def LocalBuilding(building_guid : Int, map_id : Int, constructor : FoundationBuilder) : Int = {
if(building_id > 0) { if(building_guid > 0) {
buildings = buildings ++ Map(building_id -> constructor) buildings = buildings ++ Map((building_guid, map_id) -> constructor)
} }
buildings.size buildings.size
} }

View file

@ -88,7 +88,7 @@ final case class Additional3(unk1 : Boolean,
* 128 - Pain Module<br> * 128 - Pain Module<br>
* ` * `
* @param continent_id the continent (zone) * @param continent_id the continent (zone)
* @param building_id the building * @param building_map_id the map id of this building from the MPO files
* @param ntu_level if the building has a silo, the amount of NTU in that silo; * @param ntu_level if the building has a silo, the amount of NTU in that silo;
* NTU is reported in multiples of 10%; * NTU is reported in multiples of 10%;
* valid for 0 (0%) to 10 (100%) * valid for 0 (0%) to 10 (100%)
@ -118,7 +118,7 @@ final case class Additional3(unk1 : Boolean,
* @param boost_generator_pain if the building has a generator, the (boosted) strength of its enemy pain field * @param boost_generator_pain if the building has a generator, the (boosted) strength of its enemy pain field
*/ */
final case class BuildingInfoUpdateMessage(continent_id : Int, final case class BuildingInfoUpdateMessage(continent_id : Int,
building_id : Int, building_map_id : Int,
ntu_level : Int, ntu_level : Int,
is_hacked : Boolean, is_hacked : Boolean,
empire_hack : PlanetSideEmpire.Value, empire_hack : PlanetSideEmpire.Value,

View file

@ -12,6 +12,12 @@ import shapeless.{::, HNil}
* (Write more some other time.) * (Write more some other time.)
* @param object_guid the target object * @param object_guid the target object
* @param code the action code * @param code the action code
* 44, 45, 46, 47 - Deploy capital base shield pole with animation and broadcasts "The capitol force dome at X has been activated"
* 48, 49, 50, 51 - Stow capital base shield pole with animation and broadcasts "The capitol force dome at X has been deactivated"
* 52, 53, 54, 55 - Deploy capital base shield pole (instantly, unless still in the middle of the stow animation)
* 60, 61, 62, 63 - Displays "This facility's generator is under attack!"
* 64, 65, 66, 67 - Displays "Generator has Overloaded! Evacuate Generator Room Immediately!"
* 68, 69, 70, 71 - Displays "This facility's generator is back on line"
* 96, 97, 98, 99 - Makes the vehicle bounce slightly. Have seen this in packet captures after taking a vehicle through a warpgate * 96, 97, 98, 99 - Makes the vehicle bounce slightly. Have seen this in packet captures after taking a vehicle through a warpgate
* 200, 201, 202, 203 - For aircraft - client shows "THe bailing mechanism failed! To fix the mechanism, land and repair the vehicle!" * 200, 201, 202, 203 - For aircraft - client shows "THe bailing mechanism failed! To fix the mechanism, land and repair the vehicle!"
* 224 - Sets vehicle or player to be black ops * 224 - Sets vehicle or player to be black ops

View file

@ -115,6 +115,7 @@ import scodec.codecs._
* `36 - CR. Value is the CR`<br> * `36 - CR. Value is the CR`<br>
* `43 - Info on avatar name : 0 = Nothing, 1 = "(LD)" message`<br> * `43 - Info on avatar name : 0 = Nothing, 1 = "(LD)" message`<br>
* `45 - NTU charge bar 0-10, 5 = 50% full. Seems to apply to both ANT and NTU Silo (possibly siphons?)`<br> * `45 - NTU charge bar 0-10, 5 = 50% full. Seems to apply to both ANT and NTU Silo (possibly siphons?)`<br>
* `46 - Sends "Generator damage is at a critical level!" message`
* `47 - Sets base NTU level to CRITICAL. MUST use base modelId not base GUID`<br> * `47 - Sets base NTU level to CRITICAL. MUST use base modelId not base GUID`<br>
* `48 - Set to 1 to send base power loss message & turns on red warning lights throughout base. MUST use base modelId not base GUID`<br> * `48 - Set to 1 to send base power loss message & turns on red warning lights throughout base. MUST use base modelId not base GUID`<br>
* `49 - Vehicle texture effects state? (>0 turns on ANT panel glow or ntu silo panel glow + orbs) (bit?)`<br> * `49 - Vehicle texture effects state? (>0 turns on ANT panel glow or ntu silo panel glow + orbs) (bit?)`<br>

View file

@ -183,10 +183,10 @@ class LocalService extends Actor {
} }
if(ntuLevel > 0) { if(ntuLevel > 0) {
log.info(s"Setting base ${building.ModelId} as owned by $hackedByFaction") log.info(s"Setting base ${building.GUID} / MapId: ${building.MapId} as owned by $hackedByFaction")
building.Faction = hackedByFaction building.Faction = hackedByFaction
self ! LocalServiceMessage(zone.Id, LocalAction.SetEmpire(PlanetSideGUID(building.ModelId), hackedByFaction)) self ! LocalServiceMessage(zone.Id, LocalAction.SetEmpire(building.GUID, hackedByFaction))
} else { } else {
log.info("Base hack completed, but base was out of NTU.") log.info("Base hack completed, but base was out of NTU.")
} }
@ -194,7 +194,7 @@ class LocalService extends Actor {
// Reset CC back to normal operation // Reset CC back to normal operation
self ! LocalServiceMessage(zone.Id, LocalAction.HackCaptureTerminal(PlanetSideGUID(-1), zone, terminal, 0, 8L, isResecured = true)) self ! LocalServiceMessage(zone.Id, LocalAction.HackCaptureTerminal(PlanetSideGUID(-1), zone, terminal, 0, 8L, isResecured = true))
//todo: this appears to be the way to reset the base warning lights after the hack finishes but it doesn't seem to work. The attribute above is a workaround //todo: this appears to be the way to reset the base warning lights after the hack finishes but it doesn't seem to work. The attribute above is a workaround
self ! HackClearActor.ClearTheHack(PlanetSideGUID(building.ModelId), zone.Id, 3212836864L, 8L) self ! HackClearActor.ClearTheHack(building.GUID, zone.Id, 3212836864L, 8L)
case Success(_) => case Success(_) =>
log.warn("Got success from InterstellarCluster.GetWorld but didn't know how to handle it") log.warn("Got success from InterstellarCluster.GetWorld but didn't know how to handle it")

View file

@ -89,7 +89,7 @@ class HackCaptureActor extends Actor {
val hackEntry = hackedObjects.reduceLeft(minTimeLeft) val hackEntry = hackedObjects.reduceLeft(minTimeLeft)
val short_timeout : FiniteDuration = math.max(1, hackEntry.duration.toNanos - (System.nanoTime - hackEntry.hack_timestamp)) nanoseconds val short_timeout : FiniteDuration = math.max(1, hackEntry.duration.toNanos - (System.nanoTime - hackEntry.hack_timestamp)) nanoseconds
log.trace(s"Still items left in hacked objects list. Checking again in ${short_timeout}") log.trace(s"Still items left in hacked objects list. Checking again in ${short_timeout.toSeconds} seconds")
import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.ExecutionContext.Implicits.global
clearTrigger = context.system.scheduler.scheduleOnce(short_timeout, self, HackCaptureActor.ProcessCompleteHacks()) clearTrigger = context.system.scheduler.scheduleOnce(short_timeout, self, HackCaptureActor.ProcessCompleteHacks())
} }

View file

@ -68,7 +68,7 @@ class HackClearActor() extends Actor {
val (unhackObjects, stillHackedObjects) = PartitionEntries(hackedObjects, now) val (unhackObjects, stillHackedObjects) = PartitionEntries(hackedObjects, now)
val short_timeout : FiniteDuration = math.max(1, stillHackedObjects.head.duration - (now - stillHackedObjects.head.time)) nanoseconds val short_timeout : FiniteDuration = math.max(1, stillHackedObjects.head.duration - (now - stillHackedObjects.head.time)) nanoseconds
log.warn(s"Still items left in hacked objects list. Checking again in ${short_timeout}") log.warn(s"Still items left in hacked objects list. Checking again in ${short_timeout.toSeconds} seconds")
import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.ExecutionContext.Implicits.global
clearTrigger = context.system.scheduler.scheduleOnce(short_timeout, self, HackClearActor.TryClearHacks()) clearTrigger = context.system.scheduler.scheduleOnce(short_timeout, self, HackClearActor.TryClearHacks())
} }

View file

@ -30,7 +30,7 @@ class AmenityTest extends Specification {
"can be owned by a building" in { "can be owned by a building" in {
val ao = new AmenityObject() val ao = new AmenityObject()
val bldg = Building(10, Zone.Nowhere, StructureType.Building) val bldg = Building(0, 10, Zone.Nowhere, StructureType.Building)
ao.Owner = bldg ao.Owner = bldg
ao.Owner mustEqual bldg ao.Owner mustEqual bldg
@ -54,7 +54,7 @@ class AmenityTest extends Specification {
"confer faction allegiance through ownership" in { "confer faction allegiance through ownership" in {
//see FactionAffinityTest //see FactionAffinityTest
val ao = new AmenityObject() val ao = new AmenityObject()
val bldg = Building(10, Zone.Nowhere, StructureType.Building) val bldg = Building(0, 10, Zone.Nowhere, StructureType.Building)
ao.Owner = bldg ao.Owner = bldg
bldg.Faction mustEqual PlanetSideEmpire.NEUTRAL bldg.Faction mustEqual PlanetSideEmpire.NEUTRAL
ao.Faction mustEqual PlanetSideEmpire.NEUTRAL ao.Faction mustEqual PlanetSideEmpire.NEUTRAL
@ -69,8 +69,8 @@ class AmenityTest extends Specification {
class BuildingTest extends Specification { class BuildingTest extends Specification {
"Building" should { "Building" should {
"construct" in { "construct" in {
val bldg = Building(10, Zone.Nowhere, StructureType.Building) val bldg = Building(0, 10, Zone.Nowhere, StructureType.Building)
bldg.Id mustEqual 10 bldg.MapId mustEqual 10
bldg.Actor mustEqual ActorRef.noSender bldg.Actor mustEqual ActorRef.noSender
bldg.Amenities mustEqual Nil bldg.Amenities mustEqual Nil
bldg.Zone mustEqual Zone.Nowhere bldg.Zone mustEqual Zone.Nowhere
@ -78,7 +78,7 @@ class BuildingTest extends Specification {
} }
"change faction affinity" in { "change faction affinity" in {
val bldg = Building(10, Zone.Nowhere, StructureType.Building) val bldg = Building(0, 10, Zone.Nowhere, StructureType.Building)
bldg.Faction mustEqual PlanetSideEmpire.NEUTRAL bldg.Faction mustEqual PlanetSideEmpire.NEUTRAL
bldg.Faction = PlanetSideEmpire.TR bldg.Faction = PlanetSideEmpire.TR
@ -86,7 +86,7 @@ class BuildingTest extends Specification {
} }
"keep track of amenities" in { "keep track of amenities" in {
val bldg = Building(10, Zone.Nowhere, StructureType.Building) val bldg = Building(0, 10, Zone.Nowhere, StructureType.Building)
val door1 = Door(GlobalDefinitions.door) val door1 = Door(GlobalDefinitions.door)
val door2 = Door(GlobalDefinitions.door) val door2 = Door(GlobalDefinitions.door)
@ -104,8 +104,8 @@ class BuildingTest extends Specification {
class WarpGateTest extends Specification { class WarpGateTest extends Specification {
"WarpGate" should { "WarpGate" should {
"construct" in { "construct" in {
val bldg = WarpGate(10, Zone.Nowhere) val bldg = WarpGate(0, 10, Zone.Nowhere)
bldg.Id mustEqual 10 bldg.MapId mustEqual 10
bldg.Actor mustEqual ActorRef.noSender bldg.Actor mustEqual ActorRef.noSender
bldg.Amenities mustEqual Nil bldg.Amenities mustEqual Nil
bldg.Zone mustEqual Zone.Nowhere bldg.Zone mustEqual Zone.Nowhere
@ -117,7 +117,7 @@ class WarpGateTest extends Specification {
class BuildingControl1Test extends ActorTest { class BuildingControl1Test extends ActorTest {
"Building Control" should { "Building Control" should {
"construct" in { "construct" in {
val bldg = Building(10, Zone.Nowhere, StructureType.Building) val bldg = Building(0, 10, Zone.Nowhere, StructureType.Building)
bldg.Actor = system.actorOf(Props(classOf[BuildingControl], bldg), "test") bldg.Actor = system.actorOf(Props(classOf[BuildingControl], bldg), "test")
assert(bldg.Actor != ActorRef.noSender) assert(bldg.Actor != ActorRef.noSender)
} }
@ -126,7 +126,7 @@ class BuildingControl1Test extends ActorTest {
class BuildingControl2Test extends ActorTest { class BuildingControl2Test extends ActorTest {
ServiceManager.boot(system) ! ServiceManager.Register(Props[GalaxyService], "galaxy") ServiceManager.boot(system) ! ServiceManager.Register(Props[GalaxyService], "galaxy")
val bldg = Building(10, Zone.Nowhere, StructureType.Building) val bldg = Building(0, 10, Zone.Nowhere, StructureType.Building)
bldg.Faction = PlanetSideEmpire.TR bldg.Faction = PlanetSideEmpire.TR
bldg.Actor = system.actorOf(Props(classOf[BuildingControl], bldg), "test") bldg.Actor = system.actorOf(Props(classOf[BuildingControl], bldg), "test")
bldg.Actor ! "startup" bldg.Actor ! "startup"
@ -148,7 +148,7 @@ class BuildingControl2Test extends ActorTest {
class BuildingControl3Test extends ActorTest { class BuildingControl3Test extends ActorTest {
ServiceManager.boot(system) ! ServiceManager.Register(Props[GalaxyService], "galaxy") ServiceManager.boot(system) ! ServiceManager.Register(Props[GalaxyService], "galaxy")
val bldg = Building(10, Zone.Nowhere, StructureType.Building) val bldg = Building(0, 10, Zone.Nowhere, StructureType.Building)
bldg.Faction = PlanetSideEmpire.TR bldg.Faction = PlanetSideEmpire.TR
bldg.Actor = system.actorOf(Props(classOf[BuildingControl], bldg), "test") bldg.Actor = system.actorOf(Props(classOf[BuildingControl], bldg), "test")
val door1 = Door(GlobalDefinitions.door) val door1 = Door(GlobalDefinitions.door)

View file

@ -43,7 +43,7 @@ class DoorTest extends Specification {
} }
"be opened and closed (2; toggle)" in { "be opened and closed (2; toggle)" in {
val msg = UseItemMessage(PlanetSideGUID(6585), PlanetSideGUID(0), PlanetSideGUID(372), 4294967295L, false, Vector3(5.0f,0.0f,0.0f), Vector3(0.0f,0.0f,0.0f), 11, 25, 0, 364) val msg = UseItemMessage(PlanetSideGUID(6585), PlanetSideGUID(0), PlanetSideGUID(372), 4294967295L, false, Vector3(5.0f, 0.0f, 0.0f), Vector3(0.0f, 0.0f, 0.0f), 11, 25, 0, 364)
val door = Door(GlobalDefinitions.door) val door = Door(GlobalDefinitions.door)
door.Open mustEqual None door.Open mustEqual None
door.Use(player, msg) door.Use(player, msg)
@ -51,27 +51,6 @@ class DoorTest extends Specification {
door.Use(player, msg) door.Use(player, msg)
door.Open mustEqual None door.Open mustEqual None
} }
"keep track of its orientation as a North-corrected vector" in {
val ulp = math.ulp(1)
val door = Door(GlobalDefinitions.door)
door.Orientation = Vector3(0, 0, 0) //face North
door.Outwards.x < ulp mustEqual true
door.Outwards.y mustEqual 1
door.Orientation = Vector3(0, 0, 90) //face East
door.Outwards.x mustEqual 1
door.Outwards.y < ulp mustEqual true
door.Orientation = Vector3(0, 0, 180) //face South
door.Outwards.x < ulp mustEqual true
door.Outwards.y mustEqual -1
door.Orientation = Vector3(0, 0, 270) //face West
door.Outwards.x mustEqual -1
door.Outwards.y < ulp mustEqual true
}
} }
} }
@ -122,7 +101,7 @@ object DoorControlTest {
def SetUpAgents(faction : PlanetSideEmpire.Value)(implicit system : ActorSystem) : (Player, Door) = { def SetUpAgents(faction : PlanetSideEmpire.Value)(implicit system : ActorSystem) : (Player, Door) = {
val door = Door(GlobalDefinitions.door) val door = Door(GlobalDefinitions.door)
door.Actor = system.actorOf(Props(classOf[DoorControl], door), "door") door.Actor = system.actorOf(Props(classOf[DoorControl], door), "door")
door.Owner = new Building(0, Zone.Nowhere, StructureType.Building) door.Owner = new Building(building_guid = 0, map_id = 0, Zone.Nowhere, StructureType.Building)
door.Owner.Faction = faction door.Owner.Faction = faction
(Player(Avatar("test", faction, CharacterGender.Male, 0, CharacterVoice.Mute)), door) (Player(Avatar("test", faction, CharacterGender.Male, 0, CharacterVoice.Mute)), door)
} }

View file

@ -102,7 +102,7 @@ class FacilityTurretControl2Test extends ActorTest {
val obj = FacilityTurret(GlobalDefinitions.manned_turret) val obj = FacilityTurret(GlobalDefinitions.manned_turret)
obj.GUID = PlanetSideGUID(1) obj.GUID = PlanetSideGUID(1)
obj.Actor = system.actorOf(Props(classOf[FacilityTurretControl], obj), "turret-control") obj.Actor = system.actorOf(Props(classOf[FacilityTurretControl], obj), "turret-control")
val bldg = Building(0, Zone.Nowhere, StructureType.Building) val bldg = Building(guid = 0, map_id = 0, Zone.Nowhere, StructureType.Building)
bldg.Amenities = obj bldg.Amenities = obj
bldg.Faction = PlanetSideEmpire.TR bldg.Faction = PlanetSideEmpire.TR
@ -129,7 +129,7 @@ class FacilityTurretControl3Test extends ActorTest {
val obj = FacilityTurret(GlobalDefinitions.manned_turret) val obj = FacilityTurret(GlobalDefinitions.manned_turret)
obj.GUID = PlanetSideGUID(1) obj.GUID = PlanetSideGUID(1)
obj.Actor = system.actorOf(Props(classOf[FacilityTurretControl], obj), "turret-control") obj.Actor = system.actorOf(Props(classOf[FacilityTurretControl], obj), "turret-control")
val bldg = Building(0, Zone.Nowhere, StructureType.Building) val bldg = Building(guid = 0, map_id = 0, Zone.Nowhere, StructureType.Building)
bldg.Amenities = obj bldg.Amenities = obj
"FacilityTurretControl" should { "FacilityTurretControl" should {
@ -157,7 +157,7 @@ class FacilityTurretControl4Test extends ActorTest {
val obj = FacilityTurret(objDef) val obj = FacilityTurret(objDef)
obj.GUID = PlanetSideGUID(1) obj.GUID = PlanetSideGUID(1)
obj.Actor = system.actorOf(Props(classOf[FacilityTurretControl], obj), "turret-control") obj.Actor = system.actorOf(Props(classOf[FacilityTurretControl], obj), "turret-control")
val bldg = Building(0, Zone.Nowhere, StructureType.Building) val bldg = Building(guid = 0, map_id = 0, Zone.Nowhere, StructureType.Building)
bldg.Amenities = obj bldg.Amenities = obj
"FacilityTurretControl" should { "FacilityTurretControl" should {

View file

@ -43,7 +43,7 @@ class FactionAffinityTest extends Specification {
"inherits affinity from owner 2" in { "inherits affinity from owner 2" in {
val obj = new Door(GlobalDefinitions.door) val obj = new Door(GlobalDefinitions.door)
val bldg = new Building(1, Zone.Nowhere, StructureType.Building) val bldg = new Building(building_guid = 0, map_id = 1, Zone.Nowhere, StructureType.Building)
obj.Owner = bldg obj.Owner = bldg
obj.Faction mustEqual PlanetSideEmpire.NEUTRAL obj.Faction mustEqual PlanetSideEmpire.NEUTRAL

View file

@ -9,7 +9,7 @@ import net.psforever.objects.serverobject.locks.{IFFLock, IFFLockControl}
import net.psforever.objects.serverobject.structures.{Building, StructureType} import net.psforever.objects.serverobject.structures.{Building, StructureType}
import net.psforever.objects.zones.Zone import net.psforever.objects.zones.Zone
import net.psforever.packet.game.PlanetSideGUID import net.psforever.packet.game.PlanetSideGUID
import net.psforever.types.{CharacterGender, CharacterVoice, PlanetSideEmpire} import net.psforever.types.{CharacterGender, CharacterVoice, PlanetSideEmpire, Vector3}
import org.specs2.mutable.Specification import org.specs2.mutable.Specification
class IFFLockTest extends Specification { class IFFLockTest extends Specification {
@ -20,6 +20,27 @@ class IFFLockTest extends Specification {
} }
//TODO internal hacking logic will be re-written later //TODO internal hacking logic will be re-written later
"keep track of its orientation as a North-corrected vector" in {
val ulp = math.ulp(1)
val lock = IFFLock(GlobalDefinitions.lock_external)
lock.Orientation = Vector3(0, 0, 0) //face North
lock.Outwards.x < ulp mustEqual true
lock.Outwards.y mustEqual 1
lock.Orientation = Vector3(0, 0, 90) //face East
lock.Outwards.x mustEqual 1
lock.Outwards.y < ulp mustEqual true
lock.Orientation = Vector3(0, 0, 180) //face South
lock.Outwards.x < ulp mustEqual true
lock.Outwards.y mustEqual -1
lock.Orientation = Vector3(0, 0, 270) //face West
lock.Outwards.x mustEqual -1
lock.Outwards.y < ulp mustEqual true
}
} }
} }
@ -68,7 +89,7 @@ object IFFLockControlTest {
def SetUpAgents(faction : PlanetSideEmpire.Value)(implicit system : ActorSystem) : (Player, IFFLock) = { def SetUpAgents(faction : PlanetSideEmpire.Value)(implicit system : ActorSystem) : (Player, IFFLock) = {
val lock = IFFLock(GlobalDefinitions.lock_external) val lock = IFFLock(GlobalDefinitions.lock_external)
lock.Actor = system.actorOf(Props(classOf[IFFLockControl], lock), "lock-control") lock.Actor = system.actorOf(Props(classOf[IFFLockControl], lock), "lock-control")
lock.Owner = new Building(0, Zone.Nowhere, StructureType.Building) lock.Owner = new Building(building_guid = 0, map_id = 0, Zone.Nowhere, StructureType.Building)
lock.Owner.Faction = faction lock.Owner.Faction = faction
(Player(Avatar("test", faction, CharacterGender.Male, 0, CharacterVoice.Mute)), lock) (Player(Avatar("test", faction, CharacterGender.Male, 0, CharacterVoice.Mute)), lock)
} }

View file

@ -111,9 +111,7 @@ class ResourceSiloControlNtuWarningTest extends ActorTest {
obj.GUID = PlanetSideGUID(1) obj.GUID = PlanetSideGUID(1)
obj.Actor = system.actorOf(Props(classOf[ResourceSiloControl], obj), "test-silo") obj.Actor = system.actorOf(Props(classOf[ResourceSiloControl], obj), "test-silo")
obj.Actor ! "startup" obj.Actor ! "startup"
obj.Owner = new Building(0, Zone.Nowhere, StructureType.Building) { obj.Owner = new Building(building_guid = 6, map_id = 0, Zone.Nowhere, StructureType.Building)
ModelId = 6
}
"Resource silo" should { "Resource silo" should {
"announce high ntu" in { "announce high ntu" in {
@ -146,9 +144,7 @@ class ResourceSiloControlUpdate1Test extends ActorTest {
obj.GUID = PlanetSideGUID(1) obj.GUID = PlanetSideGUID(1)
obj.Actor = system.actorOf(Props(classOf[ResourceSiloControl], obj), "test-silo") obj.Actor = system.actorOf(Props(classOf[ResourceSiloControl], obj), "test-silo")
obj.Actor ! "startup" obj.Actor ! "startup"
val bldg = new Building(0, Zone.Nowhere, StructureType.Building) { val bldg = new Building(building_guid = 6, map_id = 0, Zone.Nowhere, StructureType.Building)
ModelId = 6
}
val probe2 = TestProbe() val probe2 = TestProbe()
bldg.Actor = system.actorOf(Props(classOf[ResourceSiloTest.ProbedBuildingControl], probe2), "test-bldg") bldg.Actor = system.actorOf(Props(classOf[ResourceSiloTest.ProbedBuildingControl], probe2), "test-bldg")
obj.Owner = bldg obj.Owner = bldg
@ -215,9 +211,7 @@ class ResourceSiloControlUpdate2Test extends ActorTest {
obj.GUID = PlanetSideGUID(1) obj.GUID = PlanetSideGUID(1)
obj.Actor = system.actorOf(Props(classOf[ResourceSiloControl], obj), "test-silo") obj.Actor = system.actorOf(Props(classOf[ResourceSiloControl], obj), "test-silo")
obj.Actor ! "startup" obj.Actor ! "startup"
val bldg = new Building(0, Zone.Nowhere, StructureType.Building) { val bldg = new Building(building_guid = 6, map_id = 0, Zone.Nowhere, StructureType.Building)
ModelId = 6
}
val probe2 = TestProbe() val probe2 = TestProbe()
bldg.Actor = system.actorOf(Props(classOf[ResourceSiloTest.ProbedBuildingControl], probe2), "test-bldg") bldg.Actor = system.actorOf(Props(classOf[ResourceSiloTest.ProbedBuildingControl], probe2), "test-bldg")
obj.Owner = bldg obj.Owner = bldg
@ -276,9 +270,7 @@ class ResourceSiloControlNoUpdateTest extends ActorTest {
obj.GUID = PlanetSideGUID(1) obj.GUID = PlanetSideGUID(1)
obj.Actor = system.actorOf(Props(classOf[ResourceSiloControl], obj), "test-silo") obj.Actor = system.actorOf(Props(classOf[ResourceSiloControl], obj), "test-silo")
obj.Actor ! "startup" obj.Actor ! "startup"
val bldg = new Building(0, Zone.Nowhere, StructureType.Building) { val bldg = new Building(building_guid = 6, map_id = 6, Zone.Nowhere, StructureType.Building)
ModelId = 6
}
val probe2 = TestProbe() val probe2 = TestProbe()
bldg.Actor = system.actorOf(Props(classOf[ResourceSiloTest.ProbedBuildingControl], probe2), "test-bldg") bldg.Actor = system.actorOf(Props(classOf[ResourceSiloTest.ProbedBuildingControl], probe2), "test-bldg")
obj.Owner = bldg obj.Owner = bldg
@ -298,7 +290,7 @@ class ResourceSiloControlNoUpdateTest extends ActorTest {
expectNoMsg(500 milliseconds) expectNoMsg(500 milliseconds)
probe1.expectNoMsg(500 milliseconds) probe1.expectNoMsg(500 milliseconds)
probe2.expectNoMsg(500 milliseconds) probe2.expectNoMsg(500 milliseconds)
assert(obj.ChargeLevel == 300) assert(obj.ChargeLevel == 299 || obj.ChargeLevel == 300) // Just in case the capacitor level drops while waiting for the message check 299 & 300
assert(obj.CapacitorDisplay == 3) assert(obj.CapacitorDisplay == 3)
assert(obj.LowNtuWarningOn == false) assert(obj.LowNtuWarningOn == false)
} }

View file

@ -16,13 +16,13 @@ import scala.concurrent.duration.Duration
class BuildingBuilderTest extends ActorTest { class BuildingBuilderTest extends ActorTest {
"Building object" should { "Building object" should {
"build" in { "build" in {
val structure : (Int,Zone,ActorContext)=>Building = Building.Structure(StructureType.Building) val structure : (Int,Int,Zone,ActorContext)=>Building = Building.Structure(StructureType.Building)
val actor = system.actorOf(Props(classOf[ServerObjectBuilderTest.BuildingTestActor], structure, 10, Zone.Nowhere), "building") val actor = system.actorOf(Props(classOf[ServerObjectBuilderTest.BuildingTestActor], structure, 10, 10, Zone.Nowhere), "building")
actor ! "!" actor ! "!"
val reply = receiveOne(Duration.create(1000, "ms")) val reply = receiveOne(Duration.create(1000, "ms"))
assert(reply.isInstanceOf[Building]) assert(reply.isInstanceOf[Building])
assert(reply.asInstanceOf[Building].Id == 10) assert(reply.asInstanceOf[Building].MapId == 10)
assert(reply.asInstanceOf[Building].Zone == Zone.Nowhere) assert(reply.asInstanceOf[Building].Zone == Zone.Nowhere)
} }
} }
@ -31,13 +31,13 @@ class BuildingBuilderTest extends ActorTest {
class WarpGateBuilderTest extends ActorTest { class WarpGateBuilderTest extends ActorTest {
"WarpGate object" should { "WarpGate object" should {
"build" in { "build" in {
val structure : (Int,Zone,ActorContext)=>Building = WarpGate.Structure val structure : (Int,Int,Zone,ActorContext)=>Building = WarpGate.Structure
val actor = system.actorOf(Props(classOf[ServerObjectBuilderTest.BuildingTestActor], structure, 10, Zone.Nowhere), "wgate") val actor = system.actorOf(Props(classOf[ServerObjectBuilderTest.BuildingTestActor], structure, 10, 10, Zone.Nowhere), "wgate")
actor ! "!" actor ! "!"
val reply = receiveOne(Duration.create(1000, "ms")) val reply = receiveOne(Duration.create(1000, "ms"))
assert(reply.isInstanceOf[Building]) assert(reply.isInstanceOf[Building])
assert(reply.asInstanceOf[Building].Id == 10) assert(reply.asInstanceOf[Building].MapId == 10)
assert(reply.asInstanceOf[Building].Zone == Zone.Nowhere) assert(reply.asInstanceOf[Building].Zone == Zone.Nowhere)
} }
} }
@ -65,14 +65,12 @@ class DoorObjectBuilderTest2 extends ActorTest {
"Door object" should { "Door object" should {
"build" in { "build" in {
val hub = ServerObjectBuilderTest.NumberPoolHub val hub = ServerObjectBuilderTest.NumberPoolHub
val actor = system.actorOf(Props(classOf[ServerObjectBuilderTest.BuilderTestActor], ServerObjectBuilder(1, Door.Constructor(Vector3(1, 2, 3), Vector3(90, 180, 45))), hub), "door") val actor = system.actorOf(Props(classOf[ServerObjectBuilderTest.BuilderTestActor], ServerObjectBuilder(1, Door.Constructor(Vector3(1, 2, 3))), hub), "door")
actor ! "!" actor ! "!"
val reply = receiveOne(Duration.create(1000, "ms")) val reply = receiveOne(Duration.create(1000, "ms"))
assert(reply.isInstanceOf[Door]) assert(reply.isInstanceOf[Door])
assert(reply.asInstanceOf[Door].Position == Vector3(1, 2, 3)) assert(reply.asInstanceOf[Door].Position == Vector3(1, 2, 3))
assert(reply.asInstanceOf[Door].Orientation == Vector3(90, 180, 45))
assert(reply.asInstanceOf[Door].Outwards == Vector3(0.70710677f, 0.70710677f, 0f))
assert(reply.asInstanceOf[Door].HasGUID) assert(reply.asInstanceOf[Door].HasGUID)
assert(reply.asInstanceOf[Door].GUID == PlanetSideGUID(1)) assert(reply.asInstanceOf[Door].GUID == PlanetSideGUID(1))
assert(reply == hub(1).get) assert(reply == hub(1).get)
@ -85,7 +83,7 @@ class IFFLockObjectBuilderTest extends ActorTest {
"IFFLock object" should { "IFFLock object" should {
"build" in { "build" in {
val hub = ServerObjectBuilderTest.NumberPoolHub val hub = ServerObjectBuilderTest.NumberPoolHub
val actor = system.actorOf(Props(classOf[ServerObjectBuilderTest.BuilderTestActor], ServerObjectBuilder(1, IFFLock.Constructor), hub), "lock") val actor = system.actorOf(Props(classOf[ServerObjectBuilderTest.BuilderTestActor], ServerObjectBuilder(1, IFFLock.Constructor(Vector3(0f, 0f, 0f), Vector3(0f, 0f, 0f))), hub), "lock")
actor ! "!" actor ! "!"
val reply = receiveOne(Duration.create(1000, "ms")) val reply = receiveOne(Duration.create(1000, "ms"))
@ -279,10 +277,10 @@ object ServerObjectBuilderTest {
} }
} }
class BuildingTestActor(structure_con : (Int,Zone,ActorContext)=>Building, building_id : Int, zone : Zone) extends Actor { class BuildingTestActor(structure_con : (Int,Int,Zone,ActorContext)=>Building, building_guid : Int, map_id : Int, zone : Zone) extends Actor {
def receive : Receive = { def receive : Receive = {
case _ => case _ =>
sender ! FoundationBuilder(structure_con).Build(building_id, zone)(context) sender ! FoundationBuilder(structure_con).Build(building_guid, map_id, zone)(context)
} }
} }
} }

View file

@ -339,7 +339,7 @@ object VehicleSpawnPadControlTest {
val pad = VehicleSpawnPad(GlobalDefinitions.spawn_pad) val pad = VehicleSpawnPad(GlobalDefinitions.spawn_pad)
pad.Actor = system.actorOf(Props(classOf[VehicleSpawnControl], pad), s"test-pad-${System.nanoTime()}") pad.Actor = system.actorOf(Props(classOf[VehicleSpawnControl], pad), s"test-pad-${System.nanoTime()}")
pad.Owner = new Building(0, zone, StructureType.Building) pad.Owner = new Building(building_guid = 0, map_id = 0, zone, StructureType.Building)
pad.Owner.Faction = faction pad.Owner.Faction = faction
val player = Player(Avatar("test", faction, CharacterGender.Male, 0, CharacterVoice.Mute)) val player = Player(Avatar("test", faction, CharacterGender.Male, 0, CharacterVoice.Mute))
player.GUID = PlanetSideGUID(10) player.GUID = PlanetSideGUID(10)

View file

@ -22,7 +22,7 @@ import org.specs2.mutable.Specification
import scala.concurrent.duration._ import scala.concurrent.duration._
class ZoneTest extends Specification { class ZoneTest extends Specification {
def test(a: Int, b : Zone, c : ActorContext) : Building = { Building.NoBuilding } def test(a: Int, b: Int, c : Zone, d : ActorContext) : Building = { Building.NoBuilding }
"ZoneMap" should { "ZoneMap" should {
"construct" in { "construct" in {
@ -33,11 +33,11 @@ class ZoneTest extends Specification {
"references bases by a positive building id (defaults to 0)" in { "references bases by a positive building id (defaults to 0)" in {
val map = new ZoneMap("map13") val map = new ZoneMap("map13")
map.LocalBuildings mustEqual Map.empty map.LocalBuildings mustEqual Map.empty
map.LocalBuilding(10, FoundationBuilder(test)) map.LocalBuilding(building_guid = 10, map_id = 0, FoundationBuilder(test))
map.LocalBuildings.keySet.contains(10) mustEqual true map.LocalBuildings.keySet.contains((10, 0)) mustEqual true
map.LocalBuilding(-1, FoundationBuilder(test)) map.LocalBuilding(building_guid = -1, map_id = 0, FoundationBuilder(test))
map.LocalBuildings.keySet.contains(10) mustEqual true map.LocalBuildings.keySet.contains((0, 0)) mustEqual true
map.LocalBuildings.keySet.contains(-1) mustEqual false map.LocalBuildings.keySet.contains((-1, 0)) mustEqual false
} }
"associates objects to bases (doesn't check numbers)" in { "associates objects to bases (doesn't check numbers)" in {
@ -87,7 +87,7 @@ class ZoneTest extends Specification {
} }
val map13 = new ZoneMap("map13") val map13 = new ZoneMap("map13")
map13.LocalBuilding(10, FoundationBuilder(test)) map13.LocalBuilding(building_guid = 0, map_id = 10, FoundationBuilder(test))
class TestObject extends IdentifiableEntity class TestObject extends IdentifiableEntity
"Zone" should { "Zone" should {
@ -172,7 +172,7 @@ class ZoneActorTest extends ActorTest {
"set up spawn groups based on buildings" in { "set up spawn groups based on buildings" in {
val map6 = new ZoneMap("map6") { val map6 = new ZoneMap("map6") {
LocalBuilding(1, FoundationBuilder(Building.Structure(StructureType.Building, Vector3(1,1,1)))) LocalBuilding(building_guid = 1, map_id = 1, FoundationBuilder(Building.Structure(StructureType.Building, Vector3(1,1,1))))
LocalObject(1, SpawnTube.Constructor(Vector3.Zero, Vector3.Zero)) LocalObject(1, SpawnTube.Constructor(Vector3.Zero, Vector3.Zero))
LocalObject(2, Terminal.Constructor(GlobalDefinitions.dropship_vehicle_terminal)) LocalObject(2, Terminal.Constructor(GlobalDefinitions.dropship_vehicle_terminal))
LocalObject(3, SpawnTube.Constructor(Vector3.Zero, Vector3.Zero)) LocalObject(3, SpawnTube.Constructor(Vector3.Zero, Vector3.Zero))
@ -180,11 +180,11 @@ class ZoneActorTest extends ActorTest {
ObjectToBuilding(2, 1) ObjectToBuilding(2, 1)
ObjectToBuilding(3, 1) ObjectToBuilding(3, 1)
LocalBuilding(2, FoundationBuilder(Building.Structure(StructureType.Building))) LocalBuilding(building_guid = 2, map_id = 2, FoundationBuilder(Building.Structure(StructureType.Building)))
LocalObject(7, SpawnTube.Constructor(Vector3.Zero, Vector3.Zero)) LocalObject(7, SpawnTube.Constructor(Vector3.Zero, Vector3.Zero))
ObjectToBuilding(7, 2) ObjectToBuilding(7, 2)
LocalBuilding(3, FoundationBuilder(Building.Structure(StructureType.Building, Vector3(1,1,1)))) LocalBuilding(building_guid = 3, map_id = 3, FoundationBuilder(Building.Structure(StructureType.Building, Vector3(1,1,1))))
LocalObject(4, Terminal.Constructor(GlobalDefinitions.dropship_vehicle_terminal)) LocalObject(4, Terminal.Constructor(GlobalDefinitions.dropship_vehicle_terminal))
LocalObject(5, SpawnTube.Constructor(Vector3.Zero, Vector3.Zero)) LocalObject(5, SpawnTube.Constructor(Vector3.Zero, Vector3.Zero))
LocalObject(6, Terminal.Constructor(GlobalDefinitions.dropship_vehicle_terminal)) LocalObject(6, Terminal.Constructor(GlobalDefinitions.dropship_vehicle_terminal))
@ -200,7 +200,7 @@ class ZoneActorTest extends ActorTest {
val groups = zone.SpawnGroups() val groups = zone.SpawnGroups()
assert(groups.size == 2) assert(groups.size == 2)
zone.SpawnGroups().foreach({ case(building, tubes) => zone.SpawnGroups().foreach({ case(building, tubes) =>
if(building.Id == 1) { if(building.MapId == 1) {
val building1 = zone.SpawnGroups(building) val building1 = zone.SpawnGroups(building)
assert(tubes.length == 2) assert(tubes.length == 2)
assert(tubes.head == building1.head) assert(tubes.head == building1.head)
@ -208,7 +208,7 @@ class ZoneActorTest extends ActorTest {
assert(tubes(1) == building1(1)) assert(tubes(1) == building1(1))
assert(tubes(1).GUID == PlanetSideGUID(3)) assert(tubes(1).GUID == PlanetSideGUID(3))
} }
else if(building.Id == 3) { else if(building.MapId == 3) {
val building2 = zone.SpawnGroups(building) val building2 = zone.SpawnGroups(building)
assert(tubes.length == 1) assert(tubes.length == 1)
assert(tubes.head == building2.head) assert(tubes.head == building2.head)
@ -222,11 +222,11 @@ class ZoneActorTest extends ActorTest {
"select spawn points based on the position of the player in reference to buildings" in { "select spawn points based on the position of the player in reference to buildings" in {
val map6 = new ZoneMap("map6") { val map6 = new ZoneMap("map6") {
LocalBuilding(1, FoundationBuilder(Building.Structure(StructureType.Building, Vector3(1,1,1)))) LocalBuilding(building_guid = 1, map_id = 1, FoundationBuilder(Building.Structure(StructureType.Building, Vector3(1,1,1))))
LocalObject(1, SpawnTube.Constructor(Vector3.Zero, Vector3.Zero)) LocalObject(1, SpawnTube.Constructor(Vector3.Zero, Vector3.Zero))
ObjectToBuilding(1, 1) ObjectToBuilding(1, 1)
LocalBuilding(3, FoundationBuilder(Building.Structure(StructureType.Building, Vector3(4,4,4)))) LocalBuilding(building_guid = 3, map_id = 3, FoundationBuilder(Building.Structure(StructureType.Building, Vector3(4,4,4))))
LocalObject(5, SpawnTube.Constructor(Vector3.Zero, Vector3.Zero)) LocalObject(5, SpawnTube.Constructor(Vector3.Zero, Vector3.Zero))
ObjectToBuilding(5, 3) ObjectToBuilding(5, 3)
} }
@ -255,9 +255,9 @@ class ZoneActorTest extends ActorTest {
"will report if no spawn points have been found in a zone" in { "will report if no spawn points have been found in a zone" in {
val map6 = new ZoneMap("map6") { val map6 = new ZoneMap("map6") {
LocalBuilding(1, FoundationBuilder(Building.Structure(StructureType.Building, Vector3(1,1,1)))) LocalBuilding(building_guid = 1, map_id = 1, FoundationBuilder(Building.Structure(StructureType.Building, Vector3(1,1,1))))
LocalBuilding(3, FoundationBuilder(Building.Structure(StructureType.Tower, Vector3(4,4,4)))) LocalBuilding(building_guid = 3, map_id = 3, FoundationBuilder(Building.Structure(StructureType.Tower, Vector3(4,4,4))))
LocalObject(5, SpawnTube.Constructor(Vector3.Zero, Vector3.Zero)) LocalObject(5, SpawnTube.Constructor(Vector3.Zero, Vector3.Zero))
ObjectToBuilding(5, 3) ObjectToBuilding(5, 3)
} }

View file

@ -161,7 +161,7 @@ object ImplantTerminalMechTest {
val terminal = ImplantTerminalMech(GlobalDefinitions.implant_terminal_mech) val terminal = ImplantTerminalMech(GlobalDefinitions.implant_terminal_mech)
terminal.Actor = system.actorOf(Props(classOf[ImplantTerminalMechControl], terminal), "mech") terminal.Actor = system.actorOf(Props(classOf[ImplantTerminalMechControl], terminal), "mech")
terminal.Owner = new Building(0, Zone.Nowhere, StructureType.Building) terminal.Owner = new Building(building_guid = 0, map_id = 0, Zone.Nowhere, StructureType.Building)
terminal.Owner.Faction = faction terminal.Owner.Faction = faction
terminal.GUID = PlanetSideGUID(1) terminal.GUID = PlanetSideGUID(1)
(Player(Avatar("test", faction, CharacterGender.Male, 0, CharacterVoice.Mute)), terminal) (Player(Avatar("test", faction, CharacterGender.Male, 0, CharacterVoice.Mute)), terminal)

View file

@ -13,7 +13,7 @@ class OrderTerminalTest extends Specification {
val avatar = Avatar("test", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute) val avatar = Avatar("test", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)
val player = Player(avatar) val player = Player(avatar)
val building = new Building(0, Zone.Nowhere, StructureType.Building) val building = new Building(building_guid = 0, map_id = 0, Zone.Nowhere, StructureType.Building)
building.Faction = PlanetSideEmpire.TR building.Faction = PlanetSideEmpire.TR
val infantryTerminal = Terminal(GlobalDefinitions.order_terminal) val infantryTerminal = Terminal(GlobalDefinitions.order_terminal)
infantryTerminal.Owner = building infantryTerminal.Owner = building

View file

@ -109,7 +109,7 @@ class ProximityTerminalControlStartTest extends ActorTest {
AddPool("dynamic", 1 to 10) AddPool("dynamic", 1 to 10)
} }
} }
new Building(0, zone, StructureType.Facility) { new Building(building_guid = 0, map_id = 0, zone, StructureType.Facility) {
Amenities = terminal Amenities = terminal
Faction = PlanetSideEmpire.VS Faction = PlanetSideEmpire.VS
} }
@ -153,7 +153,7 @@ class ProximityTerminalControlTwoUsersTest extends ActorTest {
AddPool("dynamic", 1 to 10) AddPool("dynamic", 1 to 10)
} }
} }
new Building(0, zone, StructureType.Facility) { new Building(building_guid = 0, map_id = 0, zone, StructureType.Facility) {
Amenities = terminal Amenities = terminal
Faction = PlanetSideEmpire.VS Faction = PlanetSideEmpire.VS
} }
@ -205,7 +205,7 @@ class ProximityTerminalControlStopTest extends ActorTest {
AddPool("dynamic", 1 to 10) AddPool("dynamic", 1 to 10)
} }
} }
new Building(0, zone, StructureType.Facility) { new Building(building_guid = 0, map_id = 0, zone, StructureType.Facility) {
Amenities = terminal Amenities = terminal
Faction = PlanetSideEmpire.VS Faction = PlanetSideEmpire.VS
} }
@ -256,7 +256,7 @@ class ProximityTerminalControlNotStopTest extends ActorTest {
AddPool("dynamic", 1 to 10) AddPool("dynamic", 1 to 10)
} }
} }
new Building(0, zone, StructureType.Facility) { new Building(building_guid = 0, map_id = 0, zone, StructureType.Facility) {
Amenities = terminal Amenities = terminal
Faction = PlanetSideEmpire.VS Faction = PlanetSideEmpire.VS
} }

View file

@ -121,7 +121,7 @@ object TerminalControlTest {
def SetUpAgents(tdef : TerminalDefinition, faction : PlanetSideEmpire.Value)(implicit system : ActorSystem) : (Player, Terminal) = { def SetUpAgents(tdef : TerminalDefinition, faction : PlanetSideEmpire.Value)(implicit system : ActorSystem) : (Player, Terminal) = {
val terminal = Terminal(tdef) val terminal = Terminal(tdef)
terminal.Actor = system.actorOf(Props(classOf[TerminalControl], terminal), "test-term") terminal.Actor = system.actorOf(Props(classOf[TerminalControl], terminal), "test-term")
terminal.Owner = new Building(0, Zone.Nowhere, StructureType.Building) terminal.Owner = new Building(building_guid = 0, map_id = 0, Zone.Nowhere, StructureType.Building)
terminal.Owner.Faction = faction terminal.Owner.Faction = faction
(Player(Avatar("test", faction, CharacterGender.Male, 0, CharacterVoice.Mute)), terminal) (Player(Avatar("test", faction, CharacterGender.Male, 0, CharacterVoice.Mute)), terminal)
} }

File diff suppressed because it is too large Load diff

View file

@ -482,8 +482,10 @@ class WorldSessionActor extends Actor with MDCContextAware {
var ori = spawn_tube.Orientation var ori = spawn_tube.Orientation
spawn_tube.Owner match { spawn_tube.Owner match {
case building : Building => case building : Building =>
log.info(s"Zone.Lattice.SpawnPoint: spawn point on $zone_id in building ${building.Id} selected") log.info(s"Zone.Lattice.SpawnPoint: spawn point on $zone_id in building ${building.MapId} selected")
pos = pos + (Vector3(0, 0, 1.5f)) val respawn_z_offset = 1.5f // Offset the spawn tube slightly, so the player doesn't spawn in the floor. This value comes from startup.pak/game_objects.adb.lst -> mb_respawn_tube respawn_z_offset setting
pos += Vector3(0, 0, respawn_z_offset)
ori += Vector3(0, 0, 90f) // Since all spawn tubes seem to have a zero orientation, we need to offset by 90 degrees so the player faces north towards the door, not east.
case vehicle : Vehicle => case vehicle : Vehicle =>
// vehicleService ! VehicleServiceMessage.Decon(RemoverActor.ClearSpecific(List(vehicle), continent)) // vehicleService ! VehicleServiceMessage.Decon(RemoverActor.ClearSpecific(List(vehicle), continent))
// vehicleService ! VehicleServiceMessage.Decon(RemoverActor.AddTask(vehicle, continent, vehicle.Definition.DeconstructionTime)) // vehicleService ! VehicleServiceMessage.Decon(RemoverActor.AddTask(vehicle, continent, vehicle.Definition.DeconstructionTime))
@ -769,7 +771,7 @@ class WorldSessionActor extends Actor with MDCContextAware {
sendResponse(FriendsResponse(FriendAction.InitializeIgnoreList, 0, true, true, Nil)) sendResponse(FriendsResponse(FriendAction.InitializeIgnoreList, 0, true, true, Nil))
avatarService ! Service.Join(avatar.name) //channel will be player.Name avatarService ! Service.Join(avatar.name) //channel will be player.Name
localService ! Service.Join(avatar.name) //channel will be player.Name localService ! Service.Join(avatar.name) //channel will be player.Name
cluster ! InterstellarCluster.GetWorld("z6") cluster ! InterstellarCluster.GetWorld("z4")
case InterstellarCluster.GiveWorld(zoneId, zone) => case InterstellarCluster.GiveWorld(zoneId, zone) =>
log.info(s"Zone $zoneId will now load") log.info(s"Zone $zoneId will now load")
@ -1911,7 +1913,9 @@ class WorldSessionActor extends Actor with MDCContextAware {
} }
case VehicleResponse.DetachFromRails(vehicle_guid, pad_guid, pad_position, pad_orientation_z) => case VehicleResponse.DetachFromRails(vehicle_guid, pad_guid, pad_position, pad_orientation_z) =>
sendResponse(ObjectDetachMessage(pad_guid, vehicle_guid, pad_position + Vector3(0, 0, 0.5f), pad_orientation_z)) //todo: dropship_pad_doors should have a different offset
val vehicle_creation_z_offset = 2.52604f // This value comes from startup.pak/game_objects.adb.lst -> mb_pad_creation vehiclecreationzoffset
sendResponse(ObjectDetachMessage(pad_guid, vehicle_guid, pad_position + Vector3(0, 0, vehicle_creation_z_offset), pad_orientation_z))
case VehicleResponse.EquipmentInSlot(pkt) => case VehicleResponse.EquipmentInSlot(pkt) =>
if(tplayer_guid != guid) { if(tplayer_guid != guid) {
@ -3539,7 +3543,7 @@ class WorldSessionActor extends Actor with MDCContextAware {
// TODO: Not all incoming UseItemMessage's respond with another UseItemMessage (i.e. doors only send out GenericObjectStateMsg) // TODO: Not all incoming UseItemMessage's respond with another UseItemMessage (i.e. doors only send out GenericObjectStateMsg)
continent.GUID(object_guid) match { continent.GUID(object_guid) match {
case Some(door : Door) => case Some(door : Door) =>
if(player.Faction == door.Faction || ((continent.Map.DoorToLock.get(object_guid.guid) match { if(player.Faction == door.Faction || (continent.Map.DoorToLock.get(object_guid.guid) match {
case Some(lock_guid) => case Some(lock_guid) =>
val lock = continent.GUID(lock_guid).get.asInstanceOf[IFFLock] val lock = continent.GUID(lock_guid).get.asInstanceOf[IFFLock]
@ -3550,11 +3554,16 @@ class WorldSessionActor extends Actor with MDCContextAware {
case None => ; case None => ;
} }
// If the IFF lock has been hacked OR the base is neutral OR the base linked to the lock is hacked then open the door val playerIsOnInside = Vector3.ScalarProjection(lock.Outwards, player.Position - door.Position) < 0f
lock.HackedBy.isDefined || baseIsHacked || lock.Faction == PlanetSideEmpire.NEUTRAL
case None => !door.isOpen // If an IFF lock exists and the IFF lock faction doesn't match the current player and one of the following conditions are met open the door:
}) || Vector3.ScalarProjection(door.Outwards, player.Position - door.Position) < 0f)) { // A base is neutral
// We're on the inside of the door - open the door // A base is hacked
// The lock is hacked
// The player is on the inside of the door, determined by the lock orientation
lock.HackedBy.isDefined || baseIsHacked || lock.Faction == PlanetSideEmpire.NEUTRAL || playerIsOnInside
case None => !door.isOpen // If there's no linked IFF lock just open the door if it's closed.
})) {
door.Actor ! Door.Use(player, msg) door.Actor ! Door.Use(player, msg)
} }
else if(door.isOpen) { else if(door.isOpen) {
@ -5974,7 +5983,7 @@ class WorldSessionActor extends Actor with MDCContextAware {
*/ */
def configZone(zone : Zone) : Unit = { def configZone(zone : Zone) : Unit = {
zone.Buildings.values.foreach(building => { zone.Buildings.values.foreach(building => {
sendResponse(SetEmpireMessage(PlanetSideGUID(building.ModelId), building.Faction)) sendResponse(SetEmpireMessage(building.GUID, building.Faction))
building.Amenities.foreach(amenity => { building.Amenities.foreach(amenity => {
val amenityId = amenity.GUID val amenityId = amenity.GUID
sendResponse(PlanetsideAttributeMessage(amenityId, 50, 0)) sendResponse(PlanetsideAttributeMessage(amenityId, 50, 0))

View file

@ -16,38 +16,67 @@ object Zones {
override def Init(implicit context : ActorContext) : Unit = { override def Init(implicit context : ActorContext) : Unit = {
super.Init(context) super.Init(context)
import net.psforever.types.PlanetSideEmpire BuildingByMapId(5).Faction = PlanetSideEmpire.TR //Akkan
Building(5).get.Faction = PlanetSideEmpire.NEUTRAL //Akkan BuildingByMapId(6).Faction = PlanetSideEmpire.TR //Baal
Building(5).get.ModelId = 24 BuildingByMapId(7).Faction = PlanetSideEmpire.TR //Dagon
// Building(6).get.Faction = PlanetSideEmpire.TR //Baal BuildingByMapId(8).Faction = PlanetSideEmpire.NC //Enkidu
// Building(6).get.ModelId = 42 BuildingByMapId(9).Faction = PlanetSideEmpire.VS //Girru
// Building(7).get.Faction = PlanetSideEmpire.TR //Dagon BuildingByMapId(10).Faction = PlanetSideEmpire.VS //Hanish
// Building(7).get.ModelId = 27 BuildingByMapId(11).Faction = PlanetSideEmpire.VS //Irkalla
Building(9).get.Faction = PlanetSideEmpire.NC //Girru BuildingByMapId(12).Faction = PlanetSideEmpire.VS //Kusag
Building(9).get.ModelId = 48 BuildingByMapId(13).Faction = PlanetSideEmpire.VS //Lahar
Building(10).get.Faction = PlanetSideEmpire.TR //Hanish BuildingByMapId(14).Faction = PlanetSideEmpire.NC //Marduk
Building(10).get.ModelId = 30 BuildingByMapId(15).Faction = PlanetSideEmpire.NC //Neti
Building(11).get.Faction = PlanetSideEmpire.VS //Irkalla BuildingByMapId(16).Faction = PlanetSideEmpire.NC //Zaqar
Building(11).get.ModelId = 21 BuildingByMapId(17).Faction = PlanetSideEmpire.NC //S_Marduk_Tower
//// Building(13).get.Faction = PlanetSideEmpire.VS //Lahar BuildingByMapId(18).Faction = PlanetSideEmpire.NC //W_Neti_Tower
Building(25).get.Faction = PlanetSideEmpire.VS //Gate Outpost Watch Tower (North of Forseral Warpgate) BuildingByMapId(19).Faction = PlanetSideEmpire.NC //W_Zaqar_Tower
Building(25).get.ModelId = 74 BuildingByMapId(20).Faction = PlanetSideEmpire.NC //E_Zaqar_Tower
Building(33).get.Faction = PlanetSideEmpire.TR //East Girru Gun Tower BuildingByMapId(21).Faction = PlanetSideEmpire.NC //NE_Neti_Tower
Building(33).get.ModelId = 62 BuildingByMapId(22).Faction = PlanetSideEmpire.NC //SE_Ceryshen_Warpgate_Tower
Building(34).get.Faction = PlanetSideEmpire.TR //SE Hanish Gun Tower BuildingByMapId(23).Faction = PlanetSideEmpire.VS //S_Kusag_Tower
Building(34).get.ModelId = 60 BuildingByMapId(24).Faction = PlanetSideEmpire.VS //NW_Kusag_Tower
Building(35).get.Faction = PlanetSideEmpire.TR //Northeast Akkan Watch tower BuildingByMapId(25).Faction = PlanetSideEmpire.VS //N_Ceryshen_Warpgate_Tower
Building(35).get.ModelId = 69 BuildingByMapId(26).Faction = PlanetSideEmpire.VS //SE_Irkalla_Tower
Building(36).get.Faction = PlanetSideEmpire.VS //West Girru Air Tower BuildingByMapId(27).Faction = PlanetSideEmpire.VS //S_Irkalla_Tower
Building(36).get.ModelId = 83 BuildingByMapId(28).Faction = PlanetSideEmpire.TR //NE_Enkidu_Tower
Building(55).get.Faction = PlanetSideEmpire.NC //South Irkalla Air Tower BuildingByMapId(29).Faction = PlanetSideEmpire.NC //SE_Akkan_Tower
Building(55).get.ModelId = 86 BuildingByMapId(30).Faction = PlanetSideEmpire.NC //SW_Enkidu_Tower
Building(56).get.Faction = PlanetSideEmpire.NC //Southwest Hanish Air Tower BuildingByMapId(31).Faction = PlanetSideEmpire.TR //E_Searhus_Warpgate_Tower
Building(56).get.ModelId = 82 BuildingByMapId(32).Faction = PlanetSideEmpire.TR //N_Searhus_Warpgate_Tower
Building(59).get.Faction = PlanetSideEmpire.NC //Gate Outpost Watch Tower (South of Cyssor Warpgate) BuildingByMapId(33).Faction = PlanetSideEmpire.VS //E_Girru_Tower
Building(59).get.ModelId = 73 BuildingByMapId(34).Faction = PlanetSideEmpire.VS //SE_Hanish_Tower
Building(65).get.Faction = PlanetSideEmpire.TR //West Hanish Gun Tower BuildingByMapId(35).Faction = PlanetSideEmpire.TR //SW_Hanish_Tower
Building(65).get.ModelId = 56 BuildingByMapId(36).Faction = PlanetSideEmpire.VS //W_Girru_Tower
BuildingByMapId(37).Faction = PlanetSideEmpire.TR //E_Dagon_Tower
BuildingByMapId(38).Faction = PlanetSideEmpire.TR //NE_Baal_Tower
BuildingByMapId(39).Faction = PlanetSideEmpire.TR //SE_Baal_Tower
BuildingByMapId(40).Faction = PlanetSideEmpire.TR //S_Dagon_Tower
BuildingByMapId(41).Faction = PlanetSideEmpire.NC //W_Ceryshen_Warpgate_Tower
BuildingByMapId(42).Faction = PlanetSideEmpire.NEUTRAL //dagon bunker
BuildingByMapId(43).Faction = PlanetSideEmpire.NEUTRAL //Akkan North Bunker
BuildingByMapId(44).Faction = PlanetSideEmpire.NEUTRAL //Enkidu East Bunker
BuildingByMapId(45).Faction = PlanetSideEmpire.NEUTRAL //Neti bunker
BuildingByMapId(46).Faction = PlanetSideEmpire.NEUTRAL //Hanish West Bunker
BuildingByMapId(47).Faction = PlanetSideEmpire.NEUTRAL //Irkalla East Bunker
BuildingByMapId(48).Faction = PlanetSideEmpire.NEUTRAL //Zaqar bunker
BuildingByMapId(49).Faction = PlanetSideEmpire.NEUTRAL //Kusag West Bunker
BuildingByMapId(50).Faction = PlanetSideEmpire.NEUTRAL //marduk bunker
BuildingByMapId(51).Faction = PlanetSideEmpire.TR //baal bunker
BuildingByMapId(52).Faction = PlanetSideEmpire.NEUTRAL //girru bunker
BuildingByMapId(53).Faction = PlanetSideEmpire.NEUTRAL //lahar bunker
BuildingByMapId(54).Faction = PlanetSideEmpire.NEUTRAL //akkan bunker
BuildingByMapId(55).Faction = PlanetSideEmpire.VS //Irkalla_Tower
BuildingByMapId(56).Faction = PlanetSideEmpire.VS //Hanish_Tower
BuildingByMapId(57).Faction = PlanetSideEmpire.VS //E_Ceryshen_Warpgate_Tower
BuildingByMapId(58).Faction = PlanetSideEmpire.VS //Lahar_Tower
BuildingByMapId(59).Faction = PlanetSideEmpire.VS //VSSanc_Warpgate_Tower
BuildingByMapId(60).Faction = PlanetSideEmpire.TR //Akkan_Tower
BuildingByMapId(61).Faction = PlanetSideEmpire.NC //TRSanc_Warpgate_Tower
BuildingByMapId(62).Faction = PlanetSideEmpire.NC //Marduk_Tower
BuildingByMapId(63).Faction = PlanetSideEmpire.TR //NW_Dagon_Tower
BuildingByMapId(64).Faction = PlanetSideEmpire.NEUTRAL //E7 East Bunker (at north from bridge)
BuildingByMapId(65).Faction = PlanetSideEmpire.VS //W_Hanish_Tower
} }
} }
@ -58,14 +87,14 @@ object Zones {
super.Init(context) super.Init(context)
import net.psforever.types.PlanetSideEmpire import net.psforever.types.PlanetSideEmpire
Building(2).get.Faction = PlanetSideEmpire.VS // Building(2).get.Faction = PlanetSideEmpire.VS
Building(2).get.ModelId = 20 // Building(2).get.ModelId = 20
Building(38).get.ModelId = 0 // Building(38).get.ModelId = 0
Building(42).get.ModelId = 0 // Building(42).get.ModelId = 0
Building(48).get.Faction = PlanetSideEmpire.VS // Building(48).get.Faction = PlanetSideEmpire.VS
Building(48).get.ModelId = 59 // Building(48).get.ModelId = 59
Building(49).get.Faction = PlanetSideEmpire.VS // Building(49).get.Faction = PlanetSideEmpire.VS
Building(49).get.ModelId = 69 // Building(49).get.ModelId = 69
} }
} }
@ -101,11 +130,11 @@ object Zones {
import net.psforever.types.PlanetSideEmpire import net.psforever.types.PlanetSideEmpire
Buildings.values.foreach { _.Faction = PlanetSideEmpire.VS } Buildings.values.foreach { _.Faction = PlanetSideEmpire.VS }
Building(29).get.Faction = PlanetSideEmpire.NC //South Villa Gun Tower // Building(29).get.Faction = PlanetSideEmpire.NC //South Villa Gun Tower
GUID(293).get.asInstanceOf[VehicleSpawnPad].Railed = false //building 52 // GUID(293).get.asInstanceOf[VehicleSpawnPad].Railed = false //building 52
GUID(706).get.asInstanceOf[VehicleSpawnPad].Guide = List(AutoDriveControls.DistanceFromHere(50f)) //building 77 // GUID(706).get.asInstanceOf[VehicleSpawnPad].Guide = List(AutoDriveControls.DistanceFromHere(50f)) //building 77
GUID(710).get.asInstanceOf[VehicleSpawnPad].Railed = false //building 79 // GUID(710).get.asInstanceOf[VehicleSpawnPad].Railed = false //building 79
GUID(712).get.asInstanceOf[VehicleSpawnPad].Railed = false //building 81 // GUID(712).get.asInstanceOf[VehicleSpawnPad].Railed = false //building 81
} }
} }