2015-05-13 02:39:56 +02:00
|
|
|
|
|
|
|
#include "idemowriter.h"
|
2015-06-14 23:07:33 +02:00
|
|
|
#include "demofile/demotypes.h"
|
|
|
|
#include "demofile/demofile.h"
|
2015-05-28 04:58:19 +02:00
|
|
|
#include "netmessages/nethandlers.h"
|
|
|
|
#include "netmessages/netcontants.h"
|
2015-06-14 22:15:08 +02:00
|
|
|
#include "sourcesdk/bitbuf.h"
|
2015-05-13 02:39:56 +02:00
|
|
|
#include <cstdio>
|
2015-05-28 04:58:19 +02:00
|
|
|
#include <memory>
|
2015-05-13 02:39:56 +02:00
|
|
|
|
|
|
|
class DemoWriter: public IDemoWriter
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
DemoWriter(FILE* outputFp);
|
|
|
|
|
|
|
|
virtual void StartWriting(demoheader_t& header) override final;
|
|
|
|
virtual void EndWriting() override final;
|
|
|
|
|
|
|
|
virtual void StartCommandPacket(CommandPacket& packet) override final;
|
|
|
|
virtual void EndCommandPacket() override final;
|
|
|
|
|
2015-05-28 04:54:07 +02:00
|
|
|
virtual void WriteNetPacket(NetPacket& packet, SourceGameContext& context) override final;
|
2015-05-28 04:58:19 +02:00
|
|
|
|
|
|
|
private:
|
|
|
|
DemoFileWriter m_writer;
|
|
|
|
bf_write m_cmdPacketBuf;
|
|
|
|
std::unique_ptr<uint8_t[]> m_packetBuffer;
|
2015-05-13 02:39:56 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
IDemoWriter* IDemoWriter::CreateDemoWriter(void* outputFp)
|
|
|
|
{
|
|
|
|
return new DemoWriter(reinterpret_cast<FILE*>(outputFp));
|
|
|
|
}
|
|
|
|
|
2015-05-28 04:58:19 +02:00
|
|
|
DemoWriter::DemoWriter(FILE* outputFp):
|
|
|
|
m_writer(outputFp),
|
|
|
|
m_packetBuffer(new uint8_t[NET_MAX_PAYLOAD])
|
2015-05-13 02:39:56 +02:00
|
|
|
{
|
2015-05-28 04:58:19 +02:00
|
|
|
m_cmdPacketBuf.StartWriting(m_packetBuffer.get(), NET_MAX_PAYLOAD);
|
2015-05-13 02:39:56 +02:00
|
|
|
}
|
2015-05-15 03:36:57 +02:00
|
|
|
|
|
|
|
void DemoWriter::StartWriting(demoheader_t& header)
|
|
|
|
{
|
2015-05-28 04:58:19 +02:00
|
|
|
m_writer.WriteDemoHeader(header);
|
2015-05-15 03:36:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void DemoWriter::EndWriting()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void DemoWriter::StartCommandPacket(CommandPacket& packet)
|
|
|
|
{
|
2015-05-28 04:58:19 +02:00
|
|
|
m_writer.WriteCmdHeader(packet.cmd, packet.tick);
|
|
|
|
if (packet.cmd == dem_packet || packet.cmd == dem_signon)
|
|
|
|
{
|
|
|
|
m_writer.WriteCmdInfo(*packet.cmdInfo);
|
|
|
|
m_writer.WriteSequenceInfo(packet.sequenceInfo1, packet.sequenceInfo2);
|
|
|
|
}
|
|
|
|
m_cmdPacketBuf.Reset();
|
2015-05-15 03:36:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void DemoWriter::EndCommandPacket()
|
|
|
|
{
|
2015-06-14 23:21:34 +02:00
|
|
|
if (m_cmdPacketBuf.GetNumBytesWritten() > 0)
|
|
|
|
{
|
|
|
|
m_writer.WriteRawData(m_cmdPacketBuf.GetBasePointer(), m_cmdPacketBuf.GetNumBytesWritten());
|
|
|
|
}
|
2015-05-15 03:36:57 +02:00
|
|
|
}
|
|
|
|
|
2015-05-28 04:54:07 +02:00
|
|
|
void DemoWriter::WriteNetPacket(NetPacket& packet, SourceGameContext& context)
|
2015-05-15 03:36:57 +02:00
|
|
|
{
|
2015-05-28 04:58:19 +02:00
|
|
|
NetHandlers::NetMsg_BitWrite(packet.type, m_cmdPacketBuf, context, packet.data);
|
2015-05-15 03:36:57 +02:00
|
|
|
}
|