Fix being unable to delete /os maps if perbuild is higher than your rank.

This commit is contained in:
UnknownShadow200 2016-07-04 12:02:35 +10:00
parent 440660aef7
commit a90045c47f
5 changed files with 33 additions and 37 deletions

View File

@ -170,20 +170,24 @@ namespace MCGalaxy.Commands
Player.Message(p, "Accepted numbers are: 0, 1, 2, 3, 4 or 5");
} else if (cmd == "DELETE") {
if (value == "") {
Player.Message(p, "To delete one of your maps type /os map delete <map number>");
Player.Message(p, "To delete one of your maps, type %T/os map delete [map number[");
} else if (value == "1") {
string map = FirstMapName(p);
if (!LevelInfo.ExistsOffline(map)) {
Player.Message(p, "You don't have a map with that map number."); return;
}
Command.all.Find("deletelvl").Use(p, map);
Player.Message(p, "Created backup.");
LevelActions.Delete(map);
Player.Message(p, "Map 1 has been removed.");
} else if (byte.TryParse(value, out mapNum)) {
string map = p.name.ToLower() + value;
if (!LevelInfo.ExistsOffline(map)) {
Player.Message(p, "You don't have a map with that map number."); return;
}
Command.all.Find("deletelvl").Use(p, map);
Player.Message(p, "Created backup.");
LevelActions.Delete(map);
Player.Message(p, "Map " + value + " has been removed.");
} else {
Help(p);

View File

@ -19,8 +19,8 @@ using System;
using System.IO;
using MCGalaxy.SQL;
namespace MCGalaxy.Commands.World {
public sealed class CmdDeleteLvl : Command {
namespace MCGalaxy.Commands.World {
public sealed class CmdDeleteLvl : Command {
public override string name { get { return "deletelvl"; } }
public override string shortcut { get { return ""; } }
public override string type { get { return CommandTypes.World; } }
@ -29,25 +29,20 @@ namespace MCGalaxy.Commands.World {
public override void Use(Player p, string message) {
if (message == "" || message.Split(' ').Length > 1) { Help(p); return; }
Level lvl = LevelInfo.Find(message);
if (lvl != null) {
if (p != null && lvl.permissionbuild > p.group.Permission) {
Player.Message(p, "%cYou can't delete levels with a perbuild rank higher than yours!");
return;
}
lvl.Unload();
}
if (!ValidName(p, message, "level")) return;
if (lvl == Server.mainLevel) { Player.Message(p, "Cannot delete the main level."); return; }
string map = LevelInfo.FindMapMatches(p, message);
if (map == null) return;
Level lvl = LevelInfo.FindExact(map);
if (lvl != null && p != null && lvl.permissionbuild > p.group.Permission) {
Player.Message(p, "%cYou can't delete levels with a perbuild rank higher than yours!"); return;
}
if (lvl == Server.mainLevel) { Player.Message(p, "Cannot delete the main level."); return; }
LevelPermission perbuild = GetPerBuildPermission(map);
if (p != null && perbuild > p.group.Permission) {
Player.Message(p, "%cYou can't delete levels with a perbuild rank higher than yours!"); return;
}
Player.Message(p, "Created backup.");
LevelActions.Delete(map.ToLower());
}
@ -60,8 +55,8 @@ namespace MCGalaxy.Commands.World {
}
public override void Help(Player p) {
Player.Message(p, "%T/deletelvl [map]");
Player.Message(p, "%HCompletely deletes [map] (portals, MBs, everything");
Player.Message(p, "%T/deletelvl [map]");
Player.Message(p, "%HCompletely deletes [map] (portals, MBs, everything");
Player.Message(p, "%HA backup of the map will be placed in the levels/deleted folder");
}
}

View File

@ -37,7 +37,7 @@ namespace MCGalaxy.Commands {
foreach (Level l in loaded) {
try {
if (l.ShouldSaveChanges()) l.Save();
else { Server.s.Log("The level \"" + l.name + "\" is running a game, not saving."); }
else { Server.s.Log("Level \"" + l.name + "\" is running a game, skipping save."); }
} catch (Exception ex) {
Server.ErrorLog(ex);
}
@ -46,17 +46,13 @@ namespace MCGalaxy.Commands {
} else {
string[] args = message.Split(' ');
if (message == "") {
if (p == null)
Use(p, "all");
else
Save(p, p.level, "");
if (p == null) Use(p, "all");
else Save(p, p.level, "");
} else if (args.Length <= 2) {
Level lvl = LevelInfo.Find(args[0]);
Level lvl = LevelInfo.FindMatches(p, args[0]);
if (lvl == null) return;
string restore = args.Length > 1 ? args[1].ToLower() : "";
if (lvl != null)
Save(p, lvl, restore);
else
Player.Message(p, "Could not find level specified");
Save(p, lvl, restore);
} else {
Help(p);
}

View File

@ -17,10 +17,8 @@
*/
using MCGalaxy.Games;
namespace MCGalaxy.Commands {
public sealed class CmdTp : Command {
namespace MCGalaxy.Commands {
public sealed class CmdTp : Command {
public override string name { get { return "tp"; } }
public override string shortcut { get { return ""; } }
public override string type { get { return CommandTypes.Other; } }

View File

@ -97,16 +97,19 @@ namespace MCGalaxy {
/// <summary> Deletes the .lvl (and related) files and database tables.
/// Does not perform any unloading. </summary>
/// Unloads a level (if present) which exactly matches name. </summary>
public static void Delete(string name) {
Level lvl = LevelInfo.FindExact(name);
if (lvl != null) lvl.Unload();
if (!Directory.Exists("levels/deleted"))
Directory.CreateDirectory("levels/deleted");
if (File.Exists("levels/deleted/" + name + ".lvl")) {
int currentNum = 0;
while (File.Exists("levels/deleted/" + name + currentNum + ".lvl")) currentNum++;
int num = 0;
while (File.Exists("levels/deleted/" + name + num + ".lvl")) num++;
File.Move(LevelInfo.LevelPath(name), "levels/deleted/" + name + currentNum + ".lvl");
File.Move(LevelInfo.LevelPath(name), "levels/deleted/" + name + num + ".lvl");
} else {
File.Move(LevelInfo.LevelPath(name), "levels/deleted/" + name + ".lvl");
}