diff --git a/dlls/engine/meta_api.cpp b/dlls/engine/meta_api.cpp index d1f6387f..92a8633e 100755 --- a/dlls/engine/meta_api.cpp +++ b/dlls/engine/meta_api.cpp @@ -36,31 +36,6 @@ #include #include -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 vTouchCallList; -std::vector vServerFrameCallList; -std::vector vCliKillList; -std::vector vPreThinkList; -std::vector vPostThinkList; - -//This was originally by VexD -//Thank you for an excellent piece of work, VexD! - #define NAME "Engine Module" #define AUTHOR "BAILOPAN" #define VERSION "0.3" @@ -68,6 +43,41 @@ std::vector vPostThinkList; #define LOGTAG "AMXXE" #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 SPEAK_NORMAL 0 @@ -260,26 +270,6 @@ GlobalInfo GlInfo; 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 ******************************/ //(BAILOPAN) @@ -2488,18 +2478,12 @@ void ClientUserInfoChanged(edict_t *pEntity, char *infobuffer) { } //(BAILOPAN) - forward this -/* + void PlayerPreThink(edict_t *pEntity) { - if (!vPreThinkList.empty()) { - for(std::vector::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); } -*/ + // This code is to set the model at a specified time. the second part of the code updates the // SetView camera. //(BAILOPAN) - now a forward @@ -2545,13 +2529,6 @@ void PlayerPostThink(edict_t *pEntity) { } } - if (!vPostThinkList.empty()) { - for(std::vector::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); } @@ -2566,44 +2543,23 @@ void StartFrame() { } } - if(!vServerFrameCallList.empty()) { - for(std::vector::iterator i = vServerFrameCallList.begin(); i != vServerFrameCallList.end(); i++) { - cell iRetVal = 0; - AMX_EXEC(&i->pPlugin->amx, &iRetVal, i->iFunctionIdx, 0); - } - } - RETURN_META(MRES_IGNORED); } // pfnTouch, this is a forward that is called whenever 2 entities collide. void Touch(edict_t *pToucher, edict_t *pTouched) { - for(std::vector::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); } //Added by BAILOPAN. ClientKill() forward. -/*void ClientKill(edict_t *pEntity) +void ClientKill(edict_t *pEntity) { cell iRetVal = 0; META_RES result = MRES_IGNORED; - - for(std::vector::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); -}*/ +} // ClientDisconnect. Reinitialize the PlayerInfo struct for that player. 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. void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax) { + /* plugin_t *pCurrent = FIND_PLUGIN_BY_INDEX(0, 0); int iFunctionIndex = 0; // Search for plugins that have the forward functions. while(pCurrent){ //Iterate Plugin List //THIS IS FOR BACKWARD COMPATIBILITY + if(AMX_FINDPUBLIC(&pCurrent->amx, "vexd_pfntouch", &iFunctionIndex) == AMX_ERR_NONE) { AmxCall sNewCall; sNewCall.pPlugin = pCurrent; @@ -2673,8 +2631,8 @@ void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax) { } iFunctionIndex = 0; - - /*if(AMX_FINDPUBLIC(&pCurrent->amx, "pfntouch", &iFunctionIndex) == AMX_ERR_NONE) { + + if(AMX_FINDPUBLIC(&pCurrent->amx, "pfntouch", &iFunctionIndex) == AMX_ERR_NONE) { AmxCall sNewCall; sNewCall.pPlugin = pCurrent; sNewCall.iFunctionIdx = iFunctionIndex; @@ -2682,7 +2640,7 @@ void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax) { } iFunctionIndex = 0; -*/ + if(AMX_FINDPUBLIC(&pCurrent->amx, "ServerFrame", &iFunctionIndex) == AMX_ERR_NONE) { AmxCall sNewCall; sNewCall.pPlugin = pCurrent; @@ -2690,7 +2648,7 @@ void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax) { vServerFrameCallList.push_back(sNewCall); } - /*iFunctionIndex = 0; + iFunctionIndex = 0; if (AMX_FINDPUBLIC(&pCurrent->amx, "client_kill", &iFunctionIndex) == AMX_ERR_NONE) { AmxCall sNewCall; @@ -2716,11 +2674,12 @@ void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax) { sNewCall.iFunctionIdx = iFunctionIndex; vPostThinkList.push_back(sNewCall); } - */ + iFunctionIndex = 0; pCurrent = pCurrent->next; + } - +*/ 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 // from map-to-map. - vTouchCallList.clear(); - vServerFrameCallList.clear(); - vCliKillList.clear(); // Reset Lights. memset(GlInfo.szLastLights, 0x0, 128); @@ -2933,12 +2889,6 @@ AMX_NATIVE_INFO Engine_Exports[] = { }; 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.pfnMessageEnd = MessageEnd; meta_engfuncs.pfnWriteByte = WriteByte; @@ -2950,7 +2900,13 @@ C_DLLEXPORT int GetEngineFunctions(enginefuncs_t *pengfuncsFromEngine, int *inte meta_engfuncs.pfnWriteString = WriteString; meta_engfuncs.pfnWriteEntity = WriteEntity; 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)); @@ -2959,7 +2915,7 @@ C_DLLEXPORT int GetEngineFunctions(enginefuncs_t *pengfuncsFromEngine, int *inte C_DLLEXPORT int GetEntityAPI2( DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion ) { gFunctionTable.pfnGameInit = GameInit; - gFunctionTable.pfnTouch = Touch; + /*gFunctionTable.pfnTouch = Touch; gFunctionTable.pfnStartFrame = StartFrame; gFunctionTable.pfnClientConnect = ClientConnect; gFunctionTable.pfnClientDisconnect = ClientDisconnect; @@ -2968,8 +2924,14 @@ C_DLLEXPORT int GetEntityAPI2( DLL_FUNCTIONS *pFunctionTable, int *interfaceVers gFunctionTable.pfnAddToFullPack = AddToFullPack; gFunctionTable.pfnServerActivate = ServerActivate; gFunctionTable.pfnServerDeactivate = ServerDeactivate; - //gFunctionTable.pfnClientKill = ClientKill; - //gFunctionTable.pfnPlayerPreThink = PlayerPreThink; + gFunctionTable.pfnClientKill = ClientKill; + 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 ) ); @@ -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) { - *pPlugInfo=&Plugin_info; 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); } C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, meta_globals_t *pMGlobals, gamedll_funcs_t *pGamedllFuncs) { - if(!pMGlobals) { - LOG_ERROR(PLID, "Meta_Attach called with null pMGlobals"); + if(now > Plugin_info.loadable) { + LOG_ERROR(PLID, "Can't load plugin right now"); return(FALSE); } gpMetaGlobals=pMGlobals; - if(!pFunctionTable) { - LOG_ERROR(PLID, "Meta_Attach called with null pFunctionTable"); - return(FALSE); - } - gMetaFunctionTable.pfnGetEntityAPI2 = GetEntityAPI2; gMetaFunctionTable.pfnGetEngineFunctions = GetEngineFunctions; - + memcpy(pFunctionTable, &gMetaFunctionTable, sizeof(META_FUNCTIONS)); gpGamedllFuncs=pGamedllFuncs; - + 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 ) { - memcpy(&g_engfuncs, pengfuncsFromEngine, sizeof(enginefuncs_t)); - gpGlobals = pGlobals; + memcpy(&g_engfuncs, pengfuncsFromEngine, sizeof(enginefuncs_t)); + gpGlobals = pGlobals; } -C_DLLEXPORT int AMX_Attach(module_info_s** info,pfnamx_engine_g* amxeng,pfnms_engine_g* mseng) { - *info = &AMXInfo; +C_DLLEXPORT int AMX_Attach(pfnamx_engine_g* amxeng,pfnmodule_engine_g* meng) { 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() {