private void HandleSetBlockPacket(object incoming)
{
var data = (byte[]) incoming;
ushort x = NTHO(data, 0);
ushort y = NTHO(data, 2);
ushort z = NTHO(data, 4);
bool isPlacing = data[6] == 0x01;
byte incomingType = data[7];
if (Level.NotInBounds(x, y, z)) return;
int blockPos = Level.PosToInt(x, y, z);
if (blockPos >= Level.BlockData.Length || blockPos < 0)
{
Server.Log(blockPos + " was OUT OF BOUNDS!", LogTypesEnum.Error);
return;
}
byte oldBlock = Level.BlockData[blockPos];
if (EnableHistoryMode)
{
SendBlockChange(x, y, z, oldBlock);
var hD = Server.HistoryController.GetData(Level.Name, blockPos);
var playername = "Unknown";
var oldName = "Unknown";
var currentName = "Unknown";
if (Block.Blocks.ContainsKey(oldBlock)) currentName = Block.Blocks[oldBlock].Name;
if (Block.Blocks.ContainsKey(hD.Type)) oldName = Block.Blocks[hD.Type].Name;
if (hD.UID != int.MaxValue) playername = PDB.Find(hD.UID).Username;
SendMessage("CurrentType: " + currentName);
SendMessage("OldType: " + oldName);
SendMessage("Editor: " + playername);
return;
}
if(PermissionLevel < Level.BuildPermissions)
{
SendBlockChange(x, y, z, oldBlock);
return;
}
if (EnableWaterMode)
{
Level.PlayerBlockChange(this, x, y, z, (byte) MCBlocks.Water);
return;
}
if (EnableLavaMode)
{
Level.PlayerBlockChange(this, x, y, z, (byte) MCBlocks.Lava);
return;
}
if (isPlacing)
{
Level.PlayerBlockChange(this, x, y, z, incomingType);
Block.Blocks[incomingType].OnPlace(this, Level, blockPos);
}
else
{
Level.PlayerBlockChange(this, x, y, z, (byte) MCBlocks.Air);
Block.Blocks[oldBlock].OnBreak(this, Level, blockPos);
}
}