public static void SetBlocksAdvanced(List <BlockInstance> blocks, bool undo) { List <BlockInstance> prevBlocks = new List <BlockInstance>(); for (int i = 0; i < blocks.Count; i++) { BlockInstance blockInst = blocks[i]; int x = blockInst.x; int y = blockInst.y; int z = blockInst.z; if (!InBounds(x, y, z)) { continue; } if (!blockInst.block.CanPlace(Vector3i.zero, x, y, z)) { continue; } BlockInstance prevInst = new BlockInstance(GetBlock(x, y, z), x, y, z); if (blockInst.block.ID == BlockID.Air) { if (!prevInst.block.CanDelete()) { continue; } else { prevInst.block.OnDelete(x, y, z); } } else { blockInst.block.OnPlace(Vector3i.zero, x, y, z); } if (undo) { prevBlocks.Add(new BlockInstance(GetBlock(x, y, z), x, y, z)); } SetBlock(x, y, z, blocks[i].block); MapLight.RecomputeLighting(x, y, z); FlagChunkForUpdate(x, y, z); } UpdateMeshes(); if (undo) { UndoManager.RegisterAction(prevBlocks, blocks); } }
private void QueueBlocksForUnflowing() { for (int i = 0; i < blocksToUnflow.Count; i++) { BlockInstance b = blocksToUnflow[i]; MapLight.RecomputeLighting(b.x, b.y, b.z); Map.FlagChunkForUpdate(b.x, b.y, b.z); unflowQueue.Enqueue(blocksToUnflow[i]); } Map.UpdateMeshes(); blocksToUnflow = new List <BlockInstance>(128); }
public static void SetBlockAdvanced(int x, int y, int z, Block block, Vector3i normal, bool undo) { if (InBounds(x, y, z)) { if (!block.CanPlace(normal, x, y, z)) { return; } BlockInstance prevInst = new BlockInstance(GetBlock(x, y, z), x, y, z); BlockInstance newBlock = new BlockInstance(block, x, y, z); if (block.ID == BlockID.Air) { if (!prevInst.block.CanDelete()) { return; } prevInst.block.OnDelete(x, y, z); } else { block.OnPlace(normal, x, y, z); } if (undo) { UndoManager.RegisterAction(prevInst, newBlock); } SetBlock(x, y, z, block); MapLight.RecomputeLighting(x, y, z); FlagChunkForUpdate(x, y, z); UpdateMeshes(); } }