From d845da215f8d30ef3f34a3c207fb892c815d1fac Mon Sep 17 00:00:00 2001 From: mingchen Date: Mon, 17 Dec 2007 03:49:13 +0000 Subject: *Land has now been linked to the StorageManager. Next step is to fill in the functions for the different datastore interfaces for Land Objects. --- .../Environment/Interfaces/IRegionDataStore.cs | 6 +- OpenSim/Region/Environment/LandManagement/Land.cs | 69 +++++++++++----------- .../Environment/LandManagement/LandManager.cs | 65 ++++++++++++++++++-- OpenSim/Region/Environment/Scenes/Scene.cs | 26 +++++++- 4 files changed, 123 insertions(+), 43 deletions(-) (limited to 'OpenSim/Region/Environment') 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 void StoreTerrain(double[,] terrain, LLUUID regionID); double[,] LoadTerrain(LLUUID regionID); - void StoreParcel(Land Parcel); - void RemoveLandObject(uint ID); - List LoadLandObjects(); + void StoreLandObject(Land Parcel,LLUUID regionUUID); + void RemoveLandObject(uint ID, LLUUID regionUUID); + List LoadLandObjects(LLUUID regionUUID); void Shutdown(); } 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; using libsecondlife.Packets; using OpenSim.Framework; using OpenSim.Region.Environment.Scenes; +using OpenSim.Region.Environment.Interfaces; namespace OpenSim.Region.Environment.LandManagement { @@ -47,7 +48,6 @@ namespace OpenSim.Region.Environment.LandManagement public LandData landData = new LandData(); public List primsOverMe = new List(); - public List parcelAccessList = new List(); public Scene m_scene; private bool[,] landBitmap = new bool[64,64]; @@ -93,21 +93,12 @@ namespace OpenSim.Region.Environment.LandManagement //Place all new variables here! newLand.landBitmap = (bool[,]) (landBitmap.Clone()); - newLand.parcelAccessList.Clear(); - foreach (ParcelManager.ParcelAccessEntry entry in parcelAccessList) - { - ParcelManager.ParcelAccessEntry newEntry = new ParcelManager.ParcelAccessEntry(); - newEntry.AgentID = entry.AgentID; - newEntry.Flags = entry.Flags; - newEntry.Time = entry.Time; - - newLand.parcelAccessList.Add(newEntry); - } newLand.landData = landData.Copy(); return newLand; } + #endregion #region Packet Request Handling @@ -209,24 +200,30 @@ namespace OpenSim.Region.Environment.LandManagement if (remote_client.AgentId == landData.ownerID) { //Needs later group support - landData.authBuyerID = packet.ParcelData.AuthBuyerID; - landData.category = (Parcel.ParcelCategory) packet.ParcelData.Category; - landData.landDesc = Helpers.FieldToUTF8String(packet.ParcelData.Desc); - landData.groupID = packet.ParcelData.GroupID; - landData.landingType = packet.ParcelData.LandingType; - landData.mediaAutoScale = packet.ParcelData.MediaAutoScale; - landData.mediaID = packet.ParcelData.MediaID; - landData.mediaURL = Helpers.FieldToUTF8String(packet.ParcelData.MediaURL); - landData.musicURL = Helpers.FieldToUTF8String(packet.ParcelData.MusicURL); - landData.landName = Helpers.FieldToUTF8String(packet.ParcelData.Name); - landData.landFlags = packet.ParcelData.ParcelFlags; - landData.passHours = packet.ParcelData.PassHours; - landData.passPrice = packet.ParcelData.PassPrice; - landData.salePrice = packet.ParcelData.SalePrice; - landData.snapshotID = packet.ParcelData.SnapshotID; - landData.userLocation = packet.ParcelData.UserLocation; - landData.userLookAt = packet.ParcelData.UserLookAt; + LandData newData = landData.Copy(); + newData.authBuyerID = packet.ParcelData.AuthBuyerID; + newData.category = (Parcel.ParcelCategory)packet.ParcelData.Category; + newData.landDesc = Helpers.FieldToUTF8String(packet.ParcelData.Desc); + newData.groupID = packet.ParcelData.GroupID; + newData.landingType = packet.ParcelData.LandingType; + newData.mediaAutoScale = packet.ParcelData.MediaAutoScale; + newData.mediaID = packet.ParcelData.MediaID; + newData.mediaURL = Helpers.FieldToUTF8String(packet.ParcelData.MediaURL); + newData.musicURL = Helpers.FieldToUTF8String(packet.ParcelData.MusicURL); + newData.landName = Helpers.FieldToUTF8String(packet.ParcelData.Name); + newData.landFlags = packet.ParcelData.ParcelFlags; + newData.passHours = packet.ParcelData.PassHours; + newData.passPrice = packet.ParcelData.PassPrice; + newData.salePrice = packet.ParcelData.SalePrice; + newData.snapshotID = packet.ParcelData.SnapshotID; + newData.userLocation = packet.ParcelData.UserLocation; + newData.userLookAt = packet.ParcelData.UserLookAt; + + m_scene.LandManager.updateLandObject(landData.localID, newData); + sendLandUpdateToAvatarsOverMe(); + + } } @@ -257,7 +254,7 @@ namespace OpenSim.Region.Environment.LandManagement public ParcelAccessListReplyPacket.ListBlock[] createAccessListArrayByFlag(ParcelManager.AccessList flag) { List list = new List(); - foreach (ParcelManager.ParcelAccessEntry entry in parcelAccessList) + foreach (ParcelManager.ParcelAccessEntry entry in landData.parcelAccessList) { if (entry.Flags == flag) { @@ -317,13 +314,15 @@ namespace OpenSim.Region.Environment.LandManagement public void updateAccessList(uint flags, List entries, IClientAPI remote_client) { + LandData newData = landData.Copy(); + if (entries.Count == 1 && entries[0].AgentID == LLUUID.Zero) { entries.Clear(); } List toRemove = new List(); - foreach (ParcelManager.ParcelAccessEntry entry in parcelAccessList) + foreach (ParcelManager.ParcelAccessEntry entry in newData.parcelAccessList) { if (entry.Flags == (ParcelManager.AccessList)flags) { @@ -333,7 +332,7 @@ namespace OpenSim.Region.Environment.LandManagement foreach (ParcelManager.ParcelAccessEntry entry in toRemove) { - parcelAccessList.Remove(entry); + newData.parcelAccessList.Remove(entry); } foreach (ParcelManager.ParcelAccessEntry entry in entries) { @@ -342,11 +341,14 @@ namespace OpenSim.Region.Environment.LandManagement temp.Time = new DateTime() ; //Pointless? Yes. temp.Flags = (ParcelManager.AccessList)flags; - if (!this.parcelAccessList.Contains(temp)) + if (!newData.parcelAccessList.Contains(temp)) { - this.parcelAccessList.Add(temp); + newData.parcelAccessList.Add(temp); } } + + m_scene.LandManager.updateLandObject(landData.localID, newData); + } #endregion @@ -385,6 +387,7 @@ namespace OpenSim.Region.Environment.LandManagement new LLVector3((float) (max_x*4), (float) (max_y*4), (float) m_scene.Terrain.GetHeight((max_x*4), (max_y*4))); landData.area = tempArea; + } 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; using libsecondlife.Packets; using OpenSim.Framework; using OpenSim.Region.Environment.Scenes; +using OpenSim.Region.Environment.Interfaces; namespace OpenSim.Region.Environment.LandManagement { @@ -75,6 +76,34 @@ namespace OpenSim.Region.Environment.LandManagement #endregion + #region Events and Triggers + public delegate void LandObjectAdded(Land newParcel, LLUUID regionUUID); + public delegate void LandObjectRemoved(uint localParcelID, LLUUID regionUUID); + + public event LandObjectAdded OnLandObjectAdded; + public event LandObjectRemoved OnLandObjectRemoved; + + public void triggerLandObjectAdded(Land newParcel) + { + if (OnLandObjectAdded != null) + { + OnLandObjectAdded(newParcel, m_scene.RegionInfo.RegionID); + } + } + public void triggerLandObjectRemoved(uint localParcelID) + { + if (OnLandObjectRemoved != null) + { + OnLandObjectRemoved(localParcelID, m_scene.RegionInfo.RegionID); + } + } + public void triggerLandObjectUpdated(uint localParcelID, Land newParcel) + { + triggerLandObjectRemoved(localParcelID); + triggerLandObjectAdded(newParcel); + } + + #endregion #region Member Variables public Dictionary landList = new Dictionary(); @@ -100,13 +129,23 @@ namespace OpenSim.Region.Environment.LandManagement landIDList.Initialize(); } - #endregion + + #endregion + #region Member Functions - #region Parcel From Storage Functions + #region Land Object From Storage Functions - public void LandFromStorage(LandData data) + public void IncomingLandObjectsFromStorage(List data) + { + foreach (LandData parcel in data) + { + IncomingLandObjectFromStorage(parcel); + } + } + + public void IncomingLandObjectFromStorage(LandData data) { Land new_land = new Land(data.ownerID, data.isGroupOwned, m_scene); new_land.landData = data.Copy(); @@ -116,6 +155,7 @@ namespace OpenSim.Region.Environment.LandManagement public void NoLandDataFromStorage() { + Console.WriteLine("No LandData in storage! Loading a single, flat parcel instead"); resetSimLandObjects(); } @@ -156,7 +196,7 @@ namespace OpenSim.Region.Environment.LandManagement } } landList[lastLandLocalID].forceUpdateLandInfo(); - + triggerLandObjectAdded(new_land); return new_land; } @@ -177,8 +217,21 @@ namespace OpenSim.Region.Environment.LandManagement } } } - // TODO: Put event here for storage manager to bind to. landList.Remove(local_id); + triggerLandObjectRemoved((uint)local_id); + } + + public void updateLandObject(int local_id, LandData newData) + { + if (landList.ContainsKey(local_id)) + { + landList[local_id].landData = newData.Copy(); + triggerLandObjectUpdated((uint)local_id, landList[local_id]); + } + else + { + throw new Exception("Could not update land object. Local ID '" + local_id + "' does not exist"); + } } private void performFinalLandJoin(Land master, Land slave) @@ -195,6 +248,7 @@ namespace OpenSim.Region.Environment.LandManagement } } } + removeLandObject(slave.landData.localID); } @@ -293,7 +347,6 @@ namespace OpenSim.Region.Environment.LandManagement Land.modifyLandBitmapSquare(startLandObject.getLandBitmap(), start_x, start_y, end_x, end_y, false)); landList[startLandObjectIndex].forceUpdateLandInfo(); - setPrimsTainted(); //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 m_physicalPrim = physicalPrim; m_sendTasksToChild = SendTasksToChild; + m_eventManager = new EventManager(); + m_LandManager = new LandManager(this, m_regInfo); + + //Bind Storage Manager functions to some land manager functions for this scene + m_LandManager.OnLandObjectAdded += new LandManager.LandObjectAdded(m_storageManager.DataStore.StoreLandObject); + m_LandManager.OnLandObjectRemoved += new LandManager.LandObjectRemoved(m_storageManager.DataStore.RemoveLandObject); + m_estateManager = new EstateManager(this, m_regInfo); - m_eventManager = new EventManager(); m_permissionManager = permissionManager; m_permissionManager.Initialise(this); @@ -833,6 +839,24 @@ namespace OpenSim.Region.Environment.Scenes #endregion + #region Load Land + + public void loadAllLandObjectsFromStorage() + { + MainLog.Instance.Verbose("SCENE", "Loading land objects from storage"); + List landData = m_storageManager.DataStore.LoadLandObjects(RegionInfo.RegionID); + if (landData.Count == 0) + { + m_LandManager.NoLandDataFromStorage(); + } + else + { + m_LandManager.IncomingLandObjectsFromStorage(landData); + } + } + + #endregion + #region Primitives Methods /// -- cgit v1.1