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.
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"
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
.
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.
[uint] [char[4]] [uint]
---------- ----------- ----------------
SocketID Id for msg Protocol Version
00 00 00 00 50 4F 4B 45 00 04 B9 68
[uint] [char[4]] [uint]
---------- ----------- ----------------
SocketID Id for msg SocketID
00 00 00 00 50 4F 4B 45 F1 07 12 8E
[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
[uint] [char[4]] [ushort] [ushort]
---------- ----------- ---------------- ----------------
SocketID Id for msg SequenceStart GameServerPort
00 00 00 00 50 4F 4B 45 F7 A1 D2 65
[uint] [char[4]]
---------- -----------
SocketID Id for msg
00 00 00 00 41 42 52 54
Used to end a 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.
This is the number of bytes, including the above message header, that represents this message within the packet.
There are four channels and the messages sent on them differ in structure and use. They all have additional "header" data.
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.
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.
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.
[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:
[byte] [byte[8]]
---------- ------------------------
Msg ID Zeroes
00 00 00 00 00 00 00 00 000
[byte] [ushort] [ushort]
---------- --------------- ---------------
Msg ID SeqNum NEXT SeqNum RECV
02 F7 A1 F7 A2
Used to ACK messages from channel 1.
[byte] [ushort] [ushort]
---------- --------------- ---------------
Msg ID SeqNum NEXT SeqNum RECV
03 F7 A1 F7 A2
Used to ACK messages from channel 2.
[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.
[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.
[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
[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.
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
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.
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.
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.
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
#####
- 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.