added amb1204 - concommandbase iteration
--HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%401801
This commit is contained in:
parent
c9a9826989
commit
cf023a0b7d
@ -53,6 +53,7 @@ enum ConVarBounds
|
|||||||
};
|
};
|
||||||
|
|
||||||
HandleType_t hCmdIterType = 0;
|
HandleType_t hCmdIterType = 0;
|
||||||
|
HandleType_t htConCmdIter = 0;
|
||||||
|
|
||||||
struct GlobCmdIter
|
struct GlobCmdIter
|
||||||
{
|
{
|
||||||
@ -60,6 +61,11 @@ struct GlobCmdIter
|
|||||||
List<ConCmdInfo *>::iterator iter;
|
List<ConCmdInfo *>::iterator iter;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ConCmdIter
|
||||||
|
{
|
||||||
|
const ConCommandBase *pLast;
|
||||||
|
};
|
||||||
|
|
||||||
class ConsoleHelpers :
|
class ConsoleHelpers :
|
||||||
public SMGlobalClass,
|
public SMGlobalClass,
|
||||||
public IHandleTypeDispatch
|
public IHandleTypeDispatch
|
||||||
@ -68,15 +74,41 @@ public:
|
|||||||
virtual void OnSourceModAllInitialized()
|
virtual void OnSourceModAllInitialized()
|
||||||
{
|
{
|
||||||
HandleAccess access;
|
HandleAccess access;
|
||||||
|
|
||||||
g_HandleSys.InitAccessDefaults(NULL, &access);
|
g_HandleSys.InitAccessDefaults(NULL, &access);
|
||||||
|
|
||||||
|
htConCmdIter = g_HandleSys.CreateType("ConCmdIter", this, 0, NULL, &access, g_pCoreIdent, NULL);
|
||||||
|
|
||||||
access.access[HandleAccess_Clone] = HANDLE_RESTRICT_OWNER | HANDLE_RESTRICT_IDENTITY;
|
access.access[HandleAccess_Clone] = HANDLE_RESTRICT_OWNER | HANDLE_RESTRICT_IDENTITY;
|
||||||
|
|
||||||
hCmdIterType = g_HandleSys.CreateType(NULL, this, 0, NULL, &access, g_pCoreIdent, NULL);
|
hCmdIterType = g_HandleSys.CreateType("CmdIter", this, 0, NULL, &access, g_pCoreIdent, NULL);
|
||||||
}
|
}
|
||||||
virtual void OnHandleDestroy(HandleType_t type, void *object)
|
virtual void OnHandleDestroy(HandleType_t type, void *object)
|
||||||
{
|
{
|
||||||
GlobCmdIter *iter = (GlobCmdIter *)object;
|
if (type == hCmdIterType)
|
||||||
delete iter;
|
{
|
||||||
|
GlobCmdIter *iter = (GlobCmdIter *)object;
|
||||||
|
delete iter;
|
||||||
|
}
|
||||||
|
else if (type == htConCmdIter)
|
||||||
|
{
|
||||||
|
ConCmdIter *iter = (ConCmdIter * )object;
|
||||||
|
delete iter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
virtual bool GetHandleApproxSize(HandleType_t type, void *object, unsigned int *pSize)
|
||||||
|
{
|
||||||
|
if (type == htConCmdIter)
|
||||||
|
{
|
||||||
|
*pSize = sizeof(ConCmdIter);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (type == hCmdIterType)
|
||||||
|
{
|
||||||
|
*pSize = sizeof(GlobCmdIter);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
} s_ConsoleHelpers;
|
} s_ConsoleHelpers;
|
||||||
|
|
||||||
@ -1098,6 +1130,72 @@ static cell_t GetCommandFlags(IPluginContext *pContext, const cell_t *params)
|
|||||||
return (s_CommandFlagsHelper.GetFlags(name, &flags)) ? flags : -1;
|
return (s_CommandFlagsHelper.GetFlags(name, &flags)) ? flags : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static cell_t FindFirstConCommand(IPluginContext *pContext, const cell_t *params)
|
||||||
|
{
|
||||||
|
Handle_t hndl;
|
||||||
|
ConCmdIter *pIter;
|
||||||
|
cell_t *pIsCmd, *pFlags;
|
||||||
|
const ConCommandBase *pConCmd;
|
||||||
|
|
||||||
|
pContext->LocalToPhysAddr(params[3], &pIsCmd);
|
||||||
|
pContext->LocalToPhysAddr(params[4], &pFlags);
|
||||||
|
|
||||||
|
pConCmd = icvar->GetCommands();
|
||||||
|
|
||||||
|
if (pConCmd == NULL)
|
||||||
|
{
|
||||||
|
return BAD_HANDLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
pContext->StringToLocalUTF8(params[1], params[2], pConCmd->GetName(), NULL);
|
||||||
|
*pIsCmd = pConCmd->IsCommand() ? 1 : 0;
|
||||||
|
*pFlags = pConCmd->GetFlags();
|
||||||
|
|
||||||
|
pIter = new ConCmdIter;
|
||||||
|
pIter->pLast = pConCmd;
|
||||||
|
|
||||||
|
if ((hndl = g_HandleSys.CreateHandle(htConCmdIter, pIter, pContext->GetIdentity(), g_pCoreIdent, NULL))
|
||||||
|
== BAD_HANDLE)
|
||||||
|
{
|
||||||
|
delete pIter;
|
||||||
|
return BAD_HANDLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return hndl;
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell_t FindNextConCommand(IPluginContext *pContext, const cell_t *params)
|
||||||
|
{
|
||||||
|
HandleError err;
|
||||||
|
ConCmdIter *pIter;
|
||||||
|
cell_t *pIsCmd, *pFlags;
|
||||||
|
HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent);
|
||||||
|
|
||||||
|
if ((err = g_HandleSys.ReadHandle(params[1], htConCmdIter, &sec, (void **)&pIter)) != HandleError_None)
|
||||||
|
{
|
||||||
|
return pContext->ThrowNativeError("Invalid Handle %x (error %d)", params[1], err);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pIter->pLast == NULL)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((pIter->pLast = pIter->pLast->GetNext()) == NULL)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
pContext->LocalToPhysAddr(params[4], &pIsCmd);
|
||||||
|
pContext->LocalToPhysAddr(params[5], &pFlags);
|
||||||
|
|
||||||
|
pContext->StringToLocalUTF8(params[2], params[3], pIter->pLast->GetName(), NULL);
|
||||||
|
*pIsCmd = pIter->pLast->IsCommand() ? 1 : 0;
|
||||||
|
*pFlags = pIter->pLast->GetFlags();
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
REGISTER_NATIVES(consoleNatives)
|
REGISTER_NATIVES(consoleNatives)
|
||||||
{
|
{
|
||||||
{"CreateConVar", sm_CreateConVar},
|
{"CreateConVar", sm_CreateConVar},
|
||||||
@ -1142,5 +1240,7 @@ REGISTER_NATIVES(consoleNatives)
|
|||||||
{"IsChatTrigger", IsChatTrigger},
|
{"IsChatTrigger", IsChatTrigger},
|
||||||
{"SetCommandFlags", SetCommandFlags},
|
{"SetCommandFlags", SetCommandFlags},
|
||||||
{"GetCommandFlags", GetCommandFlags},
|
{"GetCommandFlags", GetCommandFlags},
|
||||||
|
{"FindFirstConCommand", FindFirstConCommand},
|
||||||
|
{"FindNextConCommand", FindNextConCommand},
|
||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
|
@ -718,3 +718,39 @@ native GetCommandFlags(const String:name[]);
|
|||||||
* @return True on success, otherwise false.
|
* @return True on success, otherwise false.
|
||||||
*/
|
*/
|
||||||
native bool:SetCommandFlags(const String:name[], flags);
|
native bool:SetCommandFlags(const String:name[], flags);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts a ConCommandBase search, traversing the list of ConVars and
|
||||||
|
* ConCommands. If a Handle is returned, the next entry must be read
|
||||||
|
* via FindNextConCommand(). The order of the list is undefined.
|
||||||
|
*
|
||||||
|
* @param buffer Buffer to store entry name.
|
||||||
|
* @param max_size Maximum size of the buffer.
|
||||||
|
* @param isCommand Variable to store whether the entry is a command.
|
||||||
|
* If it is not a command, it is a ConVar.
|
||||||
|
* @param flags Variable to store entry flags.
|
||||||
|
* @return On success, a ConCmdIter Handle is returned, which
|
||||||
|
* can be read via FindNextConCommand(), and must be
|
||||||
|
* closed via CloseHandle(). Additionally, the output
|
||||||
|
* parameters will be filled with information of the
|
||||||
|
* first ConCommandBase entry.
|
||||||
|
* On failure, INVALID_HANDLE is returned, and the
|
||||||
|
* contents of outputs is undefined.
|
||||||
|
*/
|
||||||
|
native Handle:FindFirstConCommand(String:buffer[], max_size, &bool:isCommand, &flags=0);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads the next entry in a ConCommandBase iterator.
|
||||||
|
*
|
||||||
|
* @param search ConCmdIter Handle to search.
|
||||||
|
* @param buffer Buffer to store entry name.
|
||||||
|
* @param max_size Maximum size of the buffer.
|
||||||
|
* @param isCommand Variable to store whether the entry is a command.
|
||||||
|
* If it is not a command, it is a ConVar.
|
||||||
|
* @param flags Variable to store entry flags.
|
||||||
|
* @return On success, the outputs are filled, the iterator is
|
||||||
|
* advanced to the next entry, and true is returned.
|
||||||
|
* If no more entries exist, false is returned, and the
|
||||||
|
* contents of outputs is undefined.
|
||||||
|
*/
|
||||||
|
native bool:FindNextConCommand(Handle:search, String:buffer[], max_size, &bool:isCommand, &flags=0);
|
||||||
|
Loading…
Reference in New Issue
Block a user