2015-05-13 02:39:56 +02:00
|
|
|
|
|
|
|
#include "demoreader.h"
|
2015-07-14 05:25:49 +02:00
|
|
|
#include "demofile/demotypes.h"
|
|
|
|
#include "demofile/demojson.h"
|
|
|
|
#include "base/jsonfile.h"
|
|
|
|
#include "io/idemowriter.h"
|
|
|
|
|
2016-04-28 04:31:33 +02:00
|
|
|
#include "game/sourcecontext.h"
|
2015-07-14 05:25:49 +02:00
|
|
|
#include "netmessages/nethandlers.h"
|
|
|
|
#include "demmessages/demhandlers.h"
|
|
|
|
|
|
|
|
int32_t ReadNetpacket(base::JsonReaderFile& jsonReader, PacketTrailingBits& trailingBits)
|
|
|
|
{
|
|
|
|
base::JsonReaderObject reader = jsonReader.ParseObject();
|
|
|
|
assert(!reader.HasReadError());
|
|
|
|
const int32_t type = reader.ReadInt32("netpacket");
|
|
|
|
if (type < 0)
|
|
|
|
{
|
|
|
|
base::JsonReaderObject reader = jsonReader.ParseObject();
|
|
|
|
assert(!reader.HasReadError());
|
|
|
|
trailingBits.numTrailingBits = reader.ReadInt32("numTrailingBits");
|
|
|
|
trailingBits.value = reader.ReadInt32("trailingBitsValue");
|
|
|
|
}
|
|
|
|
return type;
|
|
|
|
}
|
|
|
|
|
|
|
|
PacketTrailingBits ParsePacket(base::JsonReaderFile& jsonReader,
|
|
|
|
SourceGameContext& context, IDemoWriter* writer,
|
2015-10-15 06:40:40 +02:00
|
|
|
const NetHandlers::NetDataStructArray& netDataStructs)
|
2015-07-14 05:25:49 +02:00
|
|
|
{
|
|
|
|
PacketTrailingBits trailingBits = PacketTrailingBits();
|
|
|
|
NetPacket netPacket = NetPacket();
|
|
|
|
while ((netPacket.type = ReadNetpacket(jsonReader, trailingBits)) >= 0)
|
|
|
|
{
|
|
|
|
netPacket.data = netDataStructs[netPacket.type];
|
|
|
|
NetHandlers::NetMsg_JsonRead(netPacket.type, jsonReader, context, netPacket.data);
|
|
|
|
writer->WriteNetPacket(netPacket, context);
|
|
|
|
}
|
|
|
|
return trailingBits;
|
|
|
|
}
|
2015-05-13 02:39:56 +02:00
|
|
|
|
2015-06-18 22:16:05 +02:00
|
|
|
void DemoReader::ProcessJson(std::FILE* inputFp, IDemoWriter* writer)
|
2015-05-13 02:39:56 +02:00
|
|
|
{
|
2015-10-15 06:40:40 +02:00
|
|
|
NetHandlers::NetDataStructArray netDataStructs;
|
2015-10-15 07:06:51 +02:00
|
|
|
DemHandlers::DemDataStructArray demDataStructs;
|
2015-07-14 05:25:49 +02:00
|
|
|
NetHandlers::CreateNetMsgStructs(netDataStructs);
|
|
|
|
DemHandlers::CreateDemMsgStructs(demDataStructs);
|
|
|
|
|
|
|
|
SourceGameContext context = SourceGameContext();
|
|
|
|
char buffer[4096];
|
|
|
|
base::JsonReaderFile jsonReader(inputFp, buffer, sizeof(buffer));
|
|
|
|
{
|
|
|
|
base::JsonReaderObject reader = jsonReader.ParseObject();
|
|
|
|
assert(!reader.HasReadError());
|
|
|
|
|
|
|
|
demoheader_t header;
|
|
|
|
if (!DemoJsonReader::ReadDemoHeader(reader, header))
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
writer->StartWriting(header);
|
|
|
|
context.protocol = header.networkprotocol;
|
|
|
|
}
|
|
|
|
|
|
|
|
CommandPacket packet;
|
|
|
|
do
|
|
|
|
{
|
|
|
|
{
|
|
|
|
base::JsonReaderObject reader = jsonReader.ParseObject();
|
|
|
|
if (reader.HasReadError())
|
|
|
|
{
|
|
|
|
assert(!reader.HasReadError());
|
|
|
|
}
|
|
|
|
|
|
|
|
DemoJsonReader::ReadCmdHeader(reader, packet.cmd, packet.tick);
|
|
|
|
}
|
|
|
|
packet.data = demDataStructs[packet.cmd];
|
|
|
|
DemHandlers::DemMsg_JsonRead(packet.cmd, jsonReader, packet.data);
|
|
|
|
|
|
|
|
PacketTrailingBits trailingBits = PacketTrailingBits();
|
|
|
|
writer->StartCommandPacket(packet);
|
|
|
|
if (packet.cmd == dem_packet || packet.cmd == dem_signon)
|
|
|
|
{
|
|
|
|
trailingBits = ParsePacket(jsonReader, context, writer, netDataStructs);
|
|
|
|
}
|
|
|
|
writer->EndCommandPacket(trailingBits);
|
|
|
|
} while (packet.cmd != dem_stop);
|
|
|
|
writer->EndWriting();
|
|
|
|
|
|
|
|
DemHandlers::DestroyDemMsgStructs(demDataStructs);
|
|
|
|
NetHandlers::DestroyNetMsgStructs(netDataStructs);
|
2015-05-13 02:39:56 +02:00
|
|
|
}
|