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); }
private 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; }