示例#1
0
        public static GameObject Import(string workingFile)
        {
            using var stream = File.OpenRead(workingFile);
            using var reader = new BitReader(stream);

            var terrain = new TerrainFile();

            terrain.Deserialize(reader);

            return(Import(terrain));
        }
示例#2
0
        public static async Task <TerrainEditor> OpenAsync(string path)
        {
            await using var stream = File.OpenRead(path);

            using var reader = new BitReader(stream);

            var file = new TerrainFile();

            file.Deserialize(reader);

            return(new TerrainEditor(file));
        }
示例#3
0
        public async Task LoadZoneDataAsync(int seek)
        {
            Zones.Clear();

            Logger.Information("Parsing zone info...");

            var zone = await ClientCache.FindAsync <ZoneTable>(seek);

            if (zone == default)
            {
                Logger.Error($"Cannot find zone {seek}");
                return;
            }
            ;

            var luzFile = Path.Combine("maps", zone.ZoneName.ToLower());

            if (!luzFile.EndsWith(".luz"))
            {
                return;
            }

            Logger.Information($"Parsing: {luzFile}");

            try
            {
                var luz = new LuzFile();

                await using var stream = _resources.GetStream(luzFile);

                var reader = new BitReader(stream);

                luz.Deserialize(reader);

                var path = Path.GetDirectoryName(luzFile);

                var lvlFiles = new List <LvlFile>();

                foreach (var scene in luz.Scenes)
                {
                    await using var sceneStream = _resources.GetStream(Path.Combine(path, scene.FileName));

                    using var sceneReader = new BitReader(sceneStream);

                    Logger.Information($"Parsing: {scene.FileName}");

                    var lvl = new LvlFile();

                    lvl.Deserialize(sceneReader);

                    lvlFiles.Add(lvl);

                    if (lvl.LevelObjects?.Templates == default)
                    {
                        continue;
                    }

                    foreach (var template in lvl.LevelObjects.Templates)
                    {
                        template.ObjectId |= 70368744177664;
                    }
                }

                var terrainStream = _resources.GetStream(Path.Combine(path, luz.TerrainFileName));

                using var terrainReader = new BitReader(terrainStream);

                var terrain = new TerrainFile();

                terrain.Deserialize(terrainReader);

                var triggers = await TriggerDictionary.FromDirectoryAsync(Path.Combine(_resources.RootPath, path));

                Logger.Information($"Parsed: {seek}");

                Zones[seek] = new ZoneInfo
                {
                    LuzFile           = luz,
                    LvlFiles          = lvlFiles,
                    TriggerDictionary = triggers,
                    TerrainFile       = terrain
                };
            }
            catch (Exception e)
            {
                Logger.Error($"Failed to parse {luzFile}: {e.Message}\n{e.StackTrace}");
            }
        }
示例#4
0
        public static async Task ExportToWavefrontAsync(this LuzFile @this, AccessDatabase database, string source, string resources, string result)
        {
            TerrainFile terrain;

            await using (var stream = File.OpenRead(Path.Combine(source, @this.TerrainFileName)))
            {
                using var reader = new BitReader(stream);

                terrain = new TerrainFile();

                terrain.Deserialize(reader);
            }

            var levels = new LvlFile[@this.Scenes.Length];

            for (var i = 0; i < @this.Scenes.Length; i++)
            {
                var scene = @this.Scenes[i];

                await using var stream = File.OpenRead(Path.Combine(source, scene.FileName));

                using var reader = new BitReader(stream);

                var level = new LvlFile();

                level.Deserialize(reader);

                levels[i] = level;
            }

            var objects = new List <LevelObjectTemplate>();

            foreach (var level in levels)
            {
                if (level.LevelObjects?.Templates == default)
                {
                    continue;
                }

                foreach (var template in level.LevelObjects.Templates)
                {
                    if (!template.LegoInfo.TryGetValue("add_to_navmesh", out var add))
                    {
                        continue;
                    }

                    if (!(bool)add)
                    {
                        continue;
                    }

                    objects.Add(template);
                }
            }

            foreach (var template in objects)
            {
                var instance = database.LoadObject(template.Lot);

                var renderer = instance.GetComponent <RenderComponentTable>();

                if (renderer == default)
                {
                    continue;
                }

                Console.WriteLine(renderer.render_asset);
            }
        }
示例#5
0
        public async Task LoadZoneDataAsync(int seek)
        {
            Zones.Clear();

            Logger.Information("Parsing zone info...");

            var luzFiles = _resources.GetAllFilesWithExtension("luz");

            foreach (var luzFile in luzFiles)
            {
                Logger.Information($"Parsing: {luzFile}");

                try
                {
                    var luz = new LuzFile();

                    await using var stream = _resources.GetStream(luzFile);

                    var reader = new BitReader(stream);

                    luz.Deserialize(reader);

                    if (luz.WorldId != seek)
                    {
                        continue;
                    }

                    var path = Path.GetDirectoryName(luzFile);

                    var lvlFiles = new List <LvlFile>();

                    foreach (var scene in luz.Scenes)
                    {
                        await using var sceneStream = _resources.GetStream(Path.Combine(path, scene.FileName));

                        using var sceneReader = new BitReader(sceneStream);

                        Logger.Information($"Parsing: {scene.FileName}");

                        var lvl = new LvlFile();

                        lvl.Deserialize(sceneReader);

                        lvlFiles.Add(lvl);

                        if (lvl.LevelObjects?.Templates == default)
                        {
                            continue;
                        }

                        foreach (var template in lvl.LevelObjects.Templates)
                        {
                            template.ObjectId |= 70368744177664;
                        }
                    }

                    var terrainStream = _resources.GetStream(Path.Combine(path, luz.TerrainFileName));

                    using var terrainReader = new BitReader(terrainStream);

                    var terrain = new TerrainFile();

                    terrain.Deserialize(terrainReader);

                    var triggers = await TriggerDictionary.FromDirectoryAsync(Path.Combine(_resources.RootPath, path));

                    Logger.Information($"Parsed: {(ZoneId) luz.WorldId}");

                    Zones[(int)luz.WorldId] = new ZoneInfo
                    {
                        LuzFile           = luz,
                        LvlFiles          = lvlFiles,
                        TriggerDictionary = triggers,
                        TerrainFile       = terrain
                    };

                    break;
                }
                catch (Exception e)
                {
                    Logger.Error($"Failed to parse {luzFile}: {e.Message}\n{e.StackTrace}");
                }
            }
        }