.rec file
|
.rec files
The .rec files are SA-MP's files for recorded NPC movements and actions. Normally the files are created ingame by recording a player's actions. Then they can be used by NPC scripts to be played back, so the NPC exactly repeats the recorded actions. Only files in the npcmodes/recordings/ directory can be accessed by NPC scripts, while ingame recorded files are stored to the scriptfiles directory.
General structure
The .rec file format consists of a header, followed by a non-separated sequence of data blocks. Every data block completely describes the player state at a specific moment, and so the NPC's actions are stored fluently. The data is stored as bytes in little endian order. Single data values can be 1, 2 or 4 bytes long, and so either are bytes, shorts, integers or floats in IEEE-754 format. Some should be signed and others unsigned, but it depends on how you are using them and isnt important for the structure itself (the listed signed/unsigned are oriented on their common PAWN usage). Also, to work with .rec files, a hex editor is necessary of course.
HEADER[8]DATABLOCK[72]DATABLOCK[72]...
File header
The .rec file header got the same structure for both vehicle and on-foot recordings. It is 8 bytes long, where the first 4 bytes are an integer. As it seems it always has the value 1000, probably as a identifier so SA-MP knows it is a NPC recording. The other 4 bytes are another integer, either "1" for vehicle recordings, or "2" for on-foot recordings, so only the lowest bytes of it are in use, the rest is always 0.
Offset* | Type | Meaning |
---|---|---|
0-3 | integer | File identifier, always 0xE8030000 / 0d1000 |
4-7 | integer | 1 for vehicle recordings, 2 for on-foot recordings |
[*] Offset is relative to the file's beginning
Data blocks
On-foot data
The data blocks of on-foot recordings are 72 bytes long, so offset +72 would refer to the beginning of the next data block. It contains about everything a normal player can do, I just didnt figure out if setting his aimvector is possible, maybe it is done via the quaternions.
Offset* | Type | Meaning |
---|---|---|
0-3 | unsigned integer | time when to apply this blocks attributes [ms] |
4-5 | signed short | left/right key code (e.g. 0x00FF left, 0xFF00 right) |
6-7 | signed short | up/down key code |
8-9 | unsigned shor | tAdditional key code (KEY_HANDBRAKE etc codes) |
10-13 | float | x position |
14-17 | float | y position |
18-21 | float | z position |
22-25 | float | Quaternion component 1 for facing angles** |
26-29 | float | Quaternion component 2 for facing angles** |
30-33 | float | Quaternion component 3 for facing angles** |
34-37 | float | Quaternion component 4 for facing angles** |
38 | 1 byte | Health |
39 | 1 byte | Armour |
40 | unsigned byte | ID of the current hold weapon |
41 | unsigned byte | Currently applied special action, not all are working with NPCs |
42-45 | float | Current x velocity |
46-49 | float | Current y velocity |
50-53 | float | Current z velocity |
54-57 | float | Current surfing x |
58-61 | float | Current surfing y |
62-65 | float | Current surfing z |
66-67 | unsigned short | Current surfing vehicle ID |
68-69 | unsigned short | Currently applied animation index |
70-71 | short | Some animation parameters, needs some more investigation |
[*] Offset relative to the beginning of the data block. [**] The quaternions indeed rotate the character, allowing to put him upside down etc.
Vehicle data
Data blocks for vehicle records are slightly shorter, and just 67 bytes long. I didnt analyize them as much as I analyzed the on-foot data, but already got the most important attributes. All in all the structure is quite similar to the on-foot data.
Offset* | Type | Meaning |
---|---|---|
0-3 | unsigned integer | time when to apply this blocks attributes |
4-5 | short | Vehicle ID (seems not important) |
6-7 | unsigned short | left/right key code |
8-9 | unsigned short | up/down key code** |
10-11 | signed short | Additional key code** |
12-15 | float | Vehicle rotation quaternion component 1 |
16-19 | float | Vehicle rotation quaternion component 2 |
20-23 | float | Vehicle rotation quaternion component 3 |
24-27 | float | Vehicle rotation quaternion component 4 |
28-31 | float | x position |
32-35 | float | y position |
36-39 | float | z position |
40-43 | float | x velocity |
44-47 | float | y velocity |
48-51 | float | z velocity |
52-55 | float | Vehicle health |
56 | byte | Driver health |
57 | byt | eDriver armour |
58 | byte | Currently hold weaponID |
59 | byte | Siren state |
60 | byte | Gear state |
61-62 | unsigned short | Trailer ID |
62-66 | - | Unknown |
[*] Offset relative to the beginning of the data block.
[**] The keys got a strange behaviour, probably this isnt the right order.