예제 #1
0
        public Lumina.Lumina GetInstance(string path)
        {
            var key = path.ToLowerInvariant();

            if (_instances.TryGetValue(key, out var instance))
            {
                Log.Verbose("found existing lumina instance for path: {GamePath}", path);
                return(instance);
            }

            Lumina.Lumina newInstance;

            try
            {
                newInstance = new Lumina.Lumina(path, new Lumina.LuminaOptions
                {
                    CacheFileResources = false
                });
            }
            catch (Exception)
            {
                return(null);
            }

            Log.Verbose("created new lumina instance for path: {GamePath}", path);
            _instances[key] = newInstance;

            return(newInstance);
        }
예제 #2
0
        public async Task Initialize(string baseDir)
        {
            try
            {
                Log.Verbose("Starting data load...");

                var zoneOpCodeDict =
                    JsonConvert.DeserializeObject <Dictionary <string, ushort> >(File.ReadAllText(Path.Combine(baseDir, "UIRes", "serveropcode.json")));
                ServerOpCodes = new ReadOnlyDictionary <string, ushort>(zoneOpCodeDict);

                Log.Verbose("Loaded {0} ServerOpCodes.", zoneOpCodeDict.Count);

                var clientOpCodeDict =
                    JsonConvert.DeserializeObject <Dictionary <string, ushort> >(File.ReadAllText(Path.Combine(baseDir, "UIRes", "clientopcode.json")));
                ClientOpCodes = new ReadOnlyDictionary <string, ushort>(clientOpCodeDict);

                Log.Verbose("Loaded {0} ClientOpCodes.", clientOpCodeDict.Count);


                var luminaOptions = new LuminaOptions {
                    CacheFileResources = true,

#if DEBUG
                    PanicOnSheetChecksumMismatch = true,
#else
                    PanicOnSheetChecksumMismatch = false,
#endif

                    DefaultExcelLanguage = this.language switch {
                        ClientLanguage.Japanese => Language.Japanese,
                        ClientLanguage.English => Language.English,
                        ClientLanguage.German => Language.German,
                        ClientLanguage.French => Language.French,
                        _ => throw new ArgumentOutOfRangeException(nameof(this.language),
                                                                   "Unknown Language: " + this.language)
                    }
                };

                this.gameData = new Lumina.Lumina(Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), "sqpack"), luminaOptions);

                Log.Information("Lumina is ready: {0}", gameData.DataPath);

                IsDataReady = true;

                this.luminaResourceThread = new Thread(() =>
                {
                    while (true)
                    {
                        this.gameData.ProcessFileHandleQueue();
                        Thread.Yield();
                    }
                    // ReSharper disable once FunctionNeverReturns
                });
                this.luminaResourceThread.Start();
            }
            catch (Exception ex)
            {
                Log.Error(ex, "Could not download data.");
            }
        }
예제 #3
0
        public void PopulateData(RowParser parser, Lumina.Lumina lumina, Language language)
        {
            RowId    = parser.Row;
            SubRowId = parser.SubRow;

            Name = parser.ReadColumn <SeString>(0);
        }
예제 #4
0
        public RawFileViewModel(string path, Lumina.Lumina lumina)
        {
            _lumina = lumina;
            Path    = path;

            Resource = lumina.GetFile(path);
        }
예제 #5
0
        public void PopulateData(RowParser parser, Lumina.Lumina lumina, Language language)
        {
            RowId    = parser.Row;
            SubRowId = parser.SubRow;

            ModelMainHand  = parser.ReadColumn <ulong>(0);
            DyeMainHand    = new LazyRow <Stain>(lumina, parser.ReadColumn <byte>(1), language);
            ModelOffHand   = parser.ReadColumn <ulong>(2);
            DyeOffHand     = new LazyRow <Stain>(lumina, parser.ReadColumn <byte>(3), language);
            ModelHead      = parser.ReadColumn <uint>(4);
            DyeHead        = new LazyRow <Stain>(lumina, parser.ReadColumn <byte>(5), language);
            Visor          = parser.ReadColumn <bool>(6);
            ModelBody      = parser.ReadColumn <uint>(7);
            DyeBody        = new LazyRow <Stain>(lumina, parser.ReadColumn <byte>(8), language);
            ModelHands     = parser.ReadColumn <uint>(9);
            DyeHands       = new LazyRow <Stain>(lumina, parser.ReadColumn <byte>(10), language);
            ModelLegs      = parser.ReadColumn <uint>(11);
            DyeLegs        = new LazyRow <Stain>(lumina, parser.ReadColumn <byte>(12), language);
            ModelFeet      = parser.ReadColumn <uint>(13);
            DyeFeet        = new LazyRow <Stain>(lumina, parser.ReadColumn <byte>(14), language);
            ModelEars      = parser.ReadColumn <uint>(15);
            DyeEars        = new LazyRow <Stain>(lumina, parser.ReadColumn <byte>(16), language);
            ModelNeck      = parser.ReadColumn <uint>(17);
            DyeNeck        = new LazyRow <Stain>(lumina, parser.ReadColumn <byte>(18), language);
            ModelWrists    = parser.ReadColumn <uint>(19);
            DyeWrists      = new LazyRow <Stain>(lumina, parser.ReadColumn <byte>(20), language);
            ModelLeftRing  = parser.ReadColumn <uint>(21);
            DyeLeftRing    = new LazyRow <Stain>(lumina, parser.ReadColumn <byte>(22), language);
            ModelRightRing = parser.ReadColumn <uint>(23);
            DyeRightRing   = new LazyRow <Stain>(lumina, parser.ReadColumn <byte>(24), language);
        }
예제 #6
0
        public void PopulateData(RowParser parser, Lumina.Lumina lumina, Language language)
        {
            RowId    = parser.Row;
            SubRowId = parser.SubRow;

            ModelChara         = parser.ReadColumn <ushort>(35);
            Race               = parser.ReadColumn <byte>(36);
            Gender             = parser.ReadColumn <byte>(37);
            BodyType           = parser.ReadColumn <byte>(38);
            Height             = parser.ReadColumn <byte>(39);
            Tribe              = parser.ReadColumn <byte>(40);
            Face               = parser.ReadColumn <byte>(41);
            HairStyle          = parser.ReadColumn <byte>(42);
            HairHighlight      = parser.ReadColumn <byte>(43);
            SkinColor          = parser.ReadColumn <byte>(44);
            EyeHeterochromia   = parser.ReadColumn <byte>(45);
            HairColor          = parser.ReadColumn <byte>(46);
            HairHighlightColor = parser.ReadColumn <byte>(47);
            FacialFeature      = parser.ReadColumn <byte>(48);
            FacialFeatureColor = parser.ReadColumn <byte>(49);
            Eyebrows           = parser.ReadColumn <byte>(50);
            EyeColor           = parser.ReadColumn <byte>(51);
            EyeShape           = parser.ReadColumn <byte>(52);
            Nose               = parser.ReadColumn <byte>(53);
            Jaw                 = parser.ReadColumn <byte>(54);
            Mouth               = parser.ReadColumn <byte>(55);
            LipColor            = parser.ReadColumn <byte>(56);
            BustOrTone1         = parser.ReadColumn <byte>(57);
            ExtraFeature1       = parser.ReadColumn <byte>(58);
            ExtraFeature2OrBust = parser.ReadColumn <byte>(59);
            FacePaint           = parser.ReadColumn <byte>(60);
            FacePaintColor      = parser.ReadColumn <byte>(61);
            NpcEquip            = new LazyRow <NpcEquip>(lumina, parser.ReadColumn <ushort>(63), language);
            ModelMainHand       = parser.ReadColumn <ulong>(65);
            DyeMainHand         = new LazyRow <Stain>(lumina, parser.ReadColumn <byte>(66), language);
            ModelOffHand        = parser.ReadColumn <ulong>(67);
            DyeOffHand          = new LazyRow <Stain>(lumina, parser.ReadColumn <byte>(68), language);
            ModelHead           = parser.ReadColumn <uint>(69);
            DyeHead             = new LazyRow <Stain>(lumina, parser.ReadColumn <byte>(70), language);
            Visor               = parser.ReadColumn <bool>(71);
            ModelBody           = parser.ReadColumn <uint>(72);
            DyeBody             = new LazyRow <Stain>(lumina, parser.ReadColumn <byte>(73), language);
            ModelHands          = parser.ReadColumn <uint>(74);
            DyeHands            = new LazyRow <Stain>(lumina, parser.ReadColumn <byte>(75), language);
            ModelLegs           = parser.ReadColumn <uint>(76);
            DyeLegs             = new LazyRow <Stain>(lumina, parser.ReadColumn <byte>(77), language);
            ModelFeet           = parser.ReadColumn <uint>(78);
            DyeFeet             = new LazyRow <Stain>(lumina, parser.ReadColumn <byte>(79), language);
            ModelEars           = parser.ReadColumn <uint>(80);
            DyeEars             = new LazyRow <Stain>(lumina, parser.ReadColumn <byte>(81), language);
            ModelNeck           = parser.ReadColumn <uint>(82);
            DyeNeck             = new LazyRow <Stain>(lumina, parser.ReadColumn <byte>(83), language);
            ModelWrists         = parser.ReadColumn <uint>(84);
            DyeWrists           = new LazyRow <Stain>(lumina, parser.ReadColumn <byte>(85), language);
            ModelLeftRing       = parser.ReadColumn <uint>(86);
            DyeLeftRing         = new LazyRow <Stain>(lumina, parser.ReadColumn <byte>(87), language);
            ModelRightRing      = parser.ReadColumn <uint>(88);
            DyeRightRing        = new LazyRow <Stain>(lumina, parser.ReadColumn <byte>(89), language);
        }
예제 #7
0
        public void PopulateData(RowParser parser, Lumina.Lumina lumina, Language language)
        {
            RowId    = parser.Row;
            SubRowId = parser.SubRow;

            FeatureID = parser.ReadColumn <byte>(0);
            Icon      = parser.ReadColumn <uint>(1);
        }
예제 #8
0
        public void PopulateData(RowParser parser, Lumina.Lumina lumina, Language language)
        {
            RowId    = parser.Row;
            SubRowId = parser.SubRow;

            Name = parser.ReadColumn <SeString>(1);
            ContentRouletteRoleBonus = new LazyRow <ContentRouletteRoleBonus>(lumina, parser.ReadColumn <byte>(16), language);
        }
예제 #9
0
        public ExcelSheetPageViewModel(string sheetName, Lumina.Lumina lumina)
        {
            SheetColumns  = new ObservableCollection <SheetColumnInfo>();
            SheetPages    = new ObservableCollection <ExcelPage>();
            Languages     = new ObservableCollection <string>();
            RawRowData    = new ObservableCollection <object>();
            RawColumnData = new ObservableCollection <DataGridColumn>();
            RawData       = new ObservableCollection <object>();

            // get shit
            _lumina   = lumina;
            SheetName = sheetName;

            // break shit
            RawSheet = lumina.Excel.GetSheetRaw(sheetName, Language.English);
            Debug.Assert(RawSheet != null, "somehow the sheet name is null, shit is f****d");

            HeaderFileName = RawSheet.HeaderFile.FilePath;
            Languages.AddRange(RawSheet.Languages.Select(l => l.ToString()));

            for (int i = 0; i < RawSheet.Columns.Length; i++)
            {
                var c   = RawSheet.Columns[i];
                var sci = new SheetColumnInfo
                {
                    Index  = i,
                    Type   = c.Type,
                    Offset = c.Offset
                };

                SheetColumns.Add(sci);
            }

            foreach (var page in RawSheet.DataPages)
            {
                var file    = page.File;
                var rowPtrs = file.RowData;

                var parser = new RowParser(RawSheet, file);

                foreach (var rowPtr in rowPtrs.Values)
                {
                    var row = new object[RawSheet.ColumnCount + 1];
                    row[0] = rowPtr.RowId;

                    parser.SeekToRow(rowPtr.RowId);

                    for (int c = 0; c < RawSheet.ColumnCount; c++)
                    {
                        row[c + 1] = parser.ReadColumnRaw(c);
                    }

                    RawData.Add(row);
                }
            }

            SheetPages.AddRange(RawSheet.DataPages);
        }
예제 #10
0
        private void DiscoverLevelPaths(Lumina.Lumina lumina)
        {
            var territoryType = lumina.GetExcelSheet <TerritoryType>();

            foreach (var row in territoryType)
            {
                var basePath = $"bg/{row.Bg}";
            }
        }
예제 #11
0
        public void PopulateData(RowParser parser, Lumina.Lumina lumina, Language language)
        {
            RowId    = parser.Row;
            SubRowId = parser.SubRow;

            Color = parser.ReadColumn <uint>(0);
            Shade = parser.ReadColumn <byte>(1);
            Name  = parser.ReadColumn <SeString>(3);
        }
예제 #12
0
        public void PopulateData(RowParser parser, Lumina.Lumina lumina, Language language)
        {
            RowId    = parser.Row;
            SubRowId = parser.SubRow;

            Name        = parser.ReadColumn <SeString>(0);
            PlaceName   = new LazyRow <PlaceName>(lumina, parser.ReadColumn <ushort>(5), language);
            WeatherRate = parser.ReadColumn <byte>(12);
        }
예제 #13
0
        private void DiscoverExcelFiles(Lumina.Lumina lumina)
        {
            var sheets = lumina.Excel.SheetNames;

            foreach (var sheet in sheets)
            {
                DiscoverFile(lumina, $"exd/{sheet}.exh");
            }
        }
예제 #14
0
파일: Title.cs 프로젝트: yuyuisyuyu/CMTool
        public void PopulateData(RowParser parser, Lumina.Lumina lumina, Language language)
        {
            RowId    = parser.Row;
            SubRowId = parser.SubRow;

            Masculine = parser.ReadColumn <SeString>(0);
            Feminine  = parser.ReadColumn <SeString>(1);
            IsPrefix  = parser.ReadColumn <bool>(2);
            Order     = parser.ReadColumn <ushort>(3);
        }
예제 #15
0
 public static ulong GetFileHash(string path)
 {
     try
     {
         return(LuminaMain.GetFileHash(path));
     }
     catch (Exception)
     {
         return(0);
     }
 }
예제 #16
0
        public void PopulateData(RowParser parser, Lumina.Lumina lumina)
        {
            RowId    = parser.Row;
            SubRowId = parser.SubRow;

            // col: 34 offset: 0000
            Name = parser.ReadOffset <string>(0x0);

            // col: 39 offset: 0040
            Image = parser.ReadOffset <uint>(0x40);
        }
예제 #17
0
        private void DiscoverFile(Lumina.Lumina lumina, string path)
        {
            Log.Verbose("discovered file: {FilePath}", path);

            if (!lumina.FileExists(path))
            {
                return;
            }

            Events.EventHelper.DiscoverNewFile(path);
        }
예제 #18
0
        static void Main(string[] args)
        {
            var sqpack  = args.Length == 0 ? @"C:\Program Files (x86)\SquareEnix\FINAL FANTASY XIV - A Realm Reborn\game\sqpack" : args[0];
            var cyalume = new Cyalume(sqpack);
            var worlds  = new Dictionary <int, string>(
                cyalume.GetExcelSheet <World>()
                .GetRows()
                .Where(row => row.IsPublic)
                .Select(row => new KeyValuePair <int, string>(row.RowId, row.Name)));

            File.WriteAllText(Path.Combine(Environment.CurrentDirectory, "world.json"), JsonConvert.SerializeObject(worlds));
        }
예제 #19
0
        public void PopulateData(RowParser parser, Lumina.Lumina lumina, Language language)
        {
            RowId    = parser.Row;
            SubRowId = parser.SubRow;

            UnkStruct0 = new UnkStruct0Struct[8];
            for (var i = 0; i < 8; i++)
            {
                UnkStruct0[i]         = new UnkStruct0Struct();
                UnkStruct0[i].Weather = parser.ReadColumn <int>(0 + (i * 2 + 0));
                UnkStruct0[i].Rate    = parser.ReadColumn <byte>(0 + (i * 2 + 1));
            }
        }
예제 #20
0
        public void PopulateData(RowParser parser, Lumina.Lumina lumina, Language language)
        {
            RowId    = parser.Row;
            SubRowId = parser.SubRow;

            Race   = parser.ReadColumn <int>(0);
            Tribe  = parser.ReadColumn <int>(1);
            Gender = parser.ReadColumn <sbyte>(2);
            FacialFeatureOptions = new int[7 * 8];
            for (var i = 0; i < 7 * 8; i++)
            {
                FacialFeatureOptions[i] = parser.ReadColumn <int>(3291 + i);
            }
        }
예제 #21
0
        public MusicPageViewModel(Lumina.Lumina lumina = null)
        {
            _lumina = lumina ?? Locator.Current.GetService <Lumina.Lumina>();

            _bgms = _lumina.GetExcelSheet <BGM>().GetRows().Where(b => _lumina.FileExists(b.File)).ToList();

            _searchResults = this
                             .WhenAnyValue(x => x.SearchFilter)
                             .Throttle(TimeSpan.FromMilliseconds(250))
                             .Select(filter => filter?.Trim().ToLowerInvariant())
                             .DistinctUntilChanged()
                             .SelectMany(SearchFilesAsync)
                             .ObserveOn(RxApp.MainThreadScheduler)
                             .ToProperty(this, x => x.SearchResults, SearchFiles());
        }
예제 #22
0
        public void PopulateData(RowParser parser, LuminaData lumina, Language language)
        {
            this.RowId    = parser.Row;
            this.SubRowId = parser.SubRow;

            this.Race   = new LazyRow <Race>(lumina, parser.ReadColumn <int>(0), language);
            this.Tribe  = new LazyRow <Tribe>(lumina, parser.ReadColumn <int>(1), language);
            this.Gender = parser.ReadColumn <sbyte>(2);

            this.FacialFeatureOptions = new int[7 * 8];
            for (int i = 0; i < 7 * 8; i++)
            {
                this.FacialFeatureOptions[i] = parser.ReadColumn <int>(3291 + i);
            }
        }
예제 #23
0
        public MainWindowViewModel(Lumina.Lumina lumina = null, IUmbraSettings settings = null)
        {
            _lumina   = lumina ?? Locator.Current.GetService <Lumina.Lumina>();
            _settings = settings ?? Locator.Current.GetService <IUmbraSettings>();

            DataPath = _lumina.DataPath.FullName;

            var sb = new StringBuilder();

            foreach (var(key, repo) in _lumina.Repositories)
            {
                sb.AppendLine(repo.Name);
            }

            Repositories = sb.ToString();
        }
예제 #24
0
        public RawFile(string path, Lumina.Lumina lumina)
        {
            ViewModel = new RawFileViewModel(path, lumina);
            InitializeComponent();

            this.WhenActivated(reg =>
            {
                HexEditor.Stream = ViewModel.Resource.FileStream;

                this.OneWayBind(
                    ViewModel,
                    vm => vm.Path,
                    v => v.FileName.Text
                    ).DisposeWith(reg);
            });
        }
예제 #25
0
        public async Task Initialize()
        {
            try
            {
                Log.Verbose("Starting data download...");

                using var client = new HttpClient()
                      {
                          BaseAddress = new Uri(DataBaseUrl)
                      };

                var opCodeDict =
                    JsonConvert.DeserializeObject <Dictionary <string, ushort> >(
                        await client.GetStringAsync(DataBaseUrl + "serveropcode.json"));
                this.ServerOpCodes = new ReadOnlyDictionary <string, ushort>(opCodeDict);

                Log.Verbose("Loaded {0} ServerOpCodes.", opCodeDict.Count);


                var luminaOptions = new LuminaOptions
                {
                    CacheFileResources = true
                };

                luminaOptions.DefaultExcelLanguage = this.language switch {
                    ClientLanguage.Japanese => Language.Japanese,
                    ClientLanguage.English => Language.English,
                    ClientLanguage.German => Language.German,
                    ClientLanguage.French => Language.French,
                    _ => throw new ArgumentOutOfRangeException(nameof(this.language),
                                                               "Unknown Language: " + this.language)
                };

                gameData = new Lumina.Lumina(Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), "sqpack"), luminaOptions);

                Log.Information("Lumina is ready: {0}", gameData.DataPath);

                IsDataReady = true;
            }
            catch (Exception ex)
            {
                Log.Error(ex, "Could not download data.");
            }
        }
예제 #26
0
        public LuminaProvider(ICacheLayer cache)
        {
            foreach (string folder in _gameFolders)
            {
                if (Directory.Exists(Path.Combine(Util.ProgramFilesx86(), folder, @"\game\sqpack")))
                {
                    _cyalume = new Cyalume(folder);
                    break;
                }
            }

            if (_cyalume == null)
            {
                throw new DirectoryNotFoundException("sqpack folder not found!");
            }

            _cache = cache;
            _maxCraftedItemLevel = 0;
        }
예제 #27
0
        public void PopulateData(RowParser parser, Lumina.Lumina lumina)
        {
            RowId    = parser.Row;
            SubRowId = parser.SubRow;

            // col: 3 offset: 0000
            Text = parser.ReadOffset <string>(0x0);

            // col: 4 offset: 0004
            GroupTitle = parser.ReadOffset <string>(0x4);

            // col: 2 offset: 0008
            LookupTable = parser.ReadOffset <string>(0x8);

            // col: 0 offset: 000c
            Group = parser.ReadOffset <ushort>(0xc);

            // col: 1 offset: 000e
            Key = parser.ReadOffset <ushort>(0xe);
        }
예제 #28
0
        public static void GenerateJSON(Cyalume luminaEn, Cyalume luminaDe, Cyalume luminaFr, Cyalume luminaJp, HttpClient http, string outputPath)
        {
            var towns   = luminaEn.GetExcelSheet <Town>();
            var townsDe = luminaDe.GetExcelSheet <Town>();
            var townsFr = luminaFr.GetExcelSheet <Town>();
            var townsJp = luminaJp.GetExcelSheet <Town>();

            var townsChs = JObject.Parse(http.GetStringAsync(new Uri("https://cafemaker.wakingsands.com/Town"))
                                         .GetAwaiter().GetResult())["Results"]
                           .Children()
                           .Select(town => town.ToObject <XIVAPITown>())
                           .ToList();

            townsChs.Add(new XIVAPITown
            {
                ID   = 0,
                Name = "不知何处",
            });

            var outputTowns = new List <JObject>();

            foreach (var town in towns)
            {
                dynamic outputTown = new JObject();

                outputTown.ID = town.RowId;

                var iconObj = town.Icon;
                outputTown.Icon = iconObj != 0 ? $"/i/{Util.GetIconFolder(iconObj)}/{iconObj}.png" : $"/i/{Util.GetIconFolder(060880)}/060880.png";

                outputTown.Name_en  = town.Name;
                outputTown.Name_de  = townsDe.First(localItem => localItem.RowId == town.RowId).Name;
                outputTown.Name_fr  = townsFr.First(localItem => localItem.RowId == town.RowId).Name;
                outputTown.Name_jp  = townsJp.First(localItem => localItem.RowId == town.RowId).Name;
                outputTown.Name_chs = townsChs.First(localItem => localItem.ID == town.RowId).Name;

                outputTowns.Add(outputTown);
            }

            File.WriteAllText(Path.Combine(outputPath, "Town.json"), JsonConvert.SerializeObject(outputTowns));
        }
예제 #29
0
        public ExcelSheetsList(Lumina.Lumina lumina)
        {
            ViewModel = new ExcelSheetsListViewModel(lumina);

            InitializeComponent();

            this.WhenActivated(reg =>
            {
                this.OneWayBind(
                    ViewModel,
                    vm => vm.SearchResults,
                    v => v.SheetList.ItemsSource
                    ).DisposeWith(reg);

                this.Bind(
                    ViewModel,
                    vm => vm.SearchNeedle,
                    v => v.SearchInput.Text
                    ).DisposeWith(reg);
            });
        }
예제 #30
0
        public static void GenerateJSON(Cyalume lumina, string outputPath)
        {
            var worlds = lumina.GetExcelSheet <World>();

            var outputWorlds = new List <JObject>();

            foreach (var world in worlds)
            {
                dynamic outputWorld = new JObject();

                outputWorld.ID = world.RowId;

                outputWorld.Name       = world.Name;
                outputWorld.DataCenter = (byte)world.DataCenter.Row;
                outputWorld.IsPublic   = world.IsPublic;

                outputWorlds.Add(outputWorld);
            }

            File.WriteAllText(Path.Combine(outputPath, "World.json"), JsonConvert.SerializeObject(outputWorlds));
        }