* Fixes looking up parcel permissions in virtual regions.
parent
d45f871d8f
commit
3ccf3aba89
|
@ -42,6 +42,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
RegionConnections regionConnections = new RegionConnections();
|
RegionConnections regionConnections = new RegionConnections();
|
||||||
regionConnections.ConnectedRegions = new List<RegionData>();
|
regionConnections.ConnectedRegions = new List<RegionData>();
|
||||||
regionConnections.RegionScene = scene;
|
regionConnections.RegionScene = scene;
|
||||||
|
regionConnections.RegionLandChannel = scene.LandChannel;
|
||||||
regionConnections.RegionId = scene.RegionInfo.originRegionID;
|
regionConnections.RegionId = scene.RegionInfo.originRegionID;
|
||||||
regionConnections.X = scene.RegionInfo.RegionLocX;
|
regionConnections.X = scene.RegionInfo.RegionLocX;
|
||||||
regionConnections.Y = scene.RegionInfo.RegionLocY;
|
regionConnections.Y = scene.RegionInfo.RegionLocY;
|
||||||
|
@ -240,6 +241,13 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
|
|
||||||
scene.BordersLocked = true;
|
scene.BordersLocked = true;
|
||||||
conn.RegionScene.BordersLocked = true;
|
conn.RegionScene.BordersLocked = true;
|
||||||
|
|
||||||
|
RegionData ConnectedRegion = new RegionData();
|
||||||
|
ConnectedRegion.Offset = offset;
|
||||||
|
ConnectedRegion.RegionId = scene.RegionInfo.originRegionID;
|
||||||
|
ConnectedRegion.RegionScene = scene;
|
||||||
|
conn.ConnectedRegions.Add(ConnectedRegion);
|
||||||
|
|
||||||
conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents);
|
conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents);
|
||||||
scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero);
|
scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero);
|
||||||
|
|
||||||
|
@ -259,9 +267,9 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
//
|
//
|
||||||
scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised());
|
scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised());
|
||||||
//conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised());
|
//conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised());
|
||||||
|
|
||||||
conn.RegionScene.BordersLocked = false;
|
conn.RegionScene.BordersLocked = false;
|
||||||
scene.BordersLocked = false;
|
scene.BordersLocked = false;
|
||||||
|
|
||||||
connectedYN = true;
|
connectedYN = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -292,6 +300,12 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
scene.BordersLocked = true;
|
scene.BordersLocked = true;
|
||||||
conn.RegionScene.BordersLocked = true;
|
conn.RegionScene.BordersLocked = true;
|
||||||
|
|
||||||
|
RegionData ConnectedRegion = new RegionData();
|
||||||
|
ConnectedRegion.Offset = offset;
|
||||||
|
ConnectedRegion.RegionId = scene.RegionInfo.originRegionID;
|
||||||
|
ConnectedRegion.RegionScene = scene;
|
||||||
|
conn.ConnectedRegions.Add(ConnectedRegion);
|
||||||
|
|
||||||
m_log.DebugFormat("Scene: {0} to the northeast of Scene{1} Offset: {2}. Extents:{3}",
|
m_log.DebugFormat("Scene: {0} to the northeast of Scene{1} Offset: {2}. Extents:{3}",
|
||||||
conn.RegionScene.RegionInfo.RegionName,
|
conn.RegionScene.RegionInfo.RegionName,
|
||||||
regionConnections.RegionScene.RegionInfo.RegionName, offset, extents);
|
regionConnections.RegionScene.RegionInfo.RegionName, offset, extents);
|
||||||
|
@ -342,6 +356,13 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
scene.BordersLocked = true;
|
scene.BordersLocked = true;
|
||||||
conn.RegionScene.BordersLocked = true;
|
conn.RegionScene.BordersLocked = true;
|
||||||
|
|
||||||
|
RegionData ConnectedRegion = new RegionData();
|
||||||
|
ConnectedRegion.Offset = offset;
|
||||||
|
ConnectedRegion.RegionId = scene.RegionInfo.originRegionID;
|
||||||
|
ConnectedRegion.RegionScene = scene;
|
||||||
|
|
||||||
|
conn.ConnectedRegions.Add(ConnectedRegion);
|
||||||
|
|
||||||
m_log.DebugFormat("Scene: {0} to the NorthEast of Scene{1} Offset: {2}. Extents:{3}",
|
m_log.DebugFormat("Scene: {0} to the NorthEast of Scene{1} Offset: {2}. Extents:{3}",
|
||||||
conn.RegionScene.RegionInfo.RegionName,
|
conn.RegionScene.RegionInfo.RegionName,
|
||||||
regionConnections.RegionScene.RegionInfo.RegionName, offset, extents);
|
regionConnections.RegionScene.RegionInfo.RegionName, offset, extents);
|
||||||
|
@ -409,8 +430,20 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
|
|
||||||
}
|
}
|
||||||
if (!connectedYN)
|
if (!connectedYN)
|
||||||
|
{
|
||||||
|
RegionData rdata = new RegionData();
|
||||||
|
rdata.Offset = Vector3.Zero;
|
||||||
|
rdata.RegionId = scene.RegionInfo.originRegionID;
|
||||||
|
rdata.RegionScene = scene;
|
||||||
|
regionConnections.RegionLandChannel = scene.LandChannel;
|
||||||
|
|
||||||
|
LargeLandChannel lnd = new LargeLandChannel(rdata,scene.LandChannel,regionConnections.ConnectedRegions);
|
||||||
|
scene.LandChannel = lnd;
|
||||||
|
|
||||||
m_regions.Add(scene.RegionInfo.originRegionID,regionConnections);
|
m_regions.Add(scene.RegionInfo.originRegionID,regionConnections);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveRegion(Scene scene)
|
public void RemoveRegion(Scene scene)
|
||||||
|
@ -431,12 +464,29 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
public RegionData GetRegionFromPosition(Vector3 pPosition)
|
||||||
|
{
|
||||||
|
pPosition = pPosition/(int) Constants.RegionSize;
|
||||||
|
int OffsetX = (int) pPosition.X;
|
||||||
|
int OffsetY = (int) pPosition.Y;
|
||||||
|
foreach (RegionConnections regConn in m_regions.Values)
|
||||||
|
{
|
||||||
|
foreach (RegionData reg in regConn.ConnectedRegions)
|
||||||
|
{
|
||||||
|
if (reg.Offset.X == OffsetX && reg.Offset.Y == OffsetY)
|
||||||
|
return reg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new RegionData();
|
||||||
|
}
|
||||||
|
}
|
||||||
public class RegionConnections
|
public class RegionConnections
|
||||||
{
|
{
|
||||||
public UUID RegionId;
|
public UUID RegionId;
|
||||||
public Scene RegionScene;
|
public Scene RegionScene;
|
||||||
|
public ILandChannel RegionLandChannel;
|
||||||
public uint X;
|
public uint X;
|
||||||
public uint Y;
|
public uint Y;
|
||||||
public int XEnd;
|
public int XEnd;
|
||||||
|
@ -450,10 +500,140 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public struct RegionData
|
public class RegionData
|
||||||
{
|
{
|
||||||
public UUID RegionId;
|
public UUID RegionId;
|
||||||
public Scene RegionScene;
|
public Scene RegionScene;
|
||||||
public Vector3 Offset;
|
public Vector3 Offset;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class LargeLandChannel : ILandChannel
|
||||||
|
{
|
||||||
|
private static readonly ILog m_log =
|
||||||
|
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
private RegionData RegData;
|
||||||
|
private ILandChannel RootRegionLandChannel;
|
||||||
|
private readonly List<RegionData> RegionConnections;
|
||||||
|
|
||||||
|
#region ILandChannel Members
|
||||||
|
|
||||||
|
public LargeLandChannel(RegionData regData, ILandChannel rootRegionLandChannel,List<RegionData> regionConnections)
|
||||||
|
{
|
||||||
|
RegData = regData;
|
||||||
|
RootRegionLandChannel = rootRegionLandChannel;
|
||||||
|
RegionConnections = regionConnections;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ILandObject> ParcelsNearPoint(Vector3 position)
|
||||||
|
{
|
||||||
|
m_log.DebugFormat("[LANDPARCELNEARPOINT]: {0}>", position);
|
||||||
|
return RootRegionLandChannel.ParcelsNearPoint(position - RegData.Offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ILandObject> AllParcels()
|
||||||
|
{
|
||||||
|
|
||||||
|
return RootRegionLandChannel.AllParcels();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public ILandObject GetLandObject(int x, int y)
|
||||||
|
{
|
||||||
|
m_log.DebugFormat("[BIGLANDTESTINT]: <{0},{1}>", x, y);
|
||||||
|
|
||||||
|
if (x > 0 && x <= (int)Constants.RegionSize && y > 0 && y <= (int)Constants.RegionSize)
|
||||||
|
{
|
||||||
|
return RootRegionLandChannel.GetLandObject(x, y);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int offsetX = (x / (int)Constants.RegionSize);
|
||||||
|
int offsetY = (x / (int)Constants.RegionSize);
|
||||||
|
offsetX *= (int)Constants.RegionSize;
|
||||||
|
offsetY *= (int)Constants.RegionSize;
|
||||||
|
|
||||||
|
foreach (RegionData regionData in RegionConnections)
|
||||||
|
{
|
||||||
|
if (regionData.Offset.X == offsetX && regionData.Offset.Y == offsetY)
|
||||||
|
{
|
||||||
|
return regionData.RegionScene.LandChannel.GetLandObject(x - offsetX, y - offsetY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ILandObject obj = new LandObject(UUID.Zero, false, RegData.RegionScene);
|
||||||
|
obj.landData.Name = "NO LAND";
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ILandObject GetLandObject(int localID)
|
||||||
|
{
|
||||||
|
return RootRegionLandChannel.GetLandObject(localID);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ILandObject GetLandObject(float x, float y)
|
||||||
|
{
|
||||||
|
m_log.DebugFormat("[BIGLANDTESTFLOAT]: <{0},{1}>", x, y);
|
||||||
|
|
||||||
|
if (x > 0 && x <= (int)Constants.RegionSize && y > 0 && y <= (int)Constants.RegionSize)
|
||||||
|
{
|
||||||
|
return RootRegionLandChannel.GetLandObject(x, y);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int offsetX = (int)(x/(int) Constants.RegionSize);
|
||||||
|
int offsetY = (int)(x/(int) Constants.RegionSize);
|
||||||
|
offsetX *= (int) Constants.RegionSize;
|
||||||
|
offsetY *= (int) Constants.RegionSize;
|
||||||
|
|
||||||
|
foreach (RegionData regionData in RegionConnections)
|
||||||
|
{
|
||||||
|
if (regionData.Offset.X == offsetX && regionData.Offset.Y == offsetY)
|
||||||
|
{
|
||||||
|
return regionData.RegionScene.LandChannel.GetLandObject(x - offsetX, y - offsetY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ILandObject obj = new LandObject(UUID.Zero, false, RegData.RegionScene);
|
||||||
|
obj.landData.Name = "NO LAND";
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsLandPrimCountTainted()
|
||||||
|
{
|
||||||
|
return RootRegionLandChannel.IsLandPrimCountTainted();
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsForcefulBansAllowed()
|
||||||
|
{
|
||||||
|
return RootRegionLandChannel.IsForcefulBansAllowed();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateLandObject(int localID, LandData data)
|
||||||
|
{
|
||||||
|
RootRegionLandChannel.UpdateLandObject(localID, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ReturnObjectsInParcel(int localID, uint returnType, UUID[] agentIDs, UUID[] taskIDs, IClientAPI remoteClient)
|
||||||
|
{
|
||||||
|
RootRegionLandChannel.ReturnObjectsInParcel(localID, returnType, agentIDs, taskIDs, remoteClient);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setParcelObjectMaxOverride(overrideParcelMaxPrimCountDelegate overrideDel)
|
||||||
|
{
|
||||||
|
RootRegionLandChannel.setParcelObjectMaxOverride(overrideDel);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSimulatorObjectMaxOverride(overrideSimulatorMaxPrimCountDelegate overrideDel)
|
||||||
|
{
|
||||||
|
RootRegionLandChannel.setSimulatorObjectMaxOverride(overrideDel);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetParcelOtherCleanTime(IClientAPI remoteClient, int localID, int otherCleanTime)
|
||||||
|
{
|
||||||
|
RootRegionLandChannel.SetParcelOtherCleanTime(remoteClient, localID, otherCleanTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue