mirror of
https://github.com/ClassiCube/MCGalaxy.git
synced 2025-09-23 04:32:50 -04:00
Reduce code duplication between /undo and /undoarea, cleanup /help for /undo and /undoarea.
This commit is contained in:
parent
7bb22c4c69
commit
461fb25729
@ -85,8 +85,8 @@ namespace MCGalaxy.Commands {
|
|||||||
public override void Help(Player p) {
|
public override void Help(Player p) {
|
||||||
Player.Message(p, "%T/highlight [player] <timespan>");
|
Player.Message(p, "%T/highlight [player] <timespan>");
|
||||||
Player.Message(p, "%HHighlights blocks modified by [player] in the past <timespan>");
|
Player.Message(p, "%HHighlights blocks modified by [player] in the past <timespan>");
|
||||||
|
Player.Message(p, "%H If <timespan> is not given, highlights for last 30 minutes");
|
||||||
Player.Message(p, "%H e.g. to highlight for 90 minutes, <timespan> would be %S1h30m");
|
Player.Message(p, "%H e.g. to highlight for 90 minutes, <timespan> would be %S1h30m");
|
||||||
Player.Message(p, "%HIf <timespan> is not given, highlights for last 30 minutes");
|
|
||||||
Player.Message(p, "&c/highlight cannot be disabled, use /reload to un-highlight");
|
Player.Message(p, "&c/highlight cannot be disabled, use /reload to un-highlight");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,25 +17,26 @@
|
|||||||
*/
|
*/
|
||||||
using System;
|
using System;
|
||||||
using MCGalaxy.Commands.Building;
|
using MCGalaxy.Commands.Building;
|
||||||
using MCGalaxy.Drawing.Ops;
|
|
||||||
|
|
||||||
namespace MCGalaxy.Commands {
|
namespace MCGalaxy.Commands {
|
||||||
|
|
||||||
public sealed class CmdUndoArea : Command {
|
public sealed class CmdUndoArea : CmdUndo {
|
||||||
public override string name { get { return "undoarea"; } }
|
public override string name { get { return "undoarea"; } }
|
||||||
public override string shortcut { get { return "ua"; } }
|
public override string shortcut { get { return "ua"; } }
|
||||||
public override string type { get { return CommandTypes.Building; } }
|
public override string type { get { return CommandTypes.Building; } }
|
||||||
public override bool museumUsable { get { return true; } }
|
public override bool museumUsable { get { return true; } }
|
||||||
public override LevelPermission defaultRank { get { return LevelPermission.Operator; } }
|
public override LevelPermission defaultRank { get { return LevelPermission.Operator; } }
|
||||||
|
public override CommandPerm[] ExtraPerms { get { return null; } }
|
||||||
|
public override CommandAlias[] Aliases { get { return null; } }
|
||||||
|
|
||||||
public override void Use(Player p, string message) {
|
public override void Use(Player p, string message) {
|
||||||
UndoArgs args = default(UndoArgs);
|
UndoAreaArgs args = default(UndoAreaArgs);
|
||||||
if (Player.IsSuper(p)) { MessageInGameOnly(p); return; }
|
if (Player.IsSuper(p)) { MessageInGameOnly(p); return; }
|
||||||
if (message == "") { Player.Message(p, "You need to provide a player name."); return; }
|
if (message == "") { Player.Message(p, "You need to provide a player name."); return; }
|
||||||
|
|
||||||
string[] parts = message.Split(' ');
|
string[] parts = message.Split(' ');
|
||||||
args.message = parts[0];
|
args.message = parts[0];
|
||||||
args.delta = CmdUndo.GetDelta(p, null, parts.Length > 1 ? parts[1] : "30");
|
args.delta = GetDelta(p, null, parts.Length > 1 ? parts[1] : "30m");
|
||||||
if (args.delta == TimeSpan.MinValue) return;
|
if (args.delta == TimeSpan.MinValue) return;
|
||||||
|
|
||||||
Player.Message(p, "Place two blocks to determine the edges.");
|
Player.Message(p, "Place two blocks to determine the edges.");
|
||||||
@ -43,57 +44,28 @@ namespace MCGalaxy.Commands {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool DoUndo(Player p, Vec3S32[] marks, object state, byte type, byte extType) {
|
bool DoUndo(Player p, Vec3S32[] marks, object state, byte type, byte extType) {
|
||||||
UndoArgs args = (UndoArgs)state;
|
UndoAreaArgs args = (UndoAreaArgs)state;
|
||||||
Player who = PlayerInfo.Find(args.message);
|
Player who = PlayerInfo.Find(args.message);
|
||||||
|
|
||||||
if (who != null) UndoOnlinePlayer(p, who, args, marks);
|
if (who != null) UndoOnlinePlayer(p, args.delta, who, marks);
|
||||||
else UndoOfflinePlayer(p, args.message, args, marks);
|
else UndoOfflinePlayer(p, args.delta, args.message, marks);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UndoOnlinePlayer(Player p, Player who, UndoArgs args, Vec3S32[] marks) {
|
protected override bool CheckUndoPerms(Player p, Group grp) {
|
||||||
if (p != who && who.Rank >= p.Rank) {
|
if (grp.Permission >= p.Rank) { MessageTooHighRank(p, "undo", false); return false; }
|
||||||
MessageTooHighRank(p, "undo", false); return;
|
return true;
|
||||||
}
|
|
||||||
|
|
||||||
UndoOnlineDrawOp op = new UndoOnlineDrawOp();
|
|
||||||
op.Start = DateTime.UtcNow.Subtract(args.delta);
|
|
||||||
op.who = who;
|
|
||||||
DrawOp.DoDrawOp(op, null, p, marks);
|
|
||||||
|
|
||||||
Player.SendChatFrom(who, who.ColoredName +
|
|
||||||
"%S's actions for the past &b" + args.delta.Shorten() + " %Swere undone.", false);
|
|
||||||
Server.s.Log(who.name + "'s actions for the past " + args.delta.Shorten() + " were undone.");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void UndoOfflinePlayer(Player p, string whoName, UndoArgs args, Vec3S32[] marks) {
|
struct UndoAreaArgs { public string message; public TimeSpan delta; }
|
||||||
Group group = Group.findPlayerGroup(whoName);
|
|
||||||
if (group.Permission >= p.Rank) {
|
|
||||||
MessageTooHighRank(p, "undo", false); return;
|
|
||||||
}
|
|
||||||
|
|
||||||
UndoOfflineDrawOp op = new UndoOfflineDrawOp();
|
|
||||||
op.Start = DateTime.UtcNow.Subtract(args.delta);
|
|
||||||
op.whoName = whoName;
|
|
||||||
DrawOp.DoDrawOp(op, null, p, marks);
|
|
||||||
|
|
||||||
if (op.found) {
|
|
||||||
Chat.MessageAll("{0}{1}%S's actions for the past &b{2} %Swere undone.",
|
|
||||||
group.color, whoName, args.delta.Shorten());
|
|
||||||
Server.s.Log(whoName + "'s actions for the past " + args.delta.Shorten() + " were undone.");
|
|
||||||
p.level.Save(true);
|
|
||||||
} else {
|
|
||||||
Player.Message(p, "Could not find player specified.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct UndoArgs { public string message; public TimeSpan delta; }
|
|
||||||
|
|
||||||
public override void Help(Player p) {
|
public override void Help(Player p) {
|
||||||
Player.Message(p, "%T/undoarea [player] [seconds]");
|
Player.Message(p, "%T/undoarea [player] <timespan>");
|
||||||
Player.Message(p, "%HUndoes the blockchanges made by [player] in the previous [seconds] in a specific area.");
|
Player.Message(p, "%HUndoes the blockchanges made by [player] in the previous <timespan> in a specific area.");
|
||||||
if (p == null || (p.group.maxUndo <= 500000 || p.group.maxUndo == 0))
|
Player.Message(p, "%H If <timespan> is not given, undoes 30 minutes.");
|
||||||
Player.Message(p, "%T/undoarea [player] all %H- Undoes 68 years for [player]");
|
Player.Message(p, "%H e.g. to undo the past 90 minutes, <timespan> would be %S1h30m");
|
||||||
|
if (p == null || p.group.maxUndo == -1 || p.group.maxUndo == int.MaxValue)
|
||||||
|
Player.Message(p, "%T/undoarea [player] all &c- Undoes 68 years for [player]");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,7 @@ using MCGalaxy.Drawing.Ops;
|
|||||||
using MCGalaxy.Undo;
|
using MCGalaxy.Undo;
|
||||||
|
|
||||||
namespace MCGalaxy.Commands.Building {
|
namespace MCGalaxy.Commands.Building {
|
||||||
public sealed class CmdUndo : Command {
|
public class CmdUndo : Command {
|
||||||
public override string name { get { return "undo"; } }
|
public override string name { get { return "undo"; } }
|
||||||
public override string shortcut { get { return "u"; } }
|
public override string shortcut { get { return "u"; } }
|
||||||
public override string type { get { return CommandTypes.Building; } }
|
public override string type { get { return CommandTypes.Building; } }
|
||||||
@ -48,7 +48,7 @@ namespace MCGalaxy.Commands.Building {
|
|||||||
string[] parts = message.Split(' ');
|
string[] parts = message.Split(' ');
|
||||||
bool undoPhysics = parts[0].CaselessEq("physics");
|
bool undoPhysics = parts[0].CaselessEq("physics");
|
||||||
Player who = undoPhysics ? null : PlayerInfo.Find(parts[0]);
|
Player who = undoPhysics ? null : PlayerInfo.Find(parts[0]);
|
||||||
TimeSpan delta = GetDelta(p, who, parts.Length > 1 ? parts[1] : "30");
|
TimeSpan delta = GetDelta(p, who, parts.Length > 1 ? parts[1] : "30m");
|
||||||
if (delta == TimeSpan.MinValue) return;
|
if (delta == TimeSpan.MinValue) return;
|
||||||
|
|
||||||
if (parts.Length > 1 && parts[1].CaselessEq("update")) {
|
if (parts.Length > 1 && parts[1].CaselessEq("update")) {
|
||||||
@ -57,34 +57,13 @@ namespace MCGalaxy.Commands.Building {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Vec3S32[] marks = new Vec3S32[] { Vec3U16.MaxVal, Vec3U16.MaxVal };
|
||||||
if (who != null)
|
if (who != null)
|
||||||
UndoOnlinePlayer(p, delta, who);
|
UndoOnlinePlayer(p, delta, who, marks);
|
||||||
else if (undoPhysics)
|
else if (undoPhysics)
|
||||||
UndoLevelPhysics(p, delta);
|
UndoLevelPhysics(p, delta);
|
||||||
else
|
else
|
||||||
UndoOfflinePlayer(p, delta, parts[0]);
|
UndoOfflinePlayer(p, delta, parts[0], marks);
|
||||||
}
|
|
||||||
|
|
||||||
const int undoMax = -1; // allows everything to be undone.
|
|
||||||
internal static TimeSpan GetDelta(Player p, Player who, string param) {
|
|
||||||
TimeSpan delta;
|
|
||||||
bool canAll = p == null || p == who || p.group.maxUndo == undoMax;
|
|
||||||
|
|
||||||
if (param.CaselessEq("all")) {
|
|
||||||
return TimeSpan.FromSeconds(canAll ? int.MaxValue : p.group.maxUndo);
|
|
||||||
} else if (!param.TryParseShort(p, 's', "undo the past", out delta)) {
|
|
||||||
Player.Message(p, "Undoing for 30 seconds.");
|
|
||||||
return TimeSpan.MinValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (delta.TotalSeconds == 0)
|
|
||||||
delta = TimeSpan.FromMinutes(90);
|
|
||||||
if (!canAll && delta.TotalSeconds > p.group.maxUndo) {
|
|
||||||
Player.Message(p, "{0}%Ss may only undo up to {1} seconds.",
|
|
||||||
p.group.ColoredName, p.group.maxUndo);
|
|
||||||
return TimeSpan.FromSeconds(p.group.maxUndo);
|
|
||||||
}
|
|
||||||
return delta;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void UndoSelf(Player p) {
|
void UndoSelf(Player p) {
|
||||||
@ -113,48 +92,6 @@ namespace MCGalaxy.Commands.Building {
|
|||||||
Player.Message(p, "Try using %T/undo <seconds> %Sinstead.");
|
Player.Message(p, "Try using %T/undo <seconds> %Sinstead.");
|
||||||
}
|
}
|
||||||
|
|
||||||
void UndoOnlinePlayer(Player p, TimeSpan delta, Player who) {
|
|
||||||
if (p != null && p != who && !CheckUndoPerms(p, who.group)) return;
|
|
||||||
|
|
||||||
UndoOnlineDrawOp op;
|
|
||||||
if (p == who) op = new UndoSelfDrawOp();
|
|
||||||
else op = new UndoOnlineDrawOp();
|
|
||||||
op.Start = DateTime.UtcNow.Subtract(delta);
|
|
||||||
op.who = who;
|
|
||||||
DrawOp.DoDrawOp(op, null, p, new Vec3S32[] { Vec3U16.MaxVal, Vec3U16.MaxVal } );
|
|
||||||
|
|
||||||
if (p == who) {
|
|
||||||
Player.Message(p, "Undid your actions for the past &b" + delta.Shorten() + "%S.");
|
|
||||||
} else {
|
|
||||||
Player.SendChatFrom(who, who.ColoredName + "%S's actions for the past &b" + delta.Shorten() + " %Swere undone.", false);
|
|
||||||
}
|
|
||||||
Server.s.Log(who.name + "'s actions for the past " + delta.Shorten() + " were undone.");
|
|
||||||
}
|
|
||||||
|
|
||||||
void UndoOfflinePlayer(Player p, TimeSpan delta, string whoName) {
|
|
||||||
if (p != null && !CheckUndoPerms(p, Group.findPlayerGroup(whoName))) return;
|
|
||||||
|
|
||||||
UndoOfflineDrawOp op = new UndoOfflineDrawOp();
|
|
||||||
op.Start = DateTime.UtcNow.Subtract(delta);
|
|
||||||
op.whoName = whoName;
|
|
||||||
DrawOp.DoDrawOp(op, null, p, new Vec3S32[] { Vec3U16.MaxVal, Vec3U16.MaxVal } );
|
|
||||||
|
|
||||||
if (op.found) {
|
|
||||||
Chat.MessageAll("{0}%S's actions for the past &b{1} %S were undone.",
|
|
||||||
PlayerInfo.GetColoredName(p, whoName), delta.Shorten());
|
|
||||||
Server.s.Log(whoName + "'s actions for the past " + delta.Shorten() + " were undone.");
|
|
||||||
if (p != null) p.level.Save(true);
|
|
||||||
} else {
|
|
||||||
Player.Message(p, "Could not find player specified.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CheckUndoPerms(Player p, Group grp) {
|
|
||||||
if (!CheckExtraPerm(p)) { MessageNeedExtra(p, "undo other players."); return false; }
|
|
||||||
if (grp.Permission > p.Rank) { MessageTooHighRank(p, "undo", true); return false; }
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void UndoLevelPhysics(Player p, TimeSpan delta) {
|
void UndoLevelPhysics(Player p, TimeSpan delta) {
|
||||||
if (!CheckExtraPerm(p, 2)) { MessageNeedExtra(p, "undo physics.", 2); return; }
|
if (!CheckExtraPerm(p, 2)) { MessageNeedExtra(p, "undo physics.", 2); return; }
|
||||||
if (p != null && !p.group.CanExecute("physics")) {
|
if (p != null && !p.group.CanExecute("physics")) {
|
||||||
@ -170,14 +107,80 @@ namespace MCGalaxy.Commands.Building {
|
|||||||
p.level.Save(true);
|
p.level.Save(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const int undoMax = -1; // allows everything to be undone.
|
||||||
|
protected TimeSpan GetDelta(Player p, Player who, string param) {
|
||||||
|
TimeSpan delta;
|
||||||
|
bool canAll = p == null || p == who || p.group.maxUndo == undoMax;
|
||||||
|
|
||||||
|
if (param.CaselessEq("all")) {
|
||||||
|
return TimeSpan.FromSeconds(canAll ? int.MaxValue : p.group.maxUndo);
|
||||||
|
} else if (!param.TryParseShort(p, 's', "undo the past", out delta)) {
|
||||||
|
Player.Message(p, "Undoing for 30 seconds.");
|
||||||
|
return TimeSpan.MinValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (delta.TotalSeconds == 0)
|
||||||
|
delta = TimeSpan.FromMinutes(90);
|
||||||
|
if (!canAll && delta.TotalSeconds > p.group.maxUndo) {
|
||||||
|
Player.Message(p, "{0}%Ss may only undo up to {1} seconds.",
|
||||||
|
p.group.ColoredName, p.group.maxUndo);
|
||||||
|
return TimeSpan.FromSeconds(p.group.maxUndo);
|
||||||
|
}
|
||||||
|
return delta;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void UndoOnlinePlayer(Player p, TimeSpan delta, Player who, Vec3S32[] marks) {
|
||||||
|
if (p != null && p != who && !CheckUndoPerms(p, who.group)) return;
|
||||||
|
|
||||||
|
UndoOnlineDrawOp op;
|
||||||
|
if (p == who) op = new UndoSelfDrawOp();
|
||||||
|
else op = new UndoOnlineDrawOp();
|
||||||
|
op.Start = DateTime.UtcNow.Subtract(delta);
|
||||||
|
op.who = who;
|
||||||
|
DrawOp.DoDrawOp(op, null, p, marks);
|
||||||
|
|
||||||
|
if (p == who) {
|
||||||
|
Player.Message(p, "Undid your actions for the past &b" + delta.Shorten(true) + "%S.");
|
||||||
|
} else {
|
||||||
|
Player.SendChatFrom(who, who.ColoredName + "%S's actions for the past &b" + delta.Shorten(true) + " %Swere undone.", false);
|
||||||
|
}
|
||||||
|
Server.s.Log(who.name + "'s actions for the past " + delta.Shorten(true) + " were undone.");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void UndoOfflinePlayer(Player p, TimeSpan delta, string whoName, Vec3S32[] marks) {
|
||||||
|
if (p != null && !CheckUndoPerms(p, Group.findPlayerGroup(whoName))) return;
|
||||||
|
|
||||||
|
UndoOfflineDrawOp op = new UndoOfflineDrawOp();
|
||||||
|
op.Start = DateTime.UtcNow.Subtract(delta);
|
||||||
|
op.whoName = whoName;
|
||||||
|
DrawOp.DoDrawOp(op, null, p, marks);
|
||||||
|
|
||||||
|
if (op.found) {
|
||||||
|
Chat.MessageAll("{0}%S's actions for the past &b{1} %S were undone.",
|
||||||
|
PlayerInfo.GetColoredName(p, whoName), delta.Shorten(true));
|
||||||
|
Server.s.Log(whoName + "'s actions for the past " + delta.Shorten(true) + " were undone.");
|
||||||
|
if (p != null) p.level.Save(true);
|
||||||
|
} else {
|
||||||
|
Player.Message(p, "Could not find player specified.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual bool CheckUndoPerms(Player p, Group grp) {
|
||||||
|
if (!CheckExtraPerm(p)) { MessageNeedExtra(p, "undo other players."); return false; }
|
||||||
|
if (grp.Permission >= p.Rank) { MessageTooHighRank(p, "undo", false); return false; }
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public override void Help(Player p) {
|
public override void Help(Player p) {
|
||||||
Player.Message(p, "/undo - Undoes your last draw operation.");
|
Player.Message(p, "%T/undo [player] <timespan>");
|
||||||
Player.Message(p, "/undo [player] [seconds] - Undoes the blockchanges made by [player] in the previous [seconds].");
|
Player.Message(p, "%HUndoes the blockchanges made by [player] in the past <timespan>. " +
|
||||||
if (p == null || (p.group.maxUndo <= 500000 || p.group.maxUndo == 0))
|
"If <timespan> is not given, undoes 30 minutes.");
|
||||||
Player.Message(p, "/undo [player] all - &cUndoes 68 years for [player]");
|
Player.Message(p, "%H e.g. to undo the past 90 minutes, <timespan> would be %S1h30m");
|
||||||
if (p == null || (p.group.maxUndo <= 1800 || p.group.maxUndo == 0))
|
if (p == null || p.group.maxUndo == -1 || p.group.maxUndo == int.MaxValue)
|
||||||
Player.Message(p, "/undo [player] - &cUndoes 30 minutes for [player]");
|
Player.Message(p, "%T/undo [player] all %c- Undoes 68 years for [player]");
|
||||||
Player.Message(p, "/undo physics [seconds] - Undoes physics on your current map");
|
Player.Message(p, "%T/undo %H- Undoes your last draw operation.");
|
||||||
|
Player.Message(p, "%T/undo physics [seconds] %H- Undoes physics on current map");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user