terrain: make sure modify does get unblocked

0.9.1.1
UbitUmarov 2019-11-17 15:01:21 +00:00
parent 61f918cbda
commit 103ebac082
1 changed files with 130 additions and 123 deletions

View File

@ -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)