mirror of
https://github.com/psforever/PSF-LoginServer.git
synced 2026-07-16 08:55:18 +00:00
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
This commit is contained in:
parent
b3b62c94cc
commit
d67e09bcbd
3 changed files with 64 additions and 37 deletions
|
|
@ -120,7 +120,9 @@ class GeneralLogic(val ops: GeneralOperations, implicit val context: ActorContex
|
||||||
ops.fallHeightTracker(pos.z)
|
ops.fallHeightTracker(pos.z)
|
||||||
if (isCrouching && !player.Crouching) {
|
if (isCrouching && !player.Crouching) {
|
||||||
//dev stuff goes here
|
//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, "@ArmorShieldOff"))
|
||||||
//sendResponse(ChatMsg(ChatMessageType.UNK_227, "@ArmorShieldOverride"))
|
//sendResponse(ChatMsg(ChatMessageType.UNK_227, "@ArmorShieldOverride"))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ import net.psforever.objects.serverobject.affinity.FactionAffinity
|
||||||
import net.psforever.objects.serverobject.environment.interaction.ResetAllEnvironmentInteractions
|
import net.psforever.objects.serverobject.environment.interaction.ResetAllEnvironmentInteractions
|
||||||
import net.psforever.objects.serverobject.hackable.GenericHackables
|
import net.psforever.objects.serverobject.hackable.GenericHackables
|
||||||
import net.psforever.objects.serverobject.mount.Mountable
|
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.terminals.implant.ImplantTerminalMech
|
||||||
import net.psforever.objects.serverobject.turret.{FacilityTurret, WeaponTurret}
|
import net.psforever.objects.serverobject.turret.{FacilityTurret, WeaponTurret}
|
||||||
import net.psforever.objects.vehicles.{AccessPermissionGroup, CargoBehavior}
|
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)
|
obj.Actor ! Mountable.TryDismount(player, seat_num, bailType)
|
||||||
//short-circuit the temporary channel for transferring between zones, the player is no longer doing that
|
//short-circuit the temporary channel for transferring between zones, the player is no longer doing that
|
||||||
sessionLogic.zoning.interstellarFerry = None
|
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 =>
|
case None =>
|
||||||
dError(s"DismountVehicleMsg: can not find where player ${player.Name}_guid is seated in mountable ${player.VehicleSeated}", player)
|
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)
|
DismountAction(tplayer, obj, seatNum)
|
||||||
obj.Actor ! Vehicle.Deconstruct()
|
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, _)
|
case Mountable.CanDismount(obj: Vehicle, seatNum, _)
|
||||||
if tplayer.GUID == player.GUID =>
|
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)
|
DismountVehicleAction(tplayer, obj, seatNum)
|
||||||
|
|
||||||
case Mountable.CanDismount(obj: Vehicle, seat_num, _) =>
|
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)
|
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}")
|
log.info(s"${tplayer.Name} dismounts a ${obj.Definition.asInstanceOf[ObjectDefinition].Name}")
|
||||||
DismountAction(tplayer, obj, seatNum)
|
DismountAction(tplayer, obj, seatNum)
|
||||||
|
|
||||||
|
|
@ -410,18 +400,33 @@ class MountHandlerLogic(val ops: SessionMountHandlers, implicit val context: Act
|
||||||
case Mountable.CanNotDismount(obj: Vehicle, _, BailType.Normal)
|
case Mountable.CanNotDismount(obj: Vehicle, _, BailType.Normal)
|
||||||
if obj.DeploymentState == DriveState.AutoPilot =>
|
if obj.DeploymentState == DriveState.AutoPilot =>
|
||||||
sendResponse(ChatMsg(ChatMessageType.UNK_224, "@SA_CannotDismountAtThisTime"))
|
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)
|
case Mountable.CanNotDismount(obj: Vehicle, _, BailType.Bailed)
|
||||||
if obj.DeploymentState == DriveState.AutoPilot =>
|
if obj.DeploymentState == DriveState.AutoPilot =>
|
||||||
//todo @Vehicle_CannotBailInWarpgateEnvelope
|
|
||||||
sendResponse(ChatMsg(ChatMessageType.UNK_224, "@SA_CannotBailAtThisTime"))
|
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) =>
|
if obj.isMoving(test = 1f) =>
|
||||||
sendResponse(ChatMsg(ChatMessageType.UNK_224, "@TooFastToDismount"))
|
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, _) =>
|
case Mountable.CanNotDismount(obj, seatNum, _) =>
|
||||||
log.warn(s"DismountVehicleMsg: ${tplayer.Name} attempted to dismount $obj's mount $seatNum, but was not allowed")
|
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 obj the mountable object
|
||||||
* @param seatNum the mount out of which which the player is disembarking
|
* @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)
|
DismountAction(tplayer, obj, seatNum)
|
||||||
//until vehicles maintain synchronized momentum without a driver
|
//until vehicles maintain synchronized momentum without a driver
|
||||||
obj match {
|
obj match {
|
||||||
|
|
|
||||||
|
|
@ -2,14 +2,15 @@
|
||||||
package net.psforever.objects.avatar.interaction
|
package net.psforever.objects.avatar.interaction
|
||||||
|
|
||||||
import net.psforever.objects.serverobject.environment.interaction.{InteractionWith, RespondsToZoneEnvironment}
|
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.environment.{EnvironmentAttribute, EnvironmentTrait, GantryDenialField, PieceOfEnvironment, interaction}
|
||||||
import net.psforever.objects.serverobject.shuttle.OrbitalShuttlePad
|
import net.psforever.objects.serverobject.shuttle.OrbitalShuttlePad
|
||||||
import net.psforever.objects.zones.InteractsWithZone
|
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.Service
|
||||||
import net.psforever.services.avatar.{AvatarAction, AvatarServiceMessage}
|
import net.psforever.services.avatar.{AvatarAction, AvatarServiceMessage}
|
||||||
import net.psforever.services.hart.ShuttleState
|
import net.psforever.services.hart.ShuttleState
|
||||||
|
import net.psforever.types.ChatMessageType
|
||||||
|
|
||||||
import scala.annotation.unused
|
import scala.annotation.unused
|
||||||
import scala.concurrent.duration._
|
import scala.concurrent.duration._
|
||||||
|
|
@ -28,17 +29,26 @@ class WithGantry(val channel: String)
|
||||||
(zone.GUID(field.obbasemesh) match {
|
(zone.GUID(field.obbasemesh) match {
|
||||||
case Some(pad : OrbitalShuttlePad) => zone.GUID(pad.shuttle)
|
case Some(pad : OrbitalShuttlePad) => zone.GUID(pad.shuttle)
|
||||||
case _ => None
|
case _ => None
|
||||||
}) match {
|
}, obj) match {
|
||||||
case Some(shuttle: Vehicle)
|
case (Some(shuttle: Vehicle), player: Player)
|
||||||
if shuttle.Flying.contains(ShuttleState.State11.id) || shuttle.Faction != obj.Faction =>
|
if (shuttle.Flying.contains(ShuttleState.State11.id) || shuttle.Faction != player.Faction) &&
|
||||||
|
player.VehicleSeated.isEmpty =>
|
||||||
val (pos, ang) = Vehicles.dismountShuttle(shuttle, field.mountPoint)
|
val (pos, ang) = Vehicles.dismountShuttle(shuttle, field.mountPoint)
|
||||||
shuttle.Zone.AvatarEvents ! AvatarServiceMessage(
|
val events = shuttle.Zone.AvatarEvents
|
||||||
|
events ! AvatarServiceMessage(
|
||||||
channel,
|
channel,
|
||||||
AvatarAction.SendResponse(
|
AvatarAction.SendResponse(
|
||||||
Service.defaultPlayerGUID,
|
Service.defaultPlayerGUID,
|
||||||
PlayerStateShiftMessage(ShiftState(0, pos, ang, None)))
|
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(
|
obj.Actor ! RespondsToZoneEnvironment.Timer(
|
||||||
attribute,
|
attribute,
|
||||||
delay = 250 milliseconds,
|
delay = 250 milliseconds,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue