Refactor opcode mappings to switch statement and hex

This commit is contained in:
Chord 2016-08-19 03:13:52 -04:00
parent 4a25298920
commit 3ca1d33d15
3 changed files with 379 additions and 386 deletions

View file

@ -6,12 +6,12 @@ import scodec.bits.BitVector
import scodec.{Attempt, Codec, DecodeResult, Err} import scodec.{Attempt, Codec, DecodeResult, Err}
import scodec.codecs._ import scodec.codecs._
import scala.annotation.switch
object ControlPacketOpcode extends Enumeration { object ControlPacketOpcode extends Enumeration {
type Type = Value type Type = Value
val val
// OPCODES 0x00-0f
// Opcodes should have a marker every 10
// OPCODE 0
HandleGamePacket, // a whoopsi case: not actually a control packet, but a game packet HandleGamePacket, // a whoopsi case: not actually a control packet, but a game packet
ClientStart, // first packet ever sent during client connection ClientStart, // first packet ever sent during client connection
ServerStart, // second packet sent in response to ClientStart ServerStart, // second packet sent in response to ClientStart
@ -20,80 +20,76 @@ object ControlPacketOpcode extends Enumeration {
TeardownConnection, TeardownConnection,
Unknown6, Unknown6,
ControlSync, // sent to the server from the client ControlSync, // sent to the server from the client
// 0x08
ControlSyncResp, // the response generated by the server ControlSyncResp, // the response generated by the server
SlottedMetaPacket0, SlottedMetaPacket0,
// OPCODE 10
SlottedMetaPacket1, SlottedMetaPacket1,
SlottedMetaPacket2, SlottedMetaPacket2,
SlottedMetaPacket3, SlottedMetaPacket3,
SlottedMetaPacket4, SlottedMetaPacket4,
SlottedMetaPacket5, SlottedMetaPacket5,
SlottedMetaPacket6, SlottedMetaPacket6,
// OPCODES 0x10-1f
SlottedMetaPacket7, SlottedMetaPacket7,
RelatedA0, RelatedA0,
RelatedA1, RelatedA1,
RelatedA2, RelatedA2,
// OPCODE 20
RelatedA3, RelatedA3,
RelatedB0, RelatedB0,
RelatedB1, RelatedB1,
RelatedB2, RelatedB2,
// 0x18
RelatedB3, RelatedB3,
MultiPacketEx, // same as MultiPacket, but with the ability to send extended length packets MultiPacketEx, // same as MultiPacket, but with the ability to send extended length packets
Unknown26, Unknown26,
Unknown27, Unknown27,
Unknown28, Unknown28,
ConnectionClose, ConnectionClose,
// OPCODE 30
Unknown30 Unknown30
= Value = Value
private def noDecoder(opcode : ControlPacketOpcode.Type) = (a : BitVector) => private def noDecoder(opcode : ControlPacketOpcode.Type) = (a : BitVector) =>
Attempt.failure(Err(s"Could not find a marshaller for control packet ${opcode}")) Attempt.failure(Err(s"Could not find a marshaller for control packet ${opcode}"))
def getPacketDecoder(opcode : ControlPacketOpcode.Type) : (BitVector) => Attempt[DecodeResult[PlanetSideControlPacket]] = opcode match { def getPacketDecoder(opcode : ControlPacketOpcode.Type) : (BitVector) => Attempt[DecodeResult[PlanetSideControlPacket]] = (opcode.id : @switch) match {
// OPCODE 0 // OPCODES 0x00-0f
case HandleGamePacket => control.HandleGamePacket.decode case 0x00 => control.HandleGamePacket.decode
case ServerStart => control.ServerStart.decode case 0x01 => control.ClientStart.decode
case ClientStart => control.ClientStart.decode case 0x02 => control.ServerStart.decode
case MultiPacket => control.MultiPacket.decode case 0x03 => control.MultiPacket.decode
case Unknown4 => noDecoder(opcode) case 0x04 => noDecoder(Unknown4)
case TeardownConnection => control.TeardownConnection.decode case 0x05 => control.TeardownConnection.decode
case Unknown6 => noDecoder(opcode) case 0x06 => noDecoder(Unknown6)
case ControlSync => control.ControlSync.decode case 0x07 => control.ControlSync.decode
case ControlSyncResp => control.ControlSyncResp.decode // 0x08
case SlottedMetaPacket0 => SlottedMetaPacket.decodeWithOpcode(SlottedMetaPacket0) case 0x08 => control.ControlSyncResp.decode
case 0x09 => SlottedMetaPacket.decodeWithOpcode(SlottedMetaPacket0)
case 0x0a => SlottedMetaPacket.decodeWithOpcode(SlottedMetaPacket1)
case 0x0b => SlottedMetaPacket.decodeWithOpcode(SlottedMetaPacket2)
case 0x0c => SlottedMetaPacket.decodeWithOpcode(SlottedMetaPacket3)
case 0x0d => SlottedMetaPacket.decodeWithOpcode(SlottedMetaPacket4)
case 0x0e => SlottedMetaPacket.decodeWithOpcode(SlottedMetaPacket5)
case 0x0f => SlottedMetaPacket.decodeWithOpcode(SlottedMetaPacket6)
// OPCODE 10 // OPCODES 0x10-1e
case SlottedMetaPacket1 => SlottedMetaPacket.decodeWithOpcode(SlottedMetaPacket1) case 0x10 => SlottedMetaPacket.decodeWithOpcode(SlottedMetaPacket7)
case SlottedMetaPacket2 => SlottedMetaPacket.decodeWithOpcode(SlottedMetaPacket2) case 0x11 => noDecoder(RelatedA0)
case SlottedMetaPacket3 => SlottedMetaPacket.decodeWithOpcode(SlottedMetaPacket3) case 0x12 => noDecoder(RelatedA1)
case SlottedMetaPacket4 => SlottedMetaPacket.decodeWithOpcode(SlottedMetaPacket4) case 0x13 => noDecoder(RelatedA2)
case SlottedMetaPacket5 => SlottedMetaPacket.decodeWithOpcode(SlottedMetaPacket5) case 0x14 => noDecoder(RelatedA3)
case SlottedMetaPacket6 => SlottedMetaPacket.decodeWithOpcode(SlottedMetaPacket6) case 0x15 => noDecoder(RelatedB0)
case SlottedMetaPacket7 => SlottedMetaPacket.decodeWithOpcode(SlottedMetaPacket7) case 0x16 => noDecoder(RelatedB1)
case RelatedA0 => noDecoder(opcode) case 0x17 => noDecoder(RelatedB2)
case RelatedA1 => noDecoder(opcode) // 0x18
case RelatedA2 => noDecoder(opcode) case 0x18 => noDecoder(RelatedB3)
case 0x19 => control.MultiPacketEx.decode
// OPCODE 20 case 0x1a => noDecoder(Unknown26)
case RelatedA3 => noDecoder(opcode) case 0x1b => noDecoder(Unknown27)
case RelatedB0 => noDecoder(opcode) case 0x1c => noDecoder(Unknown28)
case RelatedB1 => noDecoder(opcode) case 0x1d => control.ConnectionClose.decode
case RelatedB2 => noDecoder(opcode) case 0x1e => noDecoder(Unknown30)
case RelatedB3 => noDecoder(opcode) case default => noDecoder(opcode)
case MultiPacketEx => control.MultiPacketEx.decode
case Unknown26 => noDecoder(opcode)
case Unknown27 => noDecoder(opcode)
case Unknown28 => noDecoder(opcode)
case ConnectionClose => control.ConnectionClose.decode
// OPCODE 30
case Unknown30 => noDecoder(opcode)
case default => noDecoder(opcode)
} }
implicit val codec: Codec[this.Value] = PacketHelpers.createEnumerationCodec(this, uint8L) implicit val codec: Codec[this.Value] = PacketHelpers.createEnumerationCodec(this, uint8L)

View file

@ -5,6 +5,8 @@ import scodec.{Attempt, Codec, DecodeResult, Err}
import scodec.bits.BitVector import scodec.bits.BitVector
import scodec.codecs._ import scodec.codecs._
import scala.annotation.switch
/** /**
* The master list of Game packet opcodes that have been discovered in the PlanetSide client. * The master list of Game packet opcodes that have been discovered in the PlanetSide client.
* *
@ -17,9 +19,7 @@ import scodec.codecs._
object GamePacketOpcode extends Enumeration { object GamePacketOpcode extends Enumeration {
type Type = Value type Type = Value
val val
// OPCODES 0x00-0f
// Opcodes should have a marker every 10 (decimal)
// OPCODE 0
Unknown0, Unknown0,
LoginMessage, LoginMessage,
LoginRespMessage, LoginRespMessage,
@ -28,36 +28,36 @@ object GamePacketOpcode extends Enumeration {
VNLWorldStatusMessage, VNLWorldStatusMessage,
UnknownMessage6, UnknownMessage6,
UnknownMessage7, UnknownMessage7,
// 0x08
PlayerStateMessage, PlayerStateMessage,
HitMessage, HitMessage,
// OPCODE 10
HitHint, HitHint,
DamageMessage, DamageMessage,
DestroyMessage, DestroyMessage,
ReloadMessage, ReloadMessage,
MountVehicleMsg, MountVehicleMsg,
DismountVehicleMsg, DismountVehicleMsg,
// OPCODES 0x10-1f
UseItemMessage, UseItemMessage,
MoveItemMessage, MoveItemMessage,
ChatMsg, ChatMsg,
CharacterNoRecordMessage, CharacterNoRecordMessage,
// OPCODE 20
CharacterInfoMessage, CharacterInfoMessage,
UnknownMessage21, UnknownMessage21,
BindPlayerMessage, BindPlayerMessage,
ObjectCreateMessage_Duplicate, ObjectCreateMessage_Duplicate,
// 0x18
ObjectCreateMessage, ObjectCreateMessage,
ObjectDeleteMessage, ObjectDeleteMessage,
PingMsg, PingMsg,
VehicleStateMessage, VehicleStateMessage,
FrameVehicleStateMessage, FrameVehicleStateMessage,
GenericObjectStateMsg, GenericObjectStateMsg,
// OPCODE 30
ChildObjectStateMessage, ChildObjectStateMessage,
ActionResultMessage, ActionResultMessage,
// OPCODES 0x20-2f
UnknownMessage32, UnknownMessage32,
ActionProgressMessage, ActionProgressMessage,
ActionCancelMessage, ActionCancelMessage,
@ -66,8 +66,7 @@ object GamePacketOpcode extends Enumeration {
EmoteMsg, EmoteMsg,
UnuseItemMessage, UnuseItemMessage,
ObjectDetachMessage, ObjectDetachMessage,
// 0x28
// OPCODE 40
CreateShortcutMessage, CreateShortcutMessage,
ChangeShortcutBankMessage, ChangeShortcutBankMessage,
ObjectAttachMessage, ObjectAttachMessage,
@ -76,36 +75,36 @@ object GamePacketOpcode extends Enumeration {
RequestDestroyMessage, RequestDestroyMessage,
UnknownMessage46, UnknownMessage46,
CharacterCreateRequestMessage, CharacterCreateRequestMessage,
// OPCODES 0x30-3f
CharacterRequestMessage, CharacterRequestMessage,
LoadMapMessage, LoadMapMessage,
// OPCODE 50
SetCurrentAvatarMessage, SetCurrentAvatarMessage,
ObjectHeldMessage, ObjectHeldMessage,
WeaponFireMessage, WeaponFireMessage,
AvatarJumpMessage, AvatarJumpMessage,
PickupItemMessage, PickupItemMessage,
DropItemMessage, DropItemMessage,
// 0x38
InventoryStateMessage, InventoryStateMessage,
ChangeFireStateMessage_Start, ChangeFireStateMessage_Start,
ChangeFireStateMessage_Stop, ChangeFireStateMessage_Stop,
UnknownMessage59, UnknownMessage59,
// OPCODE 60
GenericCollisionMsg, GenericCollisionMsg,
QuantityUpdateMessage, QuantityUpdateMessage,
ArmorChangedMessage, ArmorChangedMessage,
ProjectileStateMessage, ProjectileStateMessage,
// OPCODES 0x40-4f
MountVehicleCargoMsg, MountVehicleCargoMsg,
DismountVehicleCargoMsg, DismountVehicleCargoMsg,
CargoMountPointStatusMessage, CargoMountPointStatusMessage,
BeginZoningMessage, BeginZoningMessage,
ItemTransactionMessage, ItemTransactionMessage,
ItemTransactionResultMessage, ItemTransactionResultMessage,
// OPCODE 70
ChangeFireModeMessage, ChangeFireModeMessage,
ChangeAmmoMessage, ChangeAmmoMessage,
// 0x48
TimeOfDayMessage, TimeOfDayMessage,
UnknownMessage73, UnknownMessage73,
SpawnRequestMessage, SpawnRequestMessage,
@ -115,7 +114,7 @@ object GamePacketOpcode extends Enumeration {
ServerVehicleOverrideMsg, ServerVehicleOverrideMsg,
LashMessage, LashMessage,
// OPCODE 80 // OPCODES 0x50-5f
TargetingInfoMessage, TargetingInfoMessage,
TriggerEffectMessage, TriggerEffectMessage,
WeaponDryFireMessage, WeaponDryFireMessage,
@ -124,36 +123,36 @@ object GamePacketOpcode extends Enumeration {
DroppodLaunchResponseMessage, DroppodLaunchResponseMessage,
GenericObjectActionMessage, GenericObjectActionMessage,
AvatarVehicleTimerMessage, AvatarVehicleTimerMessage,
// 0x58
AvatarImplantMessage, AvatarImplantMessage,
UnknownMessage89, UnknownMessage89,
// OPCODE 90
DelayedPathMountMsg, DelayedPathMountMsg,
OrbitalShuttleTimeMsg, OrbitalShuttleTimeMsg,
AIDamage, AIDamage,
DeployObjectMessage, DeployObjectMessage,
FavoritesRequest, FavoritesRequest,
FavoritesResponse, FavoritesResponse,
// OPCODES 0x60-6f
FavoritesMessage, FavoritesMessage,
ObjectDetectedMessage, ObjectDetectedMessage,
SplashHitMessage, SplashHitMessage,
SetChatFilterMessage, SetChatFilterMessage,
// OPCODE 100
AvatarSearchCriteriaMessage, AvatarSearchCriteriaMessage,
AvatarSearchResponse, AvatarSearchResponse,
WeaponJammedMessage, WeaponJammedMessage,
LinkDeadAwarenessMsg, LinkDeadAwarenessMsg,
// 0x68
DroppodFreefallingMessage, DroppodFreefallingMessage,
AvatarFirstTimeEventMessage, AvatarFirstTimeEventMessage,
AggravatedDamageMessage, AggravatedDamageMessage,
TriggerSoundMessage, TriggerSoundMessage,
LootItemMessage, LootItemMessage,
VehicleSubStateMessage, VehicleSubStateMessage,
// OPCODE 110
SquadMembershipRequest, SquadMembershipRequest,
SquadMembershipResponse, SquadMembershipResponse,
// OPCODES 0x70-7f
SquadMemberEvent, SquadMemberEvent,
PlatoonEvent, PlatoonEvent,
FriendsRequest, FriendsRequest,
@ -162,8 +161,7 @@ object GamePacketOpcode extends Enumeration {
TrainingZoneMessage, TrainingZoneMessage,
DeployableObjectsInfoMessage, DeployableObjectsInfoMessage,
SquadState, SquadState,
// 0x78
// OPCODE 120
OxygenStateMessage, OxygenStateMessage,
TradeMessage, TradeMessage,
UnknownMessage122, UnknownMessage122,
@ -172,36 +170,36 @@ object GamePacketOpcode extends Enumeration {
UnknownMessage125, UnknownMessage125,
UnknownMessage126, UnknownMessage126,
AvatarStatisticsMessage, AvatarStatisticsMessage,
// OPCODES 0x80-8f
GenericObjectAction2Message, GenericObjectAction2Message,
DestroyDisplayMessage, DestroyDisplayMessage,
// OPCODE 130
TriggerBotAction, TriggerBotAction,
SquadWaypointRequest, SquadWaypointRequest,
SquadWaypointEvent, SquadWaypointEvent,
OffshoreVehicleMessage, OffshoreVehicleMessage,
ObjectDeployedMessage, ObjectDeployedMessage,
ObjectDeployedCountMessage, ObjectDeployedCountMessage,
// 0x88
WeaponDelayFireMessage, WeaponDelayFireMessage,
BugReportMessage, BugReportMessage,
PlayerStasisMessage, PlayerStasisMessage,
UnknownMessage139, UnknownMessage139,
// OPCODE 140
OutfitMembershipRequest, OutfitMembershipRequest,
OutfitMembershipResponse, OutfitMembershipResponse,
OutfitRequest, OutfitRequest,
OutfitEvent, OutfitEvent,
// OPCODES 0x90-9f
OutfitMemberEvent, OutfitMemberEvent,
OutfitMemberUpdate, OutfitMemberUpdate,
PlanetsideStringAttributeMessage, PlanetsideStringAttributeMessage,
DataChallengeMessage, DataChallengeMessage,
DataChallengeMessageResp, DataChallengeMessageResp,
WeatherMessage, WeatherMessage,
// OPCODE 150
SimDataChallenge, SimDataChallenge,
SimDataChallengeResp, SimDataChallengeResp,
// 0x98
OutfitListEvent, OutfitListEvent,
EmpireIncentivesMessage, EmpireIncentivesMessage,
InvalidTerrainMessage, InvalidTerrainMessage,
@ -211,7 +209,7 @@ object GamePacketOpcode extends Enumeration {
UplinkPositionEvent, UplinkPositionEvent,
HotSpotUpdateMessage, HotSpotUpdateMessage,
// OPCODE 160 // OPCODES 0xa0-af
BuildingInfoUpdateMessage, BuildingInfoUpdateMessage,
FireHintMessage, FireHintMessage,
UplinkRequest, UplinkRequest,
@ -220,36 +218,36 @@ object GamePacketOpcode extends Enumeration {
WarpgateResponse, WarpgateResponse,
DamageWithPositionMessage, DamageWithPositionMessage,
GenericActionMessage, GenericActionMessage,
// 0xa8
ContinentalLockUpdateMessage, ContinentalLockUpdateMessage,
AvatarGrenadeStateMessage, AvatarGrenadeStateMessage,
// OPCODE 170
UnknownMessage170, UnknownMessage170,
UnknownMessage171, UnknownMessage171,
ReleaseAvatarRequestMessage, ReleaseAvatarRequestMessage,
AvatarDeadStateMessage, AvatarDeadStateMessage,
CSAssistMessage, CSAssistMessage,
CSAssistCommentMessage, CSAssistCommentMessage,
// OPCODES 0xb0-bf
VoiceHostRequest, VoiceHostRequest,
VoiceHostKill, VoiceHostKill,
VoiceHostInfo, VoiceHostInfo,
BattleplanMessage, BattleplanMessage,
// OPCODE 180
BattleExperienceMessage, BattleExperienceMessage,
TargetingImplantRequest, TargetingImplantRequest,
ZonePopulationUpdateMessage, ZonePopulationUpdateMessage,
DisconnectMessage, DisconnectMessage,
// 0xb8
ExperienceAddedMessage, ExperienceAddedMessage,
OrbitalStrikeWaypointMessage, OrbitalStrikeWaypointMessage,
KeepAliveMessage, KeepAliveMessage,
MapObjectStateBlockMessage, MapObjectStateBlockMessage,
SnoopMsg, SnoopMsg,
PlayerStateMessageUpstream, PlayerStateMessageUpstream,
// OPCODE 190
PlayerStateShiftMessage, PlayerStateShiftMessage,
ZipLineMessage, ZipLineMessage,
// OPCODES 0xc0-cf
CaptureFlagUpdateMessage, CaptureFlagUpdateMessage,
VanuModuleUpdateMessage, VanuModuleUpdateMessage,
FacilityBenefitShieldChargeRequestMessage, FacilityBenefitShieldChargeRequestMessage,
@ -258,8 +256,7 @@ object GamePacketOpcode extends Enumeration {
ChainLashMessage, ChainLashMessage,
ZoneInfoMessage, ZoneInfoMessage,
LongRangeProjectileInfoMessage, LongRangeProjectileInfoMessage,
// 0xc8
// OPCODE 200
WeaponLazeTargetPositionMessage, WeaponLazeTargetPositionMessage,
ModuleLimitsMessage, ModuleLimitsMessage,
OutfitBenefitMessage, OutfitBenefitMessage,
@ -268,36 +265,36 @@ object GamePacketOpcode extends Enumeration {
DensityLevelUpdateMessage, DensityLevelUpdateMessage,
ActOfGodMessage, ActOfGodMessage,
AvatarAwardMessage, AvatarAwardMessage,
// OPCODES 0xd0-df
UnknownMessage208, UnknownMessage208,
DisplayedAwardMessage, DisplayedAwardMessage,
// OPCODE 210
RespawnAMSInfoMessage, RespawnAMSInfoMessage,
ComponentDamageMessage, ComponentDamageMessage,
GenericObjectActionAtPositionMessage, GenericObjectActionAtPositionMessage,
PropertyOverrideMessage, PropertyOverrideMessage,
WarpgateLinkOverrideMessage, WarpgateLinkOverrideMessage,
EmpireBenefitsMessage, EmpireBenefitsMessage,
// 0xd8
ForceEmpireMessage, ForceEmpireMessage,
BroadcastWarpgateUpdateMessage, BroadcastWarpgateUpdateMessage,
UnknownMessage218, UnknownMessage218,
SquadMainTerminalMessage, SquadMainTerminalMessage,
// OPCODE 220
SquadMainTerminalResponseMessage, SquadMainTerminalResponseMessage,
SquadOrderMessage, SquadOrderMessage,
SquadOrderResponse, SquadOrderResponse,
ZoneLockInfoMessage, ZoneLockInfoMessage,
// OPCODES 0xe0-ef
SquadBindInfoMessage, SquadBindInfoMessage,
AudioSequenceMessage, AudioSequenceMessage,
SquadFacilityBindInfoMessage, SquadFacilityBindInfoMessage,
ZoneForcedCavernConnectionsMessage, ZoneForcedCavernConnectionsMessage,
MissionActionMessage, MissionActionMessage,
MissionKillTriggerMessage, MissionKillTriggerMessage,
// OPCODE 230
ReplicationStreamMessage, ReplicationStreamMessage,
SquadDefinitionActionMessage, SquadDefinitionActionMessage,
// 0xe8
SquadDetailDefinitionUpdateMessage, SquadDetailDefinitionUpdateMessage,
TacticsMessage, TacticsMessage,
RabbitUpdateMessage, RabbitUpdateMessage,
@ -307,7 +304,7 @@ object GamePacketOpcode extends Enumeration {
UnknownMessage238, UnknownMessage238,
OrderTerminalBugMessage, OrderTerminalBugMessage,
// OPCODE 240 // OPCODES 0xf0-f3
QueueTimedHelpMessage, QueueTimedHelpMessage,
MailMessage, MailMessage,
GameVarUpdate, GameVarUpdate,
@ -317,301 +314,301 @@ object GamePacketOpcode extends Enumeration {
private def noDecoder(opcode : GamePacketOpcode.Type) = (a : BitVector) => private def noDecoder(opcode : GamePacketOpcode.Type) = (a : BitVector) =>
Attempt.failure(Err(s"Could not find a marshaller for game packet ${opcode}")) Attempt.failure(Err(s"Could not find a marshaller for game packet ${opcode}"))
def getPacketDecoder(opcode : GamePacketOpcode.Type) : (BitVector) => Attempt[DecodeResult[PlanetSideGamePacket]] = opcode match { /// Mapping of packet IDs to decoders. Notice that we are using the @switch annotation which ensures that the Scala
// OPCODE 0 /// compiler will be able to optimize this as a lookup table (switch statement). Microbenchmarks show a nearly 400x
case Unknown0 => noDecoder(opcode) /// speedup when using a switch (given the worst case of not finding a decoder)
case LoginMessage => game.LoginMessage.decode def getPacketDecoder(opcode : GamePacketOpcode.Type) : (BitVector) => Attempt[DecodeResult[PlanetSideGamePacket]] = (opcode.id : @switch) match {
case LoginRespMessage => game.LoginRespMessage.decode // OPCODES 0x00-0f
case ConnectToWorldRequestMessage => game.ConnectToWorldRequestMessage.decode case 0x00 => noDecoder(Unknown0)
case ConnectToWorldMessage => game.ConnectToWorldMessage.decode case 0x01 => game.LoginMessage.decode
case VNLWorldStatusMessage => game.VNLWorldStatusMessage.decode case 0x02 => game.LoginRespMessage.decode
case UnknownMessage6 => noDecoder(opcode) case 0x03 => game.ConnectToWorldRequestMessage.decode
case UnknownMessage7 => noDecoder(opcode) case 0x04 => game.ConnectToWorldMessage.decode
case PlayerStateMessage => noDecoder(opcode) case 0x05 => game.VNLWorldStatusMessage.decode
case HitMessage => game.HitMessage.decode case 0x06 => noDecoder(UnknownMessage6)
case 0x07 => noDecoder(UnknownMessage7)
// 0x08
case 0x08 => noDecoder(PlayerStateMessage)
case 0x09 => game.HitMessage.decode
case 0x0a => noDecoder(HitHint)
case 0x0b => noDecoder(DamageMessage)
case 0x0c => noDecoder(DestroyMessage)
case 0x0d => game.ReloadMessage.decode
case 0x0e => noDecoder(MountVehicleMsg)
case 0x0f => noDecoder(DismountVehicleMsg)
// OPCODE 10 // OPCODES 0x10-1f
case HitHint => noDecoder(opcode) case 0x10 => game.UseItemMessage.decode
case DamageMessage => noDecoder(opcode) case 0x11 => game.MoveItemMessage.decode
case DestroyMessage => noDecoder(opcode) case 0x12 => game.ChatMsg.decode
case ReloadMessage => game.ReloadMessage.decode case 0x13 => noDecoder(CharacterNoRecordMessage)
case MountVehicleMsg => noDecoder(opcode) case 0x14 => game.CharacterInfoMessage.decode
case DismountVehicleMsg => noDecoder(opcode) case 0x15 => noDecoder(UnknownMessage21)
case UseItemMessage => game.UseItemMessage.decode case 0x16 => noDecoder(BindPlayerMessage)
case MoveItemMessage => game.MoveItemMessage.decode case 0x17 => noDecoder(ObjectCreateMessage_Duplicate)
case ChatMsg => game.ChatMsg.decode // 0x18
case CharacterNoRecordMessage => noDecoder(opcode) case 0x18 => game.ObjectCreateMessage.decode
case 0x19 => game.ObjectDeleteMessage.decode
case 0x1a => game.PingMsg.decode
case 0x1b => noDecoder(VehicleStateMessage)
case 0x1c => noDecoder(FrameVehicleStateMessage)
case 0x1d => game.GenericObjectStateMsg.decode
case 0x1e => noDecoder(ChildObjectStateMessage)
case 0x1f => game.ActionResultMessage.decode
// OPCODE 20 // OPCODES 0x20-2f
case CharacterInfoMessage => game.CharacterInfoMessage.decode case 0x20 => noDecoder(UnknownMessage32)
case UnknownMessage21 => noDecoder(opcode) case 0x21 => noDecoder(ActionProgressMessage)
case BindPlayerMessage => noDecoder(opcode) case 0x22 => noDecoder(ActionCancelMessage)
case ObjectCreateMessage_Duplicate => noDecoder(opcode) case 0x23 => noDecoder(ActionCancelAcknowledgeMessage)
case ObjectCreateMessage => game.ObjectCreateMessage.decode case 0x24 => game.SetEmpireMessage.decode
case ObjectDeleteMessage => game.ObjectDeleteMessage.decode case 0x25 => game.EmoteMsg.decode
case PingMsg => game.PingMsg.decode case 0x26 => noDecoder(UnuseItemMessage)
case VehicleStateMessage => noDecoder(opcode) case 0x27 => noDecoder(ObjectDetachMessage)
case FrameVehicleStateMessage => noDecoder(opcode) // 0x28
case GenericObjectStateMsg => game.GenericObjectStateMsg.decode case 0x28 => noDecoder(CreateShortcutMessage)
case 0x29 => noDecoder(ChangeShortcutBankMessage)
case 0x2a => noDecoder(ObjectAttachMessage)
case 0x2b => noDecoder(UnknownMessage43)
case 0x2c => noDecoder(PlanetsideAttributeMessage)
case 0x2d => game.RequestDestroyMessage.decode
case 0x2e => noDecoder(UnknownMessage46)
case 0x2f => game.CharacterCreateRequestMessage.decode
// OPCODE 30 // OPCODES 0x30-3f
case ChildObjectStateMessage => noDecoder(opcode) case 0x30 => game.CharacterRequestMessage.decode
case ActionResultMessage => game.ActionResultMessage.decode case 0x31 => noDecoder(LoadMapMessage)
case UnknownMessage32 => noDecoder(opcode) case 0x32 => game.SetCurrentAvatarMessage.decode
case ActionProgressMessage => noDecoder(opcode) case 0x33 => game.ObjectHeldMessage.decode
case ActionCancelMessage => noDecoder(opcode) case 0x34 => game.WeaponFireMessage.decode
case ActionCancelAcknowledgeMessage => noDecoder(opcode) case 0x35 => game.AvatarJumpMessage.decode
case SetEmpireMessage => game.SetEmpireMessage.decode case 0x36 => noDecoder(PickupItemMessage)
case EmoteMsg => game.EmoteMsg.decode case 0x37 => game.DropItemMessage.decode
case UnuseItemMessage => noDecoder(opcode) // 0x38
case ObjectDetachMessage => noDecoder(opcode) case 0x38 => noDecoder(InventoryStateMessage)
case 0x39 => game.ChangeFireStateMessage_Start.decode
case 0x3a => game.ChangeFireStateMessage_Stop.decode
case 0x3b => noDecoder(UnknownMessage59)
case 0x3c => noDecoder(GenericCollisionMsg)
case 0x3d => game.QuantityUpdateMessage.decode
case 0x3e => noDecoder(ArmorChangedMessage)
case 0x3f => noDecoder(ProjectileStateMessage)
// OPCODE 40 // OPCODES 0x40-4f
case CreateShortcutMessage => noDecoder(opcode) case 0x40 => noDecoder(MountVehicleCargoMsg)
case ChangeShortcutBankMessage => noDecoder(opcode) case 0x41 => noDecoder(DismountVehicleCargoMsg)
case ObjectAttachMessage => noDecoder(opcode) case 0x42 => noDecoder(CargoMountPointStatusMessage)
case UnknownMessage43 => noDecoder(opcode) case 0x43 => noDecoder(BeginZoningMessage)
case PlanetsideAttributeMessage => noDecoder(opcode) case 0x44 => game.ItemTransactionMessage.decode
case RequestDestroyMessage => game.RequestDestroyMessage.decode case 0x45 => noDecoder(ItemTransactionResultMessage)
case UnknownMessage46 => noDecoder(opcode) case 0x46 => game.ChangeFireModeMessage.decode
case CharacterCreateRequestMessage => game.CharacterCreateRequestMessage.decode case 0x47 => game.ChangeAmmoMessage.decode
case CharacterRequestMessage => game.CharacterRequestMessage.decode // 0x48
case LoadMapMessage => game.LoadMapMessage.decode case 0x48 => game.TimeOfDayMessage.decode
case 0x49 => noDecoder(UnknownMessage73)
case 0x4a => noDecoder(SpawnRequestMessage)
case 0x4b => noDecoder(DeployRequestMessage)
case 0x4c => noDecoder(UnknownMessage76)
case 0x4d => noDecoder(RepairMessage)
case 0x4e => noDecoder(ServerVehicleOverrideMsg)
case 0x4f => noDecoder(LashMessage)
// OPCODE 50 // OPCODES 0x50-5f
case SetCurrentAvatarMessage => game.SetCurrentAvatarMessage.decode case 0x50 => noDecoder(TargetingInfoMessage)
case ObjectHeldMessage => game.ObjectHeldMessage.decode case 0x51 => noDecoder(TriggerEffectMessage)
case WeaponFireMessage => game.WeaponFireMessage.decode case 0x52 => game.WeaponDryFireMessage.decode
case AvatarJumpMessage => game.AvatarJumpMessage.decode case 0x53 => noDecoder(DroppodLaunchRequestMessage)
case PickupItemMessage => noDecoder(opcode) case 0x54 => noDecoder(HackMessage)
case DropItemMessage => game.DropItemMessage.decode case 0x55 => noDecoder(DroppodLaunchResponseMessage)
case InventoryStateMessage => noDecoder(opcode) case 0x56 => noDecoder(GenericObjectActionMessage)
case ChangeFireStateMessage_Start => game.ChangeFireStateMessage_Start.decode case 0x57 => noDecoder(AvatarVehicleTimerMessage)
case ChangeFireStateMessage_Stop => game.ChangeFireStateMessage_Stop.decode // 0x58
case UnknownMessage59 => noDecoder(opcode) case 0x58 => noDecoder(AvatarImplantMessage)
case 0x59 => noDecoder(UnknownMessage89)
case 0x5a => noDecoder(DelayedPathMountMsg)
case 0x5b => noDecoder(OrbitalShuttleTimeMsg)
case 0x5c => noDecoder(AIDamage)
case 0x5d => noDecoder(DeployObjectMessage)
case 0x5e => noDecoder(FavoritesRequest)
case 0x5f => noDecoder(FavoritesResponse)
// OPCODE 60 // OPCODES 0x60-6f
case GenericCollisionMsg => noDecoder(opcode) case 0x60 => noDecoder(FavoritesMessage)
case QuantityUpdateMessage => game.QuantityUpdateMessage.decode case 0x61 => noDecoder(ObjectDetectedMessage)
case ArmorChangedMessage => noDecoder(opcode) case 0x62 => noDecoder(SplashHitMessage)
case ProjectileStateMessage => noDecoder(opcode) case 0x63 => noDecoder(SetChatFilterMessage)
case MountVehicleCargoMsg => noDecoder(opcode) case 0x64 => noDecoder(AvatarSearchCriteriaMessage)
case DismountVehicleCargoMsg => noDecoder(opcode) case 0x65 => noDecoder(AvatarSearchResponse)
case CargoMountPointStatusMessage => noDecoder(opcode) case 0x66 => game.WeaponJammedMessage.decode
case BeginZoningMessage => noDecoder(opcode) case 0x67 => noDecoder(LinkDeadAwarenessMsg)
case ItemTransactionMessage => game.ItemTransactionMessage.decode // 0x68
case ItemTransactionResultMessage => noDecoder(opcode) case 0x68 => noDecoder(DroppodFreefallingMessage)
case 0x69 => game.AvatarFirstTimeEventMessage.decode
case 0x6a => noDecoder(AggravatedDamageMessage)
case 0x6b => noDecoder(TriggerSoundMessage)
case 0x6c => noDecoder(LootItemMessage)
case 0x6d => noDecoder(VehicleSubStateMessage)
case 0x6e => noDecoder(SquadMembershipRequest)
case 0x6f => noDecoder(SquadMembershipResponse)
// OPCODE 70 // OPCODES 0x70-7f
case ChangeFireModeMessage => game.ChangeFireModeMessage.decode case 0x70 => noDecoder(SquadMemberEvent)
case ChangeAmmoMessage => game.ChangeAmmoMessage.decode case 0x71 => noDecoder(PlatoonEvent)
case TimeOfDayMessage => game.TimeOfDayMessage.decode case 0x72 => noDecoder(FriendsRequest)
case UnknownMessage73 => noDecoder(opcode) case 0x73 => noDecoder(FriendsResponse)
case SpawnRequestMessage => noDecoder(opcode) case 0x74 => noDecoder(TriggerEnvironmentalDamageMessage)
case DeployRequestMessage => noDecoder(opcode) case 0x75 => noDecoder(TrainingZoneMessage)
case UnknownMessage76 => noDecoder(opcode) case 0x76 => noDecoder(DeployableObjectsInfoMessage)
case RepairMessage => noDecoder(opcode) case 0x77 => noDecoder(SquadState)
case ServerVehicleOverrideMsg => noDecoder(opcode) // 0x78
case LashMessage => noDecoder(opcode) case 0x78 => noDecoder(OxygenStateMessage)
case 0x79 => noDecoder(TradeMessage)
case 0x7a => noDecoder(UnknownMessage122)
case 0x7b => noDecoder(DamageFeedbackMessage)
case 0x7c => noDecoder(DismountBuildingMsg)
case 0x7d => noDecoder(UnknownMessage125)
case 0x7e => noDecoder(UnknownMessage126)
case 0x7f => noDecoder(AvatarStatisticsMessage)
// OPCODE 80 // OPCODES 0x80-8f
case TargetingInfoMessage => noDecoder(opcode) case 0x80 => noDecoder(GenericObjectAction2Message)
case TriggerEffectMessage => noDecoder(opcode) case 0x81 => noDecoder(DestroyDisplayMessage)
case WeaponDryFireMessage => game.WeaponDryFireMessage.decode case 0x82 => noDecoder(TriggerBotAction)
case DroppodLaunchRequestMessage => noDecoder(opcode) case 0x83 => noDecoder(SquadWaypointRequest)
case HackMessage => noDecoder(opcode) case 0x84 => noDecoder(SquadWaypointEvent)
case DroppodLaunchResponseMessage => noDecoder(opcode) case 0x85 => noDecoder(OffshoreVehicleMessage)
case GenericObjectActionMessage => noDecoder(opcode) case 0x86 => noDecoder(ObjectDeployedMessage)
case AvatarVehicleTimerMessage => noDecoder(opcode) case 0x87 => noDecoder(ObjectDeployedCountMessage)
case AvatarImplantMessage => noDecoder(opcode) // 0x88
case UnknownMessage89 => noDecoder(opcode) case 0x88 => game.WeaponDelayFireMessage.decode
case 0x89 => noDecoder(BugReportMessage)
case 0x8a => noDecoder(PlayerStasisMessage)
case 0x8b => noDecoder(UnknownMessage139)
case 0x8c => noDecoder(OutfitMembershipRequest)
case 0x8d => noDecoder(OutfitMembershipResponse)
case 0x8e => noDecoder(OutfitRequest)
case 0x8f => noDecoder(OutfitEvent)
// OPCODE 90 // OPCODES 0x90-9f
case DelayedPathMountMsg => noDecoder(opcode) case 0x90 => noDecoder(OutfitMemberEvent)
case OrbitalShuttleTimeMsg => noDecoder(opcode) case 0x91 => noDecoder(OutfitMemberUpdate)
case AIDamage => noDecoder(opcode) case 0x92 => noDecoder(PlanetsideStringAttributeMessage)
case DeployObjectMessage => noDecoder(opcode) case 0x93 => noDecoder(DataChallengeMessage)
case FavoritesRequest => noDecoder(opcode) case 0x94 => noDecoder(DataChallengeMessageResp)
case FavoritesResponse => noDecoder(opcode) case 0x95 => noDecoder(WeatherMessage)
case FavoritesMessage => noDecoder(opcode) case 0x96 => noDecoder(SimDataChallenge)
case ObjectDetectedMessage => noDecoder(opcode) case 0x97 => noDecoder(SimDataChallengeResp)
case SplashHitMessage => noDecoder(opcode) // 0x98
case SetChatFilterMessage => noDecoder(opcode) case 0x98 => noDecoder(OutfitListEvent)
case 0x99 => noDecoder(EmpireIncentivesMessage)
case 0x9a => noDecoder(InvalidTerrainMessage)
case 0x9b => noDecoder(SyncMessage)
case 0x9c => noDecoder(DebugDrawMessage)
case 0x9d => noDecoder(SoulMarkMessage)
case 0x9e => noDecoder(UplinkPositionEvent)
case 0x9f => noDecoder(HotSpotUpdateMessage)
// OPCODE 100 // OPCODES 0xa0-af
case AvatarSearchCriteriaMessage => noDecoder(opcode) case 0xa0 => noDecoder(BuildingInfoUpdateMessage)
case AvatarSearchResponse => noDecoder(opcode) case 0xa1 => noDecoder(FireHintMessage)
case WeaponJammedMessage => game.WeaponJammedMessage.decode case 0xa2 => noDecoder(UplinkRequest)
case LinkDeadAwarenessMsg => noDecoder(opcode) case 0xa3 => noDecoder(UplinkResponse)
case DroppodFreefallingMessage => noDecoder(opcode) case 0xa4 => noDecoder(WarpgateRequest)
case AvatarFirstTimeEventMessage => game.AvatarFirstTimeEventMessage.decode case 0xa5 => noDecoder(WarpgateResponse)
case AggravatedDamageMessage => noDecoder(opcode) case 0xa6 => noDecoder(DamageWithPositionMessage)
case TriggerSoundMessage => noDecoder(opcode) case 0xa7 => noDecoder(GenericActionMessage)
case LootItemMessage => noDecoder(opcode) // 0xa8
case VehicleSubStateMessage => noDecoder(opcode) case 0xa8 => game.ContinentalLockUpdateMessage.decode
case 0xa9 => noDecoder(AvatarGrenadeStateMessage)
case 0xaa => noDecoder(UnknownMessage170)
case 0xab => noDecoder(UnknownMessage171)
case 0xac => noDecoder(ReleaseAvatarRequestMessage)
case 0xad => noDecoder(AvatarDeadStateMessage)
case 0xae => noDecoder(CSAssistMessage)
case 0xaf => noDecoder(CSAssistCommentMessage)
// OPCODE 110 // OPCODES 0xb0-bf
case SquadMembershipRequest => noDecoder(opcode) case 0xb0 => noDecoder(VoiceHostRequest)
case SquadMembershipResponse => noDecoder(opcode) case 0xb1 => noDecoder(VoiceHostKill)
case SquadMemberEvent => noDecoder(opcode) case 0xb2 => noDecoder(VoiceHostInfo)
case PlatoonEvent => noDecoder(opcode) case 0xb3 => noDecoder(BattleplanMessage)
case FriendsRequest => noDecoder(opcode) case 0xb4 => noDecoder(BattleExperienceMessage)
case FriendsResponse => noDecoder(opcode) case 0xb5 => noDecoder(TargetingImplantRequest)
case TriggerEnvironmentalDamageMessage => noDecoder(opcode) case 0xb6 => noDecoder(ZonePopulationUpdateMessage)
case TrainingZoneMessage => noDecoder(opcode) case 0xb7 => noDecoder(DisconnectMessage)
case DeployableObjectsInfoMessage => noDecoder(opcode) // 0xb8
case SquadState => noDecoder(opcode) case 0xb8 => noDecoder(ExperienceAddedMessage)
case 0xb9 => noDecoder(OrbitalStrikeWaypointMessage)
case 0xba => game.KeepAliveMessage.decode
case 0xbb => noDecoder(MapObjectStateBlockMessage)
case 0xbc => noDecoder(SnoopMsg)
case 0xbd => game.PlayerStateMessageUpstream.decode
case 0xbe => noDecoder(PlayerStateShiftMessage)
case 0xbf => noDecoder(ZipLineMessage)
// OPCODE 120 // OPCODES 0xc0-cf
case OxygenStateMessage => noDecoder(opcode) case 0xc0 => noDecoder(CaptureFlagUpdateMessage)
case TradeMessage => noDecoder(opcode) case 0xc1 => noDecoder(VanuModuleUpdateMessage)
case UnknownMessage122 => noDecoder(opcode) case 0xc2 => noDecoder(FacilityBenefitShieldChargeRequestMessage)
case DamageFeedbackMessage => noDecoder(opcode) case 0xc3 => noDecoder(ProximityTerminalUseMessage)
case DismountBuildingMsg => noDecoder(opcode) case 0xc4 => game.QuantityDeltaUpdateMessage.decode
case UnknownMessage125 => noDecoder(opcode) case 0xc5 => noDecoder(ChainLashMessage)
case UnknownMessage126 => noDecoder(opcode) case 0xc6 => noDecoder(ZoneInfoMessage)
case AvatarStatisticsMessage => noDecoder(opcode) case 0xc7 => noDecoder(LongRangeProjectileInfoMessage)
case GenericObjectAction2Message => noDecoder(opcode) // 0xc8
case DestroyDisplayMessage => noDecoder(opcode) case 0xc8 => noDecoder(WeaponLazeTargetPositionMessage)
case 0xc9 => noDecoder(ModuleLimitsMessage)
case 0xca => noDecoder(OutfitBenefitMessage)
case 0xcb => noDecoder(EmpireChangeTimeMessage)
case 0xcc => noDecoder(ClockCalibrationMessage)
case 0xcd => noDecoder(DensityLevelUpdateMessage)
case 0xce => noDecoder(ActOfGodMessage)
case 0xcf => noDecoder(AvatarAwardMessage)
// OPCODE 130 // OPCODES 0xd0-df
case TriggerBotAction => noDecoder(opcode) case 0xd0 => noDecoder(UnknownMessage208)
case SquadWaypointRequest => noDecoder(opcode) case 0xd1 => noDecoder(DisplayedAwardMessage)
case SquadWaypointEvent => noDecoder(opcode) case 0xd2 => noDecoder(RespawnAMSInfoMessage)
case OffshoreVehicleMessage => noDecoder(opcode) case 0xd3 => noDecoder(ComponentDamageMessage)
case ObjectDeployedMessage => noDecoder(opcode) case 0xd4 => noDecoder(GenericObjectActionAtPositionMessage)
case ObjectDeployedCountMessage => noDecoder(opcode) case 0xd5 => noDecoder(PropertyOverrideMessage)
case WeaponDelayFireMessage => game.WeaponDelayFireMessage.decode case 0xd6 => noDecoder(WarpgateLinkOverrideMessage)
case BugReportMessage => noDecoder(opcode) case 0xd7 => noDecoder(EmpireBenefitsMessage)
case PlayerStasisMessage => noDecoder(opcode) // 0xd8
case UnknownMessage139 => noDecoder(opcode) case 0xd8 => noDecoder(ForceEmpireMessage)
case 0xd9 => game.BroadcastWarpgateUpdateMessage.decode
case 0xda => noDecoder(UnknownMessage218)
case 0xdb => noDecoder(SquadMainTerminalMessage)
case 0xdc => noDecoder(SquadMainTerminalResponseMessage)
case 0xdd => noDecoder(SquadOrderMessage)
case 0xde => noDecoder(SquadOrderResponse)
case 0xdf => noDecoder(ZoneLockInfoMessage)
// OPCODE 140 // OPCODES 0xe0-ef
case OutfitMembershipRequest => noDecoder(opcode) case 0xe0 => noDecoder(SquadBindInfoMessage)
case OutfitMembershipResponse => noDecoder(opcode) case 0xe1 => noDecoder(AudioSequenceMessage)
case OutfitRequest => noDecoder(opcode) case 0xe2 => noDecoder(SquadFacilityBindInfoMessage)
case OutfitEvent => noDecoder(opcode) case 0xe3 => noDecoder(ZoneForcedCavernConnectionsMessage)
case OutfitMemberEvent => noDecoder(opcode) case 0xe4 => noDecoder(MissionActionMessage)
case OutfitMemberUpdate => noDecoder(opcode) case 0xe5 => noDecoder(MissionKillTriggerMessage)
case PlanetsideStringAttributeMessage => noDecoder(opcode) case 0xe6 => noDecoder(ReplicationStreamMessage)
case DataChallengeMessage => noDecoder(opcode) case 0xe7 => noDecoder(SquadDefinitionActionMessage)
case DataChallengeMessageResp => noDecoder(opcode) // 0xe8
case WeatherMessage => noDecoder(opcode) case 0xe8 => noDecoder(SquadDetailDefinitionUpdateMessage)
case 0xe9 => noDecoder(TacticsMessage)
case 0xea => noDecoder(RabbitUpdateMessage)
case 0xeb => noDecoder(SquadInvitationRequestMessage)
case 0xec => noDecoder(CharacterKnowledgeMessage)
case 0xed => noDecoder(GameScoreUpdateMessage)
case 0xee => noDecoder(UnknownMessage238)
case 0xef => noDecoder(OrderTerminalBugMessage)
// OPCODE 150 // OPCODES 0xf0-f3
case SimDataChallenge => noDecoder(opcode) case 0xf0 => noDecoder(QueueTimedHelpMessage)
case SimDataChallengeResp => noDecoder(opcode) case 0xf1 => noDecoder(MailMessage)
case OutfitListEvent => noDecoder(opcode) case 0xf2 => noDecoder(GameVarUpdate)
case EmpireIncentivesMessage => noDecoder(opcode) case 0xf3 => noDecoder(ClientCheatedMessage)
case InvalidTerrainMessage => noDecoder(opcode) case default => noDecoder(opcode)
case SyncMessage => noDecoder(opcode)
case DebugDrawMessage => noDecoder(opcode)
case SoulMarkMessage => noDecoder(opcode)
case UplinkPositionEvent => noDecoder(opcode)
case HotSpotUpdateMessage => noDecoder(opcode)
// OPCODE 160
case BuildingInfoUpdateMessage => game.BuildingInfoUpdateMessage.decode
case FireHintMessage => noDecoder(opcode)
case UplinkRequest => noDecoder(opcode)
case UplinkResponse => noDecoder(opcode)
case WarpgateRequest => noDecoder(opcode)
case WarpgateResponse => noDecoder(opcode)
case DamageWithPositionMessage => noDecoder(opcode)
case GenericActionMessage => noDecoder(opcode)
case ContinentalLockUpdateMessage => game.ContinentalLockUpdateMessage.decode
case AvatarGrenadeStateMessage => noDecoder(opcode)
// OPCODE 170
case UnknownMessage170 => noDecoder(opcode)
case UnknownMessage171 => noDecoder(opcode)
case ReleaseAvatarRequestMessage => noDecoder(opcode)
case AvatarDeadStateMessage => noDecoder(opcode)
case CSAssistMessage => noDecoder(opcode)
case CSAssistCommentMessage => noDecoder(opcode)
case VoiceHostRequest => noDecoder(opcode)
case VoiceHostKill => noDecoder(opcode)
case VoiceHostInfo => noDecoder(opcode)
case BattleplanMessage => noDecoder(opcode)
// OPCODE 180
case BattleExperienceMessage => noDecoder(opcode)
case TargetingImplantRequest => noDecoder(opcode)
case ZonePopulationUpdateMessage => noDecoder(opcode)
case DisconnectMessage => noDecoder(opcode)
case ExperienceAddedMessage => noDecoder(opcode)
case OrbitalStrikeWaypointMessage => noDecoder(opcode)
case KeepAliveMessage => game.KeepAliveMessage.decode
case MapObjectStateBlockMessage => noDecoder(opcode)
case SnoopMsg => noDecoder(opcode)
case PlayerStateMessageUpstream => game.PlayerStateMessageUpstream.decode
// OPCODE 190
case PlayerStateShiftMessage => noDecoder(opcode)
case ZipLineMessage => noDecoder(opcode)
case CaptureFlagUpdateMessage => noDecoder(opcode)
case VanuModuleUpdateMessage => noDecoder(opcode)
case FacilityBenefitShieldChargeRequestMessage => noDecoder(opcode)
case ProximityTerminalUseMessage => noDecoder(opcode)
case QuantityDeltaUpdateMessage => game.QuantityDeltaUpdateMessage.decode
case ChainLashMessage => noDecoder(opcode)
case ZoneInfoMessage => noDecoder(opcode)
case LongRangeProjectileInfoMessage => noDecoder(opcode)
// OPCODE 200
case WeaponLazeTargetPositionMessage => noDecoder(opcode)
case ModuleLimitsMessage => noDecoder(opcode)
case OutfitBenefitMessage => noDecoder(opcode)
case EmpireChangeTimeMessage => noDecoder(opcode)
case ClockCalibrationMessage => noDecoder(opcode)
case DensityLevelUpdateMessage => noDecoder(opcode)
case ActOfGodMessage => noDecoder(opcode)
case AvatarAwardMessage => noDecoder(opcode)
case UnknownMessage208 => noDecoder(opcode)
case DisplayedAwardMessage => noDecoder(opcode)
// OPCODE 210
case RespawnAMSInfoMessage => noDecoder(opcode)
case ComponentDamageMessage => noDecoder(opcode)
case GenericObjectActionAtPositionMessage => noDecoder(opcode)
case PropertyOverrideMessage => noDecoder(opcode)
case WarpgateLinkOverrideMessage => noDecoder(opcode)
case EmpireBenefitsMessage => noDecoder(opcode)
case ForceEmpireMessage => noDecoder(opcode)
case BroadcastWarpgateUpdateMessage => game.BroadcastWarpgateUpdateMessage.decode
case UnknownMessage218 => noDecoder(opcode)
case SquadMainTerminalMessage => noDecoder(opcode)
// OPCODE 220
case SquadMainTerminalResponseMessage => noDecoder(opcode)
case SquadOrderMessage => noDecoder(opcode)
case SquadOrderResponse => noDecoder(opcode)
case ZoneLockInfoMessage => noDecoder(opcode)
case SquadBindInfoMessage => noDecoder(opcode)
case AudioSequenceMessage => noDecoder(opcode)
case SquadFacilityBindInfoMessage => noDecoder(opcode)
case ZoneForcedCavernConnectionsMessage => noDecoder(opcode)
case MissionActionMessage => noDecoder(opcode)
case MissionKillTriggerMessage => noDecoder(opcode)
// OPCODE 230
case ReplicationStreamMessage => noDecoder(opcode)
case SquadDefinitionActionMessage => noDecoder(opcode)
case SquadDetailDefinitionUpdateMessage => noDecoder(opcode)
case TacticsMessage => noDecoder(opcode)
case RabbitUpdateMessage => noDecoder(opcode)
case SquadInvitationRequestMessage => noDecoder(opcode)
case CharacterKnowledgeMessage => noDecoder(opcode)
case GameScoreUpdateMessage => noDecoder(opcode)
case UnknownMessage238 => noDecoder(opcode)
case OrderTerminalBugMessage => noDecoder(opcode)
// OPCODE 240
case QueueTimedHelpMessage => noDecoder(opcode)
case MailMessage => noDecoder(opcode)
case GameVarUpdate => noDecoder(opcode)
case ClientCheatedMessage => noDecoder(opcode)
case default => noDecoder(opcode)
} }
implicit val codec: Codec[this.Value] = PacketHelpers.createEnumerationCodec(this, uint8L) implicit val codec: Codec[this.Value] = PacketHelpers.createEnumerationCodec(this, uint8L)

View file

@ -280,16 +280,16 @@ object PacketCoding {
opcode match { opcode match {
case Failure(e) => case Failure(e) =>
return Attempt.failure(Err("Failed to decode control packet's opcode: " + e.message)) Attempt.failure(Err("Failed to decode control packet's opcode: " + e.message))
case _ => case Successful(op) =>
} val packet = ControlPacketOpcode.getPacketDecoder(op.value)(op.remainder)
val packet = ControlPacketOpcode.getPacketDecoder(opcode.require.value)(opcode.require.remainder) packet match {
case Failure(e) =>
packet match { Attempt.failure(Err(f"Failed to parse control packet ${op.value}: " + e.messageWithContext))
case Failure(e) => case Successful(p) =>
Attempt.failure(Err(f"Failed to parse control packet 0x${opcode.require.value.id}%02x: " + e.messageWithContext)) Attempt.successful(p.value)
case Successful(p) => Attempt.successful(p.value) }
} }
} }