From 63e6666f2216a34da8327bcd94f94c4ed6c2b254 Mon Sep 17 00:00:00 2001
From: UbitUmarov
Date: Sat, 1 Sep 2012 02:05:28 +0100
Subject: try to reduce potencial recursive locking
---
.../CoreModules/World/Land/LandManagementModule.cs | 77 ++++++++++++++--------
1 file changed, 51 insertions(+), 26 deletions(-)
(limited to 'OpenSim/Region/CoreModules')
diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
index 51dcb67..8bc81ae 100644
--- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
+++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
@@ -86,7 +86,10 @@ namespace OpenSim.Region.CoreModules.World.Land
///
/// Land objects keyed by local id
///
- private readonly Dictionary m_landList = new Dictionary();
+// private readonly Dictionary m_landList = new Dictionary();
+
+ //ubit: removed the readonly so i can move it around
+ private Dictionary m_landList = new Dictionary();
private int m_lastLandLocalID = LandChannel.START_LAND_LOCAL_ID - 1;
@@ -242,15 +245,19 @@ namespace OpenSim.Region.CoreModules.World.Land
{
LandData newData = data.Copy();
newData.LocalID = local_id;
+ ILandObject landobj = null;
lock (m_landList)
{
if (m_landList.ContainsKey(local_id))
{
m_landList[local_id].LandData = newData;
- m_scene.EventManager.TriggerLandObjectUpdated((uint)local_id, m_landList[local_id]);
+ landobj = m_landList[local_id];
+// m_scene.EventManager.TriggerLandObjectUpdated((uint)local_id, m_landList[local_id]);
}
}
+ if(landobj != null)
+ m_scene.EventManager.TriggerLandObjectUpdated((uint)local_id, landobj);
}
public bool AllowedForcefulBans
@@ -280,14 +287,14 @@ namespace OpenSim.Region.CoreModules.World.Land
protected ILandObject CreateDefaultParcel()
{
m_log.DebugFormat(
- "[LAND MANAGEMENT MODULE]: Creating default parcel for region {0}", m_scene.RegionInfo.RegionName);
-
- ILandObject fullSimParcel = new LandObject(UUID.Zero, false, m_scene);
+ "[LAND MANAGEMENT MODULE]: Creating default parcel for region {0}", m_scene.RegionInfo.RegionName);
+
+ ILandObject fullSimParcel = new LandObject(UUID.Zero, false, m_scene);
fullSimParcel.SetLandBitmap(fullSimParcel.GetSquareLandBitmap(0, 0, (int)Constants.RegionSize, (int)Constants.RegionSize));
fullSimParcel.LandData.OwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner;
fullSimParcel.LandData.ClaimDate = Util.UnixTimeSinceEpoch();
-
- return AddLandObject(fullSimParcel);
+
+ return AddLandObject(fullSimParcel);
}
public List AllParcels()
@@ -617,21 +624,28 @@ namespace OpenSim.Region.CoreModules.World.Land
///
public void Clear(bool setupDefaultParcel)
{
+ Dictionary landworkList;
+ // move to work pointer since we are deleting it all
lock (m_landList)
{
- foreach (ILandObject lo in m_landList.Values)
- {
- //m_scene.SimulationDataService.RemoveLandObject(lo.LandData.GlobalID);
- m_scene.EventManager.TriggerLandObjectRemoved(lo.LandData.GlobalID);
- }
+ landworkList = m_landList;
+ m_landList = new Dictionary();
+ }
- m_landList.Clear();
+ // this 2 methods have locks (now)
+ ResetSimLandObjects();
- ResetSimLandObjects();
+ if (setupDefaultParcel)
+ CreateDefaultParcel();
- if (setupDefaultParcel)
- CreateDefaultParcel();
+ // fire outside events unlocked
+ foreach (ILandObject lo in landworkList.Values)
+ {
+ //m_scene.SimulationDataService.RemoveLandObject(lo.LandData.GlobalID);
+ m_scene.EventManager.TriggerLandObjectRemoved(lo.LandData.GlobalID);
}
+ landworkList.Clear();
+
}
private void performFinalLandJoin(ILandObject master, ILandObject slave)
@@ -1324,20 +1338,30 @@ namespace OpenSim.Region.CoreModules.World.Land
public void EventManagerOnIncomingLandDataFromStorage(List data)
{
+ Dictionary landworkList;
+ // move to work pointer since we are deleting it all
+ lock (m_landList)
+ {
+ landworkList = m_landList;
+ m_landList = new Dictionary();
+ }
+
+ //Remove all the land objects in the sim and then process our new data
+ foreach (int n in landworkList.Keys)
+ {
+ m_scene.EventManager.TriggerLandObjectRemoved(landworkList[n].LandData.GlobalID);
+ }
+ landworkList.Clear();
+
lock (m_landList)
{
- //Remove all the land objects in the sim and then process our new data
- foreach (int n in m_landList.Keys)
- {
- m_scene.EventManager.TriggerLandObjectRemoved(m_landList[n].LandData.GlobalID);
- }
m_landIDList.Initialize();
m_landList.Clear();
+ }
- for (int i = 0; i < data.Count; i++)
- {
- IncomingLandObjectFromStorage(data[i]);
- }
+ for (int i = 0; i < data.Count; i++)
+ {
+ IncomingLandObjectFromStorage(data[i]);
}
}
@@ -1366,7 +1390,8 @@ namespace OpenSim.Region.CoreModules.World.Land
public void EventManagerOnNoLandDataFromStorage()
{
- lock (m_landList)
+ // called methods already have locks
+// lock (m_landList)
{
ResetSimLandObjects();
CreateDefaultParcel();
--
cgit v1.1
From 056e66b3dec555613bd96b153ba03a124863dbf2 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Tue, 4 Sep 2012 03:14:39 +0200
Subject: Refactor avatar transfer so that the heavy (UpdateAgent) part is
separated into it's own sub-method
---
.../EntityTransfer/EntityTransferModule.cs | 204 +++++++++++----------
1 file changed, 110 insertions(+), 94 deletions(-)
(limited to 'OpenSim/Region/CoreModules')
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
index 9ffb851..1f884c8 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
@@ -220,7 +220,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
///
///
///
- ///
private void TeleportAgentWithinRegion(ScenePresence sp, Vector3 position, Vector3 lookAt, uint teleportFlags)
{
m_log.DebugFormat(
@@ -982,7 +982,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
agent.IsInTransit = true;
CrossAgentToNewRegionDelegate d = CrossAgentToNewRegionAsync;
- d.BeginInvoke(agent, newpos, x, y, neighbourRegion, isFlying, version, CrossAgentToNewRegionCompleted, d);
+ d.BeginInvoke(agent, newpos, neighbourRegion, isFlying, version, CrossAgentToNewRegionCompleted, d);
return true;
}
@@ -1039,42 +1039,43 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
icon.EndInvoke(iar);
}
+ public bool CrossAgentToNewRegionPrep(ScenePresence agent, GridRegion neighbourRegion)
+ {
+ if (neighbourRegion == null)
+ return false;
+
+ m_entityTransferStateMachine.SetInTransit(agent.UUID);
+
+ agent.RemoveFromPhysicalScene();
+
+ return true;
+ }
+
///
/// This Closes child agents on neighbouring regions
/// Calls an asynchronous method to do so.. so it doesn't lag the sim.
///
public ScenePresence CrossAgentToNewRegionAsync(
- ScenePresence agent, Vector3 pos, uint neighbourx, uint neighboury, GridRegion neighbourRegion,
+ ScenePresence agent, Vector3 pos, GridRegion neighbourRegion,
bool isFlying, string version)
{
- if (neighbourRegion == null)
+ if (!CrossAgentToNewRegionPrep(agent, neighbourRegion))
return agent;
- try
- {
- m_entityTransferStateMachine.SetInTransit(agent.UUID);
-
- ulong neighbourHandle = Utils.UIntsToLong((uint)(neighbourx * Constants.RegionSize), (uint)(neighboury * Constants.RegionSize));
-
- m_log.DebugFormat(
- "[ENTITY TRANSFER MODULE]: Crossing agent {0} {1} to {2}-{3} running version {4}",
- agent.Firstname, agent.Lastname, neighbourx, neighboury, version);
-
- Scene m_scene = agent.Scene;
-
- if (!agent.ValidateAttachments())
- m_log.DebugFormat(
- "[ENTITY TRANSFER MODULE]: Failed validation of all attachments for region crossing of {0} from {1} to {2}. Continuing.",
- agent.Name, agent.Scene.RegionInfo.RegionName, neighbourRegion.RegionName);
-
- pos = pos + agent.Velocity;
- Vector3 vel2 = new Vector3(agent.Velocity.X, agent.Velocity.Y, 0);
+ if (!CrossAgentIntoNewRegionMain(agent, pos, neighbourRegion, isFlying))
+ return agent;
- agent.RemoveFromPhysicalScene();
+ CrossAgentToNewRegionPost(agent, pos, neighbourRegion, isFlying, version);
+ return agent;
+ }
+ public bool CrossAgentIntoNewRegionMain(ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, bool isFlying)
+ {
+ try
+ {
AgentData cAgent = new AgentData();
agent.CopyTo(cAgent);
- cAgent.Position = pos;
+ cAgent.Position = pos + agent.Velocity;
if (isFlying)
cAgent.ControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY;
@@ -1084,7 +1085,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
// Beyond this point, extra cleanup is needed beyond removing transit state
m_entityTransferStateMachine.UpdateInTransit(agent.UUID, AgentTransferState.Transferring);
- if (!m_scene.SimulationService.UpdateAgent(neighbourRegion, cAgent))
+ if (!agent.Scene.SimulationService.UpdateAgent(neighbourRegion, cAgent))
{
// region doesn't take it
m_entityTransferStateMachine.UpdateInTransit(agent.UUID, AgentTransferState.CleaningUp);
@@ -1093,93 +1094,108 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
agent.AddToPhysicalScene(isFlying);
m_entityTransferStateMachine.ResetFromTransit(agent.UUID);
- return agent;
+ return false;
}
- //AgentCircuitData circuitdata = m_controllingClient.RequestClientInfo();
- agent.ControllingClient.RequestClientInfo();
+ }
+ catch (Exception e)
+ {
+ m_log.ErrorFormat(
+ "[ENTITY TRANSFER MODULE]: Problem crossing user {0} to new region {1} from {2}. Exception {3}{4}",
+ agent.Name, neighbourRegion.RegionName, agent.Scene.RegionInfo.RegionName, e.Message, e.StackTrace);
- //m_log.Debug("BEFORE CROSS");
- //Scene.DumpChildrenSeeds(UUID);
- //DumpKnownRegions();
- string agentcaps;
- if (!agent.KnownRegions.TryGetValue(neighbourRegion.RegionHandle, out agentcaps))
- {
- m_log.ErrorFormat("[ENTITY TRANSFER MODULE]: No ENTITY TRANSFER MODULE information for region handle {0}, exiting CrossToNewRegion.",
- neighbourRegion.RegionHandle);
- return agent;
- }
- // No turning back
- agent.IsChildAgent = true;
+ // TODO: Might be worth attempting other restoration here such as reinstantiation of scripts, etc.
+ return false;
+ }
- string capsPath = neighbourRegion.ServerURI + CapsUtil.GetCapsSeedPath(agentcaps);
+ return true;
+ }
- m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} to client {1}", capsPath, agent.UUID);
+ public void CrossAgentToNewRegionPost(ScenePresence agent, Vector3 pos, GridRegion neighbourRegion,
+ bool isFlying, string version)
+ {
+ agent.ControllingClient.RequestClientInfo();
- if (m_eqModule != null)
- {
- m_eqModule.CrossRegion(
- neighbourHandle, pos, vel2 /* agent.Velocity */, neighbourRegion.ExternalEndPoint,
- capsPath, agent.UUID, agent.ControllingClient.SessionId);
- }
- else
- {
- agent.ControllingClient.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourRegion.ExternalEndPoint,
- capsPath);
- }
+ string agentcaps;
+ if (!agent.KnownRegions.TryGetValue(neighbourRegion.RegionHandle, out agentcaps))
+ {
+ m_log.ErrorFormat("[ENTITY TRANSFER MODULE]: No ENTITY TRANSFER MODULE information for region handle {0}, exiting CrossToNewRegion.",
+ neighbourRegion.RegionHandle);
+ return;
+ }
- // SUCCESS!
- m_entityTransferStateMachine.UpdateInTransit(agent.UUID, AgentTransferState.ReceivedAtDestination);
+ // No turning back
+ agent.IsChildAgent = true;
- // Unlike a teleport, here we do not wait for the destination region to confirm the receipt.
- m_entityTransferStateMachine.UpdateInTransit(agent.UUID, AgentTransferState.CleaningUp);
+ string capsPath = neighbourRegion.ServerURI + CapsUtil.GetCapsSeedPath(agentcaps);
- agent.MakeChildAgent();
+ m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} to client {1}", capsPath, agent.UUID);
- // FIXME: Possibly this should occur lower down after other commands to close other agents,
- // but not sure yet what the side effects would be.
- m_entityTransferStateMachine.ResetFromTransit(agent.UUID);
+ Vector3 vel2 = new Vector3(agent.Velocity.X, agent.Velocity.Y, 0);
- // now we have a child agent in this region. Request all interesting data about other (root) agents
- agent.SendOtherAgentsAvatarDataToMe();
- agent.SendOtherAgentsAppearanceToMe();
+ if (m_eqModule != null)
+ {
+ m_eqModule.CrossRegion(
+ neighbourRegion.RegionHandle, pos + agent.Velocity, vel2 /* agent.Velocity */, neighbourRegion.ExternalEndPoint,
+ capsPath, agent.UUID, agent.ControllingClient.SessionId);
+ }
+ else
+ {
+ agent.ControllingClient.CrossRegion(neighbourRegion.RegionHandle, pos + agent.Velocity, agent.Velocity, neighbourRegion.ExternalEndPoint,
+ capsPath);
+ }
- // Backwards compatibility. Best effort
- if (version == "Unknown" || version == string.Empty)
- {
- m_log.DebugFormat("[ENTITY TRANSFER MODULE]: neighbor with old version, passing attachments one by one...");
- Thread.Sleep(3000); // wait a little now that we're not waiting for the callback
- CrossAttachmentsIntoNewRegion(neighbourRegion, agent, true);
- }
+ // SUCCESS!
+ m_entityTransferStateMachine.UpdateInTransit(agent.UUID, AgentTransferState.ReceivedAtDestination);
- // Next, let's close the child agent connections that are too far away.
- agent.CloseChildAgents(neighbourx, neighboury);
+ // Unlike a teleport, here we do not wait for the destination region to confirm the receipt.
+ m_entityTransferStateMachine.UpdateInTransit(agent.UUID, AgentTransferState.CleaningUp);
- AgentHasMovedAway(agent, false);
+ agent.MakeChildAgent();
- // the user may change their profile information in other region,
- // so the userinfo in UserProfileCache is not reliable any more, delete it
- // REFACTORING PROBLEM. Well, not a problem, but this method is HORRIBLE!
- if (agent.Scene.NeedSceneCacheClear(agent.UUID))
- {
- m_log.DebugFormat(
- "[ENTITY TRANSFER MODULE]: User {0} is going to another region", agent.UUID);
- }
-
- //m_log.Debug("AFTER CROSS");
- //Scene.DumpChildrenSeeds(UUID);
- //DumpKnownRegions();
- }
- catch (Exception e)
+ // FIXME: Possibly this should occur lower down after other commands to close other agents,
+ // but not sure yet what the side effects would be.
+ m_entityTransferStateMachine.ResetFromTransit(agent.UUID);
+
+ // now we have a child agent in this region. Request all interesting data about other (root) agents
+ agent.SendOtherAgentsAvatarDataToMe();
+ agent.SendOtherAgentsAppearanceToMe();
+
+ // Backwards compatibility. Best effort
+ if (version == "Unknown" || version == string.Empty)
{
- m_log.ErrorFormat(
- "[ENTITY TRANSFER MODULE]: Problem crossing user {0} to new region {1} from {2}. Exception {3}{4}",
- agent.Name, neighbourRegion.RegionName, agent.Scene.RegionInfo.RegionName, e.Message, e.StackTrace);
+ m_log.DebugFormat("[ENTITY TRANSFER MODULE]: neighbor with old version, passing attachments one by one...");
+ Thread.Sleep(3000); // wait a little now that we're not waiting for the callback
+ CrossAttachmentsIntoNewRegion(neighbourRegion, agent, true);
+ }
- // TODO: Might be worth attempting other restoration here such as reinstantiation of scripts, etc.
+ // Next, let's close the child agent connections that are too far away.
+ uint neighbourx;
+ uint neighboury;
+
+ Utils.LongToUInts(neighbourRegion.RegionHandle, out neighbourx, out neighboury);
+
+ neighbourx /= Constants.RegionSize;
+ neighboury /= Constants.RegionSize;
+
+ agent.CloseChildAgents(neighbourx, neighboury);
+
+ AgentHasMovedAway(agent, false);
+
+ // the user may change their profile information in other region,
+ // so the userinfo in UserProfileCache is not reliable any more, delete it
+ // REFACTORING PROBLEM. Well, not a problem, but this method is HORRIBLE!
+ if (agent.Scene.NeedSceneCacheClear(agent.UUID))
+ {
+ m_log.DebugFormat(
+ "[ENTITY TRANSFER MODULE]: User {0} is going to another region", agent.UUID);
}
- return agent;
+ //m_log.Debug("AFTER CROSS");
+ //Scene.DumpChildrenSeeds(UUID);
+ //DumpKnownRegions();
+
+ return;
}
private void CrossAgentToNewRegionCompleted(IAsyncResult iar)
--
cgit v1.1
From 3fb2523f5b324862f4a125c5bdaeff9e512a67c0 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Tue, 4 Sep 2012 03:20:37 +0200
Subject: Remove debug spam
---
OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
(limited to 'OpenSim/Region/CoreModules')
diff --git a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
index e0e358a..13762f7 100644
--- a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
+++ b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
@@ -188,9 +188,9 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
args.Type = PollServiceEventArgs.EventType.LslHttp;
m_HttpServer.AddPollServiceHTTPHandler(uri, args);
- m_log.DebugFormat(
- "[URL MODULE]: Set up incoming request url {0} for {1} in {2} {3}",
- uri, itemID, host.Name, host.LocalId);
+// m_log.DebugFormat(
+// "[URL MODULE]: Set up incoming request url {0} for {1} in {2} {3}",
+// uri, itemID, host.Name, host.LocalId);
engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_GRANTED", url });
}
@@ -234,9 +234,9 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
args.Type = PollServiceEventArgs.EventType.LslHttp;
m_HttpsServer.AddPollServiceHTTPHandler(uri, args);
- m_log.DebugFormat(
- "[URL MODULE]: Set up incoming secure request url {0} for {1} in {2} {3}",
- uri, itemID, host.Name, host.LocalId);
+// m_log.DebugFormat(
+// "[URL MODULE]: Set up incoming secure request url {0} for {1} in {2} {3}",
+// uri, itemID, host.Name, host.LocalId);
engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_GRANTED", url });
}
--
cgit v1.1
From e1755e2d71e0573e02c042bc1e9fe409842cc214 Mon Sep 17 00:00:00 2001
From: UbitUmarov
Date: Tue, 4 Sep 2012 04:56:37 +0100
Subject: let avatar keep flying in tps to same region. (still bad for other
regions )
---
.../CoreModules/Framework/EntityTransfer/EntityTransferModule.cs | 6 ++++++
1 file changed, 6 insertions(+)
(limited to 'OpenSim/Region/CoreModules')
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
index 9ffb851..86d7f83 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
@@ -264,6 +264,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
position.Z = newPosZ;
}
+ if (sp.Flying)
+ teleportFlags |= (uint)TeleportFlags.IsFlying;
+
m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.Transferring);
sp.ControllingClient.SendTeleportStart(teleportFlags);
@@ -471,6 +474,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
if (sp.ParentID != (uint)0)
sp.StandUp();
+ else if (sp.Flying)
+ teleportFlags |= (uint)TeleportFlags.IsFlying;
+
sp.ControllingClient.SendTeleportStart(teleportFlags);
// the avatar.Close below will clear the child region list. We need this below for (possibly)
--
cgit v1.1
From c83dd021f300a4272c8a869d20087dac29992c6d Mon Sep 17 00:00:00 2001
From: UbitUmarov
Date: Fri, 7 Sep 2012 11:37:51 +0100
Subject: stop sending duplicated parcelProprieties at login
---
.../CoreModules/World/Land/LandManagementModule.cs | 57 +++++++++++++++-------
1 file changed, 39 insertions(+), 18 deletions(-)
(limited to 'OpenSim/Region/CoreModules')
diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
index 8bc81ae..aae6603 100644
--- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
+++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
@@ -401,30 +401,51 @@ namespace OpenSim.Region.CoreModules.World.Land
public void SendLandUpdate(ScenePresence avatar, bool force)
{
+
+ /* stop sendind same data twice
+ ILandObject over = GetLandObject((int)Math.Min(((int)Constants.RegionSize - 1), Math.Max(0, Math.Round(avatar.AbsolutePosition.X))),
+ (int)Math.Min(((int)Constants.RegionSize - 1), Math.Max(0, Math.Round(avatar.AbsolutePosition.Y))));
+
+ if (over != null)
+ {
+
+ if (force)
+ {
+ if (!avatar.IsChildAgent)
+ {
+ over.SendLandUpdateToClient(avatar.ControllingClient);
+ m_scene.EventManager.TriggerAvatarEnteringNewParcel(avatar, over.LandData.LocalID,
+ m_scene.RegionInfo.RegionID);
+ }
+ }
+
+ if (avatar.currentParcelUUID != over.LandData.GlobalID)
+ {
+ if (!avatar.IsChildAgent)
+ {
+ over.SendLandUpdateToClient(avatar.ControllingClient);
+ avatar.currentParcelUUID = over.LandData.GlobalID;
+ m_scene.EventManager.TriggerAvatarEnteringNewParcel(avatar, over.LandData.LocalID,
+ m_scene.RegionInfo.RegionID);
+ }
+ }
+ */
+ if (avatar.IsChildAgent)
+ return;
+
ILandObject over = GetLandObject((int)Math.Min(((int)Constants.RegionSize - 1), Math.Max(0, Math.Round(avatar.AbsolutePosition.X))),
- (int)Math.Min(((int)Constants.RegionSize - 1), Math.Max(0, Math.Round(avatar.AbsolutePosition.Y))));
+ (int)Math.Min(((int)Constants.RegionSize - 1), Math.Max(0, Math.Round(avatar.AbsolutePosition.Y))));
if (over != null)
{
- if (force)
+ bool NotsameID = (avatar.currentParcelUUID != over.LandData.GlobalID);
+ if (force || NotsameID)
{
- if (!avatar.IsChildAgent)
- {
- over.SendLandUpdateToClient(avatar.ControllingClient);
- m_scene.EventManager.TriggerAvatarEnteringNewParcel(avatar, over.LandData.LocalID,
- m_scene.RegionInfo.RegionID);
- }
- }
-
- if (avatar.currentParcelUUID != over.LandData.GlobalID)
- {
- if (!avatar.IsChildAgent)
- {
- over.SendLandUpdateToClient(avatar.ControllingClient);
+ over.SendLandUpdateToClient(avatar.ControllingClient);
+ if (NotsameID)
avatar.currentParcelUUID = over.LandData.GlobalID;
- m_scene.EventManager.TriggerAvatarEnteringNewParcel(avatar, over.LandData.LocalID,
- m_scene.RegionInfo.RegionID);
- }
+ m_scene.EventManager.TriggerAvatarEnteringNewParcel(avatar, over.LandData.LocalID,
+ m_scene.RegionInfo.RegionID);
}
}
}
--
cgit v1.1
From 0556bbefdda9643abf4bbba08ab8e3f066501b74 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Sun, 9 Sep 2012 16:30:01 +0200
Subject: Catch zero UUIDs in LSL and shout as an error. Also catch attempts to
send IM to UUID.Zero because it ties up XMLRPC handlers needlessly.
---
.../Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs | 3 +++
1 file changed, 3 insertions(+)
(limited to 'OpenSim/Region/CoreModules')
diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs
index 1406aae..0c067d7 100644
--- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs
@@ -137,6 +137,9 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
{
UUID toAgentID = new UUID(im.toAgentID);
+ if (toAgentID == UUID.Zero)
+ return;
+
// Try root avatar only first
foreach (Scene scene in m_Scenes)
{
--
cgit v1.1