bool SpreadLight(int x, int y, int z, int skylight, int blocklight, int recurselevel=0)
{
byte block,stopLight,emitLight;
Block meta;
// If no light, stop!
if((skylight < 1) && (blocklight < 1))
return false;
for(int i = 0; i < 6; i++)
{
// Going too high
if((y == 127) && (i == 2))
i++;
// going negative
if((y == 0) && (i == 3))
i++;
int x_toset = x;
int y_toset = y;
int z_toset = z;
switch(i)
{
case 0: x_toset++; break;
case 1: x_toset--; break;
case 2: y_toset++; break;
case 3: y_toset--; break;
case 4: z_toset++; break;
case 5: z_toset--; break;
}
block = GetBlockAt(x_toset, z_toset, y_toset);
meta = Blocks.Get(block);
stopLight = meta.Stop;
emitLight = meta.Emit;
if (true)
{
byte skylightCurrent, blocklightCurrent;
int skylightNew, blocklightNew;
bool spread = false;
skylightNew = skylight-stopLight-1;
if (skylightNew < 0)
skylightNew = 0;
blocklightNew = blocklight-stopLight-1;
if (blocklightNew < 0)
blocklightNew = 0;
GetLightAt(x_toset, z_toset, y_toset, out skylightCurrent, out blocklightCurrent);
if (skylightNew > skylightCurrent)
{
skylightCurrent = (byte)skylightNew;
spread = true;
}
if (blocklightNew > blocklightCurrent)
{
blocklightCurrent = (byte)blocklightNew;
spread = true;
}
if (spread)
{
SetSkyLightAt(x_toset, z_toset, y_toset, skylightCurrent);
SetBlockLightAt(x_toset, z_toset, y_toset, blocklightCurrent);
SpreadLight(x_toset, y_toset, z_toset, skylightCurrent, blocklightCurrent, recurselevel+1);
}
}
}
return true;
}