From e72a36dd376cf712562e10d175fffa865757bc57 Mon Sep 17 00:00:00 2001 From: Pavol Marko Date: Thu, 4 Mar 2004 18:16:51 +0000 Subject: [PATCH] added central logging system, callfunc natives --- amxmodx/CEvent.cpp | 10 +- amxmodx/CEvent.h | 4 +- amxmodx/CLogEvent.cpp | 66 +++++------ amxmodx/CPlugin.cpp | 65 ++++++----- amxmodx/amxmod.cpp | 250 ++++++++++++++++++++++++++++++++++++++++-- amxmodx/amxmod.h | 62 ++++++----- amxmodx/meta_api.cpp | 91 +++++++-------- amxmodx/modules.cpp | 80 +++++++------- amxmodx/util.cpp | 117 +++++++++++++++----- 9 files changed, 519 insertions(+), 226 deletions(-) diff --git a/amxmodx/CEvent.cpp b/amxmodx/CEvent.cpp index 72e28386..46ed798d 100755 --- a/amxmodx/CEvent.cpp +++ b/amxmodx/CEvent.cpp @@ -328,7 +328,7 @@ void EventsMngr::parseValue(const char *sz) switch(condIter->second.type) { case '=': if (!strcmp(sz, condIter->second.sValue.c_str())) skip=true; break; - case '!': if (strcmp(sz, condIter->second.sValue.c_str())) skip=true; break; + case '!': if (!strstr(sz, condIter->second.sValue.c_str())) skip=true; break; case '&': if (strstr(sz, condIter->second.sValue.c_str())) skip=true; break; } if (skip) @@ -361,7 +361,7 @@ void EventsMngr::executeEvents() if ((err = amx_Exec((*iter)->m_Plugin->getAMX(), NULL, (*iter)->m_Func, 1, m_ParseVault.size() ? m_ParseVault[0].iValue : 0)) != AMX_ERR_NONE) { - print_srvconsole("[AMX] Run time error %d on line %ld (plugin \"%s\")\n", err, + UTIL_Log("[AMXX] Run time error %d on line %ld (plugin \"%s\")", err, (*iter)->m_Plugin->getAMX()->curline, (*iter)->m_Plugin->getName()); } } @@ -370,7 +370,7 @@ void EventsMngr::executeEvents() } catch( ... ) { - print_srvconsole( "[AMX] fatal error at event execution\n"); + UTIL_Log( "[AMXX] fatal error at event execution"); } #endif // #ifdef ENABLEEXEPTIONS } @@ -447,6 +447,7 @@ void EventsMngr::clearEvents(void) int EventsMngr::getEventId(const char* msg) { + // :TODO: Remove this somehow!!! :) const struct CS_Events { const char* name; @@ -459,6 +460,7 @@ int EventsMngr::getEventId(const char* msg) // { "CS_Restart" , CS_Restart }, { "" , CS_Null } }; + // if msg is a number, return it int pos = atoi(msg); if (pos != 0) @@ -469,6 +471,6 @@ int EventsMngr::getEventId(const char* msg) if ( !strcmp( table[ pos ].name , msg ) ) return table[ pos ].id; - // not found + // find the id of the message return pos = GET_USER_MSG_ID(PLID, msg , 0 ); } diff --git a/amxmodx/CEvent.h b/amxmodx/CEvent.h index 9e58a618..66f8d780 100755 --- a/amxmodx/CEvent.h +++ b/amxmodx/CEvent.h @@ -58,8 +58,6 @@ class EventsMngr MSG_STRING, }; -public: - enum CS_EventsIds { CS_Null = 0, @@ -69,6 +67,8 @@ public: // CS_Restart, }; +public: + class ClEvent { friend class EventsMngr; // events manager may access our private members diff --git a/amxmodx/CLogEvent.cpp b/amxmodx/CLogEvent.cpp index d49281f9..d7b17f9b 100755 --- a/amxmodx/CLogEvent.cpp +++ b/amxmodx/CLogEvent.cpp @@ -1,33 +1,33 @@ -/* AMX Mod X -* -* by the AMX Mod X Development Team -* originally developed by OLO -* -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of the GNU General Public License as published by the -* Free Software Foundation; either version 2 of the License, or (at -* your option) any later version. -* -* This program is distributed in the hope that it will be useful, but -* WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software Foundation, -* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -* -* In addition, as a special exception, the author gives permission to -* link the code of this program with the Half-Life Game Engine ("HL -* Engine") and Modified Game Libraries ("MODs") developed by Valve, -* L.L.C ("Valve"). You must obey the GNU General Public License in all -* respects for all of the code used other than the HL Engine and MODs -* from Valve. If you modify this file, you may extend this exception -* to your version of the file, but you are not obligated to do so. If -* you do not wish to do so, delete this exception statement from your -* version. -*/ +/* + * Copyright (c) 2002-2003 Aleksander Naszko + * + * This file is part of AMX Mod. + * + * AMX Mod is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * AMX Mod is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with AMX Mod; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, the author gives permission to + * link the code of this program with the Half-Life Game Engine ("HL + * Engine") and Modified Game Libraries ("MODs") developed by Valve, + * L.L.C ("Valve"). You must obey the GNU General Public License in all + * respects for all of the code used other than the HL Engine and MODs + * from Valve. If you modify this file, you may extend this exception + * to your version of the file, but you are not obligated to do so. If + * you do not wish to do so, delete this exception statement from your + * version. + * + */ #include #include @@ -175,15 +175,15 @@ void LogEventsMngr::executeLogEvents() if (valid){ if ((err = amx_Exec(a->plugin->getAMX(), NULL , a->func , 0)) != AMX_ERR_NONE) - print_srvconsole("[AMX] Run time error %d on line %ld (plugin \"%s\")\n", - err,a->plugin->getAMX()->curline,a->plugin->getName()); + UTIL_Log("[AMXX] Run time error %d on line %ld (plugin \"%s\")", + err,a->plugin->getAMX()->curline,a->plugin->getName()); } #ifdef ENABLEEXEPTIONS } catch( ... ) { - print_srvconsole( "[AMX] fatal error at log forward function execution\n"); + UTIL_Log( "[AMXX] fatal error at log forward function execution"); } #endif diff --git a/amxmodx/CPlugin.cpp b/amxmodx/CPlugin.cpp index 79efea55..7e78b407 100755 --- a/amxmodx/CPlugin.cpp +++ b/amxmodx/CPlugin.cpp @@ -1,34 +1,33 @@ -/* AMX Mod X -* -* by the AMX Mod X Development Team -* originally developed by OLO -* -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of the GNU General Public License as published by the -* Free Software Foundation; either version 2 of the License, or (at -* your option) any later version. -* -* This program is distributed in the hope that it will be useful, but -* WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software Foundation, -* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -* -* In addition, as a special exception, the author gives permission to -* link the code of this program with the Half-Life Game Engine ("HL -* Engine") and Modified Game Libraries ("MODs") developed by Valve, -* L.L.C ("Valve"). You must obey the GNU General Public License in all -* respects for all of the code used other than the HL Engine and MODs -* from Valve. If you modify this file, you may extend this exception -* to your version of the file, but you are not obligated to do so. If -* you do not wish to do so, delete this exception statement from your -* version. -*/ - +/* + * Copyright (c) 2002-2003 Aleksander Naszko + * + * This file is part of AMX Mod. + * + * AMX Mod is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * AMX Mod is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with AMX Mod; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, the author gives permission to + * link the code of this program with the Half-Life Game Engine ("HL + * Engine") and Modified Game Libraries ("MODs") developed by Valve, + * L.L.C ("Valve"). You must obey the GNU General Public License in all + * respects for all of the code used other than the HL Engine and MODs + * from Valve. If you modify this file, you may extend this exception + * to your version of the file, but you are not obligated to do so. If + * you do not wish to do so, delete this exception statement from your + * version. + * + */ #include #include #include "amxmod.h" @@ -56,7 +55,7 @@ int CPluginMngr::loadPluginsFromFile( const char* filename ) if ( !fp ) { - print_srvconsole( "[AMX] Plugins list not found (file \"%s\")\n",filename); + UTIL_Log( "[AMXX] Plugins list not found (file \"%s\")",filename); return 1; } @@ -111,7 +110,7 @@ int CPluginMngr::loadPluginsFromFile( const char* filename ) } else { - print_srvconsole("[AMX] %s (plugin \"%s\")\n", error, pluginName ); + UTIL_Log("[AMXX] %s (plugin \"%s\")", error, pluginName ); } } diff --git a/amxmodx/amxmod.cpp b/amxmodx/amxmod.cpp index d92f20bb..a91a195e 100755 --- a/amxmodx/amxmod.cpp +++ b/amxmodx/amxmod.cpp @@ -646,7 +646,7 @@ static cell AMX_NATIVE_CALL register_menucmd(AMX *amx, cell *params) /* 3 param char* sptemp = get_amxstring(amx,params[3],0,ilen); if(amx_FindPublic(amx, sptemp ,&idx)!=AMX_ERR_NONE) { - print_srvconsole("[AMX] Function is not present (function \"%s\") (plugin \"%s\")\n",sptemp,plugin->getName() ); + UTIL_Log("[AMXX] Function is not present (function \"%s\") (plugin \"%s\")",sptemp,plugin->getName() ); amx_RaiseError(amx,AMX_ERR_NATIVE); return 0; } @@ -689,7 +689,7 @@ static cell AMX_NATIVE_CALL register_concmd(AMX *amx, cell *params) /* 4 param * int i, idx = 0; char* temp = get_amxstring(amx,params[2],0, i ); if(amx_FindPublic(amx, temp ,&idx)!=AMX_ERR_NONE) { - print_srvconsole("[AMX] Function is not present (function \"%s\") (plugin \"%s\")\n",temp,plugin->getName() ); + UTIL_Log("[AMXX] Function is not present (function \"%s\") (plugin \"%s\")",temp,plugin->getName() ); amx_RaiseError(amx,AMX_ERR_NATIVE); return 0; } @@ -716,7 +716,7 @@ static cell AMX_NATIVE_CALL register_clcmd(AMX *amx, cell *params) /* 4 param */ int i, idx = 0; char* temp = get_amxstring(amx,params[2],0, i ); if(amx_FindPublic(amx, temp ,&idx)!=AMX_ERR_NONE) { - print_srvconsole("[AMX] Function is not present (function \"%s\") (plugin \"%s\")\n",temp,plugin->getName() ); + UTIL_Log("[AMXX] Function is not present (function \"%s\") (plugin \"%s\")",temp,plugin->getName() ); amx_RaiseError(amx,AMX_ERR_NATIVE); return 0; } @@ -741,7 +741,7 @@ static cell AMX_NATIVE_CALL register_srvcmd(AMX *amx, cell *params) /* 2 param * int i, idx = 0; char* temp = get_amxstring(amx,params[2],0, i ); if(amx_FindPublic(amx, temp ,&idx)!=AMX_ERR_NONE) { - print_srvconsole("[AMX] Function is not present (function \"%s\") (plugin \"%s\")\n",temp,plugin->getName() ); + UTIL_Log("[AMXX] Function is not present (function \"%s\") (plugin \"%s\")",temp,plugin->getName() ); amx_RaiseError(amx,AMX_ERR_NATIVE); return NULL; } @@ -835,7 +835,7 @@ static cell AMX_NATIVE_CALL register_event(AMX *amx, cell *params) /* 2 param */ char* sTemp = get_amxstring(amx,params[1],0,len); if ( (pos = g_events.getEventId( sTemp )) == 0 ) { - print_srvconsole("[AMX] Invalid event (name \"%s\") (plugin \"%s\")\n", sTemp , plugin->getName() ); + UTIL_Log("[AMXX] Invalid event (name \"%s\") (plugin \"%s\")", sTemp , plugin->getName() ); amx_RaiseError(amx,AMX_ERR_NATIVE); return 0; } @@ -843,7 +843,7 @@ static cell AMX_NATIVE_CALL register_event(AMX *amx, cell *params) /* 2 param */ sTemp = get_amxstring(amx,params[2],0,len); if ( amx_FindPublic(amx, sTemp , &iFunction) != AMX_ERR_NONE){ - print_srvconsole("[AMX] Function is not present (function \"%s\") (plugin \"%s\")\n",sTemp,plugin->getName() ); + UTIL_Log("[AMXX] Function is not present (function \"%s\") (plugin \"%s\")",sTemp,plugin->getName() ); amx_RaiseError(amx,AMX_ERR_NATIVE); return 0; } @@ -1498,7 +1498,7 @@ static cell AMX_NATIVE_CALL set_task(AMX *amx, cell *params) /* 2 param */ char* stemp = get_amxstring(amx,params[2],1, a ); if (amx_FindPublic(amx, stemp , &iFunc) != AMX_ERR_NONE){ - print_srvconsole("[AMX] Function is not present (function \"%s\") (plugin \"%s\")\n",stemp,plugin->getName() ); + UTIL_Log("[AMXX] Function is not present (function \"%s\") (plugin \"%s\")",stemp,plugin->getName() ); amx_RaiseError(amx,AMX_ERR_NATIVE); return 0; } @@ -1643,7 +1643,7 @@ static cell AMX_NATIVE_CALL pause(AMX *amx, cell *params) /* 3 param */ temp = get_amxstring(amx,params[2],0,ilen); int err, index; if ((err = amx_FindPublic( plugin->getAMX(), temp , &index) )!= AMX_ERR_NONE){ - print_srvconsole("[AMX] Function is not present (function \"%s\") (plugin \"%s\")\n", temp,plugin->getName() ); + UTIL_Log("[AMXX] Function is not present (function \"%s\") (plugin \"%s\")", temp,plugin->getName() ); return 0; } plugin->pauseFunction( index ); @@ -1685,7 +1685,7 @@ static cell AMX_NATIVE_CALL unpause(AMX *amx, cell *params) /* 3 param */ sptemp = get_amxstring(amx,params[2],0,ilen); int err, index; if ((err = amx_FindPublic(plugin->getAMX(), sptemp , &index) )!= AMX_ERR_NONE){ - print_srvconsole("[AMX] Function is not present (function \"%s\") (plugin \"%s\")\n", sptemp,plugin->getName() ); + UTIL_Log("[AMXX] Function is not present (function \"%s\") (plugin \"%s\")", sptemp,plugin->getName() ); return 0; } plugin->unpauseFunction( index ); @@ -2041,7 +2041,7 @@ static cell AMX_NATIVE_CALL register_logevent(AMX *amx, cell *params) char* temp = get_amxstring(amx,params[1],0, a ); if (amx_FindPublic(amx, temp , &iFunc) != AMX_ERR_NONE){ - print_srvconsole("[AMX] Function is not present (function \"%s\") (plugin \"%s\")\n", + UTIL_Log("[AMXX] Function is not present (function \"%s\") (plugin \"%s\")", temp,plugin->getName() ); amx_RaiseError(amx,AMX_ERR_NATIVE); return 0; @@ -2116,6 +2116,228 @@ static cell AMX_NATIVE_CALL get_module(AMX *amx, cell *params) return params[1]; } +// native log_amx(const msg[], ...); +static cell AMX_NATIVE_CALL log_amx(AMX *amx, cell *params) +{ + CPluginMngr::CPlugin *plugin = g_plugins.findPluginFast(amx); + int len; + UTIL_Log("[%s] %s", plugin->getName(), format_amxstring(amx, params, 1, len)); + return 0; +} + +/*********************************************************************/ +CPluginMngr::CPlugin *g_CallFunc_Plugin = NULL; // The plugin +int g_CallFunc_Func = 0; // The func + +struct CallFunc_ParamInfo +{ + unsigned char flags; // flags + cell byrefAddr; // byref address in caller plugin + cell size; // byref size +}; + +// :TODO: Overflow possible +#define CALLFUNC_MAXPARAMS 64 /* Maximal params number */ +cell g_CallFunc_Params[CALLFUNC_MAXPARAMS] = {0}; // Params +CallFunc_ParamInfo g_CallFunc_ParamInfo[CALLFUNC_MAXPARAMS] = {0}; // Flags +int g_CallFunc_CurParam = 0; // Current param id + +#define CALLFUNC_FLAG_BYREF 1 /* Byref flag so that mem is released */ + + +// native callfunc_begin(const plugin[], const func[]); +static cell AMX_NATIVE_CALL callfunc_begin(AMX *amx, cell *params) +{ + CPluginMngr::CPlugin *curPlugin = g_plugins.findPluginFast(amx); + if (g_CallFunc_Plugin) + { + // scripter's fault + UTIL_Log("[AMXX] callfunc_begin called without callfunc_end (plugin \"%s\", line %d)", curPlugin->getName(), amx->curline); + amx_RaiseError(amx, AMX_ERR_NATIVE); + return 0; + } + + int numparams = *params / sizeof(cell); + int len; + char *pluginStr = get_amxstring(amx, params[1], 0, len); + char *funcStr = get_amxstring(amx, params[2], 1, len); + CPluginMngr::CPlugin *plugin = NULL; + if (!pluginStr || !*pluginStr) + plugin = curPlugin; + else + plugin = g_plugins.findPlugin(pluginStr); + + if (!plugin) + { + return -1; // plugin not found: -1 + } + + int func; + if (amx_FindPublic(plugin->getAMX(), funcStr, &func) != AMX_ERR_NONE) + { + return -2; // func not found: -2 + } + + // set globals + g_CallFunc_Plugin = plugin; + g_CallFunc_Func = func; + + return 1; // success: 1 +} + +// native callfunc_end(); +static cell AMX_NATIVE_CALL callfunc_end(AMX *amx, cell *params) +{ + CPluginMngr::CPlugin *curPlugin = g_plugins.findPluginFast(amx); + if (!g_CallFunc_Plugin) + { + // scripter's fault + UTIL_Log("[AMXX] callfunc_end called without callfunc_begin (plugin \"%s\", line %d)", curPlugin->getName(), amx->curline); + amx_RaiseError(amx, AMX_ERR_NATIVE); + return 0; + } + + // call the func + cell retVal; + int err; + + // copy the globs so the called func can also use callfunc + cell gparams[CALLFUNC_MAXPARAMS]; + CallFunc_ParamInfo gparamInfo[CALLFUNC_MAXPARAMS]; + + CPluginMngr::CPlugin *plugin = g_CallFunc_Plugin; + int func = g_CallFunc_Func; + int curParam = g_CallFunc_CurParam; + + memcpy(gparams, g_CallFunc_Params, sizeof(cell) * curParam); + memcpy(gparamInfo, g_CallFunc_ParamInfo, sizeof(CallFunc_ParamInfo) * curParam); + + // cleanup + g_CallFunc_Plugin = NULL; + g_CallFunc_CurParam = 0; + + // actual call + if ((err = amx_Execv(plugin->getAMX(), &retVal, func, curParam, gparams)) != AMX_ERR_NONE) + { + UTIL_Log("[AMXX] Run time error %d on line %ld (plugin \"%s\")", err, curPlugin->getAMX()->curline, curPlugin->getName()); + return 0; + } + + // process byref params + for (int i = 0; i < curParam; ++i) + { + if (gparamInfo[i].flags & CALLFUNC_FLAG_BYREF) + { + // copy back so that references work + AMX *amxCaller = curPlugin->getAMX(); + AMX *amxCalled = plugin->getAMX(); + AMX_HEADER *hdrCaller = (AMX_HEADER *)amxCaller->base; + AMX_HEADER *hdrCalled = (AMX_HEADER *)amxCalled->base; + memcpy( /** DEST ADDR **/ + (amxCaller->data ? amxCaller->data : (amxCaller->base + hdrCaller->dat)) + gparamInfo[i].byrefAddr, + /** SOURCE ADDR **/ + (amxCalled->data ? amxCalled->data : (amxCalled->base + hdrCalled->dat)) + gparams[i], + /** SIZE **/ + gparamInfo[i].size * sizeof(cell)); + + // free memory used for params passed by reference + amx_Release(amxCalled, gparams[i]); + } + } + + return retVal; +} + +// native callfunc_push_int(value); +// native callfunc_push_float(Float: value); +static cell callfunc_push_byval(AMX *amx, cell *params) +{ + CPluginMngr::CPlugin *curPlugin = g_plugins.findPluginFast(amx); + if (!g_CallFunc_Plugin) + { + // scripter's fault + UTIL_Log("[AMXX] callfunc_push_xxx called without callfunc_begin (plugin \"%s\", line %d)", curPlugin->getName(), amx->curline); + amx_RaiseError(amx, AMX_ERR_NATIVE); + return 0; + } + + g_CallFunc_ParamInfo[g_CallFunc_CurParam].flags = 0; + g_CallFunc_Params[g_CallFunc_CurParam++] = params[1]; + + return 0; +} + +// native callfunc_push_intref(&value); +// native callfunc_push_floatref(Float: &value); +static cell callfunc_push_byref(AMX *amx, cell *params) +{ + CPluginMngr::CPlugin *curPlugin = g_plugins.findPluginFast(amx); + if (!g_CallFunc_Plugin) + { + // scripter's fault + UTIL_Log("[AMXX] callfunc_push_xxx called without callfunc_begin (plugin \"%s\", line %d)", curPlugin->getName(), amx->curline); + amx_RaiseError(amx, AMX_ERR_NATIVE); + return 0; + } + + // allocate memory + cell *phys_addr; + cell amx_addr; + amx_Allot(g_CallFunc_Plugin->getAMX(), + 1, // 1 cell + &amx_addr, + &phys_addr); + + // copy the value to the allocated memory + cell *phys_addr2; + amx_GetAddr(curPlugin->getAMX(), params[1], &phys_addr2); + *phys_addr = *phys_addr2; + + // push the address and set the reference flag so that memory is released after function call. + g_CallFunc_ParamInfo[g_CallFunc_CurParam].flags = CALLFUNC_FLAG_BYREF; + g_CallFunc_ParamInfo[g_CallFunc_CurParam].byrefAddr = params[1]; + g_CallFunc_ParamInfo[g_CallFunc_CurParam].size = 1; + g_CallFunc_Params[g_CallFunc_CurParam++] = amx_addr; + + return 0; +} + +// native callfunc_push_str(value[]); +static cell callfunc_push_str(AMX *amx, cell *params) +{ + CPluginMngr::CPlugin *curPlugin = g_plugins.findPluginFast(amx); + if (!g_CallFunc_Plugin) + { + // scripter's fault + UTIL_Log("[AMXX] callfunc_push_xxx called without callfunc_begin (plugin \"%s\", line %d)", curPlugin->getName(), amx->curline); + amx_RaiseError(amx, AMX_ERR_NATIVE); + return 0; + } + + // get the string and its length + int len; + char *str = get_amxstring(amx, params[1], 0, len); + // allocate enough memory for the string + cell *phys_addr; + cell amx_addr; + amx_Allot(g_CallFunc_Plugin->getAMX(), + len + 1, // length + terminator + &amx_addr, + &phys_addr); + + // copy it to the allocated memory + // we assume it's unpacked + amx_SetString(phys_addr, str, 0); + + // push the address and set the reference flag so that memory is released after function call. + g_CallFunc_ParamInfo[g_CallFunc_CurParam].flags = CALLFUNC_FLAG_BYREF; + g_CallFunc_ParamInfo[g_CallFunc_CurParam].byrefAddr = params[1]; + g_CallFunc_ParamInfo[g_CallFunc_CurParam].size = len + 1; + g_CallFunc_Params[g_CallFunc_CurParam++] = amx_addr; + + return 0; +} + AMX_NATIVE_INFO amxmod_Natives[] = { { "client_cmd", client_cmd }, { "client_print", client_print }, @@ -2256,5 +2478,13 @@ AMX_NATIVE_INFO amxmod_Natives[] = { { "is_plugin_loaded", is_plugin_loaded }, { "get_modulesnum", get_modulesnum }, { "get_module", get_module }, + { "log_amx", log_amx }, + { "callfunc_begin", callfunc_begin }, + { "callfunc_end", callfunc_end }, + { "callfunc_push_int", callfunc_push_byval }, + { "callfunc_push_str", callfunc_push_str }, + { "callfunc_push_float", callfunc_push_byval }, + { "callfunc_push_intrf", callfunc_push_byref }, + { "callfunc_push_floatrf", callfunc_push_byref }, { NULL, NULL } }; \ No newline at end of file diff --git a/amxmodx/amxmod.h b/amxmodx/amxmod.h index d2004f55..8be09d77 100755 --- a/amxmodx/amxmod.h +++ b/amxmodx/amxmod.h @@ -1,33 +1,33 @@ -/* AMX Mod X -* -* by the AMX Mod X Development Team -* originally developed by OLO -* -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of the GNU General Public License as published by the -* Free Software Foundation; either version 2 of the License, or (at -* your option) any later version. -* -* This program is distributed in the hope that it will be useful, but -* WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software Foundation, -* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -* -* In addition, as a special exception, the author gives permission to -* link the code of this program with the Half-Life Game Engine ("HL -* Engine") and Modified Game Libraries ("MODs") developed by Valve, -* L.L.C ("Valve"). You must obey the GNU General Public License in all -* respects for all of the code used other than the HL Engine and MODs -* from Valve. If you modify this file, you may extend this exception -* to your version of the file, but you are not obligated to do so. If -* you do not wish to do so, delete this exception statement from your -* version. -*/ +/* + * Copyright (c) 2002-2003 Aleksander Naszko + * + * This file is part of AMX Mod. + * + * AMX Mod is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * AMX Mod is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with AMX Mod; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, the author gives permission to + * link the code of this program with the Half-Life Game Engine ("HL + * Engine") and Modified Game Libraries ("MODs") developed by Valve, + * L.L.C ("Valve"). You must obey the GNU General Public License in all + * respects for all of the code used other than the HL Engine and MODs + * from Valve. If you modify this file, you may extend this exception + * to your version of the file, but you are not obligated to do so. If + * you do not wish to do so, delete this exception statement from your + * version. + * + */ #ifndef AMXMOD_H #define AMXMOD_H @@ -100,6 +100,8 @@ void UTIL_HudMessage(edict_t *pEntity, const hudtextparms_t &textparms, char *pM void UTIL_IntToString(int value, char *output); void UTIL_ShowMOTD( edict_t *client , char *motd, int mlen, const char *name); void UTIL_ShowMenu( edict_t* pEntity, int slots, int time, char *menu, int mlen ); +void UTIL_MakeNewLogFile(); +void UTIL_Log(const char *fmt, ...); #define GET_PLAYER_POINTER(e) (&g_players[ENTINDEX(e)]) //#define GET_PLAYER_POINTER(e) (&g_players[(((int)e-g_edict_point)/sizeof(edict_t ))]) diff --git a/amxmodx/meta_api.cpp b/amxmodx/meta_api.cpp index dc85c612..06c4105a 100755 --- a/amxmodx/meta_api.cpp +++ b/amxmodx/meta_api.cpp @@ -1,32 +1,32 @@ -/* AMX Mod X +/* +* Copyright (c) 2002-2003 Aleksander Naszko * -* by the AMX Mod X Development Team -* originally developed by OLO +* This file is part of AMX Mod. * +* AMX Mod is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License as published by the +* Free Software Foundation; either version 2 of the License, or (at +* your option) any later version. * -* This program is free software; you can redistribute it and/or modify it -* under the terms of the GNU General Public License as published by the -* Free Software Foundation; either version 2 of the License, or (at -* your option) any later version. +* AMX Mod is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* General Public License for more details. * -* This program is distributed in the hope that it will be useful, but -* WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* General Public License for more details. +* You should have received a copy of the GNU General Public License +* along with AMX Mod; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software Foundation, -* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. * -* In addition, as a special exception, the author gives permission to -* link the code of this program with the Half-Life Game Engine ("HL -* Engine") and Modified Game Libraries ("MODs") developed by Valve, -* L.L.C ("Valve"). You must obey the GNU General Public License in all -* respects for all of the code used other than the HL Engine and MODs -* from Valve. If you modify this file, you may extend this exception -* to your version of the file, but you are not obligated to do so. If -* you do not wish to do so, delete this exception statement from your -* version. */ #include @@ -39,8 +39,8 @@ plugin_info_t Plugin_info = { AMX_VERSION, // version __DATE__, // date "AMX Mod X Dev Team", // author - "http://www.amxmodx.org", // url - "AMXX", // logtag + "http://www.amxmod.info", // url + "AMX", // logtag PT_ANYTIME,// (when) loadable PT_ANYTIME,// (when) unloadable }; @@ -154,14 +154,14 @@ int InconsistentFile( const edict_t *player, const char *filename, char *disconn cell amx_addr2, *phys_addr2; if ((amx_Allot(c, 64 , &amx_addr1, &phys_addr1) != AMX_ERR_NONE) || (amx_Allot(c, 64 , &amx_addr2, &phys_addr2) != AMX_ERR_NONE) ){ - print_srvconsole("[AMX] Failed to allocate AMX memory (plugin \"%s\")\n",(*a).getPlugin()->getName()); + UTIL_Log("[AMXX] Failed to allocate AMX memory (plugin \"%s\")",(*a).getPlugin()->getName()); } else { int err; set_amxstring(c,amx_addr1,filename,63); set_amxstring(c,amx_addr2,disconnect_message,63); if ((err = amx_Exec(c,&ret, (*a).getFunction() , 3, pPlayer->index, amx_addr1, amx_addr2)) != AMX_ERR_NONE) - print_srvconsole("[AMX] Run time error %d on line %ld (plugin \"%s\")\n", + UTIL_Log("[AMXX] Run time error %d on line %ld (plugin \"%s\")", err,c->curline,(*a).getPlugin()->getName()); int len; strcpy(disconnect_message,get_amxstring(c,amx_addr2,0,len)); @@ -177,7 +177,7 @@ int InconsistentFile( const edict_t *player, const char *filename, char *disconn #ifdef ENABLEEXEPTIONS }catch( ... ) { - print_srvconsole( "[AMX] fatal error at inconsistent file forward execution\n"); + UTIL_Log( "[AMXX] fatal error at inconsistent file forward execution"); } #endif @@ -212,6 +212,10 @@ int Spawn( edict_t *pent ) { hostname = CVAR_GET_POINTER("hostname"); mp_timelimit = CVAR_GET_POINTER("mp_timelimit"); + // ###### Initialize logging] + g_log_dir.set( get_localinfo("amx_logdir" , "addons/amx/logs" ) ); + UTIL_MakeNewLogFile(); + // ###### Initialize task manager g_tasksMngr.registerTimers( &gpGlobals->time, &mp_timelimit->value, &g_game_timeleft ); @@ -255,9 +259,6 @@ int Spawn( edict_t *pent ) { CVAR_SET_STRING( "amxmodx_version", AMX_VERSION ); } - // ###### Save log dir - g_log_dir.set( get_localinfo("amx_logdir" , "addons/amx/logs" ) ); - // ###### Load Vault g_vault.setSource( build_pathname("%s", get_localinfo("amx_vault" , "addons/amx/vault.ini" ) ) ); @@ -439,6 +440,8 @@ void ServerDeactivate_Post() { g_xvars.clear(); g_plugins.clear(); + UTIL_Log("Log file closed."); + RETURN_META(MRES_IGNORED); } @@ -537,7 +540,7 @@ void ClientCommand( edict_t *pEntity ) { { if ((err = amx_Exec((*a).getPlugin()->getAMX(), &ret , (*a).getFunction(), 1, pPlayer->index)) != AMX_ERR_NONE) - print_srvconsole("[AMX] Run time error %d on line %ld (plugin \"%s\")\n", + UTIL_Log("[AMXX] Run time error %d on line %ld (plugin \"%s\")", err,(*a).getPlugin()->getAMX()->curline,(*a).getPlugin()->getName() ); if ( ret & 2 ) result = MRES_SUPERCEDE; @@ -552,7 +555,7 @@ void ClientCommand( edict_t *pEntity ) { #ifdef ENABLEEXEPTIONS }catch( ... ) { - print_srvconsole( "[AMX] fatal error at commmand forward execution\n"); + UTIL_Log( "[AMXX] fatal error at commmand forward execution"); } #endif @@ -575,7 +578,7 @@ void ClientCommand( edict_t *pEntity ) { { if ((err =amx_Exec((*aa).getPlugin()->getAMX(), &ret , (*aa).getFunction() , 3, pPlayer->index, (*aa).getFlags(),(*aa).getId() )) != AMX_ERR_NONE) - print_srvconsole("[AMX] Run time error %d on line %ld (plugin \"%s\")\n", + UTIL_Log("[AMXX] Run time error %d on line %ld (plugin \"%s\")", err,(*aa).getPlugin()->getAMX()->curline,(*aa).getPlugin()->getName()); if ( ret & 2 ) result = MRES_SUPERCEDE; @@ -588,7 +591,7 @@ void ClientCommand( edict_t *pEntity ) { #ifdef ENABLEEXEPTIONS }catch( ... ) { - print_srvconsole( "[AMX] fatal error at client commmand execution\n"); + UTIL_Log( "[AMXX] fatal error at client commmand execution"); } #endif /* check menu commands */ @@ -615,7 +618,7 @@ void ClientCommand( edict_t *pEntity ) { { if ( ( err = amx_Exec((*a).getPlugin()->getAMX(), &ret ,(*a).getFunction() , 2, pPlayer->index,pressed_key)) != AMX_ERR_NONE) - print_srvconsole("[AMX] Run time error %d on line %ld (plugin \"%s\")\n", + UTIL_Log("[AMXX] Run time error %d on line %ld (plugin \"%s\")", err,(*a).getPlugin()->getAMX()->curline,(*a).getPlugin()->getName()); if ( ret & 2 ) result = MRES_SUPERCEDE; @@ -629,7 +632,7 @@ void ClientCommand( edict_t *pEntity ) { } catch( ... ) { - print_srvconsole( "[AMX] fatal error at menu commmand execution\n"); + UTIL_Log( "[AMXX] fatal error at menu commmand execution"); } #endif } @@ -690,14 +693,14 @@ void StartFrame_Post( void ) { if (amx_Allot(plugin->getAMX(), task.getParamLen() , &amx_addr, &phys_addr) != AMX_ERR_NONE) { - print_srvconsole("[AMX] Failed to allocate AMX memory (task \"%d\") (plugin \"%s\")\n", task.getTaskId(),plugin->getName()); + UTIL_Log("[AMXX] Failed to allocate AMX memory (task \"%d\") (plugin \"%s\")", task.getTaskId(),plugin->getName()); } else { copy_amxmemory(phys_addr, task.getParam() , task.getParamLen() ); if ((err = amx_Exec(plugin->getAMX(),NULL, task.getFunction() , 2, amx_addr, task.getTaskId() )) != AMX_ERR_NONE) - print_srvconsole("[AMX] Run time error %d on line %ld (task \"%d\") (plugin \"%s\")\n", err,plugin->getAMX()->curline,task.getTaskId(),plugin->getName()); + UTIL_Log("[AMXX] Run time error %d on line %ld (task \"%d\") (plugin \"%s\")", err,plugin->getAMX()->curline,task.getTaskId(),plugin->getName()); amx_Release(plugin->getAMX(), amx_addr); } @@ -705,7 +708,7 @@ void StartFrame_Post( void ) { else // call without arguments { if ((err = amx_Exec(plugin->getAMX(),NULL, task.getFunction() ,1, task.getTaskId() )) != AMX_ERR_NONE) - print_srvconsole("[AMX] Run time error %d on line %ld (task \"%d\") (plugin \"%s\")\n", err,plugin->getAMX()->curline,task.getTaskId(),plugin->getName()); + UTIL_Log("[AMXX] Run time error %d on line %ld (task \"%d\") (plugin \"%s\")", err,plugin->getAMX()->curline,task.getTaskId(),plugin->getName()); } } } @@ -802,7 +805,7 @@ void MessageEnd_Post(void) { { if ((err = amx_Exec((*a).getPlugin()->getAMX(), NULL , (*a).getFunction() , 1, mPlayerIndex /*g_events.getArgInteger(0)*/ )) != AMX_ERR_NONE) - print_srvconsole("[AMX] Run time error %d on line %ld (plugin \"%s\")\n",err,(*a).getPlugin()->getAMX()->curline,(*a).getPlugin()->getName()); + UTIL_Log("[AMXX] Run time error %d on line %ld (plugin \"%s\")",err,(*a).getPlugin()->getAMX()->curline,(*a).getPlugin()->getName()); ++a; @@ -813,7 +816,7 @@ void MessageEnd_Post(void) { } catch( ... ) { - print_srvconsole( "[AMX] fatal error at event execution\n"); + UTIL_Log( "[AMXX] fatal error at event execution"); } #endif #endif @@ -889,7 +892,7 @@ void AlertMessage_Post(ALERT_TYPE atype, char *szFmt, ...) { while ( a ) { if ((err = amx_Exec((*a).getPlugin()->getAMX(), NULL , (*a).getFunction() , 1,mPlayerIndex)) != AMX_ERR_NONE) - print_srvconsole("[AMX] Run time error %d on line %ld (plugin \"%s\")\n",err,(*a).getPlugin()->getAMX()->curline,(*a).getPlugin()->getName()); + UTIL_Log("[AMXX] Run time error %d on line %ld (plugin \"%s\")",err,(*a).getPlugin()->getAMX()->curline,(*a).getPlugin()->getName()); ++a; @@ -899,7 +902,7 @@ void AlertMessage_Post(ALERT_TYPE atype, char *szFmt, ...) { } catch( ... ) { - print_srvconsole( "[AMX] fatal error at log event execution\n"); + UTIL_Log( "[AMXX] fatal error at log event execution"); } #endif #endif diff --git a/amxmodx/modules.cpp b/amxmodx/modules.cpp index 75bef3fe..259107c8 100755 --- a/amxmodx/modules.cpp +++ b/amxmodx/modules.cpp @@ -1,33 +1,33 @@ -/* AMX Mod X -* -* by the AMX Mod X Development Team -* originally developed by OLO -* -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of the GNU General Public License as published by the -* Free Software Foundation; either version 2 of the License, or (at -* your option) any later version. -* -* This program is distributed in the hope that it will be useful, but -* WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software Foundation, -* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -* -* In addition, as a special exception, the author gives permission to -* link the code of this program with the Half-Life Game Engine ("HL -* Engine") and Modified Game Libraries ("MODs") developed by Valve, -* L.L.C ("Valve"). You must obey the GNU General Public License in all -* respects for all of the code used other than the HL Engine and MODs -* from Valve. If you modify this file, you may extend this exception -* to your version of the file, but you are not obligated to do so. If -* you do not wish to do so, delete this exception statement from your -* version. -*/ +/* + * Copyright (c) 2002-2003 Aleksander Naszko + * + * This file is part of AMX Mod. + * + * AMX Mod is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * AMX Mod is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with AMX Mod; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, the author gives permission to + * link the code of this program with the Half-Life Game Engine ("HL + * Engine") and Modified Game Libraries ("MODs") developed by Valve, + * L.L.C ("Valve"). You must obey the GNU General Public License in all + * respects for all of the code used other than the HL Engine and MODs + * from Valve. If you modify this file, you may extend this exception + * to your version of the file, but you are not obligated to do so. If + * you do not wish to do so, delete this exception statement from your + * version. + * + */ #include #include @@ -59,8 +59,8 @@ void report_error( int code, char* fmt, ... ) //File fp( "error_amx.log","a" ); //fp << string; print_srvconsole( string ); - print_srvconsole("[AMX] Make sure that modules are compatible with AMX Mod X %s\n" , AMX_VERSION ); - print_srvconsole("[AMX] Please fix the problem then start the server again\n" ); + UTIL_Log("[AMXX] Make sure that modules are compatible with AMX Mod X %s" , AMX_VERSION ); + UTIL_Log("[AMXX] Please fix the problem then start the server again" ); } sleep( 5 ); exit( code ); @@ -322,7 +322,7 @@ int loadModules(const char* filename) if ( !fp ) { - print_srvconsole( "[AMX] Modules list not found (file \"%s\")\n",filename); + UTIL_Log( "[AMXX] Modules list not found (file \"%s\")",filename); return 0; } @@ -351,19 +351,19 @@ int loadModules(const char* filename) switch( cc->getStatusValue() ) { case MODULE_BADLOAD: - report_error( 1 , "[AMX] Module is not a valid library (file \"%s\")\n",pathname ); + report_error( 1 , "[AMXX] Module is not a valid library (file \"%s\")",pathname ); break; case MODULE_NOINFO: - report_error( 1 ,"[AMX] Couldn't find info. about module (file \"%s\")\n",pathname ); + report_error( 1 ,"[AMXX] Couldn't find info. about module (file \"%s\")",pathname ); break; case MODULE_NOQUERY: - report_error( 1 , "[AMX] Couldn't find \"AMX_Query\" (file \"%s\")\n", pathname ); + report_error( 1 , "[AMXX] Couldn't find \"AMX_Query\" (file \"%s\")", pathname ); break; case MODULE_NOATTACH: - report_error( 1 , "[AMX] Couldn't find \"AMX_Attach\" (file \"%s\")\n", pathname ); + report_error( 1 , "[AMXX] Couldn't find \"AMX_Attach\" (file \"%s\")", pathname ); break; case MODULE_OLD: - report_error( 1 , "[AMX] Module has a different interface version (file \"%s\")\n",pathname ); + report_error( 1 , "[AMXX] Module has a different interface version (file \"%s\")",pathname ); break; default: ++loaded; @@ -436,7 +436,7 @@ void dettachMetaModModules( const char* filename ) if ( !fp ) { - print_srvconsole( "[AMX] Modules list not found (file \"%s\")\n",filename); + UTIL_Log( "[AMXX] Modules list not found (file \"%s\")",filename); return; } @@ -477,7 +477,7 @@ void attachMetaModModules( const char* filename ) if ( !fp ) { - print_srvconsole( "[AMX] Modules list not found (file \"%s\")\n",filename); + UTIL_Log( "[AMXX] Modules list not found (file \"%s\")",filename); return; } diff --git a/amxmodx/util.cpp b/amxmodx/util.cpp index 6bf12cd8..4e6e15f4 100755 --- a/amxmodx/util.cpp +++ b/amxmodx/util.cpp @@ -1,36 +1,38 @@ -/* AMX Mod X -* -* by the AMX Mod X Development Team -* originally developed by OLO -* -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of the GNU General Public License as published by the -* Free Software Foundation; either version 2 of the License, or (at -* your option) any later version. -* -* This program is distributed in the hope that it will be useful, but -* WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software Foundation, -* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -* -* In addition, as a special exception, the author gives permission to -* link the code of this program with the Half-Life Game Engine ("HL -* Engine") and Modified Game Libraries ("MODs") developed by Valve, -* L.L.C ("Valve"). You must obey the GNU General Public License in all -* respects for all of the code used other than the HL Engine and MODs -* from Valve. If you modify this file, you may extend this exception -* to your version of the file, but you are not obligated to do so. If -* you do not wish to do so, delete this exception statement from your -* version. -*/ +/* + * Copyright (c) 2002-2003 Aleksander Naszko + * + * This file is part of AMX Mod. + * + * AMX Mod is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * AMX Mod is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with AMX Mod; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, the author gives permission to + * link the code of this program with the Half-Life Game Engine ("HL + * Engine") and Modified Game Libraries ("MODs") developed by Valve, + * L.L.C ("Valve"). You must obey the GNU General Public License in all + * respects for all of the code used other than the HL Engine and MODs + * from Valve. If you modify this file, you may extend this exception + * to your version of the file, but you are not obligated to do so. If + * you do not wish to do so, delete this exception statement from your + * version. + * + */ #include #include +#include + #include "amxmod.h" int UTIL_ReadFlags(const char* c) @@ -268,4 +270,59 @@ void UTIL_FakeClientCommand(edict_t *pEdict, const char *cmd, const char *arg1, g_fakecmd.fake = true; MDLL_ClientCommand(pEdict); g_fakecmd.fake = false; +} + +std::string g_UTIL_LogFile; + +void UTIL_MakeNewLogFile() +{ + // build filename + + time_t td; + time(&td); + tm *curTime = localtime(&td); + + // create dir if not existing + mkdir(build_pathname("%s", g_log_dir.str())); + + int i = 0; + while (true) + { + g_UTIL_LogFile = build_pathname("%s/L%02d%02d%03d.log", g_log_dir.str(), curTime->tm_mon + 1, curTime->tm_mday, i); + FILE *pTmpFile = fopen(g_UTIL_LogFile.c_str(), "r"); // open for reading to check whether the file exists + if (!pTmpFile) + break; + fclose(pTmpFile); + ++i; + } + // Log logfile start + UTIL_Log("AMX Mod X log file started (file \"%s/L%02d%02d%03d.log\") (version \"%s\")", g_log_dir.str(), curTime->tm_mon + 1, curTime->tm_mday, i, AMX_VERSION); +} + +void UTIL_Log(const char *fmt, ...) +{ + // build message + // :TODO: Overflow possible here + char msg[3072]; + va_list arglst; + va_start(arglst, fmt); + vsprintf(msg, fmt, arglst); + va_end(arglst); + + // get time + time_t td; + time(&td); + tm *curTime = localtime(&td); + + char date[32]; + strftime(date, 31, "%m/%d/%Y - %H:%M:%S", curTime); + + // log msg now + FILE *pF = fopen(g_UTIL_LogFile.c_str(), "a+"); + if (!pF) + return; // don't try to create a new logfile to prevent recursion crashes if there is an unforseen error + + fprintf(pF, "L %s: %s\n", date, msg); + fclose(pF); + print_srvconsole("L %s: %s\n", date, msg); } \ No newline at end of file