terrain: make sure modify does get unblocked
parent
61f918cbda
commit
103ebac082
|
@ -1336,156 +1336,163 @@ namespace OpenSim.Region.CoreModules.World.Terrain
|
||||||
if(now < NextModifyTerrainTime)
|
if(now < NextModifyTerrainTime)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
NextModifyTerrainTime = double.MaxValue; // block it
|
try
|
||||||
|
|
||||||
//m_log.DebugFormat("brushs {0} seconds {1} height {2}, parcel {3}", brushSize, seconds, height, parcelLocalID);
|
|
||||||
bool god = m_scene.Permissions.IsGod(user);
|
|
||||||
bool allowed = false;
|
|
||||||
if (north == south && east == west)
|
|
||||||
{
|
{
|
||||||
if (m_painteffects.ContainsKey((StandardTerrainEffects)action))
|
NextModifyTerrainTime = double.MaxValue; // block it
|
||||||
|
|
||||||
|
//m_log.DebugFormat("brushs {0} seconds {1} height {2}, parcel {3}", brushSize, seconds, height, parcelLocalID);
|
||||||
|
bool god = m_scene.Permissions.IsGod(user);
|
||||||
|
bool allowed = false;
|
||||||
|
if (north == south && east == west)
|
||||||
{
|
{
|
||||||
bool[,] allowMask = new bool[m_channel.Width, m_channel.Height];
|
if (m_painteffects.ContainsKey((StandardTerrainEffects)action))
|
||||||
|
|
||||||
allowMask.Initialize();
|
|
||||||
|
|
||||||
int startX = (int)(west - brushSize + 0.5);
|
|
||||||
if (startX < 0)
|
|
||||||
startX = 0;
|
|
||||||
|
|
||||||
int startY = (int)(north - brushSize + 0.5);
|
|
||||||
if (startY < 0)
|
|
||||||
startY = 0;
|
|
||||||
|
|
||||||
int endX = (int)(west + brushSize + 0.5);
|
|
||||||
if (endX >= m_channel.Width)
|
|
||||||
endX = m_channel.Width - 1;
|
|
||||||
int endY = (int)(north + brushSize + 0.5);
|
|
||||||
if (endY >= m_channel.Height)
|
|
||||||
endY = m_channel.Height - 1;
|
|
||||||
|
|
||||||
int x, y;
|
|
||||||
|
|
||||||
for (x = startX; x <= endX; x++)
|
|
||||||
{
|
{
|
||||||
for (y = startY; y <= endY; y++)
|
bool[,] allowMask = new bool[m_channel.Width, m_channel.Height];
|
||||||
{
|
|
||||||
if (m_scene.Permissions.CanTerraformLand(user, new Vector3(x, y, -1)))
|
|
||||||
{
|
|
||||||
allowMask[x, y] = true;
|
|
||||||
allowed = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (allowed)
|
|
||||||
{
|
|
||||||
StoreUndoState();
|
|
||||||
m_painteffects[(StandardTerrainEffects) action].PaintEffect(
|
|
||||||
m_channel, allowMask, west, south, height, brushSize, seconds,
|
|
||||||
startX, endX, startY, endY);
|
|
||||||
|
|
||||||
//block changes outside estate limits
|
allowMask.Initialize();
|
||||||
if (!god)
|
|
||||||
EnforceEstateLimits(startX, endX, startY, endY);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_log.Debug("Unknown terrain brush type " + action);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (m_floodeffects.ContainsKey((StandardTerrainEffects)action))
|
|
||||||
{
|
|
||||||
bool[,] fillArea = new bool[m_channel.Width, m_channel.Height];
|
|
||||||
fillArea.Initialize();
|
|
||||||
|
|
||||||
int startX = (int)west;
|
int startX = (int)(west - brushSize + 0.5);
|
||||||
int startY = (int)south;
|
if (startX < 0)
|
||||||
int endX = (int)east;
|
startX = 0;
|
||||||
int endY = (int)north;
|
|
||||||
|
|
||||||
if (startX < 0)
|
int startY = (int)(north - brushSize + 0.5);
|
||||||
startX = 0;
|
if (startY < 0)
|
||||||
else if (startX >= m_channel.Width)
|
startY = 0;
|
||||||
startX = m_channel.Width - 1;
|
|
||||||
|
|
||||||
if (endX < 0)
|
int endX = (int)(west + brushSize + 0.5);
|
||||||
endX = 0;
|
if (endX >= m_channel.Width)
|
||||||
else if (endX >= m_channel.Width)
|
endX = m_channel.Width - 1;
|
||||||
endX = m_channel.Width - 1;
|
int endY = (int)(north + brushSize + 0.5);
|
||||||
|
if (endY >= m_channel.Height)
|
||||||
|
endY = m_channel.Height - 1;
|
||||||
|
|
||||||
if (startY < 0)
|
int x, y;
|
||||||
startY = 0;
|
|
||||||
else if (startY >= m_channel.Height)
|
|
||||||
startY = m_channel.Height - 1;
|
|
||||||
|
|
||||||
if (endY < 0)
|
|
||||||
endY = 0;
|
|
||||||
else if (endY >= m_channel.Height)
|
|
||||||
endY = m_channel.Height - 1;
|
|
||||||
|
|
||||||
int x, y;
|
|
||||||
if (parcelLocalID == -1)
|
|
||||||
{
|
|
||||||
for (x = startX; x <= endX; x++)
|
for (x = startX; x <= endX; x++)
|
||||||
{
|
{
|
||||||
for (y = startY; y <= endY; y++)
|
for (y = startY; y <= endY; y++)
|
||||||
{
|
{
|
||||||
if (m_scene.Permissions.CanTerraformLand(user, new Vector3(x, y, -1)))
|
if (m_scene.Permissions.CanTerraformLand(user, new Vector3(x, y, -1)))
|
||||||
{
|
{
|
||||||
fillArea[x, y] = true;
|
allowMask[x, y] = true;
|
||||||
allowed = true;
|
allowed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (allowed)
|
||||||
|
{
|
||||||
|
StoreUndoState();
|
||||||
|
m_painteffects[(StandardTerrainEffects) action].PaintEffect(
|
||||||
|
m_channel, allowMask, west, south, height, brushSize, seconds,
|
||||||
|
startX, endX, startY, endY);
|
||||||
|
|
||||||
|
//block changes outside estate limits
|
||||||
|
if (!god)
|
||||||
|
EnforceEstateLimits(startX, endX, startY, endY);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!m_scene.Permissions.CanTerraformLand(user, new Vector3(-1, -1, parcelLocalID)))
|
m_log.Debug("Unknown terrain brush type " + action);
|
||||||
return;
|
|
||||||
|
|
||||||
ILandObject parcel = m_scene.LandChannel.GetLandObject(parcelLocalID);
|
|
||||||
if(parcel == null)
|
|
||||||
return;
|
|
||||||
bool [,] parcelmap = parcel.GetLandBitmap();
|
|
||||||
//ugly
|
|
||||||
for (x = startX; x <= endX; x++)
|
|
||||||
{
|
|
||||||
int px = x >> 2;
|
|
||||||
y = startY;
|
|
||||||
while( y <= endY)
|
|
||||||
{
|
|
||||||
int py = y >> 2;
|
|
||||||
bool inp = parcelmap[px, py];
|
|
||||||
fillArea[x, y++] = inp;
|
|
||||||
fillArea[x, y++] = inp;
|
|
||||||
fillArea[x, y++] = inp;
|
|
||||||
fillArea[x, y++] = inp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
allowed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (allowed)
|
|
||||||
{
|
|
||||||
StoreUndoState();
|
|
||||||
m_floodeffects[(StandardTerrainEffects)action].FloodEffect(m_channel, fillArea, height, seconds,
|
|
||||||
startX, endX, startY, endY);
|
|
||||||
|
|
||||||
//block changes outside estate limits
|
|
||||||
if (!god)
|
|
||||||
EnforceEstateLimits(startX, endX, startY, endY);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_log.Debug("Unknown terrain flood type " + action);
|
if (m_floodeffects.ContainsKey((StandardTerrainEffects)action))
|
||||||
|
{
|
||||||
|
bool[,] fillArea = new bool[m_channel.Width, m_channel.Height];
|
||||||
|
fillArea.Initialize();
|
||||||
|
|
||||||
|
int startX = (int)west;
|
||||||
|
int startY = (int)south;
|
||||||
|
int endX = (int)east;
|
||||||
|
int endY = (int)north;
|
||||||
|
|
||||||
|
if (startX < 0)
|
||||||
|
startX = 0;
|
||||||
|
else if (startX >= m_channel.Width)
|
||||||
|
startX = m_channel.Width - 1;
|
||||||
|
|
||||||
|
if (endX < 0)
|
||||||
|
endX = 0;
|
||||||
|
else if (endX >= m_channel.Width)
|
||||||
|
endX = m_channel.Width - 1;
|
||||||
|
|
||||||
|
if (startY < 0)
|
||||||
|
startY = 0;
|
||||||
|
else if (startY >= m_channel.Height)
|
||||||
|
startY = m_channel.Height - 1;
|
||||||
|
|
||||||
|
if (endY < 0)
|
||||||
|
endY = 0;
|
||||||
|
else if (endY >= m_channel.Height)
|
||||||
|
endY = m_channel.Height - 1;
|
||||||
|
|
||||||
|
int x, y;
|
||||||
|
if (parcelLocalID == -1)
|
||||||
|
{
|
||||||
|
for (x = startX; x <= endX; x++)
|
||||||
|
{
|
||||||
|
for (y = startY; y <= endY; y++)
|
||||||
|
{
|
||||||
|
if (m_scene.Permissions.CanTerraformLand(user, new Vector3(x, y, -1)))
|
||||||
|
{
|
||||||
|
fillArea[x, y] = true;
|
||||||
|
allowed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!m_scene.Permissions.CanTerraformLand(user, new Vector3(-1, -1, parcelLocalID)))
|
||||||
|
return;
|
||||||
|
|
||||||
|
ILandObject parcel = m_scene.LandChannel.GetLandObject(parcelLocalID);
|
||||||
|
if(parcel == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
bool[,] parcelmap = parcel.GetLandBitmap();
|
||||||
|
//ugly
|
||||||
|
for (x = startX; x <= endX; x++)
|
||||||
|
{
|
||||||
|
int px = x >> 2;
|
||||||
|
y = startY;
|
||||||
|
while( y <= endY)
|
||||||
|
{
|
||||||
|
int py = y >> 2;
|
||||||
|
bool inp = parcelmap[px, py];
|
||||||
|
fillArea[x, y++] = inp;
|
||||||
|
fillArea[x, y++] = inp;
|
||||||
|
fillArea[x, y++] = inp;
|
||||||
|
fillArea[x, y++] = inp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
allowed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (allowed)
|
||||||
|
{
|
||||||
|
StoreUndoState();
|
||||||
|
m_floodeffects[(StandardTerrainEffects)action].FloodEffect(m_channel, fillArea, height, seconds,
|
||||||
|
startX, endX, startY, endY);
|
||||||
|
|
||||||
|
//block changes outside estate limits
|
||||||
|
if (!god)
|
||||||
|
EnforceEstateLimits(startX, endX, startY, endY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_log.Debug("Unknown terrain flood type " + action);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
NextModifyTerrainTime = Util.GetTimeStamp() + 0.02; // 20ms cooldown
|
finally
|
||||||
|
{
|
||||||
|
NextModifyTerrainTime = Util.GetTimeStamp() + 0.02; // 20ms cooldown
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void client_OnBakeTerrain(IClientAPI remoteClient)
|
private void client_OnBakeTerrain(IClientAPI remoteClient)
|
||||||
|
|
Loading…
Reference in New Issue