mirror of
https://github.com/dashr9230/SA-MP.git
synced 2024-12-23 06:57:31 +08:00
[server] Implement few CGameMode member functions
This commit is contained in:
parent
fff2416b13
commit
50fb6ade91
@ -1,24 +1,149 @@
|
||||
|
||||
#include "main.h"
|
||||
|
||||
#define CHECK_INIT() { if (!m_bInitialised) return 0; };
|
||||
|
||||
extern "C" int amx_CoreInit(AMX* amx);
|
||||
extern "C" int amx_CoreCleanup(AMX* amx);
|
||||
extern "C" int amx_FloatInit(AMX* amx);
|
||||
extern "C" int amx_FloatCleanup(AMX* amx);
|
||||
extern "C" int amx_StringInit(AMX* amx);
|
||||
extern "C" int amx_StringCleanup(AMX* amx);
|
||||
extern "C" int amx_FileInit(AMX* amx);
|
||||
extern "C" int amx_FileCleanup(AMX* amx);
|
||||
extern "C" int amx_TimeInit(AMX* amx);
|
||||
extern "C" int amx_TimeCleanup(AMX* amx);
|
||||
|
||||
int AMXAPI aux_LoadProgram(AMX* amx, char* filename);
|
||||
int AMXAPI aux_FreeProgram(AMX *amx);
|
||||
void AMXPrintError(CGameMode* pGameMode, AMX *amx, int error);
|
||||
int amx_CustomInit(AMX *amx);
|
||||
int amx_sampDbInit(AMX *amx);
|
||||
int amx_sampDbCleanup(AMX *amx);
|
||||
|
||||
char szGameModeFileName[256];
|
||||
|
||||
extern CNetGame* pNetGame;
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
|
||||
CGameMode::CGameMode()
|
||||
{
|
||||
field_68 = 0;
|
||||
field_69 = 0;
|
||||
m_bInitialised = false;
|
||||
m_bSleeping = false;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
|
||||
CGameMode::~CGameMode()
|
||||
{
|
||||
Unload();
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
|
||||
bool CGameMode::Load(char* pFileName)
|
||||
{
|
||||
// TODO: CGameMode::Load W .text:0046F560 L .text:080A4E90
|
||||
if (m_bInitialised)
|
||||
Unload();
|
||||
|
||||
FILE* f = fopen(pFileName, "rb");
|
||||
if (!f) return false;
|
||||
fclose(f);
|
||||
|
||||
memset((void*)&m_amx, 0, sizeof(AMX));
|
||||
m_fSleepTime = 0.0f;
|
||||
strcpy(szGameModeFileName, pFileName);
|
||||
|
||||
int err = aux_LoadProgram(&m_amx, szGameModeFileName);
|
||||
if (err != AMX_ERR_NONE)
|
||||
{
|
||||
AMXPrintError(this, &m_amx, err);
|
||||
logprintf("Failed to load '%s' script.", szGameModeFileName);
|
||||
return false;
|
||||
}
|
||||
|
||||
amx_CoreInit(&m_amx);
|
||||
amx_FloatInit(&m_amx);
|
||||
amx_StringInit(&m_amx);
|
||||
amx_FileInit(&m_amx);
|
||||
amx_TimeInit(&m_amx);
|
||||
amx_CustomInit(&m_amx);
|
||||
amx_sampDbInit(&m_amx);
|
||||
|
||||
m_bInitialised = true;
|
||||
|
||||
// Execute OnGameModeInit callback, if it exists!
|
||||
int tmp;
|
||||
if (!amx_FindPublic(&m_amx, "OnGameModeInit", &tmp))
|
||||
amx_Exec(&m_amx, (cell*)&tmp, tmp);
|
||||
pNetGame->GetFilterScripts()->OnGameModeInit();
|
||||
// ----------------------------------------------
|
||||
|
||||
// Call in filterscripts
|
||||
pNetGame->GetFilterScripts()->OnGameModeInit();
|
||||
|
||||
cell ret = 0;
|
||||
err = amx_Exec(&m_amx, &ret, AMX_EXEC_MAIN);
|
||||
if (err == AMX_ERR_SLEEP)
|
||||
{
|
||||
m_bSleeping = true;
|
||||
m_fSleepTime = ((float)ret / 1000.0f);
|
||||
}
|
||||
else if (err != AMX_ERR_NONE)
|
||||
{
|
||||
m_bSleeping = false;
|
||||
AMXPrintError(this, &m_amx, err);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
|
||||
void CGameMode::Unload()
|
||||
{
|
||||
// TODO: CGameMode::Unload() W .text:0046D7B0 L .text:080A4DB0
|
||||
// Execute OnGameModeExit callback, if it exists!
|
||||
int tmp;
|
||||
if (!amx_FindPublic(&m_amx, "OnGameModeExit", &tmp))
|
||||
amx_Exec(&m_amx, (cell*)&tmp, tmp);
|
||||
// ----------------------------------------------
|
||||
|
||||
// Call in filterscripts
|
||||
pNetGame->GetFilterScripts()->OnGameModeExit();
|
||||
CScriptTimers* pScriptTimers = pNetGame->GetTimers();
|
||||
if(pScriptTimers) pScriptTimers->DeleteForMode(&m_amx);
|
||||
|
||||
if (m_bInitialised)
|
||||
{
|
||||
aux_FreeProgram(&m_amx);
|
||||
amx_sampDbCleanup(&m_amx);
|
||||
amx_TimeCleanup(&m_amx);
|
||||
amx_FileCleanup(&m_amx);
|
||||
amx_StringCleanup(&m_amx);
|
||||
amx_FloatCleanup(&m_amx);
|
||||
amx_CoreCleanup(&m_amx);
|
||||
}
|
||||
m_bInitialised = false;
|
||||
m_bSleeping = false;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
|
||||
int CGameMode::CallPublic(char* szFuncName)
|
||||
{
|
||||
CHECK_INIT();
|
||||
|
||||
int idx;
|
||||
cell ret = 0;
|
||||
|
||||
if (!amx_FindPublic(&m_amx, szFuncName, &idx))
|
||||
amx_Exec(&m_amx, &ret, idx);
|
||||
return (int)ret;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
|
||||
}
|
||||
|
@ -2,20 +2,31 @@
|
||||
#ifndef SAMPSRV_GAMEMODES_H
|
||||
#define SAMPSRV_GAMEMODES_H
|
||||
|
||||
class CGameMode // size: WL 110
|
||||
extern char szGameModeFileName[256];
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
|
||||
class CGameMode
|
||||
{
|
||||
private:
|
||||
char gap0[104];
|
||||
char field_68;
|
||||
char field_69;
|
||||
char gap6A[4];
|
||||
AMX m_amx;
|
||||
bool m_bInitialised;
|
||||
bool m_bSleeping;
|
||||
float m_fSleepTime;
|
||||
|
||||
public:
|
||||
CGameMode();
|
||||
~CGameMode();
|
||||
|
||||
char* GetFileName() { return &szGameModeFileName[0]; };
|
||||
|
||||
bool Load(char* pFileName);
|
||||
void Unload();
|
||||
|
||||
int CallPublic(char* szFuncName);
|
||||
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user