mirror of
https://github.com/psforever/PSF-LoginServer.git
synced 2026-01-19 18:44:45 +00:00
EmpireBenefitsMessage packet
This commit is contained in:
parent
a799aa5639
commit
958427dc8f
|
|
@ -557,7 +557,7 @@ object GamePacketOpcode extends Enumeration {
|
||||||
case 0xd4 => game.GenericObjectActionAtPositionMessage.decode
|
case 0xd4 => game.GenericObjectActionAtPositionMessage.decode
|
||||||
case 0xd5 => game.PropertyOverrideMessage.decode
|
case 0xd5 => game.PropertyOverrideMessage.decode
|
||||||
case 0xd6 => game.WarpgateLinkOverrideMessage.decode
|
case 0xd6 => game.WarpgateLinkOverrideMessage.decode
|
||||||
case 0xd7 => noDecoder(EmpireBenefitsMessage)
|
case 0xd7 => game.EmpireBenefitsMessage.decode
|
||||||
// 0xd8
|
// 0xd8
|
||||||
case 0xd8 => noDecoder(ForceEmpireMessage)
|
case 0xd8 => noDecoder(ForceEmpireMessage)
|
||||||
case 0xd9 => game.BroadcastWarpgateUpdateMessage.decode
|
case 0xd9 => game.BroadcastWarpgateUpdateMessage.decode
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,44 @@
|
||||||
|
// Copyright (c) 2025 PSForever
|
||||||
|
package net.psforever.packet.game
|
||||||
|
|
||||||
|
import net.psforever.packet.game.EmpireBenefitsMessage.{ZoneLocks, ZoneBenefits}
|
||||||
|
import net.psforever.packet.{GamePacketOpcode, Marshallable, PacketHelpers, PlanetSideGamePacket}
|
||||||
|
import scodec.Codec
|
||||||
|
import scodec.codecs._
|
||||||
|
|
||||||
|
final case class EmpireBenefitsMessage(
|
||||||
|
entriesA: Vector[ZoneLocks],
|
||||||
|
entriesB: Vector[ZoneBenefits]
|
||||||
|
) extends PlanetSideGamePacket {
|
||||||
|
type Packet = EmpireBenefitsMessage
|
||||||
|
def opcode = GamePacketOpcode.EmpireBenefitsMessage
|
||||||
|
def encode = EmpireBenefitsMessage.encode(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
object EmpireBenefitsMessage extends Marshallable[EmpireBenefitsMessage] {
|
||||||
|
|
||||||
|
final case class ZoneLocks(
|
||||||
|
empire: Int,
|
||||||
|
zone: String
|
||||||
|
)
|
||||||
|
|
||||||
|
final case class ZoneBenefits(
|
||||||
|
empire: Int,
|
||||||
|
value: Int
|
||||||
|
)
|
||||||
|
|
||||||
|
private implicit val entryACodec: Codec[ZoneLocks] = (
|
||||||
|
("empire" | uint(2)) ::
|
||||||
|
("zone" | PacketHelpers.encodedStringAligned(6))
|
||||||
|
).as[ZoneLocks]
|
||||||
|
|
||||||
|
private implicit val entryBCodec: Codec[ZoneBenefits] = (
|
||||||
|
("empire" | uint(2)) ::
|
||||||
|
("benefit" | uint16L)
|
||||||
|
).as[ZoneBenefits]
|
||||||
|
|
||||||
|
implicit val codec: Codec[EmpireBenefitsMessage] = (
|
||||||
|
("entriesA" | vectorOfN(uint32L.xmap(_.toInt, _.toLong), entryACodec)) ::
|
||||||
|
("entriesB" | vectorOfN(uint32L.xmap(_.toInt, _.toLong), entryBCodec))
|
||||||
|
).as[EmpireBenefitsMessage]
|
||||||
|
}
|
||||||
53
src/test/scala/game/EmpireBenefitsMessageTest.scala
Normal file
53
src/test/scala/game/EmpireBenefitsMessageTest.scala
Normal file
|
|
@ -0,0 +1,53 @@
|
||||||
|
// Copyright (c) 2025 PSForever
|
||||||
|
package game
|
||||||
|
|
||||||
|
import net.psforever.packet._
|
||||||
|
import net.psforever.packet.game.EmpireBenefitsMessage.{ZoneLocks, ZoneBenefits}
|
||||||
|
import net.psforever.packet.game.{EmpireBenefitsMessage, OutfitEvent}
|
||||||
|
import org.specs2.mutable._
|
||||||
|
import scodec.bits._
|
||||||
|
|
||||||
|
class EmpireBenefitsMessageTest extends Specification {
|
||||||
|
|
||||||
|
val sample1: ByteVector = ByteVector.fromValidHex(
|
||||||
|
"d7" + // header
|
||||||
|
"04000000" + // count uint32L
|
||||||
|
"21c06c6f636b2d7a3321c06c6f636b2d7a3464006c6f636b2d69312d69322d69332d6934a1c06c6f636b2d7a39" +
|
||||||
|
"04000000" + // count uint32L
|
||||||
|
"004000600410020300"
|
||||||
|
)
|
||||||
|
|
||||||
|
val sample1_expectedLocks = Vector(
|
||||||
|
ZoneLocks(0, "lock-z3"),
|
||||||
|
ZoneLocks(0, "lock-z4"),
|
||||||
|
ZoneLocks(1, "lock-i1-i2-i3-i4"),
|
||||||
|
ZoneLocks(2, "lock-z9")
|
||||||
|
)
|
||||||
|
|
||||||
|
val sample1_expectedBenefits = Vector(
|
||||||
|
ZoneBenefits(0, 1),
|
||||||
|
ZoneBenefits(0, 6),
|
||||||
|
ZoneBenefits(1, 4),
|
||||||
|
ZoneBenefits(2, 3)
|
||||||
|
)
|
||||||
|
|
||||||
|
"decode sample1" in {
|
||||||
|
PacketCoding.decodePacket(sample1).require match {
|
||||||
|
case EmpireBenefitsMessage(a, b) =>
|
||||||
|
a mustEqual sample1_expectedLocks
|
||||||
|
b mustEqual sample1_expectedBenefits
|
||||||
|
case _ =>
|
||||||
|
ko
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
"encode sample1" in {
|
||||||
|
val msg = EmpireBenefitsMessage(
|
||||||
|
entriesA = sample1_expectedLocks,
|
||||||
|
entriesB = sample1_expectedBenefits
|
||||||
|
)
|
||||||
|
val pkt = PacketCoding.encodePacket(msg).require.toByteVector
|
||||||
|
|
||||||
|
pkt mustEqual sample1
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue