mirror of
https://github.com/2revoemag/PSF-BotServer.git
synced 2026-07-13 07:24:53 +00:00
Merge pull request #210 from Mazo/feature/VehicleDismountImprovements
Improve vehicle dismounting
This commit is contained in:
commit
5e9edd789d
8 changed files with 77 additions and 41 deletions
|
|
@ -4,16 +4,17 @@ package net.psforever.packet.game
|
||||||
import net.psforever.packet.{GamePacketOpcode, Marshallable, PlanetSideGamePacket}
|
import net.psforever.packet.{GamePacketOpcode, Marshallable, PlanetSideGamePacket}
|
||||||
import scodec.Codec
|
import scodec.Codec
|
||||||
import scodec.codecs._
|
import scodec.codecs._
|
||||||
|
import net.psforever.types.BailType
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Dispatched by the client when the player wishes to get out of a vehicle.
|
* Dispatched by the client when the player wishes to get out of a vehicle.
|
||||||
* @param player_guid the player
|
* @param player_guid the player
|
||||||
* @param unk1 na
|
* @param bailType The dismount action e.g. normal dismount, kicked by owner, bailed
|
||||||
* @param unk2 na
|
* @param unk2 na
|
||||||
*/
|
*/
|
||||||
final case class DismountVehicleMsg(player_guid : PlanetSideGUID,
|
final case class DismountVehicleMsg(player_guid : PlanetSideGUID,
|
||||||
unk1 : Int, //maybe, seat number?
|
bailType : BailType.Value,
|
||||||
unk2 : Boolean) //maybe, bailing?
|
wasKickedByDriver : Boolean) // Seems to be true if a passenger was manually kicked by the vehicle owner
|
||||||
extends PlanetSideGamePacket {
|
extends PlanetSideGamePacket {
|
||||||
type Packet = DismountVehicleMsg
|
type Packet = DismountVehicleMsg
|
||||||
def opcode = GamePacketOpcode.DismountVehicleMsg
|
def opcode = GamePacketOpcode.DismountVehicleMsg
|
||||||
|
|
@ -23,7 +24,7 @@ final case class DismountVehicleMsg(player_guid : PlanetSideGUID,
|
||||||
object DismountVehicleMsg extends Marshallable[DismountVehicleMsg] {
|
object DismountVehicleMsg extends Marshallable[DismountVehicleMsg] {
|
||||||
implicit val codec : Codec[DismountVehicleMsg] = (
|
implicit val codec : Codec[DismountVehicleMsg] = (
|
||||||
("player_guid" | PlanetSideGUID.codec) ::
|
("player_guid" | PlanetSideGUID.codec) ::
|
||||||
("unk1" | uint4L) ::
|
("bailType" | BailType.codec) ::
|
||||||
("unk2" | bool)
|
("wasKickedByDriver" | bool)
|
||||||
).as[DismountVehicleMsg]
|
).as[DismountVehicleMsg]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
15
common/src/main/scala/net/psforever/types/BailType.scala
Normal file
15
common/src/main/scala/net/psforever/types/BailType.scala
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
// Copyright (c) 2017 PSForever
|
||||||
|
package net.psforever.types
|
||||||
|
|
||||||
|
import net.psforever.packet.PacketHelpers
|
||||||
|
import scodec.codecs._
|
||||||
|
|
||||||
|
object BailType extends Enumeration {
|
||||||
|
type Type = Value
|
||||||
|
|
||||||
|
val Normal = Value(0)
|
||||||
|
val Kicked = Value(4) // User was kicked out by vehicle owner or locked from vehicle
|
||||||
|
val Bailed = Value(8) // User bailed out
|
||||||
|
|
||||||
|
implicit val codec = PacketHelpers.createEnumerationCodec(this, uint4L)
|
||||||
|
}
|
||||||
|
|
@ -5,23 +5,24 @@ import org.specs2.mutable._
|
||||||
import net.psforever.packet._
|
import net.psforever.packet._
|
||||||
import net.psforever.packet.game._
|
import net.psforever.packet.game._
|
||||||
import scodec.bits._
|
import scodec.bits._
|
||||||
|
import net.psforever.types.BailType
|
||||||
|
|
||||||
class DismountVehicleMsgTest extends Specification {
|
class DismountVehicleMsgTest extends Specification {
|
||||||
val string = hex"0F C609 00"
|
val string = hex"0F C609 00"
|
||||||
|
|
||||||
"decode" in {
|
"decode" in {
|
||||||
PacketCoding.DecodePacket(string).require match {
|
PacketCoding.DecodePacket(string).require match {
|
||||||
case DismountVehicleMsg(player_guid, unk1, unk2) =>
|
case DismountVehicleMsg(player_guid, bailType, wasKickedByDriver) =>
|
||||||
player_guid mustEqual PlanetSideGUID(2502)
|
player_guid mustEqual PlanetSideGUID(2502)
|
||||||
unk1 mustEqual 0
|
bailType mustEqual BailType.Normal
|
||||||
unk2 mustEqual false
|
wasKickedByDriver mustEqual false
|
||||||
case _ =>
|
case _ =>
|
||||||
ko
|
ko
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
"encode" in {
|
"encode" in {
|
||||||
val msg = DismountVehicleMsg(PlanetSideGUID(2502), 0, false)
|
val msg = DismountVehicleMsg(PlanetSideGUID(2502), BailType.Normal, false)
|
||||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||||
|
|
||||||
pkt mustEqual string
|
pkt mustEqual string
|
||||||
|
|
|
||||||
|
|
@ -174,12 +174,21 @@ class WorldSessionActor extends Actor with MDCContextAware {
|
||||||
* @param player_guid the player
|
* @param player_guid the player
|
||||||
*/
|
*/
|
||||||
def DismountVehicleOnLogOut(vehicle_guid : PlanetSideGUID, player_guid : PlanetSideGUID) : Unit = {
|
def DismountVehicleOnLogOut(vehicle_guid : PlanetSideGUID, player_guid : PlanetSideGUID) : Unit = {
|
||||||
val vehicle = continent.GUID(vehicle_guid).get.asInstanceOf[Vehicle]
|
// Use mountable type instead of Vehicle type to ensure mountables such as implant terminals are correctly dismounted on logout
|
||||||
vehicle.Seat(vehicle.PassengerInSeat(player).get).get.Occupant = None
|
val mountable = continent.GUID(vehicle_guid).get.asInstanceOf[Mountable]
|
||||||
|
mountable.Seat(mountable.PassengerInSeat(player).get).get.Occupant = None
|
||||||
|
|
||||||
|
// If this is a player constructed vehicle then start deconstruction timer
|
||||||
|
// todo: Will base guns implement Vehicle type? Don't want those to deconstruct
|
||||||
|
continent.GUID(vehicle_guid) match {
|
||||||
|
case Some(vehicle : Vehicle) =>
|
||||||
if(vehicle.Seats.values.count(_.isOccupied) == 0) {
|
if(vehicle.Seats.values.count(_.isOccupied) == 0) {
|
||||||
vehicleService ! VehicleServiceMessage.DelayedVehicleDeconstruction(vehicle, continent, 600L) //start vehicle decay (10m)
|
vehicleService ! VehicleServiceMessage.DelayedVehicleDeconstruction(vehicle, continent, 600L) //start vehicle decay (10m)
|
||||||
}
|
}
|
||||||
vehicleService ! Service.Leave(Some(s"${vehicle.Actor}"))
|
case _ => ;
|
||||||
|
}
|
||||||
|
|
||||||
|
vehicleService ! Service.Leave(Some(s"${mountable.Actor}"))
|
||||||
vehicleService ! VehicleServiceMessage(continent.Id, VehicleAction.KickPassenger(player_guid, 0, true, vehicle_guid))
|
vehicleService ! VehicleServiceMessage(continent.Id, VehicleAction.KickPassenger(player_guid, 0, true, vehicle_guid))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -442,9 +451,9 @@ class WorldSessionActor extends Actor with MDCContextAware {
|
||||||
//sendResponse(GenericObjectActionMessage(player_guid, 36))
|
//sendResponse(GenericObjectActionMessage(player_guid, 36))
|
||||||
sendResponse(PlanetsideAttributeMessage(player_guid, 29, 1))
|
sendResponse(PlanetsideAttributeMessage(player_guid, 29, 1))
|
||||||
|
|
||||||
case VehicleResponse.DismountVehicle(unk1, unk2) =>
|
case VehicleResponse.DismountVehicle(bailType, wasKickedByDriver) =>
|
||||||
if(tplayer_guid != guid) {
|
if(tplayer_guid != guid) {
|
||||||
sendResponse(DismountVehicleMsg(guid, unk1, unk2))
|
sendResponse(DismountVehicleMsg(guid, bailType, wasKickedByDriver))
|
||||||
}
|
}
|
||||||
|
|
||||||
case VehicleResponse.DeployRequest(object_guid, state, unk1, unk2, pos) =>
|
case VehicleResponse.DeployRequest(object_guid, state, unk1, unk2, pos) =>
|
||||||
|
|
@ -470,13 +479,10 @@ class WorldSessionActor extends Actor with MDCContextAware {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
case VehicleResponse.InventoryState2(obj_guid, parent_guid, value) =>
|
case msg @ VehicleResponse.KickPassenger(seat_num, wasKickedByDriver, vehicle_guid) =>
|
||||||
if(tplayer_guid != guid) {
|
// seat_num seems to be correct if passenger is kicked manually by driver, but always seems to return 4 if user is kicked by seat permissions
|
||||||
sendResponse(InventoryStateMessage(obj_guid, 0, parent_guid, value))
|
log.info(s"$msg")
|
||||||
}
|
sendResponse(DismountVehicleMsg(guid, BailType.Kicked, wasKickedByDriver))
|
||||||
|
|
||||||
case VehicleResponse.KickPassenger(unk1, unk2, vehicle_guid) =>
|
|
||||||
sendResponse(DismountVehicleMsg(guid, unk1, unk2))
|
|
||||||
if(tplayer_guid == guid) {
|
if(tplayer_guid == guid) {
|
||||||
continent.GUID(vehicle_guid) match {
|
continent.GUID(vehicle_guid) match {
|
||||||
case Some(obj : Vehicle) =>
|
case Some(obj : Vehicle) =>
|
||||||
|
|
@ -485,6 +491,11 @@ class WorldSessionActor extends Actor with MDCContextAware {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case VehicleResponse.InventoryState2(obj_guid, parent_guid, value) =>
|
||||||
|
if(tplayer_guid != guid) {
|
||||||
|
sendResponse(InventoryStateMessage(obj_guid, 0, parent_guid, value))
|
||||||
|
}
|
||||||
|
|
||||||
case VehicleResponse.LoadVehicle(vehicle, vtype, vguid, vdata) =>
|
case VehicleResponse.LoadVehicle(vehicle, vtype, vguid, vdata) =>
|
||||||
//this is not be suitable for vehicles with people who are seated in it before it spawns (if that is possible)
|
//this is not be suitable for vehicles with people who are seated in it before it spawns (if that is possible)
|
||||||
if(tplayer_guid != guid) {
|
if(tplayer_guid != guid) {
|
||||||
|
|
@ -654,8 +665,8 @@ class WorldSessionActor extends Actor with MDCContextAware {
|
||||||
val obj_guid : PlanetSideGUID = obj.GUID
|
val obj_guid : PlanetSideGUID = obj.GUID
|
||||||
val player_guid : PlanetSideGUID = tplayer.GUID
|
val player_guid : PlanetSideGUID = tplayer.GUID
|
||||||
log.info(s"DismountVehicleMsg: $player_guid dismounts $obj @ $seat_num")
|
log.info(s"DismountVehicleMsg: $player_guid dismounts $obj @ $seat_num")
|
||||||
sendResponse(DismountVehicleMsg(player_guid, seat_num, false))
|
sendResponse(DismountVehicleMsg(player_guid, BailType.Normal, false))
|
||||||
vehicleService ! VehicleServiceMessage(continent.Id, VehicleAction.DismountVehicle(player_guid, seat_num, false))
|
vehicleService ! VehicleServiceMessage(continent.Id, VehicleAction.DismountVehicle(player_guid, BailType.Normal, false))
|
||||||
|
|
||||||
case Mountable.CanDismount(obj : Vehicle, seat_num) =>
|
case Mountable.CanDismount(obj : Vehicle, seat_num) =>
|
||||||
val player_guid : PlanetSideGUID = tplayer.GUID
|
val player_guid : PlanetSideGUID = tplayer.GUID
|
||||||
|
|
@ -663,8 +674,8 @@ class WorldSessionActor extends Actor with MDCContextAware {
|
||||||
//disembarking self
|
//disembarking self
|
||||||
log.info(s"DismountVehicleMsg: $player_guid dismounts $obj @ $seat_num")
|
log.info(s"DismountVehicleMsg: $player_guid dismounts $obj @ $seat_num")
|
||||||
TotalDriverVehicleControl(obj)
|
TotalDriverVehicleControl(obj)
|
||||||
sendResponse(DismountVehicleMsg(player_guid, seat_num, false))
|
sendResponse(DismountVehicleMsg(player_guid, BailType.Normal, false))
|
||||||
vehicleService ! VehicleServiceMessage(continent.Id, VehicleAction.DismountVehicle(player_guid, seat_num, false))
|
vehicleService ! VehicleServiceMessage(continent.Id, VehicleAction.DismountVehicle(player_guid, BailType.Normal, false))
|
||||||
UnAccessContents(obj)
|
UnAccessContents(obj)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
@ -1715,7 +1726,7 @@ class WorldSessionActor extends Actor with MDCContextAware {
|
||||||
val player_guid = player.GUID
|
val player_guid = player.GUID
|
||||||
sendResponse(ObjectDeleteMessage(player_guid, 0))
|
sendResponse(ObjectDeleteMessage(player_guid, 0))
|
||||||
avatarService ! AvatarServiceMessage(continent.Id, AvatarAction.ObjectDelete(player_guid, player_guid, 0))
|
avatarService ! AvatarServiceMessage(continent.Id, AvatarAction.ObjectDelete(player_guid, player_guid, 0))
|
||||||
self ! PacketCoding.CreateGamePacket(0, DismountVehicleMsg(player_guid, 0, true)) //let vehicle try to clean up its fields
|
self ! PacketCoding.CreateGamePacket(0, DismountVehicleMsg(player_guid, BailType.Normal, true)) //let vehicle try to clean up its fields
|
||||||
|
|
||||||
import scala.concurrent.duration._
|
import scala.concurrent.duration._
|
||||||
import scala.concurrent.ExecutionContext.Implicits.global
|
import scala.concurrent.ExecutionContext.Implicits.global
|
||||||
|
|
@ -2546,21 +2557,21 @@ class WorldSessionActor extends Actor with MDCContextAware {
|
||||||
case msg @ WarpgateRequest(continent_guid, building_guid, dest_building_guid, dest_continent_guid, unk1, unk2) =>
|
case msg @ WarpgateRequest(continent_guid, building_guid, dest_building_guid, dest_continent_guid, unk1, unk2) =>
|
||||||
log.info("WarpgateRequest: " + msg)
|
log.info("WarpgateRequest: " + msg)
|
||||||
|
|
||||||
case msg @ MountVehicleMsg(player_guid, mountable_guid, unk) =>
|
case msg @ MountVehicleMsg(player_guid, mountable_guid, entry_point) =>
|
||||||
log.info("MountVehicleMsg: "+msg)
|
log.info("MountVehicleMsg: "+msg)
|
||||||
continent.GUID(mountable_guid) match {
|
continent.GUID(mountable_guid) match {
|
||||||
case Some(obj : Mountable) =>
|
case Some(obj : Mountable) =>
|
||||||
obj.GetSeatFromMountPoint(unk) match {
|
obj.GetSeatFromMountPoint(entry_point) match {
|
||||||
case Some(seat_num) =>
|
case Some(seat_num) =>
|
||||||
obj.Actor ! Mountable.TryMount(player, seat_num)
|
obj.Actor ! Mountable.TryMount(player, seat_num)
|
||||||
case None =>
|
case None =>
|
||||||
log.warn(s"MountVehicleMsg: attempted to board mountable $mountable_guid's seat $unk, but no seat exists there")
|
log.warn(s"MountVehicleMsg: attempted to board mountable $mountable_guid's seat $entry_point, but no seat exists there")
|
||||||
}
|
}
|
||||||
case None | Some(_) =>
|
case None | Some(_) =>
|
||||||
log.warn(s"MountVehicleMsg: not a mountable thing")
|
log.warn(s"MountVehicleMsg: not a mountable thing")
|
||||||
}
|
}
|
||||||
|
|
||||||
case msg @ DismountVehicleMsg(player_guid, unk1, unk2) =>
|
case msg @ DismountVehicleMsg(player_guid, bailType, wasKickedByDriver) =>
|
||||||
//TODO optimize this later
|
//TODO optimize this later
|
||||||
log.info(s"DismountVehicleMsg: $msg")
|
log.info(s"DismountVehicleMsg: $msg")
|
||||||
//common warning for this section
|
//common warning for this section
|
||||||
|
|
@ -2576,6 +2587,14 @@ class WorldSessionActor extends Actor with MDCContextAware {
|
||||||
obj.PassengerInSeat(player) match {
|
obj.PassengerInSeat(player) match {
|
||||||
case Some(seat_num : Int) =>
|
case Some(seat_num : Int) =>
|
||||||
obj.Actor ! Mountable.TryDismount(player, seat_num)
|
obj.Actor ! Mountable.TryDismount(player, seat_num)
|
||||||
|
|
||||||
|
// 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.
|
||||||
|
if(bailType == BailType.Bailed && seat_num == 0 && GlobalDefinitions.isFlightVehicle(obj.asInstanceOf[Vehicle].Definition)) {
|
||||||
|
vehicleService ! VehicleServiceMessage.DelayedVehicleDeconstruction(obj.asInstanceOf[Vehicle], continent, 0L) // Immediately deconstruct vehicle
|
||||||
|
}
|
||||||
|
|
||||||
case None =>
|
case None =>
|
||||||
dismountWarning(s"DismountVehicleMsg: can not find where player $player_guid is seated in mountable $obj_guid")
|
dismountWarning(s"DismountVehicleMsg: can not find where player $player_guid is seated in mountable $obj_guid")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ import net.psforever.objects.equipment.Equipment
|
||||||
import net.psforever.objects.zones.Zone
|
import net.psforever.objects.zones.Zone
|
||||||
import net.psforever.packet.game.PlanetSideGUID
|
import net.psforever.packet.game.PlanetSideGUID
|
||||||
import net.psforever.packet.game.objectcreate.ConstructorData
|
import net.psforever.packet.game.objectcreate.ConstructorData
|
||||||
import net.psforever.types.{DriveState, Vector3}
|
import net.psforever.types.{DriveState, Vector3, BailType}
|
||||||
|
|
||||||
object VehicleAction {
|
object VehicleAction {
|
||||||
trait Action
|
trait Action
|
||||||
|
|
@ -14,7 +14,7 @@ object VehicleAction {
|
||||||
final case class Awareness(player_guid : PlanetSideGUID, vehicle_guid : PlanetSideGUID) extends Action
|
final case class Awareness(player_guid : PlanetSideGUID, vehicle_guid : PlanetSideGUID) extends Action
|
||||||
final case class ChildObjectState(player_guid : PlanetSideGUID, object_guid : PlanetSideGUID, pitch : Float, yaw : Float) extends Action
|
final case class ChildObjectState(player_guid : PlanetSideGUID, object_guid : PlanetSideGUID, pitch : Float, yaw : Float) extends Action
|
||||||
final case class DeployRequest(player_guid : PlanetSideGUID, object_guid : PlanetSideGUID, state : DriveState.Value, unk1 : Int, unk2 : Boolean, pos : Vector3) extends Action
|
final case class DeployRequest(player_guid : PlanetSideGUID, object_guid : PlanetSideGUID, state : DriveState.Value, unk1 : Int, unk2 : Boolean, pos : Vector3) extends Action
|
||||||
final case class DismountVehicle(player_guid : PlanetSideGUID, unk1 : Int, unk2 : Boolean) extends Action
|
final case class DismountVehicle(player_guid : PlanetSideGUID, bailType : BailType.Value, unk2 : Boolean) extends Action
|
||||||
final case class InventoryState(player_guid : PlanetSideGUID, obj : PlanetSideGameObject, parent_guid : PlanetSideGUID, start : Int, con_data : ConstructorData) extends Action
|
final case class InventoryState(player_guid : PlanetSideGUID, obj : PlanetSideGameObject, parent_guid : PlanetSideGUID, start : Int, con_data : ConstructorData) extends Action
|
||||||
final case class InventoryState2(player_guid : PlanetSideGUID, obj_guid : PlanetSideGUID, parent_guid : PlanetSideGUID, value : Int) extends Action
|
final case class InventoryState2(player_guid : PlanetSideGUID, obj_guid : PlanetSideGUID, parent_guid : PlanetSideGUID, value : Int) extends Action
|
||||||
final case class KickPassenger(player_guid : PlanetSideGUID, unk1 : Int, unk2 : Boolean, vehicle_guid : PlanetSideGUID) extends Action
|
final case class KickPassenger(player_guid : PlanetSideGUID, unk1 : Int, unk2 : Boolean, vehicle_guid : PlanetSideGUID) extends Action
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ package services.vehicle
|
||||||
import net.psforever.objects.{PlanetSideGameObject, Vehicle}
|
import net.psforever.objects.{PlanetSideGameObject, Vehicle}
|
||||||
import net.psforever.packet.game.PlanetSideGUID
|
import net.psforever.packet.game.PlanetSideGUID
|
||||||
import net.psforever.packet.game.objectcreate.ConstructorData
|
import net.psforever.packet.game.objectcreate.ConstructorData
|
||||||
import net.psforever.types.{DriveState, Vector3}
|
import net.psforever.types.{DriveState, Vector3, BailType}
|
||||||
|
|
||||||
object VehicleResponse {
|
object VehicleResponse {
|
||||||
trait Response
|
trait Response
|
||||||
|
|
@ -15,10 +15,10 @@ object VehicleResponse {
|
||||||
final case class ConcealPlayer(player_guid : PlanetSideGUID) extends Response
|
final case class ConcealPlayer(player_guid : PlanetSideGUID) extends Response
|
||||||
final case class DeployRequest(object_guid : PlanetSideGUID, state : DriveState.Value, unk1 : Int, unk2 : Boolean, pos : Vector3) extends Response
|
final case class DeployRequest(object_guid : PlanetSideGUID, state : DriveState.Value, unk1 : Int, unk2 : Boolean, pos : Vector3) extends Response
|
||||||
final case class DetachFromRails(vehicle_guid : PlanetSideGUID, rails_guid : PlanetSideGUID, rails_pos : Vector3, rails_rot : Float) extends Response
|
final case class DetachFromRails(vehicle_guid : PlanetSideGUID, rails_guid : PlanetSideGUID, rails_pos : Vector3, rails_rot : Float) extends Response
|
||||||
final case class DismountVehicle(unk1 : Int, unk2 : Boolean) extends Response
|
final case class DismountVehicle(bailType : BailType.Value , unk2 : Boolean) extends Response
|
||||||
final case class InventoryState(obj : PlanetSideGameObject, parent_guid : PlanetSideGUID, start : Int, con_data : ConstructorData) extends Response
|
final case class InventoryState(obj : PlanetSideGameObject, parent_guid : PlanetSideGUID, start : Int, con_data : ConstructorData) extends Response
|
||||||
final case class InventoryState2(obj_guid : PlanetSideGUID, parent_guid : PlanetSideGUID, value : Int) extends Response
|
final case class InventoryState2(obj_guid : PlanetSideGUID, parent_guid : PlanetSideGUID, value : Int) extends Response
|
||||||
final case class KickPassenger(unk1 : Int, unk2 : Boolean, vehicle_guid : PlanetSideGUID) extends Response
|
final case class KickPassenger(seat_num : Int, kickedByDriver : Boolean, vehicle_guid : PlanetSideGUID) extends Response
|
||||||
final case class LoadVehicle(vehicle : Vehicle, vtype : Int, vguid : PlanetSideGUID, vdata : ConstructorData) extends Response
|
final case class LoadVehicle(vehicle : Vehicle, vtype : Int, vguid : PlanetSideGUID, vdata : ConstructorData) extends Response
|
||||||
final case class MountVehicle(object_guid : PlanetSideGUID, seat : Int) extends Response
|
final case class MountVehicle(object_guid : PlanetSideGUID, seat : Int) extends Response
|
||||||
final case class ResetSpawnPad(pad_guid : PlanetSideGUID) extends Response
|
final case class ResetSpawnPad(pad_guid : PlanetSideGUID) extends Response
|
||||||
|
|
|
||||||
|
|
@ -52,9 +52,9 @@ class VehicleService extends Actor {
|
||||||
VehicleEvents.publish(
|
VehicleEvents.publish(
|
||||||
VehicleServiceResponse(s"/$forChannel/Vehicle", player_guid, VehicleResponse.DeployRequest(object_guid, state, unk1, unk2, pos))
|
VehicleServiceResponse(s"/$forChannel/Vehicle", player_guid, VehicleResponse.DeployRequest(object_guid, state, unk1, unk2, pos))
|
||||||
)
|
)
|
||||||
case VehicleAction.DismountVehicle(player_guid, unk1, unk2) =>
|
case VehicleAction.DismountVehicle(player_guid, bailType, unk2) =>
|
||||||
VehicleEvents.publish(
|
VehicleEvents.publish(
|
||||||
VehicleServiceResponse(s"/$forChannel/Vehicle", player_guid, VehicleResponse.DismountVehicle(unk1, unk2))
|
VehicleServiceResponse(s"/$forChannel/Vehicle", player_guid, VehicleResponse.DismountVehicle(bailType, unk2))
|
||||||
)
|
)
|
||||||
case VehicleAction.InventoryState(player_guid, obj, parent_guid, start, con_data) =>
|
case VehicleAction.InventoryState(player_guid, obj, parent_guid, start, con_data) =>
|
||||||
VehicleEvents.publish(
|
VehicleEvents.publish(
|
||||||
|
|
@ -64,9 +64,9 @@ class VehicleService extends Actor {
|
||||||
VehicleEvents.publish(
|
VehicleEvents.publish(
|
||||||
VehicleServiceResponse(s"/$forChannel/Vehicle", player_guid, VehicleResponse.InventoryState2(obj_guid, parent_guid, value))
|
VehicleServiceResponse(s"/$forChannel/Vehicle", player_guid, VehicleResponse.InventoryState2(obj_guid, parent_guid, value))
|
||||||
)
|
)
|
||||||
case VehicleAction.KickPassenger(player_guid, unk1, unk2, vehicle_guid) =>
|
case VehicleAction.KickPassenger(player_guid, seat_num, kickedByDriver, vehicle_guid) =>
|
||||||
VehicleEvents.publish(
|
VehicleEvents.publish(
|
||||||
VehicleServiceResponse(s"/$forChannel/Vehicle", player_guid, VehicleResponse.KickPassenger(unk1, unk2, vehicle_guid))
|
VehicleServiceResponse(s"/$forChannel/Vehicle", player_guid, VehicleResponse.KickPassenger(seat_num, kickedByDriver, vehicle_guid))
|
||||||
)
|
)
|
||||||
case VehicleAction.LoadVehicle(player_guid, vehicle, vtype, vguid, vdata) =>
|
case VehicleAction.LoadVehicle(player_guid, vehicle, vtype, vguid, vdata) =>
|
||||||
VehicleEvents.publish(
|
VehicleEvents.publish(
|
||||||
|
|
|
||||||
|
|
@ -114,8 +114,8 @@ class DismountVehicleTest extends ActorTest {
|
||||||
"pass DismountVehicle" in {
|
"pass DismountVehicle" in {
|
||||||
val service = system.actorOf(Props[VehicleService], "v-service")
|
val service = system.actorOf(Props[VehicleService], "v-service")
|
||||||
service ! Service.Join("test")
|
service ! Service.Join("test")
|
||||||
service ! VehicleServiceMessage("test", VehicleAction.DismountVehicle(PlanetSideGUID(10), 0, false))
|
service ! VehicleServiceMessage("test", VehicleAction.DismountVehicle(PlanetSideGUID(10), BailType.Normal, false))
|
||||||
expectMsg(VehicleServiceResponse("/test/Vehicle", PlanetSideGUID(10), VehicleResponse.DismountVehicle(0, false)))
|
expectMsg(VehicleServiceResponse("/test/Vehicle", PlanetSideGUID(10), VehicleResponse.DismountVehicle(BailType.Normal, false)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue