diff options
-rw-r--r-- | doc/hl1-demofile-spec-cstrike.txt | 144 | ||||
-rw-r--r-- | doc/hl1-demofile-spec.txt | 293 |
2 files changed, 381 insertions, 56 deletions
diff --git a/doc/hl1-demofile-spec-cstrike.txt b/doc/hl1-demofile-spec-cstrike.txt new file mode 100644 index 0000000..86ec4d6 --- /dev/null +++ b/doc/hl1-demofile-spec-cstrike.txt @@ -0,0 +1,144 @@ +{64} '', // Radio Command?
+ + uint8 uk_b1;
+ uint8 uk_b2;
+ char* uk_s1;
+ uint8 uk_b3;
+ uint8 uk_b4;
+ uint8 uk_b5;
+ char* uk_s2;
+ char* playername;
+ char* command;
+ +{} 'ScoreInfo',
+ + uint8 entindex;
+ sint16 frags;
+ sint16 deaths;
+ uint16 uk_s1;
+ uint16 team_index;
+
+{} 'Health',
+ + uint8 health;
+
+{} 'FlashLight',
+ + uint8 state; // 1/0 on/off
+ uint8 flash_battery;
+
+{} 'CurWeapon', (67)
+ + uint8 uk_b1;
+ uint8 uk_b2;
+ uint8 uk_b3;
+
+{} '', (73)
+ + uint8 uk_b1;
+ uint8 uk_b2;
+
+{} 'SayText', (75)
+ + uint8 message_length;
+ uint8 slot;
+ uint8 uk_b1; // if slot!=0
+ char* uk_string;
+
+{} '', (76)
+ + uint8 message_length;
+ uint8 slot;
+ uint8 uk_b1; // if slot!=0
+ char* uk_string;
+
+{} '', (77)
+ + uint8 message_length;
+ uint8 slot;
+ uint8 uk_b1; // if slot!=0
+ char* uk_string; + // Strings containing with # is some sort of command, also "#C1#C2"
+
+{} '', (78)
+ + uint8 uk_b1;
+ char* weapon;
+ char[8] uk_b2;
+
+{} '', (87)
+ + uint8 uk_b1;
+ char* team;
+ char[9] uk_b2;
+
+{} 'ShowMenu', (96)
+ + uint8 message_length;
+ uint8[4] uk_b1;
+ char* uk_string; // #DCT_BuyItem
+
+{} 'SendAudio', (100)
+ + uint8 message_length;
+ uint8 slot;
+ uint8 uk_b1;
+ char* uk_string; // %!MRAD_LOCKNLOAD
+
+{} 'RoundTime', (101)
+ + uint16 round_sec;
+
+{} 'Money', (102)
+ + uint32 money_amount;
+ uint8 uk_b2; // ? Add 0 /Substract 1?
+
+{} 'StatusIcon', (107) +
+ uint8 message_length;
+ uint8 uk_b1;
+ char* icon;
+
+{} 'StatusText', (107)
+ + uint8 message_length;
+ uint8 uk_b1;
+ char* uk_string; // message_length points to space after strings end \0 byte??
+ uint8 uk_b2; // ?
+ uint8 uk_b3; // ?
+
+{} 'Radar', (112) // ?
+ + char[8] uk_b1;
+
+{} 'VGUIMenu', (114) // ?
+
+{} 'WClose', (115)
+ + uint8 message_length;
+ char* uk_string; // found aimbot stuff in here in some demos
+
+{} '', (118)
+ + uint8 message_length;
+ char* uk_string;
+ +{128} '', // ?
+ + char* delta_name;
+
+{143} '', // ?
+
+{217} '', // ?
+ + // usercmd_t - 440 bytes - skipped !OK!
+
+{249} '', // ? deltadata?
+// ID: 43 - clientdata_t - 1332 >< 1346 bytes (next block unknown) - 1343 ?
+// ID: 03 - entity_state_t - 1430 bytes - skipped !OK!
+// ID: 03 - entity_state_player_t - 1314 bytes - count varies
+// ID: 43 - custom_entity_state_t - 513 bytes
+// ID: 43 - entity_t - 368 bytes - skipped !OK!
+// ID: 23 - weapon_data_t - 546 bytes - count varies
+ diff --git a/doc/hl1-demofile-spec.txt b/doc/hl1-demofile-spec.txt index 343a5ad..6946fba 100644 --- a/doc/hl1-demofile-spec.txt +++ b/doc/hl1-demofile-spec.txt @@ -5,12 +5,11 @@ The Half-Life Demofile format has it's roots in the Quake 1 Demo format and is basically just an extension to it. Thus it contains only basic descriptors which rapidly points into raw recorded network data. -It requires a lot of game engine related logic to be used for parsing such a +It requires a lot of game engine dependant logic to be used for parsing such a file in a non-game client application. This explains the lack of any documentation or examples in the SDK as it would require to heavily open up game engine sources. - General Fileformat Data Hierarchy: DemoFile { @@ -31,6 +30,7 @@ DemoFile { ... } +The biggest part of the demo file is made up by the macro for game data. Demofile Header -------------------------------------------------------------------------------- @@ -166,7 +166,7 @@ struct DemoMacro_GameData ... } -A server message follows the game data information and is parsed dynamically. +A server message follows directly after the gamedata and is parsed dynamically. struct DemoServerMessage { @@ -174,63 +174,251 @@ struct DemoServerMessage ... } -List of Server Message IDs: +List of Server Messages and their structure: + +{0} 'bad', + +// Should never be encountered, otherwise stream is corrupt.
-{0} 'bad',
{1} 'nop',
{2} 'disconnect',
-{3} 'event',
+{3} 'event', + + uint8 num_events; + // ... excessive bit parsing
+ {4} 'version',
+ + uint32 version; + {5} 'setview',
{6} 'sound',
-{7} 'time',
-{8} 'print',
-{9} 'stufftext',
-{10} 'setangle',
+{7} 'time', + + float32 time;
+ +{8} 'print', + + char* text;
+ +{9} 'stufftext', + + char* text;
+ +{10} 'setangle', + + char[5] uk_b;
+ {11} 'serverinfo',
-{12} 'lightstyle',
+ + uint32 serverversion;
+ uint32 servercount;
+ uint32 server_crc;
+ char[16] client_dll_crc;
+ uint8 maxclients;
+ uint8 playernum;
+ uint8 uk_b5;
+ char* gamedir;
+ if(serverversion >= 45) { + char* remotehost; + }
+ char* map1;
+ char* map2;
+ uint8 extraflag;
+ if(extraflag > 0) { + uint8 extralength;
+ char* extradata;
+ char[16] lastdata; + }
+ +{12} 'lightstyle', + + uint8 style_index; // 0 - 63
+ char* lightinfo;
+ {13} 'updateuserinfo',
+ + uint8 slot;
+ uint32 userid;
+ char* userinfo;
+ char[16] uk_data; + {14} 'deltadescription',
-{15} '',
+ + char* text; + uint16 uk_i1;
+ +// if text = 'entity_t' then
+// skip constant data chunks due to no delta compression
+// and read until "00 27" is found as MSGID 39, reseek and continue reading blocks
+ +{15} 'clientdata',
+ + uint8 slot;
+ uint32 userid;
+ char* userinfo;
+ {16} 'stopsound',
-{17} '',
-{18} '',
-{19} '',
-{20} '',
-{21} '',
-{22} '',
-{23} 'temp_entity',
+ + uint16 uk_s1;
+ +{17} 'createstringtables',
+{18} 'updatestringtable',
+{19} 'entitymessage',
+{20} 'spawnstatic',
+{21} 'spawnbinary',
+{22} 'spawnbaseline',
+{23} 'temp_entity', + + uint8 entity_event_type; + + // Rest is the actual event, see common.h in HLSDK
+ {24} 'setpause',
+ + uint8 state;
+ {25} '',
{26} '',
{27} '',
{28} '',
{29} 'spawnstaticsound',
+ + uint16[3] org;
+ uint16 sound_num;
+ uint8 vol;
+ uint8 atten;
+ uint16 uk_s1;
+ uint8 uk_b2;
+ uint8 uk_b3;
+ {30} 'intermission',
{31} '',
{32} 'cdtrack',
+ + uint32 fromtrack;
+ uint32 totrack;
+ {33} '',
{34} '',
{35} 'weaponanim',
+ + uint8 sequence_number;
+ uint8 weaponmodel_bodygroup;
+ {36} '',
{37} 'roomtype',
+ + sint16 room_type;
+ {38} 'addangle',
+ + float32[4] angles;
+ {39} 'newusermsg',
+ + uint8 usermsg_id;
+ uint8 default_msg_length;
+ char* usermsg_description;
+ uint8 uk_b2;
+ {40} '',
{41} '',
{42} '',
{43} '',
{44} '',
{45} 'classinfo',
+ + uint8 subpacket;
+ {46} '',
{47} '',
{48} '',
{49} '',
{50} 'hltv',
+ + uint8 stateflag; + + // HLTV_ACTIVE 0 + // tells client that he's an spectator and will get director commands
+ // HLTV_STATUS 1 + // send status infos about proxy
+ // HLTV_LISTEN 2 + // tell client to listen to a multicast stream
+ {51} 'director',
+ + uint8 command_length;
+ uint8 command_event; + + if(command_event) { + + "command_event": + // DRC_CMD_NONE 0 // NULL director command
+ // DRC_CMD_START 1 // start director mode
+ // DRC_CMD_EVENT 2 // informs about director command
+ // DRC_CMD_MODE 3 // switches camera modes
+ // DRC_CMD_CAMERA 4 // sets camera registers
+ // DRC_CMD_TIMESCALE 5 // sets time scale
+ // DRC_CMD_MESSAGE 6 // send HUD centerprint
+ + uint8 effect;
+ uint8[4] col1_rgba;
+ float32 x;
+ float32 y;
+ // ushort 8.8 fadein time
+ float32 fadein_time;
+ // ushort 8.8 fadeout time
+ float32 fadeout_time;
+ // ushort 8.8 hold time
+ float32 hold_time;
+ // optional ushort 8.8 fxtime (time the highlight lags behing the leading text in effect 2)
+ float32 fx_time;
+ // string text message (128 chars max sz string)
+ *char text; + + // DRC_CMD_SOUND 7 // plays a particular sound
+ // DRC_CMD_STATUS 8 // status info about broadcast
+ + uint32 hltv_slots;
+ uint32 hltv_spectators;
+ uint16 hltv_proxies;
+ + // DRC_CMD_BANNER 9 // banner file name for HLTV gui
+ // DRC_CMD_FADE 10 // send screen fade command
+ // DRC_CMD_SHAKE 11 // send screen shake command
+ // DRC_CMD_STUFFTEXT 12 // like the normal svc_stufftext but as director command
+ // DRC_CMD_LAST 12 + + } + else + { + + uint16 entity_index_prim; // index number of primary entity
+ uint16 entity_index_sec; // index number of secondary entity
+ uint32 event_flag; // eventflags (priority and flags)
+ + "event_flag":
+ // DRC_FLAG_PRIO_MASK 0x0F // priorities between 0 and 15 (15 most important)
+ // DRC_FLAG_SIDE (1<<4) //
+ // DRC_FLAG_DRAMATIC (1<<5) // is a dramatic scene
+ // DRC_FLAG_SLOWMOTION (1<<6) // would look good in SloMo
+ // DRC_FLAG_FACEPLAYER (1<<7) // player is doning something (reload/defuse bomb etc)
+ // DRC_FLAG_INTRO (1<<8) // is a introduction scene
+ // DRC_FLAG_FINAL (1<<9) // is a final scene
+ // DRC_FLAG_NO_RANDOM (1<<10) // don't randomize event data + + uint8[command_length-8] uk_data; + + }
+ {52} '',
{53} '',
{54} 'sendextrainfo',
+ + char* text;
+ uint8 uk_b; + {55} '',
{56} '',
{57} '',
@@ -240,43 +428,11 @@ List of Server Message IDs: {61} '',
{62} '',
{63} '',
-{64} '',
-{65} '',
-{66} '',
-{67} '',
-{68} '',
-{69} '',
-{70} '',
-{71} '',
-{72} '',
-{73} '',
-{74} '',
-{75} '',
-{76} '',
-{77} '',
-{78} '',
-{79} '',
-{80} '',
-{81} '',
-{82} '',
-{83} '',
-{84} '',
-{85} '',
-{86} '',
-{87} '',
-{88} '',
-{89} '',
-{90} '',
-{91} '',
-{92} '',
-{93} '',
-{94} '',
-{95} '',
-{96} '',
-{97} '',
-{98} '',
-{99} '',
-{100} '' +-------------------------------------------------------------------------------- +{64-256} +These server messages are dynamically indexed using message {39}'s usermsg_id +See hl1-demofile-spec-cstrike.txt +-------------------------------------------------------------------------------- # 2 / Unknown @@ -297,3 +453,28 @@ next one. # 6 / Unknown + uint32 uk_i1;
+ uint32 uk_i2;
+ float32 uk_f;
+ char[72] data; + +# 7 / Unknown + + uint32 uk_i1;
+ uint32 uk_i2;
+ +# 8 / Play Sound + + uint32 uk_i1;
+ uint32 sound_name_length;
+ char* sound_name;
+ float32 uk_f1;
+ float32 uk_f2;
+ uint32 uk_i2;
+ uint32 uk_i3; + +# 9 / Unknown + + sint32 chunklength;
+ char* data;
+ |