Esempio n. 1
0
        public void Initialize()
        {
            BasePath = BasePath ?? Config.GetProperty("LevelDBWorldFolder", "World").Trim();

            var directory = new DirectoryInfo(Path.Combine(BasePath, "db"));

            var levelFileName = Path.Combine(BasePath, "level.dat");

            Log.Debug($"Loading level.dat from {levelFileName}");
            if (File.Exists(levelFileName))
            {
                var file = new NbtFile {
                    BigEndian = false, UseVarInt = false
                };
                var levelStream = File.OpenRead(levelFileName);
                levelStream.Seek(8, SeekOrigin.Begin);
                file.LoadFromStream(levelStream, NbtCompression.None);
                Log.Debug($"Level DAT\n{file.RootTag}");
                NbtTag dataTag = file.RootTag["Data"];
                //LevelInfo = new LevelInfoBedrock(dataTag);
            }
            else
            {
                Log.Warn($"No level.dat found at {levelFileName}. Creating empty.");
                LevelInfo = new LevelInfoBedrock();
            }

            var db = new Database(directory);

            db.Open();
            _db = db;

            MissingChunkProvider?.Initialize();
        }
Esempio n. 2
0
        public void Initialize()
        {
            BasePath ??= Config.GetProperty("LevelDBWorldFolder", "World").Trim();

            var directory = new DirectoryInfo(Path.Combine(BasePath, "db"));

            var levelFileName = Path.Combine(BasePath, "level.dat");

            Log.Debug($"Loading level.dat from {levelFileName}");
            if (File.Exists(levelFileName))
            {
                var file = new NbtFile
                {
                    BigEndian = false,
                    UseVarInt = false
                };

                using FileStream stream = File.OpenRead(levelFileName);
                stream.Seek(8, SeekOrigin.Begin);
                file.LoadFromStream(stream, NbtCompression.None);
                Log.Debug($"Level DAT\n{file.RootTag}");
                LevelInfo = file.RootTag.Deserialize <LevelInfoBedrock>();
            }
            else
            {
                Log.Warn($"No level.dat found at {levelFileName}. Creating empty.");
                LevelInfo = new LevelInfoBedrock();
            }

            // We must reuse the same DB for all providers (dimensions) in LevelDB.
            if (Db == null)
            {
                var db = new Database(directory)
                {
                    CreateIfMissing = true
                };
                db.Open();
                Db = db;

                directory.Refresh();                 // refresh create state if this dir didn't exist

                // Shutdown hook. Must use to flush in memory log of LevelDB.
                AppDomain.CurrentDomain.ProcessExit += (sender, args) =>
                {
                    SaveChunks();
                    Log.Warn("Closing LevelDB");
                    Db.Close();
                };
            }

            MissingChunkProvider?.Initialize(this);
        }