static cell AMX_NATIVE_CALL set_task(AMX *amx, cell *params) /* 2 param */
{
CPluginMngr::CPlugin *plugin = g_plugins.findPluginFast(amx);
int a, iFunc;
char* stemp = get_amxstring(amx, params[2], 1, a);
if (params[5])
{
iFunc = registerSPForwardByName(amx, stemp, FP_ARRAY, FP_CELL, FP_DONE);
} else {
iFunc = registerSPForwardByName(amx, stemp, FP_CELL, FP_DONE);
}
if (iFunc == -1)
{
LogError(amx, AMX_ERR_NATIVE, "Function is not present (function \"%s\") (plugin \"%s\")", stemp, plugin->getName());
return 0;
}
float base = amx_ctof(params[1]);
if (base < 0.1f)
base = 0.1f;
char* temp = get_amxstring(amx, params[6], 0, a);
g_tasksMngr.registerTask(plugin, iFunc, UTIL_ReadFlags(temp), params[3], base, params[5], get_amxaddr(amx, params[4]), params[7]);
return 1;
}
void CTaskMngr::registerTask(CPluginMngr::CPlugin *pPlugin, int iFunc, int iFlags, cell iId, float fBase, int iParamsLen, const cell *pParams, int iRepeat)
{
// first, search for free tasks
for (auto &task : m_Tasks)
{
if (task->isFree() && !task->inExecute())
{
// found: reuse it
task->set(pPlugin, iFunc, iFlags, iId, fBase, iParamsLen, pParams, iRepeat, *m_pTmr_CurrentTime);
return;
}
}
// not found: make a new one
auto task = ke::AutoPtr<CTask>(new CTask);
if (!task)
return;
task->set(pPlugin, iFunc, iFlags, iId, fBase, iParamsLen, pParams, iRepeat, *m_pTmr_CurrentTime);
m_Tasks.append(ke::Move(task));
}
void CTaskMngr::startFrame()
{
auto lastSize = m_Tasks.length();
for(auto i = 0u; i < lastSize; i++)
{
auto &task = m_Tasks[i];
if (task->isFree())
continue;
task->executeIfRequired(*m_pTmr_CurrentTime, *m_pTmr_TimeLimit, *m_pTmr_TimeLeft);
}
}