public void Startup(ConfigurationLoader loader) { m_Scenes = loader.Scenes; m_EstateService = loader.GetService <EstateServiceInterface>(m_EstateServiceName); m_RegionStorage = loader.GetService <GridServiceInterface>(m_RegionStorageName); loader.CommandRegistry.AddShowCommand("estates", ShowEstatesCmd); loader.CommandRegistry.AddChangeCommand("estate", ChangeEstateCmd); loader.CommandRegistry.AddCreateCommand("estate", CreateEstateCmd); loader.CommandRegistry.AddDeleteCommand("estate", DeleteEstateCmd); loader.CommandRegistry.AddAlertCommand("estate", AlertEstateCmd); var avatarNameServicesList = new RwLockedList <AvatarNameServiceInterface>(); IConfig sceneConfig = loader.Config.Configs["DefaultSceneImplementation"]; if (sceneConfig != null) { string avatarNameServices = sceneConfig.GetString("AvatarNameServices", string.Empty); if (!string.IsNullOrEmpty(avatarNameServices)) { foreach (string p in avatarNameServices.Split(',')) { avatarNameServicesList.Add(loader.GetService <AvatarNameServiceInterface>(p.Trim())); } } } m_AvatarNameService = new AggregatingAvatarNameService(avatarNameServicesList); }
public override Listener AddChatPassListener(Action <ListenEvent> send) { var li = new RegionListenerInfo(this, 0, string.Empty, UUID.Zero, string.Empty, GetPassListenerUUID, null, null, send); m_ChatPass.Add(li); return(li); }
public void Startup(ConfigurationLoader loader) { var avatarNameServices = new RwLockedList <AvatarNameServiceInterface>(); foreach (string name in m_AvatarNameServiceNames.Trim().Split(',')) { avatarNameServices.Add(loader.GetService <AvatarNameServiceInterface>(name)); } m_AvatarNameService = new AggregatingAvatarNameService(avatarNameServices); }
public void AddSpawnPoint(Vector3 absPos) { IObject obj; if (Objects.TryGetValue(RegionSettings.TelehubObject, out obj)) { Vector3 spawnPos = absPos - obj.GlobalPosition; m_Spawnpoints.Add(spawnPos); TriggerSpawnpointUpdate(); } }
public void VerifyConnection() { using (var conn = new MySqlConnection(m_ConnectionString)) { conn.Open(); int maxallowedPacket = conn.GetMaxAllowedPacketSize(); if (maxallowedPacket < 128 * 1024 * 1024) { m_ConfigurationIssues.Add(string.Format("Please set max_allowed_packet = 128M in [mysqld] in MySQL/MariaDB. Found {0}", maxallowedPacket)); } } }
public ScriptWorkerThreadPool(int minimumThreads, int maximumThreads, UUID sceneID) { MinimumThreads = minimumThreads; MaximumThreads = maximumThreads; m_SceneID = sceneID; m_Log.InfoFormat("Starting {0} minimum threads for {1}", minimumThreads, m_SceneID.ToString()); for (int threadCount = 0; threadCount < m_MinimumThreads; ++threadCount) { var tc = new ScriptThreadContext { ScriptThread = ThreadManager.CreateThread(ThreadMain), ThreadPool = this }; tc.ScriptThread.Name = "Script Worker: " + m_SceneID.ToString(); tc.ScriptThread.Start(tc); m_Threads.Add(tc); } m_FrameTimer.Elapsed += FrameTimer; m_FrameTimer.Start(); }
public void Startup(ConfigurationLoader loader) { m_Loader = loader; foreach (string name in m_AvatarNameServiceNames.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) { if (!string.IsNullOrEmpty(name)) { AvatarNameServiceInterface avatarNameService; loader.GetService(name, out avatarNameService); m_AvatarNameServices.Add(avatarNameService); } } m_UserAgentServicePlugins = loader.GetServicesByValue <IUserAgentServicePlugin>(); loader.IMRouter.GridIM.Add(RouteIM); }
public void Startup(ConfigurationLoader loader) { m_IMRouter = loader.IMRouter; RwLockedList <AvatarNameServiceInterface> services = new RwLockedList <AvatarNameServiceInterface>(); foreach (string name in m_AvatarNameServiceNames) { AvatarNameServiceInterface service; loader.GetService(name, out service); services.Add(service); } m_AvatarNameService = new AggregatingAvatarNameService(services); loader.GetService(m_GroupsServiceName, out m_GroupsService); }
public void RegionAdded(SceneInterface scene) { m_RegisteredScenes.Add(scene); RegionInfo ri = scene.GetRegionInfo(); if (ri.Owner == null) { ri.Owner = UGUI.Unknown; } Dictionary <string, string> gridFeatures = scene.GridService.GetGridExtraFeatures(); if (gridFeatures.ContainsKey("GridURL")) { ri.GridURI = gridFeatures["GridURL"]; } scene.GridService.RegisterRegion(ri); }
private void UpdateGodAgentsList(RwLockedList <UGUI> list, UUID regionId, string value) { if (string.IsNullOrEmpty(value)) { list.Clear(); } else { string[] god_agents_list = value.Split(new char[] { ',' }); var new_gods = new List <UGUI>(); foreach (string god_agent in god_agents_list) { UGUI uui; try { uui = new UGUI(god_agent); } catch { m_Log.WarnFormat("Invalid UUI '{1}' found in {0}/god_agents variable", regionId.ToString(), god_agent); continue; } new_gods.Add(uui); } foreach (UGUI god in new List <UGUI>(list)) { if (!new_gods.Contains(god)) { list.Remove(god); } } foreach (UGUI god in new_gods) { if (!list.Contains(god)) { list.Add(god); } } } }
protected override void StorageTerrainThread() { try { m_TerrainListenerThreads.Add(this); Thread.CurrentThread.Name = "Storage Terrain Thread: " + RegionID.ToString(); var knownSerialNumbers = new C5.TreeDictionary <uint, uint>(); string replaceIntoTerrain = string.Empty; var updateRequests = new List <string>(); while (!m_StopStorageThread || m_StorageTerrainRequestQueue.Count != 0) { LayerPatch req; try { req = m_StorageTerrainRequestQueue.Dequeue(1000); } catch { continue; } uint serialNumber = req.Serial; if (!knownSerialNumbers.Contains(req.ExtendedPatchID) || knownSerialNumbers[req.ExtendedPatchID] != req.Serial) { var data = new Dictionary <string, object> { ["RegionID"] = RegionID, ["PatchID"] = req.ExtendedPatchID, ["TerrainData"] = req.Serialization }; if (replaceIntoTerrain.Length == 0) { replaceIntoTerrain = "REPLACE INTO terrains (" + MySQLUtilities.GenerateFieldNames(data) + ") VALUES "; } updateRequests.Add("(" + MySQLUtilities.GenerateValues(data) + ")"); knownSerialNumbers[req.ExtendedPatchID] = serialNumber; } if ((m_StorageTerrainRequestQueue.Count == 0 && updateRequests.Count > 0) || updateRequests.Count >= 256) { string elems = string.Join(",", updateRequests); try { using (var conn = new MySqlConnection(m_ConnectionString)) { conn.Open(); using (var cmd = new MySqlCommand(replaceIntoTerrain + elems, conn)) { cmd.ExecuteNonQuery(); } } updateRequests.Clear(); Interlocked.Increment(ref m_ProcessedPatches); } catch (Exception e) { m_Log.Error("Terrain store failed", e); } } } } finally { m_TerrainListenerThreads.Remove(this); } }
protected override void StorageTerrainThread() { try { m_TerrainListenerThreads.Add(this); Thread.CurrentThread.Name = "Storage Terrain Thread: " + RegionID.ToString(); var knownSerialNumbers = new C5.TreeDictionary <uint, uint>(); Dictionary <string, object> updateRequestData = new Dictionary <string, object>(); int updateRequestCount = 0; while (!m_StopStorageThread || m_StorageTerrainRequestQueue.Count != 0) { LayerPatch req; try { req = m_StorageTerrainRequestQueue.Dequeue(1000); } catch { continue; } if (req == null) { using (var connection = new NpgsqlConnection(m_ConnectionString)) { connection.Open(); connection.InsideTransaction((transaction) => { using (var cmd = new NpgsqlCommand("DELETE FROM defaultterrains WHERE RegionID=@regionid", connection) { Transaction = transaction }) { cmd.Parameters.AddParameter("@RegionID", RegionID); cmd.ExecuteNonQuery(); } using (var cmd = new NpgsqlCommand("INSERT INTO defaultterrains (RegionID, PatchID, TerrainData) SELECT RegionID, PatchID, TerrainData FROM terrains WHERE RegionID=@regionid", connection) { Transaction = transaction }) { cmd.Parameters.AddParameter("@RegionID", RegionID); cmd.ExecuteNonQuery(); } }); } } else { uint serialNumber = req.Serial; if (!knownSerialNumbers.Contains(req.ExtendedPatchID) || knownSerialNumbers[req.ExtendedPatchID] != req.Serial) { updateRequestData.Add("PatchID" + updateRequestCount, req.ExtendedPatchID); updateRequestData.Add("TerrainData" + updateRequestCount, req.Serialization); ++updateRequestCount; knownSerialNumbers[req.ExtendedPatchID] = serialNumber; } if ((m_StorageTerrainRequestQueue.Count == 0 && updateRequestCount > 0) || updateRequestCount >= 256) { StringBuilder updateCmd = new StringBuilder(); try { using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString)) { conn.Open(); if (conn.HasOnConflict() && m_EnableOnConflict) { for (int i = 0; i < updateRequestCount; ++i) { updateCmd.AppendFormat("INSERT INTO terrains (\"RegionID\", \"PatchID\", \"TerrainData\") VALUES (@regionid, @patchid{0}, @terraindata{0}) ON CONFLICT(\"RegionID\", \"PatchID\") DO UPDATE SET \"TerrainData\"= @terraindata{0};", i); } } else { for (int i = 0; i < updateRequestCount; ++i) { updateCmd.AppendFormat("UPDATE terrains SET \"TerrainData\"=@terraindata{0} WHERE \"RegionID\" = @regionid AND \"PatchID\" = @patchid{0};", i); updateCmd.AppendFormat("INSERT INTO terrains (\"RegionID\", \"PatchID\", \"TerrainData\") SELECT @regionid, @patchid{0}, @terraindata{0} WHERE NOT EXISTS " + "(SELECT 1 FROM terrains WHERE \"RegionID\" = @regionid AND \"PatchID\" = @patchid{0});", i); } } using (NpgsqlCommand cmd = new NpgsqlCommand(updateCmd.ToString(), conn)) { cmd.Parameters.AddParameter("@regionid", RegionID); foreach (KeyValuePair <string, object> kvp in updateRequestData) { cmd.Parameters.AddParameter(kvp.Key, kvp.Value); } cmd.ExecuteNonQuery(); } } updateRequestData.Clear(); updateRequestCount = 0; Interlocked.Increment(ref m_ProcessedPatches); } catch (Exception e) { m_Log.Error("Terrain store failed", e); } } } } } finally { m_TerrainListenerThreads.Remove(this); } }
protected override void OnStart() { m_SceneListenerThreads.Add(this); }
void IAgentListener.AddedAgent(IAgent agent) { agent.PhysicsActors.Add(m_SceneID, new AgentUfoPhysics(agent, m_SceneID)); m_Agents.Add(agent); }
private void PromptThread() { Thread.CurrentThread.Name = "Local Console Input Thread"; for ( ;;) { string consoleTitle; if (SelectedScene == UUID.Zero) { CmdPrompt = "(root) # "; consoleTitle = m_ConsoleTitle + " # (root)"; } else { SceneInterface scene; if (m_Scenes.TryGetValue(SelectedScene, out scene)) { CmdPrompt = scene.Name + " # "; consoleTitle = m_ConsoleTitle + " # " + scene.Name; } else { CmdPrompt = "(root) # "; SelectedScene = UUID.Zero; consoleTitle = m_ConsoleTitle + " # (root)"; } } try { System.Console.Title = consoleTitle; } catch { /* no action required */ } string cmd; try { cmd = ReadLine(CmdPrompt, true); } catch (ThreadAbortException) { SetCursorLeft(0); m_CursorYPosition = SetCursorTop(m_CursorYPosition); System.Console.WriteLine(); lock (m_CommandLineBuffer) { m_CursorYPosition = -1; } throw; } if (0 == cmd.Length) { continue; } try { System.Console.Title = consoleTitle + " $ " + cmd; } catch { /* no action required */ } if (m_CmdHistory.Count >= 100) { m_CmdHistory.RemoveAt(0); } m_CmdHistory.Add(cmd); lock (m_InputThreadLock) { try { m_Commands.ExecuteCommandString(cmd, this); } catch (Exception e) { m_Log.Error("Exception encountered during command execution", e); } } } }