respawn from death in vehicle no longer sends player to spawn closest to 0,0; BFR control restored to driver after spawn (#1088)

This commit is contained in:
Fate-JH 2023-05-19 09:30:51 -04:00 committed by GitHub
parent 70c4393e9b
commit 7e69181d4a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 48 additions and 67 deletions

View file

@ -425,12 +425,14 @@ class SessionAvatarHandlers(
sessionData.zoning.zoningStatus = Zoning.Status.None sessionData.zoning.zoningStatus = Zoning.Status.None
sessionData.zoning.spawn.deadState = DeadState.Dead sessionData.zoning.spawn.deadState = DeadState.Dead
continent.GUID(mount).collect { case obj: Vehicle => continent.GUID(mount).collect { case obj: Vehicle =>
sessionData.vehicles.DriverVehicleControl(obj) sessionData.vehicles.ConditionalDriverVehicleControl(obj)
sessionData.unaccessContainer(obj) sessionData.unaccessContainer(obj)
} }
sessionData.playerActionsToCancel() sessionData.playerActionsToCancel()
sessionData.terminals.CancelAllProximityUnits() sessionData.terminals.CancelAllProximityUnits()
sessionData.zoning
AvatarActor.savePlayerLocation(player) AvatarActor.savePlayerLocation(player)
sessionData.zoning.spawn.shiftPosition = Some(player.Position)
//respawn //respawn
val respawnTimer = 300.seconds val respawnTimer = 300.seconds

View file

@ -276,7 +276,7 @@ class SessionVehicleHandlers(
lock_wheel=true, lock_wheel=true,
reverse=false, reverse=false,
unk4=false, unk4=false,
lock_vthrust=0, lock_vthrust=1,
lock_strafe=0, lock_strafe=0,
movement_speed=0, movement_speed=0,
unk8=Some(0) unk8=Some(0)

View file

@ -538,7 +538,19 @@ class VehicleOperations(
def ServerVehicleOverrideStop(vehicle: Vehicle): Unit = { def ServerVehicleOverrideStop(vehicle: Vehicle): Unit = {
val vehicleGuid = vehicle.GUID val vehicleGuid = vehicle.GUID
session = session.copy(avatar = avatar.copy(vehicle = Some(vehicleGuid))) session = session.copy(avatar = avatar.copy(vehicle = Some(vehicleGuid)))
sessionData.vehicles.DriverVehicleControl(vehicle, vehicle.Definition.AutoPilotSpeed2) TotalDriverVehicleControlWithPacket(
vehicle,
ServerVehicleOverrideMsg(
lock_accelerator=false,
lock_wheel=false,
reverse=false,
unk4=true,
lock_vthrust=0,
lock_strafe=0,
movement_speed=vehicle.Definition.AutoPilotSpeed2,
unk8=None
)
)
sendResponse(PlanetsideAttributeMessage(vehicleGuid, attribute_type=22, attribute_value=0L)) //mount points on sendResponse(PlanetsideAttributeMessage(vehicleGuid, attribute_type=22, attribute_value=0L)) //mount points on
} }
@ -554,31 +566,6 @@ class VehicleOperations(
sendResponse(pkt) sendResponse(pkt)
} }
/**
* Place the current vehicle under the control of the driver's commands,
* but leave it in a cancellable auto-drive.
* @param vehicle the vehicle
* @param speed how fast the vehicle is moving forward
* @param flight whether the vehicle is ascending or not, if the vehicle is an applicable type
*/
def DriverVehicleControl(vehicle: Vehicle, speed: Int = 0, flight: Int = 0): Unit = {
if (vehicle.DeploymentState == DriveState.AutoPilot) {
TotalDriverVehicleControlWithPacket(
vehicle,
ServerVehicleOverrideMsg(
lock_accelerator=false,
lock_wheel=false,
reverse=false,
unk4=true,
lock_vthrust=flight,
lock_strafe=0,
movement_speed=speed,
unk8=None
)
)
}
}
/** /**
* Place the current vehicle under the control of the driver's commands, * Place the current vehicle under the control of the driver's commands,
* but leave it in a cancellable auto-drive. * but leave it in a cancellable auto-drive.

View file

@ -127,7 +127,7 @@ class ZoningOperations(
spawn.deadState = DeadState.RespawnTime spawn.deadState = DeadState.RespawnTime
cluster ! ICS.GetSpawnPoint( cluster ! ICS.GetSpawnPoint(
destinationZoneGuid.guid, destinationZoneGuid.guid,
player, player.Faction,
destinationBuildingGuid, destinationBuildingGuid,
continent.Number, continent.Number,
building_guid, building_guid,
@ -651,7 +651,8 @@ class ZoningOperations(
zoneReload = true zoneReload = true
cluster ! ICS.GetNearbySpawnPoint( cluster ! ICS.GetNearbySpawnPoint(
zone.Number, zone.Number,
player, player.Faction,
player.Position,
Seq(SpawnGroup.Facility, SpawnGroup.Tower), Seq(SpawnGroup.Facility, SpawnGroup.Tower),
context.self context.self
) )
@ -1668,10 +1669,12 @@ class ZoningOperations(
case _ => case _ =>
zoneNumber zoneNumber
}, },
player, player.Faction,
shiftPosition.getOrElse(player.Position),
Seq(spawnGroup), Seq(spawnGroup),
context.self context.self
) )
shiftPosition = None
} else { } else {
log.warn(s"SpawnRequestMessage: request consumed because ${player.Name} is already respawning ...") log.warn(s"SpawnRequestMessage: request consumed because ${player.Name} is already respawning ...")
} }
@ -1937,7 +1940,8 @@ class ZoningOperations(
//look for different spawn point in same zone //look for different spawn point in same zone
cluster ! ICS.GetNearbySpawnPoint( cluster ! ICS.GetNearbySpawnPoint(
zone.Number, zone.Number,
tplayer, tplayer.Faction,
tplayer.Position,
Seq(SpawnGroup.Facility, SpawnGroup.Tower, SpawnGroup.AMS), Seq(SpawnGroup.Facility, SpawnGroup.Tower, SpawnGroup.AMS),
context.self context.self
) )
@ -1971,7 +1975,8 @@ class ZoningOperations(
//look for different spawn point in same zone //look for different spawn point in same zone
cluster ! ICS.GetNearbySpawnPoint( cluster ! ICS.GetNearbySpawnPoint(
continent.Number, continent.Number,
tplayer, tplayer.Faction,
tplayer.Position,
Seq(SpawnGroup.Facility, SpawnGroup.Tower, SpawnGroup.AMS), Seq(SpawnGroup.Facility, SpawnGroup.Tower, SpawnGroup.AMS),
context.self context.self
) )

View file

@ -358,34 +358,21 @@ class Zone(val id: String, val map: ZoneMap, zoneNumber: Int) {
): List[(AmenityOwner, Iterable[SpawnPoint])] = { ): List[(AmenityOwner, Iterable[SpawnPoint])] = {
val ams = spawnGroups.contains(SpawnGroup.AMS) val ams = spawnGroups.contains(SpawnGroup.AMS)
val structures = spawnGroups.collect { val structures = spawnGroups.collect {
case SpawnGroup.Facility => case SpawnGroup.Facility => StructureType.Facility
StructureType.Facility case SpawnGroup.Tower => StructureType.Tower
case SpawnGroup.Tower => case SpawnGroup.WarpGate => StructureType.WarpGate
StructureType.Tower case SpawnGroup.Sanctuary => StructureType.Building
case SpawnGroup.WarpGate =>
StructureType.WarpGate
case SpawnGroup.Sanctuary =>
StructureType.Building
} }
SpawnGroups() SpawnGroups()
.filter { .collect {
case (building, spawns) => case (building, spawns)
spawns.nonEmpty && if (building match {
spawns.exists(_.isOffline == false) && case warpGate: WarpGate => warpGate.Faction == faction || warpGate.Broadcast(faction)
structures.contains(building.BuildingType) case _ => building.Faction == faction
} }) &&
.filter { structures.contains(building.BuildingType) &&
case (building, _) => spawns.nonEmpty &&
building match { spawns.exists(_.isOffline == false) =>
case warpGate: WarpGate =>
warpGate.Faction == faction || warpGate.Broadcast(faction)
case _ =>
building.Faction == faction
}
}
.map {
case (building, spawns: List[SpawnPoint]) =>
(building, spawns.filter(!_.isOffline)) (building, spawns.filter(!_.isOffline))
} }
.concat( .concat(
@ -406,7 +393,6 @@ class Zone(val id: String, val map: ZoneMap, zoneNumber: Int) {
) )
) )
.toList .toList
} }
def findNearestSpawnPoints( def findNearestSpawnPoints(

View file

@ -6,7 +6,7 @@ import akka.actor.typed.scaladsl.{AbstractBehavior, ActorContext, Behaviors}
import akka.actor.typed.{ActorRef, Behavior, SupervisorStrategy} import akka.actor.typed.{ActorRef, Behavior, SupervisorStrategy}
import net.psforever.actors.zone.ZoneActor import net.psforever.actors.zone.ZoneActor
import net.psforever.objects.avatar.Avatar import net.psforever.objects.avatar.Avatar
import net.psforever.objects.{Player, SpawnPoint, Vehicle} import net.psforever.objects.{SpawnPoint, Vehicle}
import net.psforever.objects.serverobject.structures.{Building, WarpGate} import net.psforever.objects.serverobject.structures.{Building, WarpGate}
import net.psforever.objects.zones.{HotSpotInfo, Zone} import net.psforever.objects.zones.{HotSpotInfo, Zone}
import net.psforever.packet.game.DroppodError import net.psforever.packet.game.DroppodError
@ -51,7 +51,7 @@ object InterstellarClusterService {
final case class GetSpawnPoint( final case class GetSpawnPoint(
zoneNumber: Int, zoneNumber: Int,
player: Player, faction: PlanetSideEmpire.Value,
target: PlanetSideGUID, target: PlanetSideGUID,
fromZoneNumber: Int, fromZoneNumber: Int,
fromGateGuid: PlanetSideGUID, fromGateGuid: PlanetSideGUID,
@ -60,7 +60,8 @@ object InterstellarClusterService {
final case class GetNearbySpawnPoint( final case class GetNearbySpawnPoint(
zoneNumber: Int, zoneNumber: Int,
player: Player, faction: PlanetSideEmpire.Value,
position: Vector3,
spawnGroups: Seq[SpawnGroup], spawnGroups: Seq[SpawnGroup],
replyTo: ActorRef[SpawnPointResponse] replyTo: ActorRef[SpawnPointResponse]
) extends Command ) extends Command
@ -219,11 +220,11 @@ class InterstellarClusterService(context: ActorContext[InterstellarClusterServic
} }
replyTo ! SpawnPointResponse(response) replyTo ! SpawnPointResponse(response)
case GetSpawnPoint(zoneNumber, player, target, fromZoneNumber, fromOriginGuid, replyTo) => case GetSpawnPoint(zoneNumber, faction, target, fromZoneNumber, fromOriginGuid, replyTo) =>
zones.find(_.Number == zoneNumber) match { zones.find(_.Number == zoneNumber) match {
case Some(zone) => case Some(zone) =>
//found target zone; find a spawn point in target zone //found target zone; find a spawn point in target zone
zone.findSpawns(player.Faction, SpawnGroup.values).find { zone.findSpawns(faction, SpawnGroup.values).find {
case (spawn: Building, spawnPoints) => case (spawn: Building, spawnPoints) =>
spawn.MapId == target.guid || spawnPoints.exists(_.GUID == target) spawn.MapId == target.guid || spawnPoints.exists(_.GUID == target)
case (spawn: Vehicle, spawnPoints) => case (spawn: Vehicle, spawnPoints) =>
@ -259,10 +260,10 @@ class InterstellarClusterService(context: ActorContext[InterstellarClusterServic
} }
} }
case GetNearbySpawnPoint(zoneNumber, player, spawnGroups, replyTo) => case GetNearbySpawnPoint(zoneNumber, faction, position, spawnGroups, replyTo) =>
zones.find(_.Number == zoneNumber) match { zones.find(_.Number == zoneNumber) match {
case Some(zone) => case Some(zone) =>
zone.findNearestSpawnPoints(player.Faction, player.Position, spawnGroups) match { zone.findNearestSpawnPoints(faction, position, spawnGroups) match {
case None | Some(Nil) => case None | Some(Nil) =>
replyTo ! SpawnPointResponse(None) replyTo ! SpawnPointResponse(None)
case Some(spawnPoints) => case Some(spawnPoints) =>