Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import akka.actor.Props
import akka.testkit.TestProbe
import base.FreedContextActorTest
import net.psforever.actors.zone.BuildingActor
import net.psforever.actors.zone.building.{FacilityLogic, MajorFacilityLogic}
import net.psforever.objects.avatar.Avatar
import net.psforever.objects.ballistics.Projectile
import net.psforever.objects.guid.NumberPoolHub
Expand Down Expand Up @@ -45,7 +46,7 @@ class AutoRepairFacilityIntegrationTest extends FreedContextActorTest {
override def VehicleEvents = catchall
override def Activity = catchall
}
val building = Building.Structure(StructureType.Facility)(name = "integ-fac-test-building", guid = 6, map_id = 0, zone, context)
val building = Building.Structure(StructureType.Facility, Vector3.Zero, Vector3.Zero, GlobalDefinitions.building, MajorFacilityLogic)(name = "integ-fac-test-building", guid = 6, map_id = 0, zone, context)
building.Invalidate()

val player = Player(Avatar(0, "TestCharacter", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
Expand Down Expand Up @@ -118,7 +119,7 @@ class AutoRepairFacilityIntegrationGiveNtuTest extends FreedContextActorTest {
override def VehicleEvents = catchall
override def Activity = catchall
}
val building = Building.Structure(StructureType.Facility)(name = "integ-fac-test-building", guid = 6, map_id = 0, zone, context)
val building = Building.Structure(StructureType.Facility, Vector3.Zero, Vector3.Zero, GlobalDefinitions.building, MajorFacilityLogic)(name = "integ-fac-test-building", guid = 6, map_id = 0, zone, context)
building.Invalidate()

val terminal = new Terminal(AutoRepairIntegrationTest.terminal_definition)
Expand Down Expand Up @@ -189,7 +190,7 @@ class AutoRepairFacilityIntegrationAntGiveNtuTest extends FreedContextActorTest
GlobalDefinitions.cryo_facility
)
buildingMap += 6 -> building
building.Actor = context.spawn(BuildingActor(zone, building), "integ-fac-test-building-control").toClassic
building.Actor = context.spawn(BuildingActor(zone, building, MajorFacilityLogic), "integ-fac-test-building-control").toClassic
building.Invalidate()

guid.register(player, number = 1)
Expand Down Expand Up @@ -281,7 +282,7 @@ class AutoRepairFacilityIntegrationTerminalDestroyedTerminalAntTest extends Free
GlobalDefinitions.cryo_facility
)
buildingMap += 6 -> building
building.Actor = context.spawn(BuildingActor(zone, building), "integ-fac-test-building-control").toClassic
building.Actor = context.spawn(BuildingActor(zone, building, MajorFacilityLogic), "integ-fac-test-building-control").toClassic
building.Invalidate()

guid.register(player, number = 1)
Expand Down Expand Up @@ -383,7 +384,7 @@ class AutoRepairFacilityIntegrationTerminalIncompleteRepairTest extends FreedCon
GlobalDefinitions.cryo_facility
)
buildingMap += 6 -> building
building.Actor = context.spawn(BuildingActor(zone, building), "integ-fac-test-building-control").toClassic
building.Actor = context.spawn(BuildingActor(zone, building, MajorFacilityLogic), "integ-fac-test-building-control").toClassic
building.Invalidate()

guid.register(player, number = 1)
Expand Down Expand Up @@ -482,7 +483,7 @@ class AutoRepairTowerIntegrationTest extends FreedContextActorTest {
override def VehicleEvents = catchall
override def Activity = catchall
}
val building = Building.Structure(StructureType.Tower)(name = "integ-twr-test-building", guid = 6, map_id = 0, zone, context)
val building = Building.Structure(StructureType.Facility, Vector3.Zero, Vector3.Zero, GlobalDefinitions.building, MajorFacilityLogic)(name = "integ-fac-test-building", guid = 6, map_id = 0, zone, context)
building.Invalidate()

val player = Player(Avatar(0, "TestCharacter", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1569,7 +1569,7 @@ class AvatarActor(
.foreach {
case (item, name) =>
Avatar.purchaseCooldowns.get(item) match {
case Some(cooldown) if session.get.player.IsInVRZone => ()
case Some(cooldown) if session.get.player.Zone.isVR => ()
//don't update purchase timers for players in VR training zones
case Some(cooldown) =>
//only send for items with cooldowns
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ class ChatOperations(
(None, None)
}
(zoneOpt, lockVal) match {
case (Some(zone), Some(lock)) if zone.map.cavern =>
case (Some(zone), Some(lock)) if zone.isACavern =>
//caverns must be rotated in an order
if (lock == 0) {
cluster ! InterstellarClusterService.CavernRotation(CavernRotationService.HurryRotationToZoneUnlock(zone.id))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -425,7 +425,7 @@ class SessionData(
if (obj.spectator && obj != player) {
administrativeKick(player)
} else {
if (obj.IsInVRZone && obj.Faction == player.Faction) {
if (obj.Zone.isVR && obj.Faction == player.Faction) {
//disable self-damage and friendly-fire in VR zones
if (obj.CharId != player.CharId) {
general.trainingGriefWarning()
Expand All @@ -437,7 +437,7 @@ class SessionData(

case obj: AvatarBot if obj.CanDamage && obj.Actor != Default.Actor =>
log.info(s"${player.Name} is attacking ${obj.Name}")
if (obj.IsInVRZone && obj.Faction == player.Faction) {
if (obj.Zone.isVR && obj.Faction == player.Faction) {
//disable friendly-fire in VR zones
general.trainingGriefWarning()
} else {
Expand All @@ -452,7 +452,7 @@ class SessionData(
} else {
log.info(s"$name is attacking $ownerName's ${obj.Definition.Name}")
}
if (obj.IsInVRZone && obj.Faction == player.Faction) {
if (obj.Zone.isVR && obj.Faction == player.Faction) {
//disable self-damage and friendly-fire in VR zones
if (!ownerName.equals(name)) {
general.trainingGriefWarning()
Expand All @@ -462,7 +462,7 @@ class SessionData(
}

case obj: Amenity if obj.CanDamage =>
if (obj.IsInVRZone && obj.Faction == player.Faction) {
if (obj.Zone.isVR && obj.Faction == player.Faction) {
//disable friendly-fire in VR zones
} else {
obj.Actor ! Vitality.Damage(func)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -423,7 +423,7 @@ class WeaponAndProjectileOperations(
} else {
equipment foreach {
case obj: ConstructionItem =>
val certifications = if (player.IsInVRZone) GlobalDefinitions.vrZoneTempEngineeringCerts() else player.avatar.certifications
val certifications = if (player.Zone.isVR) GlobalDefinitions.vrZoneTempEngineeringCerts() else player.avatar.certifications
if (Deployables.performConstructionItemAmmoChange(certifications, obj, obj.AmmoTypeIndex)) {
log.info(
s"${player.Name} switched ${player.Sex.possessive} ${obj.Definition.Name} to construct ${obj.AmmoType} (option #${obj.FireModeIndex})"
Expand Down Expand Up @@ -452,7 +452,7 @@ class WeaponAndProjectileOperations(
val originalModeIndex = obj.FireModeIndex
if (obj match {
case citem: ConstructionItem =>
val certifications = if (player.IsInVRZone) GlobalDefinitions.vrZoneTempEngineeringCerts() else player.avatar.certifications
val certifications = if (player.Zone.isVR) GlobalDefinitions.vrZoneTempEngineeringCerts() else player.avatar.certifications
val modeChanged = Deployables.performConstructionItemFireModeChange(
certifications,
citem,
Expand Down Expand Up @@ -1095,7 +1095,7 @@ class WeaponAndProjectileOperations(

def fireStateStartMountedMessages(itemGuid: PlanetSideGUID): Unit = {
sessionLogic.findContainedEquipment()._1.collect {
case turret: FacilityTurret if continent.map.cavern =>
case turret: FacilityTurret if continent.isACavern =>
turret.Actor ! VanuSentry.ChangeFireStart
}
continent.VehicleEvents ! MessageEnvelope(
Expand Down Expand Up @@ -1136,7 +1136,7 @@ class WeaponAndProjectileOperations(

def fireStateStopMountedMessages(itemGuid: PlanetSideGUID): Unit = {
sessionLogic.findContainedEquipment()._1.collect {
case turret: FacilityTurret if continent.map.cavern =>
case turret: FacilityTurret if continent.isACavern =>
turret.Actor ! VanuSentry.ChangeFireStop
}
continent.VehicleEvents ! MessageEnvelope(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -625,7 +625,7 @@ class ZoningOperations(
//CaptureFlagUpdateMessage()
sendResponse(VanuModuleUpdateMessage(continentNumber, Nil))
sendResponse(ModuleLimitsMessage(255, 15, 3))
val isCavern = zone.map.cavern
val isCavern = zone.isACavern
if (!isCavern) {
sendResponse(ZoneInfoMessage(continentNumber, empire_status = true, 0L))
}
Expand Down Expand Up @@ -1043,7 +1043,7 @@ class ZoningOperations(
def ZoningStartInitialMessageAndTimer(): (Int, String) = {
val location = if (Zones.sanctuaryZoneNumber(player.Faction) == continent.Number) {
Zoning.Time.Sanctuary
} else if (player.IsInVRZone) {
} else if (player.Zone.isVR) {
continent.id match {
case "tzshtr" | "tzdrtr" | "tzcotr" =>
if (player.Faction == PlanetSideEmpire.TR) Zoning.Time.Friendly else Zoning.Time.None
Expand Down Expand Up @@ -1347,7 +1347,7 @@ class ZoningOperations(
ICS.FindZone(_.id.equals(zoneId), context.self)
))
} else if (player.HasGUID) {
if (zoneId.startsWith("tz") || player.IsInVRZone) {
if (zoneId.startsWith("tz") || player.Zone.isVR) {
// reset the players loadout when entering or exiting any VR Training zone
// this is to prevent both entering the VR Driving Area with an ExoSuit too heavy to drive,
// or smuggling special equipment out of the VR Shooting Range
Expand Down Expand Up @@ -2188,7 +2188,7 @@ class ZoningOperations(
_.faction == pfaction
}
val noFriendlyPlayersInZone = friendlyPlayersInZone == 0
if (inZone.map.cavern) {
if (inZone.isACavern) {
enqueueNewActivity(ActivityQueuedTask(
SpawnOperations.sendEventMessage(ChatMsg(ChatMessageType.CMT_QUIT, "@reset_sanctuary_locked")), 20)
) //You have been returned to the sanctuary because the location you logged out is not available.
Expand Down Expand Up @@ -3276,7 +3276,7 @@ class ZoningOperations(
case _ if player.HasGUID => // player is deconstructing self or instant action
val player_guid = player.GUID
// entering or exiting VR zones uses a fade-out effect for the player instead of the usual green cloud deconstruction effect
val effect = if (player.IsInVRZone || zoneId.startsWith("tz")) 2 else 1
val effect = if (player.Zone.isVR || zoneId.startsWith("tz")) 2 else 1
sendResponse(ObjectDeleteMessage(player_guid, unk1=effect))
continent.AvatarEvents ! MessageEnvelope(
continent.id,
Expand Down
14 changes: 2 additions & 12 deletions src/main/scala/net/psforever/actors/zone/BuildingActor.scala
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import akka.actor.typed.scaladsl.{ActorContext, Behaviors, StashBuffer}
import akka.actor.typed.{ActorRef, Behavior, SupervisorStrategy}
import net.psforever.actors.commands.NtuCommand
import net.psforever.actors.zone.building._
import net.psforever.objects.serverobject.structures.{Amenity, Building, StructureType, WarpGate}
import net.psforever.objects.serverobject.structures.{Amenity, Building}
import net.psforever.objects.zones.Zone
import net.psforever.packet.PlanetSideGamePacket
import net.psforever.packet.game.packets.ContinentalLockUpdateMessage
Expand All @@ -27,20 +27,10 @@ final case class BuildingControlDetails(
)

object BuildingActor {
def apply(zone: Zone, building: Building): Behavior[Command] =
def apply(zone: Zone, building: Building, logic: BuildingLogic): Behavior[Command] =
Behaviors
.supervise[Command] {
Behaviors.withStash(capacity = 100) { buffer =>
val logic: BuildingLogic = building match {
case _: WarpGate =>
WarpGateLogic
case _ if zone.map.cavern =>
CavernFacilityLogic
case _ if building.BuildingType == StructureType.Facility =>
MajorFacilityLogic
case _ =>
FacilityLogic
}
Behaviors.setup(context => new BuildingActor(context, buffer, zone, building, logic).start())
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/main/scala/net/psforever/actors/zone/ZoneActor.scala
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,7 @@ class ZoneActor(
)
}
msg.is_hacked match {
case true if building.BuildingType == StructureType.Facility && !zone.map.cavern =>
case true if building.BuildingType == StructureType.Facility && !zone.isACavern =>
zone.LocalEvents ! MessageEnvelope(
zone.id,
SendResponse(PlanetsideAttributeMessage(building.GUID, 67, 0))
Expand All @@ -251,7 +251,7 @@ class ZoneActor(
zone.id,
SendResponse(PlanetsideAttributeMessage(building.GUID, 67, 1))
)
case false if building.BuildingType == StructureType.Facility && !zone.map.cavern && !building.hasCavernLockBenefit =>
case false if building.BuildingType == StructureType.Facility && !zone.isACavern && !building.hasCavernLockBenefit =>
zone.LocalEvents ! MessageEnvelope(
zone.id,
SendResponse(PlanetsideAttributeMessage(building.GUID, 67, 0))
Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/net/psforever/objects/Players.scala
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ object Players {
ExoSuitDefinition.Select(exosuit, player.Faction).Permissions match {
case Nil =>
true
case _ if player.IsInVRZone =>
case _ if player.Zone.isVR =>
true
case permissions if subtype != 0 =>
val certs = player.avatar.certifications
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -416,7 +416,7 @@ class PlayerControl(player: Player, avatarActor: typed.ActorRef[AvatarActor.Comm
}
val hasCavernEquipmentBenefit: Boolean =
terminalOpt.exists { terminal =>
if (terminal.IsInVRZone) {
if (terminal.Zone.isVR) {
true
} else {
terminal.Owner match {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class InteractWithRadiationClouds(
projectiles
.foreach { projectile =>
val shouldDamage = user match {
case Some(player) if (player.IsInVRZone && target.Faction == player.Faction) =>
case Some(player) if (player.Zone.isVR && target.Faction == player.Faction) =>
//disable self-damage and friendly-fire in VR zones
false
case Some(player) =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,6 @@ abstract class PlanetSideServerObject
actor = ActorRef.noSender
out
}

def IsInVRZone: Boolean = Zone.id.startsWith("tz")
}

object PlanetSideServerObject {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import net.psforever.objects.zones.blockmap.BlockMapEntity
import net.psforever.types._
import scalax.collection.{Graph, GraphEdge}
import akka.actor.typed.scaladsl.adapter._
import net.psforever.actors.zone.building.BuildingLogic
import net.psforever.objects.serverobject.dome.ForceDomePhysics
import net.psforever.objects.serverobject.llu.{CaptureFlag, CaptureFlagSocket}
import net.psforever.objects.serverobject.structures.participation.{MajorFacilityHackParticipation, NoParticipation, ParticipationLogic, TowerHackParticipation}
Expand Down Expand Up @@ -444,41 +445,13 @@ object Building {
buildingType: StructureType,
location: Vector3,
rotation: Vector3,
definition: BuildingDefinition
definition: BuildingDefinition,
buildingLogic: BuildingLogic
)(name: String, guid: Int, map_id: Int, zone: Zone, context: ActorContext): Building = {
val obj = new Building(name, guid, map_id, zone, buildingType, definition)
obj.Position = location
obj.Orientation = rotation
obj.Actor = context.spawn(BuildingActor(zone, obj), s"$map_id-$buildingType-building").toClassic
obj
}

def Structure(
buildingType: StructureType,
location: Vector3
)(name: String, guid: Int, map_id: Int, zone: Zone, context: ActorContext): Building = {
val obj = new Building(name, guid, map_id, zone, buildingType, GlobalDefinitions.building)
obj.Position = location
obj.Actor = context.spawn(BuildingActor(zone, obj), s"$map_id-$buildingType-building").toClassic
obj
}

def Structure(
buildingType: StructureType
)(name: String, guid: Int, map_id: Int, zone: Zone, context: ActorContext): Building = {
val obj = new Building(name, guid, map_id, zone, buildingType, GlobalDefinitions.building)
obj.Actor = context.spawn(BuildingActor(zone, obj), s"$map_id-$buildingType-building").toClassic
obj
}

def Structure(
buildingType: StructureType,
buildingDefinition: BuildingDefinition,
location: Vector3
)(name: String, guid: Int, id: Int, zone: Zone, context: ActorContext): Building = {
val obj = new Building(name, guid, id, zone, buildingType, buildingDefinition)
obj.Position = location
obj.Actor = context.spawn(BuildingActor(zone, obj), s"$id-$buildingType-building").toClassic
obj.Actor = context.spawn(BuildingActor(zone, obj, buildingLogic), s"$map_id-$buildingType-building").toClassic
obj
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,12 @@ package net.psforever.objects.serverobject.structures

import akka.actor.ActorContext
import net.psforever.objects.serverobject.PlanetSideServerObject
import net.psforever.objects.{GlobalDefinitions, NtuContainer, SpawnPoint}
import net.psforever.objects.{NtuContainer, SpawnPoint}
import net.psforever.objects.zones.Zone
import net.psforever.types._
import akka.actor.typed.scaladsl.adapter._
import net.psforever.actors.zone.BuildingActor
import net.psforever.actors.zone.building.BuildingLogic
import net.psforever.packet.game.packets.BuildingInfoUpdateMessage

class WarpGate(name: String, building_guid: Int, map_id: Int, zone: Zone, buildingDefinition: WarpGateDefinition)
Expand Down Expand Up @@ -138,28 +139,14 @@ object WarpGate {
new WarpGate(name, guid, map_id, zone, buildingDefinition)
}

def Structure(name: String, guid: Int, map_id: Int, zone: Zone, context: ActorContext): WarpGate = {
val obj = new WarpGate(name, guid, map_id, zone, GlobalDefinitions.warpgate)
obj.Actor = context.spawn(BuildingActor(zone, obj), name = s"$map_id-$guid-gate").toClassic
obj
}

def Structure(
location: Vector3
)(name: String, guid: Int, map_id: Int, zone: Zone, context: ActorContext): WarpGate = {
val obj = new WarpGate(name, guid, map_id, zone, GlobalDefinitions.warpgate)
obj.Position = location
obj.Actor = context.spawn(BuildingActor(zone, obj), name = s"$map_id-$guid-gate").toClassic
obj
}

def Structure(
location: Vector3,
buildingDefinition: WarpGateDefinition
)(name: String, guid: Int, map_id: Int, zone: Zone, context: ActorContext): WarpGate = {
location: Vector3,
buildingDefinition: WarpGateDefinition,
logic: BuildingLogic
)(name: String, guid: Int, map_id: Int, zone: Zone, context: ActorContext): WarpGate = {
val obj = new WarpGate(name, guid, map_id, zone, buildingDefinition)
obj.Position = location
obj.Actor = context.spawn(BuildingActor(zone, obj), name = s"$map_id-$guid-gate").toClassic
obj.Actor = context.spawn(BuildingActor(zone, obj, logic), name = s"$map_id-$guid-gate").toClassic
obj
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ final case class EquipmentPage(stock: Map[String, () => Equipment]) extends Scru
stock.get(msg.item_name) match {
case Some(item) =>
val createdItem = item()
if (!Exclude.exists(_.checkRule(player, msg, createdItem)) || player.IsInVRZone) {
if (!Exclude.exists(_.checkRule(player, msg, createdItem)) || player.Zone.isVR) {
Terminal.BuyEquipment(createdItem)
} else {
Terminal.NoDeal()
Expand Down
Loading
Loading