diff --git a/Assets/Itm/ItmInfo.Item.cs b/Assets/Itm/ItmInfo.Item.cs index e31bf4ac..158419e8 100644 --- a/Assets/Itm/ItmInfo.Item.cs +++ b/Assets/Itm/ItmInfo.Item.cs @@ -108,6 +108,11 @@ public virtual bool getRouteRange(out int range) range = 0; return false; } + + public virtual List getFilesToLoad() + { + return FilesToLoad; + } } } diff --git a/Assets/Itm/ItmInfo.NestedItem.cs b/Assets/Itm/ItmInfo.NestedItem.cs index 75fdb7f8..fc8b5cd0 100644 --- a/Assets/Itm/ItmInfo.NestedItem.cs +++ b/Assets/Itm/ItmInfo.NestedItem.cs @@ -15,8 +15,8 @@ public static NestedItem Load(List values) item.id = CSVReader.GetInt(values[0]); item.version = CSVReader.GetInt(values[1].Trim('v')); item.itemID = CSVReader.GetInt(values[2]); - item.name = CSVReader.GetString(values[3]); - item.location = CSVReader.GetString(values[4]); + item.name = CSVReader.GetQuotedString(values[3]); + item.location = CSVReader.GetQuotedString(values[4]); return item; } } diff --git a/Assets/Itm/ItmInfo.cs b/Assets/Itm/ItmInfo.cs index c69e5fa4..cf506755 100644 --- a/Assets/Itm/ItmInfo.cs +++ b/Assets/Itm/ItmInfo.cs @@ -111,6 +111,7 @@ public static List Load(string filename) break; case "18": NestedItem nested = NestedItem.Load(values); + nested.itemType = ItemType.Nested; FilesToLoad.Add(nested.location); itemInfo.Add(nested); break; diff --git a/Assets/Shared/CsvFile.cs b/Assets/Shared/CsvFile.cs index f7d58dc8..58f274c0 100644 --- a/Assets/Shared/CsvFile.cs +++ b/Assets/Shared/CsvFile.cs @@ -55,6 +55,10 @@ private static List ParseTokens(string input) { i = end + 1; } + else + { + i = input.Length; + } } else { diff --git a/Assets/Veh/VehInfo.Nested.cs b/Assets/Veh/VehInfo.Nested.cs index 2b76a427..c83c1bff 100644 --- a/Assets/Veh/VehInfo.Nested.cs +++ b/Assets/Veh/VehInfo.Nested.cs @@ -7,9 +7,7 @@ public abstract partial class VehInfo : ICsvParseable /// public sealed class Nested : VehInfo { - /*public int Unknown434; - public string Unknown3D4;*/ - public string Unknown5C8; + public string VehicleFileName; public Nested() { @@ -18,11 +16,10 @@ public Nested() public override void Parse(ICsvParser parser) { - base.Parse(parser); this.Version = int.Parse(parser.GetString().Substring(1)); // sets version...? this.Id = parser.GetInt(); this.Name = parser.GetString(); - this.Unknown5C8 = parser.GetString(); + this.VehicleFileName = parser.GetString(); } } } diff --git a/InfServer/Game/Assets/AssetManager.cs b/InfServer/Game/Assets/AssetManager.cs index 69535bf2..73f3605a 100644 --- a/InfServer/Game/Assets/AssetManager.cs +++ b/InfServer/Game/Assets/AssetManager.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Linq; using System.Text; - using Assets; using InfServer.Protocol; @@ -75,14 +74,14 @@ public bool load(CfgInfo zoneConf, string configFilename) //Add the game config addAssetData(AssetFileFactory.CreateFromFile(configFilename)); - //Load shit up - ItemFile itms = AssetFileFactory.CreateFromFile(zoneConf.level.itmFile); + //Load shit up + ItemFile itms = LoadItemFiles(zoneConf); LioFile lios = AssetFileFactory.CreateFromFile(zoneConf.level.lioFile); SkillFile rpgs = AssetFileFactory.CreateFromFile(zoneConf.level.rpgFile); - VehicleFile vehs = AssetFileFactory.CreateFromFile(zoneConf.level.vehFile); + VehicleFile vehs = LoadVehicleFiles(zoneConf); LevelFile lvl = AssetFileFactory.CreateFromFile(zoneConf.level.lvlFile); - if (itms == null || lios == null || rpgs == null || vehs == null || lvl == null) + if (itms == null || lios == null || rpgs == null || vehs == null || lvl == null) { //Missing a core file foreach (string missing in AssetFileFactory._missingFiles) Log.write(TLog.Error, "Missing file: {0}", missing); @@ -486,5 +485,83 @@ public List getAssetList() { return _assetList; } - } + + /// + /// Some vehicle files have nested vehicle files within, this will grab all of them as needed + /// + private VehicleFile LoadVehicleFiles(CfgInfo zoneConf) + { + VehicleFile mainFile = AssetFileFactory.CreateFromFile(zoneConf.level.vehFile); + if (mainFile == null) return null; + + var nestedFiles = new List(); + + foreach(var veh in mainFile?.Data) + { + if (veh.Type == VehInfo.Types.Nested) + { + var nestedVeh = (VehInfo.Nested)veh; + + if (!string.IsNullOrEmpty(nestedVeh.VehicleFileName)) + { + var fileInfo = AssetFileFactory.CreateFromFile(nestedVeh.VehicleFileName); + + if (fileInfo != null) + { + nestedFiles.Add(fileInfo); + addAssetData(fileInfo); + } + } + } + } + + foreach (var nestedFile in nestedFiles) + { + mainFile.Data.AddRange(nestedFile.Data); + } + + // remove all nested references to prevent duplicate id issues for no reason + mainFile.Data.RemoveAll(veh => veh.Type == VehInfo.Types.Nested); + + return mainFile; + } + + /// + /// Some item files have nested item files within, this will grab all of them as needed + /// + private ItemFile LoadItemFiles(CfgInfo zoneConf) + { + ItemFile mainFile = AssetFileFactory.CreateFromFile(zoneConf.level.itmFile); + if (mainFile == null) return null; + + var nestedFiles = new List(); + + foreach (ItemInfo itemInfo in mainFile.Data) + { + foreach (var fileName in itemInfo.getFilesToLoad()) + { + if (!string.IsNullOrEmpty(fileName)) + { + var fileInfo = AssetFileFactory.CreateFromFile(fileName); + + if (fileInfo != null) + { + nestedFiles.Add(fileInfo); + addAssetData(fileInfo); + } + } + } + } + + foreach (var nestedFile in nestedFiles) + { + mainFile.Data.AddRange(nestedFile.Data); + } + + // remove all nested references to prevent duplicate id issues for no reason + mainFile.Data.RemoveAll(item => item.itemType == ItemInfo.ItemType.Nested); + + return mainFile; + } + } }