mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-18 22:18:19 +00:00
270 lines
6.7 KiB
C++
270 lines
6.7 KiB
C++
#include "antibot.h"
|
|
|
|
#include <antibot/antibot_interface.h>
|
|
|
|
#include <base/system.h>
|
|
|
|
#include <engine/console.h>
|
|
#include <engine/kernel.h>
|
|
#include <engine/server.h>
|
|
|
|
class IEngineAntibot;
|
|
|
|
#ifdef CONF_ANTIBOT
|
|
CAntibot::CAntibot() :
|
|
m_pServer(0), m_pConsole(0), m_pGameServer(0), m_Initialized(false)
|
|
{
|
|
}
|
|
CAntibot::~CAntibot()
|
|
{
|
|
if(m_pGameServer)
|
|
free(m_RoundData.m_Map.m_pTiles);
|
|
|
|
if(m_Initialized)
|
|
AntibotDestroy();
|
|
}
|
|
void CAntibot::Kick(int ClientID, const char *pMessage, void *pUser)
|
|
{
|
|
CAntibot *pAntibot = (CAntibot *)pUser;
|
|
pAntibot->Server()->Kick(ClientID, pMessage);
|
|
}
|
|
void CAntibot::Log(const char *pMessage, void *pUser)
|
|
{
|
|
CAntibot *pAntibot = (CAntibot *)pUser;
|
|
pAntibot->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "antibot", pMessage);
|
|
}
|
|
void CAntibot::Report(int ClientID, const char *pMessage, void *pUser)
|
|
{
|
|
char aBuf[256];
|
|
str_format(aBuf, sizeof(aBuf), "%d: %s", ClientID, pMessage);
|
|
Log(aBuf, pUser);
|
|
}
|
|
void CAntibot::Send(int ClientID, const void *pData, int Size, int Flags, void *pUser)
|
|
{
|
|
CAntibot *pAntibot = (CAntibot *)pUser;
|
|
|
|
int RealFlags = MSGFLAG_VITAL;
|
|
if(Flags & ANTIBOT_MSGFLAG_NONVITAL)
|
|
{
|
|
RealFlags &= ~MSGFLAG_VITAL;
|
|
}
|
|
if(Flags & ANTIBOT_MSGFLAG_FLUSH)
|
|
{
|
|
RealFlags |= MSGFLAG_FLUSH;
|
|
}
|
|
pAntibot->Server()->SendMsgRaw(ClientID, pData, Size, RealFlags);
|
|
}
|
|
void CAntibot::Teehistorian(const void *pData, int Size, void *pUser)
|
|
{
|
|
CAntibot *pAntibot = (CAntibot *)pUser;
|
|
pAntibot->m_pGameServer->TeehistorianRecordAntibot(pData, Size);
|
|
}
|
|
void CAntibot::Init()
|
|
{
|
|
m_pServer = Kernel()->RequestInterface<IServer>();
|
|
m_pConsole = Kernel()->RequestInterface<IConsole>();
|
|
dbg_assert(m_pServer && m_pConsole, "antibot requires server and console");
|
|
dbg_assert(AntibotAbiVersion() == ANTIBOT_ABI_VERSION, "antibot abi version mismatch");
|
|
|
|
mem_zero(&m_Data, sizeof(m_Data));
|
|
CAntibotVersion Version = ANTIBOT_VERSION;
|
|
m_Data.m_Version = Version;
|
|
|
|
m_Data.m_Now = time_get();
|
|
m_Data.m_Freq = time_freq();
|
|
m_Data.m_pfnKick = Kick;
|
|
m_Data.m_pfnLog = Log;
|
|
m_Data.m_pfnReport = Report;
|
|
m_Data.m_pfnSend = Send;
|
|
m_Data.m_pfnTeehistorian = Teehistorian;
|
|
m_Data.m_pUser = this;
|
|
AntibotInit(&m_Data);
|
|
|
|
m_Initialized = true;
|
|
}
|
|
void CAntibot::RoundStart(IGameServer *pGameServer)
|
|
{
|
|
m_pGameServer = pGameServer;
|
|
mem_zero(&m_RoundData, sizeof(m_RoundData));
|
|
m_RoundData.m_Map.m_pTiles = 0;
|
|
AntibotRoundStart(&m_RoundData);
|
|
Update();
|
|
}
|
|
void CAntibot::RoundEnd()
|
|
{
|
|
// Let the external module clean up first
|
|
AntibotRoundEnd();
|
|
|
|
m_pGameServer = 0;
|
|
free(m_RoundData.m_Map.m_pTiles);
|
|
}
|
|
void CAntibot::ConsoleCommand(const char *pCommand)
|
|
{
|
|
AntibotConsoleCommand(pCommand);
|
|
}
|
|
void CAntibot::Update()
|
|
{
|
|
m_Data.m_Now = time_get();
|
|
m_Data.m_Freq = time_freq();
|
|
|
|
Server()->FillAntibot(&m_RoundData);
|
|
if(GameServer())
|
|
{
|
|
GameServer()->FillAntibot(&m_RoundData);
|
|
AntibotUpdateData();
|
|
}
|
|
}
|
|
|
|
void CAntibot::OnPlayerInit(int ClientID)
|
|
{
|
|
Update();
|
|
AntibotOnPlayerInit(ClientID);
|
|
}
|
|
void CAntibot::OnPlayerDestroy(int ClientID)
|
|
{
|
|
Update();
|
|
AntibotOnPlayerDestroy(ClientID);
|
|
}
|
|
void CAntibot::OnSpawn(int ClientID)
|
|
{
|
|
Update();
|
|
AntibotOnSpawn(ClientID);
|
|
}
|
|
void CAntibot::OnHammerFireReloading(int ClientID)
|
|
{
|
|
Update();
|
|
AntibotOnHammerFireReloading(ClientID);
|
|
}
|
|
void CAntibot::OnHammerFire(int ClientID)
|
|
{
|
|
Update();
|
|
AntibotOnHammerFire(ClientID);
|
|
}
|
|
void CAntibot::OnHammerHit(int ClientID, int TargetID)
|
|
{
|
|
Update();
|
|
AntibotOnHammerHit(ClientID, TargetID);
|
|
}
|
|
void CAntibot::OnDirectInput(int ClientID)
|
|
{
|
|
Update();
|
|
AntibotOnDirectInput(ClientID);
|
|
}
|
|
void CAntibot::OnCharacterTick(int ClientID)
|
|
{
|
|
Update();
|
|
AntibotOnCharacterTick(ClientID);
|
|
}
|
|
void CAntibot::OnHookAttach(int ClientID, bool Player)
|
|
{
|
|
Update();
|
|
AntibotOnHookAttach(ClientID, Player);
|
|
}
|
|
|
|
void CAntibot::OnEngineTick()
|
|
{
|
|
Update();
|
|
AntibotOnEngineTick();
|
|
}
|
|
void CAntibot::OnEngineClientJoin(int ClientID, bool Sixup)
|
|
{
|
|
Update();
|
|
AntibotOnEngineClientJoin(ClientID, Sixup);
|
|
}
|
|
void CAntibot::OnEngineClientDrop(int ClientID, const char *pReason)
|
|
{
|
|
Update();
|
|
AntibotOnEngineClientDrop(ClientID, pReason);
|
|
}
|
|
bool CAntibot::OnEngineClientMessage(int ClientID, const void *pData, int Size, int Flags)
|
|
{
|
|
Update();
|
|
int AntibotFlags = 0;
|
|
if((Flags & MSGFLAG_VITAL) == 0)
|
|
{
|
|
AntibotFlags |= ANTIBOT_MSGFLAG_NONVITAL;
|
|
}
|
|
return AntibotOnEngineClientMessage(ClientID, pData, Size, AntibotFlags);
|
|
}
|
|
bool CAntibot::OnEngineServerMessage(int ClientID, const void *pData, int Size, int Flags)
|
|
{
|
|
Update();
|
|
int AntibotFlags = 0;
|
|
if((Flags & MSGFLAG_VITAL) == 0)
|
|
{
|
|
AntibotFlags |= ANTIBOT_MSGFLAG_NONVITAL;
|
|
}
|
|
return AntibotOnEngineServerMessage(ClientID, pData, Size, AntibotFlags);
|
|
}
|
|
bool CAntibot::OnEngineSimulateClientMessage(int *pClientID, void *pBuffer, int BufferSize, int *pOutSize, int *pFlags)
|
|
{
|
|
int AntibotFlags = 0;
|
|
bool Result = AntibotOnEngineSimulateClientMessage(pClientID, pBuffer, BufferSize, pOutSize, &AntibotFlags);
|
|
if(Result)
|
|
{
|
|
*pFlags = 0;
|
|
if((AntibotFlags & ANTIBOT_MSGFLAG_NONVITAL) == 0)
|
|
{
|
|
*pFlags |= MSGFLAG_VITAL;
|
|
}
|
|
}
|
|
return Result;
|
|
}
|
|
#else
|
|
CAntibot::CAntibot() :
|
|
m_pServer(0), m_pConsole(0), m_pGameServer(0), m_Initialized(false)
|
|
{
|
|
}
|
|
CAntibot::~CAntibot() = default;
|
|
void CAntibot::Init()
|
|
{
|
|
m_pServer = Kernel()->RequestInterface<IServer>();
|
|
m_pConsole = Kernel()->RequestInterface<IConsole>();
|
|
dbg_assert(m_pServer && m_pConsole, "antibot requires server and console");
|
|
}
|
|
void CAntibot::RoundStart(IGameServer *pGameServer)
|
|
{
|
|
m_pGameServer = pGameServer;
|
|
}
|
|
void CAntibot::RoundEnd()
|
|
{
|
|
m_pGameServer = 0;
|
|
}
|
|
void CAntibot::ConsoleCommand(const char *pCommand)
|
|
{
|
|
if(str_comp(pCommand, "dump") == 0)
|
|
{
|
|
Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "antibot", "antibot support not compiled in");
|
|
}
|
|
else
|
|
{
|
|
Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "antibot", "unknown command");
|
|
}
|
|
}
|
|
void CAntibot::Update()
|
|
{
|
|
}
|
|
|
|
void CAntibot::OnPlayerInit(int ClientID) {}
|
|
void CAntibot::OnPlayerDestroy(int ClientID) {}
|
|
void CAntibot::OnSpawn(int ClientID) {}
|
|
void CAntibot::OnHammerFireReloading(int ClientID) {}
|
|
void CAntibot::OnHammerFire(int ClientID) {}
|
|
void CAntibot::OnHammerHit(int ClientID, int TargetID) {}
|
|
void CAntibot::OnDirectInput(int ClientID) {}
|
|
void CAntibot::OnCharacterTick(int ClientID) {}
|
|
void CAntibot::OnHookAttach(int ClientID, bool Player) {}
|
|
|
|
void CAntibot::OnEngineTick() {}
|
|
void CAntibot::OnEngineClientJoin(int ClientID, bool Sixup) {}
|
|
void CAntibot::OnEngineClientDrop(int ClientID, const char *pReason) {}
|
|
bool CAntibot::OnEngineClientMessage(int ClientID, const void *pData, int Size, int Flags) { return false; }
|
|
bool CAntibot::OnEngineServerMessage(int ClientID, const void *pData, int Size, int Flags) { return false; }
|
|
bool CAntibot::OnEngineSimulateClientMessage(int *pClientID, void *pBuffer, int BufferSize, int *pOutSize, int *pFlags) { return false; }
|
|
#endif
|
|
|
|
IEngineAntibot *CreateEngineAntibot()
|
|
{
|
|
return new CAntibot;
|
|
}
|