*Moved LandManagement into its own region module (spiffy!)

0.6.0-stable
mingchen 2008-03-22 23:10:22 +00:00
parent 5ebef6410e
commit 71ca162821
21 changed files with 2031 additions and 1890 deletions

View File

@ -35,7 +35,6 @@ using OpenSim.Framework;
using OpenSim.Framework.Console; using OpenSim.Framework.Console;
using OpenSim.Framework.Data; using OpenSim.Framework.Data;
using OpenSim.Region.Environment.Interfaces; using OpenSim.Region.Environment.Interfaces;
using OpenSim.Region.Environment.LandManagement;
using OpenSim.Region.Environment.Scenes; using OpenSim.Region.Environment.Scenes;
using OpenSim.Framework.Data.MSSQL; using OpenSim.Framework.Data.MSSQL;
@ -429,7 +428,7 @@ namespace OpenSim.Framework.Data.MSSQL
} }
} }
public void StoreLandObject(Land parcel, LLUUID regionUUID) public void StoreLandObject(ILandObject parcel)
{ {
// Instance.StoreLandObject(parcel, regionUUID); // Instance.StoreLandObject(parcel, regionUUID);
@ -446,12 +445,12 @@ namespace OpenSim.Framework.Data.MSSQL
if (landRow == null) if (landRow == null)
{ {
landRow = land.NewRow(); landRow = land.NewRow();
fillLandRow(landRow, parcel.landData, regionUUID); fillLandRow(landRow, parcel.landData, parcel.regionUUID);
land.Rows.Add(landRow); land.Rows.Add(landRow);
} }
else else
{ {
fillLandRow(landRow, parcel.landData, regionUUID); fillLandRow(landRow, parcel.landData, parcel.regionUUID);
} }
using ( using (

View File

@ -34,7 +34,6 @@ using libsecondlife;
using MySql.Data.MySqlClient; using MySql.Data.MySqlClient;
using OpenSim.Framework.Console; using OpenSim.Framework.Console;
using OpenSim.Region.Environment.Interfaces; using OpenSim.Region.Environment.Interfaces;
using OpenSim.Region.Environment.LandManagement;
using OpenSim.Region.Environment.Scenes; using OpenSim.Region.Environment.Scenes;
namespace OpenSim.Framework.Data.MySQL namespace OpenSim.Framework.Data.MySQL
@ -416,7 +415,7 @@ namespace OpenSim.Framework.Data.MySQL
} }
} }
public void StoreLandObject(Land parcel, LLUUID regionUUID) public void StoreLandObject(ILandObject parcel)
{ {
lock (m_dataSet) lock (m_dataSet)
{ {
@ -427,12 +426,12 @@ namespace OpenSim.Framework.Data.MySQL
if (landRow == null) if (landRow == null)
{ {
landRow = land.NewRow(); landRow = land.NewRow();
fillLandRow(landRow, parcel.landData, regionUUID); fillLandRow(landRow, parcel.landData, parcel.regionUUID);
land.Rows.Add(landRow); land.Rows.Add(landRow);
} }
else else
{ {
fillLandRow(landRow, parcel.landData, regionUUID); fillLandRow(landRow, parcel.landData, parcel.regionUUID);
} }
using ( using (

View File

@ -34,7 +34,6 @@ using Mono.Data.SqliteClient;
using OpenSim.Framework; using OpenSim.Framework;
using OpenSim.Framework.Console; using OpenSim.Framework.Console;
using OpenSim.Region.Environment.Interfaces; using OpenSim.Region.Environment.Interfaces;
using OpenSim.Region.Environment.LandManagement;
using OpenSim.Region.Environment.Scenes; using OpenSim.Region.Environment.Scenes;
namespace OpenSim.Framework.Data.SQLite namespace OpenSim.Framework.Data.SQLite
@ -477,7 +476,7 @@ namespace OpenSim.Framework.Data.SQLite
} }
} }
public void StoreLandObject(Land parcel, LLUUID regionUUID) public void StoreLandObject(ILandObject parcel)
{ {
lock (ds) lock (ds)
{ {
@ -488,12 +487,12 @@ namespace OpenSim.Framework.Data.SQLite
if (landRow == null) if (landRow == null)
{ {
landRow = land.NewRow(); landRow = land.NewRow();
fillLandRow(landRow, parcel.landData, regionUUID); fillLandRow(landRow, parcel.landData, parcel.regionUUID);
land.Rows.Add(landRow); land.Rows.Add(landRow);
} }
else else
{ {
fillLandRow(landRow, parcel.landData, regionUUID); fillLandRow(landRow, parcel.landData, parcel.regionUUID);
} }
// I know this caused someone issues before, but OpenSim is unusable if we leave this stuff around // I know this caused someone issues before, but OpenSim is unusable if we leave this stuff around

View File

@ -504,6 +504,9 @@ namespace OpenSim
// We need to do this after we've initialized the scripting engines. // We need to do this after we've initialized the scripting engines.
scene.StartScripts(); scene.StartScripts();
scene.loadAllLandObjectsFromStorage(regionInfo.originRegionID);
scene.LandChannel.performParcelPrimCountUpdate();
m_sceneManager.Add(scene); m_sceneManager.Add(scene);
m_udpServers.Add(udpServer); m_udpServers.Add(udpServer);

View File

@ -155,8 +155,6 @@ namespace OpenSim.Region.ClientStack
} }
scene.LoadPrimsFromStorage(m_permissions, regionInfo.originRegionID); scene.LoadPrimsFromStorage(m_permissions, regionInfo.originRegionID);
scene.loadAllLandObjectsFromStorage(regionInfo.originRegionID);
scene.performParcelPrimCountUpdate();
scene.StartTimer(); scene.StartTimer();
return scene; return scene;
} }

View File

@ -0,0 +1,52 @@
using System;
using System.Collections.Generic;
using System.Text;
using libsecondlife;
using libsecondlife.Packets;
using OpenSim.Region.Environment.Scenes;
using OpenSim.Framework;
namespace OpenSim.Region.Environment.Interfaces
{
public interface ILandChannel
{
bool allowedForcefulBans { get; set; }
void IncomingLandObjectsFromStorage(List<LandData> data);
void IncomingLandObjectFromStorage(LandData data);
void NoLandDataFromStorage();
ILandObject getLandObject(int x, int y);
ILandObject getLandObject(float x, float y);
void setPrimsTainted();
bool isLandPrimCountTainted();
void sendLandUpdate(ScenePresence avatar, bool force);
void sendLandUpdate(ScenePresence avatar);
void resetAllLandPrimCounts();
void addPrimToLandPrimCounts(SceneObjectGroup obj);
void removePrimFromLandPrimCounts(SceneObjectGroup obj);
void finalizeLandPrimCountUpdate();
void updateLandPrimCounts();
void performParcelPrimCountUpdate();
void updateLandObject(int local_id, LandData newData);
void sendParcelOverlay(IClientAPI remote_client);
void handleParcelPropertiesRequest(int start_x, int start_y, int end_x, int end_y, int sequence_id, bool snap_selection, IClientAPI remote_client);
void handleParcelPropertiesUpdateRequest(ParcelPropertiesUpdatePacket packet, IClientAPI remote_client);
void handleParcelDivideRequest(int west, int south, int east, int north, IClientAPI remote_client);
void handleParcelJoinRequest(int west, int south, int east, int north, IClientAPI remote_client);
void handleParcelSelectObjectsRequest(int local_id, int request_type, IClientAPI remote_client);
void handleParcelObjectOwnersRequest(int local_id, IClientAPI remote_client);
void resetSimLandObjects();
List<ILandObject> parcelsNearPoint(LLVector3 position);
void sendYouAreBannedNotice(ScenePresence avatar);
void handleAvatarChangingParcel(ScenePresence avatar, int localLandID, LLUUID regionID);
void sendOutNearestBanLine(IClientAPI avatar);
void handleSignificantClientMovement(IClientAPI remote_client);
void handleAnyClientMovement(ScenePresence avatar);
void handleParcelAccessRequest(LLUUID agentID, LLUUID sessionID, uint flags, int sequenceID, int landLocalID, IClientAPI remote_client);
void handleParcelAccessUpdateRequest(LLUUID agentID, LLUUID sessionID, uint flags, int landLocalID, List<ParcelManager.ParcelAccessEntry> entries, IClientAPI remote_client);
}
}

View File

@ -0,0 +1,54 @@
using System;
using System.Collections.Generic;
using System.Text;
using libsecondlife;
using libsecondlife.Packets;
using OpenSim.Region.Environment.Scenes;
using OpenSim.Framework;
namespace OpenSim.Region.Environment.Interfaces
{
public interface ILandObject
{
LandData landData { get; set; }
bool[,] landBitmap { get; set; }
LLUUID regionUUID { get; }
bool containsPoint(int x, int y);
ILandObject Copy();
void sendLandUpdateToAvatarsOverMe();
void sendLandProperties(int sequence_id, bool snap_selection, int request_result, IClientAPI remote_client);
void updateLandProperties(ParcelPropertiesUpdatePacket packet, IClientAPI remote_client);
bool isEitherBannedOrRestricted(LLUUID avatar);
bool isBannedFromLand(LLUUID avatar);
bool isRestrictedFromLand(LLUUID avatar);
void sendLandUpdateToClient(IClientAPI remote_client);
ParcelAccessListReplyPacket.ListBlock[] createAccessListArrayByFlag(ParcelManager.AccessList flag);
void sendAccessList(LLUUID agentID, LLUUID sessionID, uint flags, int sequenceID, IClientAPI remote_client);
void updateAccessList(uint flags, List<ParcelManager.ParcelAccessEntry> entries, IClientAPI remote_client);
void updateLandBitmapByteArray();
void setLandBitmapFromByteArray();
bool[,] getLandBitmap();
void forceUpdateLandInfo();
void setLandBitmap(bool[,] bitmap);
bool[,] basicFullRegionLandBitmap();
bool[,] getSquareLandBitmap(int start_x, int start_y, int end_x, int end_y);
bool[,] modifyLandBitmapSquare(bool[,] land_bitmap, int start_x, int start_y, int end_x, int end_y, bool set_value);
bool[,] mergeLandBitmaps(bool[,] bitmap_base, bool[,] bitmap_add);
void sendForceObjectSelect(int local_id, int request_type, IClientAPI remote_client);
void sendLandObjectOwners(IClientAPI remote_client);
void returnObject(SceneObjectGroup obj);
void returnLandObjects(int type, LLUUID owner);
void resetLandPrimCounts();
void addPrimToCount(SceneObjectGroup obj);
void removePrimFromCount(SceneObjectGroup obj);
}
}

View File

@ -28,7 +28,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using libsecondlife; using libsecondlife;
using OpenSim.Framework; using OpenSim.Framework;
using OpenSim.Region.Environment.LandManagement;
using OpenSim.Region.Environment.Scenes; using OpenSim.Region.Environment.Scenes;
namespace OpenSim.Region.Environment.Interfaces namespace OpenSim.Region.Environment.Interfaces
@ -69,7 +68,7 @@ namespace OpenSim.Region.Environment.Interfaces
void StoreTerrain(double[,] terrain, LLUUID regionID); void StoreTerrain(double[,] terrain, LLUUID regionID);
double[,] LoadTerrain(LLUUID regionID); double[,] LoadTerrain(LLUUID regionID);
void StoreLandObject(Land Parcel, LLUUID regionUUID); void StoreLandObject(ILandObject Parcel);
void RemoveLandObject(LLUUID globalID); void RemoveLandObject(LLUUID globalID);
List<LandData> LoadLandObjects(LLUUID regionUUID); List<LandData> LoadLandObjects(LLUUID regionUUID);

View File

@ -1,32 +1,7 @@
/* using System;
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSim Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text;
using Axiom.Math; using Axiom.Math;
using libsecondlife; using libsecondlife;
using libsecondlife.Packets; using libsecondlife.Packets;
@ -36,17 +11,10 @@ using OpenSim.Region.Environment.Scenes;
using OpenSim.Region.Environment.Interfaces; using OpenSim.Region.Environment.Interfaces;
using OpenSim.Region.Physics.Manager; using OpenSim.Region.Physics.Manager;
namespace OpenSim.Region.Environment.LandManagement namespace OpenSim.Region.Environment.Modules.LandManagement
{ {
#region LandManager Class public class LandChannel : ILandChannel
/// <summary>
/// Handles Land objects and operations requiring information from other Land objects (divide, join, etc)
/// </summary>
public class LandManager
{ {
private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
#region Constants #region Constants
//Land types set with flags in ParcelOverlay. //Land types set with flags in ParcelOverlay.
@ -80,40 +48,32 @@ namespace OpenSim.Region.Environment.LandManagement
#endregion #endregion
#region Member Variables private Scene m_scene;
public Dictionary<int, Land> landList = new Dictionary<int, Land>(); private Dictionary<int, ILandObject> landList = new Dictionary<int, ILandObject>();
private int lastLandLocalID = START_LAND_LOCAL_ID - 1; private int lastLandLocalID = START_LAND_LOCAL_ID - 1;
private int[,] landIDList = new int[64, 64]; private int[,] landIDList = new int[64, 64];
/// <summary> private bool landPrimCountTainted = false;
/// Set to true when a prim is moved, created, added. Performs a prim count update
/// </summary>
public bool landPrimCountTainted = false;
private readonly Scene m_scene; private bool m_allowedForcefulBans = true;
private readonly RegionInfo m_regInfo; public bool allowedForcefulBans
public bool allowedForcefulBans = true;
#endregion
#region Constructors
public LandManager(Scene scene, RegionInfo reginfo)
{ {
m_scene = scene; get
m_regInfo = reginfo; {
landIDList.Initialize(); return m_allowedForcefulBans;
scene.EventManager.OnAvatarEnteringNewParcel += }
new EventManager.AvatarEnteringNewParcel(handleAvatarChangingParcel); set
scene.EventManager.OnClientMovement += new EventManager.ClientMovement(handleAnyClientMovement); {
m_allowedForcefulBans = value;
}
} }
#endregion public LandChannel(Scene scene)
{
#region Member Functions m_scene = scene;
landIDList.Initialize();
}
#region Land Object From Storage Functions #region Land Object From Storage Functions
public void IncomingLandObjectsFromStorage(List<LandData> data) public void IncomingLandObjectsFromStorage(List<LandData> data)
@ -138,7 +98,7 @@ namespace OpenSim.Region.Environment.LandManagement
public void IncomingLandObjectFromStorage(LandData data) public void IncomingLandObjectFromStorage(LandData data)
{ {
Land new_land = new Land(data.ownerID, data.isGroupOwned, m_scene); ILandObject new_land = new LandObject(data.ownerID, data.isGroupOwned, m_scene);
new_land.landData = data.Copy(); new_land.landData = data.Copy();
new_land.setLandBitmapFromByteArray(); new_land.setLandBitmapFromByteArray();
addLandObject(new_land); addLandObject(new_land);
@ -146,7 +106,6 @@ namespace OpenSim.Region.Environment.LandManagement
public void NoLandDataFromStorage() public void NoLandDataFromStorage()
{ {
Console.WriteLine("No LandData in storage! Loading a single, flat parcel instead");
resetSimLandObjects(); resetSimLandObjects();
} }
@ -158,20 +117,20 @@ namespace OpenSim.Region.Environment.LandManagement
/// Creates a basic Parcel object without an owner (a zeroed key) /// Creates a basic Parcel object without an owner (a zeroed key)
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
public Land createBaseLand() public ILandObject createBaseLand()
{ {
return new Land(LLUUID.Zero, false, m_scene); return new LandObject(LLUUID.Zero, false, m_scene);
} }
/// <summary> /// <summary>
/// Adds a land object to the stored list and adds them to the landIDList to what they own /// Adds a land object to the stored list and adds them to the landIDList to what they own
/// </summary> /// </summary>
/// <param name="new_land">The land object being added</param> /// <param name="new_land">The land object being added</param>
public Land addLandObject(Land new_land) public ILandObject addLandObject(ILandObject new_land)
{ {
lastLandLocalID++; lastLandLocalID++;
new_land.landData.localID = lastLandLocalID; new_land.landData.localID = lastLandLocalID;
landList.Add(lastLandLocalID, new_land.Copy()); landList.Add(lastLandLocalID, (LandObject)new_land.Copy());
bool[,] landBitmap = new_land.getLandBitmap(); bool[,] landBitmap = new_land.getLandBitmap();
@ -187,7 +146,7 @@ namespace OpenSim.Region.Environment.LandManagement
} }
} }
landList[lastLandLocalID].forceUpdateLandInfo(); landList[lastLandLocalID].forceUpdateLandInfo();
m_scene.EventManager.TriggerLandObjectAdded(new_land, m_scene.RegionInfo.RegionID); m_scene.EventManager.TriggerLandObjectAdded(new_land);
return new_land; return new_land;
} }
@ -221,13 +180,9 @@ namespace OpenSim.Region.Environment.LandManagement
landList[local_id].landData = newData.Copy(); landList[local_id].landData = newData.Copy();
m_scene.EventManager.TriggerLandObjectUpdated((uint)local_id, landList[local_id]); m_scene.EventManager.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) private void performFinalLandJoin(ILandObject master, ILandObject slave)
{ {
int x, y; int x, y;
bool[,] landBitmapSlave = slave.getLandBitmap(); bool[,] landBitmapSlave = slave.getLandBitmap();
@ -252,7 +207,7 @@ namespace OpenSim.Region.Environment.LandManagement
/// <param name="x">Value between 0 - 256 on the x axis of the point</param> /// <param name="x">Value between 0 - 256 on the x axis of the point</param>
/// <param name="y">Value between 0 - 256 on the y axis of the point</param> /// <param name="y">Value between 0 - 256 on the y axis of the point</param>
/// <returns>Land object at the point supplied</returns> /// <returns>Land object at the point supplied</returns>
public Land getLandObject(float x_float, float y_float) public ILandObject getLandObject(float x_float, float y_float)
{ {
int x; int x;
int y; int y;
@ -273,12 +228,11 @@ namespace OpenSim.Region.Environment.LandManagement
} }
else else
{ {
// Console.WriteLine("Point (" + x + ", " + y + ") determined from point (" + x_float + ", " + y_float + ")");
return landList[landIDList[x, y]]; return landList[landIDList[x, y]];
} }
} }
public Land getLandObject(int x, int y) public ILandObject getLandObject(int x, int y)
{ {
if (x >= Convert.ToInt32(Constants.RegionSize) || y >= Convert.ToInt32(Constants.RegionSize) || x < 0 || y < 0) if (x >= Convert.ToInt32(Constants.RegionSize) || y >= Convert.ToInt32(Constants.RegionSize) || x < 0 || y < 0)
{ {
@ -309,14 +263,14 @@ namespace OpenSim.Region.Environment.LandManagement
{ {
//First, lets loop through the points and make sure they are all in the same peice of land //First, lets loop through the points and make sure they are all in the same peice of land
//Get the land object at start //Get the land object at start
Land startLandObject = null; ILandObject startLandObject = null;
try try
{ {
startLandObject = getLandObject(start_x, start_y); startLandObject = getLandObject(start_x, start_y);
} }
catch (Exception) catch (Exception)
{ {
m_log.Error("[LAND]: " + "Unable to get land object for subdivision at x: " + start_x + " y:" + start_y); //m_log.Error("[LAND]: " + "Unable to get land object for subdivision at x: " + start_x + " y:" + start_y);
} }
if (startLandObject == null) return false; //No such land object at the beginning if (startLandObject == null) return false; //No such land object at the beginning
@ -330,7 +284,7 @@ namespace OpenSim.Region.Environment.LandManagement
{ {
for (x = 0; x < totalX; x++) for (x = 0; x < totalX; x++)
{ {
Land tempLandObject = getLandObject(start_x + x, start_y + y); ILandObject tempLandObject = getLandObject(start_x + x, start_y + y);
if (tempLandObject == null) return false; //No such land object at that point if (tempLandObject == null) return false; //No such land object at that point
if (tempLandObject != startLandObject) return false; //Subdividing over 2 land objects; no-no if (tempLandObject != startLandObject) return false; //Subdividing over 2 land objects; no-no
} }
@ -349,22 +303,22 @@ namespace OpenSim.Region.Environment.LandManagement
} }
//Lets create a new land object with bitmap activated at that point (keeping the old land objects info) //Lets create a new land object with bitmap activated at that point (keeping the old land objects info)
Land newLand = startLandObject.Copy(); ILandObject newLand = startLandObject.Copy();
newLand.landData.landName = "Subdivision of " + newLand.landData.landName; newLand.landData.landName = "Subdivision of " + newLand.landData.landName;
newLand.landData.globalID = LLUUID.Random(); newLand.landData.globalID = LLUUID.Random();
newLand.setLandBitmap(Land.getSquareLandBitmap(start_x, start_y, end_x, end_y)); newLand.setLandBitmap(newLand.getSquareLandBitmap(start_x, start_y, end_x, end_y));
//Now, lets set the subdivision area of the original to false //Now, lets set the subdivision area of the original to false
int startLandObjectIndex = startLandObject.landData.localID; int startLandObjectIndex = startLandObject.landData.localID;
landList[startLandObjectIndex].setLandBitmap( landList[startLandObjectIndex].setLandBitmap(
Land.modifyLandBitmapSquare(startLandObject.getLandBitmap(), start_x, start_y, end_x, end_y, false)); newLand.modifyLandBitmapSquare(startLandObject.getLandBitmap(), start_x, start_y, end_x, end_y, false));
landList[startLandObjectIndex].forceUpdateLandInfo(); landList[startLandObjectIndex].forceUpdateLandInfo();
setPrimsTainted(); setPrimsTainted();
//Now add the new land object //Now add the new land object
Land result = addLandObject(newLand); ILandObject result = addLandObject(newLand);
updateLandObject(startLandObject.landData.localID, startLandObject.landData); updateLandObject(startLandObject.landData.localID, startLandObject.landData);
result.sendLandUpdateToAvatarsOverMe(); result.sendLandUpdateToAvatarsOverMe();
@ -386,21 +340,21 @@ namespace OpenSim.Region.Environment.LandManagement
end_x -= 4; end_x -= 4;
end_y -= 4; end_y -= 4;
List<Land> selectedLandObjects = new List<Land>(); List<ILandObject> selectedLandObjects = new List<ILandObject>();
int stepXSelected = 0; int stepXSelected = 0;
int stepYSelected = 0; int stepYSelected = 0;
for (stepYSelected = start_y; stepYSelected <= end_y; stepYSelected += 4) for (stepYSelected = start_y; stepYSelected <= end_y; stepYSelected += 4)
{ {
for (stepXSelected = start_x; stepXSelected <= end_x; stepXSelected += 4) for (stepXSelected = start_x; stepXSelected <= end_x; stepXSelected += 4)
{ {
Land p = null; ILandObject p = null;
try try
{ {
p = getLandObject(stepXSelected, stepYSelected); p = getLandObject(stepXSelected, stepYSelected);
} }
catch (Exception) catch (Exception)
{ {
m_log.Error("[LAND]: " + "Unable to get land object for subdivision at x: " + stepXSelected + " y:" + stepYSelected); //m_log.Error("[LAND]: " + "Unable to get land object for subdivision at x: " + stepXSelected + " y:" + stepYSelected);
} }
if (p != null) if (p != null)
{ {
@ -411,7 +365,7 @@ namespace OpenSim.Region.Environment.LandManagement
} }
} }
} }
Land masterLandObject = selectedLandObjects[0]; ILandObject masterLandObject = selectedLandObjects[0];
selectedLandObjects.RemoveAt(0); selectedLandObjects.RemoveAt(0);
@ -423,17 +377,17 @@ namespace OpenSim.Region.Environment.LandManagement
{ {
return false; //Not the same owner return false; //Not the same owner
} }
foreach (Land p in selectedLandObjects) foreach (ILandObject p in selectedLandObjects)
{ {
if (p.landData.ownerID != masterLandObject.landData.ownerID) if (p.landData.ownerID != masterLandObject.landData.ownerID)
{ {
return false; //Over multiple users. TODO: make this just ignore this piece of land? return false; //Over multiple users. TODO: make this just ignore this piece of land?
} }
} }
foreach (Land slaveLandObject in selectedLandObjects) foreach (ILandObject slaveLandObject in selectedLandObjects)
{ {
landList[masterLandObject.landData.localID].setLandBitmap( landList[masterLandObject.landData.localID].setLandBitmap(
Land.mergeLandBitmaps(masterLandObject.getLandBitmap(), slaveLandObject.getLandBitmap())); slaveLandObject.mergeLandBitmaps(masterLandObject.getLandBitmap(), slaveLandObject.getLandBitmap()));
performFinalLandJoin(masterLandObject, slaveLandObject); performFinalLandJoin(masterLandObject, slaveLandObject);
} }
@ -445,6 +399,97 @@ namespace OpenSim.Region.Environment.LandManagement
return true; return true;
} }
public void resetAllLandPrimCounts()
{
foreach (LandObject p in landList.Values)
{
p.resetLandPrimCounts();
}
}
public void setPrimsTainted()
{
landPrimCountTainted = true;
}
public bool isLandPrimCountTainted()
{
return landPrimCountTainted;
}
public void addPrimToLandPrimCounts(SceneObjectGroup obj)
{
LLVector3 position = obj.AbsolutePosition;
ILandObject landUnderPrim = getLandObject(position.X, position.Y);
if (landUnderPrim != null)
{
landUnderPrim.addPrimToCount(obj);
}
}
public void removePrimFromLandPrimCounts(SceneObjectGroup obj)
{
foreach (LandObject p in landList.Values)
{
p.removePrimFromCount(obj);
}
}
public void finalizeLandPrimCountUpdate()
{
//Get Simwide prim count for owner
Dictionary<LLUUID, List<LandObject>> landOwnersAndParcels = new Dictionary<LLUUID, List<LandObject>>();
foreach (LandObject p in landList.Values)
{
if (!landOwnersAndParcels.ContainsKey(p.landData.ownerID))
{
List<LandObject> tempList = new List<LandObject>();
tempList.Add(p);
landOwnersAndParcels.Add(p.landData.ownerID, tempList);
}
else
{
landOwnersAndParcels[p.landData.ownerID].Add(p);
}
}
foreach (LLUUID owner in landOwnersAndParcels.Keys)
{
int simArea = 0;
int simPrims = 0;
foreach (LandObject p in landOwnersAndParcels[owner])
{
simArea += p.landData.area;
simPrims += p.landData.ownerPrims + p.landData.otherPrims + p.landData.groupPrims +
p.landData.selectedPrims;
}
foreach (LandObject p in landOwnersAndParcels[owner])
{
p.landData.simwideArea = simArea;
p.landData.simwidePrims = simPrims;
}
}
}
public void updateLandPrimCounts()
{
foreach (EntityBase obj in m_scene.Entities.Values)
{
if (obj is SceneObjectGroup)
{
m_scene.EventManager.TriggerParcelPrimCountAdd((SceneObjectGroup)obj);
}
}
}
public void performParcelPrimCountUpdate()
{
resetAllLandPrimCounts();
m_scene.EventManager.TriggerParcelPrimCountUpdate();
finalizeLandPrimCountUpdate();
landPrimCountTainted = false;
}
#endregion #endregion
#region Parcel Updating #region Parcel Updating
@ -467,7 +512,7 @@ namespace OpenSim.Region.Environment.LandManagement
for (x = 0; x < 64; x++) for (x = 0; x < 64; x++)
{ {
byte tempByte = (byte)0; //This represents the byte for the current 4x4 byte tempByte = (byte)0; //This represents the byte for the current 4x4
Land currentParcelBlock = null; ILandObject currentParcelBlock = null;
try try
{ {
@ -475,7 +520,7 @@ namespace OpenSim.Region.Environment.LandManagement
} }
catch (Exception) catch (Exception)
{ {
m_log.Warn("[LAND]: " + "unable to get land at x: " + (x * 4) + " y: " + (y * 4)); //m_log.Warn("[LAND]: " + "unable to get land at x: " + (x * 4) + " y: " + (y * 4));
} }
@ -508,8 +553,8 @@ namespace OpenSim.Region.Environment.LandManagement
//Now for border control //Now for border control
try try
{ {
Land westParcel = null; ILandObject westParcel = null;
Land southParcel = null; ILandObject southParcel = null;
if (x > 0) if (x > 0)
{ {
westParcel = getLandObject((x - 1) * 4, y * 4); westParcel = getLandObject((x - 1) * 4, y * 4);
@ -552,7 +597,7 @@ namespace OpenSim.Region.Environment.LandManagement
} }
catch (Exception e) catch (Exception e)
{ {
m_log.Debug("[LAND]: Skipped Land checks because avatar is out of bounds: " + e.Message); //m_log.Debug("[LAND]: Skipped Land checks because avatar is out of bounds: " + e.Message);
} }
} }
} }
@ -563,7 +608,7 @@ namespace OpenSim.Region.Environment.LandManagement
bool snap_selection, IClientAPI remote_client) bool snap_selection, IClientAPI remote_client)
{ {
//Get the land objects within the bounds //Get the land objects within the bounds
List<Land> temp = new List<Land>(); List<ILandObject> temp = new List<ILandObject>();
int x, y, i; int x, y, i;
int inc_x = end_x - start_x; int inc_x = end_x - start_x;
int inc_y = end_y - start_y; int inc_y = end_y - start_y;
@ -572,14 +617,14 @@ namespace OpenSim.Region.Environment.LandManagement
for (y = 0; y < inc_y; y++) for (y = 0; y < inc_y; y++)
{ {
Land currentParcel = null; ILandObject currentParcel = null;
try try
{ {
currentParcel = getLandObject(start_x + x, start_y + y); currentParcel = getLandObject(start_x + x, start_y + y);
} }
catch (Exception) catch (Exception)
{ {
m_log.Warn("[LAND]: " + "unable to get land at x: " + (start_x + x) + " y: " + (start_y + y)); //m_log.Warn("[LAND]: " + "unable to get land at x: " + (start_x + x) + " y: " + (start_y + y));
} }
if (currentParcel != null) if (currentParcel != null)
{ {
@ -647,23 +692,23 @@ namespace OpenSim.Region.Environment.LandManagement
lastLandLocalID = START_LAND_LOCAL_ID - 1; lastLandLocalID = START_LAND_LOCAL_ID - 1;
landIDList.Initialize(); landIDList.Initialize();
Land fullSimParcel = new Land(LLUUID.Zero, false, m_scene); ILandObject fullSimParcel = new LandObject(LLUUID.Zero, false, m_scene);
fullSimParcel.setLandBitmap(Land.getSquareLandBitmap(0, 0, (int)Constants.RegionSize, (int)Constants.RegionSize)); fullSimParcel.setLandBitmap(fullSimParcel.getSquareLandBitmap(0, 0, (int)Constants.RegionSize, (int)Constants.RegionSize));
fullSimParcel.landData.ownerID = m_regInfo.MasterAvatarAssignedUUID; fullSimParcel.landData.ownerID = m_scene.RegionInfo.MasterAvatarAssignedUUID;
addLandObject(fullSimParcel); addLandObject(fullSimParcel);
} }
public List<Land> parcelsNearPoint(LLVector3 position) public List<ILandObject> parcelsNearPoint(LLVector3 position)
{ {
List<Land> parcelsNear = new List<Land>(); List<ILandObject> parcelsNear = new List<ILandObject>();
int x, y; int x, y;
for (x = -4; x <= 4; x += 4) for (x = -4; x <= 4; x += 4)
{ {
for (y = -4; y <= 4; y += 4) for (y = -4; y <= 4; y += 4)
{ {
Land check = getLandObject(position.X + x, position.Y + y); ILandObject check = getLandObject(position.X + x, position.Y + y);
if (check != null) if (check != null)
{ {
if (!parcelsNear.Contains(check)) if (!parcelsNear.Contains(check))
@ -702,7 +747,7 @@ namespace OpenSim.Region.Environment.LandManagement
{ {
if (landList[localLandID] != null) if (landList[localLandID] != null)
{ {
Land parcelAvatarIsEntering = landList[localLandID]; ILandObject parcelAvatarIsEntering = landList[localLandID];
if (avatar.AbsolutePosition.Z < BAN_LINE_SAFETY_HIEGHT) if (avatar.AbsolutePosition.Z < BAN_LINE_SAFETY_HIEGHT)
{ {
if (parcelAvatarIsEntering.isBannedFromLand(avatar.UUID)) if (parcelAvatarIsEntering.isBannedFromLand(avatar.UUID))
@ -735,8 +780,8 @@ namespace OpenSim.Region.Environment.LandManagement
if (presence.UUID == avatar.AgentId) if (presence.UUID == avatar.AgentId)
{ {
List<Land> checkLandParcels = parcelsNearPoint(presence.AbsolutePosition); List<ILandObject> checkLandParcels = parcelsNearPoint(presence.AbsolutePosition);
foreach (Land checkBan in checkLandParcels) foreach (ILandObject checkBan in checkLandParcels)
{ {
if (checkBan.isBannedFromLand(avatar.AgentId)) if (checkBan.isBannedFromLand(avatar.AgentId))
{ {
@ -756,7 +801,7 @@ namespace OpenSim.Region.Environment.LandManagement
public void sendLandUpdate(ScenePresence avatar, bool force) public void sendLandUpdate(ScenePresence avatar, bool force)
{ {
Land over = null; ILandObject over = null;
try try
{ {
over = getLandObject((int)Math.Min(255, Math.Max(0, Math.Round(avatar.AbsolutePosition.X))), over = getLandObject((int)Math.Min(255, Math.Max(0, Math.Round(avatar.AbsolutePosition.X))),
@ -764,7 +809,7 @@ namespace OpenSim.Region.Environment.LandManagement
} }
catch (Exception) catch (Exception)
{ {
m_log.Warn("[LAND]: " + "unable to get land at x: " + Math.Round(avatar.AbsolutePosition.X) + " y: " + Math.Round(avatar.AbsolutePosition.Y)); //m_log.Warn("[LAND]: " + "unable to get land at x: " + Math.Round(avatar.AbsolutePosition.X) + " y: " + Math.Round(avatar.AbsolutePosition.Y));
} }
if (over != null) if (over != null)
@ -804,7 +849,7 @@ namespace OpenSim.Region.Environment.LandManagement
{ {
sendLandUpdate(clientAvatar); sendLandUpdate(clientAvatar);
sendOutNearestBanLine(remote_client); sendOutNearestBanLine(remote_client);
Land parcel = getLandObject(clientAvatar.AbsolutePosition.X, clientAvatar.AbsolutePosition.Y); ILandObject parcel = getLandObject(clientAvatar.AbsolutePosition.X, clientAvatar.AbsolutePosition.Y);
if (parcel != null) if (parcel != null)
{ {
if (clientAvatar.AbsolutePosition.Z < BAN_LINE_SAFETY_HIEGHT && if (clientAvatar.AbsolutePosition.Z < BAN_LINE_SAFETY_HIEGHT &&
@ -829,7 +874,7 @@ namespace OpenSim.Region.Environment.LandManagement
public void handleAnyClientMovement(ScenePresence avatar) public void handleAnyClientMovement(ScenePresence avatar)
//Like handleSignificantClientMovement, but called with an AgentUpdate regardless of distance. //Like handleSignificantClientMovement, but called with an AgentUpdate regardless of distance.
{ {
Land over = getLandObject(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y); ILandObject over = getLandObject(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y);
if (over != null) if (over != null)
{ {
if (!over.isBannedFromLand(avatar.UUID) || avatar.AbsolutePosition.Z >= BAN_LINE_SAFETY_HIEGHT) if (!over.isBannedFromLand(avatar.UUID) || avatar.AbsolutePosition.Z >= BAN_LINE_SAFETY_HIEGHT)
@ -867,76 +912,5 @@ namespace OpenSim.Region.Environment.LandManagement
} }
} }
public void resetAllLandPrimCounts()
{
foreach (Land p in landList.Values)
{
p.resetLandPrimCounts();
} }
} }
public void setPrimsTainted()
{
landPrimCountTainted = true;
}
public void addPrimToLandPrimCounts(SceneObjectGroup obj)
{
LLVector3 position = obj.AbsolutePosition;
Land landUnderPrim = getLandObject(position.X, position.Y);
if (landUnderPrim != null)
{
landUnderPrim.addPrimToCount(obj);
}
}
public void removePrimFromLandPrimCounts(SceneObjectGroup obj)
{
foreach (Land p in landList.Values)
{
p.removePrimFromCount(obj);
}
}
public void finalizeLandPrimCountUpdate()
{
//Get Simwide prim count for owner
Dictionary<LLUUID, List<Land>> landOwnersAndParcels = new Dictionary<LLUUID, List<Land>>();
foreach (Land p in landList.Values)
{
if (!landOwnersAndParcels.ContainsKey(p.landData.ownerID))
{
List<Land> tempList = new List<Land>();
tempList.Add(p);
landOwnersAndParcels.Add(p.landData.ownerID, tempList);
}
else
{
landOwnersAndParcels[p.landData.ownerID].Add(p);
}
}
foreach (LLUUID owner in landOwnersAndParcels.Keys)
{
int simArea = 0;
int simPrims = 0;
foreach (Land p in landOwnersAndParcels[owner])
{
simArea += p.landData.area;
simPrims += p.landData.ownerPrims + p.landData.otherPrims + p.landData.groupPrims +
p.landData.selectedPrims;
}
foreach (Land p in landOwnersAndParcels[owner])
{
p.landData.simwideArea = simArea;
p.landData.simwidePrims = simPrims;
}
}
}
#endregion
}
#endregion
}

View File

@ -0,0 +1,62 @@
using System;
using System.Collections.Generic;
using libsecondlife;
using libsecondlife.Packets;
using OpenSim.Framework;
using OpenSim.Framework.Console;
using OpenSim.Region.Environment.Scenes;
using OpenSim.Region.Environment.Interfaces;
using Nini.Config;
namespace OpenSim.Region.Environment.Modules.LandManagement
{
public class LandManagementModule : IRegionModule
{
private LandChannel landChannel;
private Scene m_scene;
#region IRegionModule Members
public void Initialise(Scene scene, IConfigSource source)
{
m_scene = scene;
landChannel = new LandChannel(scene);
m_scene.EventManager.OnParcelPrimCountAdd += landChannel.addPrimToLandPrimCounts;
m_scene.EventManager.OnParcelPrimCountUpdate += landChannel.updateLandPrimCounts;
m_scene.EventManager.OnAvatarEnteringNewParcel += new EventManager.AvatarEnteringNewParcel(landChannel.handleAvatarChangingParcel);
m_scene.EventManager.OnClientMovement += new EventManager.ClientMovement(landChannel.handleAnyClientMovement);
lock (m_scene)
{
m_scene.LandChannel = (ILandChannel)landChannel;
}
}
public void PostInitialise()
{
}
public void Close()
{
}
public string Name
{
get { return "LandManagementModule"; }
}
public bool IsSharedModule
{
get { return false; }
}
#endregion
}
}

View File

@ -1,4 +1,4 @@
/* /*
* Copyright (c) Contributors, http://opensimulator.org/ * Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders. * See CONTRIBUTORS.TXT for a full list of copyright holders.
* *
@ -34,31 +34,66 @@ using OpenSim.Framework.Console;
using OpenSim.Region.Environment.Scenes; using OpenSim.Region.Environment.Scenes;
using OpenSim.Region.Environment.Interfaces; using OpenSim.Region.Environment.Interfaces;
namespace OpenSim.Region.Environment.LandManagement namespace OpenSim.Region.Environment.Modules.LandManagement
{ {
#region Parcel Class #region LandObject Class
/// <summary> /// <summary>
/// Keeps track of a specific piece of land's information /// Keeps track of a specific piece of land's information
/// </summary> /// </summary>
public class Land public class LandObject : ILandObject
{ {
#region Member Variables #region Member Variables
private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public LandData landData = new LandData(); protected LandData m_landData = new LandData();
public List<SceneObjectGroup> primsOverMe = new List<SceneObjectGroup>(); protected List<SceneObjectGroup> primsOverMe = new List<SceneObjectGroup>();
public Scene m_scene; protected Scene m_scene;
private bool[,] landBitmap = new bool[64,64]; private bool[,] m_landBitmap = new bool[64,64];
public bool[,] landBitmap
{
get
{
return m_landBitmap;
}
set
{
m_landBitmap = value;
}
}
#endregion #endregion
#region ILandObject Members
public LandData landData
{
get
{
return m_landData;
}
set
{
m_landData = value;
}
}
public LLUUID regionUUID
{
get { return m_scene.RegionInfo.RegionID; }
}
#endregion
#region Constructors #region Constructors
public Land(LLUUID owner_id, bool is_group_owned, Scene scene) public LandObject(LLUUID owner_id, bool is_group_owned, Scene scene)
{ {
m_scene = scene; m_scene = scene;
landData.ownerID = owner_id; landData.ownerID = owner_id;
@ -89,9 +124,9 @@ namespace OpenSim.Region.Environment.LandManagement
} }
} }
public Land Copy() public ILandObject Copy()
{ {
Land newLand = new Land(landData.ownerID, landData.isGroupOwned, m_scene); ILandObject newLand = new LandObject(landData.ownerID, landData.isGroupOwned, m_scene);
//Place all new variables here! //Place all new variables here!
newLand.landBitmap = (bool[,]) (landBitmap.Clone()); newLand.landBitmap = (bool[,]) (landBitmap.Clone());
@ -222,7 +257,7 @@ namespace OpenSim.Region.Environment.LandManagement
newData.userLocation = packet.ParcelData.UserLocation; newData.userLocation = packet.ParcelData.UserLocation;
newData.userLookAt = packet.ParcelData.UserLookAt; newData.userLookAt = packet.ParcelData.UserLookAt;
m_scene.LandManager.updateLandObject(landData.localID, newData); m_scene.LandChannel.updateLandObject(landData.localID, newData);
sendLandUpdateToAvatarsOverMe(); sendLandUpdateToAvatarsOverMe();
} }
@ -283,13 +318,13 @@ namespace OpenSim.Region.Environment.LandManagement
public void sendLandUpdateToAvatarsOverMe() public void sendLandUpdateToAvatarsOverMe()
{ {
List<ScenePresence> avatars = m_scene.GetAvatars(); List<ScenePresence> avatars = m_scene.GetAvatars();
Land over = null; ILandObject over = null;
for (int i = 0; i < avatars.Count; i++) for (int i = 0; i < avatars.Count; i++)
{ {
try try
{ {
over = over =
m_scene.LandManager.getLandObject((int)Math.Max(255,Math.Min(0,Math.Round(avatars[i].AbsolutePosition.X))), m_scene.LandChannel.getLandObject((int)Math.Max(255,Math.Min(0,Math.Round(avatars[i].AbsolutePosition.X))),
(int)Math.Max(255,Math.Min(0,Math.Round(avatars[i].AbsolutePosition.Y)))); (int)Math.Max(255,Math.Min(0,Math.Round(avatars[i].AbsolutePosition.Y))));
} }
catch (Exception) catch (Exception)
@ -406,7 +441,7 @@ namespace OpenSim.Region.Environment.LandManagement
} }
} }
m_scene.LandManager.updateLandObject(landData.localID, newData); m_scene.LandChannel.updateLandObject(landData.localID, newData);
} }
#endregion #endregion
@ -566,7 +601,7 @@ namespace OpenSim.Region.Environment.LandManagement
/// Full sim land object creation /// Full sim land object creation
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
public static bool[,] basicFullRegionLandBitmap() public bool[,] basicFullRegionLandBitmap()
{ {
return getSquareLandBitmap(0, 0, (int)Constants.RegionSize, (int)Constants.RegionSize); return getSquareLandBitmap(0, 0, (int)Constants.RegionSize, (int)Constants.RegionSize);
} }
@ -579,7 +614,7 @@ namespace OpenSim.Region.Environment.LandManagement
/// <param name="end_x"></param> /// <param name="end_x"></param>
/// <param name="end_y"></param> /// <param name="end_y"></param>
/// <returns></returns> /// <returns></returns>
public static bool[,] getSquareLandBitmap(int start_x, int start_y, int end_x, int end_y) public bool[,] getSquareLandBitmap(int start_x, int start_y, int end_x, int end_y)
{ {
bool[,] tempBitmap = new bool[64,64]; bool[,] tempBitmap = new bool[64,64];
tempBitmap.Initialize(); tempBitmap.Initialize();
@ -598,7 +633,7 @@ namespace OpenSim.Region.Environment.LandManagement
/// <param name="end_y"></param> /// <param name="end_y"></param>
/// <param name="set_value"></param> /// <param name="set_value"></param>
/// <returns></returns> /// <returns></returns>
public static bool[,] modifyLandBitmapSquare(bool[,] land_bitmap, int start_x, int start_y, int end_x, int end_y, public bool[,] modifyLandBitmapSquare(bool[,] land_bitmap, int start_x, int start_y, int end_x, int end_y,
bool set_value) bool set_value)
{ {
if (land_bitmap.GetLength(0) != 64 || land_bitmap.GetLength(1) != 64 || land_bitmap.Rank != 2) if (land_bitmap.GetLength(0) != 64 || land_bitmap.GetLength(1) != 64 || land_bitmap.Rank != 2)
@ -628,7 +663,7 @@ namespace OpenSim.Region.Environment.LandManagement
/// <param name="bitmap_base"></param> /// <param name="bitmap_base"></param>
/// <param name="bitmap_add"></param> /// <param name="bitmap_add"></param>
/// <returns></returns> /// <returns></returns>
public static bool[,] mergeLandBitmaps(bool[,] bitmap_base, bool[,] bitmap_add) public bool[,] mergeLandBitmaps(bool[,] bitmap_base, bool[,] bitmap_add)
{ {
if (bitmap_base.GetLength(0) != 64 || bitmap_base.GetLength(1) != 64 || bitmap_base.Rank != 2) if (bitmap_base.GetLength(0) != 64 || bitmap_base.GetLength(1) != 64 || bitmap_base.Rank != 2)
{ {
@ -666,14 +701,14 @@ namespace OpenSim.Region.Environment.LandManagement
{ {
if (obj.LocalId > 0) if (obj.LocalId > 0)
{ {
if (request_type == LandManager.LAND_SELECT_OBJECTS_OWNER && obj.OwnerID == landData.ownerID) if (request_type == LandChannel.LAND_SELECT_OBJECTS_OWNER && obj.OwnerID == landData.ownerID)
{ {
resultLocalIDs.Add(obj.LocalId); resultLocalIDs.Add(obj.LocalId);
} }
// else if (request_type == LandManager.LAND_SELECT_OBJECTS_GROUP && ...) // TODO: group support // else if (request_type == LandManager.LAND_SELECT_OBJECTS_GROUP && ...) // TODO: group support
// { // {
// } // }
else if (request_type == LandManager.LAND_SELECT_OBJECTS_OTHER && else if (request_type == LandChannel.LAND_SELECT_OBJECTS_OTHER &&
obj.OwnerID != remote_client.AgentId) obj.OwnerID != remote_client.AgentId)
{ {
resultLocalIDs.Add(obj.LocalId); resultLocalIDs.Add(obj.LocalId);
@ -836,6 +871,8 @@ namespace OpenSim.Region.Environment.LandManagement
#endregion #endregion
#endregion #endregion
} }
#endregion #endregion

View File

@ -26,9 +26,8 @@
*/ */
using libsecondlife; using libsecondlife;
using OpenSim.Region.Environment.LandManagement;
using OpenSim.Region.Environment.Scenes; using OpenSim.Region.Environment.Scenes;
using OpenSim.Region.Environment.Interfaces;
namespace OpenSim.Region.Environment namespace OpenSim.Region.Environment
{ {
public class PermissionManager public class PermissionManager
@ -126,7 +125,7 @@ namespace OpenSim.Region.Environment
string reason = "Insufficient permission"; string reason = "Insufficient permission";
Land land = m_scene.LandManager.getLandObject(position.X, position.Y); ILandObject land = m_scene.LandChannel.getLandObject(position.X, position.Y);
if (land == null) return false; if (land == null) return false;
if ((land.landData.landFlags & ((int)Parcel.ParcelFlags.CreateObjects)) == if ((land.landData.landFlags & ((int)Parcel.ParcelFlags.CreateObjects)) ==
@ -230,7 +229,7 @@ namespace OpenSim.Region.Environment
} }
// Users should be able to edit what is over their land. // Users should be able to edit what is over their land.
Land parcel = m_scene.LandManager.getLandObject(task.AbsolutePosition.X, task.AbsolutePosition.Y); ILandObject parcel = m_scene.LandChannel.getLandObject(task.AbsolutePosition.X, task.AbsolutePosition.Y);
if (parcel != null && parcel.landData.ownerID == user) if (parcel != null && parcel.landData.ownerID == user)
return objectOwnerMask; return objectOwnerMask;
@ -324,7 +323,7 @@ namespace OpenSim.Region.Environment
} }
// Users should be able to edit what is over their land. // Users should be able to edit what is over their land.
Land parcel = m_scene.LandManager.getLandObject(group.AbsolutePosition.X, group.AbsolutePosition.Y); ILandObject parcel = m_scene.LandChannel.getLandObject(group.AbsolutePosition.X, group.AbsolutePosition.Y);
if ((parcel != null) && (parcel.landData.ownerID == currentUser)) if ((parcel != null) && (parcel.landData.ownerID == currentUser))
{ {
permission = true; permission = true;
@ -551,7 +550,7 @@ namespace OpenSim.Region.Environment
Y = 0; Y = 0;
// Land owner can terraform too // Land owner can terraform too
Land parcel = m_scene.LandManager.getLandObject(X, Y); ILandObject parcel = m_scene.LandChannel.getLandObject(X, Y);
if (parcel != null && GenericParcelPermission(user, parcel)) if (parcel != null && GenericParcelPermission(user, parcel))
permission = true; permission = true;
@ -596,7 +595,7 @@ namespace OpenSim.Region.Environment
#region Parcel Permissions #region Parcel Permissions
protected virtual bool GenericParcelPermission(LLUUID user, Land parcel) protected virtual bool GenericParcelPermission(LLUUID user, ILandObject parcel)
{ {
bool permission = false; bool permission = false;
@ -625,22 +624,22 @@ namespace OpenSim.Region.Environment
protected virtual bool GenericParcelPermission(LLUUID user, LLVector3 pos) protected virtual bool GenericParcelPermission(LLUUID user, LLVector3 pos)
{ {
Land parcel = m_scene.LandManager.getLandObject(pos.X, pos.Y); ILandObject parcel = m_scene.LandChannel.getLandObject(pos.X, pos.Y);
if (parcel == null) return false; if (parcel == null) return false;
return GenericParcelPermission(user, parcel); return GenericParcelPermission(user, parcel);
} }
public virtual bool CanEditParcel(LLUUID user, Land parcel) public virtual bool CanEditParcel(LLUUID user, ILandObject parcel)
{ {
return GenericParcelPermission(user, parcel); return GenericParcelPermission(user, parcel);
} }
public virtual bool CanSellParcel(LLUUID user, Land parcel) public virtual bool CanSellParcel(LLUUID user, ILandObject parcel)
{ {
return GenericParcelPermission(user, parcel); return GenericParcelPermission(user, parcel);
} }
public virtual bool CanAbandonParcel(LLUUID user, Land parcel) public virtual bool CanAbandonParcel(LLUUID user, ILandObject parcel)
{ {
return GenericParcelPermission(user, parcel); return GenericParcelPermission(user, parcel);
} }

View File

@ -89,7 +89,7 @@ namespace OpenSim.Region.Environment.Scenes
{ {
((SceneObjectGroup) ent).GetProperties(remoteClient); ((SceneObjectGroup) ent).GetProperties(remoteClient);
((SceneObjectGroup) ent).IsSelected = true; ((SceneObjectGroup) ent).IsSelected = true;
LandManager.setPrimsTainted(); LandChannel.setPrimsTainted();
} }
break; break;
} }
@ -115,7 +115,7 @@ namespace OpenSim.Region.Environment.Scenes
if (m_permissionManager.CanEditObjectPosition(remoteClient.AgentId, ((SceneObjectGroup)ent).UUID) || m_permissionManager.CanEditObject(remoteClient.AgentId, ((SceneObjectGroup)ent).UUID)) if (m_permissionManager.CanEditObjectPosition(remoteClient.AgentId, ((SceneObjectGroup)ent).UUID) || m_permissionManager.CanEditObject(remoteClient.AgentId, ((SceneObjectGroup)ent).UUID))
{ {
((SceneObjectGroup) ent).IsSelected = false; ((SceneObjectGroup) ent).IsSelected = false;
LandManager.setPrimsTainted(); LandChannel.setPrimsTainted();
break; break;
} }
} }

View File

@ -40,7 +40,6 @@ using OpenSim.Framework.Communications;
using OpenSim.Framework.Communications.Cache; using OpenSim.Framework.Communications.Cache;
using OpenSim.Framework.Servers; using OpenSim.Framework.Servers;
using OpenSim.Region.Environment.Interfaces; using OpenSim.Region.Environment.Interfaces;
using OpenSim.Region.Environment.LandManagement;
using OpenSim.Region.Environment.Modules; using OpenSim.Region.Environment.Modules;
using OpenSim.Region.Environment.Scenes.Scripting; using OpenSim.Region.Environment.Scenes.Scripting;
using OpenSim.Region.Physics.Manager; using OpenSim.Region.Physics.Manager;
@ -154,13 +153,6 @@ namespace OpenSim.Region.Environment.Scenes
get { return m_authenticateHandler; } get { return m_authenticateHandler; }
} }
protected readonly LandManager m_LandManager;
// LandManager object instance that manages land related things. Parcel, primcounts etc..
public LandManager LandManager
{
get { return m_LandManager; }
}
protected readonly EstateManager m_estateManager; protected readonly EstateManager m_estateManager;
// an instance to the physics plugin's Scene object. // an instance to the physics plugin's Scene object.
public PhysicsScene PhysicsScene public PhysicsScene PhysicsScene
@ -256,8 +248,6 @@ namespace OpenSim.Region.Environment.Scenes
m_eventManager = new EventManager(); m_eventManager = new EventManager();
m_LandManager = new LandManager(this, m_regInfo);
//Bind Storage Manager functions to some land manager functions for this scene //Bind Storage Manager functions to some land manager functions for this scene
EventManager.OnLandObjectAdded += EventManager.OnLandObjectAdded +=
new EventManager.LandObjectAdded(m_storageManager.DataStore.StoreLandObject); new EventManager.LandObjectAdded(m_storageManager.DataStore.StoreLandObject);
@ -335,8 +325,6 @@ namespace OpenSim.Region.Environment.Scenes
protected virtual void RegisterDefaultSceneEvents() protected virtual void RegisterDefaultSceneEvents()
{ {
m_eventManager.OnParcelPrimCountAdd += m_LandManager.addPrimToLandPrimCounts;
m_eventManager.OnParcelPrimCountUpdate += addPrimsToParcelCounts;
m_eventManager.OnPermissionError += SendPermissionAlert; m_eventManager.OnPermissionError += SendPermissionAlert;
} }
@ -837,10 +825,12 @@ namespace OpenSim.Region.Environment.Scenes
private void UpdateLand() private void UpdateLand()
{ {
if (m_LandManager.landPrimCountTainted) if (LandChannel != null)
{ {
//Perform land update of prim count if (LandChannel.isLandPrimCountTainted())
performParcelPrimCountUpdate(); {
LandChannel.performParcelPrimCountUpdate();
}
} }
} }
@ -974,12 +964,12 @@ namespace OpenSim.Region.Environment.Scenes
if (dGridSettings["allow_forceful_banlines"] != "TRUE") if (dGridSettings["allow_forceful_banlines"] != "TRUE")
{ {
m_log.Info("[GRID]: Grid is disabling forceful parcel banlists"); m_log.Info("[GRID]: Grid is disabling forceful parcel banlists");
m_LandManager.allowedForcefulBans = false; LandChannel.allowedForcefulBans = false;
} }
else else
{ {
m_log.Info("[GRID]: Grid is allowing forceful parcel banlists"); m_log.Info("[GRID]: Grid is allowing forceful parcel banlists");
m_LandManager.allowedForcefulBans = true; LandChannel.allowedForcefulBans = true;
} }
} }
} }
@ -1016,11 +1006,11 @@ namespace OpenSim.Region.Environment.Scenes
if (landData.Count == 0) if (landData.Count == 0)
{ {
m_LandManager.NoLandDataFromStorage(); LandChannel.NoLandDataFromStorage();
} }
else else
{ {
m_LandManager.IncomingLandObjectsFromStorage(landData); LandChannel.IncomingLandObjectsFromStorage(landData);
} }
} }
@ -1196,9 +1186,9 @@ namespace OpenSim.Region.Environment.Scenes
{ {
if (Entities.ContainsKey(sceneObject.UUID)) if (Entities.ContainsKey(sceneObject.UUID))
{ {
m_LandManager.removePrimFromLandPrimCounts(sceneObject); LandChannel.removePrimFromLandPrimCounts(sceneObject);
Entities.Remove(sceneObject.UUID); Entities.Remove(sceneObject.UUID);
m_LandManager.setPrimsTainted(); LandChannel.setPrimsTainted();
m_innerScene.RemoveAPrimCount(); m_innerScene.RemoveAPrimCount();
} }
} }
@ -1209,7 +1199,7 @@ namespace OpenSim.Region.Environment.Scenes
/// <param name="prim"></param> /// <param name="prim"></param>
public void AcknowledgeNewPrim(SceneObjectGroup prim) public void AcknowledgeNewPrim(SceneObjectGroup prim)
{ {
prim.OnPrimCountTainted += m_LandManager.setPrimsTainted; prim.OnPrimCountTainted += LandChannel.setPrimsTainted;
} }
public void LoadPrimsFromXml(string fileName, bool newIdsFlag, LLVector3 loadOffset) public void LoadPrimsFromXml(string fileName, bool newIdsFlag, LLVector3 loadOffset)
@ -1350,7 +1340,7 @@ namespace OpenSim.Region.Environment.Scenes
CreateAndAddScenePresence(client, child); CreateAndAddScenePresence(client, child);
m_LandManager.sendParcelOverlay(client); LandChannel.sendParcelOverlay(client);
CommsManager.UserProfileCacheService.AddNewUser(client.AgentId); CommsManager.UserProfileCacheService.AddNewUser(client.AgentId);
} }
} }
@ -1387,17 +1377,17 @@ namespace OpenSim.Region.Environment.Scenes
client.OnObjectDuplicate += m_innerScene.DuplicateObject; client.OnObjectDuplicate += m_innerScene.DuplicateObject;
client.OnUpdatePrimFlags += m_innerScene.UpdatePrimFlags; client.OnUpdatePrimFlags += m_innerScene.UpdatePrimFlags;
client.OnRequestObjectPropertiesFamily += m_innerScene.RequestObjectPropertiesFamily; client.OnRequestObjectPropertiesFamily += m_innerScene.RequestObjectPropertiesFamily;
client.OnParcelPropertiesRequest += new ParcelPropertiesRequest(m_LandManager.handleParcelPropertiesRequest); client.OnParcelPropertiesRequest += new ParcelPropertiesRequest(LandChannel.handleParcelPropertiesRequest);
client.OnParcelDivideRequest += new ParcelDivideRequest(m_LandManager.handleParcelDivideRequest); client.OnParcelDivideRequest += new ParcelDivideRequest(LandChannel.handleParcelDivideRequest);
client.OnParcelJoinRequest += new ParcelJoinRequest(m_LandManager.handleParcelJoinRequest); client.OnParcelJoinRequest += new ParcelJoinRequest(LandChannel.handleParcelJoinRequest);
client.OnParcelPropertiesUpdateRequest += client.OnParcelPropertiesUpdateRequest +=
new ParcelPropertiesUpdateRequest(m_LandManager.handleParcelPropertiesUpdateRequest); new ParcelPropertiesUpdateRequest(LandChannel.handleParcelPropertiesUpdateRequest);
client.OnParcelSelectObjects += new ParcelSelectObjects(m_LandManager.handleParcelSelectObjectsRequest); client.OnParcelSelectObjects += new ParcelSelectObjects(LandChannel.handleParcelSelectObjectsRequest);
client.OnParcelObjectOwnerRequest += client.OnParcelObjectOwnerRequest +=
new ParcelObjectOwnerRequest(m_LandManager.handleParcelObjectOwnersRequest); new ParcelObjectOwnerRequest(LandChannel.handleParcelObjectOwnersRequest);
client.OnParcelAccessListRequest += new ParcelAccessListRequest(m_LandManager.handleParcelAccessRequest); client.OnParcelAccessListRequest += new ParcelAccessListRequest(LandChannel.handleParcelAccessRequest);
client.OnParcelAccessListUpdateRequest += client.OnParcelAccessListUpdateRequest +=
new ParcelAccessListUpdateRequest(m_LandManager.handleParcelAccessUpdateRequest); new ParcelAccessListUpdateRequest(LandChannel.handleParcelAccessUpdateRequest);
client.OnEstateOwnerMessage += new EstateOwnerMessageRequest(m_estateManager.handleEstateOwnerMessage); client.OnEstateOwnerMessage += new EstateOwnerMessageRequest(m_estateManager.handleEstateOwnerMessage);
client.OnRegionInfoRequest += m_estateManager.HandleRegionInfoRequest; client.OnRegionInfoRequest += m_estateManager.HandleRegionInfoRequest;
@ -1445,7 +1435,7 @@ namespace OpenSim.Region.Environment.Scenes
if (avatar.IsChildAgent) if (avatar.IsChildAgent)
{ {
avatar.OnSignificantClientMovement += m_LandManager.handleSignificantClientMovement; avatar.OnSignificantClientMovement += LandChannel.handleSignificantClientMovement;
} }
return avatar; return avatar;
@ -2022,30 +2012,6 @@ namespace OpenSim.Region.Environment.Scenes
return LLUUID.Zero; return LLUUID.Zero;
} }
/// <summary>
///
/// </summary>
public void performParcelPrimCountUpdate()
{
m_LandManager.resetAllLandPrimCounts();
m_eventManager.TriggerParcelPrimCountUpdate();
m_LandManager.finalizeLandPrimCountUpdate();
m_LandManager.landPrimCountTainted = false;
}
/// <summary>
///
/// </summary>
public void addPrimsToParcelCounts()
{
foreach (EntityBase obj in Entities.Values)
{
if (obj is SceneObjectGroup)
{
m_eventManager.TriggerParcelPrimCountAdd((SceneObjectGroup)obj);
}
}
}
/// <summary> /// <summary>
/// This method is a way for the Friends Module to create an instant /// This method is a way for the Friends Module to create an instant
@ -2455,7 +2421,7 @@ namespace OpenSim.Region.Environment.Scenes
public LLUUID GetLandOwner(float x, float y) public LLUUID GetLandOwner(float x, float y)
{ {
Land land = LandManager.getLandObject(x, y); ILandObject land = LandChannel.getLandObject(x, y);
if (land == null) if (land == null)
{ {
return LLUUID.Zero; return LLUUID.Zero;
@ -2468,12 +2434,12 @@ namespace OpenSim.Region.Environment.Scenes
public LandData GetLandData(float x, float y) public LandData GetLandData(float x, float y)
{ {
return LandManager.getLandObject(x, y).landData; return LandChannel.getLandObject(x, y).landData;
} }
public void SetLandMusicURL(float x, float y, string url) public void SetLandMusicURL(float x, float y, string url)
{ {
Land land = LandManager.getLandObject(x, y); ILandObject land = LandChannel.getLandObject(x, y);
if (land == null) if (land == null)
{ {
return; return;
@ -2487,7 +2453,7 @@ namespace OpenSim.Region.Environment.Scenes
public void SetLandMediaURL(float x, float y, string url) public void SetLandMediaURL(float x, float y, string url)
{ {
Land land = LandManager.getLandObject(x, y); ILandObject land = LandChannel.getLandObject(x, y);
if (land == null) if (land == null)
{ {

View File

@ -62,6 +62,8 @@ namespace OpenSim.Region.Environment.Scenes
//public TerrainEngine Terrain; //public TerrainEngine Terrain;
public ITerrainChannel Heightmap; public ITerrainChannel Heightmap;
public ILandChannel LandChannel;
protected EventManager m_eventManager; protected EventManager m_eventManager;
public EventManager EventManager public EventManager EventManager
@ -69,6 +71,7 @@ namespace OpenSim.Region.Environment.Scenes
get { return m_eventManager; } get { return m_eventManager; }
} }
protected string m_datastore; protected string m_datastore;
private uint m_nextLocalId = 8880000; private uint m_nextLocalId = 8880000;

View File

@ -29,7 +29,6 @@ using libsecondlife;
using System; using System;
using OpenSim.Framework; using OpenSim.Framework;
using OpenSim.Region.Environment.Interfaces; using OpenSim.Region.Environment.Interfaces;
using OpenSim.Region.Environment.LandManagement;
namespace OpenSim.Region.Environment.Scenes namespace OpenSim.Region.Environment.Scenes
{ {
@ -106,7 +105,7 @@ namespace OpenSim.Region.Environment.Scenes
public event SceneGroupGrabed OnSceneGroupGrab; public event SceneGroupGrabed OnSceneGroupGrab;
public delegate void LandObjectAdded(Land newParcel, LLUUID regionUUID); public delegate void LandObjectAdded(ILandObject newParcel);
public event LandObjectAdded OnLandObjectAdded; public event LandObjectAdded OnLandObjectAdded;
@ -352,13 +351,13 @@ namespace OpenSim.Region.Environment.Scenes
} }
} }
public void TriggerLandObjectAdded(Land newParcel, LLUUID regionID) public void TriggerLandObjectAdded(ILandObject newParcel)
{ {
handlerLandObjectAdded = OnLandObjectAdded; handlerLandObjectAdded = OnLandObjectAdded;
if (handlerLandObjectAdded != null) if (handlerLandObjectAdded != null)
{ {
handlerLandObjectAdded(newParcel, regionID); handlerLandObjectAdded(newParcel);
} }
} }
@ -371,11 +370,11 @@ namespace OpenSim.Region.Environment.Scenes
} }
} }
public void TriggerLandObjectUpdated(uint localParcelID, Land newParcel) public void TriggerLandObjectUpdated(uint localParcelID, ILandObject newParcel)
{ {
//triggerLandObjectRemoved(localParcelID); //triggerLandObjectRemoved(localParcelID);
TriggerLandObjectAdded(newParcel, newParcel.m_scene.RegionInfo.RegionID); TriggerLandObjectAdded(newParcel);
} }
public void TriggerAvatarEnteringNewParcel(ScenePresence avatar, int localLandID, LLUUID regionID) public void TriggerAvatarEnteringNewParcel(ScenePresence avatar, int localLandID, LLUUID regionID)

View File

@ -371,7 +371,7 @@ namespace OpenSim.Region.Environment.Scenes
RegisterToEvents(); RegisterToEvents();
SetDirectionVectors(); SetDirectionVectors();
m_scene.LandManager.sendLandUpdate(this, true); m_scene.LandChannel.sendLandUpdate(this, true);
} }
public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, byte[] visualParams, public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, byte[] visualParams,
@ -549,7 +549,7 @@ namespace OpenSim.Region.Environment.Scenes
//if (!m_gotAllObjectsInScene) //if (!m_gotAllObjectsInScene)
//{ //{
m_scene.SendAllSceneObjectsToClient(this); m_scene.SendAllSceneObjectsToClient(this);
m_scene.LandManager.sendLandUpdate(this, true); m_scene.LandChannel.sendLandUpdate(this, true);
//m_gotAllObjectsInScene = true; //m_gotAllObjectsInScene = true;
//} //}

View File

@ -29,7 +29,7 @@ using System;
using System.Text; using System.Text;
using Axiom.Math; using Axiom.Math;
using OpenSim.Framework.Console; using OpenSim.Framework.Console;
using OpenSim.Region.Environment.LandManagement; using OpenSim.Region.Environment.Interfaces;
using OpenSim.Region.Environment.Scenes; using OpenSim.Region.Environment.Scenes;
using Key = libsecondlife.LLUUID; using Key = libsecondlife.LLUUID;
using Rotation = libsecondlife.LLQuaternion; using Rotation = libsecondlife.LLQuaternion;
@ -105,7 +105,7 @@ namespace OpenSim.Region.ExtensionsScriptModule
public void osAddToLandPassList(Key avatar, float hours) public void osAddToLandPassList(Key avatar, float hours)
{ {
Vector myPosition = Task.AbsolutePosition; Vector myPosition = Task.AbsolutePosition;
Land myParcel = Scene.LandManager.getLandObject(myPosition.X, myPosition.Y); ILandObject myParcel = Scene.LandChannel.getLandObject(myPosition.X, myPosition.Y);
if (myParcel == null) if (myParcel == null)
{ {
//Dont do anything! //Dont do anything!

View File

@ -4311,7 +4311,7 @@ namespace OpenSim.Region.ScriptEngine.Common
public int llGetParcelFlags(LSL_Types.Vector3 pos) public int llGetParcelFlags(LSL_Types.Vector3 pos)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
return (int)World.LandManager.getLandObject((float)pos.x, (float)pos.y).landData.landFlags; return (int)World.LandChannel.getLandObject((float)pos.x, (float)pos.y).landData.landFlags;
} }
public int llGetRegionFlags() public int llGetRegionFlags()

View File

@ -35,7 +35,6 @@ using OpenSim.Framework;
using OpenSim.Framework.Console; using OpenSim.Framework.Console;
using OpenSim.Framework.Data; using OpenSim.Framework.Data;
using OpenSim.Region.Environment.Interfaces; using OpenSim.Region.Environment.Interfaces;
using OpenSim.Region.Environment.LandManagement;
using OpenSim.Region.Environment.Scenes; using OpenSim.Region.Environment.Scenes;
namespace OpenSim.DataStore.MSSQL namespace OpenSim.DataStore.MSSQL
@ -304,7 +303,7 @@ namespace OpenSim.DataStore.MSSQL
{ {
} }
public void StoreLandObject(Land parcel, LLUUID regionUUID) public void StoreLandObject(ILandObject parcel)
{ {
} }

View File

@ -29,7 +29,6 @@ using System.Collections.Generic;
using libsecondlife; using libsecondlife;
using OpenSim.Framework; using OpenSim.Framework;
using OpenSim.Region.Environment.Interfaces; using OpenSim.Region.Environment.Interfaces;
using OpenSim.Region.Environment.LandManagement;
using OpenSim.Region.Environment.Scenes; using OpenSim.Region.Environment.Scenes;
namespace OpenSim.DataStore.NullStorage namespace OpenSim.DataStore.NullStorage
@ -72,7 +71,7 @@ namespace OpenSim.DataStore.NullStorage
{ {
} }
public void StoreLandObject(Land land, LLUUID regionUUID) public void StoreLandObject(ILandObject land)
{ {
} }