mirror of
https://github.com/alliedmodders/amxmodx.git
synced 2024-12-26 06:45:37 +03:00
An optional array parameter (LIKE TEH TASKS ONE) can be now passed to cvar query handlers
This commit is contained in:
parent
2f27b7da8d
commit
6bebf37f1a
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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<void*>(queryObject->params),
|
||||
reinterpret_cast<const void *>(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;
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user