From 25ca8695f3746b000fee42a0d73b91dfa6a1c9c0 Mon Sep 17 00:00:00 2001
From: UbitUmarov
Date: Sat, 13 May 2017 20:21:56 +0100
Subject: find parcels by GlobalID.. well most time
---
OpenSim/Framework/ILandChannel.cs | 2 +
.../Region/CoreModules/World/Land/DwellModule.cs | 3 ++
.../Region/CoreModules/World/Land/LandChannel.cs | 9 ++++
.../CoreModules/World/Land/LandManagementModule.cs | 58 +++++++++++++++++-----
OpenSim/Tests/Common/Mock/TestLandChannel.cs | 5 ++
5 files changed, 65 insertions(+), 12 deletions(-)
diff --git a/OpenSim/Framework/ILandChannel.cs b/OpenSim/Framework/ILandChannel.cs
index 44a24b9..12a8228 100644
--- a/OpenSim/Framework/ILandChannel.cs
+++ b/OpenSim/Framework/ILandChannel.cs
@@ -76,6 +76,8 @@ namespace OpenSim.Region.Framework.Interfaces
///
ILandObject GetLandObject(int localID);
+ ILandObject GetLandObject(UUID GlobalID);
+
///
/// Clear the land channel of all parcels.
///
diff --git a/OpenSim/Region/CoreModules/World/Land/DwellModule.cs b/OpenSim/Region/CoreModules/World/Land/DwellModule.cs
index 70c6028..5f1eab2 100644
--- a/OpenSim/Region/CoreModules/World/Land/DwellModule.cs
+++ b/OpenSim/Region/CoreModules/World/Land/DwellModule.cs
@@ -120,6 +120,9 @@ namespace OpenSim.Region.CoreModules.World.Land
public int GetDwell(UUID parcelID)
{
+ ILandObject parcel = m_scene.LandChannel.GetLandObject(parcelID);
+ if (parcel != null && parcel.LandData != null)
+ return (int)parcel.LandData.Dwell;
return 0;
}
}
diff --git a/OpenSim/Region/CoreModules/World/Land/LandChannel.cs b/OpenSim/Region/CoreModules/World/Land/LandChannel.cs
index e4c0373..b59e2af 100644
--- a/OpenSim/Region/CoreModules/World/Land/LandChannel.cs
+++ b/OpenSim/Region/CoreModules/World/Land/LandChannel.cs
@@ -106,6 +106,15 @@ namespace OpenSim.Region.CoreModules.World.Land
return null;
}
+ public ILandObject GetLandObject(UUID GlobalID)
+ {
+ if (m_landManagementModule != null)
+ {
+ return m_landManagementModule.GetLandObject(GlobalID);
+ }
+ return null;
+ }
+
public ILandObject GetLandObject(Vector3 position)
{
return GetLandObject(position.X, position.Y);
diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
index 53b9796..e1f2975 100644
--- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
+++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
@@ -92,6 +92,7 @@ namespace OpenSim.Region.CoreModules.World.Land
//ubit: removed the readonly so i can move it around
private Dictionary m_landList = new Dictionary();
+ private Dictionary m_landUUIDList = new Dictionary();
private int m_lastLandLocalID = LandChannel.START_LAND_LOCAL_ID - 1;
@@ -249,7 +250,10 @@ namespace OpenSim.Region.CoreModules.World.Land
lock (m_landList)
{
if (m_landList.TryGetValue(local_id, out land))
+ {
land.LandData = newData;
+ m_landUUIDList[newData.GlobalID] = local_id;
+ }
}
if (land != null)
@@ -271,6 +275,7 @@ namespace OpenSim.Region.CoreModules.World.Land
lock (m_landList)
{
m_landList.Clear();
+ m_landUUIDList.Clear();
m_lastLandLocalID = LandChannel.START_LAND_LOCAL_ID - 1;
m_landIDList = new int[m_scene.RegionInfo.RegionSizeX / LandUnit, m_scene.RegionInfo.RegionSizeY / LandUnit];
@@ -434,6 +439,15 @@ namespace OpenSim.Region.CoreModules.World.Land
if (parcelAvatarIsEntering != null &&
avatar.currentParcelUUID != parcelAvatarIsEntering.LandData.GlobalID)
{
+ if(!avatar.IsNPC && avatar.currentParcelUUID != UUID.Zero)
+ {
+ ILandObject last = GetLandObject(avatar.currentParcelUUID);
+ if(last != null)
+ {
+
+ }
+ }
+
SendLandUpdate(avatar, parcelAvatarIsEntering);
avatar.currentParcelUUID = parcelAvatarIsEntering.LandData.GlobalID;
EnforceBans(parcelAvatarIsEntering, avatar);
@@ -656,6 +670,7 @@ namespace OpenSim.Region.CoreModules.World.Land
}
m_landList.Add(newLandLocalID, new_land);
+ m_landUUIDList[new_land.LandData.GlobalID] = newLandLocalID;
m_lastLandLocalID++;
}
@@ -690,6 +705,8 @@ namespace OpenSim.Region.CoreModules.World.Land
land = m_landList[local_id];
m_landList.Remove(local_id);
+ if(land.LandData != null)
+ m_landUUIDList.Remove(land.LandData.GlobalID);
}
m_scene.EventManager.TriggerLandObjectRemoved(land.LandData.GlobalID);
@@ -745,6 +762,24 @@ namespace OpenSim.Region.CoreModules.World.Land
UpdateLandObject(master.LandData.LocalID, master.LandData);
}
+ public ILandObject GetLandObject(UUID globalID)
+ {
+ lock (m_landList)
+ {
+ int lid = -1;
+ if(m_landUUIDList.TryGetValue(globalID, out lid) && lid >= 0)
+ {
+ if (m_landList.ContainsKey(lid))
+ {
+ return m_landList[lid];
+ }
+ else
+ m_landUUIDList.Remove(globalID); // auto heal
+ }
+ }
+ return null;
+ }
+
public ILandObject GetLandObject(int parcelLocalID)
{
lock (m_landList)
@@ -1351,7 +1386,7 @@ namespace OpenSim.Region.CoreModules.World.Land
public void ClientOnParcelObjectOwnerRequest(int local_id, IClientAPI remote_client)
{
- ILandObject land;
+ ILandObject land = null;
lock (m_landList)
{
m_landList.TryGetValue(local_id, out land);
@@ -1360,7 +1395,7 @@ namespace OpenSim.Region.CoreModules.World.Land
if (land != null)
{
m_scene.EventManager.TriggerParcelPrimCountUpdate();
- m_landList[local_id].SendLandObjectOwners(remote_client);
+ land.SendLandObjectOwners(remote_client);
}
else
{
@@ -1370,7 +1405,7 @@ namespace OpenSim.Region.CoreModules.World.Land
public void ClientOnParcelGodForceOwner(int local_id, UUID ownerID, IClientAPI remote_client)
{
- ILandObject land;
+ ILandObject land = null;
lock (m_landList)
{
m_landList.TryGetValue(local_id, out land);
@@ -1393,7 +1428,7 @@ namespace OpenSim.Region.CoreModules.World.Land
public void ClientOnParcelAbandonRequest(int local_id, IClientAPI remote_client)
{
- ILandObject land;
+ ILandObject land = null;
lock (m_landList)
{
m_landList.TryGetValue(local_id, out land);
@@ -1417,7 +1452,7 @@ namespace OpenSim.Region.CoreModules.World.Land
public void ClientOnParcelReclaim(int local_id, IClientAPI remote_client)
{
- ILandObject land;
+ ILandObject land = null;
lock (m_landList)
{
m_landList.TryGetValue(local_id, out land);
@@ -1503,17 +1538,16 @@ namespace OpenSim.Region.CoreModules.World.Land
void ClientOnParcelDeedToGroup(int parcelLocalID, UUID groupID, IClientAPI remote_client)
{
- ILandObject land;
+ ILandObject land = null;
lock (m_landList)
{
m_landList.TryGetValue(parcelLocalID, out land);
}
- if (!m_scene.Permissions.CanDeedParcel(remote_client.AgentId, land))
- return;
-
if (land != null)
{
+ if (!m_scene.Permissions.CanDeedParcel(remote_client.AgentId, land))
+ return;
land.DeedToGroup(groupID);
}
}
@@ -1763,7 +1797,7 @@ namespace OpenSim.Region.CoreModules.World.Land
land_update.GroupAVSounds = true;
}
- ILandObject land;
+ ILandObject land = null;
lock (m_landList)
{
m_landList.TryGetValue(parcelID, out land);
@@ -1951,7 +1985,7 @@ namespace OpenSim.Region.CoreModules.World.Land
public void setParcelOtherCleanTime(IClientAPI remoteClient, int localID, int otherCleanTime)
{
- ILandObject land;
+ ILandObject land = null;
lock (m_landList)
{
m_landList.TryGetValue(localID, out land);
@@ -2248,7 +2282,7 @@ namespace OpenSim.Region.CoreModules.World.Land
if (!ConsoleUtil.TryParseConsoleInt(MainConsole.Instance, args[2], out landLocalId))
return;
- ILandObject lo;
+ ILandObject lo = null;
lock (m_landList)
{
diff --git a/OpenSim/Tests/Common/Mock/TestLandChannel.cs b/OpenSim/Tests/Common/Mock/TestLandChannel.cs
index 3d44a33..48dc840 100644
--- a/OpenSim/Tests/Common/Mock/TestLandChannel.cs
+++ b/OpenSim/Tests/Common/Mock/TestLandChannel.cs
@@ -96,6 +96,11 @@ namespace OpenSim.Tests.Common
return GetNoLand();
}
+ public ILandObject GetLandObject(UUID ID)
+ {
+ return GetNoLand();
+ }
+
public ILandObject GetLandObject(float x, float y)
{
return GetNoLand();
--
cgit v1.1