1. List of known game messages: -------------------------------------------------------------------------------- 'HudText' uint8 message_length; uint8 slot; char* text; 'SayText' uint8 message_length; uint8 slot; char* text; 'TextMsg' uint8 message_length; uint8 slot; char* text; char* params[4]; 'ScoreInfo' uint8 slot; int16 frags; int16 deaths; uint16 uk_s1; uint16 team_index; 'TeamInfo' uint8 message_length; uint8 slot; char* team_name; 'TeamScore' uint8 message_length; char* team_name; uint16 score; 'DeathMsg' uint8 uk_b1; uint8 slot_killer; uint8 slot_victim; uint8 uk_b2; // Headshot indicator? char* weapon; 'Health' uint8 health; 'StatusText' uint8 message_length; uint8 uk_b1; char* status_text; 'StatusValue' uint8 message_length; uint8 value_index; int16 value; 'Flashlight' uint8 state; // boolean on/off uint8 flash_battery; 'AmmoPickup' uint8 ammo_index; uint8 amount; 'AmmoX' uint8 ammo_index; uint8 amount; 'Battery' int16 armorvalue; 'Damage' uint8 dmg_save; uint8 dmg_take; uint32 visibleDamageBits; int16 damageorigin_x; int16 damageorigin_y; int16 damageorigin_z; 'RoundTime' int16 round_seconds; 'BarTime' uint16 bar_time; 'Money' uint32 money; uint8 uk_b1; // Sign to use? 0:+money 1: -money? 'InitHUD' // Empty 'ResetHUD' // Empty 'ScoreAttrib' uint8 uk_b1; uint8 uk_b2; 'ClCorpse' uint8 message_length; char* model; 'BombPickup' // Emtpy (?) 'WeapPickup' uint8 weapon; 'ScreenFade' float32 duration; // 7.9 Fixed point float32 hold_time; // 7.9 Fixed point uint16 fade_flags; uint8 col_rgba[4]; // 4 bytes r,g,b,a color1 (fade color) 2. Further game messages which are incomplete/not fully reversed/partly unknown: -------------------------------------------------------------------------------- These messages are assigned with the newusermsg servermessage, thus you can add them to your dynamic table and (in most cases) skip them due to the default_msg_length field. Once their structure is know we can add them to the supported list and properly parse their information. 'WeaponList' uint8 message_length; uint8 num_weapons; Weapon* weaponlist[num_weapons]; struct Weapon { char* name; uint8 ammo_type; uint8 ammo_max; uint8 ammo2_type; uint8 ammo2_max; uint8 bucket; uint8 bucket_pos; uint8 id; uint8 flags; } '' (0x40) // 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; 'CurWeapon' (0x43) uint8 uk_b1; uint8 uk_b2; uint8 uk_b3; '' (0x49) uint8 uk_b1; uint8 uk_b2; 'SayText' (0x4b) uint8 message_length; uint8 slot; uint8 uk_b1; // if slot!=0 char* uk_string; '' (0x4c) uint8 message_length; uint8 slot; uint8 uk_b1; // if slot!=0 char* uk_string; '' (0x4d) uint8 message_length; uint8 slot; uint8 uk_b1; // if slot!=0 char* uk_string; // Strings containing # are some sort of command, also "#C1#C2" '' (0x4e) uint8 uk_b1; char* weapon; char[8] uk_b2; '' (0x57) uint8 uk_b1; char* team; char[9] uk_b2; 'ShowMenu' (0x60) uint8 message_length; uint8[4] uk_b1; char* uk_string; // #DCT_BuyItem 'SendAudio' (0x64) uint8 message_length; uint8 slot; uint8 uk_b1; char* uk_string; // %!MRAD_LOCKNLOAD 'StatusIcon' (0x6b) uint8 message_length; uint8 uk_b1; char* icon; 'StatusText' (0x6b) uint8 message_length; uint8 uk_b1; char* uk_string; // message_length points to space after strings null-byte?? uint8 uk_b2; // ? uint8 uk_b3; // ? 'Radar' (0x70) // ? uint8 uk_b1[8]; 'VGUIMenu' (0x72) // ? 'WClose' (0x73) uint8 message_length; char* uk_string; // found aimbot stuff in here in some demos '' (0x76) uint8 message_length; char* uk_string; '' (0x80) // ? char* delta_name; '' (0x8f) // ? '' (0xd9) // ? // usercmd_t - 440 bytes - skipped !OK! '' (0xf9) // ? 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