Пример #1
0
        protected override void Process()
        {
            if (!BCUtils.CheckWorld(out var world))
            {
                return;
            }

            if (Options.ContainsKey("undo"))
            {
                SendOutput("Please use the bc-undo command to undo changes");

                return;
            }

            var    pos1 = new Vector3i(int.MinValue, 0, int.MinValue);
            var    pos2 = new Vector3i(int.MinValue, 0, int.MinValue);
            string blockname;
            string blockname2 = null;

            //get loc and player current pos
            EntityPlayer sender  = null;
            string       steamId = null;

            if (SenderInfo.RemoteClientInfo != null)
            {
                steamId = SenderInfo.RemoteClientInfo.ownerId;
                sender  = world.Entities.dict[SenderInfo.RemoteClientInfo.entityId] as EntityPlayer;
                if (sender != null)
                {
                    pos2 = new Vector3i((int)Math.Floor(sender.serverPos.x / 32f), (int)Math.Floor(sender.serverPos.y / 32f), (int)Math.Floor(sender.serverPos.z / 32f));
                }
                else
                {
                    SendOutput("Error: unable to get player location");

                    return;
                }
            }

            switch (Params.Count)
            {
            case 2:
            case 3:
                if (steamId != null)
                {
                    pos1 = BCLocation.GetPos(steamId);
                    if (pos1.x == int.MinValue)
                    {
                        SendOutput("No location stored. Use bc-loc to store a location.");

                        return;
                    }

                    blockname = Params[1];
                    if (Params.Count == 3)
                    {
                        blockname2 = Params[2];
                    }
                }
                else
                {
                    SendOutput("Error: unable to get player location");

                    return;
                }
                break;

            case 8:
            case 9:
                //parse params
                if (!int.TryParse(Params[1], out pos1.x) || !int.TryParse(Params[2], out pos1.y) || !int.TryParse(Params[3], out pos1.z) || !int.TryParse(Params[4], out pos2.x) || !int.TryParse(Params[5], out pos2.y) || !int.TryParse(Params[6], out pos2.z))
                {
                    SendOutput("Error: unable to parse coordinates");

                    return;
                }
                blockname = Params[7];
                if (Params.Count == 9)
                {
                    blockname2 = Params[8];
                }
                break;

            default:
                SendOutput("Error: Incorrect command format.");
                SendOutput(GetHelp());

                return;
            }

            var size = BCUtils.GetSize(pos1, pos2);

            var position = new Vector3i(
                pos1.x < pos2.x ? pos1.x : pos2.x,
                pos1.y < pos2.y ? pos1.y : pos2.y,
                pos1.z < pos2.z ? pos1.z : pos2.z
                );

            //**************** GET BLOCKVALUE
            var bvNew = int.TryParse(blockname, out var blockId) ? Block.GetBlockValue(blockId) : Block.GetBlockValue(blockname);

            var modifiedChunks = BCUtils.GetAffectedChunks(new BCMCmdArea("Blocks")
            {
                Position = new BCMVector3(position),
                Size     = new BCMVector3(size),
                HasPos   = true,
                HasSize  = true,

                ChunkBounds = new BCMVector4
                {
                    x = World.toChunkXZ(position.x),
                    y = World.toChunkXZ(position.z),
                    z = World.toChunkXZ(position.x + size.x - 1),
                    w = World.toChunkXZ(position.z + size.z - 1)
                },
                HasChunkPos = true
            }, world);

            //CREATE UNDO
            //create backup of area blocks will insert to
            if (!Options.ContainsKey("noundo"))
            {
                BCUtils.CreateUndo(sender, position, size);
            }

            switch (Params[0])
            {
            case "scan":
                ScanBlocks(position, size, bvNew, blockname);
                break;

            case "fill":
                FillBlocks(position, size, bvNew, blockname, modifiedChunks);
                break;

            case "swap":
                SwapBlocks(position, size, bvNew, blockname2, modifiedChunks);
                break;

            case "repair":
                RepairBlocks(position, size, modifiedChunks);
                break;

            case "damage":
                DamageBlocks(position, size, modifiedChunks);
                break;

            case "upgrade":
                UpgradeBlocks(position, size, modifiedChunks);
                break;

            case "downgrade":
                DowngradeBlocks(position, size, modifiedChunks);
                break;

            case "paint":
                SetPaint(position, size, modifiedChunks);
                break;

            case "paintface":
                SetPaintFace(position, size, modifiedChunks);
                break;

            case "paintstrip":
                RemovePaint(position, size, modifiedChunks);
                break;

            case "density":
                SetDensity(position, size, modifiedChunks);
                break;

            case "rotate":
                SetRotation(position, size, modifiedChunks);
                break;

            case "meta1":
                SetMeta(1, position, size, modifiedChunks);
                break;

            case "meta2":
                SetMeta(2, position, size, modifiedChunks);
                break;

            case "meta3":
                SetMeta(3, position, size, modifiedChunks);
                break;

            default:
                SendOutput(GetHelp());
                break;
            }
        }