Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        public void AddSpawnPoint(Vector3 absPos)
        {
            IObject obj;

            if (Objects.TryGetValue(RegionSettings.TelehubObject, out obj))
            {
                Vector3 spawnPos = absPos - obj.GlobalPosition;
                m_Spawnpoints.Add(spawnPos);
                TriggerSpawnpointUpdate();
            }
        }
Пример #5
0
 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();
        }
Пример #7
0
 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);
 }
Пример #8
0
        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);
        }
Пример #9
0
        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);
        }
Пример #10
0
        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);
                    }
                }
            }
        }
Пример #11
0
            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);
                }
            }
Пример #13
0
 protected override void OnStart()
 {
     m_SceneListenerThreads.Add(this);
 }
Пример #14
0
 void IAgentListener.AddedAgent(IAgent agent)
 {
     agent.PhysicsActors.Add(m_SceneID, new AgentUfoPhysics(agent, m_SceneID));
     m_Agents.Add(agent);
 }
Пример #15
0
        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);
                    }
                }
            }
        }