?
This commit is contained in:
parent
b90e729a9f
commit
7b8dbf6488
|
@ -36,31 +36,6 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
|
||||||
meta_globals_t *gpMetaGlobals;
|
|
||||||
gamedll_funcs_t *gpGamedllFuncs;
|
|
||||||
mutil_funcs_t *gpMetaUtilFuncs;
|
|
||||||
enginefuncs_t g_engfuncs;
|
|
||||||
globalvars_t *gpGlobals;
|
|
||||||
pfnamx_engine_g* g_engAmxFunc;
|
|
||||||
pfnms_engine_g* g_engModuleFunc;
|
|
||||||
static META_FUNCTIONS gMetaFunctionTable;
|
|
||||||
DLL_FUNCTIONS gFunctionTable;
|
|
||||||
enginefuncs_t meta_engfuncs;
|
|
||||||
|
|
||||||
struct AmxCall {
|
|
||||||
plugin_t *pPlugin;
|
|
||||||
int iFunctionIdx;
|
|
||||||
};
|
|
||||||
|
|
||||||
std::vector<AmxCall> vTouchCallList;
|
|
||||||
std::vector<AmxCall> vServerFrameCallList;
|
|
||||||
std::vector<AmxCall> vCliKillList;
|
|
||||||
std::vector<AmxCall> vPreThinkList;
|
|
||||||
std::vector<AmxCall> vPostThinkList;
|
|
||||||
|
|
||||||
//This was originally by VexD
|
|
||||||
//Thank you for an excellent piece of work, VexD!
|
|
||||||
|
|
||||||
#define NAME "Engine Module"
|
#define NAME "Engine Module"
|
||||||
#define AUTHOR "BAILOPAN"
|
#define AUTHOR "BAILOPAN"
|
||||||
#define VERSION "0.3"
|
#define VERSION "0.3"
|
||||||
|
@ -68,6 +43,41 @@ std::vector<AmxCall> vPostThinkList;
|
||||||
#define LOGTAG "AMXXE"
|
#define LOGTAG "AMXXE"
|
||||||
#define DATE __DATE__
|
#define DATE __DATE__
|
||||||
|
|
||||||
|
meta_globals_t *gpMetaGlobals;
|
||||||
|
gamedll_funcs_t *gpGamedllFuncs;
|
||||||
|
mutil_funcs_t *gpMetaUtilFuncs;
|
||||||
|
enginefuncs_t g_engfuncs;
|
||||||
|
globalvars_t *gpGlobals;
|
||||||
|
pfnamx_engine_g* g_engAmxFunc;
|
||||||
|
static META_FUNCTIONS gMetaFunctionTable;
|
||||||
|
DLL_FUNCTIONS gFunctionTable;
|
||||||
|
enginefuncs_t meta_engfuncs;
|
||||||
|
pfnmodule_engine_g* g_engModuleFunc;
|
||||||
|
|
||||||
|
|
||||||
|
module_info_s module_info = {
|
||||||
|
"AMXXE", // name
|
||||||
|
"BAILOPAN", // author
|
||||||
|
VERSION, // version
|
||||||
|
AMX_INTERFACE_VERSION,
|
||||||
|
STATIC_MODULE,
|
||||||
|
};
|
||||||
|
|
||||||
|
plugin_info_t Plugin_info = {
|
||||||
|
META_INTERFACE_VERSION, // ifvers
|
||||||
|
"AMXXE", // name
|
||||||
|
VERSION, // version
|
||||||
|
__DATE__, // date
|
||||||
|
"BAILOPAN", // author
|
||||||
|
"http://www.amxmod.info", // url
|
||||||
|
"AMXXE", // logtag
|
||||||
|
PT_ANYTIME,// (when) loadable
|
||||||
|
PT_ANYTIME,// (when) unloadable
|
||||||
|
};
|
||||||
|
|
||||||
|
//This was originally by VexD
|
||||||
|
//Thank you for an excellent piece of work, VexD!
|
||||||
|
|
||||||
#define AMS_OFFSET 0.01
|
#define AMS_OFFSET 0.01
|
||||||
|
|
||||||
#define SPEAK_NORMAL 0
|
#define SPEAK_NORMAL 0
|
||||||
|
@ -260,26 +270,6 @@ GlobalInfo GlInfo;
|
||||||
|
|
||||||
cvar_t amxxe_version = {"amxxe_version", VERSION, FCVAR_SERVER, 0};
|
cvar_t amxxe_version = {"amxxe_version", VERSION, FCVAR_SERVER, 0};
|
||||||
|
|
||||||
plugin_info_t Plugin_info = {
|
|
||||||
META_INTERFACE_VERSION,
|
|
||||||
NAME,
|
|
||||||
VERSION,
|
|
||||||
DATE,
|
|
||||||
AUTHOR,
|
|
||||||
URL,
|
|
||||||
LOGTAG,
|
|
||||||
PT_STARTUP,
|
|
||||||
PT_NEVER,
|
|
||||||
};
|
|
||||||
|
|
||||||
module_info_s AMXInfo = {
|
|
||||||
NAME,
|
|
||||||
AUTHOR,
|
|
||||||
VERSION,
|
|
||||||
AMX_INTERFACE_VERSION,
|
|
||||||
RELOAD_MODULE,
|
|
||||||
};
|
|
||||||
|
|
||||||
/********************* Begin Utility Functions ******************************/
|
/********************* Begin Utility Functions ******************************/
|
||||||
|
|
||||||
//(BAILOPAN)
|
//(BAILOPAN)
|
||||||
|
@ -2488,18 +2478,12 @@ void ClientUserInfoChanged(edict_t *pEntity, char *infobuffer) {
|
||||||
}
|
}
|
||||||
|
|
||||||
//(BAILOPAN) - forward this
|
//(BAILOPAN) - forward this
|
||||||
/*
|
|
||||||
void PlayerPreThink(edict_t *pEntity) {
|
void PlayerPreThink(edict_t *pEntity) {
|
||||||
if (!vPreThinkList.empty()) {
|
|
||||||
for(std::vector<AmxCall>::iterator i = vPreThinkList.begin(); i != vPreThinkList.end(); i++) {
|
|
||||||
cell iRetVal = 0;
|
|
||||||
AMX_EXEC(&i->pPlugin->amx, &iRetVal, i->iFunctionIdx, 1, ENTINDEX(pEntity));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
RETURN_META(MRES_IGNORED);
|
RETURN_META(MRES_IGNORED);
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
// This code is to set the model at a specified time. the second part of the code updates the
|
// This code is to set the model at a specified time. the second part of the code updates the
|
||||||
// SetView camera.
|
// SetView camera.
|
||||||
//(BAILOPAN) - now a forward
|
//(BAILOPAN) - now a forward
|
||||||
|
@ -2545,13 +2529,6 @@ void PlayerPostThink(edict_t *pEntity) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!vPostThinkList.empty()) {
|
|
||||||
for(std::vector<AmxCall>::iterator i = vPostThinkList.begin(); i != vPostThinkList.end(); i++) {
|
|
||||||
cell iRetVal = 0;
|
|
||||||
AMX_EXEC(&i->pPlugin->amx, &iRetVal, i->iFunctionIdx, 1, ENTINDEX(pEntity));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
RETURN_META(MRES_IGNORED);
|
RETURN_META(MRES_IGNORED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2566,44 +2543,23 @@ void StartFrame() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!vServerFrameCallList.empty()) {
|
|
||||||
for(std::vector<AmxCall>::iterator i = vServerFrameCallList.begin(); i != vServerFrameCallList.end(); i++) {
|
|
||||||
cell iRetVal = 0;
|
|
||||||
AMX_EXEC(&i->pPlugin->amx, &iRetVal, i->iFunctionIdx, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
RETURN_META(MRES_IGNORED);
|
RETURN_META(MRES_IGNORED);
|
||||||
}
|
}
|
||||||
|
|
||||||
// pfnTouch, this is a forward that is called whenever 2 entities collide.
|
// pfnTouch, this is a forward that is called whenever 2 entities collide.
|
||||||
void Touch(edict_t *pToucher, edict_t *pTouched) {
|
void Touch(edict_t *pToucher, edict_t *pTouched) {
|
||||||
for(std::vector<AmxCall>::iterator i = vTouchCallList.begin(); i != vTouchCallList.end(); i++) {
|
|
||||||
cell iRetVal = 0;
|
|
||||||
AMX_EXEC(&i->pPlugin->amx, &iRetVal, i->iFunctionIdx, 2, ENTINDEX(pToucher), ENTINDEX(pTouched));
|
|
||||||
}
|
|
||||||
|
|
||||||
RETURN_META(MRES_IGNORED);
|
RETURN_META(MRES_IGNORED);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Added by BAILOPAN. ClientKill() forward.
|
//Added by BAILOPAN. ClientKill() forward.
|
||||||
/*void ClientKill(edict_t *pEntity)
|
void ClientKill(edict_t *pEntity)
|
||||||
{
|
{
|
||||||
cell iRetVal = 0;
|
cell iRetVal = 0;
|
||||||
META_RES result = MRES_IGNORED;
|
META_RES result = MRES_IGNORED;
|
||||||
|
|
||||||
for(std::vector<AmxCall>::iterator i = vCliKillList.begin(); i != vCliKillList.end(); i++) {
|
|
||||||
AMX_EXEC(&i->pPlugin->amx, &iRetVal, i->iFunctionIdx, 1, ENTINDEX(pEntity));
|
|
||||||
if (iRetVal & 2) {
|
|
||||||
RETURN_META(MRES_SUPERCEDE);
|
|
||||||
}
|
|
||||||
if (iRetVal & 1) {
|
|
||||||
result = MRES_SUPERCEDE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
RETURN_META(result);
|
RETURN_META(result);
|
||||||
}*/
|
}
|
||||||
|
|
||||||
// ClientDisconnect. Reinitialize the PlayerInfo struct for that player.
|
// ClientDisconnect. Reinitialize the PlayerInfo struct for that player.
|
||||||
void ClientDisconnect(edict_t *pEntity) {
|
void ClientDisconnect(edict_t *pEntity) {
|
||||||
|
@ -2659,12 +2615,14 @@ int AddToFullPack(struct entity_state_s *state, int e, edict_t *ent, edict_t *ho
|
||||||
|
|
||||||
// ServerActivate. This is called when the server starts a new map.
|
// ServerActivate. This is called when the server starts a new map.
|
||||||
void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax) {
|
void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax) {
|
||||||
|
/*
|
||||||
plugin_t *pCurrent = FIND_PLUGIN_BY_INDEX(0, 0);
|
plugin_t *pCurrent = FIND_PLUGIN_BY_INDEX(0, 0);
|
||||||
int iFunctionIndex = 0;
|
int iFunctionIndex = 0;
|
||||||
|
|
||||||
// Search for plugins that have the forward functions.
|
// Search for plugins that have the forward functions.
|
||||||
while(pCurrent){ //Iterate Plugin List
|
while(pCurrent){ //Iterate Plugin List
|
||||||
//THIS IS FOR BACKWARD COMPATIBILITY
|
//THIS IS FOR BACKWARD COMPATIBILITY
|
||||||
|
|
||||||
if(AMX_FINDPUBLIC(&pCurrent->amx, "vexd_pfntouch", &iFunctionIndex) == AMX_ERR_NONE) {
|
if(AMX_FINDPUBLIC(&pCurrent->amx, "vexd_pfntouch", &iFunctionIndex) == AMX_ERR_NONE) {
|
||||||
AmxCall sNewCall;
|
AmxCall sNewCall;
|
||||||
sNewCall.pPlugin = pCurrent;
|
sNewCall.pPlugin = pCurrent;
|
||||||
|
@ -2673,8 +2631,8 @@ void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax) {
|
||||||
}
|
}
|
||||||
|
|
||||||
iFunctionIndex = 0;
|
iFunctionIndex = 0;
|
||||||
|
|
||||||
/*if(AMX_FINDPUBLIC(&pCurrent->amx, "pfntouch", &iFunctionIndex) == AMX_ERR_NONE) {
|
if(AMX_FINDPUBLIC(&pCurrent->amx, "pfntouch", &iFunctionIndex) == AMX_ERR_NONE) {
|
||||||
AmxCall sNewCall;
|
AmxCall sNewCall;
|
||||||
sNewCall.pPlugin = pCurrent;
|
sNewCall.pPlugin = pCurrent;
|
||||||
sNewCall.iFunctionIdx = iFunctionIndex;
|
sNewCall.iFunctionIdx = iFunctionIndex;
|
||||||
|
@ -2682,7 +2640,7 @@ void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax) {
|
||||||
}
|
}
|
||||||
|
|
||||||
iFunctionIndex = 0;
|
iFunctionIndex = 0;
|
||||||
*/
|
|
||||||
if(AMX_FINDPUBLIC(&pCurrent->amx, "ServerFrame", &iFunctionIndex) == AMX_ERR_NONE) {
|
if(AMX_FINDPUBLIC(&pCurrent->amx, "ServerFrame", &iFunctionIndex) == AMX_ERR_NONE) {
|
||||||
AmxCall sNewCall;
|
AmxCall sNewCall;
|
||||||
sNewCall.pPlugin = pCurrent;
|
sNewCall.pPlugin = pCurrent;
|
||||||
|
@ -2690,7 +2648,7 @@ void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax) {
|
||||||
vServerFrameCallList.push_back(sNewCall);
|
vServerFrameCallList.push_back(sNewCall);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*iFunctionIndex = 0;
|
iFunctionIndex = 0;
|
||||||
|
|
||||||
if (AMX_FINDPUBLIC(&pCurrent->amx, "client_kill", &iFunctionIndex) == AMX_ERR_NONE) {
|
if (AMX_FINDPUBLIC(&pCurrent->amx, "client_kill", &iFunctionIndex) == AMX_ERR_NONE) {
|
||||||
AmxCall sNewCall;
|
AmxCall sNewCall;
|
||||||
|
@ -2716,11 +2674,12 @@ void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax) {
|
||||||
sNewCall.iFunctionIdx = iFunctionIndex;
|
sNewCall.iFunctionIdx = iFunctionIndex;
|
||||||
vPostThinkList.push_back(sNewCall);
|
vPostThinkList.push_back(sNewCall);
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
iFunctionIndex = 0;
|
iFunctionIndex = 0;
|
||||||
pCurrent = pCurrent->next;
|
pCurrent = pCurrent->next;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
RETURN_META(MRES_IGNORED);
|
RETURN_META(MRES_IGNORED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2730,9 +2689,6 @@ void ServerDeactivate(void) {
|
||||||
|
|
||||||
// Clear the call list for forwards. this is important as the address of plugins can change
|
// Clear the call list for forwards. this is important as the address of plugins can change
|
||||||
// from map-to-map.
|
// from map-to-map.
|
||||||
vTouchCallList.clear();
|
|
||||||
vServerFrameCallList.clear();
|
|
||||||
vCliKillList.clear();
|
|
||||||
|
|
||||||
// Reset Lights.
|
// Reset Lights.
|
||||||
memset(GlInfo.szLastLights, 0x0, 128);
|
memset(GlInfo.szLastLights, 0x0, 128);
|
||||||
|
@ -2933,12 +2889,6 @@ AMX_NATIVE_INFO Engine_Exports[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
C_DLLEXPORT int GetEngineFunctions(enginefuncs_t *pengfuncsFromEngine, int *interfaceVersion) {
|
C_DLLEXPORT int GetEngineFunctions(enginefuncs_t *pengfuncsFromEngine, int *interfaceVersion) {
|
||||||
if(!pengfuncsFromEngine) return(FALSE);
|
|
||||||
else if(*interfaceVersion != ENGINE_INTERFACE_VERSION) {
|
|
||||||
*interfaceVersion = ENGINE_INTERFACE_VERSION;
|
|
||||||
return(FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
meta_engfuncs.pfnMessageBegin = MessageBegin;
|
meta_engfuncs.pfnMessageBegin = MessageBegin;
|
||||||
meta_engfuncs.pfnMessageEnd = MessageEnd;
|
meta_engfuncs.pfnMessageEnd = MessageEnd;
|
||||||
meta_engfuncs.pfnWriteByte = WriteByte;
|
meta_engfuncs.pfnWriteByte = WriteByte;
|
||||||
|
@ -2950,7 +2900,13 @@ C_DLLEXPORT int GetEngineFunctions(enginefuncs_t *pengfuncsFromEngine, int *inte
|
||||||
meta_engfuncs.pfnWriteString = WriteString;
|
meta_engfuncs.pfnWriteString = WriteString;
|
||||||
meta_engfuncs.pfnWriteEntity = WriteEntity;
|
meta_engfuncs.pfnWriteEntity = WriteEntity;
|
||||||
meta_engfuncs.pfnLightStyle = LightStyle;
|
meta_engfuncs.pfnLightStyle = LightStyle;
|
||||||
meta_engfuncs.pfnVoice_SetClientListening = Voice_SetClientListening;
|
// meta_engfuncs.pfnVoice_SetClientListening = Voice_SetClientListening;
|
||||||
|
|
||||||
|
if(*interfaceVersion!=ENGINE_INTERFACE_VERSION) {
|
||||||
|
LOG_ERROR(PLID, "GetEngineFunctions version mismatch; requested=%d ours=%d", *interfaceVersion, ENGINE_INTERFACE_VERSION);
|
||||||
|
*interfaceVersion = ENGINE_INTERFACE_VERSION;
|
||||||
|
return(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
memcpy(pengfuncsFromEngine, &meta_engfuncs, sizeof(enginefuncs_t));
|
memcpy(pengfuncsFromEngine, &meta_engfuncs, sizeof(enginefuncs_t));
|
||||||
|
|
||||||
|
@ -2959,7 +2915,7 @@ C_DLLEXPORT int GetEngineFunctions(enginefuncs_t *pengfuncsFromEngine, int *inte
|
||||||
|
|
||||||
C_DLLEXPORT int GetEntityAPI2( DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion ) {
|
C_DLLEXPORT int GetEntityAPI2( DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion ) {
|
||||||
gFunctionTable.pfnGameInit = GameInit;
|
gFunctionTable.pfnGameInit = GameInit;
|
||||||
gFunctionTable.pfnTouch = Touch;
|
/*gFunctionTable.pfnTouch = Touch;
|
||||||
gFunctionTable.pfnStartFrame = StartFrame;
|
gFunctionTable.pfnStartFrame = StartFrame;
|
||||||
gFunctionTable.pfnClientConnect = ClientConnect;
|
gFunctionTable.pfnClientConnect = ClientConnect;
|
||||||
gFunctionTable.pfnClientDisconnect = ClientDisconnect;
|
gFunctionTable.pfnClientDisconnect = ClientDisconnect;
|
||||||
|
@ -2968,8 +2924,14 @@ C_DLLEXPORT int GetEntityAPI2( DLL_FUNCTIONS *pFunctionTable, int *interfaceVers
|
||||||
gFunctionTable.pfnAddToFullPack = AddToFullPack;
|
gFunctionTable.pfnAddToFullPack = AddToFullPack;
|
||||||
gFunctionTable.pfnServerActivate = ServerActivate;
|
gFunctionTable.pfnServerActivate = ServerActivate;
|
||||||
gFunctionTable.pfnServerDeactivate = ServerDeactivate;
|
gFunctionTable.pfnServerDeactivate = ServerDeactivate;
|
||||||
//gFunctionTable.pfnClientKill = ClientKill;
|
gFunctionTable.pfnClientKill = ClientKill;
|
||||||
//gFunctionTable.pfnPlayerPreThink = PlayerPreThink;
|
gFunctionTable.pfnPlayerPreThink = PlayerPreThink;*/
|
||||||
|
|
||||||
|
if(*interfaceVersion!=INTERFACE_VERSION) {
|
||||||
|
LOG_ERROR(PLID, "GetEntityAPI2 version mismatch; requested=%d ours=%d", *interfaceVersion, INTERFACE_VERSION);
|
||||||
|
*interfaceVersion = INTERFACE_VERSION;
|
||||||
|
return(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
memcpy( pFunctionTable, &gFunctionTable, sizeof( DLL_FUNCTIONS ) );
|
memcpy( pFunctionTable, &gFunctionTable, sizeof( DLL_FUNCTIONS ) );
|
||||||
|
|
||||||
|
@ -2977,29 +2939,41 @@ C_DLLEXPORT int GetEntityAPI2( DLL_FUNCTIONS *pFunctionTable, int *interfaceVers
|
||||||
}
|
}
|
||||||
|
|
||||||
C_DLLEXPORT int Meta_Query(char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) {
|
C_DLLEXPORT int Meta_Query(char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) {
|
||||||
*pPlugInfo=&Plugin_info;
|
|
||||||
gpMetaUtilFuncs=pMetaUtilFuncs;
|
gpMetaUtilFuncs=pMetaUtilFuncs;
|
||||||
|
*pPlugInfo=&Plugin_info;
|
||||||
|
if(strcmp(ifvers, Plugin_info.ifvers)) {
|
||||||
|
int mmajor=0, mminor=0, pmajor=0, pminor=0;
|
||||||
|
LOG_MESSAGE(PLID, "WARNING: meta-interface version mismatch; requested=%s ours=%s", Plugin_info.logtag, ifvers);
|
||||||
|
sscanf(ifvers, "%d:%d", &mmajor, &mminor);
|
||||||
|
sscanf(META_INTERFACE_VERSION, "%d:%d", &pmajor, &pminor);
|
||||||
|
if(pmajor > mmajor || (pmajor==mmajor && pminor > mminor)) {
|
||||||
|
LOG_ERROR(PLID, "metamod version is too old for this plugin; update metamod");
|
||||||
|
return(FALSE);
|
||||||
|
}
|
||||||
|
else if(pmajor < mmajor) {
|
||||||
|
LOG_ERROR(PLID, "metamod version is incompatible with this plugin; please find a newer version of this plugin");
|
||||||
|
return(FALSE);
|
||||||
|
}
|
||||||
|
else if(pmajor==mmajor && pminor < mminor)
|
||||||
|
LOG_MESSAGE(PLID, "WARNING: metamod version is newer than expected; consider finding a newer version of this plugin");
|
||||||
|
else
|
||||||
|
LOG_ERROR(PLID, "unexpected version comparison; metavers=%s, mmajor=%d, mminor=%d; plugvers=%s, pmajor=%d, pminor=%d", ifvers, mmajor, mminor, META_INTERFACE_VERSION, pmajor, pminor);
|
||||||
|
}
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, meta_globals_t *pMGlobals, gamedll_funcs_t *pGamedllFuncs) {
|
C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, meta_globals_t *pMGlobals, gamedll_funcs_t *pGamedllFuncs) {
|
||||||
if(!pMGlobals) {
|
if(now > Plugin_info.loadable) {
|
||||||
LOG_ERROR(PLID, "Meta_Attach called with null pMGlobals");
|
LOG_ERROR(PLID, "Can't load plugin right now");
|
||||||
return(FALSE);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
gpMetaGlobals=pMGlobals;
|
gpMetaGlobals=pMGlobals;
|
||||||
if(!pFunctionTable) {
|
|
||||||
LOG_ERROR(PLID, "Meta_Attach called with null pFunctionTable");
|
|
||||||
return(FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
gMetaFunctionTable.pfnGetEntityAPI2 = GetEntityAPI2;
|
gMetaFunctionTable.pfnGetEntityAPI2 = GetEntityAPI2;
|
||||||
gMetaFunctionTable.pfnGetEngineFunctions = GetEngineFunctions;
|
gMetaFunctionTable.pfnGetEngineFunctions = GetEngineFunctions;
|
||||||
|
|
||||||
memcpy(pFunctionTable, &gMetaFunctionTable, sizeof(META_FUNCTIONS));
|
memcpy(pFunctionTable, &gMetaFunctionTable, sizeof(META_FUNCTIONS));
|
||||||
gpGamedllFuncs=pGamedllFuncs;
|
gpGamedllFuncs=pGamedllFuncs;
|
||||||
|
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3012,18 +2986,20 @@ C_DLLEXPORT int Meta_Detach(PLUG_LOADTIME now, PL_UNLOAD_REASON reason) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void WINAPI GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) {
|
void WINAPI GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) {
|
||||||
memcpy(&g_engfuncs, pengfuncsFromEngine, sizeof(enginefuncs_t));
|
memcpy(&g_engfuncs, pengfuncsFromEngine, sizeof(enginefuncs_t));
|
||||||
gpGlobals = pGlobals;
|
gpGlobals = pGlobals;
|
||||||
}
|
}
|
||||||
|
|
||||||
C_DLLEXPORT int AMX_Attach(module_info_s** info,pfnamx_engine_g* amxeng,pfnms_engine_g* mseng) {
|
C_DLLEXPORT int AMX_Attach(pfnamx_engine_g* amxeng,pfnmodule_engine_g* meng) {
|
||||||
*info = &AMXInfo;
|
|
||||||
g_engAmxFunc = amxeng;
|
g_engAmxFunc = amxeng;
|
||||||
g_engModuleFunc = mseng;
|
g_engModuleFunc = meng;
|
||||||
|
|
||||||
|
if (!gpMetaGlobals)
|
||||||
|
REPORT_ERROR( 1 , "[AMXXE] Module is not attached to Metamod!\n");
|
||||||
|
|
||||||
|
ADD_AMXNATIVES( &module_info , Engine_Exports);
|
||||||
|
|
||||||
ADD_NATIVES(Engine_Exports);
|
return 1;
|
||||||
|
|
||||||
return(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
C_DLLEXPORT int AMX_Detach() {
|
C_DLLEXPORT int AMX_Detach() {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user