diff options
Diffstat (limited to 'OpenSim/Region/Environment/Modules/World')
-rw-r--r-- | OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs | 65 |
1 files changed, 52 insertions, 13 deletions
diff --git a/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs b/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs index 0245a9e..0ecfdd3 100644 --- a/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs | |||
@@ -42,6 +42,13 @@ using Caps = OpenSim.Framework.Communications.Capabilities.Caps; | |||
42 | 42 | ||
43 | namespace OpenSim.Region.Environment.Modules.World.Land | 43 | namespace OpenSim.Region.Environment.Modules.World.Land |
44 | { | 44 | { |
45 | // used for caching | ||
46 | internal class ExtendedLandData { | ||
47 | public LandData landData; | ||
48 | public ulong regionHandle; | ||
49 | public uint x, y; | ||
50 | } | ||
51 | |||
45 | public class LandManagementModule : IRegionModule | 52 | public class LandManagementModule : IRegionModule |
46 | { | 53 | { |
47 | private static readonly ILog m_log = | 54 | private static readonly ILog m_log = |
@@ -60,6 +67,9 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
60 | 67 | ||
61 | private bool m_allowedForcefulBans = true; | 68 | private bool m_allowedForcefulBans = true; |
62 | 69 | ||
70 | // caches ExtendedLandData | ||
71 | private Cache parcelInfoCache; | ||
72 | |||
63 | #region IRegionModule Members | 73 | #region IRegionModule Members |
64 | 74 | ||
65 | public void Initialise(Scene scene, IConfigSource source) | 75 | public void Initialise(Scene scene, IConfigSource source) |
@@ -68,6 +78,10 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
68 | landIDList.Initialize(); | 78 | landIDList.Initialize(); |
69 | landChannel = new LandChannel(scene, this); | 79 | landChannel = new LandChannel(scene, this); |
70 | 80 | ||
81 | parcelInfoCache = new Cache(); | ||
82 | parcelInfoCache.Size = 30; // the number of different parcel requests in this region to cache | ||
83 | parcelInfoCache.DefaultTTL = new TimeSpan(0, 5, 0); | ||
84 | |||
71 | m_scene.EventManager.OnParcelPrimCountAdd += AddPrimToLandPrimCounts; | 85 | m_scene.EventManager.OnParcelPrimCountAdd += AddPrimToLandPrimCounts; |
72 | m_scene.EventManager.OnParcelPrimCountUpdate += UpdateLandPrimCounts; | 86 | m_scene.EventManager.OnParcelPrimCountUpdate += UpdateLandPrimCounts; |
73 | m_scene.EventManager.OnAvatarEnteringNewParcel += new EventManager.AvatarEnteringNewParcel(handleAvatarChangingParcel); | 87 | m_scene.EventManager.OnAvatarEnteringNewParcel += new EventManager.AvatarEnteringNewParcel(handleAvatarChangingParcel); |
@@ -1173,23 +1187,48 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
1173 | if (parcelID == UUID.Zero) | 1187 | if (parcelID == UUID.Zero) |
1174 | return; | 1188 | return; |
1175 | 1189 | ||
1176 | // assume we've got the parcelID we just computed in RemoteParcelRequest | 1190 | ExtendedLandData data = (ExtendedLandData)parcelInfoCache.Get(parcelID, delegate(UUID parcel) { |
1177 | ulong regionHandle; | 1191 | // assume we've got the parcelID we just computed in RemoteParcelRequest |
1178 | uint x, y; | 1192 | ExtendedLandData extLandData = new ExtendedLandData(); |
1179 | Util.ParseFakeParcelID(parcelID, out regionHandle, out x, out y); | 1193 | Util.ParseFakeParcelID(parcel, out extLandData.regionHandle, out extLandData.x, out extLandData.y); |
1180 | m_log.DebugFormat("[LAND] got parcelinfo request for regionHandle {0}, x/y {1}/{2}", regionHandle, x, y); | 1194 | m_log.DebugFormat("[LAND] got parcelinfo request for regionHandle {0}, x/y {1}/{2}", |
1195 | extLandData.regionHandle, extLandData.x, extLandData.y); | ||
1181 | 1196 | ||
1182 | LandData landData; | 1197 | // for this region or for somewhere else? |
1183 | if (regionHandle == m_scene.RegionInfo.RegionHandle) | 1198 | if (extLandData.regionHandle == m_scene.RegionInfo.RegionHandle) |
1184 | landData = this.GetLandObject(x, y).landData; | 1199 | { |
1185 | else | 1200 | extLandData.landData = this.GetLandObject(extLandData.x, extLandData.y).landData; |
1186 | landData = m_scene.CommsManager.GridService.RequestLandData(regionHandle, x, y); | 1201 | } |
1202 | else | ||
1203 | { | ||
1204 | extLandData.landData = m_scene.CommsManager.GridService.RequestLandData(extLandData.regionHandle, | ||
1205 | extLandData.x, | ||
1206 | extLandData.y); | ||
1207 | if (extLandData.landData == null) | ||
1208 | { | ||
1209 | // we didn't find the region/land => don't cache | ||
1210 | return null; | ||
1211 | } | ||
1212 | } | ||
1213 | return extLandData; | ||
1214 | }); | ||
1187 | 1215 | ||
1188 | if (landData != null) | 1216 | if (data != null) // if we found some data, send it |
1189 | { | 1217 | { |
1218 | RegionInfo info; | ||
1219 | if (data.regionHandle == m_scene.RegionInfo.RegionHandle) | ||
1220 | { | ||
1221 | info = m_scene.RegionInfo; | ||
1222 | } | ||
1223 | else | ||
1224 | { | ||
1225 | // most likely still cached from building the extLandData entry | ||
1226 | info = m_scene.CommsManager.GridService.RequestNeighbourInfo(data.regionHandle); | ||
1227 | } | ||
1190 | // we need to transfer the fake parcelID, not the one in landData, so the viewer can match it to the landmark. | 1228 | // we need to transfer the fake parcelID, not the one in landData, so the viewer can match it to the landmark. |
1191 | m_log.Debug("[LAND] got parcelinfo; sending"); | 1229 | m_log.DebugFormat("[LAND] got parcelinfo for parcel {0} in region {1}; sending...", |
1192 | remoteClient.SendParcelInfo(m_scene.RegionInfo, landData, parcelID, x, y); | 1230 | data.landData.Name, data.regionHandle); |
1231 | remoteClient.SendParcelInfo(info, data.landData, parcelID, data.x, data.y); | ||
1193 | } | 1232 | } |
1194 | else | 1233 | else |
1195 | m_log.Debug("[LAND] got no parcelinfo; not sending"); | 1234 | m_log.Debug("[LAND] got no parcelinfo; not sending"); |