Replaced with faluco's cleaned-up version of meta_api.cpp

This commit is contained in:
Pavol Marko 2005-09-08 22:20:27 +00:00
parent afa1337e62
commit 7ce59966fc

View File

@ -38,7 +38,8 @@
#include "newmenus.h" #include "newmenus.h"
#include "natives.h" #include "natives.h"
plugin_info_t Plugin_info = { plugin_info_t Plugin_info =
{
META_INTERFACE_VERSION, // ifvers META_INTERFACE_VERSION, // ifvers
"AMX Mod X", // name "AMX Mod X", // name
AMX_VERSION, // version AMX_VERSION, // version
@ -144,30 +145,40 @@ CFakeMeta g_FakeMeta;
// Precache stuff from force consistency calls // Precache stuff from force consistency calls
// or check for pointed files won't be done // or check for pointed files won't be done
int C_PrecacheModel(char *s) { int C_PrecacheModel(char *s)
if ( !g_forcedmodules ){ {
if (!g_forcedmodules)
{
g_forcedmodules = true; g_forcedmodules = true;
for(CList<ForceObject>::iterator a = g_forcemodels.begin(); a ; ++a){ for (CList<ForceObject>::iterator a = g_forcemodels.begin(); a; ++a)
{
PRECACHE_MODEL((char*)(*a).getFilename()); PRECACHE_MODEL((char*)(*a).getFilename());
ENGINE_FORCE_UNMODIFIED((*a).getForceType(), (*a).getMin(), (*a).getMax(), (*a).getFilename()); ENGINE_FORCE_UNMODIFIED((*a).getForceType(), (*a).getMin(), (*a).getMax(), (*a).getFilename());
} }
} }
RETURN_META_VALUE(MRES_IGNORED, 0); RETURN_META_VALUE(MRES_IGNORED, 0);
} }
int C_PrecacheSound(char *s) { int C_PrecacheSound(char *s)
if ( !g_forcedsounds ) { {
if (!g_forcedsounds)
{
g_forcedsounds = true; g_forcedsounds = true;
for(CList<ForceObject>::iterator a = g_forcesounds.begin(); a ; ++a){ for (CList<ForceObject>::iterator a = g_forcesounds.begin(); a; ++a)
{
PRECACHE_SOUND((char*)(*a).getFilename()); PRECACHE_SOUND((char*)(*a).getFilename());
ENGINE_FORCE_UNMODIFIED((*a).getForceType(),(*a).getMin(),(*a).getMax(),(*a).getFilename()); ENGINE_FORCE_UNMODIFIED((*a).getForceType(),(*a).getMin(),(*a).getMax(),(*a).getFilename());
} }
if (!g_bmod_cstrike){
if (!g_bmod_cstrike)
{
PRECACHE_SOUND("weapons/cbar_hitbod1.wav"); PRECACHE_SOUND("weapons/cbar_hitbod1.wav");
PRECACHE_SOUND("weapons/cbar_hitbod2.wav"); PRECACHE_SOUND("weapons/cbar_hitbod2.wav");
PRECACHE_SOUND("weapons/cbar_hitbod3.wav"); PRECACHE_SOUND("weapons/cbar_hitbod3.wav");
} }
} }
RETURN_META_VALUE(MRES_IGNORED, 0); RETURN_META_VALUE(MRES_IGNORED, 0);
} }
@ -183,6 +194,7 @@ int C_InconsistentFile( const edict_t *player, const char *filename, char *disco
if (executeForwards(FF_InconsistentFile, pPlayer->index, filename, disconnect_message) == 1) if (executeForwards(FF_InconsistentFile, pPlayer->index, filename, disconnect_message) == 1)
RETURN_META_VALUE(MRES_SUPERCEDE, FALSE); RETURN_META_VALUE(MRES_SUPERCEDE, FALSE);
RETURN_META_VALUE(MRES_SUPERCEDE, TRUE); RETURN_META_VALUE(MRES_SUPERCEDE, TRUE);
} }
@ -192,8 +204,10 @@ int C_InconsistentFile( const edict_t *player, const char *filename, char *disco
const char* get_localinfo(const char* name, const char* def) const char* get_localinfo(const char* name, const char* def)
{ {
const char* b = LOCALINFO((char*)name); const char* b = LOCALINFO((char*)name);
if (b == 0 || *b == 0) if (b == 0 || *b == 0)
SET_LOCALINFO((char*)name,(char*)(b = def)); SET_LOCALINFO((char*)name,(char*)(b = def));
return b; return b;
} }
@ -227,6 +241,7 @@ int C_Spawn( edict_t *pent )
char file[256]; char file[256];
g_langMngr.LoadCache(build_pathname_r(file, sizeof(file)-1, "%s/dictionary.cache", get_localinfo("amxx_datadir", "addons/amxmodx/data"))); g_langMngr.LoadCache(build_pathname_r(file, sizeof(file)-1, "%s/dictionary.cache", get_localinfo("amxx_datadir", "addons/amxmodx/data")));
g_langMngr.Load(build_pathname_r(file, sizeof(file)-1, "%s/languages.dat", get_localinfo("amxmodx_datadir", "addons/amxmodx/data"))); g_langMngr.Load(build_pathname_r(file, sizeof(file)-1, "%s/languages.dat", get_localinfo("amxmodx_datadir", "addons/amxmodx/data")));
// ###### Initialize commands prefixes // ###### Initialize commands prefixes
g_commands.registerPrefix("amx"); g_commands.registerPrefix("amx");
g_commands.registerPrefix("amxx"); g_commands.registerPrefix("amxx");
@ -254,6 +269,7 @@ int C_Spawn( edict_t *pent )
// ###### Load Vault // ###### Load Vault
g_vault.setSource(build_pathname_r(file, sizeof(file)-1, "%s", get_localinfo("amxx_vault", "addons/amxmodx/configs/vault.ini"))); g_vault.setSource(build_pathname_r(file, sizeof(file)-1, "%s", get_localinfo("amxx_vault", "addons/amxmodx/configs/vault.ini")));
g_vault.loadVault(); g_vault.loadVault();
if (strlen(g_vault.get("server_language")) < 1) if (strlen(g_vault.get("server_language")) < 1)
{ {
g_vault.put("server_language", "en"); g_vault.put("server_language", "en");
@ -264,6 +280,7 @@ int C_Spawn( edict_t *pent )
g_game_timeleft = g_bmod_dod ? 1.0f : 0.0f; g_game_timeleft = g_bmod_dod ? 1.0f : 0.0f;
g_task_time = gpGlobals->time + 99999.0f; g_task_time = gpGlobals->time + 99999.0f;
g_auth_time = gpGlobals->time + 99999.0f; g_auth_time = gpGlobals->time + 99999.0f;
#ifdef MEMORY_TEST #ifdef MEMORY_TEST
g_next_memreport_time = gpGlobals->time + 99999.0f; g_next_memreport_time = gpGlobals->time + 99999.0f;
#endif #endif
@ -299,7 +316,8 @@ int C_Spawn( edict_t *pent )
executeForwards(FF_PluginPrecache); executeForwards(FF_PluginPrecache);
g_dontprecache = true; g_dontprecache = true;
for(CList<ForceObject>::iterator a = g_forcegeneric.begin(); a ; ++a){ for (CList<ForceObject>::iterator a = g_forcegeneric.begin(); a; ++a)
{
PRECACHE_GENERIC((char*)(*a).getFilename()); PRECACHE_GENERIC((char*)(*a).getFilename());
ENGINE_FORCE_UNMODIFIED((*a).getForceType(), ENGINE_FORCE_UNMODIFIED((*a).getForceType(),
(*a).getMin(),(*a).getMax(),(*a).getFilename()); (*a).getMin(),(*a).getMax(),(*a).getFilename());
@ -308,13 +326,15 @@ int C_Spawn( edict_t *pent )
RETURN_META_VALUE(MRES_IGNORED, 0); RETURN_META_VALUE(MRES_IGNORED, 0);
} }
struct sUserMsg { struct sUserMsg
{
const char* name; const char* name;
int* id; int* id;
funEventCall func; funEventCall func;
bool endmsg; bool endmsg;
bool cstrike; bool cstrike;
} g_user_msg[] = { } g_user_msg[] =
{
{"CurWeapon", &gmsgCurWeapon, Client_CurWeapon, false, false}, {"CurWeapon", &gmsgCurWeapon, Client_CurWeapon, false, false},
{"Damage", &gmsgDamage, Client_DamageEnd, true, true}, {"Damage", &gmsgDamage, Client_DamageEnd, true, true},
{"DeathMsg", &gmsgDeathMsg, Client_DeathMsg, false, true}, {"DeathMsg", &gmsgDeathMsg, Client_DeathMsg, false, true},
@ -337,7 +357,6 @@ struct sUserMsg {
{0, 0, 0, false, false} {0, 0, 0, false, false}
}; };
int C_RegUserMsg_Post(const char *pszName, int iSize) int C_RegUserMsg_Post(const char *pszName, int iSize)
{ {
for (int i = 0; g_user_msg[i].name; ++i) for (int i = 0; g_user_msg[i].name; ++i)
@ -345,7 +364,6 @@ int C_RegUserMsg_Post(const char *pszName, int iSize)
if (strcmp(g_user_msg[i].name, pszName) == 0) if (strcmp(g_user_msg[i].name, pszName) == 0)
{ {
int id = META_RESULT_ORIG_RET(int); int id = META_RESULT_ORIG_RET(int);
*g_user_msg[i].id = id; *g_user_msg[i].id = id;
if (!g_user_msg[i].cstrike || g_bmod_cstrike) if (!g_user_msg[i].cstrike || g_bmod_cstrike)
@ -355,7 +373,6 @@ int C_RegUserMsg_Post(const char *pszName, int iSize)
else else
modMsgs[id] = g_user_msg[i].func; modMsgs[id] = g_user_msg[i].func;
} }
break; break;
} }
} }
@ -371,10 +388,10 @@ plugin_init forward function from plugins
void C_ServerActivate(edict_t *pEdictList, int edictCount, int clientMax) void C_ServerActivate(edict_t *pEdictList, int edictCount, int clientMax)
{ {
int id; int id;
for (int i = 0; g_user_msg[i].name; ++i) for (int i = 0; g_user_msg[i].name; ++i)
{ {
if ( (*g_user_msg[ i ].id == 0) && if ((*g_user_msg[i].id == 0) && (id = GET_USER_MSG_ID(PLID, g_user_msg[i].name, NULL)) != 0)
(id = GET_USER_MSG_ID(PLID, g_user_msg[ i ].name , NULL ))!=0)
{ {
*g_user_msg[i].id = id; *g_user_msg[i].id = id;
@ -396,7 +413,8 @@ void C_ServerActivate_Post( edict_t *pEdictList, int edictCount, int clientMax )
if (g_activated) if (g_activated)
RETURN_META(MRES_IGNORED); RETURN_META(MRES_IGNORED);
for(int i = 1; i <= gpGlobals->maxClients; ++i) { for (int i= 1; i <= gpGlobals->maxClients; ++i)
{
CPlayer *pPlayer = GET_PLAYER_POINTER_I(i); CPlayer *pPlayer = GET_PLAYER_POINTER_I(i);
pPlayer->Init(pEdictList + i, i); pPlayer->Init(pEdictList + i, i);
} }
@ -410,7 +428,8 @@ void C_ServerActivate_Post( edict_t *pEdictList, int edictCount, int clientMax )
g_langMngr.SaveCache(build_pathname_r(file, sizeof(file)-1, "%s/dictionary.cache", get_localinfo("amxx_datadir", "addons/amxmodx/data"))); g_langMngr.SaveCache(build_pathname_r(file, sizeof(file)-1, "%s/dictionary.cache", get_localinfo("amxx_datadir", "addons/amxmodx/data")));
// Correct time in Counter-Strike and other mods (except DOD) // Correct time in Counter-Strike and other mods (except DOD)
if ( !g_bmod_dod) g_game_timeleft = 0; if (!g_bmod_dod)
g_game_timeleft = 0;
g_task_time = gpGlobals->time; g_task_time = gpGlobals->time;
g_auth_time = gpGlobals->time; g_auth_time = gpGlobals->time;
@ -431,13 +450,15 @@ void C_ServerDeactivate()
{ {
if (!g_activated) if (!g_activated)
RETURN_META(MRES_IGNORED); RETURN_META(MRES_IGNORED);
for(int i = 1; i <= gpGlobals->maxClients; ++i){
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CPlayer *pPlayer = GET_PLAYER_POINTER_I(i); CPlayer *pPlayer = GET_PLAYER_POINTER_I(i);
if (pPlayer->initialized) if (pPlayer->initialized)
executeForwards(FF_ClientDisconnect, pPlayer->index); executeForwards(FF_ClientDisconnect, pPlayer->index);
if (pPlayer->ingame){ if (pPlayer->ingame)
{
pPlayer->Disconnect(); pPlayer->Disconnect();
--g_players_num; --g_players_num;
} }
@ -455,6 +476,7 @@ void C_ServerDeactivate_Post()
{ {
if (!g_initialized) if (!g_initialized)
RETURN_META(MRES_IGNORED); RETURN_META(MRES_IGNORED);
detachReloadModules(); detachReloadModules();
g_auth.clear(); g_auth.clear();
g_commands.clear(); g_commands.clear();
@ -510,9 +532,7 @@ void C_ServerDeactivate_Post()
// good // good
++i; ++i;
continue; continue;
} } else {
else
{
// bad // bad
g_memreport_enabled = false; g_memreport_enabled = false;
AMXXLOG_Log("[AMXX] Fatal error: Can't create directory for memreport files (%s)", buffer); AMXXLOG_Log("[AMXX] Fatal error: Can't create directory for memreport files (%s)", buffer);
@ -531,29 +551,29 @@ void C_ServerDeactivate_Post()
#endif // MEMORY_TEST #endif // MEMORY_TEST
g_initialized = false; g_initialized = false;
RETURN_META(MRES_IGNORED); RETURN_META(MRES_IGNORED);
} }
BOOL C_ClientConnect_Post(edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[128]) BOOL C_ClientConnect_Post(edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[128])
{ {
CPlayer* pPlayer = GET_PLAYER_POINTER(pEntity); CPlayer* pPlayer = GET_PLAYER_POINTER(pEntity);
if (!pPlayer->bot) { if (!pPlayer->bot)
{
bool a = pPlayer->Connect(pszName, pszAddress); bool a = pPlayer->Connect(pszName, pszAddress);
executeForwards(FF_ClientConnect, pPlayer->index); executeForwards(FF_ClientConnect, pPlayer->index);
if (a) if (a)
{ {
CPlayer** aa = new CPlayer*(pPlayer); CPlayer** aa = new CPlayer*(pPlayer);
if ( aa ) g_auth.put( aa ); if (aa)
} g_auth.put(aa);
else } else {
{
pPlayer->Authorize(); pPlayer->Authorize();
executeForwards(FF_ClientAuthorized, pPlayer->index); executeForwards(FF_ClientAuthorized, pPlayer->index);
} }
} }
RETURN_META_VALUE(MRES_IGNORED, TRUE); RETURN_META_VALUE(MRES_IGNORED, TRUE);
} }
@ -563,32 +583,32 @@ void C_ClientDisconnect( edict_t *pEntity )
if (pPlayer->initialized) if (pPlayer->initialized)
executeForwards(FF_ClientDisconnect, pPlayer->index); executeForwards(FF_ClientDisconnect, pPlayer->index);
if (pPlayer->ingame) { if (pPlayer->ingame)
{
--g_players_num; --g_players_num;
} }
pPlayer->Disconnect(); pPlayer->Disconnect();
RETURN_META(MRES_IGNORED); RETURN_META(MRES_IGNORED);
} }
void C_ClientPutInServer_Post(edict_t *pEntity) void C_ClientPutInServer_Post(edict_t *pEntity)
{ {
CPlayer *pPlayer = GET_PLAYER_POINTER(pEntity); CPlayer *pPlayer = GET_PLAYER_POINTER(pEntity);
if (!pPlayer->bot) { if (!pPlayer->bot)
{
pPlayer->PutInServer(); pPlayer->PutInServer();
++g_players_num; ++g_players_num;
executeForwards(FF_ClientPutInServer, pPlayer->index); executeForwards(FF_ClientPutInServer, pPlayer->index);
} }
RETURN_META(MRES_IGNORED); RETURN_META(MRES_IGNORED);
} }
void C_ClientUserInfoChanged_Post(edict_t *pEntity, char *infobuffer) void C_ClientUserInfoChanged_Post(edict_t *pEntity, char *infobuffer)
{ {
CPlayer *pPlayer = GET_PLAYER_POINTER(pEntity); CPlayer *pPlayer = GET_PLAYER_POINTER(pEntity);
executeForwards(FF_ClientInfoChanged, pPlayer->index); executeForwards(FF_ClientInfoChanged, pPlayer->index);
const char* name = INFOKEY_VALUE(infobuffer,"name"); const char* name = INFOKEY_VALUE(infobuffer,"name");
// Emulate bot connection and putinserver // Emulate bot connection and putinserver
@ -605,7 +625,6 @@ void C_ClientUserInfoChanged_Post( edict_t *pEntity, char *infobuffer )
pPlayer->Authorize(); pPlayer->Authorize();
executeForwards(FF_ClientAuthorized, pPlayer->index); executeForwards(FF_ClientAuthorized, pPlayer->index);
pPlayer->PutInServer(); pPlayer->PutInServer();
++g_players_num; ++g_players_num;
@ -653,7 +672,6 @@ void C_ClientCommand( edict_t *pEntity )
if (executeForwards(FF_ClientCommand, pPlayer->index) > 0) if (executeForwards(FF_ClientCommand, pPlayer->index) > 0)
RETURN_META(MRES_SUPERCEDE); RETURN_META(MRES_SUPERCEDE);
/* check for command and if needed also for first argument and call proper function */ /* check for command and if needed also for first argument and call proper function */
CmdMngr::iterator aa = g_commands.clcmdprefixbegin(cmd); CmdMngr::iterator aa = g_commands.clcmdprefixbegin(cmd);
@ -661,14 +679,12 @@ void C_ClientCommand( edict_t *pEntity )
while (aa) while (aa)
{ {
if ( (*aa).matchCommandLine( cmd , arg ) && if ((*aa).matchCommandLine(cmd, arg) && (*aa).getPlugin()->isExecutable((*aa).getFunction()))
(*aa).getPlugin()->isExecutable( (*aa).getFunction() ) )
{ {
ret = executeForwards((*aa).getFunction(), pPlayer->index, (*aa).getFlags(), (*aa).getId()); ret = executeForwards((*aa).getFunction(), pPlayer->index, (*aa).getFlags(), (*aa).getId());
if (ret & 2) result = MRES_SUPERCEDE; if (ret & 2) result = MRES_SUPERCEDE;
if (ret & 1) RETURN_META(MRES_SUPERCEDE); if (ret & 1) RETURN_META(MRES_SUPERCEDE);
} }
++aa; ++aa;
} }
@ -681,7 +697,6 @@ void C_ClientCommand( edict_t *pEntity )
if (pPlayer->keys & bit_key) if (pPlayer->keys & bit_key)
{ {
int menuid = pPlayer->menu; int menuid = pPlayer->menu;
pPlayer->menu = 0; pPlayer->menu = 0;
@ -695,35 +710,41 @@ void C_ClientCommand( edict_t *pEntity )
{ {
int menu = pPlayer->newmenu; int menu = pPlayer->newmenu;
pPlayer->newmenu = -1; pPlayer->newmenu = -1;
if (menu >= 0 && menu < (int)g_NewMenus.size()) if (menu >= 0 && menu < (int)g_NewMenus.size())
{ {
Menu *pMenu = g_NewMenus[menu]; Menu *pMenu = g_NewMenus[menu];
int item = pMenu->PagekeyToItem(pPlayer->page, pressed_key); int item = pMenu->PagekeyToItem(pPlayer->page, pressed_key);
ret = executeForwards((*a).getFunction(), pPlayer->index, menu, item); ret = executeForwards((*a).getFunction(), pPlayer->index, menu, item);
if (ret & 2) result = MRES_SUPERCEDE; if (ret & 2) result = MRES_SUPERCEDE;
else if (ret & 1) RETURN_META(MRES_SUPERCEDE); else if (ret & 1) RETURN_META(MRES_SUPERCEDE);
else { else
{
if (item == MENU_BACK) if (item == MENU_BACK)
{ {
pMenu->Display(pPlayer->index, pPlayer->page-1); pMenu->Display(pPlayer->index, pPlayer->page-1);
} else if (item == MENU_MORE) { } else if (item == MENU_MORE)
{
pMenu->Display(pPlayer->index, pPlayer->page+1); pMenu->Display(pPlayer->index, pPlayer->page+1);
} else if (item == MENU_EXIT) { } else if (item == MENU_EXIT)
{
//nothing //nothing
} }
} }
} }
} else { } else {
ret = executeForwards((*a).getFunction(), pPlayer->index, pressed_key, 0); ret = executeForwards((*a).getFunction(), pPlayer->index, pressed_key, 0);
if (ret & 2) result = MRES_SUPERCEDE; if (ret & 2) result = MRES_SUPERCEDE;
if (ret & 1) RETURN_META(MRES_SUPERCEDE); if (ret & 1) RETURN_META(MRES_SUPERCEDE);
} }
} }
++a; ++a;
} }
} }
} }
/* check for PLUGIN_HANDLED_MAIN and block hl call if needed */ /* check for PLUGIN_HANDLED_MAIN and block hl call if needed */
RETURN_META(result); RETURN_META(result);
} }
@ -733,14 +754,14 @@ void C_StartFrame_Post( void )
if (g_auth_time < gpGlobals->time) if (g_auth_time < gpGlobals->time)
{ {
g_auth_time = gpGlobals->time + 0.7f; g_auth_time = gpGlobals->time + 0.7f;
CList<CPlayer*>::iterator a = g_auth.begin(); CList<CPlayer*>::iterator a = g_auth.begin();
while (a) while (a)
{ {
const char* auth = GETPLAYERAUTHID((*a)->pEdict); const char* auth = GETPLAYERAUTHID((*a)->pEdict);
if ( (auth == 0) || (*auth == 0) ) { if ((auth == 0) || (*auth == 0))
{
a.remove(); a.remove();
continue; continue;
} }
@ -752,17 +773,15 @@ void C_StartFrame_Post( void )
a.remove(); a.remove();
continue; continue;
} }
++a; ++a;
} }
} }
#ifdef MEMORY_TEST #ifdef MEMORY_TEST
if (g_memreport_enabled && g_next_memreport_time <= gpGlobals->time) if (g_memreport_enabled && g_next_memreport_time <= gpGlobals->time)
{ {
g_next_memreport_time = gpGlobals->time + MEMREPORT_INTERVAL; g_next_memreport_time = gpGlobals->time + MEMREPORT_INTERVAL;
if (g_memreport_count == 0) if (g_memreport_count == 0)
{ {
// make new directory // make new directory
@ -792,9 +811,7 @@ void C_StartFrame_Post( void )
// good // good
++i; ++i;
continue; continue;
} } else {
else
{
// bad // bad
g_memreport_enabled = false; g_memreport_enabled = false;
AMXXLOG_Log("[AMXX] Fatal error: Can't create directory for memreport files (%s)", buffer); AMXXLOG_Log("[AMXX] Fatal error: Can't create directory for memreport files (%s)", buffer);
@ -819,11 +836,11 @@ void C_StartFrame_Post( void )
g_tasksMngr.startFrame(); g_tasksMngr.startFrame();
// Dispatch client cvar queries // Dispatch client cvar queries
for (int i = 1; i <= gpGlobals->maxClients; ++i) for (int i = 1; i <= gpGlobals->maxClients; ++i)
{ {
CPlayer* pPlayer = GET_PLAYER_POINTER_I(i); CPlayer* pPlayer = GET_PLAYER_POINTER_I(i);
if (pPlayer->pEdict && pPlayer->initialized && !pPlayer->cvarQueryQueue.empty()) if (pPlayer->pEdict && pPlayer->initialized && !pPlayer->cvarQueryQueue.empty())
{ {
if (!IS_QUERYING_CLIENT_CVAR(PLID, pPlayer->pEdict)) if (!IS_QUERYING_CLIENT_CVAR(PLID, pPlayer->pEdict))
@ -834,7 +851,6 @@ void C_StartFrame_Post( void )
} }
} }
RETURN_META(MRES_IGNORED); RETURN_META(MRES_IGNORED);
} }
@ -842,7 +858,6 @@ void C_MessageBegin_Post(int msg_dest, int msg_type, const float *pOrigin, edict
{ {
if (ed) if (ed)
{ {
if (gmsgBattery == msg_type && g_bmod_cstrike) if (gmsgBattery == msg_type && g_bmod_cstrike)
{ {
void* ptr = GET_PRIVATE(ed); void* ptr = GET_PRIVATE(ed);
@ -858,12 +873,11 @@ void C_MessageBegin_Post(int msg_dest, int msg_type, const float *pOrigin, edict
mPlayerIndex = ENTINDEX(ed); mPlayerIndex = ENTINDEX(ed);
mPlayer = GET_PLAYER_POINTER_I(mPlayerIndex); mPlayer = GET_PLAYER_POINTER_I(mPlayerIndex);
} } else {
else
{
mPlayerIndex = 0; mPlayerIndex = 0;
mPlayer = 0; mPlayer = 0;
} }
if (msg_type < 0 || msg_type >= MAX_REG_MSGS) if (msg_type < 0 || msg_type >= MAX_REG_MSGS)
msg_type = 0; msg_type = 0;
@ -871,72 +885,94 @@ void C_MessageBegin_Post(int msg_dest, int msg_type, const float *pOrigin, edict
function=modMsgs[msg_type]; function=modMsgs[msg_type];
endfunction=modMsgsEnd[msg_type]; endfunction=modMsgsEnd[msg_type];
g_events.parserInit(msg_type, &gpGlobals->time, mPlayer, mPlayerIndex); g_events.parserInit(msg_type, &gpGlobals->time, mPlayer, mPlayerIndex);
RETURN_META(MRES_IGNORED); RETURN_META(MRES_IGNORED);
} }
void C_WriteByte_Post(int iValue) void C_WriteByte_Post(int iValue)
{ {
g_events.parseValue(iValue); g_events.parseValue(iValue);
if (function) (*function)((void *)&iValue); if (function) (*function)((void *)&iValue);
RETURN_META(MRES_IGNORED); RETURN_META(MRES_IGNORED);
} }
void C_WriteChar_Post(int iValue) void C_WriteChar_Post(int iValue)
{ {
g_events.parseValue(iValue); g_events.parseValue(iValue);
if (function) (*function)((void *)&iValue); if (function) (*function)((void *)&iValue);
RETURN_META(MRES_IGNORED); RETURN_META(MRES_IGNORED);
} }
void C_WriteShort_Post(int iValue) void C_WriteShort_Post(int iValue)
{ {
g_events.parseValue(iValue); g_events.parseValue(iValue);
if (function) (*function)((void *)&iValue); if (function) (*function)((void *)&iValue);
RETURN_META(MRES_IGNORED); RETURN_META(MRES_IGNORED);
} }
void C_WriteLong_Post(int iValue) void C_WriteLong_Post(int iValue)
{ {
g_events.parseValue(iValue); g_events.parseValue(iValue);
if (function) (*function)((void *)&iValue); if (function) (*function)((void *)&iValue);
RETURN_META(MRES_IGNORED); RETURN_META(MRES_IGNORED);
} }
void C_WriteAngle_Post(float flValue) void C_WriteAngle_Post(float flValue)
{ {
g_events.parseValue(flValue); g_events.parseValue(flValue);
if (function) (*function)((void *)&flValue); if (function) (*function)((void *)&flValue);
RETURN_META(MRES_IGNORED); RETURN_META(MRES_IGNORED);
} }
void C_WriteCoord_Post(float flValue) void C_WriteCoord_Post(float flValue)
{ {
g_events.parseValue(flValue); g_events.parseValue(flValue);
if (function) (*function)((void *)&flValue); if (function) (*function)((void *)&flValue);
RETURN_META(MRES_IGNORED); RETURN_META(MRES_IGNORED);
} }
void C_WriteString_Post(const char *sz) void C_WriteString_Post(const char *sz)
{ {
g_events.parseValue(sz); g_events.parseValue(sz);
if (function) (*function)((void *)sz); if (function) (*function)((void *)sz);
RETURN_META(MRES_IGNORED); RETURN_META(MRES_IGNORED);
} }
void C_WriteEntity_Post(int iValue) void C_WriteEntity_Post(int iValue)
{ {
g_events.parseValue(iValue); g_events.parseValue(iValue);
if (function) (*function)((void *)&iValue); if (function) (*function)((void *)&iValue);
RETURN_META(MRES_IGNORED); RETURN_META(MRES_IGNORED);
} }
void C_MessageEnd_Post(void) void C_MessageEnd_Post(void)
{ {
g_events.executeEvents(); g_events.executeEvents();
if (endfunction) (*endfunction)(NULL); if (endfunction) (*endfunction)(NULL);
RETURN_META(MRES_IGNORED); RETURN_META(MRES_IGNORED);
} }
void C_ChangeLevel(char* s1, char* s2) void C_ChangeLevel(char* s1, char* s2)
{ {
if (FF_ChangeLevel) { if (FF_ChangeLevel)
{
int retVal = 0; int retVal = 0;
char *map = s1; char *map = s1;
retVal = executeForwards(FF_ChangeLevel, map); retVal = executeForwards(FF_ChangeLevel, map);
if (retVal) if (retVal)
RETURN_META(MRES_SUPERCEDE); RETURN_META(MRES_SUPERCEDE);
} }
RETURN_META(MRES_IGNORED); RETURN_META(MRES_IGNORED);
} }
@ -945,6 +981,7 @@ const char *C_Cmd_Args( void )
// if the global "fake" flag is set, which means that engclient_cmd was used, supercede the function // if the global "fake" flag is set, which means that engclient_cmd was used, supercede the function
if (g_fakecmd.fake) if (g_fakecmd.fake)
RETURN_META_VALUE(MRES_SUPERCEDE, (g_fakecmd.argc > 1) ? g_fakecmd.args : g_fakecmd.argv[0]); RETURN_META_VALUE(MRES_SUPERCEDE, (g_fakecmd.argc > 1) ? g_fakecmd.args : g_fakecmd.argv[0]);
// otherwise ignore it // otherwise ignore it
RETURN_META_VALUE(MRES_IGNORED, NULL); RETURN_META_VALUE(MRES_IGNORED, NULL);
} }
@ -954,6 +991,7 @@ const char *C_Cmd_Argv(int argc)
// if the global "fake" flag is set, which means that engclient_cmd was used, supercede the function // if the global "fake" flag is set, which means that engclient_cmd was used, supercede the function
if (g_fakecmd.fake) if (g_fakecmd.fake)
RETURN_META_VALUE(MRES_SUPERCEDE, (argc < 3) ? g_fakecmd.argv[argc] : ""); RETURN_META_VALUE(MRES_SUPERCEDE, (argc < 3) ? g_fakecmd.argv[argc] : "");
// otherwise ignore it // otherwise ignore it
RETURN_META_VALUE(MRES_IGNORED, NULL); RETURN_META_VALUE(MRES_IGNORED, NULL);
} }
@ -963,6 +1001,7 @@ int C_Cmd_Argc( void )
// if the global "fake" flag is set, which means that engclient_cmd was used, supercede the function // if the global "fake" flag is set, which means that engclient_cmd was used, supercede the function
if (g_fakecmd.fake) if (g_fakecmd.fake)
RETURN_META_VALUE(MRES_SUPERCEDE, g_fakecmd.argc); RETURN_META_VALUE(MRES_SUPERCEDE, g_fakecmd.argc);
// otherwise ignore it // otherwise ignore it
RETURN_META_VALUE(MRES_IGNORED, 0); RETURN_META_VALUE(MRES_IGNORED, 0);
} }
@ -973,19 +1012,24 @@ void C_SetModel(edict_t *e, const char *m)
{ {
if (e->v.owner && m[7]=='w' && m[8]=='_' && m[9]=='h') if (e->v.owner && m[7]=='w' && m[8]=='_' && m[9]=='h')
g_grenades.put(e, 1.75, 4, GET_PLAYER_POINTER(e->v.owner)); g_grenades.put(e, 1.75, 4, GET_PLAYER_POINTER(e->v.owner));
RETURN_META(MRES_IGNORED); RETURN_META(MRES_IGNORED);
} }
// Save at what part of body a player is aiming // Save at what part of body a player is aiming
void C_TraceLine_Post(const float *v1, const float *v2, int fNoMonsters, edict_t *e, TraceResult *ptr) void C_TraceLine_Post(const float *v1, const float *v2, int fNoMonsters, edict_t *e, TraceResult *ptr)
{ {
if ( e && ( e->v.flags & (FL_CLIENT | FL_FAKECLIENT) ) ) { if (e && (e->v.flags & (FL_CLIENT | FL_FAKECLIENT)))
{
CPlayer* pPlayer = GET_PLAYER_POINTER(e); CPlayer* pPlayer = GET_PLAYER_POINTER(e);
if (ptr->pHit && (ptr->pHit->v.flags & (FL_CLIENT | FL_FAKECLIENT))) if (ptr->pHit && (ptr->pHit->v.flags & (FL_CLIENT | FL_FAKECLIENT)))
pPlayer->aiming = ptr->iHitgroup; pPlayer->aiming = ptr->iHitgroup;
pPlayer->lastTrace = pPlayer->thisTrace; pPlayer->lastTrace = pPlayer->thisTrace;
pPlayer->thisTrace = ptr->vecEndPos; pPlayer->thisTrace = ptr->vecEndPos;
} }
RETURN_META(MRES_IGNORED); RETURN_META(MRES_IGNORED);
} }
@ -1011,9 +1055,12 @@ void C_AlertMessage_Post(ALERT_TYPE atype, char *szFmt, ...)
g_logevents.setLogString(szFmt, logArgPtr); g_logevents.setLogString(szFmt, logArgPtr);
va_end (logArgPtr); va_end (logArgPtr);
g_logevents.parseLogString(); g_logevents.parseLogString();
if (g_logevents.logEventsExist()) if (g_logevents.logEventsExist())
g_logevents.executeLogEvents(); g_logevents.executeLogEvents();
cell retVal = executeForwards(FF_PluginLog); cell retVal = executeForwards(FF_PluginLog);
if (retVal) if (retVal)
RETURN_META(MRES_HANDLED); RETURN_META(MRES_HANDLED);
} }
@ -1039,12 +1086,14 @@ void C_CvarValue(const edict_t *pEdict, const char *value)
else else
executeForwards(pQuery->resultFwd, ENTINDEX(pEdict), pQuery->cvarName.c_str(), value); executeForwards(pQuery->resultFwd, ENTINDEX(pEdict), pQuery->cvarName.c_str(), value);
unregisterSPForward(pQuery->resultFwd); unregisterSPForward(pQuery->resultFwd);
if (pQuery->params) if (pQuery->params)
delete [] pQuery->params; delete [] pQuery->params;
delete pQuery; delete pQuery;
pPlayer->cvarQueryQueue.pop(); pPlayer->cvarQueryQueue.pop();
RETURN_META(MRES_HANDLED); RETURN_META(MRES_HANDLED);
} }
@ -1057,40 +1106,49 @@ C_DLLEXPORT int Meta_Query(char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_
{ {
gpMetaUtilFuncs=pMetaUtilFuncs; gpMetaUtilFuncs=pMetaUtilFuncs;
*pPlugInfo=&Plugin_info; *pPlugInfo=&Plugin_info;
if (strcmp(ifvers, Plugin_info.ifvers)) if (strcmp(ifvers, Plugin_info.ifvers))
{ {
int mmajor = 0, mminor = 0, pmajor = 0, pminor = 0; 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); LOG_MESSAGE(PLID, "WARNING: meta-interface version mismatch; requested=%s ours=%s", Plugin_info.logtag, ifvers);
sscanf(ifvers, "%d:%d", &mmajor, &mminor); sscanf(ifvers, "%d:%d", &mmajor, &mminor);
sscanf(META_INTERFACE_VERSION, "%d:%d", &pmajor, &pminor); sscanf(META_INTERFACE_VERSION, "%d:%d", &pmajor, &pminor);
if (pmajor > mmajor) if (pmajor > mmajor)
{ {
LOG_ERROR(PLID, "metamod version is too old for this plugin; update metamod"); LOG_ERROR(PLID, "metamod version is too old for this plugin; update metamod");
return (FALSE); return (FALSE);
} else if(pmajor < mmajor) { } else if (pmajor < mmajor)
{
LOG_ERROR(PLID, "metamod version is incompatible with this plugin; please find a newer version of this plugin"); LOG_ERROR(PLID, "metamod version is incompatible with this plugin; please find a newer version of this plugin");
return (FALSE); return (FALSE);
} else if (pmajor==mmajor) { } else if (pmajor == mmajor)
{
#ifdef FAKEMETA #ifdef FAKEMETA
if (mminor == 10) if (mminor == 10)
{ {
LOG_MESSAGE(PLID, "WARNING: metamod version is older than expected; consider finding a newer version"); LOG_MESSAGE(PLID, "WARNING: metamod version is older than expected; consider finding a newer version");
g_IsNewMM = false; g_IsNewMM = false;
//hack! //hack!
Plugin_info.ifvers = "5:10"; Plugin_info.ifvers = "5:10";
#else #else
if (mminor < 11) if (mminor < 11)
{ {
g_NeedsP = true; g_NeedsP = true;
#endif #endif
} else if (mminor >= 11) { } else if (mminor >= 11)
{
g_IsNewMM = true; g_IsNewMM = true;
} else if (pminor > mminor) { } else if (pminor > mminor)
{
LOG_ERROR(PLID, "metamod version is incompatible with this plugin; please find a newer version of this plugin"); LOG_ERROR(PLID, "metamod version is incompatible with this plugin; please find a newer version of this plugin");
return FALSE; return FALSE;
} else if (pminor < mminor) { } else if (pminor < mminor)
{
LOG_MESSAGE(PLID, "WARNING: metamod version is newer than expected; consider finding a newer version of this plugin"); LOG_MESSAGE(PLID, "WARNING: metamod version is newer than expected; consider finding a newer version of this plugin");
if (mminor > 11) if (mminor > 11)
g_IsNewMM = true; g_IsNewMM = true;
} }
@ -1116,7 +1174,9 @@ C_DLLEXPORT int Meta_PExtGiveFnptrs(int interfaceVersion, pextension_funcs_t *pM
{ {
return (META_PEXT_VERSION); return (META_PEXT_VERSION);
} }
gpMetaPExtFuncs = pMetaPExtFuncs; gpMetaPExtFuncs = pMetaPExtFuncs;
return (META_PEXT_VERSION); return (META_PEXT_VERSION);
} }
@ -1128,17 +1188,20 @@ C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, m
LOG_ERROR(PLID, "Can't load plugin right now"); LOG_ERROR(PLID, "Can't load plugin right now");
return (FALSE); return (FALSE);
} }
if (g_NeedsP && !gpMetaPExtFuncs) if (g_NeedsP && !gpMetaPExtFuncs)
{ {
LOG_ERROR(PLID, "You need Metamod-P or Metamod-1.18 to use AMX Mod X 1.1!"); LOG_ERROR(PLID, "You need Metamod-P or Metamod-1.18 to use AMX Mod X %s!", AMX_VERSION);
return (FALSE); return (FALSE);
} }
gpMetaGlobals=pMGlobals; gpMetaGlobals=pMGlobals;
gMetaFunctionTable.pfnGetEntityAPI2 = GetEntityAPI2; gMetaFunctionTable.pfnGetEntityAPI2 = GetEntityAPI2;
gMetaFunctionTable.pfnGetEntityAPI2_Post = GetEntityAPI2_Post; gMetaFunctionTable.pfnGetEntityAPI2_Post = GetEntityAPI2_Post;
gMetaFunctionTable.pfnGetEngineFunctions = GetEngineFunctions; gMetaFunctionTable.pfnGetEngineFunctions = GetEngineFunctions;
gMetaFunctionTable.pfnGetEngineFunctions_Post = GetEngineFunctions_Post; gMetaFunctionTable.pfnGetEngineFunctions_Post = GetEngineFunctions_Post;
gMetaFunctionTable.pfnGetNewDLLFunctions = GetNewDLLFunctions; gMetaFunctionTable.pfnGetNewDLLFunctions = GetNewDLLFunctions;
#ifdef FAKEMETA #ifdef FAKEMETA
gMetaFunctionTable.pfnGetNewDLLFunctions_Post = GetNewDLLFunctions_Post; gMetaFunctionTable.pfnGetNewDLLFunctions_Post = GetNewDLLFunctions_Post;
#endif #endif
@ -1158,9 +1221,11 @@ C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, m
GET_GAME_DIR(gameDir); GET_GAME_DIR(gameDir);
char *a = gameDir; char *a = gameDir;
int i = 0; int i = 0;
while (gameDir[i]) while (gameDir[i])
if (gameDir[i++] == '/') if (gameDir[i++] == '/')
a = &gameDir[i]; a = &gameDir[i];
g_mod_name.assign(a); g_mod_name.assign(a);
if (g_mod_name.compare("cstrike") == 0 || if (g_mod_name.compare("cstrike") == 0 ||
@ -1180,9 +1245,12 @@ C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, m
Vault amx_config; Vault amx_config;
amx_config.setSource(build_pathname("%s", get_localinfo("amxx_cfg", "addons/amxmodx/configs/core.ini"))); amx_config.setSource(build_pathname("%s", get_localinfo("amxx_cfg", "addons/amxmodx/configs/core.ini")));
if ( amx_config.loadVault() ){ if (amx_config.loadVault())
{
Vault::iterator a = amx_config.begin(); Vault::iterator a = amx_config.begin();
while ( a != amx_config.end() ) {
while (a != amx_config.end())
{
SET_LOCALINFO((char*)a.key().c_str(), (char*)a.value().c_str()); SET_LOCALINFO((char*)a.key().c_str(), (char*)a.value().c_str());
++a; ++a;
} }
@ -1199,11 +1267,14 @@ C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, m
return (TRUE); return (TRUE);
} }
C_DLLEXPORT int Meta_Detach(PLUG_LOADTIME now, PL_UNLOAD_REASON reason) { C_DLLEXPORT int Meta_Detach(PLUG_LOADTIME now, PL_UNLOAD_REASON reason)
if(now > Plugin_info.unloadable && reason != PNL_CMD_FORCED) { {
if (now > Plugin_info.unloadable && reason != PNL_CMD_FORCED)
{
LOG_ERROR(PLID, "Can't unload plugin right now"); LOG_ERROR(PLID, "Can't unload plugin right now");
return (FALSE); return (FALSE);
} }
g_auth.clear(); g_auth.clear();
g_forwards.clear(); g_forwards.clear();
g_commands.clear(); g_commands.clear();
@ -1238,8 +1309,8 @@ C_DLLEXPORT int Meta_Detach(PLUG_LOADTIME now, PL_UNLOAD_REASON reason) {
#ifdef __linux__ #ifdef __linux__
// linux prototype // linux prototype
C_DLLEXPORT void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) { C_DLLEXPORT void GiveFnptrsToDll(enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals)
{
#else #else
#ifdef _MSC_VER #ifdef _MSC_VER
// MSVC: Simulate __stdcall calling convention // MSVC: Simulate __stdcall calling convention
@ -1314,7 +1385,8 @@ C_DLLEXPORT void __stdcall GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine,
} }
DLL_FUNCTIONS gFunctionTable; DLL_FUNCTIONS gFunctionTable;
C_DLLEXPORT int GetEntityAPI2( DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion ){ C_DLLEXPORT int GetEntityAPI2(DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion)
{
gFunctionTable.pfnSpawn = C_Spawn; gFunctionTable.pfnSpawn = C_Spawn;
gFunctionTable.pfnClientCommand = C_ClientCommand; gFunctionTable.pfnClientCommand = C_ClientCommand;
gFunctionTable.pfnServerDeactivate = C_ServerDeactivate; gFunctionTable.pfnServerDeactivate = C_ServerDeactivate;
@ -1331,7 +1403,8 @@ C_DLLEXPORT int GetEntityAPI2( DLL_FUNCTIONS *pFunctionTable, int *interfaceVers
} }
DLL_FUNCTIONS gFunctionTable_Post; DLL_FUNCTIONS gFunctionTable_Post;
C_DLLEXPORT int GetEntityAPI2_Post( DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion ) { C_DLLEXPORT int GetEntityAPI2_Post(DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion)
{
gFunctionTable_Post.pfnClientPutInServer = C_ClientPutInServer_Post; gFunctionTable_Post.pfnClientPutInServer = C_ClientPutInServer_Post;
gFunctionTable_Post.pfnClientUserInfoChanged = C_ClientUserInfoChanged_Post; gFunctionTable_Post.pfnClientUserInfoChanged = C_ClientUserInfoChanged_Post;
gFunctionTable_Post.pfnServerActivate = C_ServerActivate_Post; gFunctionTable_Post.pfnServerActivate = C_ServerActivate_Post;
@ -1348,20 +1421,17 @@ C_DLLEXPORT int GetEntityAPI2_Post( DLL_FUNCTIONS *pFunctionTable, int *interfac
} }
enginefuncs_t meta_engfuncs; enginefuncs_t meta_engfuncs;
C_DLLEXPORT int GetEngineFunctions(enginefuncs_t *pengfuncsFromEngine, int *interfaceVersion ) { C_DLLEXPORT int GetEngineFunctions(enginefuncs_t *pengfuncsFromEngine, int *interfaceVersion)
{
if (stricmp(g_mod_name.c_str(),"cstrike") == 0 || stricmp(g_mod_name.c_str(),"czero") == 0) if (stricmp(g_mod_name.c_str(),"cstrike") == 0 || stricmp(g_mod_name.c_str(),"czero") == 0)
{ {
meta_engfuncs.pfnSetModel = C_SetModel; meta_engfuncs.pfnSetModel = C_SetModel;
g_bmod_cstrike = true; g_bmod_cstrike = true;
} } else {
else
{
g_bmod_cstrike = false; g_bmod_cstrike = false;
g_bmod_dod = !stricmp(g_mod_name.c_str(),"dod"); g_bmod_dod = !stricmp(g_mod_name.c_str(),"dod");
} }
meta_engfuncs.pfnCmd_Argc = C_Cmd_Argc; meta_engfuncs.pfnCmd_Argc = C_Cmd_Argc;
meta_engfuncs.pfnCmd_Argv = C_Cmd_Argv; meta_engfuncs.pfnCmd_Argv = C_Cmd_Argv;
meta_engfuncs.pfnCmd_Args = C_Cmd_Args; meta_engfuncs.pfnCmd_Args = C_Cmd_Args;
@ -1378,7 +1448,8 @@ C_DLLEXPORT int GetEngineFunctions(enginefuncs_t *pengfuncsFromEngine, int *inte
} }
enginefuncs_t meta_engfuncs_post; enginefuncs_t meta_engfuncs_post;
C_DLLEXPORT int GetEngineFunctions_Post(enginefuncs_t *pengfuncsFromEngine, int *interfaceVersion ) { C_DLLEXPORT int GetEngineFunctions_Post(enginefuncs_t *pengfuncsFromEngine, int *interfaceVersion)
{
meta_engfuncs_post.pfnTraceLine = C_TraceLine_Post; meta_engfuncs_post.pfnTraceLine = C_TraceLine_Post;
meta_engfuncs_post.pfnMessageBegin = C_MessageBegin_Post; meta_engfuncs_post.pfnMessageBegin = C_MessageBegin_Post;
meta_engfuncs_post.pfnMessageEnd = C_MessageEnd_Post; meta_engfuncs_post.pfnMessageEnd = C_MessageEnd_Post;