diff --git a/OpenSim/Region/Environment/Modules/World/Sun/SunModule.cs b/OpenSim/Region/Environment/Modules/World/Sun/SunModule.cs index 1bdc702804..6e8c28a39f 100644 --- a/OpenSim/Region/Environment/Modules/World/Sun/SunModule.cs +++ b/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 m_rootAgents = new Dictionary(); // 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 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); + } + } + } + } } }