Ru/DEM (file format): Difference between revisions
(I just added this page) |
(поместите :ru на эти вещи) |
||
Line 4: | Line 4: | ||
'''DEM''' (сокращение от демонстрации) - это формат исходного файла демо. Используется совместно с Source рекордером для записи демонстраций, которые содержат записанные события, которые можно редактировать и воспроизводить в игре. Демо может быть отредактирован для изменения углов камеры, ускорения, замедления, воспроизведения музыки и других функций. | '''DEM''' (сокращение от демонстрации) - это формат исходного файла демо. Используется совместно с Source рекордером для записи демонстраций, которые содержат записанные события, которые можно редактировать и воспроизводить в игре. Демо может быть отредактирован для изменения углов камеры, ускорения, замедления, воспроизведения музыки и других функций. | ||
{{note|В настоящее время нет инструментов для редактирования демонстраций после их записи.}} | {{note:ru|В настоящее время нет инструментов для редактирования демонстраций после их записи.}} | ||
For the purpose of this we will be referring to each collection of events as a frame. This may or may not add up to the number of frames given by the header. | For the purpose of this we will be referring to each collection of events as a frame. This may or may not add up to the number of frames given by the header. | ||
Line 261: | Line 261: | ||
==Смотрите также== | ==Смотрите также== | ||
*[[Demo Recording Tools]] | *[[Demo Recording Tools:ru]] | ||
*[[Demo Video Creation]] | *[[Demo Video Creation]] | ||
[[Category:File formats]] | [[Category:File formats]] |
Revision as of 09:48, 18 October 2018
Template:Otherlang2 DEM (сокращение от демонстрации) - это формат исходного файла демо. Используется совместно с Source рекордером для записи демонстраций, которые содержат записанные события, которые можно редактировать и воспроизводить в игре. Демо может быть отредактирован для изменения углов камеры, ускорения, замедления, воспроизведения музыки и других функций.
For the purpose of this we will be referring to each collection of events as a frame. This may or may not add up to the number of frames given by the header.
Заголовок Демо
Тип | Поле | Значение |
---|---|---|
String | Заголовок | 8 символов, должно быть "HL2DEMO"+NULL |
Int | Демо Протокол | Версия демо протокола |
Int | Протокол Сети | Номер версии сетевого протокола |
String | Имя сервера | Длинной в 260 символов |
String | Имя клиента | Длинной в 260 символов |
String | Имя карты | Длинной в 260 символов |
String | Директория игры | Длинной в 260 символов |
Float | Время воспроизведения | Продолжительность демонстрации в секундах |
Int | Тиков | Количество тиков в демонстрации |
Int | Кадров | Количество кадров в демо |
Int | Длина записи | Длина знаков до первого кадра |
Кадр
Каждый кадр начинается с 0 или более следующих команд: Они описаны в hl2sdk\utils\demofile\demoformat.h / hl2sdk-ob\public\demofile\demoformat.h / hl2sdk-l4d\public\demofile\demoformat.h
Сетевые протоколы 7 и 8
Тип | Значение |
---|---|
dem_signon | 1 |
dem_packet | 2 |
dem_synctick | 3 |
dem_consolecmd | 4 |
dem_usercmd | 5 |
dem_datatables | 6 |
dem_stop | 7 |
dem_lastcommand | dem_stop |
Сетевые протоколы 14 и 15
Тип | Значение |
---|---|
dem_stringtables | 8 |
dem_lastcommand | dem_stringtables |
Сетевые протоколы 36 и выше
Тип | Значение |
---|---|
dem_customdata | 8 |
dem_stringtables | 9 |
dem_lastcommand | dem_stringtables |
В зависимости от полученной команды необходимо выполнить другое действие.
dem_stop
Это сигнал о том, что демо закончилось, и больше данных не нужно разбирать.
dem_consolecmd, dem_datatables, dem_usercmd, dem_stringtables
Чтение стандартных пакет данных, при необходимости они обработываются.
dem_synctick, dem_signon, dem_packet
Игнорирование.
Стандартные данные "Пакета"
Каждый раз, когда читается более одного байта, используется стандартный формат.
Это начинается с целого числа, которое имеет количество байтов в этом пакете.
Пример кода для этого:
int ReadData(char **buffer)
{
int len;
fread (&len,sizeof(int),1,fDemo);
if (len > 0)
{
*buffer = new char[len];
fread(*buffer,len,1,fDemo);
}
return len;
}
Формат Кадров
Frame {
int ServerFrame;
int ClientFrame; // ServerFrame и ClientFrame delta, вероятно, соответствуют отклику клиента.
int SubPacketSize;
*buffer = new char[SubPacketSize]; // Сообщение о состоянии обновлений
Packet pkt = (rest of frame as data exists) // Все демо-команды объединены в этой области, структура ниже...
JunkData data = (unknown) // Бывший: 0x8f 5a b5 04 94 e6 7c 24 00 00 00 00 00 ... (40 байт 0x00 после 0x24)
// Это может быть либо конец кадра, либо начало следующего кадра.
}
Packet {
char CmdType;
int Unknown;
int TickCount; // Это только периодический появляется.
int SizeOfPacket;
*buffer = new char[SizeOfPacket];
}
Пример использования
Может быть интересно захватить заголовок демонстрационных файлов на случай, если вы запустите веб-сервер, на котором размещены ваши демонстрации / телевизоры. Вот скрипт PHP, который выполняет эту работу за вас, и имеет возможность рассказать вам, является ли демонстрационный файл записью от глаза клиента или SourceTV.
Вы можете легко преобразовать его в код C++, если вы планируете использовать его для другой необходимости.
<?
/* Source & OrangeBox demos header reader.
By PoLaRiTy (nocheatz.com)
Help from : https://developer.valvesoftware.com/wiki/DEM_Format#Demo_Header
http://hg.alliedmods.net/hl2sdks/hl2sdk-css/file/1901d5b74430/public/demofile/demoformat.h
Types sizes :
Int : 4 bytes
Float : 4 bytes
String : 260 bytes
*/
class DemoInfo_s
{
var $dem_prot; // Demo protocol version
var $net_prot; // Network protocol versio
var $host_name; // HOSTNAME in case of TV, and IP:PORT or localhost:PORT in case of RIE (Record In eyes).
var $client_name; // Client name or TV name.
var $map_name; // Map name
var $gamedir; // Root game directory
var $time; // Playback time (s)
var $ticks; // Number of ticks
var $frames; // Number of frames
var $tickrate; // Tickrate
var $type; // TV or RIE ? (0 = RIE, 1 = TV)
var $status_present; // true if a status command is available in the demo.
}
function ExtOfFile($pathtofile)
{
return end(explode('.',$pathtofile));
}
function ReadString($handle, $n = 260)
{
$buffer = "";
for($d = 1; ((($char = fgetc($handle)) !== false) && ($d < $n)); $d++) $buffer = $buffer.$char;
return trim($buffer);
}
function ReadInt($handle, $n = 4)
{
$buf = fread($handle, $n);
$number = unpack("i", $buf);
return $number[1];
}
function ReadFloat($handle)
{
$buf = fread($handle, 4);
$number = unpack("f", $buf);
return $number[1];
}
function IsGoodIPPORTFormat($string)
{
if(preg_match('/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:[0-9]{1,5}/', $string)) return true;
else return false;
}
function GetDemoInfo($pathtofile, $fast = false) // BOOL fast : if true, doesn't check the presence of the status
{
$infos = NULL;
if(ExtOfFile($pathtofile) === "dem")
{
$handle = fopen($pathtofile, "r");
if($handle)
{
if(ReadString($handle, 8) === "HL2DEMO")
{
$infos = new DemoInfo_s;
$infos->dem_prot = ReadInt($handle);
$infos->net_prot = ReadInt($handle);
$infos->host_name = ReadString($handle);
$infos->client_name = ReadString($handle);
$infos->map_name = ReadString($handle);
$infos->gamedir = ReadString($handle);
$infos->time = ReadFloat($handle);
$infos->ticks = ReadInt($handle);
$infos->frames = ReadInt($handle);
$infos->tickrate = intval($infos->ticks / $infos->time);
if(IsGoodIPPORTFormat($infos->host_name)) $infos->type = 0; // RIE TODO : Add localhost:PORT check.
else $infos->type = 1; // TV
$infos->status_present = false;
if(!$fast && !($infos->type == 1)) // No status in TV records.
{
while(!(($l = fgets($handle)) === false))
{
if(stripos($l, "\x00status\x00") !== false)
{
$infos->status_present = true;
break;
}
}
}
}
else
{
echo "Bad file format.";
}
fclose($handle);
}
else
{
echo "File not found or unable to read.";
}
}
else
{
echo "Bad file extension.";
}
return $infos;
}
?>