internal bool DoPhysicsBlockchange(int b, ExtBlock block, bool overRide = false, PhysicsArgs data = default(PhysicsArgs), bool addUndo = true) { if (blocks == null || b < 0 || b >= blocks.Length) { return(false); } ExtBlock old; old.BlockID = blocks[b]; old.ExtID = old.BlockID == Block.custom_block ? GetExtTile(b) : Block.Air; try { if (!overRide) { if (Props[old.Index].OPBlock || (Props[block.Index].OPBlock && data.Raw != 0)) { return(false); } } if (old.BlockID == Block.Sponge && physics > 0 && block.BlockID != Block.Sponge) { OtherPhysics.DoSpongeRemoved(this, b, false); } if (old.BlockID == Block.LavaSponge && physics > 0 && block.BlockID != Block.LavaSponge) { OtherPhysics.DoSpongeRemoved(this, b, true); } if (addUndo) { UndoPos uP = default(UndoPos); uP.index = b; uP.SetData(old, block); if (UndoBuffer.Count < ServerConfig.PhysicsUndo) { UndoBuffer.Add(uP); } else { if (currentUndo >= ServerConfig.PhysicsUndo) { currentUndo = 0; } UndoBuffer[currentUndo] = uP; } currentUndo++; } blocks[b] = block.BlockID; Changed = true; if (block.BlockID == Block.custom_block) { ushort x, y, z; IntToPos(b, out x, out y, out z); SetExtTileNoCheck(x, y, z, block.ExtID); } else if (old.BlockID == Block.custom_block) { ushort x, y, z; IntToPos(b, out x, out y, out z); RevertExtTileNoCheck(x, y, z); } if (physics > 0 && (ActivatesPhysics(block) || data.Raw != 0)) { AddCheck(b, false, data); } // Save bandwidth sending identical looking blocks, like air/op_air changes. return(!old.VisuallyEquals(block)); } catch { blocks[b] = block.BlockID; return(false); } }
public bool DoPhysicsBlockchange(int b, BlockID block, bool overRide = false, PhysicsArgs data = default(PhysicsArgs), bool addUndo = true) { if (blocks == null || b < 0 || b >= blocks.Length) { return(false); } BlockID old = blocks[b]; #if TEN_BIT_BLOCKS BlockID extended = Block.ExtendedBase[old]; if (extended > 0) { old = (BlockID)(extended | GetExtTile(b)); } #else if (old == Block.custom_block) { old = (BlockID)(Block.Extended | GetExtTile(b)); } #endif try { if (!overRide) { if (Props[old].OPBlock || (Props[block].OPBlock && data.Raw != 0)) { return(false); } } if (old == Block.Sponge && physics > 0 && block != Block.Sponge) { OtherPhysics.DoSpongeRemoved(this, b, false); } if (old == Block.LavaSponge && physics > 0 && block != Block.LavaSponge) { OtherPhysics.DoSpongeRemoved(this, b, true); } if (addUndo) { UndoPos uP = default(UndoPos); uP.Index = b; uP.SetData(old, block); if (UndoBuffer.Count < Server.Config.PhysicsUndo) { UndoBuffer.Add(uP); } else { if (currentUndo >= Server.Config.PhysicsUndo) { currentUndo = 0; } UndoBuffer[currentUndo] = uP; } currentUndo++; } Changed = true; if (block >= Block.Extended) { #if TEN_BIT_BLOCKS blocks[b] = Block.ExtendedClass[block >> Block.ExtendedShift]; #else blocks[b] = Block.custom_block; #endif ushort x, y, z; IntToPos(b, out x, out y, out z); FastSetExtTile(x, y, z, (BlockRaw)block); } else { blocks[b] = (BlockRaw)block; if (old >= Block.Extended) { ushort x, y, z; IntToPos(b, out x, out y, out z); FastRevertExtTile(x, y, z); } } if (physics > 0 && (ActivatesPhysics(block) || data.Raw != 0)) { AddCheck(b, false, data); } // Save bandwidth not sending identical looking blocks, like air/op_air changes. return(!Block.VisuallyEquals(old, block)); } catch { return(false); } }
internal bool DoPhysicsBlockchange(int b, byte block, bool overRide = false, PhysicsArgs data = default(PhysicsArgs), byte extBlock = 0, bool addUndo = true) { if (b < 0 || b >= blocks.Length || blocks == null) { return(false); } byte old = blocks[b]; byte oldExt = old == Block.custom_block ? GetExtTile(b) : (byte)0; try { if (!overRide) { if (Block.Props[old].OPBlock || (Block.Props[block].OPBlock && data.Raw != 0)) { return(false); } } if (b == Block.sponge && physics > 0 && block != Block.sponge) { OtherPhysics.DoSpongeRemoved(this, b); } if (b == Block.lava_sponge && physics > 0 && block != Block.lava_sponge) { OtherPhysics.DoSpongeRemoved(this, b, true); } if (addUndo) { UndoPos uP = default(UndoPos); uP.index = b; uP.SetData(old, oldExt, block, extBlock); if (UndoBuffer.Count < Server.physUndo) { UndoBuffer.Add(uP); } else { if (currentUndo >= Server.physUndo) { currentUndo = 0; } UndoBuffer[currentUndo] = uP; } currentUndo++; } blocks[b] = block; changed = true; if (block == Block.custom_block) { ushort x, y, z; IntToPos(b, out x, out y, out z); SetExtTileNoCheck(x, y, z, extBlock); } else if (old == Block.custom_block) { ushort x, y, z; IntToPos(b, out x, out y, out z); RevertExtTileNoCheck(x, y, z); } if (physics > 0 && (ActivatesPhysics(block, extBlock) || data.Raw != 0)) { AddCheck(b, false, data); } // Save bandwidth sending identical looking blocks, like air/op_air changes. bool diffBlock = Block.Convert(old) != Block.Convert(block); if (!diffBlock && old == Block.custom_block) { diffBlock = oldExt != extBlock; } return(diffBlock); } catch { blocks[b] = block; return(false); } }