*Land has now been linked to the StorageManager. Next step is to fill in the functions for the different datastore interfaces for Land Objects.

afrisby
mingchen 2007-12-17 03:49:13 +00:00
parent 8e8c26acac
commit d845da215f
10 changed files with 155 additions and 64 deletions

View File

@ -289,17 +289,17 @@ namespace OpenSim.Framework.Data.MySQL
return terret;
}
public void RemoveLandObject(uint id)
public void RemoveLandObject(uint id, LLUUID regionUUID)
{
}
public void StoreParcel(Land parcel)
public void StoreLandObject(Land parcel, LLUUID regionUUID)
{
}
public List<Land> LoadLandObjects()
public List<Framework.LandData> LoadLandObjects(LLUUID regionUUID)
{
return new List<Land>();
return new List<LandData>();
}
private void DisplayDataSet(DataSet ds, string title)

View File

@ -26,7 +26,7 @@
*
*/
using libsecondlife;
using System.Collections.Generic;
namespace OpenSim.Framework
{
public class LandData
@ -74,6 +74,8 @@ namespace OpenSim.Framework
public LLVector3 userLocation = new LLVector3();
public LLVector3 userLookAt = new LLVector3();
public List<ParcelManager.ParcelAccessEntry> parcelAccessList = new List<ParcelManager.ParcelAccessEntry>();
public LandData()
{
globalID = LLUUID.Random();
@ -117,6 +119,17 @@ namespace OpenSim.Framework
landData.userLocation = userLocation;
landData.userLookAt = userLookAt;
landData.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;
landData.parcelAccessList.Add(newEntry);
}
return landData;
}
}

View File

@ -136,19 +136,17 @@ namespace OpenSim.Region.ClientStack
{
m_log.Verbose("PARCEL", "Found master avatar [" + masterAvatar.UUID.ToStringHyphenated() + "]");
scene.RegionInfo.MasterAvatarAssignedUUID = masterAvatar.UUID;
//TODO: Load parcels from storageManager
}
else
{
m_log.Verbose("PARCEL", "No master avatar found, using null.");
scene.RegionInfo.MasterAvatarAssignedUUID = LLUUID.Zero;
//TODO: Load parcels from storageManager
}
scene.LandManager.resetSimLandObjects();
scene.LoadPrimsFromStorage(m_permissions);
scene.loadAllLandObjectsFromStorage();
scene.performParcelPrimCountUpdate();
scene.StartTimer();
return scene;

View File

@ -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<Land> LoadLandObjects();
void StoreLandObject(Land Parcel,LLUUID regionUUID);
void RemoveLandObject(uint ID, LLUUID regionUUID);
List<Framework.LandData> LoadLandObjects(LLUUID regionUUID);
void Shutdown();
}

View File

@ -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<SceneObjectGroup> primsOverMe = new List<SceneObjectGroup>();
public List<libsecondlife.ParcelManager.ParcelAccessEntry> parcelAccessList = new List<ParcelManager.ParcelAccessEntry>();
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<ParcelAccessListReplyPacket.ListBlock> list = new List<ParcelAccessListReplyPacket.ListBlock>();
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<ParcelManager.ParcelAccessEntry> entries, IClientAPI remote_client)
{
LandData newData = landData.Copy();
if (entries.Count == 1 && entries[0].AgentID == LLUUID.Zero)
{
entries.Clear();
}
List<ParcelManager.ParcelAccessEntry> toRemove = new List<ParcelManager.ParcelAccessEntry>();
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()

View File

@ -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<int, Land> landList = new Dictionary<int, Land>();
@ -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<LandData> 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

View File

@ -225,10 +225,16 @@ namespace OpenSim.Region.Environment.Scenes
m_physicalPrim = physicalPrim;
m_sendTasksToChild = SendTasksToChild;
m_LandManager = new LandManager(this, m_regInfo);
m_estateManager = new EstateManager(this, m_regInfo);
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_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<Framework.LandData> landData = m_storageManager.DataStore.LoadLandObjects(RegionInfo.RegionID);
if (landData.Count == 0)
{
m_LandManager.NoLandDataFromStorage();
}
else
{
m_LandManager.IncomingLandObjectsFromStorage(landData);
}
}
#endregion
#region Primitives Methods
/// <summary>

View File

@ -292,19 +292,19 @@ namespace OpenSim.DataStore.MSSQL
return terret;
}
public void RemoveLandObject(uint id)
public void RemoveLandObject(uint id, LLUUID regionUUID)
{
}
public void StoreParcel(Land parcel)
public void StoreLandObject(Land parcel, LLUUID regionUUID)
{
}
public List<Land> LoadLandObjects()
public List<Framework.LandData> LoadLandObjects(LLUUID regionUUID)
{
return new List<Land>();
return new List<LandData>();
}
public void Commit()

View File

@ -346,17 +346,17 @@ namespace OpenSim.DataStore.MonoSqlite
}
}
public void RemoveLandObject(uint id)
public void RemoveLandObject(uint id, LLUUID regionUUID)
{
}
public void StoreParcel(Land parcel)
public void StoreLandObject(Land parcel, LLUUID regionUUID)
{
}
public List<Land> LoadLandObjects()
public List<Framework.LandData> LoadLandObjects(LLUUID regionUUID)
{
return new List<Land>();
return new List<LandData>();
}
public void Commit()

View File

@ -63,17 +63,17 @@ namespace OpenSim.DataStore.NullStorage
return null;
}
public void RemoveLandObject(uint id)
public void RemoveLandObject(uint id, LLUUID regionUUID)
{
}
public void StoreParcel(Land land)
public void StoreLandObject(Land land, LLUUID regionUUID)
{
}
public List<Land> LoadLandObjects()
public List<Framework.LandData> LoadLandObjects(LLUUID regionUUID)
{
return new List<Land>();
return new List<Framework.LandData>();
}
public void Shutdown()