public static GenericWAGFile Get(string path) { if (!SharedWAGFiles.ContainsKey(path)) { GenericWAGFile wagFile = new GenericWAGFile(path); SharedWAGFiles.Add(path, wagFile); return(wagFile); } else { return(SharedWAGFiles[path]); } }
public static TrainCar Load(Simulator simulator, string wagFilePath, bool initialize = true) { GenericWAGFile wagFile = SharedGenericWAGFileManager.Get(wagFilePath); TrainCar car; if (wagFile.OpenRails != null && wagFile.OpenRails.DLL != null) { // wag file specifies an external DLL try { // TODO search the path list string wagFolder = Path.GetDirectoryName(wagFilePath); string dllPath = FindTrainCarPlugin(wagFolder, wagFile.OpenRails.DLL); Assembly customDLL = Assembly.LoadFrom(dllPath); object[] args = new object[] { wagFilePath }; car = (TrainCar)customDLL.CreateInstance("ORTS.CustomCar", true, BindingFlags.CreateInstance, null, args, null, null); return(car); } catch (Exception error) { Trace.WriteLine(new FileLoadException(wagFile.OpenRails.DLL, error)); // on error, fall through and try loading without the custom dll } } if (!wagFile.IsEngine) { // its an ordinary MSTS wagon car = new MSTSWagon(simulator, wagFilePath); } else { // its an ordinary MSTS engine of some type. if (wagFile.Engine.Type == null) { throw new InvalidDataException(wagFilePath + "\r\n\r\nEngine type missing"); } switch (wagFile.Engine.Type.ToLower()) { // TODO complete parsing of proper car types case "electric": car = new MSTSElectricLocomotive(simulator, wagFilePath); break; case "steam": car = new MSTSSteamLocomotive(simulator, wagFilePath); break; case "diesel": car = new MSTSDieselLocomotive(simulator, wagFilePath); break; case "control": car = new MSTSControlTrailerCar(simulator, wagFilePath); break; default: throw new InvalidDataException(wagFilePath + "\r\n\r\nUnknown engine type: " + wagFile.Engine.Type); } } MSTSWagon wagon = car as MSTSWagon; if (car != null) { wagon.Load(); if (initialize) { wagon.Initialize(); } } return(car); }