====== DSR Steam Communication ======
This handles setting up/closing down connections, voice packets, other steam management stuff.
Reading https://partner.steamgames.com/doc/api may be helpful.
The two primary functions of interest are
void GetSteamData_Packet(DLNRD::SteamSessionLight *SteamSessionLight, DLNRD::SteamSessionMemberLight *SteamSessionMemberLight, uint param_3,uint8_t *data, uint data_len) @141088020
and
SendSteamData_Packet1 @1410B3F58
SendSteamData_Packet2 @1410B58DC
SendSteamData_Packet3 @1410B584C
(the type is stored in the byte at data+6 at this point)
For sending SteamData packets, the send function must be queued as a task in the SteamSession. This is done by SteamSessionLight_Queue_SendSteamMessage @14109cfd0.
For steam callbacks, you want to get the callback functions from the DLNRD::SteamSurveillance class, created by Init_DLNRD::SteamSurveillance @14107b750, and it's accessed by a global pointer at 141da1ab0.
===== Packet Types =====
This list is a Work-In-Progress. Underlined types are fully understood.
The functions which handle each type are labeled ``sendTypeXSteamMessage`` and ``readparseTypeXSteamMessage``
Prolog for all packets:
char magic[4] = "VRXN";
uint16_t header = 0x584;
uint8_t type
(note this is converted to big endian before sending)
4. SessionPropertyReq
9. SyncSessionMemberRequest1
10. SyncSessionMemberRequest2
* Regularly sent every few frames from the host to the guests
* Contains a byte with the number of players the host sees present the world
* Followed by each player's steam name, separated by 0x7
11. SendHostSearchResponse
12. P2PCommunicationResponse
* First packet sent on start of session communication/initialization
* Doesn't contain any data
13. OnAuthTicket
15. Response sent by guest to type 46 packet
24. SessionProperties
29. StartGame
30. CreateSessionVisibleTask
31. CreateSessionInvisibleTask
34. SyncSessionMemberResponse
* Send as a response to type 10 from the guest to the host
* Contains the number of players that are present in the type 10 packet but NOT present in the guest's world
* If this value is >0 for a certain amount of time, the host will disconnect the guest with a 0xff000020 kickout reason
* A desync detection and prevention measure
35. SearchHostResponse
36. ReceiveRandomNumber
* Response automatically sent to type 12
* optional dword of data
37. SyncSessionMemberRequest3
38. Response packet sent by host upon receiving type 15
42. NotifyLeavePlayer
46. KickOutTask
* Packet requesting that you leave the session
* data = uint32_t //usually 0xff000019
49. Unk2
50. LeaveMember