diff --git a/amxmodx/CMisc.cpp b/amxmodx/CMisc.cpp index de44d00f..4702f29b 100755 --- a/amxmodx/CMisc.cpp +++ b/amxmodx/CMisc.cpp @@ -48,7 +48,7 @@ void CPlayer::Init( edict_t* e , int i ) aiming = 0; menu = 0; keys = 0; - + death_weapon.clear(); name.clear(); ip.clear(); @@ -56,43 +56,45 @@ void CPlayer::Init( edict_t* e , int i ) } void CPlayer::Disconnect() { - ingame = false; - initialized = false; - authorized = false; + ingame = false; + initialized = false; + authorized = false; - while (!cvarQueryQueue.empty()) - { - ClientCvarQuery_Info *pQuery = cvarQueryQueue.front(); - unregisterSPForward(pQuery->resultFwd); - delete pQuery; - cvarQueryQueue.pop(); - } + while (!cvarQueryQueue.empty()) + { + ClientCvarQuery_Info *pQuery = cvarQueryQueue.front(); + unregisterSPForward(pQuery->resultFwd); + if (pQuery->params) + delete [] pQuery->params; + delete pQuery; + cvarQueryQueue.pop(); + } - bot = 0; + bot = 0; } void CPlayer::PutInServer() { - playtime = gpGlobals->time; - ingame = true; + playtime = gpGlobals->time; + ingame = true; } bool CPlayer::Connect(const char* connectname,const char* ipaddress) { - name.assign(connectname); - ip.assign(ipaddress); - time = gpGlobals->time; - bot = IsBot(); - death_killer = 0; - memset(flags,0,sizeof(flags)); - memset(weapons,0,sizeof(weapons)); - initialized = true; - authorized = false; + name.assign(connectname); + ip.assign(ipaddress); + time = gpGlobals->time; + bot = IsBot(); + death_killer = 0; + memset(flags,0,sizeof(flags)); + memset(weapons,0,sizeof(weapons)); + initialized = true; + authorized = false; - const char* authid = GETPLAYERAUTHID( pEdict ); + const char* authid = GETPLAYERAUTHID( pEdict ); - if ( (authid == 0) || (*authid == 0) - || (strcmp( authid , "STEAM_ID_PENDING") == 0) ) - return true; + if ( (authid == 0) || (*authid == 0) + || (strcmp( authid , "STEAM_ID_PENDING") == 0) ) + return true; - return false; + return false; } @@ -102,48 +104,48 @@ bool CPlayer::Connect(const char* connectname,const char* ipaddress) { // ***************************************************** void Grenades::put( edict_t* grenade, float time, int type, CPlayer* player ) { - Obj* a = new Obj; - if ( a == 0 ) return; - a->player = player; - a->grenade = grenade; - a->time = gpGlobals->time + time; - a->type = type; - a->next = head; - head = a; + Obj* a = new Obj; + if ( a == 0 ) return; + a->player = player; + a->grenade = grenade; + a->time = gpGlobals->time + time; + a->type = type; + a->next = head; + head = a; } bool Grenades::find( edict_t* enemy, CPlayer** p, int& type ) { - bool found = false; - Obj** a = &head; - while ( *a ){ - if ( (*a)->time > gpGlobals->time ) { - if ( (*a)->grenade == enemy ) { - found = true; - (*p) = (*a)->player; - type = (*a)->type; - } - } - else { - Obj* b = (*a)->next; - delete *a; - *a = b; + bool found = false; + Obj** a = &head; + while ( *a ){ + if ( (*a)->time > gpGlobals->time ) { + if ( (*a)->grenade == enemy ) { + found = true; + (*p) = (*a)->player; + type = (*a)->type; + } + } + else { + Obj* b = (*a)->next; + delete *a; + *a = b; - continue; + continue; - } - a = &(*a)->next; - } - return found; + } + a = &(*a)->next; + } + return found; } void Grenades::clear() { - while(head){ - Obj* a = head->next; - delete head; - head = a; - } + while(head){ + Obj* a = head->next; + delete head; + head = a; + } } // ***************************************************** @@ -158,17 +160,17 @@ void XVars::clear() { int XVars::put( AMX* p, cell* v ) { - for(int a = 0; a < num; ++a) { - if ( (head[a].amx == p) && (head[a].value == v) ) - return a; - } + for(int a = 0; a < num; ++a) { + if ( (head[a].amx == p) && (head[a].value == v) ) + return a; + } - if ( (num >= size) && realloc_array( size ? (size * 2) : 8 ) ) - return -1; + if ( (num >= size) && realloc_array( size ? (size * 2) : 8 ) ) + return -1; - head[num].value = v; - head[num].amx = p; - return num++; + head[num].value = v; + head[num].amx = p; + return num++; } int XVars::realloc_array( int nsize ) @@ -190,17 +192,17 @@ int XVars::realloc_array( int nsize ) // ***************************************************** TeamIds::TeamIds() { head = 0; newTeam = 0; } TeamIds::~TeamIds() { - while( head ) { + while( head ) { TeamEle* a = head->next; delete head; head = a; - } + } } void TeamIds::registerTeam( const char* n ,int s ) { - TeamEle** a = &head; - while( *a ){ + TeamEle** a = &head; + while( *a ){ if ( strcmp((*a)->name.c_str(),n) == 0 ){ if (s != -1){ (*a)->id = s; @@ -209,31 +211,31 @@ void TeamIds::registerTeam( const char* n ,int s ) return; } a = &(*a)->next; - } - *a = new TeamEle( n , s ); + } + *a = new TeamEle( n , s ); if ( *a == 0 ) return; - newTeam |= (1<<(*a)->tid); + newTeam |= (1<<(*a)->tid); } int TeamIds::findTeamId( const char* n ) { TeamEle* a = head; - while( a ){ + while( a ){ if ( !stricmp(a->name.c_str(),n) ) return a->id; a = a->next; - } + } return -1; } int TeamIds::findTeamIdCase( const char* n) { TeamEle* a = head; - while( a ){ + while( a ){ if ( !strcmp(a->name.c_str(), n) ) return a->id; a = a->next; - } + } return -1; } diff --git a/amxmodx/CMisc.h b/amxmodx/CMisc.h index 4ba3f510..4a321b2a 100755 --- a/amxmodx/CMisc.h +++ b/amxmodx/CMisc.h @@ -67,6 +67,9 @@ struct ClientCvarQuery_Info bool querying; // Are we actually waiting for a response at the moment? String cvarName; int resultFwd; + + int paramLen; + cell *params; }; class CPlayer diff --git a/amxmodx/amxmodx.cpp b/amxmodx/amxmodx.cpp index 69799ab5..ebe5564f 100755 --- a/amxmodx/amxmodx.cpp +++ b/amxmodx/amxmodx.cpp @@ -2928,6 +2928,13 @@ static cell AMX_NATIVE_CALL int3(AMX *amx, cell *params) // native query_client_cvar(id, const cvar[], const resultfunc[]) static cell AMX_NATIVE_CALL query_client_cvar(AMX *amx, cell *params) { + int numParams = params[0] / sizeof(cell); + if (numParams != 3 && numParams != 5) + { + LogError(amx, AMX_ERR_NATIVE, "Invalid number of parameters passed!"); + return 0; + } + if (!g_NewDLL_Available) { LogError(amx, AMX_ERR_NATIVE, "NewDLL functions are not available. Blame (your) metamod (version)"); @@ -2953,8 +2960,13 @@ static cell AMX_NATIVE_CALL query_client_cvar(AMX *amx, cell *params) const char *cvarname = get_amxstring(amx, params[2], 0, dummy); const char *resultfuncname = get_amxstring(amx, params[3], 1, dummy); - // public clientcvarquery_result(id, const cvar[], const result[]) - int iFunc = registerSPForwardByName(amx, resultfuncname, FP_CELL, FP_STRING, FP_STRING, FP_DONE); + // public clientcvarquery_result(id, const cvar[], const result[], [const param[]]) + int iFunc; + if (numParams == 5 && params[4] != 0) + iFunc = registerSPForwardByName(amx, resultfuncname, FP_CELL, FP_STRING, FP_STRING, FP_ARRAY, FP_DONE); + else + iFunc = registerSPForwardByName(amx, resultfuncname, FP_CELL, FP_STRING, FP_STRING, FP_DONE); + if (iFunc == -1) { LogError(amx, AMX_ERR_NATIVE, "Function \"%s\" is not present", resultfuncname); @@ -2966,6 +2978,29 @@ static cell AMX_NATIVE_CALL query_client_cvar(AMX *amx, cell *params) queryObject->cvarName.assign(cvarname); queryObject->resultFwd = iFunc; + if (numParams == 5 && params[4] != 0) + { + queryObject->paramLen = params[4] + 1; + queryObject->params = new cell[ queryObject->paramLen ]; + if (!queryObject->params) + { + delete queryObject; + unregisterSPForward(iFunc); + LogError(amx, AMX_ERR_MEMORY, "Hmm. Out of memory?"); + return 0; + } + memcpy(reinterpret_cast(queryObject->params), + reinterpret_cast(get_amxaddr(amx, params[5])), + queryObject->paramLen * sizeof(cell)); + + queryObject->params[queryObject->paramLen - 1] = 0; + } + else + { + queryObject->params = NULL; + queryObject->paramLen = 0; + } + pPlayer->cvarQueryQueue.push(queryObject); return 1; diff --git a/amxmodx/meta_api.cpp b/amxmodx/meta_api.cpp index ad1a3eda..cae2135a 100755 --- a/amxmodx/meta_api.cpp +++ b/amxmodx/meta_api.cpp @@ -1031,8 +1031,18 @@ void C_CvarValue(const edict_t *pEdict, const char *value) if (pPlayer->cvarQueryQueue.front()->querying) { - executeForwards(pQuery->resultFwd, ENTINDEX(pEdict), pQuery->cvarName.c_str(), value); + if (pQuery->paramLen) + { + cell arr = prepareCellArray(pQuery->params, pQuery->paramLen); + executeForwards(pQuery->resultFwd, ENTINDEX(pEdict), pQuery->cvarName.c_str(), value, arr); + } + else + executeForwards(pQuery->resultFwd, ENTINDEX(pEdict), pQuery->cvarName.c_str(), value); + + unregisterSPForward(pQuery->resultFwd); + if (pQuery->params) + delete [] pQuery->params; delete pQuery; pPlayer->cvarQueryQueue.pop(); RETURN_META(MRES_HANDLED);