public static void WriteMap(ARealmReversed realm, TerritoryType teriType, SaintCoinach.Graphics.Territory teri = null) { string name = teri != null ? teri.Name : teriType.Name; //Plot.Ward ward = Plot.StringToWard(teriType.Name); string outdir = Path.Combine(FFXIVHSPaths.GetRootDirectory(), name + "\\"); string outpath = Path.Combine(outdir, name + ".json"); //string outpath = FFXIVHSPaths.GetWardJson(ward); if (!Directory.Exists(outdir)) { Directory.CreateDirectory(outdir); } if (File.Exists(outpath)) { WriteMapModels(realm, teriType, teri); return; } Map map = ReadTerritory(teriType, teri); string json = JsonConvert.SerializeObject(map, Formatting.Indented); File.WriteAllText(outpath, json); }
public static void WriteMapModels(ARealmReversed realm, TerritoryType teriType, SaintCoinach.Graphics.Territory teri = null) { string name = teri != null ? teri.Name : teriType.Name; //Plot.Ward ward = Plot.StringToWard(teriType.Name); string outpath = Path.Combine(FFXIVHSPaths.GetRootDirectory(), name, "objects\\"); string inpath = Path.Combine(FFXIVHSPaths.GetRootDirectory(), name + "\\", name + ".json"); if (!Directory.Exists(outpath)) { Directory.CreateDirectory(outpath); } //string inpath = FFXIVHSPaths.GetWardJson(ward); if (!File.Exists(inpath)) { throw new FileNotFoundException(); } //string outpath = FFXIVHSPaths.GetWardObjectsDirectory(ward); string json = File.ReadAllText(inpath); Map map = JsonConvert.DeserializeObject <Map>(json); foreach (MapModel model in map.models.Values) { if (realm.Packs.TryGetFile(model.modelPath, out SaintCoinach.IO.File f)) { ObjectFileWriter.WriteObjectFile(outpath, (ModelFile)f); } } }
/// <summary> /// Returns a Map containing all groups in the Territory instantiated via /// the given TerritoryType. /// </summary> /// <param name="teriType"></param> /// <returns></returns> private static Map ReadTerritory(TerritoryType teriType, SaintCoinach.Graphics.Territory teri = null) { Map map = new Map(); teri = teri ?? new SaintCoinach.Graphics.Territory(teriType); if (teri.Terrain != null) { MapGroup terrainMapGroup = new MapGroup(MapGroup.GroupType.TERRAIN, "teri"); terrainMapGroup.groupTransform = Transform.Empty; foreach (TransformedModel mdl in teri.Terrain.Parts) { int modelId = map.TryAddUniqueModel(mdl.Model.ToMapModel()); terrainMapGroup.AddEntry(mdl.ToMapModelEntry(modelId)); } map.AddMapGroup(terrainMapGroup); } foreach (LgbFile lgbFile in teri.LgbFiles) { var validGroups = lgbFile.Groups.Where(_ => !EventCheck(_.Name)).Select(_ => _); foreach (LgbGroup lgbGroup in validGroups) { MapGroup lgbMapGroup = new MapGroup(MapGroup.GroupType.LGB, lgbGroup.Name); lgbMapGroup.groupTransform = Transform.Empty; foreach (var mdl in lgbGroup.Entries.OfType <LgbModelEntry>()) { int modelId = map.TryAddUniqueModel(mdl.Model.Model.ToMapModel()); lgbMapGroup.AddEntry(mdl.Model.ToMapModelEntry(modelId)); } foreach (var gim in lgbGroup.Entries.OfType <LgbGimmickEntry>()) { MapGroup gimMapGroup = new MapGroup(MapGroup.GroupType.SGB, GetGimmickName(gim.Name, gim.Gimmick.File.Path)); gimMapGroup.groupTransform = TransformFromGimmickHeader(gim.Header); AddSgbModelsToMap(ref map, ref gimMapGroup, gim.Gimmick); foreach (var rootGimGroup in gim.Gimmick.Data.OfType <SgbGroup>()) { foreach (var rootGimEntry in rootGimGroup.Entries.OfType <SgbGimmickEntry>()) { if (rootGimEntry.Gimmick != null) { MapGroup rootGimMapGroup = new MapGroup(MapGroup.GroupType.SGB, GetGimmickName(rootGimEntry.Name, rootGimEntry.Gimmick.File.Path)); rootGimMapGroup.groupTransform = TransformFromGimmickHeader(rootGimEntry.Header); AddSgbModelsToMap(ref map, ref rootGimMapGroup, rootGimEntry.Gimmick); foreach (var subGimGroup in rootGimEntry.Gimmick.Data.OfType <SgbGroup>()) { foreach (var subGimEntry in subGimGroup.Entries.OfType <SgbGimmickEntry>()) { MapGroup subGimMapGroup = new MapGroup(MapGroup.GroupType.SGB, GetGimmickName(subGimEntry.Name, subGimEntry.Gimmick.File.Path)); subGimMapGroup.groupTransform = TransformFromGimmickHeader(subGimEntry.Header); AddSgbModelsToMap(ref map, ref subGimMapGroup, subGimEntry.Gimmick); rootGimMapGroup.AddGroup(subGimMapGroup); } } gimMapGroup.AddGroup(rootGimMapGroup); } } } lgbMapGroup.AddGroup(gimMapGroup); } foreach (var eobj in lgbGroup.Entries.OfType <LgbEventObjectEntry>()) { if (eobj.Gimmick == null) { continue; } MapGroup gimMapGroup = new MapGroup(MapGroup.GroupType.SGB, GetGimmickName(eobj.Name, eobj.Gimmick.File.Path)); gimMapGroup.groupTransform = TransformFromGimmickHeader(eobj.Header); AddSgbModelsToMap(ref map, ref gimMapGroup, eobj.Gimmick); foreach (var rootGimGroup in eobj.Gimmick.Data.OfType <SgbGroup>()) { foreach (var rootGimEntry in rootGimGroup.Entries.OfType <SgbGimmickEntry>()) { if (rootGimEntry.Gimmick != null) { MapGroup rootGimMapGroup = new MapGroup(MapGroup.GroupType.SGB, GetGimmickName(rootGimEntry.Name, rootGimEntry.Gimmick.File.Path)); rootGimMapGroup.groupTransform = TransformFromGimmickHeader(rootGimEntry.Header); AddSgbModelsToMap(ref map, ref rootGimMapGroup, rootGimEntry.Gimmick); foreach (var subGimGroup in rootGimEntry.Gimmick.Data.OfType <SgbGroup>()) { foreach (var subGimEntry in subGimGroup.Entries.OfType <SgbGimmickEntry>()) { MapGroup subGimMapGroup = new MapGroup(MapGroup.GroupType.SGB, GetGimmickName(subGimEntry.Name, subGimEntry.Gimmick.File.Path)); subGimMapGroup.groupTransform = TransformFromGimmickHeader(subGimEntry.Header); AddSgbModelsToMap(ref map, ref subGimMapGroup, subGimEntry.Gimmick); rootGimMapGroup.AddGroup(subGimMapGroup); } } gimMapGroup.AddGroup(rootGimMapGroup); } } foreach (var sgb1cEntry in rootGimGroup.Entries.OfType <SgbGroup1CEntry>()) { if (sgb1cEntry.Gimmick != null) { MapGroup rootGimMapGroup = new MapGroup(MapGroup.GroupType.SGB, GetGimmickName(sgb1cEntry.Name, sgb1cEntry.Gimmick.File.Path)); rootGimMapGroup.groupTransform = Transform.Empty; AddSgbModelsToMap(ref map, ref rootGimMapGroup, sgb1cEntry.Gimmick); foreach (var subGimGroup in sgb1cEntry.Gimmick.Data.OfType <SgbGroup>()) { foreach (var subGimEntry in subGimGroup.Entries.OfType <SgbGimmickEntry>()) { MapGroup subGimMapGroup = new MapGroup(MapGroup.GroupType.SGB, GetGimmickName(subGimEntry.Name, subGimEntry.Gimmick.File.Path)); subGimMapGroup.groupTransform = TransformFromGimmickHeader(subGimEntry.Header); AddSgbModelsToMap(ref map, ref subGimMapGroup, subGimEntry.Gimmick); rootGimMapGroup.AddGroup(subGimMapGroup); } } gimMapGroup.AddGroup(rootGimMapGroup); } } } lgbMapGroup.AddGroup(gimMapGroup); } map.AddMapGroup(lgbMapGroup); } } return(map); }
/// <summary> /// Occurs second in the ward data output flow and reads all housing territories for their appropriate /// plot placeholders and calculates plot locations from them.<br /> /// /// This <i>would</i> be read from HousingMapMarkerInfo but the height values are incorrect there, /// and would mess up camera movement. X coordinates are negated due to the map reflection in Unity.<br /> /// /// This method takes a very long time due to Territory instantiation. /// </summary> private static void ReadTerritoryPlots(ARealmReversed realm, ref List <Plot> plots) { List <TerritoryType> housingTeriTypes = GetHousingTerritoryTypes(realm); WardSetting[] settings = JsonConvert.DeserializeObject <WardSetting[]>(File.ReadAllText(FFXIVHSPaths.GetWardSettingsJson())); foreach (TerritoryType tType in housingTeriTypes) { SaintCoinach.Graphics.Territory t = new SaintCoinach.Graphics.Territory(tType); LgbFile bg = null; //Get the ward's information from the wardsettings.json string groupName = "", plotName = "", subdivisionName = ""; foreach (WardSetting ws in settings) { if (ws.Territory.ToString() == t.Name.ToUpper()) { plotName = ws.plotName; groupName = ws.group; subdivisionName = ws.subdivisionSuffix + groupName; } } //We only care about bg.lgb for this territory foreach (LgbFile lgbFile in t.LgbFiles) { if (lgbFile.File.Path.EndsWith("bg.lgb")) { bg = lgbFile; } } if (bg != null) { //Define main and subdiv groups var mainGroup = bg.Groups .Where(_ => _.Name == groupName) .Select(_ => _); var subDivGroup = bg.Groups .Where(_ => _.Name == subdivisionName) .Select(_ => _); //Get main and subdiv plot lists and sort by index var mainPlotList = plots.Where(_ => _.ward.ToString() == t.Name.ToUpper()) .Where(_ => _.subdiv == false) .Select(_ => _).ToList(); var subdivPlotList = plots.Where(_ => _.ward.ToString() == t.Name.ToUpper()) .Where(_ => _.subdiv == true) .Select(_ => _).ToList(); mainPlotList.Sort((p1, p2) => p1.index.CompareTo(p2.index)); subdivPlotList.Sort((p1, p2) => p1.index.CompareTo(p2.index)); int plotIndex = 0; foreach (var lgbGroup in mainGroup.ToArray()) { foreach (var lgbGimmickEntry in lgbGroup.Entries.OfType <LgbGimmickEntry>()) { foreach (var sgbGroup in lgbGimmickEntry.Gimmick.Data.OfType <SgbGroup>()) { foreach (var modelEntry in sgbGroup.Entries.OfType <SgbModelEntry>()) { if (modelEntry.Model.Model.File.Path.Contains(plotName)) { //Position is in gimmick header, not transformedmodel SaintCoinach.Graphics.Vector3 position = lgbGimmickEntry.Header.Translation; SaintCoinach.Graphics.Vector3 rotation = lgbGimmickEntry.Header.Rotation; Vector3 pos = new Vector3(position.X * -1, position.Y, position.Z); Quaternion rot = new Vector3(rotation.X, rotation.Y, rotation.Z).ToQuaternion(); mainPlotList[plotIndex].position = pos; mainPlotList[plotIndex].rotation = rot; plotIndex++; } } } } } plotIndex = 0; foreach (var lgbGroup in subDivGroup.ToArray()) { foreach (var lgbGimmickEntry in lgbGroup.Entries.OfType <LgbGimmickEntry>()) { foreach (var sgbGroup in lgbGimmickEntry.Gimmick.Data.OfType <SgbGroup>()) { foreach (var modelEntry in sgbGroup.Entries.OfType <SgbModelEntry>()) { if (modelEntry.Model.Model.File.Path.Contains(plotName)) { //Position is in gimmick header, not transformedmodel SaintCoinach.Graphics.Vector3 position = lgbGimmickEntry.Header.Translation; SaintCoinach.Graphics.Vector3 rotation = lgbGimmickEntry.Header.Rotation; Vector3 pos = new Vector3(position.X * -1, position.Y, position.Z); Quaternion rot = new Vector3(rotation.X, rotation.Y, rotation.Z).ToQuaternion(); subdivPlotList[plotIndex].position = pos; subdivPlotList[plotIndex].rotation = rot; plotIndex++; } } } } } } } }