mirror of
https://github.com/ClassiCube/MCGalaxy.git
synced 2025-09-23 12:42:22 -04:00
[Likely broken] - change all draw op coordinates to use signed 32 bit integers instead of 16 bit unsigned integers, likely breaks things.
This commit is contained in:
parent
958a16dc25
commit
e280b82e59
@ -80,7 +80,7 @@ namespace MCGalaxy.Commands {
|
||||
int brushOffset = op.UsesHeight ? 3 : 2;
|
||||
Brush brush = GetBrush(p, cpos, brushOffset);
|
||||
if (brush == null) return;
|
||||
if (!DrawOp.DoDrawOp(op, brush, p, new [] { new Vec3U16(x, y, z) }))
|
||||
if (!DrawOp.DoDrawOp(op, brush, p, new [] { new Vec3S32(x, y, z) }))
|
||||
return;
|
||||
if (p.staticCommands)
|
||||
p.Blockchange += new Player.BlockchangeEventHandler(Blockchange1);
|
||||
|
@ -49,7 +49,7 @@ namespace MCGalaxy.Commands {
|
||||
|
||||
RedoSelfDrawOp op = new RedoSelfDrawOp();
|
||||
op.Start = entry.Start; op.End = entry.End;
|
||||
DrawOp.DoDrawOp(op, null, p, new [] { Vec3U16.MaxVal, Vec3U16.MaxVal });
|
||||
DrawOp.DoDrawOp(op, null, p, new Vec3S32[] { Vec3U16.MaxVal, Vec3U16.MaxVal });
|
||||
Player.Message(p, "Redo performed.");
|
||||
return;
|
||||
}
|
||||
|
@ -74,7 +74,7 @@ namespace MCGalaxy.Commands {
|
||||
if (brush == null) return;
|
||||
}
|
||||
|
||||
Vec3U16[] marks = { new Vec3U16(x, y, z) };
|
||||
Vec3S32[] marks = { new Vec3S32(x, y, z) };
|
||||
if (!DrawOp.DoDrawOp(op, brush, p, marks))
|
||||
return;
|
||||
if (p.staticCommands)
|
||||
|
@ -41,8 +41,8 @@ namespace MCGalaxy.Commands {
|
||||
RevertAndClearState(p, x, y, z);
|
||||
CatchPos cpos = (CatchPos)p.blockchangeObject;
|
||||
GetRealBlock(type, extType, p, ref cpos);
|
||||
Vec3U16[] marks = { new Vec3U16(cpos.x, cpos.y, cpos.z),
|
||||
new Vec3U16(cpos.x2, cpos.y2, cpos.z2), new Vec3U16(x, y, z) };
|
||||
Vec3S32[] marks = { new Vec3S32(cpos.x, cpos.y, cpos.z),
|
||||
new Vec3S32(cpos.x2, cpos.y2, cpos.z2), new Vec3S32(x, y, z) };
|
||||
|
||||
Brush brush = GetBrush(p, cpos, 0, null);
|
||||
if (brush == null) return;
|
||||
|
@ -102,7 +102,7 @@ namespace MCGalaxy.Commands
|
||||
UndoSelfDrawOp op = new UndoSelfDrawOp();
|
||||
op.who = p;
|
||||
op.Start = entry.Start; op.End = entry.End;
|
||||
DrawOp.DoDrawOp(op, null, p, new [] { Vec3U16.MaxVal, Vec3U16.MaxVal } );
|
||||
DrawOp.DoDrawOp(op, null, p, new Vec3S32[] { Vec3U16.MaxVal, Vec3U16.MaxVal } );
|
||||
Player.Message(p, "Undo performed.");
|
||||
return;
|
||||
}
|
||||
@ -120,7 +120,7 @@ namespace MCGalaxy.Commands
|
||||
else op = new UndoOnlineDrawOp();
|
||||
op.Start = DateTime.UtcNow.AddTicks(-seconds * TimeSpan.TicksPerSecond);
|
||||
op.who = who;
|
||||
DrawOp.DoDrawOp(op, null, p, new [] { Vec3U16.MaxVal, Vec3U16.MaxVal } );
|
||||
DrawOp.DoDrawOp(op, null, p, new Vec3S32[] { Vec3U16.MaxVal, Vec3U16.MaxVal } );
|
||||
|
||||
Level saveLevel = op.saveLevel;
|
||||
if (p == who) {
|
||||
@ -138,7 +138,7 @@ namespace MCGalaxy.Commands
|
||||
UndoOfflineDrawOp op = new UndoOfflineDrawOp();
|
||||
op.Start = DateTime.UtcNow.AddTicks(-seconds * TimeSpan.TicksPerSecond);
|
||||
op.whoName = whoName;
|
||||
DrawOp.DoDrawOp(op, null, p, new [] { Vec3U16.MaxVal, Vec3U16.MaxVal } );
|
||||
DrawOp.DoDrawOp(op, null, p, new Vec3S32[] { Vec3U16.MaxVal, Vec3U16.MaxVal } );
|
||||
|
||||
if (op.foundUser) {
|
||||
Player.GlobalMessage(Server.FindColor(whoName) + whoName + "%S's actions for the past &b" + seconds + " %Sseconds were undone.");
|
||||
@ -163,7 +163,7 @@ namespace MCGalaxy.Commands
|
||||
Command.all.Find("physics").Use(p, "0");
|
||||
UndoPhysicsDrawOp op = new UndoPhysicsDrawOp();
|
||||
op.seconds = seconds;
|
||||
DrawOp.DoDrawOp(op, null, p, new [] { Vec3U16.MaxVal, Vec3U16.MaxVal } );
|
||||
DrawOp.DoDrawOp(op, null, p, new Vec3S32[] { Vec3U16.MaxVal, Vec3U16.MaxVal } );
|
||||
|
||||
Player.GlobalMessage("Physics were undone &b" + seconds + " %Sseconds");
|
||||
Server.s.Log( "Physics were undone &b" + seconds + " %Sseconds");
|
||||
|
@ -29,13 +29,13 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
|
||||
public override string Name { get { return "Adv Cone"; } }
|
||||
|
||||
public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) {
|
||||
public override long GetBlocksAffected(Level lvl, Vec3S32[] 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];
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 P = (Vec3U16)marks[0];
|
||||
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++)
|
||||
@ -61,15 +61,15 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
|
||||
public override string Name { get { return "Adv Hollow Cone"; } }
|
||||
|
||||
public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) {
|
||||
public override long GetBlocksAffected(Level lvl, Vec3S32[] 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 (long)(outer - inner);
|
||||
}
|
||||
|
||||
public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 P = marks[0];
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 P = (Vec3U16)marks[0];
|
||||
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;
|
||||
@ -97,13 +97,13 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
|
||||
public override string Name { get { return "Adv Volcano"; } }
|
||||
|
||||
public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) {
|
||||
public override long GetBlocksAffected(Level lvl, Vec3S32[] 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];
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 P = (Vec3U16)marks[0];
|
||||
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;
|
||||
|
@ -36,13 +36,13 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
public override bool UsesHeight { get { return false; } }
|
||||
public override string Name { get { return "Adv Sphere"; } }
|
||||
|
||||
public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) {
|
||||
public override long GetBlocksAffected(Level lvl, Vec3S32[] 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];
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 P = (Vec3U16)marks[0];
|
||||
int upper = (Radius + 1) * (Radius + 1);
|
||||
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;
|
||||
@ -63,15 +63,15 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
public override bool UsesHeight { get { return false; } }
|
||||
public override string Name { get { return "Adv Hollow Sphere"; } }
|
||||
|
||||
public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) {
|
||||
public override long GetBlocksAffected(Level lvl, Vec3S32[] 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 (long)(outer - inner);
|
||||
}
|
||||
|
||||
public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 P = marks[0];
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 P = (Vec3U16)marks[0];
|
||||
int upper = (Radius + 1) * (Radius + 1), inner = (Radius - 1) * (Radius - 1);
|
||||
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;
|
||||
|
@ -29,13 +29,13 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
|
||||
public override string Name { get { return "Adv Pyramid"; } }
|
||||
|
||||
public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) {
|
||||
public override long GetBlocksAffected(Level lvl, Vec3S32[] 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];
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 P = (Vec3U16)marks[0];
|
||||
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;
|
||||
@ -61,15 +61,15 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
|
||||
public override string Name { get { return "Adv Hollow Pyramid"; } }
|
||||
|
||||
public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) {
|
||||
public override long GetBlocksAffected(Level lvl, Vec3S32[] 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];
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 P = Clamp(marks[0]);
|
||||
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;
|
||||
|
@ -24,13 +24,12 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
|
||||
public override string Name { get { return "Cuboid"; } }
|
||||
|
||||
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);
|
||||
public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) {
|
||||
return (Max.X - Min.X + 1) * (Max.Y - Min.Y + 1) * (Max.Z - Min.Z + 1);
|
||||
}
|
||||
|
||||
public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = marks[0], p2 = marks[1];
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = Clamp(Min), p2 = Clamp(Max);
|
||||
for (ushort y = p1.Y; y <= p2.Y; y++)
|
||||
for (ushort z = p1.Z; z <= p2.Z; z++)
|
||||
for (ushort x = p1.X; x <= p2.X; x++)
|
||||
@ -44,17 +43,16 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
|
||||
public override string Name { get { return "Cuboid Hollow"; } }
|
||||
|
||||
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);
|
||||
public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) {
|
||||
int lenX = (Max.X - Min.X + 1), lenY = (Max.Y - Min.Y + 1), lenZ = (Max.Z - Min.Z + 1);
|
||||
int xQuadsVol = Math.Min(lenX, 2) * (lenY * lenZ);
|
||||
int yQuadsVol = Math.Max(0, Math.Min(lenY, 2) * ((lenX - 2) * lenZ)); // we need to avoid double counting overlaps
|
||||
int zQuadzVol = Math.Max(0, Math.Min(lenZ, 2) * ((lenX - 2) * (lenY - 2)));
|
||||
return xQuadsVol + yQuadsVol + zQuadzVol;
|
||||
}
|
||||
|
||||
public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = marks[0], p2 = marks[1];
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = Clamp(Min), p2 = Clamp(Max);
|
||||
int lenX = (p2.X - p1.X + 1), lenY = (p2.Y - p1.Y + 1);
|
||||
QuadY(p1.Y, p1.X, p1.Z, p2.X, p2.Z, p, lvl, brush);
|
||||
QuadY(p2.Y, p1.X, p1.Z, p2.X, p2.Z, p, lvl, brush);
|
||||
@ -102,16 +100,15 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
|
||||
public override string Name { get { return "Cuboid Walls"; } }
|
||||
|
||||
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);
|
||||
public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) {
|
||||
int lenX = (Max.X - Min.X + 1), lenY = (Max.Y - Min.Y + 1), lenZ = (Max.Z - Min.Z + 1);
|
||||
int xQuadsVol = Math.Min(lenX, 2) * (lenY * lenZ);
|
||||
int zQuadsVol = Math.Max(0, Math.Min(lenZ, 2) * ((lenX - 2) * lenY)); // we need to avoid double counting overlaps
|
||||
return xQuadsVol + zQuadsVol;
|
||||
}
|
||||
|
||||
public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = marks[0], p2 = marks[1];
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = Clamp(Min), p2 = Clamp(Max);
|
||||
int lenX = (p2.X - p1.X + 1);
|
||||
QuadX(p1.X, p1.Y, p1.Z, p2.Y, p2.Z, p, lvl, brush);
|
||||
QuadX(p2.X, p1.Y, p1.Z, p2.Y, p2.Z, p, lvl, brush);
|
||||
@ -126,16 +123,15 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
|
||||
public override string Name { get { return "Cuboid Wireframe"; } }
|
||||
|
||||
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);
|
||||
public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) {
|
||||
int lenX = (Max.X - Min.X + 1), lenY = (Max.Y - Min.Y + 1), lenZ = (Max.Z - Min.Z + 1);
|
||||
int horSidesvol = 2 * (lenX * 2 + lenZ * 2); // TODO: slightly overestimated by at most four blocks.
|
||||
int verSidesVol = Math.Max(0, lenY - 2) * 4;
|
||||
return horSidesvol + verSidesVol;
|
||||
}
|
||||
|
||||
public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = marks[0], p2 = marks[1];
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = Clamp(Min), p2 = Clamp(Max);
|
||||
for (ushort y = p1.Y; y <= p2.Y; y++ ) {
|
||||
PlaceBlock(p, lvl, p1.X, y, p1.Z, brush);
|
||||
PlaceBlock(p, lvl, p2.X, y, p1.Z, brush);
|
||||
|
@ -25,8 +25,8 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
public override string Name { get { return "Hollow"; } }
|
||||
public byte Skip;
|
||||
|
||||
public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = marks[0], p2 = marks[1];
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = Clamp(Min), p2 = Clamp(Max);
|
||||
for (ushort y = p1.Y; y <= p2.Y; y++)
|
||||
for (ushort z = p1.Z; z <= p2.Z; z++)
|
||||
for (ushort x = p1.X; x <= p2.X; x++)
|
||||
@ -60,8 +60,8 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
public override string Name { get { return "Outline"; } }
|
||||
public byte Type, NewType;
|
||||
|
||||
public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = marks[0], p2 = marks[1];
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = Clamp(Min), p2 = Clamp(Max);
|
||||
for (ushort y = p1.Y; y <= p2.Y; y++)
|
||||
for (ushort z = p1.Z; z <= p2.Z; z++)
|
||||
for (ushort x = p1.X; x <= p2.X; x++)
|
||||
@ -84,8 +84,8 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
|
||||
public override string Name { get { return "Rainbow"; } }
|
||||
|
||||
public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = marks[0], p2 = marks[1];
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = Clamp(Min), p2 = Clamp(Max);
|
||||
int dx = Math.Abs(p1.X - p2.X), dy = Math.Abs(p1.Y - p2.Y), dz = Math.Abs(p1.Z - p2.Z);
|
||||
byte stepX = 0, stepY = 0, stepZ = 0;
|
||||
|
||||
@ -98,13 +98,13 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
}
|
||||
|
||||
int i = 12;
|
||||
for (ushort y = Min.Y; y <= Max.Y; y++) {
|
||||
for (ushort y = p1.Y; y <= p2.Y; y++) {
|
||||
i = (i + stepY) % 13;
|
||||
int startZ = i;
|
||||
for (ushort z = Min.Z; z <= Max.Z; z++) {
|
||||
for (ushort z = p1.Z; z <= p2.Z; z++) {
|
||||
i = (i + stepZ) % 13;
|
||||
int startX = i;
|
||||
for (ushort x = Min.X; x <= Max.X; x++) {
|
||||
for (ushort x = p1.X; x <= p2.X; x++) {
|
||||
i = (i + stepX) % 13;
|
||||
if (lvl.GetTile(x, y, z) != Block.air)
|
||||
PlaceBlock(p, lvl, x, y, z, (byte)(Block.red + i), 0);
|
||||
@ -113,7 +113,6 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
}
|
||||
i = startZ;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -25,7 +25,7 @@ namespace MCGalaxy.Drawing {
|
||||
internal struct PendingDrawOp {
|
||||
public DrawOp Op;
|
||||
public Brush Brush;
|
||||
public Vec3U16[] Marks;
|
||||
public Vec3S32[] Marks;
|
||||
public long Affected;
|
||||
public Level Level;
|
||||
}
|
||||
@ -37,20 +37,15 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
|
||||
public static bool DoDrawOp(DrawOp op, Brush brush, Player p,
|
||||
ushort x1, ushort y1, ushort z1, ushort x2, ushort y2, ushort z2) {
|
||||
Vec3U16[] marks = new [] { new Vec3U16(x1, y1, z1), new Vec3U16(x2, y2, z2) };
|
||||
if (op.MinMaxCoords) {
|
||||
marks[0].X = Math.Min(x1, x2); marks[1].X = Math.Max(x1, x2);
|
||||
marks[0].Y = Math.Min(y1, y2); marks[1].Y = Math.Max(y1, y2);
|
||||
marks[0].Z = Math.Min(z1, z2); marks[1].Z = Math.Max(z1, z2);
|
||||
}
|
||||
Vec3S32[] marks = new [] { new Vec3S32(x1, y1, z1), new Vec3S32(x2, y2, z2) };
|
||||
return DoDrawOp(op, brush, p, marks);
|
||||
}
|
||||
|
||||
public static bool DoDrawOp(DrawOp op, Brush brush, Player p, Vec3U16[] marks) {
|
||||
public static bool DoDrawOp(DrawOp op, Brush brush, Player p, Vec3S32[] marks) {
|
||||
op.Origin = marks[0]; op.Min = marks[0]; op.Max = marks[0];
|
||||
for (int i = 1; i < marks.Length; i++) {
|
||||
op.Min = Vec3U16.Min(op.Min, marks[i]);
|
||||
op.Max = Vec3U16.Max(op.Max, marks[i]);
|
||||
op.Min = Vec3S32.Min(op.Min, marks[i]);
|
||||
op.Max = Vec3S32.Max(op.Max, marks[i]);
|
||||
}
|
||||
op.Level = p == null ? null : p.level;
|
||||
if (op.Level != null && !op.Level.DrawingAllowed) {
|
||||
@ -73,7 +68,7 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
return true;
|
||||
}
|
||||
|
||||
static void AppendDrawOp(Player p, DrawOp op, Brush brush, Vec3U16[] marks, long affected) {
|
||||
static void AppendDrawOp(Player p, DrawOp op, Brush brush, Vec3S32[] marks, long affected) {
|
||||
if (p == null) { op.Perform(marks, p, op.Level, brush); return; }
|
||||
|
||||
PendingDrawOp item = new PendingDrawOp();
|
||||
|
@ -41,13 +41,13 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
protected internal int method;
|
||||
|
||||
/// <summary> Minimum coordinates of the bounds of this drawing command. </summary>
|
||||
public Vec3U16 Min;
|
||||
public Vec3S32 Min;
|
||||
|
||||
/// <summary> Maximum coordinates of the bounds of this drawing command. </summary>
|
||||
public Vec3U16 Max;
|
||||
public Vec3S32 Max;
|
||||
|
||||
/// <summary> Coordinates of the first point selected by the user. </summary>
|
||||
public Vec3U16 Origin;
|
||||
public Vec3S32 Origin;
|
||||
|
||||
/// <summary> Coordinates of the current block being processed by the drawing command. </summary>
|
||||
public Vec3U16 Coords;
|
||||
@ -55,20 +55,16 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
/// <summary> Level the draw operation is being performed upon. </summary>
|
||||
public Level Level;
|
||||
|
||||
/// <summary> Whether the two given coordinates from the user should be adjusted,
|
||||
/// so that the first coordinate contains the minimum values on all three axes. </summary>
|
||||
public virtual bool MinMaxCoords { get { return true; } }
|
||||
|
||||
/// <summary> Human friendly name of the draw operation. </summary>
|
||||
public abstract string Name { get; }
|
||||
|
||||
/// <summary> Estimates the total number of blocks that the drawing commands affects. <br/>
|
||||
/// Note that this estimate assumes that all possibly affected blocks will be changed by the drawing command. </summary>
|
||||
public abstract long GetBlocksAffected(Level lvl, Vec3U16[] marks);
|
||||
public abstract long GetBlocksAffected(Level lvl, Vec3S32[] marks);
|
||||
|
||||
public abstract void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush);
|
||||
public abstract void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush);
|
||||
|
||||
public virtual bool CanDraw(Vec3U16[] marks, Player p, out long affected) {
|
||||
public virtual bool CanDraw(Vec3S32[] marks, Player p, out long affected) {
|
||||
affected = GetBlocksAffected(Level, marks);
|
||||
if (p != null && affected > p.group.maxBlocks) {
|
||||
Player.Message(p, "You tried to draw " + affected + " blocks.");
|
||||
@ -149,5 +145,12 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
|
||||
internal const int M_PBlockQueue = 0, M_PBlockChange = 1, M_PSetTile = 2;
|
||||
internal const int M_BlockChange = 3, M_SetTile = 4;
|
||||
|
||||
protected Vec3U16 Clamp(Vec3S32 pos) {
|
||||
pos.X = Math.Max(0, Math.Min(pos.X, Level.Width - 1));
|
||||
pos.Y = Math.Max(0, Math.Min(pos.Y, Level.Height - 1));
|
||||
pos.Z = Math.Max(0, Math.Min(pos.Z, Level.Length - 1));
|
||||
return new Vec3U16((ushort)pos.X, (ushort)pos.Y, (ushort)pos.Z);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -27,11 +27,11 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
|
||||
public override string Name { get { return "Fill"; } }
|
||||
|
||||
public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) {
|
||||
public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) {
|
||||
return Positions.Count;
|
||||
}
|
||||
|
||||
public override bool CanDraw(Vec3U16[] marks, Player p, out long affected) {
|
||||
public override bool CanDraw(Vec3S32[] marks, Player p, out long affected) {
|
||||
affected = GetBlocksAffected(p.level, marks);
|
||||
if (affected > p.group.maxBlocks) {
|
||||
Player.Message(p, "You tried to fill over " + p.group.maxBlocks + " blocks.");
|
||||
@ -41,7 +41,7 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
return true;
|
||||
}
|
||||
|
||||
public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) {
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
ushort x, y, z;
|
||||
foreach (int pos in Positions) {
|
||||
lvl.IntToPos(pos, out x, out y, out z);
|
||||
|
@ -28,10 +28,8 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
|
||||
public override string Name { get { return "Line"; } }
|
||||
|
||||
public override bool MinMaxCoords { get { return false; } }
|
||||
|
||||
public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) {
|
||||
Vec3U16 p1 = marks[0], p2 = marks[1];
|
||||
public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) {
|
||||
Vec3S32 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) {
|
||||
int baseLen = (int)Math.Ceiling(Math.Sqrt(dx * dx + dz * dz));
|
||||
@ -42,8 +40,8 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
}
|
||||
}
|
||||
|
||||
public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = marks[0], p2 = marks[1];
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = Clamp(marks[0]), p2 = Clamp(marks[1]);
|
||||
List<FillPos> buffer = new List<FillPos>();
|
||||
DrawLine(p1.X, p1.Y, p1.Z, MaxLength, p2.X, p2.Y, p2.Z, buffer);
|
||||
if (WallsMode) {
|
||||
|
@ -33,13 +33,13 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
byte[] r = new byte[1];
|
||||
int width, length;
|
||||
|
||||
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;
|
||||
public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) {
|
||||
int lenX = (Math.Abs(Max.X - Min.X) + 1) / 2;
|
||||
int lenZ = (Math.Abs(Max.Z - Min.Z) + 1) / 2;
|
||||
return lenX * lenZ * 3;
|
||||
}
|
||||
|
||||
public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) {
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
width = Max.X - Min.X;
|
||||
if (width % 2 != 0) { width++; Min.X--; }
|
||||
width -= 2;
|
||||
@ -83,27 +83,28 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
}
|
||||
|
||||
Player.Message(p, "Generated maze, now drawing.");
|
||||
ushort minX = Min.X, minZ = Min.Z, maxX = Max.X, maxZ = Max.Z, y = Min.Y;
|
||||
Vec3U16 min = Clamp(Min), max = Clamp(Max);
|
||||
ushort y = min.Y;
|
||||
for (ushort xx = 0; xx <= width; xx++)
|
||||
for (ushort zz = 0; zz <= length; zz++)
|
||||
if (wall[xx, zz])
|
||||
{
|
||||
PlaceBlock(p, lvl, (ushort)(xx + minX + 1), y, (ushort)(zz + minZ + 1), Block.staircasefull, 0);
|
||||
PlaceBlock(p, lvl, (ushort)(xx + minX + 1), (ushort)(y + 1), (ushort)(zz + minZ + 1), Block.leaf, 0);
|
||||
PlaceBlock(p, lvl, (ushort)(xx + minX + 1), (ushort)(y + 2), (ushort)(zz + minZ + 1), Block.leaf, 0);
|
||||
PlaceBlock(p, lvl, (ushort)(xx + min.X + 1), y, (ushort)(zz + min.Z + 1), Block.staircasefull, 0);
|
||||
PlaceBlock(p, lvl, (ushort)(xx + min.X + 1), (ushort)(y + 1), (ushort)(zz + min.Z + 1), Block.leaf, 0);
|
||||
PlaceBlock(p, lvl, (ushort)(xx + min.X + 1), (ushort)(y + 2), (ushort)(zz + min.Z + 1), Block.leaf, 0);
|
||||
}
|
||||
|
||||
brush = new SolidBrush(Block.staircasefull, 0);
|
||||
QuadX(minX, y, minZ, y, maxZ, p, lvl, brush);
|
||||
QuadX(maxX, y, minZ, y, maxZ, p, lvl, brush);
|
||||
QuadZ(minZ, y, minX, y, maxX, p, lvl, brush);
|
||||
QuadZ(maxZ, y, minX, y, maxX, p, lvl, brush);
|
||||
QuadX(min.X, y, min.Z, y, max.Z, p, lvl, brush);
|
||||
QuadX(max.X, y, min.Z, y, max.Z, p, lvl, brush);
|
||||
QuadZ(min.Z, y, min.X, y, max.X, p, lvl, brush);
|
||||
QuadZ(max.Z, y, min.X, y, max.X, p, lvl, brush);
|
||||
|
||||
brush = new SolidBrush(Block.leaf, 0);
|
||||
QuadX(minX, (ushort)(y + 1), minZ, (ushort)(y + 2), maxZ, p, lvl, brush);
|
||||
QuadX(maxX, (ushort)(y + 1), minZ, (ushort)(y + 2), maxZ, p, lvl, brush);
|
||||
QuadZ(minZ, (ushort)(y + 1), minX, (ushort)(y + 2), maxX, p, lvl, brush);
|
||||
QuadZ(maxZ, (ushort)(y + 1), minX, (ushort)(y + 2), maxX, p, lvl, brush);
|
||||
QuadX(min.X, (ushort)(y + 1), min.Z, (ushort)(y + 2), max.Z, p, lvl, brush);
|
||||
QuadX(max.X, (ushort)(y + 1), min.Z, (ushort)(y + 2), max.Z, p, lvl, brush);
|
||||
QuadZ(min.Z, (ushort)(y + 1), min.X, (ushort)(y + 2), max.X, p, lvl, brush);
|
||||
QuadZ(max.Z, (ushort)(y + 1), min.X, (ushort)(y + 2), max.X, p, lvl, brush);
|
||||
|
||||
Player.Message(p, "Maze painted. Build your entrance and exit yourself");
|
||||
randomizer = 0;
|
||||
|
@ -27,14 +27,12 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
|
||||
public override string Name { get { return "Paste"; } }
|
||||
|
||||
public override bool MinMaxCoords { get { return false; } }
|
||||
|
||||
public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) {
|
||||
public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) {
|
||||
return CopyState.UsedBlocks;
|
||||
}
|
||||
|
||||
public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = marks[0];
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = Clamp(marks[0]);
|
||||
CopyState state = CopyState;
|
||||
bool pasteAir = state.PasteAir;
|
||||
// Adjust for the fact that paste origin may be outside the map.
|
||||
@ -63,14 +61,12 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
|
||||
public override string Name { get { return "Paste"; } }
|
||||
|
||||
public override bool MinMaxCoords { get { return false; } }
|
||||
|
||||
public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) {
|
||||
public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) {
|
||||
return CopyState.UsedBlocks;
|
||||
}
|
||||
|
||||
public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = marks[0];
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = Clamp(marks[0]);
|
||||
CopyState state = CopyState;
|
||||
bool pasteAir = state.PasteAir;
|
||||
ExtBlock[] include = Include, exclude = Exclude;
|
||||
|
@ -33,25 +33,27 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
return baseOp.DetermineDrawOpMethod(lvl, affected);
|
||||
}
|
||||
|
||||
public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) {
|
||||
Vec3U16 origP1 = marks[0], origP2 = marks[1];
|
||||
Vec3U16 p1 = marks[0], p2 = marks[1];
|
||||
public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) {
|
||||
Vec3S32 oMin = Min, oMax = Max;
|
||||
baseOp.Min = oMin; baseOp.Max = oMax;
|
||||
Vec3S32 p1 = Min, p2 = Max;
|
||||
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)
|
||||
break;
|
||||
break;
|
||||
p1.X++; p2.X--;
|
||||
p1.Z++; p2.Z--;
|
||||
p1.Y = (ushort)(p1.Y + yDir); p2.Y = p1.Y;
|
||||
marks[0] = p1; marks[1] = p2;
|
||||
baseOp.Min = p1; baseOp.Max = p2;
|
||||
}
|
||||
marks[0] = origP1; marks[1] = origP2;
|
||||
baseOp.Min = oMin; baseOp.Max = oMax;
|
||||
return total;
|
||||
}
|
||||
|
||||
public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = marks[0], p2 = marks[1];
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3S32 p1 = Min, p2 = Max;
|
||||
while (true) {
|
||||
baseOp.Perform(marks, p, lvl, brush);
|
||||
if (p1.Y >= lvl.Height || Math.Abs(p2.X - p1.X) <= 1 || Math.Abs(p2.Z - p1.Z) <= 1)
|
||||
@ -59,12 +61,12 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
p1.X++; p2.X--;
|
||||
p1.Z++; p2.Z--;
|
||||
p1.Y = (ushort)(p1.Y + yDir); p2.Y = p1.Y;
|
||||
marks[0] = p1; marks[1] = p2;
|
||||
baseOp.Min = p1; baseOp.Max = p2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class PyramidSolidDrawOp : PyramidDrawOp {
|
||||
public class PyramidSolidDrawOp : PyramidDrawOp {
|
||||
|
||||
public PyramidSolidDrawOp() : base(new CuboidDrawOp(), 1) {
|
||||
}
|
||||
@ -91,19 +93,24 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
|
||||
public override string Name { get { return "Pyramid reverse"; } }
|
||||
|
||||
public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = marks[0], p2 = marks[1];
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = Clamp(Min), p2 = Clamp(Max);
|
||||
wallOp.Min = Min; wallOp.Max = Max;
|
||||
baseOp.Min = Min; baseOp.Max = Max;
|
||||
|
||||
while (true) {
|
||||
wallOp.Perform(marks, p, lvl, brush);
|
||||
if (p1.Y >= lvl.Height || Math.Abs(p2.X - p1.X) <= 1 || Math.Abs(p2.Z - p1.Z) <= 1)
|
||||
break;
|
||||
p1.X++; p2.X--;
|
||||
p1.Z++; p2.Z--;
|
||||
marks[0] = p1; marks[1] = p2;
|
||||
wallOp.Min = p1; wallOp.Max = p2;
|
||||
baseOp.Min = p1; baseOp.Max = p2;
|
||||
|
||||
baseOp.Perform(marks, p, lvl, airBrush);
|
||||
p1.Y = (ushort)(p1.Y + yDir); p2.Y = p1.Y;
|
||||
marks[0] = p1; marks[1] = p2;
|
||||
wallOp.Min = p1; wallOp.Max = p2;
|
||||
baseOp.Min = p1; baseOp.Max = p2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -33,9 +33,9 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
/// <summary> Point in time that the /undo should start updating blocks. </summary>
|
||||
public DateTime End = DateTime.MaxValue;
|
||||
|
||||
public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { return -1; }
|
||||
public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { return -1; }
|
||||
|
||||
public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) {
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
UndoCache cache = p.UndoBuffer;
|
||||
UndoCacheNode node = cache.Tail;
|
||||
if (node == null) return;
|
||||
|
@ -30,13 +30,12 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
|
||||
public override string Name { get { return "Replace"; } }
|
||||
|
||||
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);
|
||||
public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) {
|
||||
return (Max.X - Min.X + 1) * (Max.Y - Min.Y + 1) * (Max.Z - Min.Z + 1);
|
||||
}
|
||||
|
||||
public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = marks[0], p2 = marks[1];
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = Clamp(Min), p2 = Clamp(Max);
|
||||
for (ushort y = p1.Y; y <= p2.Y; y++)
|
||||
for (ushort z = p1.Z; z <= p2.Z; z++)
|
||||
for (ushort x = p1.X; x <= p2.X; x++)
|
||||
@ -60,13 +59,12 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
|
||||
public override string Name { get { return "ReplaceNot"; } }
|
||||
|
||||
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);
|
||||
public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) {
|
||||
return (Max.X - Min.X + 1) * (Max.Y - Min.Y + 1) * (Max.Z - Min.Z + 1);
|
||||
}
|
||||
|
||||
public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = marks[0], p2 = marks[1];
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = Clamp(Min), p2 = Clamp(Max);
|
||||
for (ushort y = p1.Y; y <= p2.Y; y++)
|
||||
for (ushort z = p1.Z; z <= p2.Z; z++)
|
||||
for (ushort x = p1.X; x <= p2.X; x++)
|
||||
|
@ -24,22 +24,21 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
|
||||
public override string Name { get { return "Ellipsoid"; } }
|
||||
|
||||
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;
|
||||
public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) {
|
||||
double rx = (Max.X - Min.X) / 2.0 + 0.25, ry = (Max.Y - Min.Y) / 2.0 + 0.25, rz = (Max.Z - Min.Z) / 2.0 + 0.25;
|
||||
return (int)(Math.PI * 4.0/3.0 * rx * ry * rz);
|
||||
}
|
||||
|
||||
public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = marks[0], p2 = marks[1];
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
/* Courtesy of fCraft's awesome Open-Source'ness :D */
|
||||
double cx = (p1.X + p2.X) / 2.0, cy = (p1.Y + p2.Y) / 2.0, cz = (p1.Z + p2.Z) / 2.0;
|
||||
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 cx = (Min.X + Max.X) / 2.0, cy = (Min.Y + Max.Y) / 2.0, cz = (Min.Z + Max.Z) / 2.0;
|
||||
double rx = (Max.X - Min.X) / 2.0 + 0.25, ry = (Max.Y - Min.Y) / 2.0 + 0.25, rz = (Max.Z - Min.Z) / 2.0 + 0.25;
|
||||
double rx2 = 1 / (rx * rx), ry2 = 1 / (ry * ry), rz2 = 1 / (rz * rz);
|
||||
Vec3U16 min = Clamp(Min), max = Clamp(Max);
|
||||
|
||||
for (ushort yy = p1.Y; yy <= p2.Y; yy++)
|
||||
for (ushort zz = p1.Z; zz <= p2.Z; zz++)
|
||||
for (ushort xx = p1.X; xx <= p2.X; xx++)
|
||||
for (ushort yy = min.Y; yy <= max.Y; yy++)
|
||||
for (ushort zz = min.Z; zz <= max.Z; zz++)
|
||||
for (ushort xx = min.X; xx <= max.X; xx++)
|
||||
{
|
||||
double dx = xx - cx, dy = yy - cy, dz = zz - cz;
|
||||
if ((dx * dx) * rx2 + (dy * dy) * ry2 + (dz * dz) * rz2 <= 1)
|
||||
@ -52,26 +51,25 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
|
||||
public override string Name { get { return "Ellipsoid Hollow"; } }
|
||||
|
||||
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;
|
||||
public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) {
|
||||
double rx = (Max.X - Min.X) / 2.0 + 0.25, ry = (Max.Y - Min.Y) / 2.0 + 0.25, rz = (Max.Z - Min.Z) / 2.0 + 0.25;
|
||||
return (int)(Math.PI * 4.0/3.0 * rx * ry * rz);
|
||||
}
|
||||
|
||||
public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = marks[0], p2 = marks[1];
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
/* Courtesy of fCraft's awesome Open-Source'ness :D */
|
||||
double cx = (p1.X + p2.X) / 2.0, cy = (p1.Y + p2.Y) / 2.0, cz = (p1.Z + p2.Z) / 2.0;
|
||||
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 cx = (Min.X + Max.X) / 2.0, cy = (Min.Y + Max.Y) / 2.0, cz = (Min.Z + Max.Z) / 2.0;
|
||||
double rx = (Max.X - Min.X) / 2.0 + 0.25, ry = (Max.Y - Min.Y) / 2.0 + 0.25, rz = (Max.Z - Min.Z) / 2.0 + 0.25;
|
||||
double rx2 = 1 / (rx * rx), ry2 = 1 / (ry * ry), rz2 = 1 / (rz * rz);
|
||||
|
||||
double smallrx2 = 1 / ((rx - 1) * (rx - 1));
|
||||
double smallry2 = 1 / ((ry - 1) * (ry - 1));
|
||||
double smallrz2 = 1 / ((rz - 1) * (rz - 1));
|
||||
Vec3U16 min = Clamp(Min), max = Clamp(Max);
|
||||
|
||||
for (ushort yy = p1.Y; yy <= p2.Y; yy++)
|
||||
for (ushort zz = p1.Z; zz <= p2.Z; zz++)
|
||||
for (ushort xx = p1.X; xx <= p2.X; xx++)
|
||||
for (ushort yy = min.Y; yy <= max.Y; yy++)
|
||||
for (ushort zz = min.Z; zz <= max.Z; zz++)
|
||||
for (ushort xx = min.X; xx <= max.X; xx++)
|
||||
{
|
||||
double dx = xx - cx, dy = yy - cy, dz = zz - cz;
|
||||
dx *= dx; dy *= dy; dz *= dz;
|
||||
@ -86,21 +84,20 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
|
||||
public override string Name { get { return "Cylinder"; } }
|
||||
|
||||
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);
|
||||
public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) {
|
||||
double rx = (Max.X - Min.X) / 2.0 + 0.25, rz = (Max.Z - Min.Z) / 2.0 + 0.25;
|
||||
int height = (Max.Y - Min.Y + 1);
|
||||
return (int)(Math.PI * rx * rz * height);
|
||||
}
|
||||
|
||||
public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = marks[0], p2 = marks[1];
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
/* Courtesy of fCraft's awesome Open-Source'ness :D */
|
||||
double cx = (p1.X + p2.X) / 2.0, cz = (p1.Z + p2.Z) / 2.0;
|
||||
double rx = (p2.X - p1.X) / 2.0 + 0.25, rz = (p2.Z - p1.Z) / 2.0 + 0.25;
|
||||
double rx2= 1 / (rx * rx), rz2 = 1 / (rz * rz);
|
||||
double cx = (Min.X + Max.X) / 2.0, cz = (Min.Z + Max.Z) / 2.0;
|
||||
double rx = (Max.X - Min.X) / 2.0 + 0.25, rz = (Max.Z - Min.Z) / 2.0 + 0.25;
|
||||
double rx2 = 1 / (rx * rx), rz2 = 1 / (rz * rz);
|
||||
double smallrx2 = 1 / ((rx - 1) * (rx - 1));
|
||||
double smallrz2 = 1 / ((rz - 1) * (rz - 1));
|
||||
Vec3U16 p1 = Clamp(Min), p2 = Clamp(Max);
|
||||
|
||||
for (ushort yy = p1.Y; yy <= p2.Y; yy++)
|
||||
for (ushort zz = p1.Z; zz <= p2.Z; zz++)
|
||||
|
@ -24,18 +24,17 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
|
||||
public override string Name { get { return "Torus"; } }
|
||||
|
||||
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;
|
||||
public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) {
|
||||
double rx = (Max.X - Min.X) / 2.0 + 0.25, ry = (Max.Y - Min.Y) / 2.0 + 0.25, rz = (Max.Z - Min.Z) / 2.0 + 0.25;
|
||||
double rTube = ry, rCentre = Math.Min(rx, rz) - rTube;
|
||||
return (int)(2 * Math.PI * Math.PI * rTube * rTube * rCentre);
|
||||
}
|
||||
|
||||
public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = marks[0], p2 = marks[1];
|
||||
double cx = (p1.X + p2.X) / 2.0, cy = (p1.Y + p2.Y) / 2.0, cz = (p1.Z + p2.Z) / 2.0;
|
||||
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;
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
double cx = (Min.X + Max.X) / 2.0, cy = (Min.Y + Max.Y) / 2.0, cz = (Min.Z + Max.Z) / 2.0;
|
||||
double rx = (Max.X - Min.X) / 2.0 + 0.25, ry = (Max.Y - Min.Y) / 2.0 + 0.25, rz = (Max.Z - Min.Z) / 2.0 + 0.25;
|
||||
double rTube = ry, rCentre = Math.Min(rx, rz) - rTube;
|
||||
Vec3U16 p1 = Clamp(Min), p2 = Clamp(Max);
|
||||
|
||||
for (ushort yy = p1.Y; yy <= p2.Y; yy++)
|
||||
for (ushort zz = p1.Z; zz <= p2.Z; zz++)
|
||||
|
@ -39,11 +39,11 @@ 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 long GetBlocksAffected(Level lvl, Vec3U16[] marks) { return -1; }
|
||||
public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { return -1; }
|
||||
|
||||
public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) {
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
if (brush == null) brush = defBrush;
|
||||
Vec3U16 P = marks[0];
|
||||
Vec3U16 P = Clamp(marks[0]);
|
||||
if (Type == T_Tree) AddTree(p, lvl, P.X, P.Y, P.Z, brush);
|
||||
if (Type == T_NotchTree) AddNotchTree(p, lvl, P.X, P.Y, P.Z, brush);
|
||||
if (Type == T_NotchSwamp) AddNotchSwampTree(p, lvl, P.X, P.Y, P.Z, brush);
|
||||
|
@ -24,7 +24,7 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
|
||||
public override string Name { get { return "Triangle"; } }
|
||||
|
||||
public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) {
|
||||
public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) {
|
||||
// Applying Heron's Formula
|
||||
float a = (marks[0] - marks[2]).Length;
|
||||
float b = (marks[1] - marks[2]).Length;
|
||||
@ -33,14 +33,15 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
return (int)Math.Sqrt(s * (s - a) * (s - b) * (s - c));
|
||||
}
|
||||
|
||||
public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) {
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3F32 V1 = marks[0], V2 = marks[1], V3 = marks[2];
|
||||
Vec3F32 N = Vec3F32.Cross(V2 - V1, V3 - V1);
|
||||
N = Vec3F32.Normalise(N);
|
||||
Vec3U16 min = Clamp(Min), max = Clamp(Max);
|
||||
|
||||
for (ushort yy = Min.Y; yy <= Max.Y; yy++)
|
||||
for (ushort zz = Min.Z; zz <= Max.Z; zz++)
|
||||
for (ushort xx = Min.X; xx <= Max.X; xx++)
|
||||
for (ushort yy = min.Y; yy <= max.Y; yy++)
|
||||
for (ushort zz = min.Z; zz <= max.Z; zz++)
|
||||
for (ushort xx = min.X; xx <= max.X; xx++)
|
||||
{
|
||||
// Project point onto the plane
|
||||
Vec3F32 P = new Vec3F32(xx, yy, zz);
|
||||
|
@ -40,9 +40,9 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
internal Player who;
|
||||
internal Level saveLevel = null;
|
||||
|
||||
public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { return -1; }
|
||||
public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { return -1; }
|
||||
|
||||
public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) {
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
PerformUndo(p, ref saveLevel);
|
||||
bool foundUser = false;
|
||||
UndoFile.UndoPlayer(p, who.name.ToLower(), marks, Start, ref foundUser);
|
||||
@ -53,8 +53,8 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
UndoCacheNode node = cache.Tail;
|
||||
if (node == null) return;
|
||||
|
||||
Vec3U16 min = Min, max = Max;
|
||||
bool undoArea = min.X != ushort.MaxValue;
|
||||
Vec3U16 min = (Vec3U16)Min, max = (Vec3U16)Max;
|
||||
bool undoArea = Min.X != ushort.MaxValue;
|
||||
Player.UndoPos Pos = default(Player.UndoPos);
|
||||
int timeDelta = (int)DateTime.UtcNow.Subtract(Server.StartTime).TotalSeconds;
|
||||
|
||||
@ -104,9 +104,9 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
internal string whoName;
|
||||
internal bool foundUser = false;
|
||||
|
||||
public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { return -1; }
|
||||
public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { return -1; }
|
||||
|
||||
public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) {
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
UndoFile.UndoPlayer(p, whoName.ToLower(), marks, Start, ref foundUser);
|
||||
}
|
||||
}
|
||||
@ -117,9 +117,9 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
|
||||
internal long seconds;
|
||||
|
||||
public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { return -1; }
|
||||
public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { return -1; }
|
||||
|
||||
public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) {
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
if (lvl.UndoBuffer.Count != Server.physUndo) {
|
||||
int count = lvl.currentUndo;
|
||||
for (int i = count; i >= 0; i--) {
|
||||
|
@ -28,9 +28,7 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
|
||||
public override string Name { get { return "Write"; } }
|
||||
|
||||
public override bool MinMaxCoords { get { return false; } }
|
||||
|
||||
public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) {
|
||||
public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) {
|
||||
int blocks = 0;
|
||||
foreach (char c in Text) {
|
||||
if ((int)c >= 256 || letters[(int)c] == null) {
|
||||
@ -45,8 +43,8 @@ namespace MCGalaxy.Drawing.Ops {
|
||||
}
|
||||
|
||||
int dirX, dirZ;
|
||||
public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = marks[0], p2 = marks[1];
|
||||
public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) {
|
||||
Vec3U16 p1 = Clamp(marks[0]), p2 = Clamp(marks[1]);
|
||||
if (Math.Abs(p2.X - p1.X) > Math.Abs(p2.Z - p1.Z))
|
||||
dirX = p2.X > p1.X? 1 : -1;
|
||||
else
|
||||
|
8
GUI/PropertyWindow.Designer.cs
generated
8
GUI/PropertyWindow.Designer.cs
generated
@ -487,7 +487,7 @@ namespace MCGalaxy.Gui
|
||||
//
|
||||
// tabChat
|
||||
//
|
||||
this.tabChat.BackColor = System.Drawing.Color.White;
|
||||
this.tabChat.BackColor = System.Drawing.SystemColors.Control;
|
||||
this.tabChat.Controls.Add(this.chat_gbTab);
|
||||
this.tabChat.Controls.Add(this.chat_gbMessages);
|
||||
this.tabChat.Controls.Add(this.chat_gbOther);
|
||||
@ -2221,7 +2221,7 @@ namespace MCGalaxy.Gui
|
||||
//
|
||||
// pageMisc
|
||||
//
|
||||
this.pageMisc.BackColor = System.Drawing.Color.White;
|
||||
this.pageMisc.BackColor = System.Drawing.SystemColors.Control;
|
||||
this.pageMisc.Controls.Add(this.economyGroupBox);
|
||||
this.pageMisc.Controls.Add(this.grpExtra);
|
||||
this.pageMisc.Controls.Add(this.grpMessages);
|
||||
@ -2527,7 +2527,7 @@ namespace MCGalaxy.Gui
|
||||
//
|
||||
// pageIRC
|
||||
//
|
||||
this.pageIRC.BackColor = System.Drawing.Color.White;
|
||||
this.pageIRC.BackColor = System.Drawing.SystemColors.Control;
|
||||
this.pageIRC.Controls.Add(this.grpSQL);
|
||||
this.pageIRC.Controls.Add(this.grpIRC);
|
||||
this.pageIRC.Location = new System.Drawing.Point(4, 22);
|
||||
@ -2759,7 +2759,7 @@ namespace MCGalaxy.Gui
|
||||
//
|
||||
// pageServer
|
||||
//
|
||||
this.pageServer.BackColor = System.Drawing.Color.White;
|
||||
this.pageServer.BackColor = System.Drawing.SystemColors.Control;
|
||||
this.pageServer.Controls.Add(this.grpLevels);
|
||||
this.pageServer.Controls.Add(this.grpAdvanced);
|
||||
this.pageServer.Controls.Add(this.grpGeneral);
|
||||
|
@ -40,7 +40,7 @@ namespace MCGalaxy {
|
||||
ushort LiquidLevel;
|
||||
MapGenParams genParams;
|
||||
TreeDrawOp treeDrawer;
|
||||
Vec3U16[] treeCoords;
|
||||
Vec3S32[] treeCoords;
|
||||
|
||||
public bool GenerateMap(Level Lvl, string type, int seed = 0, bool useSeed = false) {
|
||||
DateTime startTime = DateTime.UtcNow;
|
||||
@ -52,7 +52,7 @@ namespace MCGalaxy {
|
||||
treeDrawer = new TreeDrawOp();
|
||||
treeDrawer.random = rand;
|
||||
treeDrawer.method = DrawOp.M_SetTile;
|
||||
treeCoords = new Vec3U16[1];
|
||||
treeCoords = new Vec3S32[1];
|
||||
}
|
||||
|
||||
try
|
||||
|
@ -123,7 +123,7 @@ namespace MCGalaxy.BlockPhysics {
|
||||
TreeDrawOp op = new TreeDrawOp();
|
||||
op.random = rand;
|
||||
op.method = DrawOp.M_BlockChange;
|
||||
op.Perform(new [] { new Vec3U16(x, y, z) }, null, lvl, null);
|
||||
op.Perform(new [] { new Vec3S32(x, y, z) }, null, lvl, null);
|
||||
C.data.Data = 255;
|
||||
}
|
||||
|
||||
|
@ -35,7 +35,7 @@ namespace MCGalaxy.Util {
|
||||
|
||||
protected abstract void ReadUndoData(List<Player.UndoPos> buffer, string path);
|
||||
|
||||
protected abstract bool UndoEntry(Player p, string path, Vec3U16[] marks,
|
||||
protected abstract bool UndoEntry(Player p, string path, Vec3S32[] marks,
|
||||
ref byte[] temp, DateTime start);
|
||||
|
||||
protected abstract bool HighlightEntry(Player p, string path,
|
||||
@ -62,7 +62,7 @@ namespace MCGalaxy.Util {
|
||||
NewFormat.SaveUndoData(p.UndoBuffer, path);
|
||||
}
|
||||
|
||||
public static void UndoPlayer(Player p, string target, Vec3U16[] marks, DateTime start, ref bool FoundUser) {
|
||||
public static void UndoPlayer(Player p, string target, Vec3S32[] marks, DateTime start, ref bool FoundUser) {
|
||||
FilterEntries(p, undoDir, target, marks, start, false, ref FoundUser);
|
||||
FilterEntries(p, prevUndoDir, target, marks, start, false, ref FoundUser);
|
||||
}
|
||||
@ -72,7 +72,7 @@ namespace MCGalaxy.Util {
|
||||
FilterEntries(p, prevUndoDir, target, null, start, true, ref FoundUser);
|
||||
}
|
||||
|
||||
static void FilterEntries(Player p, string dir, string name, Vec3U16[] marks,
|
||||
static void FilterEntries(Player p, string dir, string name, Vec3S32[] marks,
|
||||
DateTime start, bool highlight, ref bool FoundUser) {
|
||||
string path = Path.Combine(dir, name);
|
||||
if (!Directory.Exists(path))
|
||||
|
@ -60,12 +60,12 @@ namespace MCGalaxy.Util {
|
||||
}
|
||||
}
|
||||
|
||||
protected override bool UndoEntry(Player p, string path, Vec3U16[] marks,
|
||||
protected override bool UndoEntry(Player p, string path, Vec3S32[] marks,
|
||||
ref byte[] temp, DateTime start) {
|
||||
List<ChunkHeader> list = new List<ChunkHeader>();
|
||||
int timeDelta = (int)DateTime.UtcNow.Subtract(Server.StartTime).TotalSeconds;
|
||||
Player.UndoPos Pos = default(Player.UndoPos);
|
||||
Vec3U16 min = marks[0], max = marks[1];
|
||||
Vec3U16 min = (Vec3U16)marks[0], max = (Vec3U16)marks[1];
|
||||
bool undoArea = min.X != ushort.MaxValue;
|
||||
|
||||
using (Stream fs = File.OpenRead(path))
|
||||
|
@ -131,12 +131,12 @@ namespace MCGalaxy.Util {
|
||||
}
|
||||
}
|
||||
|
||||
protected override bool UndoEntry(Player p, string path, Vec3U16[] marks,
|
||||
protected override bool UndoEntry(Player p, string path, Vec3S32[] marks,
|
||||
ref byte[] temp, DateTime start) {
|
||||
List<ChunkHeader> list = new List<ChunkHeader>();
|
||||
int timeDelta = (int)DateTime.UtcNow.Subtract(Server.StartTime).TotalSeconds;
|
||||
Player.UndoPos Pos = default(Player.UndoPos);
|
||||
Vec3U16 min = marks[0], max = marks[1];
|
||||
Vec3U16 min = (Vec3U16)marks[0], max = (Vec3U16)marks[1];
|
||||
bool undoArea = min.X != ushort.MaxValue;
|
||||
UndoCacheItem item = default(UndoCacheItem);
|
||||
|
||||
|
@ -59,12 +59,12 @@ namespace MCGalaxy.Util {
|
||||
}
|
||||
}
|
||||
|
||||
protected override bool UndoEntry(Player p, string path, Vec3U16[] marks,
|
||||
protected override bool UndoEntry(Player p, string path, Vec3S32[] marks,
|
||||
ref byte[] temp, DateTime start) {
|
||||
Player.UndoPos Pos = default(Player.UndoPos);
|
||||
int timeDelta = (int)DateTime.UtcNow.Subtract(Server.StartTime).TotalSeconds;
|
||||
string[] lines = File.ReadAllText(path).Split(' ');
|
||||
Vec3U16 min = marks[0], max = marks[1];
|
||||
Vec3U16 min = (Vec3U16)marks[0], max = (Vec3U16)marks[1];
|
||||
bool undoArea = min.X != ushort.MaxValue;
|
||||
BufferedBlockSender buffer = new BufferedBlockSender(null);
|
||||
string last = null;
|
||||
|
@ -114,8 +114,12 @@ namespace MCGalaxy {
|
||||
return new Vec3U16((ushort)(a.X + b.X), (ushort)(a.Y + b.Y), (ushort)(a.Z + b.Z));
|
||||
}
|
||||
|
||||
public static Vec3S16 operator - (Vec3U16 a, Vec3U16 b) {
|
||||
return new Vec3S16((short)(a.X - b.X), (short)(a.Y - b.Y), (short)(a.Z - b.Z));
|
||||
public static Vec3S32 operator - (Vec3U16 a, Vec3U16 b) {
|
||||
return new Vec3S32(a.X - b.X, a.Y - b.Y, a.Z - b.Z);
|
||||
}
|
||||
|
||||
public static explicit operator Vec3U16(Vec3S32 a) {
|
||||
return new Vec3U16((ushort)a.X, (ushort)a.Y, (ushort)a.Z);
|
||||
}
|
||||
|
||||
public override string ToString() {
|
||||
@ -127,19 +131,19 @@ namespace MCGalaxy {
|
||||
}
|
||||
}
|
||||
|
||||
public struct Vec3S16 {
|
||||
public struct Vec3S32 {
|
||||
|
||||
public short X, Y, Z;
|
||||
public int X, Y, Z;
|
||||
|
||||
public Vec3S16(short x, short y, short z) {
|
||||
public Vec3S32(int x, int y, int z) {
|
||||
X = x; Y = y; Z = z;
|
||||
}
|
||||
|
||||
public override bool Equals(object obj) {
|
||||
return (obj is Vec3S16) && Equals((Vec3S16)obj);
|
||||
return (obj is Vec3S32) && Equals((Vec3S32)obj);
|
||||
}
|
||||
|
||||
public bool Equals(Vec3S16 other) {
|
||||
public bool Equals(Vec3S32 other) {
|
||||
return X == other.X & Y == other.Y && Z == other.Z;
|
||||
}
|
||||
|
||||
@ -155,13 +159,33 @@ namespace MCGalaxy {
|
||||
|
||||
public float Length { get { return (float)Math.Sqrt( X * X + Y * Y + Z * Z ); } }
|
||||
|
||||
public float Dot(Vec3S16 b) { return X * b.X + Y * b.Y + Z * b.Z; }
|
||||
public float Dot(Vec3S32 b) { return X * b.X + Y * b.Y + Z * b.Z; }
|
||||
|
||||
public static bool operator == (Vec3S16 a, Vec3S16 b) {
|
||||
public static Vec3S32 Max(Vec3S32 a, Vec3S32 b) {
|
||||
return new Vec3S32(Math.Max(a.X, b.X), Math.Max(a.Y, b.Y), Math.Max(a.Z, b.Z));
|
||||
}
|
||||
|
||||
public static Vec3S32 Min(Vec3S32 a, Vec3S32 b) {
|
||||
return new Vec3S32(Math.Min(a.X, b.X), Math.Min(a.Y, b.Y), Math.Min(a.Z, b.Z));
|
||||
}
|
||||
|
||||
public static implicit operator Vec3S32(Vec3U16 a) {
|
||||
return new Vec3S32(a.X, a.Y, a.Z);
|
||||
}
|
||||
|
||||
public static Vec3S32 operator + (Vec3S32 a, Vec3S32 b) {
|
||||
return new Vec3S32(a.X + b.X, a.Y + b.Y, a.Z + b.Z);
|
||||
}
|
||||
|
||||
public static Vec3S32 operator - (Vec3S32 a, Vec3S32 b) {
|
||||
return new Vec3S32(a.X - b.X, a.Y - b.Y, a.Z - b.Z);
|
||||
}
|
||||
|
||||
public static bool operator == (Vec3S32 a, Vec3S32 b) {
|
||||
return a.X == b.X && a.Y == b.Y && a.Z == b.Z;
|
||||
}
|
||||
|
||||
public static bool operator != (Vec3S16 a, Vec3S16 b) {
|
||||
public static bool operator != (Vec3S32 a, Vec3S32 b) {
|
||||
return a.X != b.X || a.Y != b.Y || a.Z != b.Z;
|
||||
}
|
||||
|
||||
@ -218,10 +242,9 @@ namespace MCGalaxy {
|
||||
return new Vec3F32(a.X + b.X, a.Y + b.Y, a.Z + b.Z);
|
||||
}
|
||||
|
||||
public static implicit operator Vec3F32(Vec3U16 a) {
|
||||
public static implicit operator Vec3F32(Vec3S32 a) {
|
||||
return new Vec3F32(a.X, a.Y, a.Z);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public override bool Equals(object obj) {
|
||||
return (obj is Vec3F32) && Equals((Vec3F32)obj);
|
||||
|
Loading…
x
Reference in New Issue
Block a user