Пример #1
0
    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);
        }
    }
Пример #2
0
    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);
    }
Пример #3
0
    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();
        }
    }