bool CheckFunctionLimits(string function, ISceneChildEntity m_host, string API, UUID itemID)
{
LimitDef d = null;
bool isAPI = m_functionsToLimit.TryGetValue(API, out d);
bool isFunction = m_functionsToLimit.TryGetValue(function, out d); //Function overrides API
if (m_allowFunctionLimiting && (isAPI || isFunction))
{
//Get the list for the given type
Dictionary<string, LimitReq> functions;
bool doInsert = false;
if (d.Type == LimitType.Owner)
{
if (!m_functionLimiting.TryGetValue(m_host.OwnerID, out functions))
{
doInsert = true;
functions = new Dictionary<string, LimitReq>();
}
}
else if (d.Type == LimitType.Script)
{
if (!m_functionLimiting.TryGetValue(itemID, out functions))
{
doInsert = true;
functions = new Dictionary<string, LimitReq>();
}
}
else if (d.Type == LimitType.Group)
{
if (!m_functionLimiting.TryGetValue(m_host.ParentEntity.UUID, out functions))
{
doInsert = true;
functions = new Dictionary<string, LimitReq>();
}
}
else if (d.Type == LimitType.Prim)
{
if (!m_functionLimiting.TryGetValue(m_host.UUID, out functions))
{
doInsert = true;
functions = new Dictionary<string, LimitReq>();
}
}
else
return true;
LimitReq r;
if (!functions.TryGetValue(function, out r))
r = new LimitReq();
if (d.MaxNumberOfTimes != 0)
{
if (r.NumberOfTimesFired + 1 > d.MaxNumberOfTimes) //Too Many, kill it
{
TriggerAlert(function, d,
"You have exceeded the number of times this function (" + function +
") is allowed to be fired",
m_host);
return TriggerAction(d, m_host, itemID);
}
r.NumberOfTimesFired++;
}
if (d.TimeScale != 0)
{
if (r.LastFired != 0 && Util.EnvironmentTickCountSubtract(r.LastFired) < d.TimeScale)
{
if (r.FunctionsSinceLastFired + 1 > d.FunctionsOverTimeScale)
{
TriggerAlert(function, d,
"You have fired the given function " + function + " too quickly.", m_host);
return TriggerAction(d, m_host, itemID);
}
}
else
{
r.LastFired = Util.EnvironmentTickCount();
r.FunctionsSinceLastFired = 0; //Clear it out again
}
r.FunctionsSinceLastFired++;
}
//Put it back where it came from
functions[isFunction ? function : API] = r;
if (doInsert)
if (d.Type == LimitType.Owner)
m_functionLimiting[m_host.OwnerID] = functions;
else if (d.Type == LimitType.Script)
m_functionLimiting[itemID] = functions;
else if (d.Type == LimitType.Group)
m_functionLimiting[m_host.ParentEntity.UUID] = functions;
else if (d.Type == LimitType.Prim)
m_functionLimiting[m_host.UUID] = functions;
}
return true;
}