Game Server Protocol Overview - Xsear/Documentation GitHub Wiki

Ok so this is to be a semi brief overview of the networking protocol and related systems as we currently under stand them.

Login and Zone Selection

This will just be a brief overview of this part, there is more to this that can be covered later.

The initial steps are done over HTTPS to a web server.

  • User sends a log in request with user name / password
  • If authenticated the web server sends back a character list, this gets you to the choose a character screen.
  • When the user clicks the "Enter World" button another HTTPS request is made to get an "Oracle Ticket"
  • The server sends back an oracle ticket like below.
"matrix_url": 127.0.0.1,
"ticket": "A base64 encoded data string, contents not known as of yet",
"datacenter": "localhost",
    "operator_override": {
        "ingame_host": "https://indev.themeldingwars.com/ingame_host",
        "clientapi_host": "https://indev.themeldingwars.com/clientapi"
    },
    "session_id": "8360c86c-a3d0-11e4-9e16-c074c1266b6d",
    "hostname": "localhost",
"country": "GB"

The key bit here is the matrix_url - this is the ip that the game client will now start sending packets to over UDP on port 25000

Note: We have a simple test web API up for local server testing at https://indev.themeldingwars.com this server just returns an Oracle ticket pointed to 127.0.0.1:25000

To use open your Firefall.ini in the games install and add

[Config]
OperatorHost= "indev.themeldingwars.com"

Game Server Connection

The protocol data, such as message ids and sequence numbers, is in Big Endian. The values within the game messages appear to mostly be in Little Endian.

Handshake

Now that the client knows where to connect it has to establish a connection with that game server. This is all done over UDP and the game uses a custom networking protocol over UDP for reliability when it is deemed necessary. The command format for these handshake messages is:

[uint]         [char[4]] 
----------     -----------
SocketID        Id for msg    
00 00 00 00     50 4F 4B 45 

For the matrix handshake the socket id is always 0 The first packet that the client sends is a POKE message to the server to start off the connection. (You can use matrix_connectiontest ip in the console to test the handshaking and a simple connection)

The flow is

[Client]          [Server]
POKE        ->
            <-     HEHE
KISS        ->
            <-     HUGG

(Yes they really are called HEHE, KISS, POKE and I love it :D) (and apparently a hug comes after the kiss)

Below are the packets sent and received as part of the handshake.

POKE (Client)

[uint]         [char[4]]      [uint]
----------     -----------    ----------------
SocketID        Id for msg    Protocol Version
00 00 00 00     50 4F 4B 45   00 04 B9 68

HEHE (Server)

[uint]         [char[4]]      [uint]
----------     -----------    ----------------
SocketID        Id for msg    SocketID
00 00 00 00     50 4F 4B 45   F1 07 12 8E

KISS (Client)

[uint]         [char[4]]      [uint]              [ushort]
----------     -----------    ----------------    ----------------
SocketID        Id for msg    SocketID            Streaming Protcol
00 00 00 00     50 4F 4B 45   F1 07 12 8E         4C 5F

HUGG (Server)

[uint]         [char[4]]      [ushort]            [ushort]
----------     -----------    ----------------    ----------------
SocketID        Id for msg    SequenceStart       GameServerPort
00 00 00 00     50 4F 4B 45   F7 A1               D2 65

ABRT

[uint]         [char[4]] 
----------     ----------- 
SocketID        Id for msg  
00 00 00 00     41 42 52 54

Used to end a connection

Main Connection

After a successful handshake the client will then start to communicate to the game server on the port that was assigned in the above handshake. eg the game will start sending packets to 127.0.0.1:53861 and the client will receive packet on port that the first matrix handshake message was received from.

All packets to and from the server start with a uint for the socket id that was assigned from the handshake. (Again if the id is 0 is a matrix handshake message).

[uint]      
----------     
SocketID      

Each packet can contain more than one message.

The first two bytes of each message is a header containing network data for that message.

Below is the breakdown of the message header:

[2bits]      [2bits]         [1bit]         [11bits] 
---------    ------------    ------------    ------------ 
Channel      Resend Count    Is Splitted     Length

Let's look at what each of these mean.

Length

This is the number of bytes, including the above message header, that represents this message within the packet.

Channel

There are four channels and the messages sent on them differ in structure and use. They all have additional "header" data.

Is Splitted

UDP packets have a max size and so if a message being sent is bigger than this size it will have to be split across multiple packets.

The client appears to split messages if the data exceeds 1260 bytes.

Split packets are per channel and not global across them.

When it is necessary to send a message over multiple packets, the client will start a new packet for this message.

In the message header of the first packet containing the message, Is Splitted will be set to 1. The message is the only message within the packet. The data of this message should be held in a buffer whilst waiting for the next packet.

If the first (and as thus the only) message header of the next packet received on the same channel still has Is Splitted set to 1, the data of this message, excluding the message header and Sequence Number, should be appended to the data buffer from the previous packet.

If the first message header of the next package received on the same channel has Is Splitted set to 0, this is the last part of the split message. The data of this message, excluding the message header and Sequence Number, should be appended to the data buffer and after this the message is ready to be parsed.

Note that the final packet of a split message, like any regular packet, can contain more messages after the first one. Those are not related to the split message, the channel has merely gone back to normal operation and may have had some messages waiting.

Resend Count

Channels 1 and 2 are considered "reliable" channels. Upon receiving messages on these channels, an ACK message must be sent on channel 0. The client will resend the message if it does not receive an ACK, this is when this value comes into play.

On the reliable channels we need to check the Resend Count. If this is greater than 0 than we need to xor the data to get the correct values. and ofc its not a static value to xor against, we use the Resend Count to index a preset list of xor values. Below is the list of xor values to use.

byte[] xors = new byte[] { 0x00, 0xFF, 0xCC, 0xAA };

eg if the Resend Count is 1 then we would XOR all the data after the Sequence Number with 0xFF (xors[Resend Count])

TODO: Investigate if the indexing can differ.

Sequence Number

Messages on channel 1, 2 and 3 extend the message header with a ushort that indicates a Sequence Number.

[ushort]      
---------------
Sequence Number 

The sequence number is per channel and per direction. Sending on channel 1 will have a different sequence number than sending on channel 2, and the server and client each use their own respective numbering.

The starting value of all sequence numbers is set by the HUGG message sent by the server during the handshake.

The sequence number is written in Big Endian and should not be XOR:ed for resent messages.

As the sequence number is only two bytes, it cannot exceed the value 65535. At this point, it seems the correct approach is to start over from 0. The client will log TRACE messages indicating it's unhappy but it will still accept the messages, which it would not normally.

TODO: Confirm ACK message behavior, currently I send 0 as the next number when receiving the max value. Check what the client does.

Channel 0 - Control messages

[byte]      
---------------
Msg ID

The first byte of a channel 0 message indicates the message type.

Channel 0 seems to be for protocol level control commands such as ACK's, NACK's and time updates.

The following messages are known:

Msg 0 - Close Connection

[byte]         [byte[8]]  
----------     ------------------------
Msg ID         Zeroes  
00             00 00 00 00 00 00 00 000

Msg 2 - ACK 1

[byte]         [ushort]         [ushort]
----------     ---------------  --------------- 
Msg ID         SeqNum NEXT      SeqNum RECV  
02             F7 A1            F7 A2            

Used to ACK messages from channel 1.

Msg 3 - ACK 2

[byte]         [ushort]         [ushort]
----------     ---------------  --------------- 
Msg ID         SeqNum NEXT      SeqNum RECV  
03             F7 A1            F7 A2            

Used to ACK messages from channel 2.

Msg 4 - Time Sync Request

[byte]         [long]         
----------     -----------------------   
Msg ID         ClientTime UNIX     
04             E0 B2 DE 5D 44 00 00 00   

The client sends this request and expects to receive a Time Sync Response back.

Msg 5 - Time Sync Response

[byte]         [long]                    [long]
----------     -----------------------   ----------------------- 
Msg ID         ClientTime UNIX           ServerTime UNIX  
05             E0 B2 DE 5D 44 00 00 00   D3 3E A5 76 47 41 05 00

This is the response of the server to a Time Sync Request.

Please note that the client at least partially relies on the server to advance the time. It's important to actually send the time back.

Channel 1 - Matrix messages

[byte]      
---------------
Msg ID

Channel 1 uses a single byte for the message id.

Channel 1 seems to be for the more abstract game functions that don't directly relate to in world entities. This includes commands such as changing zones and entering PVP matches.

Channel 1 is considered a reliable channel, received messages are acknowledged by sending the ACK 1 message on channel 0.

Below is the names for each known message:

Channel 1 Message ids to names
17    matrix_fury::Login
18    matrix_fury::EnterZoneAck
19    matrix_fury::ExitZoneAck 
20    matrix_fury::KeyframeRequest
21    matrix_fury::DEV_ExecuteCommand
22    matrix_fury::Referee_ExecuteCommand
23    matrix_fury::RequestPause
24    matrix_fury::RequestResume
25    matrix_fury::ClientStatus
26    matrix_fury::ClientPreferences
27    matrix_fury::SynchronizationResponse
28    matrix_fury::SuperPing
29    matrix_fury::StressTestMasterObject
30    matrix_fury::ServerProfiler_RequestNames
31    matrix_fury::LogInstrumentation
32    matrix_fury::RequestSigscan
33    matrix_fury::SendEmergencyChat
34    matrix_fury::SigscanData
35    matrix_fury::WelcomeToTheMatrix
36    matrix_fury::Announce
37    matrix_fury::cakoneone
38    matrix_fury::UpdateZoneTimeSync
39    matrix_fury::HotfixLevelChanged
40    matrix_fury::ExitZone
41    matrix_fury::MatrixStatus
42    matrix_fury::MatchQueueResponse
43    matrix_fury::MatchQueueUpdate
44    matrix_fury::FoundMatchUpdate
45    matrix_fury::ChallengeJoinResponse
46    matrix_fury::ChallengeInvitation
47    matrix_fury::ChallengeInvitationSquadInfoAck
48    matrix_fury::ChallengeInvitationCancel
49    matrix_fury::ChallengeInvitationResponse
50    matrix_fury::ChallengeKicked
51    matrix_fury::ChallengeLeave
52    matrix_fury::ChallengeRosterUpdate
53    matrix_fury::ChallengeReadyCheck
54    matrix_fury::ChallengeMatchParametersUpdate
55    matrix_fury::ChallengeMatchStarting
56    matrix_fury::ForceUnqueue
57    matrix_fury::SynchronizationRequest
58    matrix_fury::GamePaused
59    matrix_fury::SuperPong
60    matrix_fury::ServerProfiler_SendNames
61    matrix_fury::ServerProfiler_SendFrame
62    matrix_fury::ZoneQueueUpdate
63    matrix_fury::DebugLagSampleSim
64    matrix_fury::DebugLagSampleClient
65    matrix_fury::LFGMatchFound
66    matrix_fury::LFGLeaderChange
67    matrix_fury::ReceiveEmergencyChat
68    matrix_fury::UpdateDevZoneInfo

Channel 2 and 3 - GSS / Object messages

[byte]           [byte[7]]    [byte] 
-------------    --------    ------------
Controller ID    Entity ID     Msg ID

Note: This is the same as the player CID that can be gotten from the LUA API only with the least significant byte overwritten.

Channels 2 and 3 seem to be for messages related to game objects / entities.

This includes both commands executed on / through those entities such as respawning, as well as operations that modify the underlying data of those entities.

The difference between channel 2 and 3 is that channel 2 is a reliable channel whilst channel 3 is not. Messages received on channel 2 are acknowledged by sending the ACK 2 message on channel 0.

If a message sent on channel 3 gets too long and needs to be split it will instead be split up and sent in channel 2 as a reliable packet. (The client emits warning in cases like this).

Please note that the data above, whilst not considered part of the header for split packages, would need to be XOR:ed in a resent messages.

The data after this header is message specific. We can route to the correct handler with the controller ID and the Msg ID. Note: At this point the data here is very similar to that contained in the replay files

My interpretation is that the controller ID can be considered to be something like a "class" id. The entity id refers to an instance/object of the class, and the message id indicates the operation or command to be performed.

Controller ID

Below is a list of known controller ids:

Controller ID Names
0    Generic
1    Character
2    Character_BaseController 
3    Character_NPCController
4    Character_MissionAndMarkerController
5    Character_CombatController
6    Character_LocalEffectsController 
7    Character_SpectatorController
8    Character_ObserverView
9    Character_EquipmentView 
10    Character_AIObserverView 
11    Character_CombatView
12    Character_MovementView 
13    Character_TinyObjectView 
14    Character_DynamicProjectileView
15    Melding
16    Melding_ObserverView
17    MeldingBubble
18    MeldingBubble_ObserverView
19    AreaVisualData
20    AreaVisualData_ObserverView
21    AreaVisualData_ParticleEffectsView
22    AreaVisualData_MapMarkerView
23    AreaVisualData_TinyObjectView
24    AreaVisualData_LootObjectView
25    AreaVisualData_ForceShieldView
26    Vehicle
27    Vehicle_BaseController
28    Vehicle_CombatController
29    Vehicle_ObserverView
30    Vehicle_CombatView
31    Vehicle_MovementView
32    Anchor
33    Anchor_AIObserverView
34    Deployable
35    Deployable_ObserverView
36    Deployable_NPCObserverView
37    Deployable_HardpointView
38    Turret
39    Turret_BaseController
40    Turret_ObserverView
45    Outpost_ObserverView 
48    ResourceNode_ObserverView 
51    CarryObject_ObserverView 
53    LootStoreExtension_LootObjectView
251    Server_Generic // This name is made up

Message ID

The meaning of the message id is going to depend on the controller id it is used with.

When looking at captures, it's important to note that the message ID can have a different meaning on the same controller depending on whether it's the client or the server that is sending the message.

See the routing table further down for details on how to generally translate the message id.

Here, we will cover exceptions.

Special case message ids

The commands we have found start at message id 17. Presumably, the message ids below this value have a different purpose. My assumption is that rather than referring to commands/functions, these are for lower level operations on the objects themselves.

The following is a list of such ids and how they appear to be used.

Msg ID 1 / Update Controller
Msg ID 3 / Update View
Msg ID 4 / Init Local Player Controller
Msg ID 5 / Remove Controller
Msg ID 6 / Remove View
Msg ID 8 / "RoutedMultipleMessage"

This message differs in that it is called with controller and entity ids 0. My best guess is that it's a message that allows, amongst others things, to update/advance the keyframes of multiple entities at once.

Routing messages

Below is the way to route the message handling:

Controller message routing / translation
prod-1962 packet list

ControllerID  = ?
MessageID = ?
Sender = ? // Alternatively, think of Sender == "Client" as TargetController == "Server".

if (MessageId < 8) {
    switch (MessageId) {
        1   ?
        3   ?
        4   ?
        5   ?
        6   ?   
        8   RoutedMultipleMessage
    }
}
else {
    switch (ControllerID) {
        case 0
            switch (MessageID) {
                32    firefall::EncounterToUIMessage 
                33    firefall::VotekickInitiated 
                34    firefall::VotekickResponded 
                35    firefall::ScoreBoardEnable 
                36    firefall::ScoreBoardInit 
                37    firefall::ScoreBoardSetWinner 
                38    firefall::ScoreBoardClear 
                39    firefall::ScoreBoardAddPlayer 
                40    firefall::ScoreBoardRemovePlayer 
                41    firefall::ScoreBoardUpdatePlayerStats 
                42    firefall::ScoreBoardUpdatePlayerStatsFromStats
                43    firefall::ScoreBoardUpdatePlayerStatus 
                44    firefall::MatchLoadingState 
                45    firefall::MatchEndAck 
                46    firefall::ServerProfiler_SendNames 
                47    firefall::ServerProfiler_SendFrame 
                48    firefall::TempConsoleMessage 
                49    firefall::ReloadStaticData 
                50    firefall::EncDebugChatMessage 
                51    firefall::SendRadioMessage 
                52    firefall::NpcBehaviorInfo 
                53    firefall::NpcMonitoringLog 
                54    firefall::NpcNavigationInfo 
                55    firefall::NpcHostilityDebugInfo 
                56    firefall::NpcPositionalDebugInfo 
                57    firefall::NpcShapeDebugInfo 
                58    firefall::NpcVoxelInfo 
                59    firefall::DebugDrawInfo 
                60    firefall::NpcDevCmdResponse 
                61    firefall::DevRequestObjectPositions 
                62    firefall::DevRequestSpawnTables 
                63    firefall::DevRequestResourceNodeDebug 
                64    firefall::MissionObjectiveUpdated 
                65    firefall::MissionStatusChanged 
                66    firefall::MissionReturnToChanged 
                67    firefall::MissionsAvailable 
                68    firefall::MissionActivationAck 
                69    firefall::BountyStatusChanged 
                70    firefall::BountyAbortAck 
                71    firefall::BountyActivationAck 
                72    firefall::BountyListActiveAck 
                73    firefall::BountyListActiveDetailsAck 
                74    firefall::BountyListAvailableAck 
                75    firefall::BountyClearAck 
                76    firefall::BountyClearPreviousAck 
                77    firefall::BountyListPreviousAck 
                78    firefall::BountyRerollResponse 
                79    firefall::DisplayUiTrackBounty 
                80    firefall::Achievements 
                81    firefall::AchievementUnlocked 
                82    firefall::TotalAchievementPoints 
                83    firefall::MissionCompletionCounts 
                84    firefall::ContentUnlocked 
                85    firefall::ClientUIAction 
                86    firefall::ArcCompletionHistoryUpdate
                87    firefall::JobLedgerEntriesUpdate 
                88    firefall::TrackRecipe 
                89    firefall::ClearTrackedRecipe 
                90    firefall::SlotTech 
                91    firefall::InteractableStatusChanged 
                92    firefall::SendTipMessage 
                93    firefall::DebugEventSample 
                94    firefall::DebugLagPlayerSample 
                95    firefall::DebugLagSimulationSample 
                96    firefall::DebugLagRaiaSample 
                97    firefall::DebugEncounterVolumes 
                98    firefall::Trail 
                99    firefall::EncounterDebugNotification 
                100   firefall::EncounterUIScopeIn 
                101   firefall::EncounterUIUpdate 
                102   firefall::EncounterUIScopeOut 
                103   firefall::DisplayUiNotification 
                104   firefall::DisplayMoneyBombBanner 
                105   firefall::SetPreloadPosition 
                106   firefall::PlaySoundId 
                107   firefall::PlaySoundIdAtLocation 
                108   firefall::PlayDialogScriptMessage 
                109   firefall::StopDialogScriptMessage 
                110   firefall::PingMap 
                111   firefall::PingMapMarker 
                112   firefall::EncounterPublicInfo 
                113   firefall::RequestActiveEncounters_Response
                114   firefall::ShoppingListInit 
                115   firefall::SetClientDailyInfo 
                116   firefall::GlobalCounterUpdate 
                117   firefall::GlobalCounterMilestoneInfo 
                118   firefall::ChatMessageList 
                119   firefall::CurrentLoadoutResponse 
                120   firefall::VendorProductsResponse 
                121   firefall::VendorPurchaseResponse 
                122   firefall::ConductorGlobalAnnouncement 
            }
            
        case 1 -> 14
            if (Sender == "Client") {
                83    firefall::Character::Commands::ListItemForSale 
                84    firefall::Character::Commands::SendMailToPlayer 
                85    firefall::Character::Commands::FillBuyOrder 
                86    firefall::Character::Commands::ToggleMarketplace 
                87    firefall::Character::Commands::JoinGroupLeader 
                88    firefall::Character::Commands::PlayerReady 
                89    firefall::Character::Commands::FetchQueueInfo 
                90    firefall::Character::Commands::MatchQueue 
                91    firefall::Character::Commands::ClearSavedMatchQueue 
                92    firefall::Character::Commands::MatchmakerSetPenalties 
                93    firefall::Character::Commands::MatchAccept 
                94    firefall::Character::Commands::ChallengeCreate 
                95    firefall::Character::Commands::ChallengeLeave 
                96    firefall::Character::Commands::ChallengeInvitation 
                97    firefall::Character::Commands::ChallengeInvitationResponse 
                98    firefall::Character::Commands::ChallengeInvitationSquadInfo 
                99    firefall::Character::Commands::ChallengeKick 
                100   firefall::Character::Commands::ChallengeSetReady 
                101   firefall::Character::Commands::ChallengeReadyCheck 
                102   firefall::Character::Commands::ChallengeSwapTeam 
                103   firefall::Character::Commands::ChallengeSetRoleAndTeam 
                104   firefall::Character::Commands::ChallengeSetMatchParameters 
                105   firefall::Character::Commands::ChallengeSetPowerPrivilege 
                106   firefall::Character::Commands::ChallengeStartMatch 
                107   firefall::Character::Commands::LFGCheckin 
                108   firefall::Character::Commands::LFGLeave 
                109   firefall::Character::Commands::MapOpened 
                110   firefall::Character::Commands::BattleframePurchased 
                111   firefall::Character::Commands::CollectLoot 
                112   firefall::Character::Commands::TempSlotAbilities 
                113   firefall::Character::Commands::SinAcquire_Source 
                114   firefall::Character::Commands::BroadcastWeaponTweaks 
                115   firefall::Character::Commands::MovementInput 
                116   firefall::Character::Commands::MovementInputFake 
                117   firefall::Character::Commands::FireInputIgnored 
                118   firefall::Character::Commands::FireBurst 
                119   firefall::Character::Commands::FireEnd 
                120   firefall::Character::Commands::FireCancel 
                121   firefall::Character::Commands::FireWeaponProjectile 
                122   firefall::Character::Commands::ReportProjectileHit 
                123   firefall::Character::Commands::SelectFireMode 
                124   firefall::Character::Commands::UseScope 
                125   firefall::Character::Commands::SelectWeapon 
                126   firefall::Character::Commands::ReloadWeapon 
                127   firefall::Character::Commands::CancelReload 
                128   firefall::Character::Commands::AcquireWeaponTarget 
                129   firefall::Character::Commands::LoseWeaponTarget 
                130   firefall::Character::Commands::NPCApplyEffect 
                131   firefall::Character::Commands::NPCRemoveEffect 
                132   firefall::Character::Commands::DockToPlayer 
                133   firefall::Character::Commands::ChangeLookAtTarget 
                134   firefall::Character::Commands::ActivateAbility 
                135   firefall::Character::Commands::NPCInteractWithTarget 
                136   firefall::Character::Commands::TargetAbility 
                137   firefall::Character::Commands::DeactivateAbility 
                138   firefall::Character::Commands::ActivateConsumable 
                139   firefall::Character::Commands::SetNoSpreadFlag 
                140   firefall::Character::Commands::ExitAttachmentRequest 
                141   firefall::Character::Commands::NPCSetInteractionType 
                142   firefall::Character::Commands::PerformEmote 
                143   firefall::Character::Commands::NotifyDialogScriptComplete 
                144   firefall::Character::Commands::PerformQuickChatCommand 
                145   firefall::Character::Commands::PerformTextChat 
                146   firefall::Character::Commands::PerformDialog 
                147   firefall::Character::Commands::SetDialogTag 
                148   firefall::Character::Commands::SetEffectsFlag 
                149   firefall::Character::Commands::AnimationUpdate 
                150   firefall::Character::Commands::SelectLoadout 
                151   firefall::Character::Commands::CallForHelp 
                152   firefall::Character::Commands::AbortCampaignMission 
                153   firefall::Character::Commands::TryResumeTutorialChain 
                154   firefall::Character::Commands::DebugMission 
                155   firefall::Character::Commands::AssignBounties 
                156   firefall::Character::Commands::AbortBounty 
                157   firefall::Character::Commands::ActivateBounty 
                158   firefall::Character::Commands::ListActiveBounties 
                159   firefall::Character::Commands::ListActiveBountyDetails 
                160   firefall::Character::Commands::ListAvailableBounties 
                161   firefall::Character::Commands::ClearBounties 
                162   firefall::Character::Commands::ClearPreviousBounties 
                163   firefall::Character::Commands::ListPreviousBounties 
                164   firefall::Character::Commands::RequestRerollBounties 
                165   firefall::Character::Commands::TrackBounty 
                166   firefall::Character::Commands::SetBountyVar 
                167   firefall::Character::Commands::RefreshBounties 
                168   firefall::Character::Commands::ListAchievements 
                169   firefall::Character::Commands::RequestAchievementStatus 
                170   firefall::Character::Commands::RequestAllAchievements 
                171   firefall::Character::Commands::RequestMissionAvailability 
                172   firefall::Character::Commands::RequestNewActivity 
                173   firefall::Character::Commands::RequestPushMission 
                174   firefall::Character::Commands::LogDirectActivityRequest 
                175   firefall::Character::Commands::LogActivityPush 
                176   firefall::Character::Commands::LogLongTimeWithoutPush 
                177   firefall::Character::Commands::CameraPoseUpdate 
                178   firefall::Character::Commands::QueueUnstuck 
                179   firefall::Character::Commands::VehicleCalldownRequest 
                180   firefall::Character::Commands::DeployableCalldownRequest 
                181   firefall::Character::Commands::DeployableHardpointSelection 
                182   firefall::Character::Commands::ResourceNodeBeaconCalldownRequest
                183   firefall::Character::Commands::FindNearbyResourceAreas 
                184   firefall::Character::Commands::GeographicalReportRequest 
                185   firefall::Character::Commands::UpdateChatPartyMembers 
                186   firefall::Character::Commands::ClientQueryInteractionStatus 
                187   firefall::Character::Commands::ResourceLocationInfosRequest 
                188   firefall::Character::Commands::DuelRequest 
                189   firefall::Character::Commands::PickupCarryableObjectByProximity 
                190   firefall::Character::Commands::DropCarryableObject 
                191   firefall::Character::Commands::AiError 
                192   firefall::Character::Commands::AiSignal 
                193   firefall::Character::Commands::NonDevDebugCommand 
                194   firefall::Character::Commands::UpdateShoppingList
                195   firefall::Character::Commands::FindServiceProvider 
                196   firefall::Character::Commands::ClientUIEvent 
                197   firefall::Character::Commands::SetMovementSimulation 
                198   firefall::Character::Commands::RequestRespawn 
                199   firefall::Character::Commands::RequestTransfer 
                200   firefall::Character::Commands::VendorTokenMachineRequest 
                201   firefall::Character::Commands::TimedDailyRewardRequest 
                202   firefall::Character::Commands::SalvageRequest 
                203   firefall::Character::Commands::RepairRequest 
                204   firefall::Character::Commands::SlotModuleRequest 
                205   firefall::Character::Commands::UnslotAllModulesRequest 
                206   firefall::Character::Commands::SlotGearRequest 
                207   firefall::Character::Commands::SlotVisualRequest 
                208   firefall::Character::Commands::SlotVisualMultiRequest 
                209   firefall::Character::Commands::RequestSelfRevive 
                210   firefall::Character::Commands::RequestTeleport 
                211   firefall::Character::Commands::RequestFrameLevelReset 
                212   firefall::Character::Commands::LeaveEncounterParty 
                213   firefall::Character::Commands::JoinSquadLeadersArc
                214   firefall::Character::Commands::LeaveArc 
                215   firefall::Character::Commands::JobLedgerOperation 
                216   firefall::Character::Commands::SeatChangeRequest 
                217   firefall::Character::Commands::RequestTrackerUpdate 
                218   firefall::Character::Commands::LootDistributionSetState 
                219   firefall::Character::Commands::LootDistributionSetVotes 
                220   firefall::Character::Commands::ResetTutorialId 
                221   firefall::Character::Commands::DismissTutorialId 
                222   firefall::Character::Commands::ClaimDailyRewardItem 
                223   firefall::Character::Commands::ClaimDailyRewardStreak 
                224   firefall::Character::Commands::BuyBackPreviousDay 
                225   firefall::Character::Commands::AcceptRewards 
                226   firefall::Character::Commands::FlushRewards 
                227   firefall::Character::Commands::RerollEliteLevelsAwardList 
                228   firefall::Character::Commands::RevertAllEliteLevelsUpgrades
                229   firefall::Character::Commands::SelectEliteLevelsAward 
                230   firefall::Character::Commands::ResetAllEliteLevelsUpgrades_Debug 
                231   firefall::Character::Commands::FlushCharacterCache 
                232   firefall::Character::Commands::RunTeamManagerCommand 
                233   firefall::Character::Commands::NPCCombatUpdate 
                234   firefall::Character::Commands::BagInventorySettings 
                235   firefall::Character::Commands::SetSteamUserId 
                236   firefall::Character::Commands::EquipExperimentalLoadout 
                237   firefall::Character::Commands::ExecuteTinkeringPlan 
                238   firefall::Character::Commands::VendorPurchaseRequest 
                239   firefall::Character::Commands::TutorialEventTriggeredCmd 
                240   firefall::Character::Commands::Fabrication_FetchAllInstances 
                241   firefall::Character::Commands::Fabrication_FetchAllRecipes 
                242   firefall::Character::Commands::Fabrication_FetchInstance 
                243   firefall::Character::Commands::Fabrication_Start 
                244   firefall::Character::Commands::Fabrication_ApplyAction 
                245   firefall::Character::Commands::Fabrication_GenerateResult 
                246   firefall::Character::Commands::Fabrication_Finalize 
                247   firefall::Character::Commands::Fabrication_Claim 
                248   firefall::Character::Commands::FriendsListRequest 
                249   firefall::Character::Commands::UpdateFriendStatus 
                250   firefall::Character::Commands::ClaimBountyRewards 
                59    firefall::Character::Commands::UiQueryResponse
            }
            else if (Sender == "Server") {
                83    firefall::Character::MarketRequestComplete 
                84    firefall::Character::ReceiveWeaponTweaks 
                85    firefall::Character::TookDebugWeaponHitPublic 
                86    firefall::Character::TookDebugWeaponHit 
                87    firefall::Character::DebugWeaponStats 
                88    firefall::Character::RewardInfo 
                89    firefall::Character::ProgressionXpRefresh 
                90    firefall::Character::ReceivedDeferredXP 
                91    firefall::Character::PublicCombatLog 
                92    firefall::Character::PrivateCombatLog 
                93    firefall::Character::AnimationUpdated 
                94    firefall::Character::RaiaNPCDebugging 
                95    firefall::Character::WeaponProjectileFired 
                96    firefall::Character::AbilityProjectileFired 
                97    firefall::Character::ProjectileHitReported 
                98    firefall::Character::Stumble 
                99    firefall::Character::QuickChat 
                100   firefall::Character::ProximityTextChat 
                101   firefall::Character::JumpActioned 
                102   firefall::Character::JumpRolled 
                103   firefall::Character::Respawned 
                104   firefall::Character::CalledForHelp 
                105   firefall::Character::TookHit 
                106   firefall::Character::AlmostHit 
                107   firefall::Character::DealtHit 
                108   firefall::Character::Killed 
                109   firefall::Character::WarnLockTargeted 
                110   firefall::Character::CurrentPoseUpdate 
                111   firefall::Character::ConfirmedPoseUpdate 
                112   firefall::Character::PublicDebugMovementUpdate 
                113   firefall::Character::ForcedMovement 
                114   firefall::Character::ForcedMovementCancelled 
                115   firefall::Character::GrappleClimbPermission 
                116   firefall::Character::AbilityActivated 
                117   firefall::Character::AbilityFailed 
                118   firefall::Character::AbilityCooldowns 
                119   firefall::Character::NPCInteraction 
                120   firefall::Character::OpenMovieDialog 
                121   firefall::Character::PrivateDialog 
                122   firefall::Character::PublicDialog 
                123   firefall::Character::AddOrUpdateInteractives 
                124   firefall::Character::RemoveInteractives 
                125   firefall::Character::InteractionProgressed 
                126   firefall::Character::InteractionCompleted 
                127   firefall::Character::InteractedWithProgressed 
                128   firefall::Character::InteractedWithCompleted 
                129   firefall::Character::InventoryUpdate 
                130   firefall::Character::UnlocksUpdate 
                131   firefall::Character::WorkbenchUpdate 
                132   firefall::Character::SimulateLootPickup 
                133   firefall::Character::DisplayRewards 
                134   firefall::Character::TrackerEvent 
                135   firefall::Character::TrackerPulse 
                136   firefall::Character::PriorityTargetSet 
                137   firefall::Character::ResourceNodeCompletedEvent 
                138   firefall::Character::FoundResourceAreas 
                139   firefall::Character::GeographicalReportResponse 
                140   firefall::Character::ResourceLocationInfosResponse
                141   firefall::Character::UiNamedVariableUpdate 
                142   firefall::Character::DuelNotification 
                143   firefall::Character::NewUiQuery 
                144   firefall::Character::UiQueryCancelled 
                145   firefall::Character::FetchQueueInfo_Response 
                146   firefall::Character::MatchQueueResponse 
                147   firefall::Character::ChallengeCreateResponse 
                148   firefall::Character::CharacterLoaded 
                149   firefall::Character::VendorTokenMachineResponse 
                150   firefall::Character::SalvageResponse 
                151   firefall::Character::RepairResponse 
                152   firefall::Character::SlotModuleResponse 
                153   firefall::Character::UnslotAllModulesResponse 
                154   firefall::Character::SlotGearResponse 
                155   firefall::Character::SlotVisualResponse 
                156   firefall::Character::SlotVisualMultiResponse 
                157   firefall::Character::TinkeringPlanResponse 
                158   firefall::Character::UnlockContentSuccess 
                159   firefall::Character::PushBehavior 
                160   firefall::Character::PopBehavior 
                161   firefall::Character::SelfReviveResponse 
                162   firefall::Character::ApplyCameraShake 
                163   firefall::Character::ReceivedWebUIMessage 
                164   firefall::Character::ExitingAttachment 
                165   firefall::Character::LootDistributionStartEvt 
                166   firefall::Character::LootDistributionUpdateEvt 
                167   firefall::Character::LootDistributionCompletionEvt 
                168   firefall::Character::ForcedWeaponSwap 
                169   firefall::Character::ChatPartyUpdate 
                170   firefall::Character::BagInventoryUpdate 
                171   firefall::Character::LevelUpEvent 
                172   firefall::Character::FactionReputationUpdate 
                173   firefall::Character::TutorialStateInitializeEvt 
                174   firefall::Character::TutorialStateUpdateEvt 
                175   firefall::Character::DailyLoginRewardsUpdateEvt 
                176   firefall::Character::Fabrication_FetchAllInstances_Response 
                177   firefall::Character::Fabrication_FetchAllRecipes_Response 
                178   firefall::Character::Fabrication_FetchInstance_Response 
                179   firefall::Character::Fabrication_Start_Response 
                180   firefall::Character::Fabrication_ApplyAction_Response 
                181   firefall::Character::Fabrication_GenerateResult_Response 
                182   firefall::Character::Fabrication_Finalize_Response 
                183   firefall::Character::Fabrication_Claim_Response 
                184   firefall::Character::PostStatEvent 
                185   firefall::Character::BountyRerollProductInfoUpdateEvt 
                186   firefall::Character::EliteLevels_InitAllFrames 
                187   firefall::Character::EliteLevels_InitFrame 
                188   firefall::Character::EliteLevels_UpgradesChanged 
                189   firefall::Character::EliteLevels_UnusedPointsChanged 
                190   firefall::Character::EliteLevels_IncreaseXp 
                191   firefall::Character::EliteLevels_IncreaseLevel 
                192   firefall::Character::EliteLevels_RerollCompleted 
                193   firefall::Character::EliteLevels_Initialized_Info 
                194   firefall::Character::FriendsListChanged 
                195   firefall::Character::FriendsListResponse 
                196   firefall::Character::PerkRespecTimerReset 
            }
            
        case 19 -> 25
            switch (MessageID) {
                83    firefall::AreaVisualData::LootObjectCollected 
                84    firefall::AreaVisualData::AudioEmitterSpawned 
                85    firefall::AreaVisualData::ParticleEffectSpawned
            }
            
        case 26 -> 30
            if (Sender == "Client") {
                83    firefall::Vehicle::Commands::MovementInput 
                84    firefall::Vehicle::Commands::MovementInputFake
                85    firefall::Vehicle::Commands::SinAcquire_Source 
                86    firefall::Vehicle::Commands::ReceiveCollisionDamage 
                87    firefall::Vehicle::Commands::ActivateAbility 
                88    firefall::Vehicle::Commands::DeactivateAbility 
                89    firefall::Vehicle::Commands::SetWaterLevelAndDesc 
                90    firefall::Vehicle::Commands::SetEffectsFlag 
            }
            else if (Sender == "Server") {
                83    firefall::Vehicle::AbilityActivated 
                84    firefall::Vehicle::AbilityFailed 
                85    firefall::Vehicle::PublicCombatLog 
                86    firefall::Vehicle::CurrentPoseUpdate 
                87    firefall::Vehicle::TookDebugWeaponHitPublic
                88    firefall::Vehicle::ForcedMovement 
                89    firefall::Vehicle::ForcedMovementCancelled 
                90    firefall::Vehicle::FlipPunch 
                91    firefall::Vehicle::DebugMovementUpdate
            }
            
        case 34 -> 37
            switch (MessageID) {
                83    firefall::Deployable::TookHit 
                84    firefall::Deployable::AbilityProjectileFired 
                85    firefall::Deployable::PublicCombatLog 
            }
            
        case 38 -> 40
            if (Sender == "Client") {
                switch (MessageID) {
                    83    firefall::Turret::WeaponProjectileFired 
                }
            }
            else if (Sender == "Server") {
                switch (MessageID) {
                    83    firefall::Turret::Commands::PoseUpdate 
                    84    firefall::Turret::Commands::FireBurst 
                    85    firefall::Turret::Commands::FireEnd 
                    86    firefall::Turret::Commands::FireWeaponProjectile
                    87    firefall::Turret::Commands::ReportProjectileHit 
                }
            }
            
        case 50 -> 53
            switch (MessageID) {
                83    firefall::LootStoreExtension::LootObjectCollected
            }
            
        case 251
            switch (MessageID) {
                17    firefall::UIToEncounterMessage 
                18    firefall::ServerProfiler_RequestNames 
                19    firefall::ScheduleUpdateRequest 
                20    firefall::LocalProximityAbilitySuccess 
                21    firefall::RemoteProximityAbilitySuccess 
                22    firefall::TrailRequest 
                23    firefall::RequestLeaveZone 
                24    firefall::RequestLogout 
                25    firefall::RequestEncounterInfo 
                26    firefall::RequestActiveEncounters 
                27    firefall::VotekickRequest 
                28    firefall::VotekickResponse 
                29    firefall::GlobalCounterRequest 
                30    firefall::CurrentLoadoutRequest 
                31    firefall::VendorProductRequest

            }
    }
}


#####

59    firefall::Encounter::Commands::UiQueryResponse 

#####
 

Packet parsing overview diagram

Todos and whats next:

  • Verify some of the assumptions that are made above.
  • Iron out some of the smaller details, eg handling droped packets.
  • Finish libary for handling the low level protocol stuff so we can focus on the packet contents and have a good framework for writing parsers for them.
  • Documentation for for those packet formats.
  • More tooling for exploring packet captures nicely (PacketPeep and 010 Buddy).
  • Formating and feed back on restructing this so that it is easyier to read and understand.
⚠️ **GitHub.com Fallback** ⚠️