diff options
author | mingchen | 2007-12-17 03:49:13 +0000 |
---|---|---|
committer | mingchen | 2007-12-17 03:49:13 +0000 |
commit | d845da215f8d30ef3f34a3c207fb892c815d1fac (patch) | |
tree | a1714f51422e4b5639d28459569d6235c86751d1 /OpenSim/Region/Environment | |
parent | Again, thanks to Alondria for: (diff) | |
download | opensim-SC-d845da215f8d30ef3f34a3c207fb892c815d1fac.zip opensim-SC-d845da215f8d30ef3f34a3c207fb892c815d1fac.tar.gz opensim-SC-d845da215f8d30ef3f34a3c207fb892c815d1fac.tar.bz2 opensim-SC-d845da215f8d30ef3f34a3c207fb892c815d1fac.tar.xz |
*Land has now been linked to the StorageManager. Next step is to fill in the functions for the different datastore interfaces for Land Objects.
Diffstat (limited to 'OpenSim/Region/Environment')
4 files changed, 123 insertions, 43 deletions
diff --git a/OpenSim/Region/Environment/Interfaces/IRegionDataStore.cs b/OpenSim/Region/Environment/Interfaces/IRegionDataStore.cs index 9c2edb9..919cfdc 100644 --- a/OpenSim/Region/Environment/Interfaces/IRegionDataStore.cs +++ b/OpenSim/Region/Environment/Interfaces/IRegionDataStore.cs | |||
@@ -50,9 +50,9 @@ namespace OpenSim.Region.Environment.Interfaces | |||
50 | void StoreTerrain(double[,] terrain, LLUUID regionID); | 50 | void StoreTerrain(double[,] terrain, LLUUID regionID); |
51 | double[,] LoadTerrain(LLUUID regionID); | 51 | double[,] LoadTerrain(LLUUID regionID); |
52 | 52 | ||
53 | void StoreParcel(Land Parcel); | 53 | void StoreLandObject(Land Parcel,LLUUID regionUUID); |
54 | void RemoveLandObject(uint ID); | 54 | void RemoveLandObject(uint ID, LLUUID regionUUID); |
55 | List<Land> LoadLandObjects(); | 55 | List<Framework.LandData> LoadLandObjects(LLUUID regionUUID); |
56 | 56 | ||
57 | void Shutdown(); | 57 | void Shutdown(); |
58 | } | 58 | } |
diff --git a/OpenSim/Region/Environment/LandManagement/Land.cs b/OpenSim/Region/Environment/LandManagement/Land.cs index 45e8aac..3f60b1b 100644 --- a/OpenSim/Region/Environment/LandManagement/Land.cs +++ b/OpenSim/Region/Environment/LandManagement/Land.cs | |||
@@ -32,6 +32,7 @@ using libsecondlife; | |||
32 | using libsecondlife.Packets; | 32 | using libsecondlife.Packets; |
33 | using OpenSim.Framework; | 33 | using OpenSim.Framework; |
34 | using OpenSim.Region.Environment.Scenes; | 34 | using OpenSim.Region.Environment.Scenes; |
35 | using OpenSim.Region.Environment.Interfaces; | ||
35 | 36 | ||
36 | namespace OpenSim.Region.Environment.LandManagement | 37 | namespace OpenSim.Region.Environment.LandManagement |
37 | { | 38 | { |
@@ -47,7 +48,6 @@ namespace OpenSim.Region.Environment.LandManagement | |||
47 | 48 | ||
48 | public LandData landData = new LandData(); | 49 | public LandData landData = new LandData(); |
49 | public List<SceneObjectGroup> primsOverMe = new List<SceneObjectGroup>(); | 50 | public List<SceneObjectGroup> primsOverMe = new List<SceneObjectGroup>(); |
50 | public List<libsecondlife.ParcelManager.ParcelAccessEntry> parcelAccessList = new List<ParcelManager.ParcelAccessEntry>(); | ||
51 | public Scene m_scene; | 51 | public Scene m_scene; |
52 | 52 | ||
53 | private bool[,] landBitmap = new bool[64,64]; | 53 | private bool[,] landBitmap = new bool[64,64]; |
@@ -93,21 +93,12 @@ namespace OpenSim.Region.Environment.LandManagement | |||
93 | 93 | ||
94 | //Place all new variables here! | 94 | //Place all new variables here! |
95 | newLand.landBitmap = (bool[,]) (landBitmap.Clone()); | 95 | newLand.landBitmap = (bool[,]) (landBitmap.Clone()); |
96 | newLand.parcelAccessList.Clear(); | ||
97 | foreach (ParcelManager.ParcelAccessEntry entry in parcelAccessList) | ||
98 | { | ||
99 | ParcelManager.ParcelAccessEntry newEntry = new ParcelManager.ParcelAccessEntry(); | ||
100 | newEntry.AgentID = entry.AgentID; | ||
101 | newEntry.Flags = entry.Flags; | ||
102 | newEntry.Time = entry.Time; | ||
103 | |||
104 | newLand.parcelAccessList.Add(newEntry); | ||
105 | } | ||
106 | newLand.landData = landData.Copy(); | 96 | newLand.landData = landData.Copy(); |
107 | 97 | ||
108 | return newLand; | 98 | return newLand; |
109 | } | 99 | } |
110 | 100 | ||
101 | |||
111 | #endregion | 102 | #endregion |
112 | 103 | ||
113 | #region Packet Request Handling | 104 | #region Packet Request Handling |
@@ -209,24 +200,30 @@ namespace OpenSim.Region.Environment.LandManagement | |||
209 | if (remote_client.AgentId == landData.ownerID) | 200 | if (remote_client.AgentId == landData.ownerID) |
210 | { | 201 | { |
211 | //Needs later group support | 202 | //Needs later group support |
212 | landData.authBuyerID = packet.ParcelData.AuthBuyerID; | 203 | LandData newData = landData.Copy(); |
213 | landData.category = (Parcel.ParcelCategory) packet.ParcelData.Category; | 204 | newData.authBuyerID = packet.ParcelData.AuthBuyerID; |
214 | landData.landDesc = Helpers.FieldToUTF8String(packet.ParcelData.Desc); | 205 | newData.category = (Parcel.ParcelCategory)packet.ParcelData.Category; |
215 | landData.groupID = packet.ParcelData.GroupID; | 206 | newData.landDesc = Helpers.FieldToUTF8String(packet.ParcelData.Desc); |
216 | landData.landingType = packet.ParcelData.LandingType; | 207 | newData.groupID = packet.ParcelData.GroupID; |
217 | landData.mediaAutoScale = packet.ParcelData.MediaAutoScale; | 208 | newData.landingType = packet.ParcelData.LandingType; |
218 | landData.mediaID = packet.ParcelData.MediaID; | 209 | newData.mediaAutoScale = packet.ParcelData.MediaAutoScale; |
219 | landData.mediaURL = Helpers.FieldToUTF8String(packet.ParcelData.MediaURL); | 210 | newData.mediaID = packet.ParcelData.MediaID; |
220 | landData.musicURL = Helpers.FieldToUTF8String(packet.ParcelData.MusicURL); | 211 | newData.mediaURL = Helpers.FieldToUTF8String(packet.ParcelData.MediaURL); |
221 | landData.landName = Helpers.FieldToUTF8String(packet.ParcelData.Name); | 212 | newData.musicURL = Helpers.FieldToUTF8String(packet.ParcelData.MusicURL); |
222 | landData.landFlags = packet.ParcelData.ParcelFlags; | 213 | newData.landName = Helpers.FieldToUTF8String(packet.ParcelData.Name); |
223 | landData.passHours = packet.ParcelData.PassHours; | 214 | newData.landFlags = packet.ParcelData.ParcelFlags; |
224 | landData.passPrice = packet.ParcelData.PassPrice; | 215 | newData.passHours = packet.ParcelData.PassHours; |
225 | landData.salePrice = packet.ParcelData.SalePrice; | 216 | newData.passPrice = packet.ParcelData.PassPrice; |
226 | landData.snapshotID = packet.ParcelData.SnapshotID; | 217 | newData.salePrice = packet.ParcelData.SalePrice; |
227 | landData.userLocation = packet.ParcelData.UserLocation; | 218 | newData.snapshotID = packet.ParcelData.SnapshotID; |
228 | landData.userLookAt = packet.ParcelData.UserLookAt; | 219 | newData.userLocation = packet.ParcelData.UserLocation; |
220 | newData.userLookAt = packet.ParcelData.UserLookAt; | ||
221 | |||
222 | m_scene.LandManager.updateLandObject(landData.localID, newData); | ||
223 | |||
229 | sendLandUpdateToAvatarsOverMe(); | 224 | sendLandUpdateToAvatarsOverMe(); |
225 | |||
226 | |||
230 | } | 227 | } |
231 | } | 228 | } |
232 | 229 | ||
@@ -257,7 +254,7 @@ namespace OpenSim.Region.Environment.LandManagement | |||
257 | public ParcelAccessListReplyPacket.ListBlock[] createAccessListArrayByFlag(ParcelManager.AccessList flag) | 254 | public ParcelAccessListReplyPacket.ListBlock[] createAccessListArrayByFlag(ParcelManager.AccessList flag) |
258 | { | 255 | { |
259 | List<ParcelAccessListReplyPacket.ListBlock> list = new List<ParcelAccessListReplyPacket.ListBlock>(); | 256 | List<ParcelAccessListReplyPacket.ListBlock> list = new List<ParcelAccessListReplyPacket.ListBlock>(); |
260 | foreach (ParcelManager.ParcelAccessEntry entry in parcelAccessList) | 257 | foreach (ParcelManager.ParcelAccessEntry entry in landData.parcelAccessList) |
261 | { | 258 | { |
262 | if (entry.Flags == flag) | 259 | if (entry.Flags == flag) |
263 | { | 260 | { |
@@ -317,13 +314,15 @@ namespace OpenSim.Region.Environment.LandManagement | |||
317 | 314 | ||
318 | public void updateAccessList(uint flags, List<ParcelManager.ParcelAccessEntry> entries, IClientAPI remote_client) | 315 | public void updateAccessList(uint flags, List<ParcelManager.ParcelAccessEntry> entries, IClientAPI remote_client) |
319 | { | 316 | { |
317 | LandData newData = landData.Copy(); | ||
318 | |||
320 | if (entries.Count == 1 && entries[0].AgentID == LLUUID.Zero) | 319 | if (entries.Count == 1 && entries[0].AgentID == LLUUID.Zero) |
321 | { | 320 | { |
322 | entries.Clear(); | 321 | entries.Clear(); |
323 | } | 322 | } |
324 | 323 | ||
325 | List<ParcelManager.ParcelAccessEntry> toRemove = new List<ParcelManager.ParcelAccessEntry>(); | 324 | List<ParcelManager.ParcelAccessEntry> toRemove = new List<ParcelManager.ParcelAccessEntry>(); |
326 | foreach (ParcelManager.ParcelAccessEntry entry in parcelAccessList) | 325 | foreach (ParcelManager.ParcelAccessEntry entry in newData.parcelAccessList) |
327 | { | 326 | { |
328 | if (entry.Flags == (ParcelManager.AccessList)flags) | 327 | if (entry.Flags == (ParcelManager.AccessList)flags) |
329 | { | 328 | { |
@@ -333,7 +332,7 @@ namespace OpenSim.Region.Environment.LandManagement | |||
333 | 332 | ||
334 | foreach (ParcelManager.ParcelAccessEntry entry in toRemove) | 333 | foreach (ParcelManager.ParcelAccessEntry entry in toRemove) |
335 | { | 334 | { |
336 | parcelAccessList.Remove(entry); | 335 | newData.parcelAccessList.Remove(entry); |
337 | } | 336 | } |
338 | foreach (ParcelManager.ParcelAccessEntry entry in entries) | 337 | foreach (ParcelManager.ParcelAccessEntry entry in entries) |
339 | { | 338 | { |
@@ -342,11 +341,14 @@ namespace OpenSim.Region.Environment.LandManagement | |||
342 | temp.Time = new DateTime() ; //Pointless? Yes. | 341 | temp.Time = new DateTime() ; //Pointless? Yes. |
343 | temp.Flags = (ParcelManager.AccessList)flags; | 342 | temp.Flags = (ParcelManager.AccessList)flags; |
344 | 343 | ||
345 | if (!this.parcelAccessList.Contains(temp)) | 344 | if (!newData.parcelAccessList.Contains(temp)) |
346 | { | 345 | { |
347 | this.parcelAccessList.Add(temp); | 346 | newData.parcelAccessList.Add(temp); |
348 | } | 347 | } |
349 | } | 348 | } |
349 | |||
350 | m_scene.LandManager.updateLandObject(landData.localID, newData); | ||
351 | |||
350 | } | 352 | } |
351 | 353 | ||
352 | #endregion | 354 | #endregion |
@@ -385,6 +387,7 @@ namespace OpenSim.Region.Environment.LandManagement | |||
385 | new LLVector3((float) (max_x*4), (float) (max_y*4), | 387 | new LLVector3((float) (max_x*4), (float) (max_y*4), |
386 | (float) m_scene.Terrain.GetHeight((max_x*4), (max_y*4))); | 388 | (float) m_scene.Terrain.GetHeight((max_x*4), (max_y*4))); |
387 | landData.area = tempArea; | 389 | landData.area = tempArea; |
390 | |||
388 | } | 391 | } |
389 | 392 | ||
390 | public void updateLandBitmapByteArray() | 393 | public void updateLandBitmapByteArray() |
diff --git a/OpenSim/Region/Environment/LandManagement/LandManager.cs b/OpenSim/Region/Environment/LandManagement/LandManager.cs index 0fa2c23..11845ae 100644 --- a/OpenSim/Region/Environment/LandManagement/LandManager.cs +++ b/OpenSim/Region/Environment/LandManagement/LandManager.cs | |||
@@ -31,6 +31,7 @@ using libsecondlife; | |||
31 | using libsecondlife.Packets; | 31 | using libsecondlife.Packets; |
32 | using OpenSim.Framework; | 32 | using OpenSim.Framework; |
33 | using OpenSim.Region.Environment.Scenes; | 33 | using OpenSim.Region.Environment.Scenes; |
34 | using OpenSim.Region.Environment.Interfaces; | ||
34 | 35 | ||
35 | namespace OpenSim.Region.Environment.LandManagement | 36 | namespace OpenSim.Region.Environment.LandManagement |
36 | { | 37 | { |
@@ -75,6 +76,34 @@ namespace OpenSim.Region.Environment.LandManagement | |||
75 | 76 | ||
76 | #endregion | 77 | #endregion |
77 | 78 | ||
79 | #region Events and Triggers | ||
80 | public delegate void LandObjectAdded(Land newParcel, LLUUID regionUUID); | ||
81 | public delegate void LandObjectRemoved(uint localParcelID, LLUUID regionUUID); | ||
82 | |||
83 | public event LandObjectAdded OnLandObjectAdded; | ||
84 | public event LandObjectRemoved OnLandObjectRemoved; | ||
85 | |||
86 | public void triggerLandObjectAdded(Land newParcel) | ||
87 | { | ||
88 | if (OnLandObjectAdded != null) | ||
89 | { | ||
90 | OnLandObjectAdded(newParcel, m_scene.RegionInfo.RegionID); | ||
91 | } | ||
92 | } | ||
93 | public void triggerLandObjectRemoved(uint localParcelID) | ||
94 | { | ||
95 | if (OnLandObjectRemoved != null) | ||
96 | { | ||
97 | OnLandObjectRemoved(localParcelID, m_scene.RegionInfo.RegionID); | ||
98 | } | ||
99 | } | ||
100 | public void triggerLandObjectUpdated(uint localParcelID, Land newParcel) | ||
101 | { | ||
102 | triggerLandObjectRemoved(localParcelID); | ||
103 | triggerLandObjectAdded(newParcel); | ||
104 | } | ||
105 | |||
106 | #endregion | ||
78 | #region Member Variables | 107 | #region Member Variables |
79 | 108 | ||
80 | public Dictionary<int, Land> landList = new Dictionary<int, Land>(); | 109 | public Dictionary<int, Land> landList = new Dictionary<int, Land>(); |
@@ -100,13 +129,23 @@ namespace OpenSim.Region.Environment.LandManagement | |||
100 | landIDList.Initialize(); | 129 | landIDList.Initialize(); |
101 | } | 130 | } |
102 | 131 | ||
103 | #endregion | ||
104 | 132 | ||
133 | |||
134 | #endregion | ||
135 | |||
105 | #region Member Functions | 136 | #region Member Functions |
106 | 137 | ||
107 | #region Parcel From Storage Functions | 138 | #region Land Object From Storage Functions |
108 | 139 | ||
109 | public void LandFromStorage(LandData data) | 140 | public void IncomingLandObjectsFromStorage(List<LandData> data) |
141 | { | ||
142 | foreach (LandData parcel in data) | ||
143 | { | ||
144 | IncomingLandObjectFromStorage(parcel); | ||
145 | } | ||
146 | } | ||
147 | |||
148 | public void IncomingLandObjectFromStorage(LandData data) | ||
110 | { | 149 | { |
111 | Land new_land = new Land(data.ownerID, data.isGroupOwned, m_scene); | 150 | Land new_land = new Land(data.ownerID, data.isGroupOwned, m_scene); |
112 | new_land.landData = data.Copy(); | 151 | new_land.landData = data.Copy(); |
@@ -116,6 +155,7 @@ namespace OpenSim.Region.Environment.LandManagement | |||
116 | 155 | ||
117 | public void NoLandDataFromStorage() | 156 | public void NoLandDataFromStorage() |
118 | { | 157 | { |
158 | Console.WriteLine("No LandData in storage! Loading a single, flat parcel instead"); | ||
119 | resetSimLandObjects(); | 159 | resetSimLandObjects(); |
120 | } | 160 | } |
121 | 161 | ||
@@ -156,7 +196,7 @@ namespace OpenSim.Region.Environment.LandManagement | |||
156 | } | 196 | } |
157 | } | 197 | } |
158 | landList[lastLandLocalID].forceUpdateLandInfo(); | 198 | landList[lastLandLocalID].forceUpdateLandInfo(); |
159 | 199 | triggerLandObjectAdded(new_land); | |
160 | return new_land; | 200 | return new_land; |
161 | } | 201 | } |
162 | 202 | ||
@@ -177,8 +217,21 @@ namespace OpenSim.Region.Environment.LandManagement | |||
177 | } | 217 | } |
178 | } | 218 | } |
179 | } | 219 | } |
180 | // TODO: Put event here for storage manager to bind to. | ||
181 | landList.Remove(local_id); | 220 | landList.Remove(local_id); |
221 | triggerLandObjectRemoved((uint)local_id); | ||
222 | } | ||
223 | |||
224 | public void updateLandObject(int local_id, LandData newData) | ||
225 | { | ||
226 | if (landList.ContainsKey(local_id)) | ||
227 | { | ||
228 | landList[local_id].landData = newData.Copy(); | ||
229 | triggerLandObjectUpdated((uint)local_id, landList[local_id]); | ||
230 | } | ||
231 | else | ||
232 | { | ||
233 | throw new Exception("Could not update land object. Local ID '" + local_id + "' does not exist"); | ||
234 | } | ||
182 | } | 235 | } |
183 | 236 | ||
184 | private void performFinalLandJoin(Land master, Land slave) | 237 | private void performFinalLandJoin(Land master, Land slave) |
@@ -195,6 +248,7 @@ namespace OpenSim.Region.Environment.LandManagement | |||
195 | } | 248 | } |
196 | } | 249 | } |
197 | } | 250 | } |
251 | |||
198 | removeLandObject(slave.landData.localID); | 252 | removeLandObject(slave.landData.localID); |
199 | } | 253 | } |
200 | 254 | ||
@@ -293,7 +347,6 @@ namespace OpenSim.Region.Environment.LandManagement | |||
293 | Land.modifyLandBitmapSquare(startLandObject.getLandBitmap(), start_x, start_y, end_x, end_y, false)); | 347 | Land.modifyLandBitmapSquare(startLandObject.getLandBitmap(), start_x, start_y, end_x, end_y, false)); |
294 | landList[startLandObjectIndex].forceUpdateLandInfo(); | 348 | landList[startLandObjectIndex].forceUpdateLandInfo(); |
295 | 349 | ||
296 | |||
297 | setPrimsTainted(); | 350 | setPrimsTainted(); |
298 | 351 | ||
299 | //Now add the new land object | 352 | //Now add the new land object |
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 828cb75..8277f39 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs | |||
@@ -225,9 +225,15 @@ namespace OpenSim.Region.Environment.Scenes | |||
225 | m_physicalPrim = physicalPrim; | 225 | m_physicalPrim = physicalPrim; |
226 | m_sendTasksToChild = SendTasksToChild; | 226 | m_sendTasksToChild = SendTasksToChild; |
227 | 227 | ||
228 | m_eventManager = new EventManager(); | ||
229 | |||
228 | m_LandManager = new LandManager(this, m_regInfo); | 230 | m_LandManager = new LandManager(this, m_regInfo); |
231 | |||
232 | //Bind Storage Manager functions to some land manager functions for this scene | ||
233 | m_LandManager.OnLandObjectAdded += new LandManager.LandObjectAdded(m_storageManager.DataStore.StoreLandObject); | ||
234 | m_LandManager.OnLandObjectRemoved += new LandManager.LandObjectRemoved(m_storageManager.DataStore.RemoveLandObject); | ||
235 | |||
229 | m_estateManager = new EstateManager(this, m_regInfo); | 236 | m_estateManager = new EstateManager(this, m_regInfo); |
230 | m_eventManager = new EventManager(); | ||
231 | 237 | ||
232 | m_permissionManager = permissionManager; | 238 | m_permissionManager = permissionManager; |
233 | m_permissionManager.Initialise(this); | 239 | m_permissionManager.Initialise(this); |
@@ -833,6 +839,24 @@ namespace OpenSim.Region.Environment.Scenes | |||
833 | 839 | ||
834 | #endregion | 840 | #endregion |
835 | 841 | ||
842 | #region Load Land | ||
843 | |||
844 | public void loadAllLandObjectsFromStorage() | ||
845 | { | ||
846 | MainLog.Instance.Verbose("SCENE", "Loading land objects from storage"); | ||
847 | List<Framework.LandData> landData = m_storageManager.DataStore.LoadLandObjects(RegionInfo.RegionID); | ||
848 | if (landData.Count == 0) | ||
849 | { | ||
850 | m_LandManager.NoLandDataFromStorage(); | ||
851 | } | ||
852 | else | ||
853 | { | ||
854 | m_LandManager.IncomingLandObjectsFromStorage(landData); | ||
855 | } | ||
856 | } | ||
857 | |||
858 | #endregion | ||
859 | |||
836 | #region Primitives Methods | 860 | #region Primitives Methods |
837 | 861 | ||
838 | /// <summary> | 862 | /// <summary> |