replacing *ServiceResponse classes with GenericResponseEnvelope and an identifying stamp in all remaining cases such that the classes are unnecessary for the project and can be deleted; squad remaains untouched due to its difference

This commit is contained in:
Fate-JH 2026-03-08 17:09:02 -04:00
parent cbf6aa5ebb
commit 7e1e0e3016
14 changed files with 74 additions and 93 deletions

View file

@ -75,23 +75,19 @@ ignore:
- "src/main/scala/net/psforever/services/account/StoreIPAddress.scala"
- "src/main/scala/net/psforever/services/avatar/AvatarAction.scala"
- "src/main/scala/net/psforever/services/avatar/AvatarService.scala"
- "src/main/scala/net/psforever/services/avatar/AvatarServiceResponse.scala"
- "src/main/scala/net/psforever/services/base/bus"
- "src/main/scala/net/psforever/services/base/envelope"
- "src/main/scala/net/psforever/services/chat/ChatChannel.scala"
- "src/main/scala/net/psforever/services/galaxy/GalaxyAction"
- "src/main/scala/net/psforever/services/galaxy/GalaxyService"
- "src/main/scala/net/psforever/services/galaxy/GalaxyServiceResponse.scala"
- "src/main/scala/net/psforever/services/hart/HartEvent.scala"
- "src/main/scala/net/psforever/services/hart/HartTimerActions.scala"
- "src/main/scala/net/psforever/services/local/LocalAction"
- "src/main/scala/net/psforever/services/local/LocalService"
- "src/main/scala/net/psforever/services/local/LocalServiceResponse.scala"
- "src/main/scala/net/psforever/services/teamwork/SquadServiceMessage.scala"
- "src/main/scala/net/psforever/services/teamwork/SquadServiceResponse.scala"
- "src/main/scala/net/psforever/services/vehicle/VehicleAction"
- "src/main/scala/net/psforever/services/vehicle/VehicleService"
- "src/main/scala/net/psforever/services/vehicle/VehicleServiceResponse.scala"
- "src/main/scala/net/psforever/services/Service.scala"
- "src/main/scala/net/psforever/types"
- "src/main/scala/net/psforever/util"

View file

@ -12,6 +12,8 @@ import net.psforever.objects.avatar.ModePermissions
import net.psforever.objects.avatar.scoring.{Assist, Death, EquipmentStat, KDAStat, Kill, Life, ScoreCard, SupportActivity}
import net.psforever.objects.sourcing.{TurretSource, VehicleSource}
import net.psforever.packet.game.ImplantAction
import net.psforever.services.avatar.AvatarStamp
import net.psforever.services.base.envelope.GenericResponseEnvelope
import net.psforever.types.{ChatMessageType, StatisticalCategory, StatisticalElement}
import net.psforever.zones.Zones
import org.joda.time.{LocalDateTime, Seconds}
@ -3490,8 +3492,8 @@ class AvatarActor(
value: Int
): Unit = {
import akka.actor.typed.scaladsl.adapter.TypedActorRefOps
import net.psforever.services.avatar.AvatarServiceResponse
sessionActor.toClassic ! AvatarServiceResponse("", guid, AvatarAction.AvatarImplant(action, index, value))
val resp = AvatarAction.AvatarImplant(action, index, value)
sessionActor.toClassic ! GenericResponseEnvelope(AvatarStamp, "", guid, resp)
}
private def buyImplantAction(

View file

@ -12,7 +12,8 @@ import net.psforever.objects.serverobject.containable.ContainableBehavior
import net.psforever.objects.serverobject.mount.Mountable
import net.psforever.objects.vital.RevivingActivity
import net.psforever.packet.game.{AvatarImplantMessage, CreateShortcutMessage, HitHint, ImplantAction}
import net.psforever.services.avatar.{AvatarAction, AvatarServiceResponse}
import net.psforever.services.avatar.{AvatarAction, AvatarStamp}
import net.psforever.services.base.envelope.GenericResponseEnvelope
import net.psforever.services.base.message.{ChangeAmmo, ChangeFireState_Start, ChangeFireState_Stop, ConcealPlayer, EventResponse, GenericObjectAction, HintsAtAttacker, ObjectDelete, PlanetsideAttribute, ReloadTool, SendResponse, SetEmpire, WeaponDryFire}
import net.psforever.types.ImplantType
@ -60,11 +61,11 @@ class AvatarHandlerLogic(val ops: SessionAvatarHandlers, implicit val context: A
/* special messages */
case AvatarAction.TeardownConnection() if player.spectator =>
context.self ! SessionActor.SetMode(CustomerServiceRepresentativeMode)
context.self.forward(AvatarServiceResponse(toChannel, guid, reply))
context.self.forward(GenericResponseEnvelope(AvatarStamp, toChannel, guid, reply))
case AvatarAction.TeardownConnection() =>
context.self ! SessionActor.SetMode(NormalMode)
context.self.forward(AvatarServiceResponse(toChannel, guid, reply))
context.self.forward(GenericResponseEnvelope(AvatarStamp, toChannel, guid, reply))
/* really common messages (very frequently, every life) */
case pstate @ AvatarAction.PlayerState(

View file

@ -14,9 +14,10 @@ import net.psforever.objects.serverobject.pad.VehicleSpawnPad
import net.psforever.packet.game.objectcreate.ObjectCreateMessageParent
import net.psforever.packet.game.{ChangeAmmoMessage, ChangeFireStateMessage_Start, ChangeFireStateMessage_Stop, ChatMsg, ChildObjectStateMessage, DeadState, DeployRequestMessage, DismountVehicleMsg, FrameVehicleStateMessage, GenericObjectActionMessage, HitHint, InventoryStateMessage, ObjectAttachMessage, ObjectCreateDetailedMessage, ObjectCreateMessage, ObjectDeleteMessage, ObjectDetachMessage, PlanetsideAttributeMessage, ReloadMessage, ServerVehicleOverrideMsg, VehicleStateMessage, WeaponDryFireMessage}
import net.psforever.services.Service
import net.psforever.services.base.envelope.GenericResponseEnvelope
import net.psforever.services.base.message.{ChangeAmmo, ChangeFireState_Start, ChangeFireState_Stop, EventResponse, GenericObjectAction, HintsAtAttacker, ObjectDelete, PlanetsideAttribute, ReloadTool, SendResponse, WeaponDryFire}
import net.psforever.services.local.support.CaptureFlagManager
import net.psforever.services.vehicle.{VehicleAction, VehicleServiceResponse}
import net.psforever.services.vehicle.{VehicleAction, VehicleStamp}
import net.psforever.types.{BailType, ChatMessageType, PlanetSideGUID, Vector3}
object VehicleHandlerLogic {
@ -256,11 +257,13 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
)
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._
context.system.scheduler.scheduleOnce(
delay milliseconds,
context.self,
VehicleServiceResponse(toChannel, PlanetSideGUID(0), VehicleAction.KickCargo(vehicle, speed=0, delay))
val resp = GenericResponseEnvelope(
VehicleStamp,
toChannel,
PlanetSideGUID(0),
VehicleAction.KickCargo(vehicle, speed=0, delay)
)
context.system.scheduler.scheduleOnce(delay milliseconds, context.self, resp)
case VehicleAction.KickCargo(cargo, _, _)
if player.VehicleSeated.nonEmpty && sessionLogic.zoning.spawn.deadState == DeadState.Alive =>

View file

@ -8,8 +8,9 @@ import net.psforever.objects.equipment.Equipment
import net.psforever.objects.serverobject.pad.VehicleSpawnPad
import net.psforever.packet.game.objectcreate.ObjectCreateMessageParent
import net.psforever.packet.game.{ChangeAmmoMessage, ChangeFireStateMessage_Start, ChangeFireStateMessage_Stop, ChildObjectStateMessage, DeadState, DeployRequestMessage, DismountVehicleMsg, FrameVehicleStateMessage, GenericObjectActionMessage, InventoryStateMessage, ObjectAttachMessage, ObjectCreateDetailedMessage, ObjectCreateMessage, ObjectDeleteMessage, ObjectDetachMessage, PlanetsideAttributeMessage, ReloadMessage, ServerVehicleOverrideMsg, VehicleStateMessage, WeaponDryFireMessage}
import net.psforever.services.base.envelope.GenericResponseEnvelope
import net.psforever.services.base.message.{ChangeAmmo, ChangeFireState_Start, ChangeFireState_Stop, EventResponse, GenericObjectAction, ObjectDelete, PlanetsideAttribute, ReloadTool, SendResponse, WeaponDryFire}
import net.psforever.services.vehicle.{VehicleAction, VehicleServiceResponse}
import net.psforever.services.vehicle.{VehicleAction, VehicleStamp}
import net.psforever.types.{BailType, PlanetSideGUID, Vector3}
object VehicleHandlerLogic {
@ -205,11 +206,13 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
)
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._
context.system.scheduler.scheduleOnce(
delay milliseconds,
context.self,
VehicleServiceResponse(toChannel, PlanetSideGUID(0), VehicleAction.KickCargo(vehicle, speed=0, delay))
val resp = GenericResponseEnvelope(
VehicleStamp,
toChannel,
PlanetSideGUID(0),
VehicleAction.KickCargo(vehicle, speed=0, delay)
)
context.system.scheduler.scheduleOnce(delay milliseconds, context.self, resp)
case VehicleAction.KickCargo(cargo, _, _)
if player.VehicleSeated.nonEmpty && sessionLogic.zoning.spawn.deadState == DeadState.Alive =>

View file

@ -8,8 +8,8 @@ import net.psforever.objects.sourcing.{PlayerSource, SourceEntry, UniquePlayer}
import net.psforever.packet.game.objectcreate.ConstructorData
import net.psforever.objects.zones.exp
import net.psforever.services.Service
import net.psforever.services.avatar.{AvatarAction, AvatarServiceResponse}
import net.psforever.services.base.envelope.MessageEnvelope
import net.psforever.services.avatar.{AvatarAction, AvatarStamp}
import net.psforever.services.base.envelope.{GenericResponseEnvelope, MessageEnvelope}
import net.psforever.services.base.message.{EventResponse, SendResponse}
import net.psforever.services.chat.OutfitChannel
@ -213,7 +213,8 @@ class SessionAvatarHandlers(
def killedWhileMounted(obj: PlanetSideGameObject with Mountable, playerGuid: PlanetSideGUID): Unit = {
val playerName = player.Name
//boot cadaver from mount on client
context.self ! AvatarServiceResponse(
context.self ! GenericResponseEnvelope(
AvatarStamp,
playerName,
Service.defaultPlayerGUID,
SendResponse(ObjectDetachMessage(obj.GUID, playerGuid, player.Position, Vector3.Zero))

View file

@ -8,9 +8,10 @@ import net.psforever.objects.serverobject.affinity.{FactionAffinity, FactionAffi
import net.psforever.objects.serverobject.locks.IFFLock
import net.psforever.objects.serverobject.structures.PoweredAmenityControl
import net.psforever.services.Service
import net.psforever.services.base.envelope.GenericResponseEnvelope
import net.psforever.services.base.support.SupportActor
import net.psforever.services.local.support.{DoorCloseActor, DoorMessage}
import net.psforever.services.local.{LocalAction, LocalServiceResponse}
import net.psforever.services.local.{LocalAction, LocalStamp}
/**
* An `Actor` that handles messages being dispatched to a specific `Door`.
@ -116,7 +117,8 @@ object DoorControl {
)
} else {
//the door should already open, but the requesting player does not see it as open
replyTo ! LocalServiceResponse(
replyTo ! GenericResponseEnvelope(
LocalStamp,
player.Name,
Service.defaultPlayerGUID,
LocalAction.DoorOpens(door.Zone, door)

View file

@ -12,9 +12,9 @@ import net.psforever.objects.Default
import net.psforever.objects.serverobject.structures.{Building, WarpGate}
import net.psforever.objects.zones.Zone
import net.psforever.packet.game.ChatMsg
import net.psforever.services.base.envelope.MessageEnvelope
import net.psforever.services.base.envelope.{GenericResponseEnvelope, MessageEnvelope}
import net.psforever.services.base.message.SendResponse
import net.psforever.services.galaxy.{GalaxyAction, GalaxyServiceResponse}
import net.psforever.services.galaxy.{GalaxyAction, GalaxyStamp}
import net.psforever.types.ChatMessageType
import net.psforever.util.Config
import net.psforever.zones.Zones
@ -559,14 +559,17 @@ class CavernRotationService(
val (lockedZones, unlockedZones) = managedZones.partition(_.locked)
//borrow GalaxyService response structure, but send to the specific endpoint math.max(0, monitor.start + monitor.duration - curr)
unlockedZones.foreach { monitor =>
sendToSession ! GalaxyServiceResponse("", GalaxyAction.UnlockedZoneUpdate(monitor.zone))
val resp = GalaxyAction.UnlockedZoneUpdate(monitor.zone)
sendToSession ! GenericResponseEnvelope(GalaxyStamp, "", Service.defaultPlayerGUID, resp)
}
val sortedLocked = lockedZones.sortBy(z => z.start)
sortedLocked.take(2).foreach { monitor =>
sendToSession ! GalaxyServiceResponse("", GalaxyAction.LockedZoneUpdate(monitor.zone, math.max(0, monitor.start + monitor.duration - curr)))
val resp = GalaxyAction.LockedZoneUpdate(monitor.zone, math.max(0, monitor.start + monitor.duration - curr))
sendToSession ! GenericResponseEnvelope(GalaxyStamp, "", Service.defaultPlayerGUID, resp)
}
sortedLocked.takeRight(2).foreach { monitor =>
sendToSession ! GalaxyServiceResponse("", GalaxyAction.LockedZoneUpdate(monitor.zone, 0L))
val resp = GalaxyAction.LockedZoneUpdate(monitor.zone, 0L)
sendToSession ! GenericResponseEnvelope(GalaxyStamp, "", Service.defaultPlayerGUID, resp)
}
}

View file

@ -1,15 +0,0 @@
// Copyright (c) 2017 PSForever
package net.psforever.services.avatar
import net.psforever.services.base.message.EventResponse
import net.psforever.types.PlanetSideGUID
import net.psforever.services.base.EventSystemStamp
import net.psforever.services.base.envelope.GenericResponseEnvelope
final case class AvatarServiceResponse(
channel: String,
filter: PlanetSideGUID,
reply: EventResponse
) extends GenericResponseEnvelope {
def stamp: EventSystemStamp = AvatarStamp
}

View file

@ -2,7 +2,7 @@
package net.psforever.services.base.envelope
import net.psforever.services.base.EventSystemStamp
import net.psforever.services.base.message.{EventMessage, EventResponse}
import net.psforever.services.base.message.{EventMessage, EventResponse, SelfRespondingEvent}
import net.psforever.types.PlanetSideGUID
/**
@ -15,7 +15,7 @@ trait GenericResponseEnvelope
/** marker indicating the routing through which the original message was processed */
def stamp: EventSystemStamp
/** channel information tailored to the event system */
def outChannel: String = stamp.routing(channel)
final def outChannel: String = stamp.routing(channel)
}
object GenericResponseEnvelope {
@ -32,6 +32,35 @@ object GenericResponseEnvelope {
envelope.response(stamp)
}
/**
* Fake a response envelope, as if processed by a specific event system.
* @param _stamp marker indicating the routing through which the original message was processed
* @param _channel set of subscribers on an event system bus the envelope should reach
* @param _filter a specific subscriber endpoint to be excluded
* @param _reply input payload transported by this envelope
* @return a faked but typically acceptable response envelope
*/
def apply(_stamp: EventSystemStamp, _channel: String, _filter: PlanetSideGUID, _reply: SelfRespondingEvent): GenericResponseEnvelope = {
apply(_stamp, _channel, _filter, _reply.asInstanceOf[EventResponse])
}
/**
* Fake a response envelope, as if processed by a specific event system.
* @param _stamp marker indicating the routing through which the original message was processed
* @param _channel set of subscribers on an event system bus the envelope should reach
* @param _filter a specific subscriber endpoint to be excluded
* @param _reply input payload transported by this envelope
* @return a faked but typically acceptable response envelope
*/
def apply(_stamp: EventSystemStamp, _channel: String, _filter: PlanetSideGUID, _reply: EventResponse): GenericResponseEnvelope = {
new GenericResponseEnvelope {
def channel: String = _channel
def filter: PlanetSideGUID = _filter
def reply: EventResponse = _reply
def stamp: EventSystemStamp = _stamp
}
}
/**
* The `unapply`ed data from a response envelope resembles the data from includes the filter and the channel information.
* @param obj response envelope

View file

@ -1,15 +0,0 @@
// Copyright (c) 2017 PSForever
package net.psforever.services.galaxy
import net.psforever.types.PlanetSideGUID
import net.psforever.services.Service
import net.psforever.services.base.message.EventResponse
import net.psforever.services.base.EventSystemStamp
import net.psforever.services.base.envelope.GenericResponseEnvelope
final case class GalaxyServiceResponse(channel: String, reply: EventResponse)
extends GenericResponseEnvelope {
def filter: PlanetSideGUID = Service.defaultPlayerGUID
def stamp: EventSystemStamp = GalaxyStamp
}

View file

@ -1,15 +0,0 @@
// Copyright (c) 2017 PSForever
package net.psforever.services.local
import net.psforever.services.base.message.EventResponse
import net.psforever.types.PlanetSideGUID
import net.psforever.services.base.EventSystemStamp
import net.psforever.services.base.envelope.GenericResponseEnvelope
final case class LocalServiceResponse(
channel: String,
filter: PlanetSideGUID,
reply: EventResponse
) extends GenericResponseEnvelope {
def stamp: EventSystemStamp = LocalStamp
}

View file

@ -1,15 +0,0 @@
// Copyright (c) 2017 PSForever
package net.psforever.services.vehicle
import net.psforever.services.base.message.EventResponse
import net.psforever.types.PlanetSideGUID
import net.psforever.services.base.EventSystemStamp
import net.psforever.services.base.envelope.GenericResponseEnvelope
final case class VehicleServiceResponse(
channel: String,
filter: PlanetSideGUID,
reply: EventResponse
) extends GenericResponseEnvelope {
def stamp: EventSystemStamp = VehicleStamp
}

View file

@ -12,8 +12,9 @@ import net.psforever.objects.{Default, GlobalDefinitions, Player}
import net.psforever.objects.serverobject.doors.{Door, DoorControl}
import net.psforever.objects.serverobject.structures.{Building, StructureType}
import net.psforever.objects.zones.{Zone, ZoneMap}
import net.psforever.services.base.envelope.GenericResponseEnvelope
import net.psforever.services.local.support.DoorMessage
import net.psforever.services.local.{LocalAction, LocalServiceResponse}
import net.psforever.services.local.LocalAction
import net.psforever.types._
import org.specs2.mutable.Specification
@ -106,7 +107,7 @@ class DoorControlAlreadyOpenTest extends ActorTest {
door.Actor.tell(CommonMessages.Use(player), probe.ref)
val reply = probe.receiveOne(1000 milliseconds)
assert(reply match {
case LocalServiceResponse("test", _, LocalAction.DoorOpens(_, thisDoor)) => thisDoor eq door
case GenericResponseEnvelope("test", _, LocalAction.DoorOpens(_, thisDoor)) => thisDoor eq door
case _ => false
})
}