mirror of
https://github.com/rehlds/reapi.git
synced 2025-03-14 06:20:32 +03:00
245 lines
5.9 KiB
C++
245 lines
5.9 KiB
C++
// vim: set ts=4 sw=4 tw=99 noet:
|
|
//
|
|
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
|
|
// Copyright (C) The AMX Mod X Development Team.
|
|
// Parts Copyright (C) 2001-2003 Will Day <willday@hpgx.net>
|
|
//
|
|
// This software is licensed under the GNU General Public License, version 3 or higher.
|
|
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
|
|
// https://alliedmods.net/amxmodx-license
|
|
|
|
//
|
|
// Module SDK
|
|
//
|
|
|
|
#include "precompiled.h"
|
|
|
|
// Module info
|
|
static amxx_module_info_s g_ModuleInfo =
|
|
{
|
|
Plugin_info.name,
|
|
Plugin_info.author,
|
|
Plugin_info.version,
|
|
FALSE,
|
|
Plugin_info.logtag,
|
|
"reapi",
|
|
"reapi"
|
|
};
|
|
|
|
// Storage for the requested functions
|
|
amxxapi_t g_amxxapi;
|
|
|
|
#define DECLARE_REQ(x) {#x, offsetof(amxxapi_t, x)}
|
|
|
|
static struct funcreq_t
|
|
{
|
|
const char * name;
|
|
size_t offset;
|
|
} g_funcrequests[] =
|
|
{
|
|
DECLARE_REQ(AddNatives),
|
|
//DECLARE_REQ(AddNewNatives),
|
|
//DECLARE_REQ(BuildPathname),
|
|
//DECLARE_REQ(BuildPathnameR),
|
|
DECLARE_REQ(GetAmxAddr),
|
|
//DECLARE_REQ(GetAmxVectorNull), // AMXX 1.8.3-dev
|
|
//DECLARE_REQ(PrintSrvConsole),
|
|
//DECLARE_REQ(GetModname),
|
|
DECLARE_REQ(GetAmxScriptName),
|
|
//DECLARE_REQ(GetAmxScript),
|
|
DECLARE_REQ(FindAmxScriptByAmx),
|
|
//DECLARE_REQ(FindAmxScriptByName),
|
|
DECLARE_REQ(SetAmxString),
|
|
//DECLARE_REQ(SetAmxStringUTF8Char), // AMXX 1.8.3-dev
|
|
//DECLARE_REQ(SetAmxStringUTF8Cell), // AMXX 1.8.3-dev
|
|
DECLARE_REQ(GetAmxString),
|
|
//DECLARE_REQ(GetAmxStringNull), // AMXX 1.8.3-dev
|
|
//DECLARE_REQ(GetAmxStringLen),
|
|
//DECLARE_REQ(FormatAmxString),
|
|
//DECLARE_REQ(CopyAmxMemory),
|
|
DECLARE_REQ(Log),
|
|
DECLARE_REQ(LogError),
|
|
//DECLARE_REQ(RaiseAmxError),
|
|
DECLARE_REQ(RegisterForward),
|
|
DECLARE_REQ(ExecuteForward),
|
|
//DECLARE_REQ(PrepareCellArray),
|
|
//DECLARE_REQ(PrepareCharArray),
|
|
DECLARE_REQ(PrepareCellArrayA),
|
|
//DECLARE_REQ(PrepareCharArrayA),
|
|
//DECLARE_REQ(IsPlayerValid),
|
|
//DECLARE_REQ(GetPlayerName),
|
|
//DECLARE_REQ(GetPlayerIP),
|
|
//DECLARE_REQ(IsPlayerInGame),
|
|
//DECLARE_REQ(IsPlayerBot),
|
|
//DECLARE_REQ(IsPlayerAuthorized),
|
|
//DECLARE_REQ(GetPlayerTime),
|
|
//DECLARE_REQ(GetPlayerPlayTime),
|
|
//DECLARE_REQ(GetPlayerCurweapon),
|
|
//DECLARE_REQ(GetPlayerTeam),
|
|
//DECLARE_REQ(GetPlayerTeamID),
|
|
//DECLARE_REQ(GetPlayerDeaths),
|
|
//DECLARE_REQ(GetPlayerMenu),
|
|
//DECLARE_REQ(GetPlayerKeys),
|
|
//DECLARE_REQ(IsPlayerAlive),
|
|
//DECLARE_REQ(GetPlayerFrags),
|
|
//DECLARE_REQ(IsPlayerConnecting),
|
|
//DECLARE_REQ(IsPlayerHLTV),
|
|
//DECLARE_REQ(GetPlayerArmor),
|
|
//DECLARE_REQ(GetPlayerHealth),
|
|
//DECLARE_REQ(amx_Exec),
|
|
//DECLARE_REQ(amx_Execv),
|
|
//DECLARE_REQ(amx_Allot),
|
|
DECLARE_REQ(amx_FindPublic),
|
|
//DECLARE_REQ(LoadAmxScript),
|
|
//DECLARE_REQ(UnloadAmxScript),
|
|
//DECLARE_REQ(RealToCell),
|
|
//DECLARE_REQ(CellToReal),
|
|
DECLARE_REQ(RegisterSPForward),
|
|
DECLARE_REQ(RegisterSPForwardByName),
|
|
DECLARE_REQ(UnregisterSPForward),
|
|
//DECLARE_REQ(MergeDefinitionFile),
|
|
//DECLARE_REQ(amx_FindNative),
|
|
//DECLARE_REQ(GetPlayerFlags),
|
|
//DECLARE_REQ(GetPlayerEdict),
|
|
//DECLARE_REQ(Format),
|
|
//DECLARE_REQ(RegisterFunction),
|
|
//DECLARE_REQ(RequestFunction),
|
|
//DECLARE_REQ(amx_Push),
|
|
DECLARE_REQ(SetPlayerTeamInfo),
|
|
//DECLARE_REQ(PlayerPropAddr),
|
|
//DECLARE_REQ(RegAuthFunc),
|
|
//DECLARE_REQ(UnregAuthFunc),
|
|
//DECLARE_REQ(FindLibrary),
|
|
//DECLARE_REQ(AddLibraries),
|
|
//DECLARE_REQ(RemoveLibraries),
|
|
//DECLARE_REQ(OverrideNatives),
|
|
//DECLARE_REQ(GetLocalInfo),
|
|
//DECLARE_REQ(AmxReregister),
|
|
//DECLARE_REQ(RegisterFunctionEx),
|
|
//DECLARE_REQ(MessageBlock),
|
|
};
|
|
|
|
C_DLLEXPORT int AMXX_Query(int *interfaceVersion, amxx_module_info_s *moduleInfo)
|
|
{
|
|
// check parameters
|
|
if (!interfaceVersion || !moduleInfo)
|
|
return AMXX_PARAM;
|
|
|
|
// check interface version
|
|
if (*interfaceVersion != AMXX_INTERFACE_VERSION)
|
|
{
|
|
// Tell amxx core our interface version
|
|
*interfaceVersion = AMXX_INTERFACE_VERSION;
|
|
return AMXX_IFVERS;
|
|
}
|
|
|
|
// copy module info
|
|
memcpy(moduleInfo, &g_ModuleInfo, sizeof(amxx_module_info_s));
|
|
return AMXX_OK;
|
|
}
|
|
|
|
C_DLLEXPORT int AMXX_CheckGame(const char *game)
|
|
{
|
|
return AMXX_GAME_OK;
|
|
}
|
|
|
|
C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
|
|
{
|
|
// Check pointer
|
|
if (!reqFnptrFunc)
|
|
return AMXX_PARAM;
|
|
|
|
for (size_t i = 0; i < ARRAYSIZE(g_funcrequests); i++)
|
|
{
|
|
void* fptr = reqFnptrFunc(g_funcrequests[i].name);
|
|
if (fptr == NULL)
|
|
{
|
|
return AMXX_FUNC_NOT_PRESENT;
|
|
}
|
|
*(void **)((unsigned long)&g_amxxapi + g_funcrequests[i].offset) = fptr;
|
|
}
|
|
|
|
OnAmxxAttach();
|
|
|
|
RegisterNatives_HookChains();
|
|
RegisterNatives_Members();
|
|
RegisterNatives_Misc();
|
|
RegisterNatives_VTC();
|
|
RegisterNatives_Rechecker();
|
|
RegisterNatives_Reunion();
|
|
RegisterNatives_Common();
|
|
|
|
return AMXX_OK;
|
|
}
|
|
|
|
C_DLLEXPORT int AMXX_Detach()
|
|
{
|
|
return AMXX_OK;
|
|
}
|
|
|
|
C_DLLEXPORT int AMXX_PluginsLoaded()
|
|
{
|
|
int iFwd = g_amxxapi.RegisterForward("__reapi_version_check", ET_IGNORE, FP_CELL, FP_CELL, FP_DONE);
|
|
g_amxxapi.ExecuteForward(iFwd, REAPI_VERSION_MAJOR, REAPI_VERSION_MINOR);
|
|
|
|
if (api_cfg.hasVTC()) {
|
|
|
|
g_iClientStartSpeak = g_amxxapi.RegisterForward("VTC_OnClientStartSpeak", ET_IGNORE, FP_CELL, FP_DONE);
|
|
g_iClientStopSpeak = g_amxxapi.RegisterForward("VTC_OnClientStopSpeak", ET_IGNORE, FP_CELL, FP_DONE);
|
|
}
|
|
|
|
return AMXX_OK;
|
|
}
|
|
|
|
C_DLLEXPORT void AMXX_PluginsUnloaded()
|
|
{
|
|
}
|
|
|
|
C_DLLEXPORT void AMXX_PluginsUnloading()
|
|
{
|
|
}
|
|
|
|
NOINLINE void AMXX_Log(const char *fmt, ...)
|
|
{
|
|
char msg[2048];
|
|
va_list arglst;
|
|
va_start(arglst, fmt);
|
|
vsnprintf(msg, sizeof msg, fmt, arglst);
|
|
va_end(arglst);
|
|
|
|
g_amxxapi.Log("[%s] %s", g_ModuleInfo.logtag, msg);
|
|
}
|
|
|
|
NOINLINE void AMXX_LogError(AMX *amx, int err, const char *fmt, ...)
|
|
{
|
|
char msg[2048];
|
|
va_list arglst;
|
|
va_start(arglst, fmt);
|
|
vsnprintf(msg, sizeof msg, fmt, arglst);
|
|
va_end(arglst);
|
|
|
|
g_amxxapi.LogError(amx, err, "[%s] %s", g_ModuleInfo.logtag, msg);
|
|
}
|
|
|
|
char* getAmxString(cell* src, char* dest, size_t max, size_t* len)
|
|
{
|
|
char* start = dest;
|
|
|
|
while (*src && --max)
|
|
*dest++ = (char)*src++;
|
|
*dest = '\0';
|
|
|
|
if (len)
|
|
*len = dest - start;
|
|
|
|
return start;
|
|
}
|
|
|
|
void setAmxString(cell* dest, const char* string, size_t max)
|
|
{
|
|
while (*string && max--)
|
|
*dest++ = (cell)*string++;
|
|
|
|
*dest = 0;
|
|
}
|