mirror of
https://github.com/ClassiCube/MCGalaxy.git
synced 2025-09-22 12:05:51 -04:00
And make even more commands use selection methods. if (BlockChange != null) no longer adds an entry to the BlockDB.
This commit is contained in:
parent
6ae7031e26
commit
75108aac21
@ -74,45 +74,34 @@ namespace MCGalaxy.Commands.Building {
|
||||
}
|
||||
|
||||
void HandleOther(Player p, string opt, string[] parts, int allowoffset) {
|
||||
CatchPos cpos = default(CatchPos);
|
||||
p.copyoffset[0] = 0; p.copyoffset[1] = 0; p.copyoffset[2] = 0;
|
||||
cpos.allowoffset = allowoffset;
|
||||
CopyArgs cArgs = default(CopyArgs);
|
||||
p.copyoffset = default(Vec3S32);
|
||||
cArgs.allowoffset = allowoffset;
|
||||
|
||||
if (opt == "cut") {
|
||||
cpos.type = 1;
|
||||
cArgs.type = 1;
|
||||
} else if (opt == "air") {
|
||||
cpos.type = 2;
|
||||
cArgs.type = 2;
|
||||
} else if (!String.IsNullOrEmpty(opt)) {
|
||||
Help(p); return;
|
||||
}
|
||||
|
||||
p.blockchangeObject = cpos;
|
||||
Player.Message(p, "Place two blocks to determine the edges.");
|
||||
p.ClearBlockchange();
|
||||
p.Blockchange += PlacedMark1;
|
||||
p.MakeSelection(2, cArgs, DoCopy);
|
||||
}
|
||||
|
||||
void PlacedMark1(Player p, ushort x, ushort y, ushort z, byte type, byte extType) {
|
||||
RevertAndClearState(p, x, y, z);
|
||||
CatchPos bp = (CatchPos)p.blockchangeObject;
|
||||
p.copystart[0] = x; p.copystart[1] = y; p.copystart[2] = z;
|
||||
|
||||
bp.x = x; bp.y = y; bp.z = z; p.blockchangeObject = bp;
|
||||
p.Blockchange += PlacedMark2;
|
||||
}
|
||||
|
||||
void PlacedMark2(Player p, ushort x, ushort y, ushort z, byte type, byte extType) {
|
||||
RevertAndClearState(p, x, y, z);
|
||||
CatchPos cpos = (CatchPos)p.blockchangeObject;
|
||||
ushort minX = (ushort)Math.Min(x, cpos.x), maxX = (ushort)Math.Max(x, cpos.x);
|
||||
ushort minY = (ushort)Math.Min(y, cpos.y), maxY = (ushort)Math.Max(y, cpos.y);
|
||||
ushort minZ = (ushort)Math.Min(z, cpos.z), maxZ = (ushort)Math.Max(z, cpos.z);
|
||||
bool DoCopy(Player p, Vec3S32[] m, object state, byte type, byte extType) {
|
||||
p.copystart = m[0];
|
||||
CopyArgs cArgs = (CopyArgs)state;
|
||||
ushort minX = (ushort)Math.Min(m[0].X, m[1].X), maxX = (ushort)Math.Max(m[0].X, m[1].X);
|
||||
ushort minY = (ushort)Math.Min(m[0].Y, m[1].Y), maxY = (ushort)Math.Max(m[0].Y, m[1].Y);
|
||||
ushort minZ = (ushort)Math.Min(m[0].Z, m[1].Z), maxZ = (ushort)Math.Max(m[0].Z, m[1].Z);
|
||||
|
||||
CopyState state = new CopyState(minX, minY, minZ, maxX - minX + 1,
|
||||
CopyState cState = new CopyState(minX, minY, minZ, maxX - minX + 1,
|
||||
maxY - minY + 1, maxZ - minZ + 1);
|
||||
state.SetOrigin(cpos.x, cpos.y, cpos.z);
|
||||
int index = 0; state.UsedBlocks = 0;
|
||||
state.PasteAir = cpos.type == 2;
|
||||
cState.SetOrigin(m[0].X, m[0].Y, m[0].Z);
|
||||
int index = 0; cState.UsedBlocks = 0;
|
||||
cState.PasteAir = cArgs.type == 2;
|
||||
|
||||
for (ushort yy = minY; yy <= maxY; ++yy)
|
||||
for (ushort zz = minZ; zz <= maxZ; ++zz)
|
||||
@ -123,22 +112,22 @@ namespace MCGalaxy.Commands.Building {
|
||||
if (b == Block.custom_block)
|
||||
extB = p.level.GetExtTile(xx, yy, zz);
|
||||
|
||||
if (b != Block.air || state.PasteAir)
|
||||
state.UsedBlocks++;
|
||||
state.Blocks[index] = b;
|
||||
state.ExtBlocks[index] = extB;
|
||||
if (b != Block.air || cState.PasteAir)
|
||||
cState.UsedBlocks++;
|
||||
cState.Blocks[index] = b;
|
||||
cState.ExtBlocks[index] = extB;
|
||||
index++;
|
||||
}
|
||||
|
||||
if (state.UsedBlocks > p.group.maxBlocks) {
|
||||
if (cState.UsedBlocks > p.group.maxBlocks) {
|
||||
Player.Message(p, "You tried to copy {0} blocks. You cannot copy more than {1} blocks.",
|
||||
state.UsedBlocks, p.group.maxBlocks);
|
||||
state.Blocks = null; state.ExtBlocks = null; state = null;
|
||||
return;
|
||||
cState.UsedBlocks, p.group.maxBlocks);
|
||||
cState.Blocks = null; cState.ExtBlocks = null; cState = null;
|
||||
return false;
|
||||
}
|
||||
|
||||
p.CopyBuffer = state;
|
||||
if (cpos.type == 1) {
|
||||
p.CopyBuffer = cState;
|
||||
if (cArgs.type == 1) {
|
||||
DrawOp op = new CuboidDrawOp();
|
||||
Brush brush = new SolidBrush(Block.air, 0);
|
||||
Vec3S32[] marks = { new Vec3S32(minX, minY, minZ), new Vec3S32(maxX, maxY, maxZ) };
|
||||
@ -146,21 +135,20 @@ namespace MCGalaxy.Commands.Building {
|
||||
}
|
||||
|
||||
string format = "Copied &a{0} %Sblocks." +
|
||||
(state.PasteAir ? "" : " To also copy air blocks, use %T/copy air");
|
||||
Player.Message(p, format, state.UsedBlocks);
|
||||
if (cpos.allowoffset != -1) {
|
||||
(cState.PasteAir ? "" : " To also copy air blocks, use %T/copy air");
|
||||
Player.Message(p, format, cState.UsedBlocks);
|
||||
if (cArgs.allowoffset != -1) {
|
||||
Player.Message(p, "Place a block to determine where to paste from");
|
||||
p.Blockchange += Blockchange3;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void Blockchange3(Player p, ushort x, ushort y, ushort z, byte type, byte extType) {
|
||||
RevertAndClearState(p, x, y, z);
|
||||
CatchPos cpos = (CatchPos)p.blockchangeObject;
|
||||
|
||||
p.copyoffset[0] = (p.copystart[0] - x);
|
||||
p.copyoffset[1] = (p.copystart[1] - y);
|
||||
p.copyoffset[2] = (p.copystart[2] - z);
|
||||
p.copyoffset.X = p.copystart.X - x;
|
||||
p.copyoffset.Y = p.copystart.Y - y;
|
||||
p.copyoffset.Z = p.copystart.Z - z;
|
||||
}
|
||||
|
||||
void SaveCopy(Player p, string file) {
|
||||
@ -206,7 +194,7 @@ namespace MCGalaxy.Commands.Building {
|
||||
Player.Message(p, "Loaded copy as " + file);
|
||||
}
|
||||
|
||||
struct CatchPos { public ushort x, y, z; public int type; public int allowoffset; }
|
||||
struct CopyArgs { public int type, allowoffset; }
|
||||
|
||||
public override void Help(Player p) {
|
||||
Player.Message(p, "/copy - Copies the blocks in an area.");
|
||||
|
@ -32,7 +32,7 @@ namespace MCGalaxy.Commands.Building {
|
||||
|
||||
protected override bool DoDraw(Player p, Vec3S32[] marks, object state, byte type, byte extType) {
|
||||
DrawArgs cpos = (DrawArgs)state;
|
||||
GetRealBlock(type, extType, p, ref cpos);
|
||||
cpos.type = type; cpos.extType = extType;
|
||||
DrawOp op = null;
|
||||
Func<BrushArgs, Brush> constructor = null;
|
||||
|
||||
|
@ -44,7 +44,7 @@ namespace MCGalaxy.Commands.Building {
|
||||
|
||||
protected override bool DoDraw(Player p, Vec3S32[] m, object state, byte type, byte extType) {
|
||||
DrawArgs cpos = (DrawArgs)state;
|
||||
GetRealBlock(type, extType, p, ref cpos);
|
||||
cpos.type = type; cpos.extType = extType;
|
||||
AdvDrawOp op = null;
|
||||
switch (cpos.mode) {
|
||||
case DrawMode.cone:
|
||||
|
@ -18,7 +18,7 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace MCGalaxy.Commands.Building {
|
||||
public sealed class CmdDrill : Command {
|
||||
public sealed class CmdDrill : Command {
|
||||
public override string name { get { return "drill"; } }
|
||||
public override string shortcut { get { return ""; } }
|
||||
public override string type { get { return CommandTypes.Building; } }
|
||||
@ -26,39 +26,31 @@ namespace MCGalaxy.Commands.Building {
|
||||
public override LevelPermission defaultRank { get { return LevelPermission.Operator; } }
|
||||
|
||||
public override void Use(Player p, string message) {
|
||||
CatchPos cpos = default(CatchPos);
|
||||
cpos.dist = 20;
|
||||
|
||||
if (message != "" && !int.TryParse(message, out cpos.dist)) {
|
||||
Help(p); return;
|
||||
}
|
||||
|
||||
p.blockchangeObject = cpos;
|
||||
int dist = 20;
|
||||
if (message != "" && !int.TryParse(message, out dist)) { Help(p); return; }
|
||||
Player.Message(p, "Destroy the block you wish to drill.");
|
||||
p.ClearBlockchange();
|
||||
p.Blockchange += Blockchange1;
|
||||
p.MakeSelection(1, dist, DoDrill);
|
||||
}
|
||||
|
||||
void Blockchange1(Player p, ushort x, ushort y, ushort z, byte type, byte extType) {
|
||||
if (!p.staticCommands) p.ClearBlockchange();
|
||||
CatchPos cpos = (CatchPos)p.blockchangeObject;
|
||||
bool DoDrill(Player p, Vec3S32[] marks, object state, byte type, byte extType) {
|
||||
ushort x = (ushort)marks[0].X, y = (ushort)marks[0].Y, z = (ushort)marks[0].Z;
|
||||
type = p.level.GetTile(x, y, z); extType = 0;
|
||||
if (type == Block.custom_block) extType = p.level.GetExtTile(x, y, z);
|
||||
p.RevertBlock(x, y, z);
|
||||
if (type == Block.custom_block)
|
||||
extType = p.level.GetExtTile(x, y, z);
|
||||
int dist = (int)state;
|
||||
|
||||
int diffX = 0, diffZ = 0;
|
||||
|
||||
if (p.rot[0] <= 32 || p.rot[0] >= 224) { diffZ = -1; }
|
||||
else if (p.rot[0] <= 96) { diffX = 1; }
|
||||
else if (p.rot[0] <= 160) { diffZ = 1; }
|
||||
else diffX = -1;
|
||||
int dx = 0, dz = 0;
|
||||
if (p.rot[0] <= 32 || p.rot[0] >= 224) { dz = -1; }
|
||||
else if (p.rot[0] <= 96) { dx = 1; }
|
||||
else if (p.rot[0] <= 160) { dz = 1; }
|
||||
else dx = -1;
|
||||
|
||||
List<int> buffer = new List<int>();
|
||||
int depth = 0;
|
||||
Level lvl = p.level;
|
||||
|
||||
if (diffX != 0) {
|
||||
for (ushort xx = x; depth < cpos.dist; xx += (ushort)diffX)
|
||||
if (dx != 0) {
|
||||
for (ushort xx = x; depth < dist; xx += (ushort)dx)
|
||||
{
|
||||
for (ushort yy = (ushort)(y - 1); yy <= (ushort)(y + 1); yy++)
|
||||
for (ushort zz = (ushort)(z - 1); zz <= (ushort)(z + 1); zz++)
|
||||
@ -68,7 +60,7 @@ namespace MCGalaxy.Commands.Building {
|
||||
depth++;
|
||||
}
|
||||
} else {
|
||||
for (ushort zz = z; depth < cpos.dist; zz += (ushort)diffZ)
|
||||
for (ushort zz = z; depth < dist; zz += (ushort)dz)
|
||||
{
|
||||
for (ushort yy = (ushort)(y - 1); yy <= (ushort)(y + 1); yy++)
|
||||
for (ushort xx = (ushort)(x - 1); xx <= (ushort)(x + 1); xx++)
|
||||
@ -82,7 +74,7 @@ namespace MCGalaxy.Commands.Building {
|
||||
if (buffer.Count > p.group.maxBlocks) {
|
||||
Player.Message(p, "You tried to drill " + buffer.Count + " blocks.");
|
||||
Player.Message(p, "You cannot drill more than " + p.group.maxBlocks + ".");
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
foreach (int index in buffer) {
|
||||
@ -95,9 +87,8 @@ namespace MCGalaxy.Commands.Building {
|
||||
if (sameBlock) p.level.UpdateBlock(p, x, y, z, Block.air, 0);
|
||||
}
|
||||
Player.Message(p, "Drilled " + buffer.Count + " blocks.");
|
||||
return true;
|
||||
}
|
||||
|
||||
struct CatchPos { public int dist; }
|
||||
|
||||
public override void Help(Player p) {
|
||||
Player.Message(p, "%T/drill [distance]");
|
||||
|
@ -45,7 +45,7 @@ namespace MCGalaxy.Commands.Building {
|
||||
if (oldType == Block.custom_block)
|
||||
oldExtType = p.level.GetExtTile(x, y, z);
|
||||
|
||||
GetRealBlock(type, extType, p, ref cpos);
|
||||
cpos.type = type; cpos.extType = extType;
|
||||
if (!Block.canPlace(p, oldType) && !Block.BuildIn(oldType)) {
|
||||
Player.Message(p, "Cannot fill with that."); return false;
|
||||
}
|
||||
|
@ -54,7 +54,7 @@ namespace MCGalaxy.Commands.Building {
|
||||
|
||||
protected override bool DoDraw(Player p, Vec3S32[] m, object state, byte type, byte extType) {
|
||||
DrawArgs cpos = (DrawArgs)state;
|
||||
GetRealBlock(type, extType, p, ref cpos);
|
||||
cpos.type = type; cpos.extType = extType;
|
||||
|
||||
if (cpos.mode == DrawMode.straight) {
|
||||
int dx = Math.Abs(m[0].X - m[1].X), dy = Math.Abs(m[0].Y - m[1].Y), dz = Math.Abs(m[0].Z - m[1].Z);
|
||||
|
@ -28,49 +28,38 @@ namespace MCGalaxy.Commands.Building {
|
||||
public override bool museumUsable { get { return false; } }
|
||||
public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } }
|
||||
public override CommandAlias[] Aliases {
|
||||
get { return new[] { new CommandAlias("pn", "not") }; }
|
||||
get { return new[] { new CommandAlias("pastenot", "not"), new CommandAlias("pn", "not") }; }
|
||||
}
|
||||
|
||||
public override void Use(Player p, string message) {
|
||||
if (p.CopyBuffer == null) { Player.Message(p, "You haven't copied anything yet"); return; }
|
||||
|
||||
CatchPos cpos = default(CatchPos);
|
||||
cpos.message = message;
|
||||
p.blockchangeObject = cpos;
|
||||
Player.Message(p, "Place a block in the corner of where you want to paste.");
|
||||
p.ClearBlockchange();
|
||||
p.Blockchange += PlacedOrigin;
|
||||
p.MakeSelection(1, message, DoPaste);
|
||||
}
|
||||
|
||||
void PlacedOrigin(Player p, ushort x, ushort y, ushort z, byte type, byte extType) {
|
||||
CatchPos cpos = (CatchPos)p.blockchangeObject;
|
||||
RevertAndClearState(p, x, y, z);
|
||||
int x1 = p.copyoffset[0] + x, y1 = p.copyoffset[1] + y, z1 = p.copyoffset[2] + z;
|
||||
CopyState state = p.CopyBuffer;
|
||||
if (state.X != state.OriginX) x1 -= (state.Width - 1);
|
||||
if (state.Y != state.OriginY) y1 -= (state.Height - 1);
|
||||
if (state.Z != state.OriginZ) z1 -= (state.Length - 1);
|
||||
bool DoPaste(Player p, Vec3S32[] m, object state, byte type, byte extType) {
|
||||
string message = (string)state;
|
||||
m[0] += p.copyoffset;
|
||||
CopyState cState = p.CopyBuffer;
|
||||
if (cState.X != cState.OriginX) m[0].X -= (cState.Width - 1);
|
||||
if (cState.Y != cState.OriginY) m[0].Y -= (cState.Height - 1);
|
||||
if (cState.Z != cState.OriginZ) m[0].Z -= (cState.Length - 1);
|
||||
|
||||
DrawOp op;
|
||||
if (cpos.message == "") {
|
||||
if (message == "") {
|
||||
op = new SimplePasteDrawOp();
|
||||
((SimplePasteDrawOp)op).CopyState = p.CopyBuffer;
|
||||
} else {
|
||||
op = new PasteDrawOp();
|
||||
((PasteDrawOp)op).CopyState = p.CopyBuffer;
|
||||
string[] args = cpos.message.Split(' ');
|
||||
string[] args = message.Split(' ');
|
||||
if (args[0].CaselessEq("not"))
|
||||
((PasteDrawOp)op).Exclude = ReplaceBrush.GetBlocks(p, 1, args.Length, args);
|
||||
else
|
||||
((PasteDrawOp)op).Include = ReplaceBrush.GetBlocks(p, 0, args.Length, args);
|
||||
}
|
||||
Vec3S32[] marks = { new Vec3S32(x1, y1, z1) };
|
||||
if (!DrawOp.DoDrawOp(op, null, p, marks))
|
||||
return;
|
||||
if (p.staticCommands) p.Blockchange += PlacedOrigin;
|
||||
}
|
||||
|
||||
struct CatchPos { public string message; }
|
||||
return DrawOp.DoDrawOp(op, null, p, m);
|
||||
}
|
||||
|
||||
public override void Help(Player p) {
|
||||
Player.Message(p, "/paste - Pastes the stored copy.");
|
||||
|
@ -27,8 +27,8 @@ namespace MCGalaxy.Commands.Building {
|
||||
|
||||
protected override bool DoDraw(Player p, Vec3S32[] marks, object state, byte type, byte extType) {
|
||||
DrawArgs cpos = (DrawArgs)state;
|
||||
GetRealBlock(type, extType, p, ref cpos);
|
||||
DrawOp drawOp = null;
|
||||
cpos.type = type; cpos.extType = extType;
|
||||
DrawOp op = null;
|
||||
int brushOffset = cpos.mode == DrawMode.normal ? 0 : 1;
|
||||
Brush brush = GetBrush(p, cpos, brushOffset);
|
||||
if (brush == null) return false;
|
||||
@ -40,13 +40,13 @@ namespace MCGalaxy.Commands.Building {
|
||||
switch (cpos.mode) {
|
||||
case DrawMode.solid:
|
||||
case DrawMode.normal:
|
||||
drawOp = new PyramidSolidDrawOp(); break;
|
||||
op = new PyramidSolidDrawOp(); break;
|
||||
case DrawMode.hollow:
|
||||
drawOp = new PyramidHollowDrawOp(); break;
|
||||
op = new PyramidHollowDrawOp(); break;
|
||||
case DrawMode.reverse:
|
||||
drawOp = new PyramidReverseDrawOp(); break;
|
||||
op = new PyramidReverseDrawOp(); break;
|
||||
}
|
||||
return DrawOp.DoDrawOp(drawOp, brush, p, marks);
|
||||
return DrawOp.DoDrawOp(op, brush, p, marks);
|
||||
}
|
||||
|
||||
protected override DrawMode ParseMode(string msg) {
|
||||
|
@ -41,7 +41,6 @@ namespace MCGalaxy.Commands.Building {
|
||||
}
|
||||
|
||||
bool DoReplace(Player p, Vec3S32[] marks, object state, byte type, byte extType) {
|
||||
type = type < 128 ? p.bindings[type] : type;
|
||||
string[] parts = ((string)state).SplitSpaces(3);
|
||||
if (parts.Length < 2) { Help(p); return false; }
|
||||
|
||||
|
@ -29,37 +29,34 @@ namespace MCGalaxy.Commands.Building {
|
||||
public CmdRestartPhysics() { }
|
||||
|
||||
public override void Use(Player p, string message) {
|
||||
CatchPos cpos = default(CatchPos);
|
||||
PhysicsArgs extraInfo = default(PhysicsArgs);
|
||||
message = message.ToLower();
|
||||
if (message != "" && !ParseArgs(p, message, ref cpos)) return;
|
||||
if (message != "" && !ParseArgs(p, message, ref extraInfo)) return;
|
||||
|
||||
p.blockchangeObject = cpos;
|
||||
Player.Message(p, "Place two blocks to determine the edges.");
|
||||
p.ClearBlockchange();
|
||||
p.Blockchange += PlacedMark1;
|
||||
p.MakeSelection(2, extraInfo, DoRestart);
|
||||
}
|
||||
|
||||
bool ParseArgs(Player p, string message, ref CatchPos cpos) {
|
||||
bool ParseArgs(Player p, string message, ref PhysicsArgs extraInfo) {
|
||||
string[] parts = message.Split(' ');
|
||||
if (parts.Length % 2 == 1) {
|
||||
Player.Message(p, "Number of parameters must be even");
|
||||
Help(p); return false;
|
||||
}
|
||||
PhysicsArgs args = default(PhysicsArgs);
|
||||
}
|
||||
byte type = 0, value = 0;
|
||||
|
||||
if (parts.Length >= 2) {
|
||||
if (!Parse(p, parts[0], parts[1], ref type, ref value)) return false;
|
||||
args.Type1 = type; args.Value1 = value;
|
||||
extraInfo.Type1 = type; extraInfo.Value1 = value;
|
||||
}
|
||||
if (parts.Length >= 4) {
|
||||
if (!Parse(p, parts[2], parts[3], ref type, ref value)) return false;
|
||||
args.Type2 = type; args.Value2 = value;
|
||||
extraInfo.Type2 = type; extraInfo.Value2 = value;
|
||||
}
|
||||
if (parts.Length >= 6) {
|
||||
Player.Message(p, "You can only use up to two types of physics."); return false;
|
||||
}
|
||||
cpos.extraInfo = args; return true;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Parse(Player p, string name, string arg, ref byte type, ref byte value) {
|
||||
@ -90,47 +87,36 @@ namespace MCGalaxy.Commands.Building {
|
||||
return false;
|
||||
}
|
||||
|
||||
void PlacedMark1(Player p, ushort x, ushort y, ushort z, byte type, byte extType) {
|
||||
RevertAndClearState(p, x, y, z);
|
||||
CatchPos bp = (CatchPos)p.blockchangeObject;
|
||||
bp.x = x; bp.y = y; bp.z = z; p.blockchangeObject = bp;
|
||||
p.Blockchange += PlacedMark2;
|
||||
}
|
||||
|
||||
void PlacedMark2(Player p, ushort x, ushort y, ushort z, byte type, byte extType) {
|
||||
RevertAndClearState(p, x, y, z);
|
||||
CatchPos cpos = (CatchPos)p.blockchangeObject;
|
||||
bool DoRestart(Player p, Vec3S32[] m, object state, byte type, byte extType) {
|
||||
PhysicsArgs extraInfo = (PhysicsArgs)state;
|
||||
List<int> buffer = new List<int>();
|
||||
|
||||
for (ushort yy = Math.Min(cpos.y, y); yy <= Math.Max(cpos.y, y); ++yy)
|
||||
for (ushort zz = Math.Min(cpos.z, z); zz <= Math.Max(cpos.z, z); ++zz)
|
||||
for (ushort xx = Math.Min(cpos.x, x); xx <= Math.Max(cpos.x, x); ++xx)
|
||||
for (int y = Math.Min(m[0].Y, m[1].Y); y <= Math.Max(m[0].Y, m[1].Y); y++)
|
||||
for (int z = Math.Min(m[0].Z, m[1].Z); z <= Math.Max(m[0].Z, m[1].Z); z++)
|
||||
for (int x = Math.Min(m[0].X, m[1].X); x <= Math.Max(m[0].X, m[1].X); x++)
|
||||
{
|
||||
int index = p.level.PosToInt(xx, yy, zz);
|
||||
int index = p.level.PosToInt((ushort)x, (ushort)y, (ushort)z);
|
||||
if (index >= 0 && p.level.blocks[index] != Block.air)
|
||||
buffer.Add(index);
|
||||
}
|
||||
|
||||
if (cpos.extraInfo.Raw == 0) {
|
||||
if (extraInfo.Raw == 0) {
|
||||
if (buffer.Count > Server.rpNormLimit) {
|
||||
Player.Message(p, "Cannot restart more than " + Server.rpNormLimit + " blocks.");
|
||||
Player.Message(p, "Tried to restart " + buffer.Count + " blocks.");
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
} else if (buffer.Count > Server.rpLimit) {
|
||||
Player.Message(p, "Tried to add physics to " + buffer.Count + " blocks.");
|
||||
Player.Message(p, "Cannot add physics to more than " + Server.rpLimit + " blocks.");
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
foreach (int index in buffer)
|
||||
p.level.AddCheck(index, true, cpos.extraInfo);
|
||||
p.level.AddCheck(index, true, extraInfo);
|
||||
Player.Message(p, "Activated " + buffer.Count + " blocks.");
|
||||
if (p.staticCommands)
|
||||
p.Blockchange += PlacedMark1;
|
||||
return true;
|
||||
}
|
||||
|
||||
struct CatchPos { public ushort x, y, z; public PhysicsArgs extraInfo; }
|
||||
|
||||
public override void Help(Player p) {
|
||||
Player.Message(p, "/restartphysics ([type] [num]) ([type2] [num2]) - Restarts every physics block in an area");
|
||||
|
@ -37,7 +37,7 @@ namespace MCGalaxy.Commands.Building {
|
||||
|
||||
protected override bool DoDraw(Player p, Vec3S32[] m, object state, byte type, byte extType) {
|
||||
DrawArgs cpos = (DrawArgs)state;
|
||||
GetRealBlock(type, extType, p, ref cpos);
|
||||
cpos.type = type; cpos.extType = extType;
|
||||
|
||||
DrawOp op = null;
|
||||
Func<BrushArgs, Brush> constructor = null;
|
||||
|
@ -29,7 +29,7 @@ namespace MCGalaxy.Commands.Building {
|
||||
|
||||
protected override bool DoDraw(Player p, Vec3S32[] marks, object state, byte type, byte extType) {
|
||||
DrawArgs cpos = (DrawArgs)state;
|
||||
GetRealBlock(type, extType, p, ref cpos);
|
||||
cpos.type = type; cpos.extType = extType;
|
||||
DrawOp op = null;
|
||||
int brushOffset = cpos.mode == DrawMode.normal ? 0 : 1;
|
||||
Brush brush = GetBrush(p, cpos, brushOffset);
|
||||
|
@ -31,7 +31,7 @@ namespace MCGalaxy.Commands.Building {
|
||||
|
||||
protected override bool DoDraw(Player p, Vec3S32[] m, object state, byte type, byte extType) {
|
||||
DrawArgs cpos = (DrawArgs)state;
|
||||
GetRealBlock(type, extType, p, ref cpos);
|
||||
cpos.type = type; cpos.extType = extType;
|
||||
|
||||
DrawOp drawOp = new TorusDrawOp();
|
||||
Brush brush = GetBrush(p, cpos, 0);
|
||||
|
@ -44,20 +44,15 @@ namespace MCGalaxy.Commands.Building {
|
||||
default: brushMsg = message; break;
|
||||
}
|
||||
|
||||
CatchPos cpos = default(CatchPos);
|
||||
cpos.mode = mode;
|
||||
cpos.brushMsg = brushMsg;
|
||||
p.ClearBlockchange();
|
||||
p.blockchangeObject = cpos;
|
||||
p.Blockchange += PlacedBase;
|
||||
DrawArgs dArgs = default(DrawArgs);
|
||||
dArgs.mode = mode;
|
||||
dArgs.brushMsg = brushMsg;
|
||||
Player.Message(p, "Select where you wish your tree to grow");
|
||||
p.MakeSelection(1, dArgs, DoTree);
|
||||
}
|
||||
|
||||
void PlacedBase(Player p, ushort x, ushort y, ushort z, byte type, byte extType) {
|
||||
RevertAndClearState(p, x, y, z);
|
||||
CatchPos cpos = (CatchPos)p.blockchangeObject;
|
||||
type = type < 128 ? p.bindings[type] : type;
|
||||
|
||||
bool DoTree(Player p, Vec3S32[] marks, object state, byte type, byte extType) {
|
||||
DrawArgs cpos = (DrawArgs)state;
|
||||
TreeDrawOp op = new TreeDrawOp();
|
||||
op.Type = cpos.mode;
|
||||
op.random = p.random;
|
||||
@ -65,17 +60,12 @@ namespace MCGalaxy.Commands.Building {
|
||||
|
||||
if (cpos.brushMsg != "") {
|
||||
if (!p.group.CanExecute("brush")) {
|
||||
Player.Message(p, "You cannot use /brush, so therefore cannot use /tree with a brush."); return;
|
||||
Player.Message(p, "You cannot use /brush, so therefore cannot use /tree with a brush."); return false;
|
||||
}
|
||||
brush = ParseBrush(cpos.brushMsg, p, type, extType);
|
||||
if (brush == null) return;
|
||||
if (brush == null) return false;
|
||||
}
|
||||
|
||||
Vec3S32[] marks = { new Vec3S32(x, y, z) };
|
||||
if (!DrawOp.DoDrawOp(op, brush, p, marks))
|
||||
return;
|
||||
if (p.staticCommands)
|
||||
p.Blockchange += PlacedBase;
|
||||
return DrawOp.DoDrawOp(op, brush, p, marks);
|
||||
}
|
||||
|
||||
static Brush ParseBrush(string brushMsg, Player p, byte type, byte extType) {
|
||||
@ -92,7 +82,7 @@ namespace MCGalaxy.Commands.Building {
|
||||
return Brush.Brushes[brushName](args);
|
||||
}
|
||||
|
||||
struct CatchPos { public int mode; public string brushMsg; }
|
||||
struct DrawArgs { public int mode; public string brushMsg; }
|
||||
|
||||
public override void Help(Player p) {
|
||||
Player.Message(p, "%T/tree [type] %H- Draws a tree.");
|
||||
|
@ -30,7 +30,7 @@ namespace MCGalaxy.Commands.Building {
|
||||
|
||||
protected override bool DoDraw(Player p, Vec3S32[] marks, object state, byte type, byte extType) {
|
||||
DrawArgs cpos = (DrawArgs)state;
|
||||
GetRealBlock(type, extType, p, ref cpos);
|
||||
cpos.type = type; cpos.extType = extType;
|
||||
|
||||
Brush brush = GetBrush(p, cpos, 0, null);
|
||||
if (brush == null) return false;
|
||||
|
@ -49,7 +49,6 @@ namespace MCGalaxy.Commands.Building {
|
||||
}
|
||||
|
||||
bool DoWrite(Player p, Vec3S32[] marks, object state, byte type, byte extType) {
|
||||
type = type < 128 ? p.bindings[type] : type;
|
||||
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;
|
||||
|
@ -87,11 +87,6 @@ namespace MCGalaxy.Commands.Building {
|
||||
return constructor(args);
|
||||
}
|
||||
|
||||
protected static void GetRealBlock(byte type, byte extType, Player p, ref DrawArgs cpos) {
|
||||
cpos.type = type < 128 ? p.bindings[type] : type;
|
||||
cpos.extType = extType;
|
||||
}
|
||||
|
||||
protected struct DrawArgs {
|
||||
public DrawMode mode;
|
||||
public byte type, extType;
|
||||
|
@ -207,8 +207,7 @@ namespace MCGalaxy {
|
||||
|
||||
//Copy
|
||||
public CopyState CopyBuffer;
|
||||
public int[] copyoffset = new int[3] { 0, 0, 0 };
|
||||
public ushort[] copystart = new ushort[3] { 0, 0, 0 };
|
||||
public Vec3S32 copyoffset, copystart;
|
||||
|
||||
// GlobalBlock
|
||||
internal int gbStep = 0, gbTargetId = 0;
|
||||
|
@ -81,17 +81,10 @@ namespace MCGalaxy {
|
||||
bP.SetData(type, extType, false);
|
||||
|
||||
lastClick.X = x; lastClick.Y = y; lastClick.Z = z;
|
||||
if ( Blockchange != null ) {
|
||||
if ( Blockchange.Method.ToString().IndexOf("AboutBlockchange") == -1 && !level.IsMuseum ) {
|
||||
bP.flags |= 1;
|
||||
if (level.UseBlockDB)
|
||||
level.blockCache.Add(bP);
|
||||
}
|
||||
|
||||
Blockchange(this, x, y, z, type, extType);
|
||||
return;
|
||||
if (Blockchange != null) {
|
||||
Blockchange(this, x, y, z, type, extType); return;
|
||||
}
|
||||
if ( PlayerBlockChange != null )
|
||||
if (PlayerBlockChange != null)
|
||||
PlayerBlockChange(this, x, y, z, type, extType);
|
||||
OnBlockChangeEvent.Call(this, x, y, z, type, extType);
|
||||
if ( cancelBlock ) { cancelBlock = false; return; }
|
||||
|
@ -606,6 +606,7 @@ Next: continue;
|
||||
if (selIndex != selMarks.Length) return;
|
||||
|
||||
Blockchange = null;
|
||||
type = type < 128 ? p.bindings[type] : type;
|
||||
bool canRepeat = selCallback(this, selMarks, selState, type, extType);
|
||||
if (canRepeat && staticCommands)
|
||||
MakeSelection(selIndex, selState, selCallback);
|
||||
|
Loading…
x
Reference in New Issue
Block a user