public void OnRemoveScript(uint localID, UUID itemID) { lock (m_Scripts) { // Do we even have it? if (!m_Scripts.ContainsKey(itemID)) { return; } IScriptInstance instance = m_Scripts[itemID]; m_Scripts.Remove(itemID); instance.ClearQueue(); instance.Stop(0); SceneObjectPart part = m_Scene.GetSceneObjectPart(localID); if (part != null) { part.RemoveScriptEvents(itemID); } // bool objectRemoved = false; lock (m_PrimObjects) { // Remove the script from it's prim if (m_PrimObjects.ContainsKey(localID)) { // Remove inventory item record if (m_PrimObjects[localID].Contains(itemID)) { m_PrimObjects[localID].Remove(itemID); } // If there are no more scripts, remove prim if (m_PrimObjects[localID].Count == 0) { m_PrimObjects.Remove(localID); // objectRemoved = true; } } } m_DomainScripts[instance.AppDomain].Remove(instance.ItemID); if (m_DomainScripts[instance.AppDomain].Count == 0) { m_DomainScripts.Remove(instance.AppDomain); UnloadAppDomain(instance.AppDomain); } instance.RemoveState(); instance.DestroyScriptInstance(); instance = null; ObjectRemoved handlerObjectRemoved = OnObjectRemoved; if (handlerObjectRemoved != null) { handlerObjectRemoved(part.UUID); } CleanAssemblies(); } ScriptRemoved handlerScriptRemoved = OnScriptRemoved; if (handlerScriptRemoved != null) { handlerScriptRemoved(itemID); } }