From d67e09bcbd77117c1e062309d5fdf58246d3ecbd Mon Sep 17 00:00:00 2001 From: Fate-JH Date: Sun, 25 Aug 2024 01:28:11 -0400 Subject: [PATCH] message when player is kicked from orbital shuttle gantry; message when player attempts to bail in a warp gate; message when player attempts to bail from a droppod; stop player from succeeding in bailing from a droppod --- .../actors/session/normal/GeneralLogic.scala | 4 +- .../session/normal/MountHandlerLogic.scala | 73 +++++++++++-------- .../avatar/interaction/WithGantry.scala | 24 ++++-- 3 files changed, 64 insertions(+), 37 deletions(-) diff --git a/src/main/scala/net/psforever/actors/session/normal/GeneralLogic.scala b/src/main/scala/net/psforever/actors/session/normal/GeneralLogic.scala index 7f9c26c89..1a595f09e 100644 --- a/src/main/scala/net/psforever/actors/session/normal/GeneralLogic.scala +++ b/src/main/scala/net/psforever/actors/session/normal/GeneralLogic.scala @@ -120,7 +120,9 @@ class GeneralLogic(val ops: GeneralOperations, implicit val context: ActorContex ops.fallHeightTracker(pos.z) if (isCrouching && !player.Crouching) { //dev stuff goes here - sendResponse(ChatMsg(ChatMessageType.UNK_227, "@NoMount_Permission")) + sendResponse(ChatMsg(ChatMessageType.UNK_228, "@login_reposition_to_sanctuary")) + sendResponse(ChatMsg(ChatMessageType.UNK_229, "@PadDeconstruct_Done")) + //sendResponse(ChatMsg(ChatMessageType.UNK_227, "@NoMount_Permission")) //sendResponse(ChatMsg(ChatMessageType.UNK_227, "@ArmorShieldOff")) //sendResponse(ChatMsg(ChatMessageType.UNK_227, "@ArmorShieldOverride")) } diff --git a/src/main/scala/net/psforever/actors/session/normal/MountHandlerLogic.scala b/src/main/scala/net/psforever/actors/session/normal/MountHandlerLogic.scala index 90a60a2ef..c2f1a8969 100644 --- a/src/main/scala/net/psforever/actors/session/normal/MountHandlerLogic.scala +++ b/src/main/scala/net/psforever/actors/session/normal/MountHandlerLogic.scala @@ -11,6 +11,7 @@ import net.psforever.objects.serverobject.affinity.FactionAffinity import net.psforever.objects.serverobject.environment.interaction.ResetAllEnvironmentInteractions import net.psforever.objects.serverobject.hackable.GenericHackables import net.psforever.objects.serverobject.mount.Mountable +import net.psforever.objects.serverobject.structures.WarpGate import net.psforever.objects.serverobject.terminals.implant.ImplantTerminalMech import net.psforever.objects.serverobject.turret.{FacilityTurret, WeaponTurret} import net.psforever.objects.vehicles.{AccessPermissionGroup, CargoBehavior} @@ -71,18 +72,6 @@ class MountHandlerLogic(val ops: SessionMountHandlers, implicit val context: Act obj.Actor ! Mountable.TryDismount(player, seat_num, bailType) //short-circuit the temporary channel for transferring between zones, the player is no longer doing that sessionLogic.zoning.interstellarFerry = None - // Deconstruct the vehicle if the driver has bailed out and the vehicle is capable of flight - //todo: implement auto landing procedure if the pilot bails but passengers are still present instead of deconstructing the vehicle - //todo: continue flight path until aircraft crashes if no passengers present (or no passenger seats), then deconstruct. - //todo: kick cargo passengers out. To be added after PR #216 is merged - obj match { - case v: Vehicle - if bailType == BailType.Bailed && - v.SeatPermissionGroup(seat_num).contains(AccessPermissionGroup.Driver) && - v.isFlying => - v.Actor ! Vehicle.Deconstruct(None) //immediate deconstruction - case _ => () - } case None => dError(s"DismountVehicleMsg: can not find where player ${player.Name}_guid is seated in mountable ${player.VehicleSeated}", player) @@ -368,18 +357,19 @@ class MountHandlerLogic(val ops: SessionMountHandlers, implicit val context: Act DismountAction(tplayer, obj, seatNum) obj.Actor ! Vehicle.Deconstruct() + case Mountable.CanDismount(obj: Vehicle, seatNum, _) + if tplayer.GUID == player.GUID && + obj.isFlying && + obj.SeatPermissionGroup(seatNum).contains(AccessPermissionGroup.Driver) => + // Deconstruct the vehicle if the driver has bailed out and the vehicle is capable of flight + //todo: implement auto landing procedure if the pilot bails but passengers are still present instead of deconstructing the vehicle + //todo: continue flight path until aircraft crashes if no passengers present (or no passenger seats), then deconstruct. + //todo: kick cargo passengers out. To be added after PR #216 is merged + DismountVehicleAction(tplayer, obj, seatNum) + obj.Actor ! Vehicle.Deconstruct(None) //immediate deconstruction + case Mountable.CanDismount(obj: Vehicle, seatNum, _) if tplayer.GUID == player.GUID => - //disembarking self - log.info(s"${player.Name} dismounts the ${obj.Definition.Name}'s ${ - obj.SeatPermissionGroup(seatNum) match { - case Some(AccessPermissionGroup.Driver) => "driver seat" - case Some(seatType) => s"$seatType seat (#$seatNum)" - case None => "seat" - } - }") - sessionLogic.vehicles.ConditionalDriverVehicleControl(obj) - sessionLogic.general.unaccessContainer(obj) DismountVehicleAction(tplayer, obj, seatNum) case Mountable.CanDismount(obj: Vehicle, seat_num, _) => @@ -388,7 +378,7 @@ class MountHandlerLogic(val ops: SessionMountHandlers, implicit val context: Act VehicleAction.KickPassenger(tplayer.GUID, seat_num, unk2=true, obj.GUID) ) - case Mountable.CanDismount(obj: PlanetSideGameObject with PlanetSideGameObject with Mountable with FactionAffinity with InGameHistory, seatNum, _) => + case Mountable.CanDismount(obj: PlanetSideGameObject with Mountable with FactionAffinity with InGameHistory, seatNum, _) => log.info(s"${tplayer.Name} dismounts a ${obj.Definition.asInstanceOf[ObjectDefinition].Name}") DismountAction(tplayer, obj, seatNum) @@ -410,18 +400,33 @@ class MountHandlerLogic(val ops: SessionMountHandlers, implicit val context: Act case Mountable.CanNotDismount(obj: Vehicle, _, BailType.Normal) if obj.DeploymentState == DriveState.AutoPilot => sendResponse(ChatMsg(ChatMessageType.UNK_224, "@SA_CannotDismountAtThisTime")) - log.warn(s"DismountVehicleMsg: ${tplayer.Name} can not dismount $obj's when in autopilot") + + case Mountable.CanNotDismount(obj: Vehicle, _, BailType.Bailed) + if obj.Definition == GlobalDefinitions.droppod => + sendResponse(ChatMsg(ChatMessageType.UNK_224, "@CannotBailFromDroppod")) case Mountable.CanNotDismount(obj: Vehicle, _, BailType.Bailed) if obj.DeploymentState == DriveState.AutoPilot => - //todo @Vehicle_CannotBailInWarpgateEnvelope sendResponse(ChatMsg(ChatMessageType.UNK_224, "@SA_CannotBailAtThisTime")) - log.warn(s"DismountVehicleMsg: ${tplayer.Name} can not bail from $obj's when in autopilot") - case Mountable.CanNotDismount(obj: Vehicle, seatNum, _) + case Mountable.CanNotDismount(obj: Vehicle, _, BailType.Bailed) + if { + continent + .blockMap + .sector(obj) + .buildingList + .exists { + case wg: WarpGate => + Vector3.DistanceSquared(obj.Position, wg.Position) < math.pow(wg.Definition.SOIRadius, 2) + case _ => + false + } + } => + sendResponse(ChatMsg(ChatMessageType.UNK_227, "@Vehicle_CannotBailInWarpgateEnvelope")) + + case Mountable.CanNotDismount(obj: Vehicle, _, _) if obj.isMoving(test = 1f) => sendResponse(ChatMsg(ChatMessageType.UNK_224, "@TooFastToDismount")) - log.warn(s"DismountVehicleMsg: ${tplayer.Name} attempted to dismount $obj's mount $seatNum, but was moving too fast") case Mountable.CanNotDismount(obj, seatNum, _) => log.warn(s"DismountVehicleMsg: ${tplayer.Name} attempted to dismount $obj's mount $seatNum, but was not allowed") @@ -481,7 +486,17 @@ class MountHandlerLogic(val ops: SessionMountHandlers, implicit val context: Act * @param obj the mountable object * @param seatNum the mount out of which which the player is disembarking */ - private def DismountVehicleAction(tplayer: Player, obj: PlanetSideGameObject with FactionAffinity with InGameHistory, seatNum: Int): Unit = { + private def DismountVehicleAction(tplayer: Player, obj: Vehicle, seatNum: Int): Unit = { + //disembarking self + log.info(s"${player.Name} dismounts the ${obj.Definition.Name}'s ${ + obj.SeatPermissionGroup(seatNum) match { + case Some(AccessPermissionGroup.Driver) => "driver seat" + case Some(seatType) => s"$seatType seat (#$seatNum)" + case None => "seat" + } + }") + sessionLogic.vehicles.ConditionalDriverVehicleControl(obj) + sessionLogic.general.unaccessContainer(obj) DismountAction(tplayer, obj, seatNum) //until vehicles maintain synchronized momentum without a driver obj match { diff --git a/src/main/scala/net/psforever/objects/avatar/interaction/WithGantry.scala b/src/main/scala/net/psforever/objects/avatar/interaction/WithGantry.scala index 5f637e003..35f084055 100644 --- a/src/main/scala/net/psforever/objects/avatar/interaction/WithGantry.scala +++ b/src/main/scala/net/psforever/objects/avatar/interaction/WithGantry.scala @@ -2,14 +2,15 @@ package net.psforever.objects.avatar.interaction import net.psforever.objects.serverobject.environment.interaction.{InteractionWith, RespondsToZoneEnvironment} -import net.psforever.objects.{Vehicle, Vehicles} +import net.psforever.objects.{Player, Vehicle, Vehicles} import net.psforever.objects.serverobject.environment.{EnvironmentAttribute, EnvironmentTrait, GantryDenialField, PieceOfEnvironment, interaction} import net.psforever.objects.serverobject.shuttle.OrbitalShuttlePad import net.psforever.objects.zones.InteractsWithZone -import net.psforever.packet.game.{PlayerStateShiftMessage, ShiftState} +import net.psforever.packet.game.{ChatMsg, PlayerStateShiftMessage, ShiftState} import net.psforever.services.Service import net.psforever.services.avatar.{AvatarAction, AvatarServiceMessage} import net.psforever.services.hart.ShuttleState +import net.psforever.types.ChatMessageType import scala.annotation.unused import scala.concurrent.duration._ @@ -28,17 +29,26 @@ class WithGantry(val channel: String) (zone.GUID(field.obbasemesh) match { case Some(pad : OrbitalShuttlePad) => zone.GUID(pad.shuttle) case _ => None - }) match { - case Some(shuttle: Vehicle) - if shuttle.Flying.contains(ShuttleState.State11.id) || shuttle.Faction != obj.Faction => + }, obj) match { + case (Some(shuttle: Vehicle), player: Player) + if (shuttle.Flying.contains(ShuttleState.State11.id) || shuttle.Faction != player.Faction) && + player.VehicleSeated.isEmpty => val (pos, ang) = Vehicles.dismountShuttle(shuttle, field.mountPoint) - shuttle.Zone.AvatarEvents ! AvatarServiceMessage( + val events = shuttle.Zone.AvatarEvents + events ! AvatarServiceMessage( channel, AvatarAction.SendResponse( Service.defaultPlayerGUID, PlayerStateShiftMessage(ShiftState(0, pos, ang, None))) ) - case Some(_: Vehicle) => + events ! AvatarServiceMessage( + channel, + AvatarAction.SendResponse( + Service.defaultPlayerGUID, + ChatMsg(ChatMessageType.UNK_227, "@Vehicle_OS_PlacedOutsideHallway") + ) + ) + case (Some(_: Vehicle) , _)=> obj.Actor ! RespondsToZoneEnvironment.Timer( attribute, delay = 250 milliseconds,