mirror of
https://github.com/psforever/PSF-LoginServer.git
synced 2026-03-06 14:00:27 +00:00
added DensityLevelUpdateMessage packet and tests; including default packet during initialization phase
This commit is contained in:
parent
77b4890706
commit
3965437116
5 changed files with 103 additions and 4 deletions
|
|
@ -561,7 +561,7 @@ object GamePacketOpcode extends Enumeration {
|
|||
case 0xca => noDecoder(OutfitBenefitMessage)
|
||||
case 0xcb => noDecoder(EmpireChangeTimeMessage)
|
||||
case 0xcc => noDecoder(ClockCalibrationMessage)
|
||||
case 0xcd => noDecoder(DensityLevelUpdateMessage)
|
||||
case 0xcd => game.DensityLevelUpdateMessage.decode
|
||||
case 0xce => noDecoder(ActOfGodMessage)
|
||||
case 0xcf => noDecoder(AvatarAwardMessage)
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
// Copyright (c) 2016 PSForever.net to present
|
||||
// Copyright (c) 2017 PSForever
|
||||
package net.psforever.packet.game
|
||||
|
||||
import net.psforever.packet.{GamePacketOpcode, Marshallable, PlanetSideGamePacket}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,47 @@
|
|||
// Copyright (c) 2017 PSForever
|
||||
package net.psforever.packet.game
|
||||
|
||||
import net.psforever.packet.{GamePacketOpcode, Marshallable, PacketHelpers, PlanetSideGamePacket}
|
||||
import scodec.{Attempt, Codec, Err}
|
||||
import scodec.codecs._
|
||||
import shapeless.{::, HNil}
|
||||
|
||||
/**
|
||||
* na
|
||||
* @param zone_id the continent
|
||||
* @param building_id the building
|
||||
* @param density na
|
||||
*/
|
||||
final case class DensityLevelUpdateMessage(zone_id : PlanetSideGUID,
|
||||
building_id : PlanetSideGUID,
|
||||
density : List[Int])
|
||||
extends PlanetSideGamePacket {
|
||||
type Packet = DensityLevelUpdateMessage
|
||||
def opcode = GamePacketOpcode.DensityLevelUpdateMessage
|
||||
def encode = DensityLevelUpdateMessage.encode(this)
|
||||
}
|
||||
|
||||
object DensityLevelUpdateMessage extends Marshallable[DensityLevelUpdateMessage] {
|
||||
implicit val codec : Codec[DensityLevelUpdateMessage] = (
|
||||
("zone_id" | PlanetSideGUID.codec) ::
|
||||
("building_id" | PlanetSideGUID.codec) ::
|
||||
("density" | PacketHelpers.listOfNSized(8, uint(3)))
|
||||
).exmap[DensityLevelUpdateMessage] (
|
||||
{
|
||||
case a :: b :: c :: HNil =>
|
||||
Attempt.Successful(DensityLevelUpdateMessage(a, b, c))
|
||||
},
|
||||
{
|
||||
case DensityLevelUpdateMessage(a, b, c) =>
|
||||
if(c.length != 8) {
|
||||
Attempt.Failure(Err("list must have 8 entries"))
|
||||
}
|
||||
else if(c.count(i => { i < 0 || i > 7 }) > 0) {
|
||||
Attempt.Failure(Err("list entries must be 0-7 inclusive"))
|
||||
}
|
||||
else {
|
||||
Attempt.Successful(a :: b :: c :: HNil)
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
// Copyright (c) 2017 PSForever
|
||||
package game
|
||||
|
||||
import org.specs2.mutable._
|
||||
import net.psforever.packet._
|
||||
import net.psforever.packet.game._
|
||||
import scodec.bits._
|
||||
|
||||
class DensityLevelUpdateMessageTest extends Specification {
|
||||
val string = hex"cd 0100 1f4e 000000"
|
||||
|
||||
"decode" in {
|
||||
PacketCoding.DecodePacket(string).require match {
|
||||
case DensityLevelUpdateMessage(zone_id, building_id, unk) =>
|
||||
zone_id mustEqual PlanetSideGUID(1)
|
||||
building_id mustEqual PlanetSideGUID(19999)
|
||||
unk.length mustEqual 8
|
||||
unk.head mustEqual 0
|
||||
unk(1) mustEqual 0
|
||||
unk(2) mustEqual 0
|
||||
unk(3) mustEqual 0
|
||||
unk(4) mustEqual 0
|
||||
unk(5) mustEqual 0
|
||||
unk(6) mustEqual 0
|
||||
unk(7) mustEqual 0
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
}
|
||||
|
||||
"encode" in {
|
||||
val msg = DensityLevelUpdateMessage(PlanetSideGUID(1), PlanetSideGUID(19999), List(0,0, 0,0, 0,0, 0,0))
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
|
||||
pkt mustEqual string
|
||||
}
|
||||
|
||||
"encode (failure; wrong number of list entries)" in {
|
||||
val msg = DensityLevelUpdateMessage(PlanetSideGUID(1), PlanetSideGUID(19999), List(0))
|
||||
PacketCoding.EncodePacket(msg).isSuccessful mustEqual false
|
||||
}
|
||||
|
||||
"encode (failure; list number too big)" in {
|
||||
val msg1 = DensityLevelUpdateMessage(PlanetSideGUID(1), PlanetSideGUID(19999), List(0,0, 0,0, 0,0, 0,8))
|
||||
PacketCoding.EncodePacket(msg1).isSuccessful mustEqual false
|
||||
}
|
||||
|
||||
"encode (failure; list number too small)" in {
|
||||
val msg1 = DensityLevelUpdateMessage(PlanetSideGUID(1), PlanetSideGUID(19999), List(0,0, 0,0, 0,-1, 0,0))
|
||||
PacketCoding.EncodePacket(msg1).isSuccessful mustEqual false
|
||||
}
|
||||
}
|
||||
|
|
@ -3059,6 +3059,8 @@ class WorldSessionActor extends Actor with MDCContextAware {
|
|||
false
|
||||
)
|
||||
)
|
||||
sendResponse(DensityLevelUpdateMessage(continentNumber, buildingNumber, List(0,0, 0,0, 0,0, 0,0))) //TODO what is density?
|
||||
//TODO BroadcastWarpgateUpdateMessage() for warp gates
|
||||
// sendResponse(
|
||||
// BuildingInfoUpdateMessage(
|
||||
// PlanetSideGUID(6), //Ceryshen
|
||||
|
|
@ -3084,8 +3086,6 @@ class WorldSessionActor extends Actor with MDCContextAware {
|
|||
// true //Boosted generator room pain field
|
||||
// )
|
||||
// )
|
||||
//TODO DensityLevelUpdateMessage()
|
||||
//TODO BroadcastWarpgateUpdateMessage() for warp gates
|
||||
}
|
||||
|
||||
def configZone(zone : Zone) : Unit = {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue