added DensityLevelUpdateMessage packet and tests; including default packet during initialization phase

This commit is contained in:
FateJH 2018-03-03 21:21:41 -05:00
parent 77b4890706
commit 3965437116
5 changed files with 103 additions and 4 deletions

View file

@ -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)

View file

@ -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}

View file

@ -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)
}
}
)
}

View file

@ -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
}
}

View file

@ -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 = {