115916d753
* Add ReHLDS API files and its dependencies Note: This has been stolen from ReAPI AMXX module and modified/adjusted to match AMXX existing includes and to provide as less dependencies as possible as well * Add the necessary files to get ReHLDS interface * Split SV_DropClient into pre/post code * Init ReHLDS API and add SV_DropClient hook * Add Cvar_DirectSet hook and adjust code with helpers Note: we don't need to split code here. This is pretty much the naive and straight way, but fairly enough for our case. If it happens we got a lot more hooks, we may consider to use some class to manage better the things. * Move platform and interface stuff in their own files in public directory * Make sure to init cvar stuff after ReHLDS * Add ReGameDLL API files and its dependencies in cstrike module * Init ReHLDS in cstrike module and adjust code Note: About cs_uset_set_model(). ReHLDS API doesn't offer a way to know directly the precached models, so instead of looping through all the ressources, the models list is saved one time at map change into a hashmap. * Init ReGameDLL and adjust code * Fix linux compilation * Init ReGameDLL in fakemeta module and adjust code * Rename /reapi directory to /resdk to avoid confusion * Retrieve gamerules pointer through InstallGameRules in fakemeta module * Retrieve gamerules pointer through InstallGameRules in cstrike module Note: actually gamerules is not used if regamedll is enabled, but it could be used in future natives. * Fix a typo when ReGameDLL is not enabled * Fix missing interface check for ReHLDS. I'm pretty sure I was checking at the very first since I worked first on vanilla version of engine, looks like change has been lost.
300 lines
7.2 KiB
C++
300 lines
7.2 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.
|
|
//
|
|
// 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
|
|
|
|
//
|
|
// Fakemeta Module
|
|
//
|
|
|
|
#include "fakemeta_amxx.h"
|
|
#include "sh_stack.h"
|
|
#include <resdk/mod_regamedll_api.h>
|
|
|
|
IGameConfig *CommonConfig;
|
|
IGameConfig *GamerulesConfig;
|
|
IGameConfigManager *ConfigManager;
|
|
|
|
bool HasRegameDll;
|
|
HLTypeConversion TypeConversion;
|
|
|
|
void *GameRulesRH;
|
|
void **GameRulesAddress;
|
|
|
|
CGameRules* InstallGameRules(IReGameHook_InstallGameRules *chain)
|
|
{
|
|
GameRulesRH = chain->callNext();
|
|
return static_cast<CGameRules*>(GameRulesRH);
|
|
}
|
|
|
|
void OnAmxxAttach()
|
|
{
|
|
initialze_offsets();
|
|
initialize_glb_offsets();
|
|
|
|
MF_AddNatives(engfunc_natives);
|
|
MF_AddNatives(dllfunc_natives);
|
|
MF_AddNatives(pev_natives);
|
|
MF_AddNatives(forward_natives);
|
|
MF_AddNatives(pdata_natives);
|
|
MF_AddNatives(tr_Natives);
|
|
MF_AddNatives(glb_natives);
|
|
MF_AddNatives(ext2_natives);
|
|
MF_AddNatives(misc_natives);
|
|
MF_AddNatives(pdata_entities_natives);
|
|
MF_AddNatives(pdata_gamerules_natives);
|
|
|
|
g_kvd_glb.kvd.szClassName = const_cast<char *>(g_kvd_glb.cls.chars());
|
|
g_kvd_glb.kvd.szKeyName = const_cast<char *>(g_kvd_glb.key.chars());
|
|
g_kvd_glb.kvd.szValue = const_cast<char *>(g_kvd_glb.val.chars());
|
|
g_kvd_glb.kvd.fHandled = 0;
|
|
|
|
ConfigManager = MF_GetConfigManager();
|
|
|
|
char error[256] = "";
|
|
|
|
if (!ConfigManager->LoadGameConfigFile("common.games", &CommonConfig, error, sizeof(error)) && error[0] != '\0')
|
|
{
|
|
MF_Log("get/set_ent_data* natives have been disabled because common.games gamedata could not be read: %s", error);
|
|
return;
|
|
}
|
|
|
|
*error = '\0';
|
|
|
|
if (!ConfigManager->LoadGameConfigFile("common.games/gamerules.games", &GamerulesConfig, error, sizeof(error)) && error[0] != '\0')
|
|
{
|
|
MF_Log("get/set_gamerules_* natives have been disabled because common.games/gamerules.games gamedata could not be read: %s", error);
|
|
return;
|
|
}
|
|
|
|
if ((HasRegameDll = RegamedllApi_Init()))
|
|
{
|
|
ReGameHookchains->InstallGameRules()->registerHook(InstallGameRules);
|
|
}
|
|
else
|
|
{
|
|
void *address = nullptr;
|
|
|
|
if (!CommonConfig->GetAddress("g_pGameRules", &address) || !address)
|
|
{
|
|
MF_Log("get/set_gamerules_* natives have been disabled because g_pGameRules address could not be found. ");
|
|
return;
|
|
}
|
|
|
|
#if defined(KE_WINDOWS)
|
|
GameRulesAddress = *reinterpret_cast<void***>(address);
|
|
#else
|
|
GameRulesAddress = reinterpret_cast<void**>(address);
|
|
#endif
|
|
}
|
|
}
|
|
|
|
void OnPluginsLoaded()
|
|
{
|
|
TypeConversion.init();
|
|
}
|
|
|
|
extern CStack<TraceResult *> g_FreeTRs;
|
|
extern ke::Vector<KVD_Wrapper *> g_KVDWs;
|
|
extern ke::Vector<KVD_Wrapper *> g_FreeKVDWs;
|
|
|
|
void OnAmxxDetach()
|
|
{
|
|
ConfigManager->CloseGameConfigFile(CommonConfig);
|
|
ConfigManager->CloseGameConfigFile(GamerulesConfig);
|
|
|
|
while (!g_FreeTRs.empty())
|
|
{
|
|
delete g_FreeTRs.front();
|
|
g_FreeTRs.pop();
|
|
}
|
|
|
|
while (!g_KVDWs.empty())
|
|
delete g_KVDWs.popCopy();
|
|
|
|
while (!g_FreeKVDWs.empty())
|
|
delete g_FreeKVDWs.popCopy();
|
|
}
|
|
|
|
void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax)
|
|
{
|
|
g_pFunctionTable_Post->pfnServerDeactivate = FMH_ServerDeactivate_Post;
|
|
RETURN_META(MRES_IGNORED);
|
|
}
|
|
|
|
#define RESETD(tcall) \
|
|
g_pFunctionTable->pfn##tcall =0; \
|
|
g_pFunctionTable_Post->pfn##tcall =NULL; \
|
|
Engine[FM_##tcall].clear(); \
|
|
EnginePost[FM_##tcall].clear(); \
|
|
EngineAddrs[FM_##tcall] = NULL; \
|
|
EngineAddrsPost[FM_##tcall] = NULL;
|
|
|
|
#define RESETE(call) \
|
|
g_pengfuncsTable->pfn##call = NULL; \
|
|
g_pengfuncsTable_Post->pfn##call = NULL; \
|
|
Engine[FM_##call].clear(); \
|
|
EnginePost[FM_##call].clear(); \
|
|
EngineAddrs[FM_##call] = NULL; \
|
|
EngineAddrsPost[FM_##call] = NULL;
|
|
|
|
#define RESETN(call) \
|
|
g_pNewFunctionsTable->pfn##call = NULL; \
|
|
g_pNewFunctionsTable_Post->pfn##call = NULL; \
|
|
Engine[FM_##call].clear(); \
|
|
EnginePost[FM_##call].clear(); \
|
|
EngineAddrs[FM_##call] = NULL; \
|
|
EngineAddrsPost[FM_##call] = NULL;
|
|
|
|
void FMH_ServerDeactivate_Post()
|
|
{
|
|
if (HasRegameDll)
|
|
{
|
|
GameRulesRH = nullptr;
|
|
}
|
|
|
|
// Reset all call lists here.
|
|
// NULL all function tables
|
|
RESETE(PrecacheModel);
|
|
RESETE(PrecacheSound);
|
|
RESETE(SetModel);
|
|
RESETE(ModelIndex);
|
|
RESETE(ModelFrames);
|
|
RESETE(SetSize);
|
|
RESETE(ChangeLevel);
|
|
RESETE(VecToYaw);
|
|
RESETE(VecToAngles);
|
|
RESETE(MoveToOrigin);
|
|
RESETE(ChangeYaw);
|
|
RESETE(ChangePitch);
|
|
RESETE(FindEntityByString);
|
|
RESETE(GetEntityIllum);
|
|
RESETE(FindEntityInSphere);
|
|
RESETE(FindClientInPVS);
|
|
RESETE(EntitiesInPVS);
|
|
RESETE(MakeVectors);
|
|
RESETE(AngleVectors);
|
|
RESETE(CreateEntity);
|
|
RESETE(RemoveEntity);
|
|
RESETE(CreateNamedEntity);
|
|
RESETE(MakeStatic);
|
|
RESETE(EntIsOnFloor);
|
|
RESETE(DropToFloor);
|
|
RESETE(WalkMove);
|
|
RESETE(SetOrigin);
|
|
RESETE(EmitSound);
|
|
RESETE(EmitAmbientSound);
|
|
RESETE(TraceLine);
|
|
RESETE(TraceToss);
|
|
RESETE(TraceMonsterHull);
|
|
RESETE(TraceHull);
|
|
RESETE(TraceModel);
|
|
RESETE(TraceTexture);
|
|
RESETE(TraceSphere);
|
|
RESETE(GetAimVector);
|
|
RESETE(ParticleEffect);
|
|
RESETE(LightStyle);
|
|
RESETE(DecalIndex);
|
|
RESETE(PointContents);
|
|
RESETE(FreeEntPrivateData);
|
|
RESETE(SzFromIndex);
|
|
RESETE(AllocString);
|
|
RESETE(RegUserMsg);
|
|
RESETE(AnimationAutomove);
|
|
RESETE(GetBonePosition);
|
|
RESETE(GetAttachment);
|
|
RESETE(SetView);
|
|
RESETE(Time);
|
|
RESETE(CrosshairAngle);
|
|
RESETE(FadeClientVolume);
|
|
RESETE(SetClientMaxspeed);
|
|
RESETE(CreateFakeClient);
|
|
RESETE(RunPlayerMove);
|
|
RESETE(NumberOfEntities);
|
|
RESETE(StaticDecal);
|
|
RESETE(PrecacheGeneric);
|
|
RESETE(BuildSoundMsg);
|
|
RESETE(GetPhysicsKeyValue);
|
|
RESETE(SetPhysicsKeyValue);
|
|
RESETE(GetPhysicsInfoString);
|
|
RESETE(PrecacheEvent);
|
|
RESETE(PlaybackEvent);
|
|
RESETE(CheckVisibility);
|
|
RESETE(GetCurrentPlayer);
|
|
RESETE(CanSkipPlayer);
|
|
RESETE(SetGroupMask);
|
|
RESETE(Voice_GetClientListening);
|
|
RESETE(Voice_SetClientListening);
|
|
RESETE(InfoKeyValue);
|
|
RESETE(SetKeyValue);
|
|
RESETE(SetClientKeyValue);
|
|
RESETE(MessageBegin);
|
|
RESETE(MessageEnd);
|
|
RESETE(WriteByte);
|
|
RESETE(WriteChar);
|
|
RESETE(WriteShort);
|
|
RESETE(WriteLong);
|
|
RESETE(WriteAngle);
|
|
RESETE(WriteCoord);
|
|
RESETE(WriteString);
|
|
RESETE(WriteEntity);
|
|
RESETE(CVarGetFloat);
|
|
RESETE(CVarGetString);
|
|
RESETE(CVarSetFloat);
|
|
RESETE(CVarSetString);
|
|
RESETE(AlertMessage);
|
|
RESETE(CreateInstancedBaseline);
|
|
RESETE(GetInfoKeyBuffer);
|
|
RESETE(ClientPrintf);
|
|
RESETE(GetPlayerAuthId);
|
|
RESETE(GetPlayerWONId);
|
|
RESETE(IsMapValid);
|
|
RESETE(ServerPrint);
|
|
|
|
RESETD(Spawn);
|
|
RESETD(Think);
|
|
RESETD(Use);
|
|
RESETD(Touch);
|
|
RESETD(Blocked);
|
|
RESETD(KeyValue);
|
|
RESETD(SetAbsBox);
|
|
RESETD(ClientConnect);
|
|
RESETD(ClientDisconnect);
|
|
RESETD(ClientKill);
|
|
RESETD(ClientPutInServer);
|
|
RESETD(ClientCommand);
|
|
RESETD(ServerDeactivate);
|
|
RESETD(PlayerPreThink);
|
|
RESETD(PlayerPostThink);
|
|
RESETD(StartFrame);
|
|
RESETD(ParmsNewLevel);
|
|
RESETD(ParmsChangeLevel);
|
|
RESETD(GetGameDescription);
|
|
RESETD(SpectatorConnect);
|
|
RESETD(SpectatorDisconnect);
|
|
RESETD(SpectatorThink);
|
|
RESETD(Sys_Error);
|
|
RESETD(PM_FindTextureType);
|
|
RESETD(RegisterEncoders);
|
|
RESETD(CreateInstancedBaselines);
|
|
RESETD(AllowLagCompensation);
|
|
RESETD(ClientUserInfoChanged);
|
|
RESETD(UpdateClientData);
|
|
RESETD(AddToFullPack);
|
|
RESETD(CmdStart);
|
|
RESETD(CmdEnd);
|
|
RESETD(CreateBaseline);
|
|
|
|
RESETN(OnFreeEntPrivateData);
|
|
RESETN(GameShutdown);
|
|
RESETN(ShouldCollide);
|
|
|
|
g_pFunctionTable->pfnServerActivate = ServerActivate;
|
|
|
|
RETURN_META(MRES_IGNORED);
|
|
}
|