mirror of
https://github.com/psforever/PSF-LoginServer.git
synced 2026-01-19 18:44:45 +00:00
PlatoonEvent decode
This commit is contained in:
parent
cfb5c0def2
commit
3a89d69ee3
|
|
@ -437,7 +437,7 @@ object GamePacketOpcode extends Enumeration {
|
|||
|
||||
// OPCODES 0x70-7f
|
||||
case 0x70 => game.SquadMemberEvent.decode
|
||||
case 0x71 => noDecoder(PlatoonEvent)
|
||||
case 0x71 => game.PlatoonEvent.decode
|
||||
case 0x72 => game.FriendsRequest.decode
|
||||
case 0x73 => game.FriendsResponse.decode
|
||||
case 0x74 => game.TriggerEnvironmentalDamageMessage.decode
|
||||
|
|
|
|||
51
src/main/scala/net/psforever/packet/game/PlatoonEvent.scala
Normal file
51
src/main/scala/net/psforever/packet/game/PlatoonEvent.scala
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
// Copyright (c) 2025 PSForever
|
||||
package net.psforever.packet.game
|
||||
|
||||
import net.psforever.packet.GamePacketOpcode.Type
|
||||
import net.psforever.packet.{GamePacketOpcode, Marshallable, PacketHelpers, PlanetSideGamePacket}
|
||||
import scodec.{Attempt, Codec}
|
||||
import scodec.bits.BitVector
|
||||
import scodec.codecs._
|
||||
import shapeless.{::, HNil}
|
||||
|
||||
final case class PlatoonEvent(
|
||||
packet_type: PlatoonEvent.PacketType.Type, // only seen 0 and 1
|
||||
unk0: Int, // squad size?
|
||||
squad_supplement_id: Int,
|
||||
squad_ui_index: Int
|
||||
) extends PlanetSideGamePacket {
|
||||
type Packet = PlatoonEvent
|
||||
|
||||
def opcode: Type = GamePacketOpcode.PlatoonEvent
|
||||
def encode: Attempt[BitVector] = PlatoonEvent.encode(this)
|
||||
}
|
||||
|
||||
object PlatoonEvent extends Marshallable[PlatoonEvent] {
|
||||
|
||||
object PacketType extends Enumeration {
|
||||
type Type = Value
|
||||
|
||||
val AddSquad: PacketType.Value = Value(0) // Add / Update?
|
||||
val RemoveSquad: PacketType.Value = Value(1)
|
||||
val Unk2: PacketType.Value = Value(2)
|
||||
val Unk3: PacketType.Value = Value(3) // seen as decode error, Squad ID too high
|
||||
|
||||
implicit val codec: Codec[Type] = PacketHelpers.createEnumerationCodec(this, uintL(2))
|
||||
}
|
||||
|
||||
implicit val codec: Codec[PlatoonEvent] = (
|
||||
("packet_type" | PacketType.codec) ::
|
||||
("unk0" | uint16L) ::
|
||||
("squad_supplement_id" | uint16L) ::
|
||||
("squad_ui_index" | uintL(2))
|
||||
).xmap[PlatoonEvent](
|
||||
{
|
||||
case packet_type :: u0 :: squad_supplement_id :: squad_ui_index :: HNil =>
|
||||
PlatoonEvent(packet_type, u0, squad_supplement_id, squad_ui_index)
|
||||
},
|
||||
{
|
||||
case PlatoonEvent(packet_type, u0, squad_supplement_id, squad_ui_index) =>
|
||||
packet_type :: u0 :: squad_supplement_id :: squad_ui_index :: HNil
|
||||
}
|
||||
)
|
||||
}
|
||||
63
src/test/scala/game/PlatoonEventTest.scala
Normal file
63
src/test/scala/game/PlatoonEventTest.scala
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
// Copyright (c) 2025 PSForever
|
||||
package game
|
||||
|
||||
import net.psforever.packet._
|
||||
import net.psforever.packet.game.PlatoonEvent
|
||||
import net.psforever.packet.game.PlatoonEvent.PacketType._
|
||||
import org.specs2.mutable._
|
||||
import scodec.bits.ByteVector
|
||||
|
||||
class PlatoonEventTest extends Specification {
|
||||
|
||||
val add_squad: ByteVector = ByteVector.fromValidHex("71 0200 0040 00")
|
||||
val remove_squad: ByteVector = ByteVector.fromValidHex("71 4280 0300 20")
|
||||
|
||||
"decode addSquad" in {
|
||||
PacketCoding.decodePacket(add_squad).require match {
|
||||
case PlatoonEvent(action, unk0, squad_supplement_id, squad_ui_index) =>
|
||||
action mustEqual AddSquad
|
||||
unk0 mustEqual 8
|
||||
squad_supplement_id mustEqual 1
|
||||
squad_ui_index mustEqual 0
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
|
||||
"encode addSquad" in {
|
||||
val msg = PlatoonEvent(
|
||||
AddSquad,
|
||||
unk0 = 8,
|
||||
squad_supplement_id = 1,
|
||||
squad_ui_index = 0
|
||||
)
|
||||
val pkt = PacketCoding.encodePacket(msg).require.toByteVector
|
||||
|
||||
pkt mustEqual add_squad
|
||||
}
|
||||
|
||||
"decode removeSquad" in {
|
||||
PacketCoding.decodePacket(remove_squad).require match {
|
||||
case PlatoonEvent(action, unk0, squad_supplement_id, squad_ui_index) =>
|
||||
action mustEqual RemoveSquad
|
||||
unk0 mustEqual 10
|
||||
squad_supplement_id mustEqual 12
|
||||
squad_ui_index mustEqual 2
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
|
||||
"encode removeSquad" in {
|
||||
val msg = PlatoonEvent(
|
||||
RemoveSquad,
|
||||
unk0 = 10,
|
||||
squad_supplement_id = 12,
|
||||
squad_ui_index = 2
|
||||
)
|
||||
val pkt = PacketCoding.encodePacket(msg).require.toByteVector
|
||||
|
||||
pkt mustEqual remove_squad
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Reference in a new issue