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)); } }
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); }
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); }
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); }
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); }
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"); } }