Пример #1
0
        static void HighlightPlayer(Player p, TimeSpan delta, string who, int[] ids, Vec3S32[] marks)
        {
            HighlightDrawOp op = new HighlightDrawOp();

            op.Start = DateTime.UtcNow.Subtract(delta);
            op.who   = who; op.ids = ids;
            DrawOpPerformer.Setup(op, p, marks);

            BufferedBlockSender buffer = new BufferedBlockSender(p);

            op.Perform(marks, null,
                       P => {
                int index = p.level.PosToInt(P.X, P.Y, P.Z);
                buffer.Add(index, P.Block);
            });
            buffer.Send(true);

            if (op.found)
            {
                p.Message("Now highlighting past &b{0} %Sfor {1}",
                          delta.Shorten(true), PlayerInfo.GetColoredName(p, who));
                p.Message("%WUse /reload to un-highlight");
            }
            else
            {
                p.Message("No changes found by {1} %Sin the past &b{0}",
                          delta.Shorten(true), PlayerInfo.GetColoredName(p, who));
            }
        }
Пример #2
0
        bool DoFixGrass(Player p, Vec3S32[] marks, object state, BlockID block)
        {
            FixGrassDrawOp op = (FixGrassDrawOp)state;

            op.AlwaysUsable = true;

            DrawOpPerformer.Do(op, null, p, marks, false);
            return(false);
        }
Пример #3
0
        bool DoPaste(Player p, Vec3S32[] m, object state, ExtBlock block)
        {
            CopyState cState = p.CopySlots[p.CurrentCopySlot];

            m[0] += cState.Offset;

            PasteDrawOp op = new PasteDrawOp();

            op.CopyState = cState;
            DrawOpPerformer.Do(op, (Brush)state, p, m);
            return(true);
        }
Пример #4
0
        bool DoTree(Player p, Vec3S32[] marks, object state, ExtBlock block)
        {
            DrawArgs   dArgs = (DrawArgs)state;
            TreeDrawOp op    = new TreeDrawOp();

            op.Tree = dArgs.tree;
            op.Size = dArgs.size;

            Brush brush = null;

            if (dArgs.brushMsg.Length > 0)
            {
                brush = ParseBrush(dArgs.brushMsg, p, block);
            }
            DrawOpPerformer.Do(op, brush, p, marks);
            return(true);
        }
Пример #5
0
        bool DoWrite(Player p, Vec3S32[] marks, object state, ExtBlock block)
        {
            WriteArgs wArgs = (WriteArgs)state;

            if (marks[0].X == marks[1].X && marks[0].Z == marks[1].Z)
            {
                Player.Message(p, "No direction was selected"); return(false);
            }

            WriteDrawOp op = new WriteDrawOp();

            op.Text  = wArgs.message;
            op.Scale = wArgs.scale; op.Spacing = wArgs.spacing;

            Brush brush = new SolidBrush(block);

            DrawOpPerformer.Do(op, brush, p, marks);
            return(true);
        }
Пример #6
0
        void DoCopyMark(Player p, Vec3S32[] m, int i, object state, BlockID block)
        {
            if (i == 2)
            {
                CopyState copy = p.CurrentCopy;
                copy.Offset.X = copy.OriginX - m[i].X;
                copy.Offset.Y = copy.OriginY - m[i].Y;
                copy.Offset.Z = copy.OriginZ - m[i].Z;
                p.Message("Set offset of where to paste from.");
                return;
            }
            if (i != 1)
            {
                return;
            }

            CopyArgs cArgs = (CopyArgs)state;
            Vec3S32  min = Vec3S32.Min(m[0], m[1]), max = Vec3S32.Max(m[0], m[1]);
            ushort   minX = (ushort)min.X, minY = (ushort)min.Y, minZ = (ushort)min.Z;
            ushort   maxX = (ushort)max.X, maxY = (ushort)max.Y, maxZ = (ushort)max.Z;

            CopyState cState = new CopyState(minX, minY, minZ, maxX - minX + 1,
                                             maxY - minY + 1, maxZ - minZ + 1);

            cState.OriginX = m[0].X; cState.OriginY = m[0].Y; cState.OriginZ = m[0].Z;

            int index = 0; cState.UsedBlocks = 0;

            cState.PasteAir = cArgs.air;

            for (ushort y = minY; y <= maxY; ++y)
            {
                for (ushort z = minZ; z <= maxZ; ++z)
                {
                    for (ushort x = minX; x <= maxX; ++x)
                    {
                        block = p.level.GetBlock(x, y, z);
                        if (!p.group.Blocks[block])
                        {
                            index++; continue;
                        }

                        if (block != Block.Air || cState.PasteAir)
                        {
                            cState.UsedBlocks++;
                        }
                        cState.Set(block, index);
                        index++;
                    }
                }
            }

            if (cState.UsedBlocks > p.group.DrawLimit)
            {
                p.Message("You tried to copy {0} blocks. You cannot copy more than {1} blocks.",
                          cState.UsedBlocks, p.group.DrawLimit);
                cState.Clear(); cState = null;
                p.ClearSelection();
                return;
            }

            cState.CopySource = "level " + p.level.name;
            p.CurrentCopy     = cState;

            if (cArgs.cut)
            {
                DrawOp op = new CuboidDrawOp();
                op.Flags = BlockDBFlags.Cut;
                Brush brush = new SolidBrush(Block.Air);
                DrawOpPerformer.Do(op, brush, p, new Vec3S32[] { min, max }, false);
            }

            p.Message("Copied &a{0} %Sblocks, origin at ({1}, {2}, {3}) corner", cState.UsedBlocks,
                      cState.OriginX == cState.X ? "Min" : "Max",
                      cState.OriginY == cState.Y ? "Min" : "Max",
                      cState.OriginZ == cState.Z ? "Min" : "Max");
            if (!cState.PasteAir)
            {
                p.Message("To also copy air blocks, use %T/Copy Air");
            }
            if (cArgs.offsetIndex != -1)
            {
                p.Message("Place a block to determine where to paste from");
            }
        }