Пример #1
0
        /// <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);
        }
Пример #2
0
        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;
            }
        }
Пример #3
0
        /// <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);
        }
Пример #4
0
 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); }
 }
Пример #5
0
        /*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);
        }
Пример #6
0
        /// <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);
        }
Пример #7
0
        /// <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);
        }
Пример #8
0
        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);
            }
        }
Пример #9
0
        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();
            }
        }