public int Backup(bool Forced = false, string backupName = "") { if (!backedup || Forced) { int backupNumber = 1; string dir = Path.Combine(Server.backupLocation, name); backupNumber = IncrementBackup(dir); string path = Path.Combine(dir, backupNumber.ToString()); if (backupName != "") { path = Path.Combine(dir, backupName); } Directory.CreateDirectory(path); string backup = Path.Combine(path, name + ".lvl"); string current = LevelInfo.LevelPath(name); try { File.Copy(current, backup, true); backedup = true; return(backupNumber); } catch (Exception e) { Server.ErrorLog(e); Server.s.Log("FAILED TO INCREMENTAL BACKUP :" + name); return(-1); } } Server.s.Log("Level unchanged, skipping backup"); return(-1); }
public void Save(bool Override = false, bool clearPhysics = false) { if (blocks == null) { return; } string path = LevelInfo.LevelPath(name); if (LevelSave != null) { LevelSave(this); } OnLevelSaveEvent.Call(this); if (cancelsave1) { cancelsave1 = false; return; } if (cancelsave) { cancelsave = false; return; } try { if (!Directory.Exists("levels")) { Directory.CreateDirectory("levels"); } if (!Directory.Exists("levels/level properties")) { Directory.CreateDirectory("levels/level properties"); } if (!Directory.Exists("levels/prev")) { Directory.CreateDirectory("levels/prev"); } if (changed || !File.Exists(path) || Override || (physicschanged && clearPhysics)) { lock (saveLock) SaveCore(path); if (clearPhysics) { ClearPhysics(); } } else { Server.s.Log("Skipping level save for " + name + "."); } } catch (Exception e) { Server.s.Log("FAILED TO SAVE :" + name); Chat.MessageAll("FAILED TO SAVE {0}", ColoredName); Server.ErrorLog(e); } GC.Collect(); GC.WaitForPendingFinalizers(); }
public static void CopyLevel(string src, string dst) { File.Copy(LevelInfo.LevelPath(src), LevelInfo.LevelPath(dst)); if (File.Exists(LevelInfo.PropertiesPath(src))) { File.Copy(LevelInfo.PropertiesPath(src), LevelInfo.PropertiesPath(dst)); } if (File.Exists("blockdefs/lvl_" + src + ".json")) { File.Copy("blockdefs/lvl_" + src + ".json", "blockdefs/lvl_" + dst + ".json"); } CopyDatabaseTables(src, dst); }
void LoadMainLevel() { try { if (LevelInfo.ExistsOffline(level)) { mainLevel = Level.Load(level); mainLevel.unload = false; if (mainLevel == null) { if (File.Exists(LevelInfo.LevelPath(level) + ".backup")) { Log("Attempting to load backup of " + level + "."); File.Copy(LevelInfo.LevelPath(level) + ".backup", LevelInfo.LevelPath(level), true); mainLevel = Level.Load(level); if (mainLevel == null) { Log("BACKUP FAILED!"); Console.ReadLine(); return; } } else { Log("mainlevel not found"); mainLevel = new Level(level, 128, 64, 128, "flat"); mainLevel.Save(); Level.CreateLeveldb(level); } } } else { Log("mainlevel not found"); mainLevel = new Level(level, 128, 64, 128, "flat"); mainLevel.Save(); Level.CreateLeveldb(level); } LevelInfo.Loaded.Add(mainLevel); // fenderrock - Make sure the level does have a physics thread if (mainLevel.physThread == null) { mainLevel.StartPhysics(); } } catch (Exception e) { ErrorLog(e); } }
/// <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); }
public int Backup(bool Forced = false, string backupName = "") { if (!backedup || Forced) { int backupNumber = 1; string backupPath = @Server.backupLocation; if (Directory.Exists(string.Format("{0}/{1}", backupPath, name))) { backupNumber = Directory.GetDirectories(string.Format("{0}/" + name, backupPath)).Length + 1; } else { Directory.CreateDirectory(backupPath + "/" + name); } string path = string.Format("{0}/" + name + "/" + backupNumber, backupPath); if (backupName != "") { path = string.Format("{0}/" + name + "/" + backupName, backupPath); } Directory.CreateDirectory(path); string BackPath = string.Format("{0}/{1}.lvl", path, name); string current = LevelInfo.LevelPath(name); try { File.Copy(current, BackPath, true); backedup = true; return(backupNumber); } catch (Exception e) { Server.ErrorLog(e); Server.s.Log(string.Format("FAILED TO INCREMENTAL BACKUP :{0}", name)); return(-1); } } Server.s.Log("Level unchanged, skipping backup"); return(-1); }
/// <summary> Renames the .lvl (and related) files and database tables. /// Does not perform any unloading. </summary> public static void Rename(string src, string dst) { File.Move(LevelInfo.LevelPath(src), LevelInfo.LevelPath(dst)); try { File.Move(LevelInfo.LevelPath(src) + ".backup", LevelInfo.LevelPath(dst) + ".backup"); } catch { } try { File.Move("levels/level properties/" + src + ".properties", "levels/level properties/" + dst + ".properties"); } catch { } try { File.Move("levels/level properties/" + src, "levels/level properties/" + dst + ".properties"); } catch { } try { if (File.Exists("blockdefs/lvl_" + src + ".json")) { File.Move("blockdefs/lvl_" + src + ".json", "blockdefs/lvl_" + dst + ".json"); } } catch { } try { MoveBackups(src, dst); } catch { } BotsFile.MoveBots(src, dst); RenameDatabaseTables(src, dst); BlockDBFile.MoveBackingFile(src, dst); }
//givenName is safe against SQL injections, it gets checked in CmdLoad.cs public static Level Load(string givenName, byte phys) { if (LevelLoad != null) { LevelLoad(givenName); } OnLevelLoadEvent.Call(givenName); if (cancelload) { cancelload = false; return(null); } CreateLeveldb(givenName); string path = LevelInfo.LevelPath(givenName); if (File.Exists(path)) { try { Level level = LvlFile.Load(givenName, path); level.setPhysics(phys); level.backedup = true; using (DataTable ZoneDB = Database.fillData("SELECT * FROM `Zone" + givenName + "`")) { Zone Zn; for (int i = 0; i < ZoneDB.Rows.Count; ++i) { DataRow row = ZoneDB.Rows[i]; Zn.smallX = ushort.Parse(row["SmallX"].ToString()); Zn.smallY = ushort.Parse(row["SmallY"].ToString()); Zn.smallZ = ushort.Parse(row["SmallZ"].ToString()); Zn.bigX = ushort.Parse(row["BigX"].ToString()); Zn.bigY = ushort.Parse(row["BigY"].ToString()); Zn.bigZ = ushort.Parse(row["BigZ"].ToString()); Zn.Owner = row["Owner"].ToString(); level.ZoneList.Add(Zn); } } level.jailx = (ushort)(level.spawnx * 32); level.jaily = (ushort)(level.spawny * 32); level.jailz = (ushort)(level.spawnz * 32); level.jailrotx = level.rotx; level.jailroty = level.roty; level.StartPhysics(); //level.physChecker.Elapsed += delegate //{ // if (!level.physicssate && level.physics > 0) // level.StartPhysics(); //}; //level.physChecker.Start(); try { DataTable foundDB = Database.fillData("SELECT * FROM `Portals" + givenName + "`"); for (int i = 0; i < foundDB.Rows.Count; ++i) { DataRow row = foundDB.Rows[i]; if ( !Block.portal(level.GetTile(ushort.Parse(row["EntryX"].ToString()), ushort.Parse(row["EntryY"].ToString()), ushort.Parse(row["EntryZ"].ToString())))) { Database.executeQuery("DELETE FROM `Portals" + givenName + "` WHERE EntryX=" + row["EntryX"] + " AND EntryY=" + row["EntryY"] + " AND EntryZ=" + row["EntryZ"]); } } foundDB = Database.fillData("SELECT * FROM `Messages" + givenName + "`"); for (int i = 0; i < foundDB.Rows.Count; ++i) { DataRow row = foundDB.Rows[i]; if ( !Block.mb(level.GetTile(ushort.Parse(row["X"].ToString()), ushort.Parse(row["Y"].ToString()), ushort.Parse(row["Z"].ToString())))) { //givenName is safe against SQL injections, it gets checked in CmdLoad.cs Database.executeQuery("DELETE FROM `Messages" + givenName + "` WHERE X=" + row["X"] + " AND Y=" + row["Y"] + " AND Z=" + row["Z"]); } } foundDB.Dispose(); } catch (Exception e) { Server.ErrorLog(e); } try { string propsPath = LevelInfo.GetPropertiesPath(level.name); if (propsPath != null) { LvlProperties.Load(level, propsPath); } else { Server.s.Log(".properties file for level " + level.name + " was not found."); } LvlProperties.LoadEnv(level, level.name); } catch (Exception e) { Server.ErrorLog(e); } BlockDefinition[] defs = BlockDefinition.Load(false, level); for (int i = 0; i < defs.Length; i++) { if (defs[i] == null) { continue; } level.CustomBlockDefs[i] = defs[i]; } Server.s.Log(string.Format("Level \"{0}\" loaded.", level.name)); if (LevelLoaded != null) { LevelLoaded(level); } OnLevelLoadedEvent.Call(level); return(level); } catch (Exception ex) { Server.ErrorLog(ex); return(null); } } Server.s.Log("ERROR loading level."); return(null); }
public void Save(bool Override = false, bool clearPhysics = false) { if (blocks == null) { return; } string path = LevelInfo.LevelPath(name); if (LevelSave != null) { LevelSave(this); } OnLevelSaveEvent.Call(this); if (cancelsave1) { cancelsave1 = false; return; } if (cancelsave) { cancelsave = false; return; } try { if (!Directory.Exists("levels")) { Directory.CreateDirectory("levels"); } if (!Directory.Exists("levels/level properties")) { Directory.CreateDirectory("levels/level properties"); } if (changed || !File.Exists(path) || Override || (physicschanged && clearPhysics)) { if (clearPhysics) { ClearPhysics(); } if (File.Exists(path)) { if (File.Exists(path + ".prev")) { File.Delete(path + ".prev"); } File.Copy(path, path + ".prev"); File.Delete(path); } LvlFile.Save(this, path + ".backup"); File.Copy(path + ".backup", path); SaveSettings(this); Server.s.Log(string.Format("SAVED: Level \"{0}\". ({1}/{2}/{3})", name, players.Count, PlayerInfo.Online.Count, Server.players)); changed = false; } else { Server.s.Log("Skipping level save for " + name + "."); } } catch (OutOfMemoryException e) { Server.ErrorLog(e); if (Server.mono) { Process[] prs = Process.GetProcesses(); foreach (Process pr in prs) { if (pr.ProcessName == "MCGalaxy") { pr.Kill(); } } } else { Command.all.Find("restart").Use(null, ""); } } catch (Exception e) { Server.s.Log("FAILED TO SAVE :" + name); Player.GlobalMessage("FAILED TO SAVE :" + name); Server.ErrorLog(e); } GC.Collect(); GC.WaitForPendingFinalizers(); }
public static Level Load(string name, byte phys) { if (LevelLoad != null) { LevelLoad(name); } OnLevelLoadEvent.Call(name); if (cancelload) { cancelload = false; return(null); } string path = LevelInfo.LevelPath(name); if (!File.Exists(path)) { Server.s.Log("Attempted to load " + name + ", but the level file does not exist."); return(null); } try { Level level = IMapImporter.Formats[0].Read(path, name, true); level.setPhysics(phys); level.backedup = true; level.jailx = (ushort)(level.spawnx * 32); level.jaily = (ushort)(level.spawny * 32); level.jailz = (ushort)(level.spawnz * 32); level.jailrotx = level.rotx; level.jailroty = level.roty; level.StartPhysics(); try { string propsPath = LevelInfo.FindPropertiesFile(level.name); if (propsPath != null) { LvlProperties.Load(level, propsPath); } else { Server.s.Log(".properties file for level " + level.name + " was not found."); } // Backwards compatibility for older levels which had .env files. LvlProperties.LoadEnv(level); } catch (Exception e) { Server.ErrorLog(e); } level.BlockDB.Used = level.UseBlockDB; BlockDefinition[] defs = BlockDefinition.Load(false, level); for (int i = 0; i < defs.Length; i++) { if (defs[i] == null) { continue; } level.CustomBlockDefs[i] = defs[i]; level.CustomBlockProps[i] = new BlockProps((byte)i); } BlockProps.Load("lvl_" + level.name, level.CustomBlockProps); Bots.BotsFile.LoadBots(level); object locker = ThreadSafeCache.DBCache.Get(name); lock (locker) { LevelDB.LoadZones(level, name); LevelDB.LoadPortals(level, name); LevelDB.LoadMessages(level, name); } Server.s.Log(string.Format("Level \"{0}\" loaded.", level.name)); if (LevelLoaded != null) { LevelLoaded(level); } OnLevelLoadedEvent.Call(level); return(level); } catch (Exception ex) { Server.ErrorLog(ex); return(null); } }