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); }
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."); } }
public void PopulateData(RowParser parser, Lumina.Lumina lumina, Language language) { RowId = parser.Row; SubRowId = parser.SubRow; Name = parser.ReadColumn <SeString>(0); }
public RawFileViewModel(string path, Lumina.Lumina lumina) { _lumina = lumina; Path = path; Resource = lumina.GetFile(path); }
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); }
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); }
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); }
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); }
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); }
private void DiscoverLevelPaths(Lumina.Lumina lumina) { var territoryType = lumina.GetExcelSheet <TerritoryType>(); foreach (var row in territoryType) { var basePath = $"bg/{row.Bg}"; } }
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); }
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); }
private void DiscoverExcelFiles(Lumina.Lumina lumina) { var sheets = lumina.Excel.SheetNames; foreach (var sheet in sheets) { DiscoverFile(lumina, $"exd/{sheet}.exh"); } }
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); }
public static ulong GetFileHash(string path) { try { return(LuminaMain.GetFileHash(path)); } catch (Exception) { return(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); }
private void DiscoverFile(Lumina.Lumina lumina, string path) { Log.Verbose("discovered file: {FilePath}", path); if (!lumina.FileExists(path)) { return; } Events.EventHelper.DiscoverNewFile(path); }
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)); }
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)); } }
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); } }
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()); }
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); } }
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(); }
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); }); }
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."); } }
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; }
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); }
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)); }
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); }); }
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)); }