mirror of
https://github.com/2revoemag/PSF-BotServer.git
synced 2026-04-25 05:45:23 +00:00
added enumeration for squad waypoints and changed field datatypes where appriopriate; added assertions to squad detail packet; removed old logic from squad request and squad response enumerations; WSA lfs -> lfsm
This commit is contained in:
parent
aa2e0089a4
commit
93f2264f61
12 changed files with 71 additions and 68 deletions
|
|
@ -3,6 +3,7 @@ package net.psforever.objects.teamwork
|
||||||
|
|
||||||
import akka.actor.{Actor, ActorContext, ActorRef, Cancellable, Props}
|
import akka.actor.{Actor, ActorContext, ActorRef, Cancellable, Props}
|
||||||
import net.psforever.objects.DefaultCancellable
|
import net.psforever.objects.DefaultCancellable
|
||||||
|
import net.psforever.types.SquadWaypoints
|
||||||
import services.teamwork.SquadService.WaypointData
|
import services.teamwork.SquadService.WaypointData
|
||||||
import services.teamwork.SquadSwitchboard
|
import services.teamwork.SquadSwitchboard
|
||||||
|
|
||||||
|
|
@ -70,7 +71,7 @@ class SquadFeatures(val Squad : Squad) {
|
||||||
|
|
||||||
def Start(implicit context : ActorContext) : SquadFeatures = {
|
def Start(implicit context : ActorContext) : SquadFeatures = {
|
||||||
switchboard = context.actorOf(Props[SquadSwitchboard], s"squad${Squad.GUID.guid}")
|
switchboard = context.actorOf(Props[SquadSwitchboard], s"squad${Squad.GUID.guid}")
|
||||||
waypoints = Array.fill[WaypointData](5)(new WaypointData())
|
waypoints = Array.fill[WaypointData](SquadWaypoints.values.size)(new WaypointData())
|
||||||
this
|
this
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -114,7 +114,10 @@ final case class SquadPositionDetail(is_closed : Option[Boolean],
|
||||||
* when 255, this indicated the end of enumerated squad position data and the data for that position is absent
|
* when 255, this indicated the end of enumerated squad position data and the data for that position is absent
|
||||||
* @param info the squad position field data
|
* @param info the squad position field data
|
||||||
*/
|
*/
|
||||||
final case class SquadPositionEntry(index : Int, info : Option[SquadPositionDetail])
|
final case class SquadPositionEntry(index : Int, info : Option[SquadPositionDetail]) {
|
||||||
|
assert((index > -1 && index < 10) || index == 255, "index value is out of range 0=>n<=9 or n=255")
|
||||||
|
assert(if(index == 255) { info.isEmpty } else { true }, "index=255 indicates end of stream exclusively and field data should be blank")
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Information regarding a squad's position as a series of common fields.
|
* Information regarding a squad's position as a series of common fields.
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
// Copyright (c) 2017 PSForever
|
// Copyright (c) 2019 PSForever
|
||||||
package net.psforever.packet.game
|
package net.psforever.packet.game
|
||||||
|
|
||||||
import net.psforever.packet.{GamePacketOpcode, Marshallable, PlanetSideGamePacket}
|
import net.psforever.packet.{GamePacketOpcode, Marshallable, PlanetSideGamePacket}
|
||||||
import net.psforever.types.Vector3
|
import net.psforever.types.{SquadWaypoints, Vector3}
|
||||||
import scodec.{Attempt, Codec, Err}
|
import scodec.{Attempt, Codec, Err}
|
||||||
import scodec.codecs._
|
import scodec.codecs._
|
||||||
import shapeless.{::, HNil}
|
import shapeless.{::, HNil}
|
||||||
|
|
@ -14,7 +14,7 @@ final case class WaypointEvent(zone_number : Int,
|
||||||
final case class SquadWaypointEvent(event_type : WaypointEventAction.Value,
|
final case class SquadWaypointEvent(event_type : WaypointEventAction.Value,
|
||||||
unk : Int,
|
unk : Int,
|
||||||
char_id : Long,
|
char_id : Long,
|
||||||
waypoint_type : Int,
|
waypoint_type : SquadWaypoints.Value,
|
||||||
unk5 : Option[Long],
|
unk5 : Option[Long],
|
||||||
waypoint_info : Option[WaypointEvent])
|
waypoint_info : Option[WaypointEvent])
|
||||||
extends PlanetSideGamePacket {
|
extends PlanetSideGamePacket {
|
||||||
|
|
@ -24,13 +24,13 @@ final case class SquadWaypointEvent(event_type : WaypointEventAction.Value,
|
||||||
}
|
}
|
||||||
|
|
||||||
object SquadWaypointEvent extends Marshallable[SquadWaypointEvent] {
|
object SquadWaypointEvent extends Marshallable[SquadWaypointEvent] {
|
||||||
def Add(unk : Int, char_id : Long, waypoint_type : Int, waypoint : WaypointEvent) : SquadWaypointEvent =
|
def Add(unk : Int, char_id : Long, waypoint_type : SquadWaypoints.Value, waypoint : WaypointEvent) : SquadWaypointEvent =
|
||||||
SquadWaypointEvent(WaypointEventAction.Add, unk, char_id, waypoint_type, None, Some(waypoint))
|
SquadWaypointEvent(WaypointEventAction.Add, unk, char_id, waypoint_type, None, Some(waypoint))
|
||||||
|
|
||||||
def Unknown1(unk : Int, char_id : Long, waypoint_type : Int, unk_a : Long) : SquadWaypointEvent =
|
def Unknown1(unk : Int, char_id : Long, waypoint_type : SquadWaypoints.Value, unk_a : Long) : SquadWaypointEvent =
|
||||||
SquadWaypointEvent(WaypointEventAction.Unknown1, unk, char_id, waypoint_type, Some(unk_a), None)
|
SquadWaypointEvent(WaypointEventAction.Unknown1, unk, char_id, waypoint_type, Some(unk_a), None)
|
||||||
|
|
||||||
def Remove(unk : Int, char_id : Long, waypoint_type : Int) : SquadWaypointEvent =
|
def Remove(unk : Int, char_id : Long, waypoint_type : SquadWaypoints.Value) : SquadWaypointEvent =
|
||||||
SquadWaypointEvent(WaypointEventAction.Remove, unk, char_id, waypoint_type, None, None)
|
SquadWaypointEvent(WaypointEventAction.Remove, unk, char_id, waypoint_type, None, None)
|
||||||
|
|
||||||
private val waypoint_codec : Codec[WaypointEvent] = (
|
private val waypoint_codec : Codec[WaypointEvent] = (
|
||||||
|
|
@ -43,7 +43,7 @@ object SquadWaypointEvent extends Marshallable[SquadWaypointEvent] {
|
||||||
("event_type" | WaypointEventAction.codec) >>:~ { event_type =>
|
("event_type" | WaypointEventAction.codec) >>:~ { event_type =>
|
||||||
("unk" | uint16L) ::
|
("unk" | uint16L) ::
|
||||||
("char_id" | uint32L) ::
|
("char_id" | uint32L) ::
|
||||||
("waypoint_type" | uint8L) ::
|
("waypoint_type" | SquadWaypoints.codec) ::
|
||||||
("unk5" | conditional(event_type == WaypointEventAction.Unknown1, uint32L)) ::
|
("unk5" | conditional(event_type == WaypointEventAction.Unknown1, uint32L)) ::
|
||||||
("waypoint_info" | conditional(event_type == WaypointEventAction.Add, waypoint_codec))
|
("waypoint_info" | conditional(event_type == WaypointEventAction.Add, waypoint_codec))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
package net.psforever.packet.game
|
package net.psforever.packet.game
|
||||||
|
|
||||||
import net.psforever.packet.{GamePacketOpcode, Marshallable, PacketHelpers, PlanetSideGamePacket}
|
import net.psforever.packet.{GamePacketOpcode, Marshallable, PacketHelpers, PlanetSideGamePacket}
|
||||||
import net.psforever.types.Vector3
|
import net.psforever.types.{SquadWaypoints, Vector3}
|
||||||
import scodec.{Attempt, Codec, Err}
|
import scodec.{Attempt, Codec, Err}
|
||||||
import scodec.codecs._
|
import scodec.codecs._
|
||||||
import shapeless.{::, HNil}
|
import shapeless.{::, HNil}
|
||||||
|
|
@ -46,7 +46,7 @@ final case class WaypointInfo(zone_number : Int,
|
||||||
*/
|
*/
|
||||||
final case class SquadWaypointRequest(request_type : WaypointEventAction.Value,
|
final case class SquadWaypointRequest(request_type : WaypointEventAction.Value,
|
||||||
char_id : Long,
|
char_id : Long,
|
||||||
waypoint_type : Int,
|
waypoint_type : SquadWaypoints.Value,
|
||||||
unk4 : Option[Long],
|
unk4 : Option[Long],
|
||||||
waypoint_info : Option[WaypointInfo])
|
waypoint_info : Option[WaypointInfo])
|
||||||
extends PlanetSideGamePacket {
|
extends PlanetSideGamePacket {
|
||||||
|
|
@ -56,13 +56,13 @@ final case class SquadWaypointRequest(request_type : WaypointEventAction.Value,
|
||||||
}
|
}
|
||||||
|
|
||||||
object SquadWaypointRequest extends Marshallable[SquadWaypointRequest] {
|
object SquadWaypointRequest extends Marshallable[SquadWaypointRequest] {
|
||||||
def Add(char_id : Long, waypoint_type : Int, waypoint : WaypointInfo) : SquadWaypointRequest =
|
def Add(char_id : Long, waypoint_type : SquadWaypoints.Value, waypoint : WaypointInfo) : SquadWaypointRequest =
|
||||||
SquadWaypointRequest(WaypointEventAction.Add, char_id, waypoint_type, None, Some(waypoint))
|
SquadWaypointRequest(WaypointEventAction.Add, char_id, waypoint_type, None, Some(waypoint))
|
||||||
|
|
||||||
def Unknown1(char_id : Long, waypoint_type : Int, unk_a : Long) : SquadWaypointRequest =
|
def Unknown1(char_id : Long, waypoint_type : SquadWaypoints.Value, unk_a : Long) : SquadWaypointRequest =
|
||||||
SquadWaypointRequest(WaypointEventAction.Unknown1, char_id, waypoint_type, Some(unk_a), None)
|
SquadWaypointRequest(WaypointEventAction.Unknown1, char_id, waypoint_type, Some(unk_a), None)
|
||||||
|
|
||||||
def Remove(char_id : Long, waypoint_type : Int) : SquadWaypointRequest =
|
def Remove(char_id : Long, waypoint_type : SquadWaypoints.Value) : SquadWaypointRequest =
|
||||||
SquadWaypointRequest(WaypointEventAction.Remove, char_id, waypoint_type, None, None)
|
SquadWaypointRequest(WaypointEventAction.Remove, char_id, waypoint_type, None, None)
|
||||||
|
|
||||||
private val waypoint_codec : Codec[WaypointInfo] = (
|
private val waypoint_codec : Codec[WaypointInfo] = (
|
||||||
|
|
@ -80,7 +80,7 @@ object SquadWaypointRequest extends Marshallable[SquadWaypointRequest] {
|
||||||
implicit val codec : Codec[SquadWaypointRequest] = (
|
implicit val codec : Codec[SquadWaypointRequest] = (
|
||||||
("request_type" | WaypointEventAction.codec) >>:~ { request_type =>
|
("request_type" | WaypointEventAction.codec) >>:~ { request_type =>
|
||||||
("char_id" | uint32L) ::
|
("char_id" | uint32L) ::
|
||||||
("waypoint_type" | uint8L) ::
|
("waypoint_type" | SquadWaypoints.codec) ::
|
||||||
("unk4" | conditional(request_type == WaypointEventAction.Unknown1, uint32L)) ::
|
("unk4" | conditional(request_type == WaypointEventAction.Unknown1, uint32L)) ::
|
||||||
("waypoint" | conditional(request_type == WaypointEventAction.Add, waypoint_codec))
|
("waypoint" | conditional(request_type == WaypointEventAction.Add, waypoint_codec))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,11 +24,4 @@ object SquadRequestType extends Enumeration {
|
||||||
= Value
|
= Value
|
||||||
|
|
||||||
implicit val codec = PacketHelpers.createEnumerationCodec(this, uint4L)
|
implicit val codec = PacketHelpers.createEnumerationCodec(this, uint4L)
|
||||||
|
|
||||||
def toResponse(request : SquadRequestType.Value) : SquadResponseType.Value = {
|
|
||||||
val id = request.id
|
|
||||||
if(id < 6) SquadResponseType(id)
|
|
||||||
else if(id > 6) SquadResponseType(id - 1)
|
|
||||||
else throw new NoSuchElementException("request does not have an applicable response")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -23,11 +23,4 @@ object SquadResponseType extends Enumeration {
|
||||||
= Value
|
= Value
|
||||||
|
|
||||||
implicit val codec = PacketHelpers.createEnumerationCodec(this, uint4L)
|
implicit val codec = PacketHelpers.createEnumerationCodec(this, uint4L)
|
||||||
|
|
||||||
def fromRequest(response : SquadResponseType.Value) : SquadRequestType.Value = {
|
|
||||||
val id = response.id
|
|
||||||
if(id < 6) SquadRequestType(id)
|
|
||||||
else if(id > 5) SquadRequestType(id + 1)
|
|
||||||
else throw new NoSuchElementException("response does not stem from an applicable request")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
// Copyright (c) 2019 PSForever
|
||||||
|
package net.psforever.types
|
||||||
|
|
||||||
|
import net.psforever.packet.PacketHelpers
|
||||||
|
import scodec.codecs._
|
||||||
|
|
||||||
|
object SquadWaypoints extends Enumeration {
|
||||||
|
type Type = Value
|
||||||
|
val
|
||||||
|
One,
|
||||||
|
Two,
|
||||||
|
Three,
|
||||||
|
Four,
|
||||||
|
ExperienceRally
|
||||||
|
= Value
|
||||||
|
|
||||||
|
implicit val codec = PacketHelpers.createEnumerationCodec(this, uint8L)
|
||||||
|
}
|
||||||
|
|
@ -3,7 +3,7 @@ package services.teamwork
|
||||||
|
|
||||||
import net.psforever.objects.zones.Zone
|
import net.psforever.objects.zones.Zone
|
||||||
import net.psforever.packet.game._
|
import net.psforever.packet.game._
|
||||||
import net.psforever.types.{PlanetSideEmpire, SquadRequestType, Vector3}
|
import net.psforever.types.{PlanetSideEmpire, SquadRequestType, SquadWaypoints, Vector3}
|
||||||
|
|
||||||
object SquadAction {
|
object SquadAction {
|
||||||
trait Action
|
trait Action
|
||||||
|
|
@ -13,6 +13,6 @@ object SquadAction {
|
||||||
|
|
||||||
final case class Definition(guid : PlanetSideGUID, line : Int, action : SquadAction) extends Action
|
final case class Definition(guid : PlanetSideGUID, line : Int, action : SquadAction) extends Action
|
||||||
final case class Membership(request_type : SquadRequestType.Value, unk2 : Long, unk3 : Option[Long], player_name : String, unk5 : Option[Option[String]]) extends Action
|
final case class Membership(request_type : SquadRequestType.Value, unk2 : Long, unk3 : Option[Long], player_name : String, unk5 : Option[Option[String]]) extends Action
|
||||||
final case class Waypoint(event_type : WaypointEventAction.Value, waypoint_type : Int, unk : Option[Long], waypoint_info : Option[WaypointInfo]) extends Action
|
final case class Waypoint(event_type : WaypointEventAction.Value, waypoint_type : SquadWaypoints.Value, unk : Option[Long], waypoint_info : Option[WaypointInfo]) extends Action
|
||||||
final case class Update(char_id : Long, health : Int, max_health : Int, armor : Int, max_armor : Int, pos : Vector3, zone_number : Int) extends Action
|
final case class Update(char_id : Long, health : Int, max_health : Int, armor : Int, max_armor : Int, pos : Vector3, zone_number : Int) extends Action
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ package services.teamwork
|
||||||
|
|
||||||
import net.psforever.objects.teamwork.Squad
|
import net.psforever.objects.teamwork.Squad
|
||||||
import net.psforever.packet.game._
|
import net.psforever.packet.game._
|
||||||
import net.psforever.types.SquadResponseType
|
import net.psforever.types.{SquadResponseType, SquadWaypoints}
|
||||||
|
|
||||||
object SquadResponse {
|
object SquadResponse {
|
||||||
trait Response
|
trait Response
|
||||||
|
|
@ -27,8 +27,8 @@ object SquadResponse {
|
||||||
|
|
||||||
final case class Detail(guid : PlanetSideGUID, squad_detail : SquadDetail) extends Response
|
final case class Detail(guid : PlanetSideGUID, squad_detail : SquadDetail) extends Response
|
||||||
|
|
||||||
final case class InitWaypoints(char_id : Long, waypoints : Iterable[(Int, WaypointInfo, Int)]) extends Response
|
final case class InitWaypoints(char_id : Long, waypoints : Iterable[(SquadWaypoints.Value, WaypointInfo, Int)]) extends Response
|
||||||
final case class WaypointEvent(event_type : WaypointEventAction.Value, char_id : Long, waypoint_type : Int, unk5 : Option[Long], waypoint_info : Option[WaypointInfo], unk : Int) extends Response
|
final case class WaypointEvent(event_type : WaypointEventAction.Value, char_id : Long, waypoint_type : SquadWaypoints.Value, unk5 : Option[Long], waypoint_info : Option[WaypointInfo], unk : Int) extends Response
|
||||||
|
|
||||||
final case class SquadSearchResults() extends Response
|
final case class SquadSearchResults() extends Response
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2544,16 +2544,14 @@ class SquadService extends Actor {
|
||||||
* @see `SquadWaypointRequest`
|
* @see `SquadWaypointRequest`
|
||||||
* @see `WaypointInfo`
|
* @see `WaypointInfo`
|
||||||
* @param guid the squad's unique identifier
|
* @param guid the squad's unique identifier
|
||||||
* @param waypointType the type of the waypoint as an integer;
|
* @param waypointType the type of the waypoint
|
||||||
* 0-4 are squad waypoints;
|
|
||||||
* 5 is the squad leader's experience waypoint
|
|
||||||
* @param info information about the waypoint, as was reported by the client's packet
|
* @param info information about the waypoint, as was reported by the client's packet
|
||||||
* @return the waypoint data, if the waypoint type is changed
|
* @return the waypoint data, if the waypoint type is changed
|
||||||
*/
|
*/
|
||||||
def AddWaypoint(guid : PlanetSideGUID, waypointType : Int, info : WaypointInfo) : Option[WaypointData] = {
|
def AddWaypoint(guid : PlanetSideGUID, waypointType : SquadWaypoints.Value, info : WaypointInfo) : Option[WaypointData] = {
|
||||||
squadFeatures.get(guid) match {
|
squadFeatures.get(guid) match {
|
||||||
case Some(features) =>
|
case Some(features) =>
|
||||||
features.Waypoints.lift(waypointType) match {
|
features.Waypoints.lift(waypointType.id) match {
|
||||||
case Some(point) =>
|
case Some(point) =>
|
||||||
point.zone_number = info.zone_number
|
point.zone_number = info.zone_number
|
||||||
point.pos = info.pos
|
point.pos = info.pos
|
||||||
|
|
@ -2576,14 +2574,12 @@ class SquadService extends Actor {
|
||||||
* All of the waypoints constantly exist as long as the squad to which they are attached exists.
|
* All of the waypoints constantly exist as long as the squad to which they are attached exists.
|
||||||
* They are merely "activated" and "deactivated."
|
* They are merely "activated" and "deactivated."
|
||||||
* @param guid the squad's unique identifier
|
* @param guid the squad's unique identifier
|
||||||
* @param waypointType the type of the waypoint as an integer;
|
* @param waypointType the type of the waypoint
|
||||||
* 0-4 are squad waypoints;
|
|
||||||
* 5 is the squad leader's experience waypoint
|
|
||||||
*/
|
*/
|
||||||
def RemoveWaypoint(guid : PlanetSideGUID, waypointType : Int) : Unit = {
|
def RemoveWaypoint(guid : PlanetSideGUID, waypointType : SquadWaypoints.Value) : Unit = {
|
||||||
squadFeatures.get(guid) match {
|
squadFeatures.get(guid) match {
|
||||||
case Some(features) =>
|
case Some(features) =>
|
||||||
features.Waypoints.lift(waypointType) match {
|
features.Waypoints.lift(waypointType.id) match {
|
||||||
case Some(point) =>
|
case Some(point) =>
|
||||||
point.pos = Vector3.z(1)
|
point.pos = Vector3.z(1)
|
||||||
case _ =>
|
case _ =>
|
||||||
|
|
@ -2608,7 +2604,7 @@ class SquadService extends Actor {
|
||||||
Publish(
|
Publish(
|
||||||
toCharId, SquadResponse.InitWaypoints(squad.Leader.CharId,
|
toCharId, SquadResponse.InitWaypoints(squad.Leader.CharId,
|
||||||
list.zipWithIndex.collect { case (point, index) if point.pos != vz1 =>
|
list.zipWithIndex.collect { case (point, index) if point.pos != vz1 =>
|
||||||
(index, WaypointInfo(point.zone_number, point.pos), 1)
|
(SquadWaypoints(index), WaypointInfo(point.zone_number, point.pos), 1)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,8 @@ package game
|
||||||
|
|
||||||
import org.specs2.mutable._
|
import org.specs2.mutable._
|
||||||
import net.psforever.packet._
|
import net.psforever.packet._
|
||||||
import net.psforever.packet.game.{SquadWaypointEvent, WaypointEventAction, WaypointEvent}
|
import net.psforever.packet.game.{SquadWaypointEvent, WaypointEvent, WaypointEventAction}
|
||||||
import net.psforever.types.Vector3
|
import net.psforever.types.{SquadWaypoints, Vector3}
|
||||||
import scodec.bits._
|
import scodec.bits._
|
||||||
|
|
||||||
class SquadWaypointEventTest extends Specification {
|
class SquadWaypointEventTest extends Specification {
|
||||||
|
|
@ -19,7 +19,7 @@ class SquadWaypointEventTest extends Specification {
|
||||||
unk1 mustEqual WaypointEventAction.Remove
|
unk1 mustEqual WaypointEventAction.Remove
|
||||||
unk2 mustEqual 11
|
unk2 mustEqual 11
|
||||||
unk3 mustEqual 31155863L
|
unk3 mustEqual 31155863L
|
||||||
unk4 mustEqual 0
|
unk4 mustEqual SquadWaypoints.One
|
||||||
unk5.isEmpty mustEqual true
|
unk5.isEmpty mustEqual true
|
||||||
unk6.isEmpty mustEqual true
|
unk6.isEmpty mustEqual true
|
||||||
case _ =>
|
case _ =>
|
||||||
|
|
@ -33,7 +33,7 @@ class SquadWaypointEventTest extends Specification {
|
||||||
unk1 mustEqual WaypointEventAction.Remove
|
unk1 mustEqual WaypointEventAction.Remove
|
||||||
unk2 mustEqual 10
|
unk2 mustEqual 10
|
||||||
unk3 mustEqual 0L
|
unk3 mustEqual 0L
|
||||||
unk4 mustEqual 4
|
unk4 mustEqual SquadWaypoints.ExperienceRally
|
||||||
unk5.isEmpty mustEqual true
|
unk5.isEmpty mustEqual true
|
||||||
unk6.isEmpty mustEqual true
|
unk6.isEmpty mustEqual true
|
||||||
case _ =>
|
case _ =>
|
||||||
|
|
@ -47,7 +47,7 @@ class SquadWaypointEventTest extends Specification {
|
||||||
unk1 mustEqual WaypointEventAction.Add
|
unk1 mustEqual WaypointEventAction.Add
|
||||||
unk2 mustEqual 3
|
unk2 mustEqual 3
|
||||||
unk3 mustEqual 41581052L
|
unk3 mustEqual 41581052L
|
||||||
unk4 mustEqual 1
|
unk4 mustEqual SquadWaypoints.Two
|
||||||
unk5.isEmpty mustEqual true
|
unk5.isEmpty mustEqual true
|
||||||
unk6.contains( WaypointEvent(10, Vector3(3457.9688f, 5514.4688f, 0.0f), 1) ) mustEqual true
|
unk6.contains( WaypointEvent(10, Vector3(3457.9688f, 5514.4688f, 0.0f), 1) ) mustEqual true
|
||||||
case _ =>
|
case _ =>
|
||||||
|
|
@ -61,7 +61,7 @@ class SquadWaypointEventTest extends Specification {
|
||||||
unk1 mustEqual WaypointEventAction.Unknown1
|
unk1 mustEqual WaypointEventAction.Unknown1
|
||||||
unk2 mustEqual 3
|
unk2 mustEqual 3
|
||||||
unk3 mustEqual 41581052L
|
unk3 mustEqual 41581052L
|
||||||
unk4 mustEqual 1
|
unk4 mustEqual SquadWaypoints.Two
|
||||||
unk5.contains( 4L ) mustEqual true
|
unk5.contains( 4L ) mustEqual true
|
||||||
unk6.isEmpty mustEqual true
|
unk6.isEmpty mustEqual true
|
||||||
case _ =>
|
case _ =>
|
||||||
|
|
@ -70,28 +70,28 @@ class SquadWaypointEventTest extends Specification {
|
||||||
}
|
}
|
||||||
|
|
||||||
"encode (1)" in {
|
"encode (1)" in {
|
||||||
val msg = SquadWaypointEvent.Remove(11, 31155863L, 0)
|
val msg = SquadWaypointEvent.Remove(11, 31155863L, SquadWaypoints.One)
|
||||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||||
|
|
||||||
pkt mustEqual string_1
|
pkt mustEqual string_1
|
||||||
}
|
}
|
||||||
|
|
||||||
"encode (2)" in {
|
"encode (2)" in {
|
||||||
val msg = SquadWaypointEvent.Remove(10, 0L, 4)
|
val msg = SquadWaypointEvent.Remove(10, 0L, SquadWaypoints.ExperienceRally)
|
||||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||||
|
|
||||||
pkt mustEqual string_2
|
pkt mustEqual string_2
|
||||||
}
|
}
|
||||||
|
|
||||||
"encode (3)" in {
|
"encode (3)" in {
|
||||||
val msg = SquadWaypointEvent.Add(3, 41581052L, 1, WaypointEvent(10, Vector3(3457.9688f, 5514.4688f, 0.0f), 1))
|
val msg = SquadWaypointEvent.Add(3, 41581052L, SquadWaypoints.Two, WaypointEvent(10, Vector3(3457.9688f, 5514.4688f, 0.0f), 1))
|
||||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||||
|
|
||||||
pkt mustEqual string_3
|
pkt mustEqual string_3
|
||||||
}
|
}
|
||||||
|
|
||||||
"encode (4)" in {
|
"encode (4)" in {
|
||||||
val msg = SquadWaypointEvent.Unknown1(3, 41581052L, 1, 4L)
|
val msg = SquadWaypointEvent.Unknown1(3, 41581052L, SquadWaypoints.Two, 4L)
|
||||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||||
|
|
||||||
pkt mustEqual string_4
|
pkt mustEqual string_4
|
||||||
|
|
|
||||||
|
|
@ -121,14 +121,14 @@ class WorldSessionActor extends Actor with MDCContextAware {
|
||||||
val squadUI : LongMap[SquadUIElement] = new LongMap[SquadUIElement]()
|
val squadUI : LongMap[SquadUIElement] = new LongMap[SquadUIElement]()
|
||||||
var squad_supplement_id : Int = 0
|
var squad_supplement_id : Int = 0
|
||||||
/**
|
/**
|
||||||
* `AvatarConverter` can only rely on the `Avatar`-local Looking For Squad variable.
|
* When joining or creating a squad, the original state of the avatar's internal LFS variable is blanked.
|
||||||
* When joining or creating a squad, the original state of the avatar's local LFS variable is blanked.
|
|
||||||
* This `WSA`-local variable is then used to indicate the ongoing state of the LFS UI component,
|
* This `WSA`-local variable is then used to indicate the ongoing state of the LFS UI component,
|
||||||
* now called "Looking for Squad Member."
|
* now called "Looking for Squad Member."
|
||||||
|
* Only the squad leader may toggle the LFSM marquee.
|
||||||
* Upon leaving or disbanding a squad, this value is made false.
|
* Upon leaving or disbanding a squad, this value is made false.
|
||||||
* Control switching between the `Avatar`-local and the `WSA`-local variable is contingent on `squadUI` being populated.
|
* Control switching between the `Avatar`-local and the `WorldSessionActor`-local variable is contingent on `squadUI` being populated.
|
||||||
*/
|
*/
|
||||||
var lfs : Boolean = false
|
var lfsm : Boolean = false
|
||||||
var squadChannel : Option[String] = None
|
var squadChannel : Option[String] = None
|
||||||
var squadSetup : () => Unit = FirstTimeSquadSetup
|
var squadSetup : () => Unit = FirstTimeSquadSetup
|
||||||
var squadUpdateCounter : Int = 0
|
var squadUpdateCounter : Int = 0
|
||||||
|
|
@ -492,7 +492,7 @@ class WorldSessionActor extends Actor with MDCContextAware {
|
||||||
avatarService ! AvatarServiceMessage(s"${continent.Id}/${player.Faction}", AvatarAction.PlanetsideAttribute(playerGuid, 31, 0))
|
avatarService ! AvatarServiceMessage(s"${continent.Id}/${player.Faction}", AvatarAction.PlanetsideAttribute(playerGuid, 31, 0))
|
||||||
sendResponse(PlanetsideAttributeMessage(playerGuid, 32, 0)) //disassociate with member position in squad?
|
sendResponse(PlanetsideAttributeMessage(playerGuid, 32, 0)) //disassociate with member position in squad?
|
||||||
sendResponse(PlanetsideAttributeMessage(playerGuid, 34, 4294967295L)) //unknown, perhaps unrelated?
|
sendResponse(PlanetsideAttributeMessage(playerGuid, 34, 4294967295L)) //unknown, perhaps unrelated?
|
||||||
lfs = false
|
lfsm = false
|
||||||
//a finalization? what does this do?
|
//a finalization? what does this do?
|
||||||
sendResponse(SquadDefinitionActionMessage(PlanetSideGUID(0), 0, SquadAction.Unknown(18)))
|
sendResponse(SquadDefinitionActionMessage(PlanetSideGUID(0), 0, SquadAction.Unknown(18)))
|
||||||
squad_supplement_id = 0
|
squad_supplement_id = 0
|
||||||
|
|
@ -523,11 +523,11 @@ class WorldSessionActor extends Actor with MDCContextAware {
|
||||||
//are we being demoted?
|
//are we being demoted?
|
||||||
if(squadUI(charId).index == 0) {
|
if(squadUI(charId).index == 0) {
|
||||||
//lfsm -> lfs
|
//lfsm -> lfs
|
||||||
if(lfs) {
|
if(lfsm) {
|
||||||
sendResponse(PlanetsideAttributeMessage(guid, 53, 0))
|
sendResponse(PlanetsideAttributeMessage(guid, 53, 0))
|
||||||
avatarService ! AvatarServiceMessage(factionOnContinentChannel, AvatarAction.PlanetsideAttribute(guid, 53, 0))
|
avatarService ! AvatarServiceMessage(factionOnContinentChannel, AvatarAction.PlanetsideAttribute(guid, 53, 0))
|
||||||
}
|
}
|
||||||
lfs = false
|
lfsm = false
|
||||||
sendResponse(PlanetsideAttributeMessage(guid, 32, from_index)) //associate with member position in squad
|
sendResponse(PlanetsideAttributeMessage(guid, 32, from_index)) //associate with member position in squad
|
||||||
}
|
}
|
||||||
//are we being promoted?
|
//are we being promoted?
|
||||||
|
|
@ -3055,7 +3055,7 @@ class WorldSessionActor extends Actor with MDCContextAware {
|
||||||
deadState = DeadState.Alive
|
deadState = DeadState.Alive
|
||||||
sendResponse(AvatarDeadStateMessage(DeadState.Alive, 0, 0, tplayer.Position, player.Faction, true))
|
sendResponse(AvatarDeadStateMessage(DeadState.Alive, 0, 0, tplayer.Position, player.Faction, true))
|
||||||
//looking for squad (members)
|
//looking for squad (members)
|
||||||
if(tplayer.LFS || lfs) {
|
if(tplayer.LFS || lfsm) {
|
||||||
sendResponse(PlanetsideAttributeMessage(guid, 53, 1))
|
sendResponse(PlanetsideAttributeMessage(guid, 53, 1))
|
||||||
avatarService ! AvatarServiceMessage(continent.Id, AvatarAction.PlanetsideAttribute(guid, 53, 1))
|
avatarService ! AvatarServiceMessage(continent.Id, AvatarAction.PlanetsideAttribute(guid, 53, 1))
|
||||||
}
|
}
|
||||||
|
|
@ -3692,7 +3692,6 @@ class WorldSessionActor extends Actor with MDCContextAware {
|
||||||
}
|
}
|
||||||
vehicleService ! VehicleServiceMessage(continent.Id, VehicleAction.VehicleState(player.GUID, vehicle_guid, unk1, pos, ang, vel, flight, unk6, unk7, wheels, unk9, unkA))
|
vehicleService ! VehicleServiceMessage(continent.Id, VehicleAction.VehicleState(player.GUID, vehicle_guid, unk1, pos, ang, vel, flight, unk6, unk7, wheels, unk9, unkA))
|
||||||
}
|
}
|
||||||
//vehicleService ! VehicleServiceMessage(continent.Id, VehicleAction.VehicleState(player.GUID, vehicle_guid, unk1, pos, ang, vel, flight, unk6, unk7, wheels, unk9, unkA))
|
|
||||||
updateSquad()
|
updateSquad()
|
||||||
case (None, _) =>
|
case (None, _) =>
|
||||||
//log.error(s"VehicleState: no vehicle $vehicle_guid found in zone")
|
//log.error(s"VehicleState: no vehicle $vehicle_guid found in zone")
|
||||||
|
|
@ -4797,8 +4796,8 @@ class WorldSessionActor extends Actor with MDCContextAware {
|
||||||
}
|
}
|
||||||
else if(action == 36) { //Looking For Squad ON
|
else if(action == 36) { //Looking For Squad ON
|
||||||
if(squadUI.nonEmpty) {
|
if(squadUI.nonEmpty) {
|
||||||
if(!lfs && squadUI(player.CharId).index == 0) {
|
if(!lfsm && squadUI(player.CharId).index == 0) {
|
||||||
lfs = true
|
lfsm = true
|
||||||
avatarService ! AvatarServiceMessage(s"${continent.Id}/${player.Faction}", AvatarAction.PlanetsideAttribute(player.GUID, 53, 1))
|
avatarService ! AvatarServiceMessage(s"${continent.Id}/${player.Faction}", AvatarAction.PlanetsideAttribute(player.GUID, 53, 1))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -4809,8 +4808,8 @@ class WorldSessionActor extends Actor with MDCContextAware {
|
||||||
}
|
}
|
||||||
else if(action == 37) { //Looking For Squad OFF
|
else if(action == 37) { //Looking For Squad OFF
|
||||||
if(squadUI.nonEmpty) {
|
if(squadUI.nonEmpty) {
|
||||||
if(lfs && squadUI(player.CharId).index == 0) {
|
if(lfsm && squadUI(player.CharId).index == 0) {
|
||||||
lfs = false
|
lfsm = false
|
||||||
avatarService ! AvatarServiceMessage(s"${continent.Id}/${player.Faction}", AvatarAction.PlanetsideAttribute(player.GUID, 53, 0))
|
avatarService ! AvatarServiceMessage(s"${continent.Id}/${player.Faction}", AvatarAction.PlanetsideAttribute(player.GUID, 53, 0))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue