protected void RemoveAllScripts(ScriptInstance instance, ObjectPart part) { foreach (ObjectPartInventoryItem item in part.Inventory.Values) { if (item.AssetType == AssetType.LSLText) { ScriptInstance script = item.ScriptInstance; if (script != instance && script != null) { script = item.RemoveScriptInstance; if (script != null) { ScriptThreadPool.AbortScript(script); script.Abort(); script.Remove(); ScriptLoader.Remove(item.AssetID, script); } } } } }
public override bool Remove(IObject obj, ScriptInstance instance = null) { if (!m_Objects.ContainsValue(obj)) { return(false); } var objgroup = obj as ObjectGroup; IAgent agent; if (objgroup != null) { foreach (ObjectPart objpart in objgroup.Values) { Interlocked.Decrement(ref m_PrimitiveCount); foreach (ObjectPartInventoryItem item in objpart.Inventory.Values) { ScriptInstance removeinstance = item.ScriptInstance; if (removeinstance != instance) { removeinstance = item.RemoveScriptInstance; if (removeinstance != null) { ScriptThreadPool.AbortScript(removeinstance); removeinstance.Abort(); removeinstance.Remove(); ScriptLoader.Remove(item.AssetID, removeinstance); } } } m_Primitives.Remove(objpart.ID); objpart.SendKillObject(); RemoveLocalID(objpart); } if (m_Objects.Remove(objgroup.ID)) { Interlocked.Decrement(ref m_ObjectCount); } } else if ((agent = obj as IAgent) != null) { foreach (IAgentListener aglistener in AgentListeners) { try { aglistener.RemovedAgent(agent); } catch (Exception e) { m_Log.DebugFormat("Exception {0}\n{1}", e.Message, e.StackTrace); } } if (agent.IsInScene(this)) { /* only detach if agent is at our scene */ agent.DetachAllAttachments(); } m_Objects.Remove(agent.ID); if (m_Agents.Remove(agent.ID)) { Interlocked.Decrement(ref m_AgentCount); } agent.SendKillObject(ID); RemoveLocalID(agent); } else { agent.SendKillObject(ID); m_Objects.Remove(obj.ID); RemoveLocalID(obj); } return(true); }
protected void RemoveScene(SceneInterface s) { ScriptThreadPool.Shutdown(); m_ParcelAccessManager.Stop(); Environment.OnEnvironmentControllerChangeParams -= StoreEnvironmentControllerData; Environment.Stop(); PathfindingService?.Stop(); int serializedcount = 0; foreach (ObjectPart part in Primitives) { foreach (ObjectPartInventoryItem item in part.Inventory.Values) { IScriptState state = item.ScriptState; if (state != null) { try { m_SimulationDataStorage.ScriptStates[ID, part.ID, item.ID] = state.ToDbSerializedState(); if (++serializedcount % 50 == 0) { m_Log.InfoFormat("Serialized {0} script states", serializedcount); } } catch (Exception e) { m_Log.ErrorFormat("Script state serialization failed for {0} ({1}): prim {2} ({3}): item {4} ({5}): {6}: {7}\n{8}", Name, ID, part.Name, part.ID, item.Name, item.ID, e.GetType().FullName, e.Message, e.StackTrace); } } } } if (serializedcount == 1) { m_Log.InfoFormat("Serialized {0} script state", serializedcount); } else if (serializedcount % 50 != 0) { m_Log.InfoFormat("Serialized {0} script states", serializedcount); } m_RestartObject = null; if (m_NeighborService != null) { RegionInfo rInfo = s.GetRegionInfo(); rInfo.Flags &= ~RegionFlags.RegionOnline; m_NeighborService.NotifyNeighborStatus(rInfo); } if (m_SceneListener != null) { m_SceneListener.StopStorageThread(); SceneListeners.Remove(m_SceneListener); } if (m_TerrainListener != null) { m_TerrainListener.StopStorageThread(); Terrain.TerrainListeners.Remove(m_TerrainListener); } if (m_IMRouter != null) { m_IMRouter.SceneIM.Remove(IMSend); } UDPCircuitsManager udpServer = m_UDPServer; udpServer?.Shutdown(); m_UDPServer = null; }