Browse Source

* Updated sun module to only send sun updates to root agents. Because it was sending updates to both root and child agents, you'll still get sun jitter until this revision is adopted by every region nearby.

Teravus Ovares 16 năm trước cách đây
mục cha
commit
cdfb1f3623
1 tập tin đã thay đổi với 54 bổ sung3 xóa
  1. 54 3
      OpenSim/Region/Environment/Modules/World/Sun/SunModule.cs

+ 54 - 3
OpenSim/Region/Environment/Modules/World/Sun/SunModule.cs

@@ -95,6 +95,7 @@ namespace OpenSim.Region.Environment.Modules
         private LLVector3 Velocity = new LLVector3(0,0,0);
         private LLQuaternion  Tilt = new LLQuaternion(1,0,0,0);
 
+        private Dictionary<LLUUID, ulong> m_rootAgents = new Dictionary<LLUUID, ulong>();
 
         // Current time in elpased seconds since Jan 1st 1970
         private ulong CurrentTime
@@ -183,7 +184,10 @@ namespace OpenSim.Region.Environment.Modules
                     //  Insert our event handling hooks
 
                     scene.EventManager.OnFrame     += SunUpdate;
-                    scene.EventManager.OnNewClient += SunToClient;
+                    //scene.EventManager.OnNewClient += SunToClient;
+                    scene.EventManager.OnMakeChildAgent += MakeChildAgent;
+                    scene.EventManager.OnAvatarEnteringNewParcel += AvatarEnteringParcel;
+                    scene.EventManager.OnClientClosed += ClientLoggedOut;
 
                     ready = true;
 
@@ -205,7 +209,10 @@ namespace OpenSim.Region.Environment.Modules
             ready = false;
             //  Remove our hooks
             m_scene.EventManager.OnFrame     -= SunUpdate;
-            m_scene.EventManager.OnNewClient -= SunToClient;
+           // m_scene.EventManager.OnNewClient -= SunToClient;
+            m_scene.EventManager.OnMakeChildAgent -= MakeChildAgent;
+            m_scene.EventManager.OnAvatarEnteringNewParcel += AvatarEnteringParcel;
+            m_scene.EventManager.OnClientClosed += ClientLoggedOut;
         }
 
         public string Name
@@ -243,7 +250,8 @@ namespace OpenSim.Region.Environment.Modules
             List<ScenePresence> avatars = m_scene.GetAvatars();
             foreach (ScenePresence avatar in avatars)
             {
-                avatar.ControllingClient.SendSunPos(Position, Velocity, CurrentTime, SecondsPerSunCycle, SecondsPerYear, OrbitalPosition);
+                if (!avatar.IsChildAgent)
+                    avatar.ControllingClient.SendSunPos(Position, Velocity, CurrentTime, SecondsPerSunCycle, SecondsPerYear, OrbitalPosition);
             }
 
             // set estate settings for region access to sun position
@@ -303,5 +311,48 @@ namespace OpenSim.Region.Environment.Modules
             // m_log.Debug("[SUN] Velocity("+Velocity.X+","+Velocity.Y+","+Velocity.Z+")");
 
         }
+
+        private void ClientLoggedOut(LLUUID AgentId)
+        {
+            lock (m_rootAgents)
+            {
+                if (m_rootAgents.ContainsKey(AgentId))
+                {
+                    m_rootAgents.Remove(AgentId);
+                    m_log.Info("[SUN]: Removing " + AgentId + ". Agent logged out.");
+                }
+            }
+        }
+
+        private void AvatarEnteringParcel(ScenePresence avatar, int localLandID, LLUUID regionID)
+        {
+            lock (m_rootAgents)
+            {
+                if (m_rootAgents.ContainsKey(avatar.UUID))
+                {
+                    m_rootAgents[avatar.UUID] = avatar.RegionHandle; 
+                }
+                else
+                {
+                    m_rootAgents.Add(avatar.UUID, avatar.RegionHandle);
+                    SunToClient(avatar.ControllingClient);
+                }
+            }
+            //m_log.Info("[FRIEND]: " + avatar.Name + " status:" + (!avatar.IsChildAgent).ToString());
+        }
+
+        private void MakeChildAgent(ScenePresence avatar)
+        {
+            lock (m_rootAgents)
+            {
+                if (m_rootAgents.ContainsKey(avatar.UUID))
+                {
+                    if (m_rootAgents[avatar.UUID] == avatar.RegionHandle)
+                    {
+                        m_rootAgents.Remove(avatar.UUID);
+                    }
+                }
+            }
+        }
     }
 }