From 690a1aef017d101c37b541a7c8b625dc1dab4672 Mon Sep 17 00:00:00 2001 From: Fate-JH Date: Wed, 15 Mar 2023 12:23:23 -0400 Subject: [PATCH] rollback of changes to SessionGalaxyHandlers to preserve passenger zoning behavior --- .../support/SessionGalaxyHandlers.scala | 117 +++++++++++++++++- 1 file changed, 116 insertions(+), 1 deletion(-) diff --git a/src/main/scala/net/psforever/actors/session/support/SessionGalaxyHandlers.scala b/src/main/scala/net/psforever/actors/session/support/SessionGalaxyHandlers.scala index 0f0ccdf3f..dc9507092 100644 --- a/src/main/scala/net/psforever/actors/session/support/SessionGalaxyHandlers.scala +++ b/src/main/scala/net/psforever/actors/session/support/SessionGalaxyHandlers.scala @@ -11,6 +11,121 @@ import net.psforever.services.Service import net.psforever.services.galaxy.GalaxyResponse import net.psforever.types.{MemberAction, PlanetSideEmpire} +class SessionGalaxyHandlers( + val sessionData: SessionData, + avatarActor: typed.ActorRef[AvatarActor.Command], + galaxyService: ActorRef, + implicit val context: ActorContext + ) extends CommonSessionInterfacingFunctionality { + def handle(reply: GalaxyResponse.Response): Unit = { + reply match { + case GalaxyResponse.HotSpotUpdate(zone_index, priority, hot_spot_info) => + sendResponse( + HotSpotUpdateMessage( + zone_index, + priority, + hot_spot_info.map { spot => PacketHotSpotInfo(spot.DisplayLocation.x, spot.DisplayLocation.y, 40) } + ) + ) + + case GalaxyResponse.MapUpdate(msg) => + sendResponse(msg) + + case GalaxyResponse.UpdateBroadcastPrivileges(zoneId, gateMapId, fromFactions, toFactions) => + val faction = player.Faction + val from = fromFactions.contains(faction) + val to = toFactions.contains(faction) + if (from && !to) { + sendResponse(BroadcastWarpgateUpdateMessage(zoneId, gateMapId, PlanetSideEmpire.NEUTRAL)) + } else if (!from && to) { + sendResponse(BroadcastWarpgateUpdateMessage(zoneId, gateMapId, faction)) + } + + case GalaxyResponse.FlagMapUpdate(msg) => + sendResponse(msg) + + case GalaxyResponse.TransferPassenger(temp_channel, vehicle, _, manifest) => + val playerName = player.Name + log.debug(s"TransferPassenger: $playerName received the summons to transfer to ${vehicle.Zone.id} ...") + (manifest.passengers.find { _.name.equals(playerName) } match { + case Some(entry) if vehicle.Seats(entry.mount).occupant.isEmpty => + player.VehicleSeated = None + vehicle.Seats(entry.mount).mount(player) + player.VehicleSeated = vehicle.GUID + Some(vehicle) + case Some(entry) if vehicle.Seats(entry.mount).occupant.contains(player) => + Some(vehicle) + case Some(entry) => + log.warn( + s"TransferPassenger: $playerName tried to mount seat ${entry.mount} during summoning, but it was already occupied, and ${player.Sex.pronounSubject} was rebuked" + ) + None + case None => + //log.warn(s"TransferPassenger: $playerName is missing from the manifest of a summoning ${vehicle.Definition.Name} from ${vehicle.Zone.id}") + None + }).orElse { + manifest.cargo.find { _.name.equals(playerName) } match { + case Some(entry) => + vehicle.CargoHolds(entry.mount).occupant match { + case out @ Some(cargo) if cargo.Seats(0).occupants.exists(_.Name.equals(playerName)) => + out + case _ => + None + } + case None => + None + } + } match { + case Some(v: Vehicle) => + galaxyService ! Service.Leave(Some(temp_channel)) //temporary vehicle-specific channel (see above) + sessionData.zoning.spawn.deadState = DeadState.Release + sendResponse(AvatarDeadStateMessage(DeadState.Release, 0, 0, player.Position, player.Faction, unk5=true)) + sessionData.zoning.interstellarFerry = Some(v) //on the other continent and registered to that continent's GUID system + sessionData.zoning.spawn.LoadZonePhysicalSpawnPoint(v.Continent, v.Position, v.Orientation, 1 seconds, None) + case _ => + sessionData.zoning.interstellarFerry match { + case None => + galaxyService ! Service.Leave(Some(temp_channel)) //no longer being transferred between zones + sessionData.zoning.interstellarFerryTopLevelGUID = None + case Some(_) => ; + //wait patiently + } + } + + case GalaxyResponse.LockedZoneUpdate(zone, time) => + sendResponse(ZoneInfoMessage(zone.Number, empire_status=false, lock_time=time)) + + case GalaxyResponse.UnlockedZoneUpdate(zone) => ; + sendResponse(ZoneInfoMessage(zone.Number, empire_status=true, lock_time=0L)) + val popBO = 0 + val popTR = zone.Players.count(_.faction == PlanetSideEmpire.TR) + val popNC = zone.Players.count(_.faction == PlanetSideEmpire.NC) + val popVS = zone.Players.count(_.faction == PlanetSideEmpire.VS) + sendResponse(ZonePopulationUpdateMessage(zone.Number, 414, 138, popTR, 138, popNC, 138, popVS, 138, popBO)) + + case GalaxyResponse.LogStatusChange(name) => + if (avatar.people.friend.exists { _.name.equals(name) }) { + avatarActor ! AvatarActor.MemberListRequest(MemberAction.UpdateFriend, name) + } + + case GalaxyResponse.SendResponse(msg) => + sendResponse(msg) + } + } +} + +/*package net.psforever.actors.session.support + +import akka.actor.{ActorContext, ActorRef, typed} +import scala.concurrent.duration._ +// +import net.psforever.actors.session.AvatarActor +import net.psforever.objects.Vehicle +import net.psforever.packet.game.{AvatarDeadStateMessage, BroadcastWarpgateUpdateMessage, DeadState, HotSpotInfo => PacketHotSpotInfo, HotSpotUpdateMessage, ZoneInfoMessage, ZonePopulationUpdateMessage} +import net.psforever.services.Service +import net.psforever.services.galaxy.GalaxyResponse +import net.psforever.types.{MemberAction, PlanetSideEmpire} + class SessionGalaxyHandlers( val sessionData: SessionData, avatarActor: typed.ActorRef[AvatarActor.Command], @@ -105,4 +220,4 @@ class SessionGalaxyHandlers( case _ => () } } -} +}*/