From df5d6a14276eee9293daa95c531e5dc51044bae4 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Mon, 28 Mar 2016 22:54:19 +1100 Subject: [PATCH] Stage 2: Optimise /draw to do skip processing coordinates outside the map. --- Commands/building/CmdDraw.cs | 50 +++++++++++++--------------- Drawing/DrawOps/AdvConeDrawOps.cs | 46 ++++++++++++++----------- Drawing/DrawOps/AdvDrawOps.cs | 30 ++++++++++------- Drawing/DrawOps/AdvPyramidDrawOps.cs | 32 ++++++++++-------- Drawing/DrawOps/CuboidDrawOp.cs | 8 ++--- Drawing/DrawOps/DrawOp.cs | 8 ++--- Drawing/DrawOps/FillDrawOp.cs | 2 +- Drawing/DrawOps/LineDrawOp.cs | 2 +- Drawing/DrawOps/MazeDrawOp.cs | 2 +- Drawing/DrawOps/PasteDrawOp.cs | 4 +-- Drawing/DrawOps/PyramidDrawOp.cs | 6 ++-- Drawing/DrawOps/ReplaceDrawOp.cs | 4 +-- Drawing/DrawOps/SpheroidDrawOp.cs | 6 ++-- Drawing/DrawOps/TorusDrawOp.cs | 2 +- Drawing/DrawOps/TreeDrawOp.cs | 2 +- Drawing/DrawOps/TriangleDrawOp.cs | 2 +- Drawing/DrawOps/UndoDrawOp.cs | 6 ++-- Drawing/DrawOps/WriteDrawOp.cs | 2 +- 18 files changed, 115 insertions(+), 99 deletions(-) diff --git a/Commands/building/CmdDraw.cs b/Commands/building/CmdDraw.cs index 950f455b2..788455256 100644 --- a/Commands/building/CmdDraw.cs +++ b/Commands/building/CmdDraw.cs @@ -46,43 +46,42 @@ namespace MCGalaxy.Commands string[] parts = message.Split(' '); Player.BlockchangeEventHandler newHandler = null; - bool help; switch (parts[0].ToLower()) { case "cone": - if (!CheckTwoArgs(p, 1, parts, out help)) { if (help) Help(p); return; } + if (!CheckTwoArgs(p, 1, parts)) return; newHandler = new Player.BlockchangeEventHandler(BlockchangeCone); break; case "hcone": - if (!CheckTwoArgs(p, 1, parts, out help)) { if (help) Help(p); return; } + if (!CheckTwoArgs(p, 1, parts)) return; newHandler = new Player.BlockchangeEventHandler(BlockchangeHCone); break; case "icone": - if (!CheckTwoArgs(p, 1, parts, out help)) { if (help) Help(p); return; } + if (!CheckTwoArgs(p, 1, parts)) return; newHandler = new Player.BlockchangeEventHandler(BlockchangeICone); break; case "hicone": - if (!CheckTwoArgs(p, 1, parts, out help)) { if (help) Help(p); return; } + if (!CheckTwoArgs(p, 1, parts)) return; newHandler = new Player.BlockchangeEventHandler(BlockchangeHICone); break; case "pyramid": - if (!CheckTwoArgs(p, 2, parts, out help)) { if (help) Help(p); return; } + if (!CheckTwoArgs(p, 2, parts)) return; newHandler = new Player.BlockchangeEventHandler(BlockchangePyramid); break; case "hpyramid": - if (!CheckTwoArgs(p, 2, parts, out help)) { if (help) Help(p); return; } + if (!CheckTwoArgs(p, 2, parts)) return; newHandler = new Player.BlockchangeEventHandler(BlockchangeHPyramid); break; case "ipyramid": - if (!CheckTwoArgs(p, 2, parts, out help)) { if (help) Help(p); return; } + if (!CheckTwoArgs(p, 2, parts)) return; newHandler = new Player.BlockchangeEventHandler(BlockchangeIPyramid); break; case "hipyramid": - if (!CheckTwoArgs(p, 2, parts, out help)) { if (help) Help(p); return; } + if (!CheckTwoArgs(p, 2, parts)) return; newHandler = new Player.BlockchangeEventHandler(BlockchangeHIPyramid); break; case "sphere": - if (!CheckOneArg(p, 3, parts, out help)) { if (help) Help(p); return; } + if (!CheckOneArg(p, 3, parts)) return; newHandler = new Player.BlockchangeEventHandler(BlockchangeSphere); break; case "hsphere": - if (!CheckOneArg(p, 3, parts, out help)) { if (help) Help(p); return; } + if (!CheckOneArg(p, 3, parts)) return; newHandler = new Player.BlockchangeEventHandler(BlockchangeHSphere); break; case "volcano": - if (!CheckTwoArgs(p, 4, parts, out help)) { if (help) Help(p); return; } + if (!CheckTwoArgs(p, 4, parts)) return; newHandler = new Player.BlockchangeEventHandler(BlockchangeVolcano); break; } Player.SendMessage(p, "Place a block"); @@ -90,36 +89,35 @@ namespace MCGalaxy.Commands p.Blockchange += newHandler; } - bool CheckTwoArgs(Player p, int addition, string[] parts, out bool help) { + bool CheckTwoArgs(Player p, int addition, string[] parts) { if ((int)p.group.Permission < CommandOtherPerms.GetPerm(this, addition)) { Group group = Group.findPermInt(CommandOtherPerms.GetPerm(this, addition)); Player.SendMessage(p, "That commands addition is for " + group.name + "+"); - help = false; return false; + return false; } - help = true; - if (parts.Length != 3) - return false; + if (parts.Length != 3) { Help(p); return false; } ushort height, radius; - if (!ushort.TryParse(parts[1], out height) || !ushort.TryParse(parts[2], out radius)) - return false; + if (!ushort.TryParse(parts[1], out height) || height > 2000 || + !ushort.TryParse(parts[2], out radius) || radius > 2000) { + Player.SendMessage(p, "Radius and height must be positive integers less than 2000."); return false; + } p.BcVar = new int[] { height, radius }; return true; } - bool CheckOneArg(Player p, int addition, string[] parts, out bool help) { + bool CheckOneArg(Player p, int addition, string[] parts) { if ((int)p.group.Permission < CommandOtherPerms.GetPerm(this, addition)) { Group group = Group.findPermInt(CommandOtherPerms.GetPerm(this, addition)); Player.SendMessage(p, "That commands addition is for " + group.name + "+"); - help = false; return false; + return false; } - help = true; - if (parts.Length != 2) - return false; + if (parts.Length != 2) { Help(p); return false; } ushort radius; - if (!ushort.TryParse(parts[1], out radius)) - return false; + if (!ushort.TryParse(parts[1], out radius) || radius > 2000) { + Player.SendMessage(p, "Radius must be a positive integer less than 2000."); return false; + } p.BcVar = new int[] { 0, radius }; return true; } diff --git a/Drawing/DrawOps/AdvConeDrawOps.cs b/Drawing/DrawOps/AdvConeDrawOps.cs index 1222dca5b..3a2c1e9f9 100644 --- a/Drawing/DrawOps/AdvConeDrawOps.cs +++ b/Drawing/DrawOps/AdvConeDrawOps.cs @@ -29,16 +29,18 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Adv Cone"; } } - public override int GetBlocksAffected(Level lvl, Vec3U16[] marks) { - int R = Radius, H = Height; - return (int)(Math.PI / 3 * (R * R * H)); + public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { + long R = Radius, H = Height; + return (long)(Math.PI / 3 * (R * R * H)); } public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { Vec3U16 P = marks[0]; - for (short yy = 0; yy <= Height; yy++) - for (short zz = (short)-Radius; zz <= Radius; zz++) - for (short xx = (short)-Radius; xx <= Radius; xx++) + int minX = Math.Max(P.X - Radius, 0) - P.X, maxX = Math.Min(P.X + Radius, lvl.Width - 1) - P.X; + int minZ = Math.Max(P.Z - Radius, 0) - P.Z, maxZ = Math.Min(P.Z + Radius, lvl.Length - 1) - P.Z; + for (int yy = 0; yy <= Height; yy++) + for (int zz = minZ; zz <= maxZ; zz++) + for (int xx = minX; xx <= maxX; xx++) { int curHeight = Invert ? yy : Height - yy; if (curHeight == 0) continue; @@ -59,18 +61,21 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Adv Hollow Cone"; } } - public override int GetBlocksAffected(Level lvl, Vec3U16[] marks) { - int R = Radius, H = Height; + public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { + long R = Radius, H = Height; double outer = (int)(Math.PI / 3 * (R * R * H)); double inner = (int)(Math.PI / 3 * ((R - 1) * (R - 1) * (H - 1))); - return (int)(outer - inner); + return (long)(outer - inner); } public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { Vec3U16 P = marks[0]; - for (short yy = 0; yy <= Height; yy++) - for (short zz = (short)-Radius; zz <= Radius; zz++) - for (short xx = (short)-Radius; xx <= Radius; xx++) + int minX = Math.Max(P.X - Radius, 0) - P.X, maxX = Math.Min(P.X + Radius, lvl.Width - 1) - P.X; + int minZ = Math.Max(P.Z - Radius, 0) - P.Z, maxZ = Math.Min(P.Z + Radius, lvl.Length - 1) - P.Z; + int maxY = Math.Min(P.Y + Height, lvl.Height - 1) - P.Y; + for (int yy = 0; yy <= maxY; yy++) + for (int zz = minZ; zz <= maxZ; zz++) + for (int xx = minX; xx <= maxX; xx++) { int curHeight = Invert ? yy : Height - yy; if (curHeight == 0) continue; @@ -92,18 +97,19 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Adv Volcano"; } } - public override int GetBlocksAffected(Level lvl, Vec3U16[] marks) { - int R = Radius, H = Height; - double outer = (int)(Math.PI / 3 * (R * R * H)); - double inner = (int)(Math.PI / 3 * ((R - 1) * (R - 1) * (H - 1))); - return (int)(outer - inner); + public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { + long R = Radius, H = Height; + return (long)(Math.PI / 3 * (R * R * H)); } public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { Vec3U16 P = marks[0]; - for (short yy = 0; yy <= Height; yy++) - for (short zz = (short)-Radius; zz <= Radius; zz++) - for (short xx = (short)-Radius; xx <= Radius; xx++) + int minX = Math.Max(P.X - Radius, 0) - P.X, maxX = Math.Min(P.X + Radius, lvl.Width - 1) - P.X; + int minZ = Math.Max(P.Z - Radius, 0) - P.Z, maxZ = Math.Min(P.Z + Radius, lvl.Length - 1) - P.Z; + int maxY = Math.Min(P.Y + Height, lvl.Height - 1) - P.Y; + for (int yy = 0; yy <= maxY; yy++) + for (int zz = minZ; zz <= maxZ; zz++) + for (int xx = minX; xx <= maxX; xx++) { int cx = (P.X + xx), cy = (P.Y + yy), cz = (P.Z + zz); int curHeight = Height - yy; diff --git a/Drawing/DrawOps/AdvDrawOps.cs b/Drawing/DrawOps/AdvDrawOps.cs index 6ad444f7f..cf28cdfb5 100644 --- a/Drawing/DrawOps/AdvDrawOps.cs +++ b/Drawing/DrawOps/AdvDrawOps.cs @@ -34,17 +34,20 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Adv Sphere"; } } - public override int GetBlocksAffected(Level lvl, Vec3U16[] marks) { - int R = Radius; - return (int)(Math.PI * 4.0 / 3.0 * (R * R * R)); + public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { + long R = Radius; + return (long)(Math.PI * 4.0 / 3.0 * (R * R * R)); } public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { Vec3U16 P = marks[0]; int upper = (Radius + 1) * (Radius + 1); - for (short yy = (short)-Radius; yy <= Radius; yy++) - for (short zz = (short)-Radius; zz <= Radius; zz++) - for (short xx = (short)-Radius; xx <= Radius; xx++) + int minX = Math.Max(P.X - Radius, 0) - P.X, maxX = Math.Min(P.X + Radius, lvl.Width - 1) - P.X; + int minY = Math.Max(P.Y - Radius, 0) - P.Y, maxY = Math.Min(P.Y + Radius, lvl.Height - 1) - P.Y; + int minZ = Math.Max(P.Z - Radius, 0) - P.Z, maxZ = Math.Min(P.Z + Radius, lvl.Length - 1) - P.Z; + for (int yy = minY; yy <= maxY; yy++) + for (int zz = minZ; zz <= maxZ; zz++) + for (int xx = minX; xx <= maxX; xx++) { int curDist = xx * xx + yy * yy + zz * zz; if (curDist < upper) @@ -58,19 +61,22 @@ namespace MCGalaxy.Drawing.Ops { public int Radius; public override string Name { get { return "Adv Hollow Sphere"; } } - public override int GetBlocksAffected(Level lvl, Vec3U16[] marks) { - int R = Radius; + public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { + long R = Radius; double outer = (int)(Math.PI * 4.0 / 3.0 * (R * R * R)); double inner = (int)(Math.PI * 4.0 / 3.0 * ((R - 1) * (R - 1) * (R - 1))); - return (int)(outer - inner); + return (long)(outer - inner); } public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { Vec3U16 P = marks[0]; int upper = (Radius + 1) * (Radius + 1), inner = (Radius - 1) * (Radius - 1); - for (short yy = (short)-Radius; yy <= Radius; yy++) - for (short zz = (short)-Radius; zz <= Radius; zz++) - for (short xx = (short)-Radius; xx <= Radius; xx++) + int minX = Math.Max(P.X - Radius, 0) - P.X, maxX = Math.Min(P.X + Radius, lvl.Width - 1) - P.X; + int minY = Math.Max(P.Y - Radius, 0) - P.Y, maxY = Math.Min(P.Y + Radius, lvl.Height - 1) - P.Y; + int minZ = Math.Max(P.Z - Radius, 0) - P.Z, maxZ = Math.Min(P.Z + Radius, lvl.Length - 1) - P.Z; + for (int yy = minY; yy <= maxY; yy++) + for (int zz = minZ; zz <= maxZ; zz++) + for (int xx = minX; xx <= maxX; xx++) { int curDist = xx * xx + yy * yy + zz * zz; if (curDist < upper && curDist >= inner) { diff --git a/Drawing/DrawOps/AdvPyramidDrawOps.cs b/Drawing/DrawOps/AdvPyramidDrawOps.cs index 861490488..c93df98f6 100644 --- a/Drawing/DrawOps/AdvPyramidDrawOps.cs +++ b/Drawing/DrawOps/AdvPyramidDrawOps.cs @@ -29,20 +29,23 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Adv Pyramid"; } } - public override int GetBlocksAffected(Level lvl, Vec3U16[] marks) { - int R = Radius, H = Height; + public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { + long R = Radius, H = Height; return (R * R * H) / 3; } public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { Vec3U16 P = marks[0]; - for (short yy = 0; yy <= Height; yy++) - for (short zz = (short)-Radius; zz <= Radius; zz++) - for (short xx = (short)-Radius; xx <= Radius; xx++) + int minX = Math.Max(P.X - Radius, 0) - P.X, maxX = Math.Min(P.X + Radius, lvl.Width - 1) - P.X; + int minZ = Math.Max(P.Z - Radius, 0) - P.Z, maxZ = Math.Min(P.Z + Radius, lvl.Length - 1) - P.Z; + int maxY = Math.Min(P.Y + Height, lvl.Height - 1) - P.Y; + for (int yy = 0; yy <= maxY; yy++) + for (int zz = minZ; zz <= maxZ; zz++) + for (int xx = minX; xx <= maxX; xx++) { int curHeight = Invert ? yy : Height - yy; if (curHeight == 0) continue; - int cx = P.X + xx, cy = P.Y + + (Height - curHeight), cz = P.Z + zz; + int cx = P.X + xx, cy = P.Y + (Height - curHeight), cz = P.Z + zz; double curRadius = Radius * ((double)curHeight / (double)Height); if (Math.Abs(xx) > curRadius || Math.Abs(zz) > curRadius) @@ -58,18 +61,21 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Adv Hollow Pyramid"; } } - public override int GetBlocksAffected(Level lvl, Vec3U16[] marks) { - int R = Radius, H = Height; - int outer = (R * R * H) / 3; - int inner = ((R - 1) * (R - 1) * (H - 1)) / 3; + public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { + long R = Radius, H = Height; + long outer = (R * R * H) / 3; + long inner = ((R - 1) * (R - 1) * (H - 1)) / 3; return outer - inner; } public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { Vec3U16 P = marks[0]; - for (short yy = 0; yy <= Height; yy++) - for (short zz = (short)-Radius; zz <= Radius; zz++) - for (short xx = (short)-Radius; xx <= Radius; xx++) + int minX = Math.Max(P.X - Radius, 0) - P.X, maxX = Math.Min(P.X + Radius, lvl.Width - 1) - P.X; + int minZ = Math.Max(P.Z - Radius, 0) - P.Z, maxZ = Math.Min(P.Z + Radius, lvl.Length - 1) - P.Z; + int maxY = Math.Min(P.Y + Height, lvl.Height - 1) - P.Y; + for (int yy = 0; yy <= maxY; yy++) + for (int zz = minZ; zz <= maxZ; zz++) + for (int xx = minX; xx <= maxX; xx++) { int curHeight = Invert ? yy : Height - yy; if (curHeight == 0) continue; diff --git a/Drawing/DrawOps/CuboidDrawOp.cs b/Drawing/DrawOps/CuboidDrawOp.cs index ee52fd4ca..c4ada86bb 100644 --- a/Drawing/DrawOps/CuboidDrawOp.cs +++ b/Drawing/DrawOps/CuboidDrawOp.cs @@ -24,7 +24,7 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Cuboid"; } } - public override int GetBlocksAffected(Level lvl, Vec3U16[] marks) { + public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { Vec3U16 p1 = marks[0], p2 = marks[1]; return (p2.X - p1.X + 1) * (p2.Y - p1.Y + 1) * (p2.Z - p1.Z + 1); } @@ -44,7 +44,7 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Cuboid Hollow"; } } - public override int GetBlocksAffected(Level lvl, Vec3U16[] marks) { + public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { Vec3U16 p1 = marks[0], p2 = marks[1]; int lenX = (p2.X - p1.X + 1), lenY = (p2.Y - p1.Y + 1), lenZ = (p2.Z - p1.Z + 1); int xQuadsVol = Math.Min(lenX, 2) * (lenY * lenZ); @@ -102,7 +102,7 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Cuboid Walls"; } } - public override int GetBlocksAffected(Level lvl, Vec3U16[] marks) { + public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { Vec3U16 p1 = marks[0], p2 = marks[1]; int lenX = (p2.X - p1.X + 1), lenY = (p2.Y - p1.Y + 1), lenZ = (p2.Z - p1.Z + 1); int xQuadsVol = Math.Min(lenX, 2) * (lenY * lenZ); @@ -126,7 +126,7 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Cuboid Wireframe"; } } - public override int GetBlocksAffected(Level lvl, Vec3U16[] marks) { + public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { Vec3U16 p1 = marks[0], p2 = marks[1]; int lenX = (p2.X - p1.X + 1), lenY = (p2.Y - p1.Y + 1), lenZ = (p2.Z - p1.Z + 1); int horSidesvol = 2 * (lenX * 2 + lenZ * 2); // TODO: slightly overestimated by at most four blocks. diff --git a/Drawing/DrawOps/DrawOp.cs b/Drawing/DrawOps/DrawOp.cs index a19301b65..4ee2ec248 100644 --- a/Drawing/DrawOps/DrawOp.cs +++ b/Drawing/DrawOps/DrawOp.cs @@ -66,11 +66,11 @@ namespace MCGalaxy.Drawing.Ops { /// Estimates the total number of blocks that the drawing commands affects.
/// Note that this estimate assumes that all possibly affected blocks will be changed by the drawing command.
- public abstract int GetBlocksAffected(Level lvl, Vec3U16[] marks); + public abstract long GetBlocksAffected(Level lvl, Vec3U16[] marks); public abstract void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush); - public bool CanDraw(Vec3U16[] marks, Player p, out int affected) { + public bool CanDraw(Vec3U16[] marks, Player p, out long affected) { affected = GetBlocksAffected(p.level, marks); if (affected > p.group.maxBlocks) { Player.SendMessage(p, "You tried to draw " + affected + " blocks."); @@ -80,7 +80,7 @@ namespace MCGalaxy.Drawing.Ops { return true; } - public virtual bool DetermineDrawOpMethod(Level lvl, int affected) { + public virtual bool DetermineDrawOpMethod(Level lvl, long affected) { if (affected > Server.DrawReloadLimit) { method = M_PSetTile; return true; @@ -156,7 +156,7 @@ namespace MCGalaxy.Drawing.Ops { } op.Level = p.level; - int affected = 0; + long affected = 0; if (!op.CanDraw(marks, p, out affected)) return false; if (brush != null && affected != -1) { diff --git a/Drawing/DrawOps/FillDrawOp.cs b/Drawing/DrawOps/FillDrawOp.cs index 7a47ae313..0d45c0303 100644 --- a/Drawing/DrawOps/FillDrawOp.cs +++ b/Drawing/DrawOps/FillDrawOp.cs @@ -27,7 +27,7 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Fill"; } } - public override int GetBlocksAffected(Level lvl, Vec3U16[] marks) { + public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { return Positions.Count; } diff --git a/Drawing/DrawOps/LineDrawOp.cs b/Drawing/DrawOps/LineDrawOp.cs index 69a2fe45d..ee260bb00 100644 --- a/Drawing/DrawOps/LineDrawOp.cs +++ b/Drawing/DrawOps/LineDrawOp.cs @@ -30,7 +30,7 @@ namespace MCGalaxy.Drawing.Ops { public override bool MinMaxCoords { get { return false; } } - public override int GetBlocksAffected(Level lvl, Vec3U16[] marks) { + public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { Vec3U16 p1 = marks[0], p2 = marks[1]; double dx = Math.Abs(p2.X - p1.X) + 0.25, dy = Math.Abs(p2.Y - p1.Y) + 0.25, dz = Math.Abs(p2.Z - p1.Z) + 0.25; if (WallsMode) { diff --git a/Drawing/DrawOps/MazeDrawOp.cs b/Drawing/DrawOps/MazeDrawOp.cs index 746d88c78..08762ed88 100644 --- a/Drawing/DrawOps/MazeDrawOp.cs +++ b/Drawing/DrawOps/MazeDrawOp.cs @@ -33,7 +33,7 @@ namespace MCGalaxy.Drawing.Ops { byte[] r = new byte[1]; int width, length; - public override int GetBlocksAffected(Level lvl, Vec3U16[] marks) { + public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { int lenX = (Math.Abs(marks[1].X - marks[0].X) + 1) / 2; int lenZ = (Math.Abs(marks[1].Z - marks[0].Z) + 1) / 2; return lenX * lenZ * 3; diff --git a/Drawing/DrawOps/PasteDrawOp.cs b/Drawing/DrawOps/PasteDrawOp.cs index 687e677db..c60d4c7f2 100644 --- a/Drawing/DrawOps/PasteDrawOp.cs +++ b/Drawing/DrawOps/PasteDrawOp.cs @@ -29,7 +29,7 @@ namespace MCGalaxy.Drawing.Ops { public override bool MinMaxCoords { get { return false; } } - public override int GetBlocksAffected(Level lvl, Vec3U16[] marks) { + public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { return CopyState.Volume; } @@ -65,7 +65,7 @@ namespace MCGalaxy.Drawing.Ops { public override bool MinMaxCoords { get { return false; } } - public override int GetBlocksAffected(Level lvl, Vec3U16[] marks) { + public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { return CopyState.Volume; } diff --git a/Drawing/DrawOps/PyramidDrawOp.cs b/Drawing/DrawOps/PyramidDrawOp.cs index 5f338b950..8dd8ad904 100644 --- a/Drawing/DrawOps/PyramidDrawOp.cs +++ b/Drawing/DrawOps/PyramidDrawOp.cs @@ -29,14 +29,14 @@ namespace MCGalaxy.Drawing.Ops { this.yDir = yDir; } - public override bool DetermineDrawOpMethod(Level lvl, int affected) { + public override bool DetermineDrawOpMethod(Level lvl, long affected) { return baseOp.DetermineDrawOpMethod(lvl, affected); } - public override int GetBlocksAffected(Level lvl, Vec3U16[] marks) { + public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { Vec3U16 origP1 = marks[0], origP2 = marks[1]; Vec3U16 p1 = marks[0], p2 = marks[1]; - int total = 0; + long total = 0; while (true) { total += baseOp.GetBlocksAffected(lvl, marks); if (p1.Y >= lvl.Height || Math.Abs(p2.X - p1.X) <= 1 || Math.Abs(p2.Z - p1.Z) <= 1) diff --git a/Drawing/DrawOps/ReplaceDrawOp.cs b/Drawing/DrawOps/ReplaceDrawOp.cs index eb709b74d..2c542ad43 100644 --- a/Drawing/DrawOps/ReplaceDrawOp.cs +++ b/Drawing/DrawOps/ReplaceDrawOp.cs @@ -30,7 +30,7 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Replace"; } } - public override int GetBlocksAffected(Level lvl, Vec3U16[] marks) { + public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { Vec3U16 p1 = marks[0], p2 = marks[1]; return (p2.X - p1.X + 1) * (p2.Y - p1.Y + 1) * (p2.Z - p1.Z + 1); } @@ -60,7 +60,7 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "ReplaceNot"; } } - public override int GetBlocksAffected(Level lvl, Vec3U16[] marks) { + public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { Vec3U16 p1 = marks[0], p2 = marks[1]; return (p2.X - p1.X + 1) * (p2.Y - p1.Y + 1) * (p2.Z - p1.Z + 1); } diff --git a/Drawing/DrawOps/SpheroidDrawOp.cs b/Drawing/DrawOps/SpheroidDrawOp.cs index 8dbd46276..2290bf7e1 100644 --- a/Drawing/DrawOps/SpheroidDrawOp.cs +++ b/Drawing/DrawOps/SpheroidDrawOp.cs @@ -24,7 +24,7 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Ellipsoid"; } } - public override int GetBlocksAffected(Level lvl, Vec3U16[] marks) { + public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { Vec3U16 p1 = marks[0], p2 = marks[1]; double rx = (p2.X - p1.X) / 2.0 + 0.25, ry = (p2.Y - p1.Y) / 2.0 + 0.25, rz = (p2.Z - p1.Z) / 2.0 + 0.25; return (int)(Math.PI * 4.0/3.0 * rx * ry * rz); @@ -52,7 +52,7 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Ellipsoid Hollow"; } } - public override int GetBlocksAffected(Level lvl, Vec3U16[] marks) { + public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { Vec3U16 p1 = marks[0], p2 = marks[1]; double rx = (p2.X - p1.X) / 2.0 + 0.25, ry = (p2.Y - p1.Y) / 2.0 + 0.25, rz = (p2.Z - p1.Z) / 2.0 + 0.25; return (int)(Math.PI * 4.0/3.0 * rx * ry * rz); @@ -86,7 +86,7 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Cylinder"; } } - public override int GetBlocksAffected(Level lvl, Vec3U16[] marks) { + public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { Vec3U16 p1 = marks[0], p2 = marks[1]; double rx = (p2.X - p1.X) / 2.0 + 0.25, rz = (p2.Z - p1.Z) / 2.0 + 0.25; int height = (p2.Y - p1.Y + 1); diff --git a/Drawing/DrawOps/TorusDrawOp.cs b/Drawing/DrawOps/TorusDrawOp.cs index 9fad8e9fa..012e45c3e 100644 --- a/Drawing/DrawOps/TorusDrawOp.cs +++ b/Drawing/DrawOps/TorusDrawOp.cs @@ -24,7 +24,7 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Torus"; } } - public override int GetBlocksAffected(Level lvl, Vec3U16[] marks) { + public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { Vec3U16 p1 = marks[0], p2 = marks[1]; double rx = (p2.X - p1.X) / 2.0 + 0.25, ry = (p2.Y - p1.Y) / 2.0 + 0.25, rz = (p2.Z - p1.Z) / 2.0 + 0.25; double rTube = ry, rCentre = Math.Min(rx, rz) - rTube; diff --git a/Drawing/DrawOps/TreeDrawOp.cs b/Drawing/DrawOps/TreeDrawOp.cs index 58af3fc3e..187000805 100644 --- a/Drawing/DrawOps/TreeDrawOp.cs +++ b/Drawing/DrawOps/TreeDrawOp.cs @@ -39,7 +39,7 @@ namespace MCGalaxy.Drawing.Ops { public const int T_Tree = 0, T_NotchTree = 1, T_NotchSwamp = 2, T_Cactus = 3; static Brush defBrush = new SolidBrush(Block.leaf, 0); - public override int GetBlocksAffected(Level lvl, Vec3U16[] marks) { return -1; } + public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { return -1; } public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { if (brush == null) brush = defBrush; diff --git a/Drawing/DrawOps/TriangleDrawOp.cs b/Drawing/DrawOps/TriangleDrawOp.cs index 026cac806..507b030bf 100644 --- a/Drawing/DrawOps/TriangleDrawOp.cs +++ b/Drawing/DrawOps/TriangleDrawOp.cs @@ -24,7 +24,7 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Triangle"; } } - public override int GetBlocksAffected(Level lvl, Vec3U16[] marks) { + public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { // Applying Heron's Formula double a = (marks[0] - marks[2]).Length; double b = (marks[1] - marks[2]).Length; diff --git a/Drawing/DrawOps/UndoDrawOp.cs b/Drawing/DrawOps/UndoDrawOp.cs index 3b1b1e02b..483e52d53 100644 --- a/Drawing/DrawOps/UndoDrawOp.cs +++ b/Drawing/DrawOps/UndoDrawOp.cs @@ -35,7 +35,7 @@ namespace MCGalaxy.Drawing.Ops { internal Player who; internal Level saveLevel = null; - public override int GetBlocksAffected(Level lvl, Vec3U16[] marks) { return -1; } + public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { return -1; } public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { PerformUndo(p, ref saveLevel); @@ -98,7 +98,7 @@ namespace MCGalaxy.Drawing.Ops { internal string whoName; internal bool foundUser = false; - public override int GetBlocksAffected(Level lvl, Vec3U16[] marks) { return -1; } + public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { return -1; } public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { UndoFile.UndoPlayer(p, whoName.ToLower(), marks, Start, ref foundUser); @@ -111,7 +111,7 @@ namespace MCGalaxy.Drawing.Ops { internal long seconds; - public override int GetBlocksAffected(Level lvl, Vec3U16[] marks) { return -1; } + public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { return -1; } public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { if (lvl.UndoBuffer.Count != Server.physUndo) { diff --git a/Drawing/DrawOps/WriteDrawOp.cs b/Drawing/DrawOps/WriteDrawOp.cs index c2aeb0b50..82ec81562 100644 --- a/Drawing/DrawOps/WriteDrawOp.cs +++ b/Drawing/DrawOps/WriteDrawOp.cs @@ -30,7 +30,7 @@ namespace MCGalaxy.Drawing.Ops { public override bool MinMaxCoords { get { return false; } } - public override int GetBlocksAffected(Level lvl, Vec3U16[] marks) { + public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { int blocks = 0; foreach (char c in Text) { if ((int)c >= 256 || letters[(int)c] == null) {