Extend antibot interface

Co-authored-by: heinrich5991 <heinrich5991@gmail.com>
This commit is contained in:
Learath 2020-05-13 23:27:49 +03:00
parent aeeee5a643
commit 5e02bb5a23
16 changed files with 339 additions and 147 deletions

View file

@ -653,6 +653,7 @@ set_src(BASE GLOB_RECURSE src/base
vmath.h vmath.h
) )
set_src(ENGINE_INTERFACE GLOB src/engine set_src(ENGINE_INTERFACE GLOB src/engine
antibot.h
client.h client.h
config.h config.h
console.h console.h
@ -1064,6 +1065,8 @@ set_src(ANTIBOT_SRC GLOB src/antibot
) )
set_src(ENGINE_SERVER GLOB src/engine/server set_src(ENGINE_SERVER GLOB src/engine/server
antibot.cpp
antibot.h
authmanager.cpp authmanager.cpp
authmanager.h authmanager.h
name_ban.cpp name_ban.cpp
@ -1080,8 +1083,6 @@ set_src(ENGINE_SERVER GLOB src/engine/server
sql_string_helpers.h sql_string_helpers.h
) )
set_src(GAME_SERVER GLOB_RECURSE src/game/server set_src(GAME_SERVER GLOB_RECURSE src/game/server
antibot.cpp
antibot.h
ddracechat.cpp ddracechat.cpp
ddracechat.h ddracechat.h
ddracecommands.cpp ddracecommands.cpp

View file

@ -5,6 +5,9 @@
enum enum
{ {
ANTIBOT_MSGFLAG_NONVITAL=1,
ANTIBOT_MSGFLAG_FLUSH=2,
ANTIBOT_MAX_CLIENTS=64, ANTIBOT_MAX_CLIENTS=64,
}; };
@ -46,14 +49,18 @@ struct CAntibotCharacterData
int m_WeaponChangeTick; int m_WeaponChangeTick;
}; };
struct CAntibotData struct CAntibotCallbackData
{
void (*m_pfnLog)(const char *pMessage, void *pUser);
void (*m_pfnReport)(int ClientID, const char *pMessage, void *pUser);
void (*m_pfnSend)(int ClientID, const void *pData, int DataSize, int Flags, void *pUser);
void *m_pUser;
};
struct CAntibotRoundData
{ {
int m_Tick; int m_Tick;
CAntibotCharacterData m_aCharacters[ANTIBOT_MAX_CLIENTS]; CAntibotCharacterData m_aCharacters[ANTIBOT_MAX_CLIENTS];
CAntibotMapData m_Map; CAntibotMapData m_Map;
void (*m_pfnLog)(const char *pMessage, void *pUser);
void (*m_pfnReport)(int ClientID, const char *pMessage, void *pUser);
void *m_pUser;
}; };
#endif // ANTIBOT_ANTIBOT_DATA_H #endif // ANTIBOT_ANTIBOT_DATA_H

View file

@ -5,7 +5,9 @@
extern "C" extern "C"
{ {
void AntibotInit(CAntibotData *pData); void AntibotInit(CAntibotCallbackData *pCallbackData);
void AntibotRoundStart(CAntibotRoundData *pRoundData);
void AntibotRoundEnd(void);
void AntibotUpdateData(void); void AntibotUpdateData(void);
void AntibotDestroy(void); void AntibotDestroy(void);
void AntibotDump(void); void AntibotDump(void);
@ -18,6 +20,9 @@ void AntibotOnHammerHit(int ClientID);
void AntibotOnDirectInput(int ClientID); void AntibotOnDirectInput(int ClientID);
void AntibotOnTick(int ClientID); void AntibotOnTick(int ClientID);
void AntibotOnHookAttach(int ClientID, bool Player); void AntibotOnHookAttach(int ClientID, bool Player);
void AntibotOnEngineClientJoin(int ClientID);
void AntibotOnEngineClientDrop(int ClientID, const char *pReason);
void AntibotOnEngineClientMessage(int ClientID, const void *pData, int Size, int Flags);
} }

View file

@ -1,25 +1,27 @@
#include "antibot_data.h" #include "antibot_data.h"
static CAntibotData *g_pAntibot; static CAntibotCallbackData *g_pCallbacks;
extern "C" extern "C"
{ {
void AntibotInit(CAntibotData *pData) void AntibotInit(CAntibotCallbackData *pData)
{ {
g_pAntibot = pData; g_pCallbacks = pData;
if(g_pAntibot->m_pfnLog) if(g_pCallbacks->m_pfnLog)
{ {
g_pAntibot->m_pfnLog("null antibot initialized", g_pAntibot->m_pUser); g_pCallbacks->m_pfnLog("null antibot initialized", g_pCallbacks->m_pUser);
} }
} }
void AntibotUpdateData() { } void AntibotRoundStart(CAntibotRoundData *pRoundData) { };
void AntibotDestroy() { g_pAntibot = 0; } void AntibotRoundEnd(void) { };
void AntibotDump() void AntibotUpdateData(void) { }
void AntibotDestroy(void) { g_pCallbacks = 0; }
void AntibotDump(void)
{ {
if(g_pAntibot->m_pfnLog) if(g_pCallbacks->m_pfnLog)
{ {
g_pAntibot->m_pfnLog("null antibot", g_pAntibot->m_pUser); g_pCallbacks->m_pfnLog("null antibot", g_pCallbacks->m_pUser);
} }
} }
void AntibotOnPlayerInit(int ClientID) { (void)ClientID; } void AntibotOnPlayerInit(int ClientID) { (void)ClientID; }
@ -31,5 +33,8 @@ void AntibotOnHammerHit(int ClientID) { (void)ClientID; }
void AntibotOnDirectInput(int ClientID) { (void)ClientID; } void AntibotOnDirectInput(int ClientID) { (void)ClientID; }
void AntibotOnTick(int ClientID) { (void)ClientID; } void AntibotOnTick(int ClientID) { (void)ClientID; }
void AntibotOnHookAttach(int ClientID, bool Player) { (void)ClientID; (void)Player; } void AntibotOnHookAttach(int ClientID, bool Player) { (void)ClientID; (void)Player; }
void AntibotOnEngineClientJoin(int ClientID) { (void)ClientID; }
void AntibotOnEngineClientDrop(int ClientID, const char *pReason) { (void)ClientID; (void)pReason; }
void AntibotOnEngineClientMessage(int ClientID, const void *pData, int Size, int Flags) { (void)ClientID; (void)pData; (void)Size; (void)Flags; }
} }

44
src/engine/antibot.h Normal file
View file

@ -0,0 +1,44 @@
#ifndef ENGINE_ANTIBOT_H
#define ENGINE_ANTIBOT_H
#include "kernel.h"
class IAntibot : public IInterface
{
MACRO_INTERFACE("antibot", 0)
public:
virtual void RoundStart(class IGameServer *pGameServer) = 0;
virtual void RoundEnd() = 0;
// Hooks
virtual void OnPlayerInit(int ClientID) = 0;
virtual void OnPlayerDestroy(int ClientID) = 0;
virtual void OnSpawn(int ClientID) = 0;
virtual void OnHammerFireReloading(int ClientID) = 0;
virtual void OnHammerFire(int ClientID) = 0;
virtual void OnHammerHit(int ClientID) = 0;
virtual void OnDirectInput(int ClientID) = 0;
virtual void OnTick(int ClientID) = 0;
virtual void OnHookAttach(int ClientID, bool Player) = 0;
// Commands
virtual void Dump() = 0;
virtual ~IAntibot() { };
};
class IEngineAntibot : public IAntibot
{
MACRO_INTERFACE("engineantibot", 0)
public:
virtual void Init() = 0;
// Hooks
virtual void OnEngineClientJoin(int ClientID) = 0;
virtual void OnEngineClientDrop(int ClientID, const char *pReason) = 0;
virtual void OnEngineClientMessage(int ClientID, const void *pData, int Size, int Flags) = 0;
virtual ~IEngineAntibot() { };
};
#endif //ENGINE_ANTIBOT_H

View file

@ -11,6 +11,8 @@
#include <game/generated/protocol.h> #include <game/generated/protocol.h>
#include <engine/shared/protocol.h> #include <engine/shared/protocol.h>
struct CAntibotRoundData;
class IServer : public IInterface class IServer : public IInterface
{ {
MACRO_INTERFACE("server", 0) MACRO_INTERFACE("server", 0)
@ -190,6 +192,8 @@ public:
virtual void SetErrorShutdown(const char *pReason) = 0; virtual void SetErrorShutdown(const char *pReason) = 0;
virtual void ExpireServerInfo() = 0; virtual void ExpireServerInfo() = 0;
virtual void SendMsgRaw(int ClientID, const void *pData, int Size, int Flags) = 0;
virtual char *GetMapName() = 0; virtual char *GetMapName() = 0;
}; };
@ -236,6 +240,8 @@ public:
virtual void OnClientEngineJoin(int ClientID) = 0; virtual void OnClientEngineJoin(int ClientID) = 0;
virtual void OnClientEngineDrop(int ClientID, const char *pReason) = 0; virtual void OnClientEngineDrop(int ClientID, const char *pReason) = 0;
virtual void FillAntibot(CAntibotRoundData *pData) = 0;
}; };
extern IGameServer *CreateGameServer(); extern IGameServer *CreateGameServer();

View file

@ -0,0 +1,149 @@
#include "antibot.h"
#include <antibot/antibot_interface.h>
#include <engine/kernel.h>
#include <engine/console.h>
#include <engine/server.h>
#ifdef CONF_ANTIBOT
CAntibot::CAntibot()
: m_pGameServer(0)
{
}
CAntibot::~CAntibot()
{
if(m_pGameServer && m_RoundData.m_Map.m_pTiles)
free(m_RoundData.m_Map.m_pTiles);
AntibotDestroy();
}
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::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::Init()
{
m_pServer = Kernel()->RequestInterface<IServer>();
m_pConsole = Kernel()->RequestInterface<IConsole>();
dbg_assert(m_pServer && m_pConsole, "antibot requires server and console");
mem_zero(&m_CallbackData, sizeof(m_CallbackData));
m_CallbackData.m_pfnLog = Log;
m_CallbackData.m_pfnReport = Report;
m_CallbackData.m_pfnSend = Send;
m_CallbackData.m_pUser = this;
AntibotInit(&m_CallbackData);
}
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;
if(m_RoundData.m_Map.m_pTiles)
free(m_RoundData.m_Map.m_pTiles);
}
void CAntibot::Dump() { AntibotDump(); }
void CAntibot::Update()
{
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) { Update(); AntibotOnHammerHit(ClientID); }
void CAntibot::OnDirectInput(int ClientID) { Update(); AntibotOnDirectInput(ClientID); }
void CAntibot::OnTick(int ClientID) { Update(); AntibotOnTick(ClientID); }
void CAntibot::OnHookAttach(int ClientID, bool Player) { Update(); AntibotOnHookAttach(ClientID, Player); }
void CAntibot::OnEngineClientJoin(int ClientID) { AntibotOnEngineClientJoin(ClientID); }
void CAntibot::OnEngineClientDrop(int ClientID, const char *pReason) { AntibotOnEngineClientDrop(ClientID, pReason); }
void CAntibot::OnEngineClientMessage(int ClientID, const void *pData, int Size, int Flags)
{
int AntibotFlags = 0;
if((Flags&MSGFLAG_VITAL) == 0)
{
AntibotFlags |= ANTIBOT_MSGFLAG_NONVITAL;
}
AntibotOnEngineClientMessage(ClientID, pData, Size, Flags);
}
#else
CAntibot::CAntibot() :
m_pGameServer(0)
{
}
CAntibot::~CAntibot()
{
}
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::Dump()
{
Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "antibot", "antibot support not compiled in");
}
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) { }
void CAntibot::OnDirectInput(int ClientID) { }
void CAntibot::OnTick(int ClientID) { }
void CAntibot::OnHookAttach(int ClientID, bool Player) { }
void CAntibot::OnEngineClientJoin(int ClientID) { }
void CAntibot::OnEngineClientDrop(int ClientID, const char *pReason) { }
void CAntibot::OnEngineClientMessage(int ClientID, const void *pData, int Size, int Flags) { }
#endif
IEngineAntibot *CreateEngineAntibot() { return new CAntibot; }

View file

@ -0,0 +1,54 @@
#ifndef ENGINE_SERVER_ANTIBOT_H
#define ENGINE_SERVER_ANTIBOT_H
#include <antibot/antibot_data.h>
#include <engine/antibot.h>
class CAntibot : public IEngineAntibot
{
class IServer *m_pServer;
class IConsole *m_pConsole;
class IGameServer *m_pGameServer;
class IServer *Server() const { return m_pServer; }
class IConsole *Console() const { return m_pConsole; }
class IGameServer *GameServer() const { return m_pGameServer; }
CAntibotCallbackData m_CallbackData;
CAntibotRoundData m_RoundData;
void Update();
static void Send(int ClientID, const void *pData, int Size, int Flags, void *pUser);
static void Log(const char *pMessage, void *pUser);
static void Report(int ClientID, const char *pMessage, void *pUser);
public:
CAntibot();
virtual ~CAntibot();
// Engine
virtual void Init();
virtual void OnEngineClientJoin(int ClientID);
virtual void OnEngineClientDrop(int ClientID, const char *pReason);
virtual void OnEngineClientMessage(int ClientID, const void *pData, int Size, int Flags);
// Game
virtual void RoundStart(class IGameServer *pGameServer);
virtual void RoundEnd();
virtual void OnPlayerInit(int ClientID);
virtual void OnPlayerDestroy(int ClientID);
virtual void OnSpawn(int ClientID);
virtual void OnHammerFireReloading(int ClientID);
virtual void OnHammerFire(int ClientID);
virtual void OnHammerHit(int ClientID);
virtual void OnDirectInput(int ClientID);
virtual void OnTick(int ClientID);
virtual void OnHookAttach(int ClientID, bool Player);
virtual void Dump();
};
extern IEngineAntibot *CreateEngineAntibot();
#endif // ENGINE_SERVER_ANTIBOT_H

View file

@ -663,6 +663,25 @@ int CServer::SendMsg(CMsgPacker *pMsg, int Flags, int ClientID)
return 0; return 0;
} }
void CServer::SendMsgRaw(int ClientID, const void *pData, int Size, int Flags)
{
CNetChunk Packet;
mem_zero(&Packet, sizeof(CNetChunk));
Packet.m_ClientID = ClientID;
Packet.m_pData = pData;
Packet.m_DataSize = Size;
Packet.m_Flags = 0;
if(Flags&MSGFLAG_VITAL)
{
Packet.m_Flags |= NETSENDFLAG_VITAL;
}
if(Flags&MSGFLAG_FLUSH)
{
Packet.m_Flags |= NETSENDFLAG_FLUSH;
}
m_NetServer.Send(&Packet);
}
void CServer::DoSnapshot() void CServer::DoSnapshot()
{ {
GameServer()->OnPreSnap(); GameServer()->OnPreSnap();
@ -869,7 +888,9 @@ int CServer::NewClientCallback(int ClientID, void *pUser)
pThis->m_aClients[ClientID].m_ShowIps = false; pThis->m_aClients[ClientID].m_ShowIps = false;
memset(&pThis->m_aClients[ClientID].m_Addr, 0, sizeof(NETADDR)); memset(&pThis->m_aClients[ClientID].m_Addr, 0, sizeof(NETADDR));
pThis->m_aClients[ClientID].Reset(); pThis->m_aClients[ClientID].Reset();
pThis->GameServer()->OnClientEngineJoin(ClientID); pThis->GameServer()->OnClientEngineJoin(ClientID);
pThis->Antibot()->OnEngineClientJoin(ClientID);
#if defined(CONF_FAMILY_UNIX) #if defined(CONF_FAMILY_UNIX)
pThis->SendConnLoggingCommand(OPEN_SESSION, pThis->m_NetServer.ClientAddr(ClientID)); pThis->SendConnLoggingCommand(OPEN_SESSION, pThis->m_NetServer.ClientAddr(ClientID));
@ -951,6 +972,7 @@ int CServer::DelClientCallback(int ClientID, const char *pReason, void *pUser)
pThis->m_aClients[ClientID].m_Snapshots.PurgeAll(); pThis->m_aClients[ClientID].m_Snapshots.PurgeAll();
pThis->GameServer()->OnClientEngineDrop(ClientID, pReason); pThis->GameServer()->OnClientEngineDrop(ClientID, pReason);
pThis->Antibot()->OnEngineClientDrop(ClientID, pReason);
#if defined(CONF_FAMILY_UNIX) #if defined(CONF_FAMILY_UNIX)
pThis->SendConnLoggingCommand(CLOSE_SESSION, pThis->m_NetServer.ClientAddr(ClientID)); pThis->SendConnLoggingCommand(CLOSE_SESSION, pThis->m_NetServer.ClientAddr(ClientID));
#endif #endif
@ -1128,6 +1150,13 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
Unpacker.Reset(pPacket->m_pData, pPacket->m_DataSize); Unpacker.Reset(pPacket->m_pData, pPacket->m_DataSize);
CMsgPacker Packer(NETMSG_EX, true); CMsgPacker Packer(NETMSG_EX, true);
int GameFlags = 0;
if(pPacket->m_Flags&NET_CHUNKFLAG_VITAL)
{
GameFlags |= MSGFLAG_VITAL;
}
Antibot()->OnEngineClientMessage(ClientID, pPacket->m_pData, pPacket->m_DataSize, GameFlags);
// unpack msgid and system flag // unpack msgid and system flag
int Msg; int Msg;
bool Sys; bool Sys;
@ -1980,6 +2009,7 @@ int CServer::Run()
str_format(aBuf, sizeof(aBuf), "server name is '%s'", g_Config.m_SvName); str_format(aBuf, sizeof(aBuf), "server name is '%s'", g_Config.m_SvName);
Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf); Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf);
Antibot()->Init();
GameServer()->OnInit(); GameServer()->OnInit();
if(ErrorShutdown()) if(ErrorShutdown())
{ {
@ -2965,6 +2995,7 @@ void CServer::RegisterCommands()
m_pGameServer = Kernel()->RequestInterface<IGameServer>(); m_pGameServer = Kernel()->RequestInterface<IGameServer>();
m_pMap = Kernel()->RequestInterface<IEngineMap>(); m_pMap = Kernel()->RequestInterface<IEngineMap>();
m_pStorage = Kernel()->RequestInterface<IStorage>(); m_pStorage = Kernel()->RequestInterface<IStorage>();
m_pAntibot = Kernel()->RequestInterface<IEngineAntibot>();
// register console commands // register console commands
Console()->Register("kick", "i[id] ?r[reason]", CFGFLAG_SERVER, ConKick, this, "Kick player with specified id for any reason"); Console()->Register("kick", "i[id] ?r[reason]", CFGFLAG_SERVER, ConKick, this, "Kick player with specified id for any reason");
@ -3076,6 +3107,7 @@ int main(int argc, const char **argv) // ignore_convention
IEngineMasterServer *pEngineMasterServer = CreateEngineMasterServer(); IEngineMasterServer *pEngineMasterServer = CreateEngineMasterServer();
IStorage *pStorage = CreateStorage("Teeworlds", IStorage::STORAGETYPE_SERVER, argc, argv); // ignore_convention IStorage *pStorage = CreateStorage("Teeworlds", IStorage::STORAGETYPE_SERVER, argc, argv); // ignore_convention
IConfig *pConfig = CreateConfig(); IConfig *pConfig = CreateConfig();
IEngineAntibot *pEngineAntibot = CreateEngineAntibot();
pServer->InitRegister(&pServer->m_NetServer, pEngineMasterServer, pConsole); pServer->InitRegister(&pServer->m_NetServer, pEngineMasterServer, pConsole);
@ -3092,6 +3124,8 @@ int main(int argc, const char **argv) // ignore_convention
RegisterFail = RegisterFail || !pKernel->RegisterInterface(pConfig); RegisterFail = RegisterFail || !pKernel->RegisterInterface(pConfig);
RegisterFail = RegisterFail || !pKernel->RegisterInterface(pEngineMasterServer); // register as both RegisterFail = RegisterFail || !pKernel->RegisterInterface(pEngineMasterServer); // register as both
RegisterFail = RegisterFail || !pKernel->RegisterInterface(static_cast<IMasterServer*>(pEngineMasterServer), false); RegisterFail = RegisterFail || !pKernel->RegisterInterface(static_cast<IMasterServer*>(pEngineMasterServer), false);
RegisterFail = RegisterFail || !pKernel->RegisterInterface(pEngineAntibot);
RegisterFail = RegisterFail || !pKernel->RegisterInterface(static_cast<IAntibot*>(pEngineAntibot), false);
if(RegisterFail) if(RegisterFail)
{ {

View file

@ -25,6 +25,7 @@
#include <list> #include <list>
#include "antibot.h"
#include "authmanager.h" #include "authmanager.h"
#include "name_ban.h" #include "name_ban.h"
@ -91,6 +92,7 @@ class CServer : public IServer
class IGameServer *m_pGameServer; class IGameServer *m_pGameServer;
class IConsole *m_pConsole; class IConsole *m_pConsole;
class IStorage *m_pStorage; class IStorage *m_pStorage;
class IEngineAntibot *m_pAntibot;
#if defined(CONF_SQL) #if defined(CONF_SQL)
lock m_GlobalSqlLock; lock m_GlobalSqlLock;
@ -109,6 +111,7 @@ public:
class IGameServer *GameServer() { return m_pGameServer; } class IGameServer *GameServer() { return m_pGameServer; }
class IConsole *Console() { return m_pConsole; } class IConsole *Console() { return m_pConsole; }
class IStorage *Storage() { return m_pStorage; } class IStorage *Storage() { return m_pStorage; }
class IEngineAntibot *Antibot() { return m_pAntibot; }
enum enum
{ {
@ -412,6 +415,8 @@ public:
bool SetTimedOut(int ClientID, int OrigID); bool SetTimedOut(int ClientID, int OrigID);
void SetTimeoutProtected(int ClientID) { m_NetServer.SetTimeoutProtected(ClientID); }; void SetTimeoutProtected(int ClientID) { m_NetServer.SetTimeoutProtected(ClientID); };
void SendMsgRaw(int ClientID, const void *pData, int Size, int Flags);
bool ErrorShutdown() const { return m_aErrorShutdownReason[0] != 0; } bool ErrorShutdown() const { return m_aErrorShutdownReason[0] != 0; }
void SetErrorShutdown(const char *pReason); void SetErrorShutdown(const char *pReason);

View file

@ -1,94 +0,0 @@
#include "antibot.h"
#include <antibot/antibot_data.h>
#include <antibot/antibot_interface.h>
#include <game/server/gamecontext.h>
#ifdef CONF_ANTIBOT
static CAntibotData g_Data;
static void Log(const char *pMessage, void *pUser)
{
CGameContext *pGameContext = (CGameContext *)pUser;
pGameContext->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "antibot", pMessage);
}
static void Report(int ClientID, const char *pMessage, void *pUser)
{
char aBuf[256];
str_format(aBuf, sizeof(aBuf), "%d: %s", ClientID, pMessage);
Log(aBuf, pUser);
}
CAntibot::CAntibot()
: m_pGameContext(0)
{
}
CAntibot::~CAntibot()
{
// Check if `Init` was called. There is no easy way to prevent two
// destructors running without an `Init` call in between.
if(m_pGameContext)
{
AntibotDestroy();
free(g_Data.m_Map.m_pTiles);
g_Data.m_Map.m_pTiles = 0;
m_pGameContext = 0;
}
}
void CAntibot::Init(CGameContext *pGameContext)
{
m_pGameContext = pGameContext;
mem_zero(&g_Data, sizeof(g_Data));
g_Data.m_Map.m_pTiles = 0;
g_Data.m_pfnLog = Log;
g_Data.m_pfnReport = Report;
g_Data.m_pUser = m_pGameContext;
AntibotInit(&g_Data);
Update();
}
void CAntibot::Dump() { AntibotDump(); }
void CAntibot::Update()
{
m_pGameContext->FillAntibot(&g_Data);
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) { Update(); AntibotOnHammerHit(ClientID); }
void CAntibot::OnDirectInput(int ClientID) { Update(); AntibotOnDirectInput(ClientID); }
void CAntibot::OnTick(int ClientID) { Update(); AntibotOnTick(ClientID); }
void CAntibot::OnHookAttach(int ClientID, bool Player) { Update(); AntibotOnHookAttach(ClientID, Player); }
#else
CAntibot::CAntibot() :
m_pGameContext(0)
{
}
CAntibot::~CAntibot()
{
}
void CAntibot::Init(CGameContext *pGameContext)
{
m_pGameContext = pGameContext;
}
void CAntibot::Dump()
{
m_pGameContext->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "antibot", "antibot support not compiled in");
}
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) { }
void CAntibot::OnDirectInput(int ClientID) { }
void CAntibot::OnTick(int ClientID) { }
void CAntibot::OnHookAttach(int ClientID, bool Player) { }
#endif

View file

@ -1,27 +0,0 @@
#ifndef GAME_SERVER_ANTIBOT_H
#define GAME_SERVER_ANTIBOT_H
class CGameContext;
class CAntibot
{
CGameContext *m_pGameContext;
void Update();
public:
CAntibot();
~CAntibot();
void Init(CGameContext *pGameContext);
void Dump();
void OnPlayerInit(int ClientID);
void OnPlayerDestroy(int ClientID);
void OnSpawn(int ClientID);
void OnHammerFireReloading(int ClientID);
void OnHammerFire(int ClientID);
void OnHammerHit(int ClientID);
void OnDirectInput(int ClientID);
void OnTick(int ClientID);
void OnHookAttach(int ClientID, bool Player);
};
#endif // GAME_SERVER_ANTIBOT_H

View file

@ -2108,7 +2108,7 @@ void CCharacter::SendZoneMsgs()
} }
} }
CAntibot *CCharacter::Antibot() IAntibot *CCharacter::Antibot()
{ {
return GameServer()->Antibot(); return GameServer()->Antibot();
} }

View file

@ -3,6 +3,7 @@
#ifndef GAME_SERVER_ENTITIES_CHARACTER_H #ifndef GAME_SERVER_ENTITIES_CHARACTER_H
#define GAME_SERVER_ENTITIES_CHARACTER_H #define GAME_SERVER_ENTITIES_CHARACTER_H
#include <engine/antibot.h>
#include <game/server/entity.h> #include <game/server/entity.h>
#include <game/generated/server_data.h> #include <game/generated/server_data.h>
#include <game/generated/protocol.h> #include <game/generated/protocol.h>
@ -173,7 +174,7 @@ private:
void HandleBroadcast(); void HandleBroadcast();
void HandleTuneLayer(); void HandleTuneLayer();
void SendZoneMsgs(); void SendZoneMsgs();
CAntibot *Antibot(); IAntibot *Antibot();
bool m_SetSavePos; bool m_SetSavePos;
vec2 m_PrevSavePos; vec2 m_PrevSavePos;

View file

@ -131,7 +131,7 @@ bool CGameContext::EmulateBug(int Bug)
return m_MapBugs.Contains(Bug); return m_MapBugs.Contains(Bug);
} }
void CGameContext::FillAntibot(CAntibotData *pData) void CGameContext::FillAntibot(CAntibotRoundData *pData)
{ {
if(!pData->m_Map.m_pTiles) if(!pData->m_Map.m_pTiles)
{ {
@ -2617,7 +2617,8 @@ void CGameContext::OnInit(/*class IKernel *pKernel*/)
m_pConsole = Kernel()->RequestInterface<IConsole>(); m_pConsole = Kernel()->RequestInterface<IConsole>();
m_pEngine = Kernel()->RequestInterface<IEngine>(); m_pEngine = Kernel()->RequestInterface<IEngine>();
m_pStorage = Kernel()->RequestInterface<IStorage>(); m_pStorage = Kernel()->RequestInterface<IStorage>();
m_Antibot.Init(this); m_pAntibot = Kernel()->RequestInterface<IAntibot>();
m_pAntibot->RoundStart(this);
m_World.SetGameServer(this); m_World.SetGameServer(this);
m_Events.SetGameServer(this); m_Events.SetGameServer(this);
@ -3044,6 +3045,8 @@ void CGameContext::OnShutdown(bool FullShutdown)
if (FullShutdown) if (FullShutdown)
Score()->OnShutdown(); Score()->OnShutdown();
Antibot()->RoundEnd();
if(m_TeeHistorianActive) if(m_TeeHistorianActive)
{ {
m_TeeHistorian.Finish(); m_TeeHistorian.Finish();

View file

@ -3,6 +3,7 @@
#ifndef GAME_SERVER_GAMECONTEXT_H #ifndef GAME_SERVER_GAMECONTEXT_H
#define GAME_SERVER_GAMECONTEXT_H #define GAME_SERVER_GAMECONTEXT_H
#include <engine/antibot.h>
#include <engine/server.h> #include <engine/server.h>
#include <engine/console.h> #include <engine/console.h>
#include <engine/shared/memheap.h> #include <engine/shared/memheap.h>
@ -11,7 +12,6 @@
#include <game/mapbugs.h> #include <game/mapbugs.h>
#include <game/voting.h> #include <game/voting.h>
#include "antibot.h"
#include "eventhandler.h" #include "eventhandler.h"
#include "gamecontroller.h" #include "gamecontroller.h"
#include "gameworld.h" #include "gameworld.h"
@ -67,6 +67,7 @@ class CGameContext : public IGameServer
IConsole *m_pConsole; IConsole *m_pConsole;
IEngine *m_pEngine; IEngine *m_pEngine;
IStorage *m_pStorage; IStorage *m_pStorage;
IAntibot *m_pAntibot;
CLayers m_Layers; CLayers m_Layers;
CCollision m_Collision; CCollision m_Collision;
CNetObjHandler m_NetObjHandler; CNetObjHandler m_NetObjHandler;
@ -78,7 +79,6 @@ class CGameContext : public IGameServer
ASYNCIO *m_pTeeHistorianFile; ASYNCIO *m_pTeeHistorianFile;
CUuid m_GameUuid; CUuid m_GameUuid;
CMapBugs m_MapBugs; CMapBugs m_MapBugs;
CAntibot m_Antibot;
std::shared_ptr<CRandomMapResult> m_pRandomMapResult; std::shared_ptr<CRandomMapResult> m_pRandomMapResult;
std::shared_ptr<CMapVoteResult> m_pMapVoteResult; std::shared_ptr<CMapVoteResult> m_pMapVoteResult;
@ -130,7 +130,7 @@ public:
CCollision *Collision() { return &m_Collision; } CCollision *Collision() { return &m_Collision; }
CTuningParams *Tuning() { return &m_Tuning; } CTuningParams *Tuning() { return &m_Tuning; }
CTuningParams *TuningList() { return &m_aTuningList[0]; } CTuningParams *TuningList() { return &m_aTuningList[0]; }
CAntibot *Antibot() { return &m_Antibot; } IAntibot *Antibot() { return m_pAntibot; }
CGameContext(); CGameContext();
~CGameContext(); ~CGameContext();
@ -146,7 +146,6 @@ public:
// helper functions // helper functions
class CCharacter *GetPlayerChar(int ClientID); class CCharacter *GetPlayerChar(int ClientID);
bool EmulateBug(int Bug); bool EmulateBug(int Bug);
void FillAntibot(CAntibotData *pData);
// voting // voting
void StartVote(const char *pDesc, const char *pCommand, const char *pReason); void StartVote(const char *pDesc, const char *pCommand, const char *pReason);
@ -253,7 +252,7 @@ public:
virtual const char *NetVersion(); virtual const char *NetVersion();
// DDRace // DDRace
virtual void FillAntibot(CAntibotRoundData *pData);
int ProcessSpamProtection(int ClientID); int ProcessSpamProtection(int ClientID);
int GetDDRaceTeam(int ClientID); int GetDDRaceTeam(int ClientID);
// Describes the time when the first player joined the server. // Describes the time when the first player joined the server.