/// <summary> Deletes the .lvl (and related) files and database tables. Unloads level if it is loaded. </summary> public static bool Delete(string map) { Level lvl = LevelInfo.FindExact(map); if (lvl != null && !lvl.Unload()) { return(false); } if (!Directory.Exists("levels/deleted")) { Directory.CreateDirectory("levels/deleted"); } if (File.Exists(LevelInfo.DeletedPath(map))) { int num = 0; while (File.Exists(LevelInfo.DeletedPath(map + num))) { num++; } File.Move(LevelInfo.MapPath(map), LevelInfo.DeletedPath(map + num)); } else { File.Move(LevelInfo.MapPath(map), LevelInfo.DeletedPath(map)); } DoAll(map, "", action_delete); DeleteDatabaseTables(map); BlockDBFile.DeleteBackingFile(map); return(true); }
public static void Replace(Level old, Level lvl) { LevelDB.SaveBlockDB(old); LevelInfo.Loaded.Remove(old); LevelInfo.Loaded.Add(lvl); old.setPhysics(0); old.ClearPhysics(); lvl.StartPhysics(); Player[] players = PlayerInfo.Online.Items; foreach (Player pl in players) { if (pl.level != old) { continue; } pl.level = lvl; ReloadMap(null, pl, false); } old.Unload(true, false); if (old == Server.mainLevel) { Server.mainLevel = lvl; } }
/// <summary> Renames the given map and associated metadata. Does not unload. </summary> /// <remarks> Backups are NOT renamed. </remarks> public static bool Rename(Player p, string src, string dst) { if (LevelInfo.MapExists(dst)) { p.Message("&WLevel \"{0}\" already exists.", dst); return(false); } Level lvl = LevelInfo.FindExact(src); if (lvl == Server.mainLevel) { p.Message("Cannot rename the main level."); return(false); } List <Player> players = null; if (lvl != null) { players = lvl.getPlayers(); } if (lvl != null && !lvl.Unload()) { p.Message("Unable to rename the level, because it could not be unloaded. " + "A game may currently be running on it."); return(false); } File.Move(LevelInfo.MapPath(src), LevelInfo.MapPath(dst)); DoAll(src, dst, action_move); // TODO: Should we move backups still try { //MoveBackups(src, dst); } catch { } RenameDatabaseTables(p, src, dst); BlockDBFile.MoveBackingFile(src, dst); OnLevelRenamedEvent.Call(src, dst); if (players == null) { return(true); } // Move all the old players to the renamed map Load(p, dst, false); foreach (Player pl in players) { PlayerActions.ChangeMap(pl, dst); } return(true); }
static void InitZombieSurvival() { if (!ZSConfig.StartImmediately) { return; } try { Level oldMain = Server.mainLevel; Server.zombie.Start(ZombieGameStatus.InfiniteRounds, null, 0); // Did zombie survival change the main world? if (oldMain != null && oldMain != Server.mainLevel) { oldMain.Unload(true, false); } } catch (Exception e) { Logger.LogError(e); } }
/*static void MoveBackups(string src, string dst) { * string srcBase = LevelInfo.BackupBasePath(src); * string dstBase = LevelInfo.BackupBasePath(dst); * if (!Directory.Exists(srcBase)) return; * Directory.CreateDirectory(dstBase); * * string[] backups = Directory.GetDirectories(srcBase); * for (int i = 0; i < backups.Length; i++) { * string name = LevelInfo.BackupNameFrom(backups[i]); * string srcFile = LevelInfo.BackupFilePath(src, name); * string dstFile = LevelInfo.BackupFilePath(dst, name); * string dstDir = LevelInfo.BackupDirPath(dst, name); * * Directory.CreateDirectory(dstDir); * File.Move(srcFile, dstFile); * Directory.Delete(backups[i]); * } * Directory.Delete(srcBase); * }*/ /// <summary> Deletes a map and associated metadata. </summary> public static bool Delete(Player p, string map) { Level lvl = LevelInfo.FindExact(map); if (lvl == Server.mainLevel) { p.Message("Cannot delete the main level."); return(false); } if (lvl != null && !lvl.Unload()) { p.Message("Unable to delete the level, because it could not be unloaded. " + "A game may currently be running on it."); return(false); } p.Message("Created backup."); if (!Directory.Exists("levels/deleted")) { Directory.CreateDirectory("levels/deleted"); } if (File.Exists(Paths.DeletedMapFile(map))) { int num = 0; while (File.Exists(Paths.DeletedMapFile(map + num))) { num++; } File.Move(LevelInfo.MapPath(map), Paths.DeletedMapFile(map + num)); } else { File.Move(LevelInfo.MapPath(map), Paths.DeletedMapFile(map)); } DoAll(map, "", action_delete); DeleteDatabaseTables(map); BlockDBFile.DeleteBackingFile(map); OnLevelDeletedEvent.Call(map); return(true); }
/// <summary> Deletes the .lvl (and related) files and database tables. /// 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 num = 0; while (File.Exists("levels/deleted/" + name + num + ".lvl")) { num++; } File.Move(LevelInfo.LevelPath(name), "levels/deleted/" + name + num + ".lvl"); } else { File.Move(LevelInfo.LevelPath(name), "levels/deleted/" + name + ".lvl"); } try { File.Delete("levels/level properties/" + name + ".properties"); } catch { } try { File.Delete("levels/level properties/" + name); } catch { } try { if (File.Exists("blockdefs/lvl_" + name + ".json")) { File.Delete("blockdefs/lvl_" + name + ".json"); } } catch {} BotsFile.DeleteBots(name); DeleteDatabaseTables(name); BlockDBFile.DeleteBackingFile(name); }
/// <summary> Deletes the .lvl (and related) files and database tables. Unloads level if it is loaded. </summary> public static bool Delete(string name) { Level lvl = LevelInfo.FindExact(name); if (lvl != null && !lvl.Unload()) { return(false); } if (!Directory.Exists("levels/deleted")) { Directory.CreateDirectory("levels/deleted"); } if (File.Exists(LevelInfo.DeletedPath(name))) { int num = 0; while (File.Exists(LevelInfo.DeletedPath(name + num))) { num++; } File.Move(LevelInfo.MapPath(name), LevelInfo.DeletedPath(name + num)); } else { File.Move(LevelInfo.MapPath(name), LevelInfo.DeletedPath(name)); } DeleteIfExists(LevelInfo.MapPath(name) + ".backup"); DeleteIfExists("levels/level properties/" + name); DeleteIfExists("levels/level properties/" + name + ".properties"); DeleteIfExists("blockdefs/lvl_" + name + ".json"); DeleteIfExists("blockprops/lvl_" + name + ".txt"); DeleteIfExists(BotsFile.BotsPath(name)); DeleteDatabaseTables(name); BlockDBFile.DeleteBackingFile(name); return(true); }
static void Unload(Level lvl) { bool unloadOld = true; if (lvl.IsMuseum || !lvl.unload) { return; } Player[] players = PlayerInfo.Online.Items; foreach (Player pl in players) { if (pl.level == lvl) { unloadOld = false; break; } } if (unloadOld && Server.AutoLoad) { lvl.Unload(true); } }
public void LeaveServer(string kickMsg, string discMsg, bool sync = false) { if (discMsg != null) { discMsg = Colors.EscapeColors(discMsg); } if (kickMsg != null) { kickMsg = Colors.EscapeColors(kickMsg); } OnPlayerDisconnectEvent.Call(this, discMsg ?? kickMsg); //Umm...fixed? if (name == "") { if (socket != null) { CloseSocket(); } connections.Remove(this); SaveUndo(this); disconnected = true; return; } Server.reviewlist.Remove(name); try { if (disconnected) { CloseSocket(); connections.Remove(this); return; } // FlyBuffer.Clear(); disconnected = true; SaveIgnores(); pingTimer.Stop(); pingTimer.Dispose(); afkTimer.Stop(); afkTimer.Dispose(); muteTimer.Stop(); muteTimer.Dispose(); timespent.Stop(); timespent.Dispose(); afkCount = 0; afkStart = DateTime.Now; Server.afkset.Remove(name); isFlying = false; aiming = false; SendKick(kickMsg, sync); if (!loggedIn) { connections.Remove(this); RemoveFromPending(); Server.s.Log(ip + " disconnected."); return; } Server.zombie.PlayerLeftServer(this); if (Game.team != null) { Game.team.RemoveMember(this); } Server.Countdown.PlayerLeftServer(this); TntWarsGame tntwarsgame = TntWarsGame.GetTntWarsGame(this); if (tntwarsgame != null) { tntwarsgame.Players.Remove(tntwarsgame.FindPlayer(this)); tntwarsgame.SendAllPlayersMessage("TNT Wars: " + color + name + Server.DefaultColor + " has left TNT Wars!"); } Entities.GlobalDespawn(this, false, true); if (discMsg != null) { if (!hidden) { string leavem = "&c- " + FullName + " %S" + discMsg; if ((Server.guestLeaveNotify && group.Permission <= LevelPermission.Guest) || group.Permission > LevelPermission.Guest) { Player[] players = PlayerInfo.Online.Items; foreach (Player pl in players) { Player.SendMessage(pl, leavem); } } } Server.s.Log(name + "disconnected (" + discMsg + ")."); } else { totalKicked++; SendChatFrom(this, "&c- " + color + prefix + DisplayName + " %Skicked (" + kickMsg + "%S).", false); Server.s.Log(name + " kicked (" + kickMsg + ")."); } try { save(); } catch (Exception e) { Server.ErrorLog(e); } PlayerInfo.Online.Remove(this); Server.s.PlayerListUpdate(); if (name != null) { left[name.ToLower()] = ip; } if (PlayerDisconnect != null) { PlayerDisconnect(this, discMsg ?? kickMsg); } if (Server.AutoLoad && level.unload && !level.IsMuseum && IsAloneOnCurrentLevel()) { level.Unload(true); } Dispose(); } catch (Exception e) { Server.ErrorLog(e); } finally { CloseSocket(); } }