Merge branch 'player-stasis'

This commit is contained in:
FateJH 2017-01-28 01:30:36 -05:00
commit 2a858cf007
3 changed files with 63 additions and 1 deletions

View file

@ -482,7 +482,7 @@ object GamePacketOpcode extends Enumeration {
// 0x88
case 0x88 => game.WeaponDelayFireMessage.decode
case 0x89 => game.BugReportMessage.decode
case 0x8a => noDecoder(PlayerStasisMessage)
case 0x8a => game.PlayerStasisMessage.decode
case 0x8b => noDecoder(UnknownMessage139)
case 0x8c => noDecoder(OutfitMembershipRequest)
case 0x8d => noDecoder(OutfitMembershipResponse)

View file

@ -0,0 +1,41 @@
// Copyright (c) 2016 PSForever.net to present
package net.psforever.packet.game
import net.psforever.packet.{GamePacketOpcode, Marshallable, PlanetSideGamePacket}
import scodec.Codec
import scodec.codecs._
/**
* Causes the avatar to be prepped for drop pod use.<br>
* <br>
* This packet is dispatched from the server to all occupants of the HART shuttle when it has completed its take-off animation.
* When received by the client, that player's avatar is "removed from the world" and the Interstellar Map is displayed for them.
* The "Launch Drop Pod" button window is also made visible.
* Selecting individual continental maps for viewing and clicking on the landmasses has the expected behavior for drop pods implementation.<br>
* <br>
* Being seated on the HART shuttle at the time, a player's avatar does not physically exist when the packet is received.
* If the packet is received while the player is outside of the HART shuttle, the state of their avatar is not known to them.
* "Removed from the world" merely implies that one can not leave the Interstellar Map once it has been displayed.
* According to packet capture, their avatar is not explicitly deconstructed until the dropped-into map is loaded.<br>
* <br>
* When the packet is received on one's client, but is addressed to another player, nothing seems to happen to that player.
* If that player's model is outside of the HART, it will not deconstruct.
* Only the client's avatar can be affected by this packet.
* @param player_guid the player
* @param stasis `true` by default;
* nothing when `false` (?)
*/
final case class PlayerStasisMessage(player_guid : PlanetSideGUID,
stasis : Boolean = true)
extends PlanetSideGamePacket {
type Packet = PlayerStasisMessage
def opcode = GamePacketOpcode.PlayerStasisMessage
def encode = PlayerStasisMessage.encode(this)
}
object PlayerStasisMessage extends Marshallable[PlayerStasisMessage] {
implicit val codec : Codec[PlayerStasisMessage] = (
("player_guid" | PlanetSideGUID.codec) ::
("stasis" | bool)
).as[PlayerStasisMessage]
}

View file

@ -1377,6 +1377,27 @@ class GamePacketTest extends Specification {
}
}
"PlayerStasisMessage" should {
val string = hex"8A 4B 00 80"
"decode" in {
PacketCoding.DecodePacket(string).require match {
case PlayerStasisMessage(player_guid, stasis) =>
player_guid mustEqual PlanetSideGUID(75)
stasis mustEqual true
case default =>
ko
}
}
"encode" in {
val msg = PlayerStasisMessage(PlanetSideGUID(75))
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
pkt mustEqual string
}
}
"ContinentalLockUpdateMessage" should {
val string = hex"A8 16 00 40"