private void LoadPlugins() { m_plugineffects = new Dictionary <string, ITerrainEffect>(); string plugineffectsPath = "Terrain"; // Load the files in the Terrain/ dir if (!Directory.Exists(plugineffectsPath)) { return; } string[] files = Directory.GetFiles(plugineffectsPath); foreach (string file in files) { m_log.Info("Loading effects in " + file); try { Assembly library = Assembly.LoadFrom(file); foreach (Type pluginType in library.GetTypes()) { try { if (pluginType.IsAbstract || pluginType.IsNotPublic) { continue; } string typeName = pluginType.Name; if (pluginType.GetInterface("ITerrainEffect", false) != null) { ITerrainEffect terEffect = (ITerrainEffect)Activator.CreateInstance(library.GetType(pluginType.ToString())); InstallPlugin(typeName, terEffect); } else if (pluginType.GetInterface("ITerrainLoader", false) != null) { ITerrainLoader terLoader = (ITerrainLoader)Activator.CreateInstance(library.GetType(pluginType.ToString())); m_loaders[terLoader.FileExtension] = terLoader; m_log.Info("L ... " + typeName); } } catch (AmbiguousMatchException) { } } } catch (BadImageFormatException) { } } }
public ModData(Manifest mod, InstalledMods mods, bool useLoadScreen = false) { Languages = Array.Empty <string>(); // Take a local copy of the manifest Manifest = new Manifest(mod.Id, mod.Package); ObjectCreator = new ObjectCreator(Manifest, mods); PackageLoaders = ObjectCreator.GetLoaders <IPackageLoader>(Manifest.PackageFormats, "package"); ModFiles = new FS(mod.Id, mods, PackageLoaders); ModFiles.LoadFromManifest(Manifest); Manifest.LoadCustomData(ObjectCreator); if (useLoadScreen) { LoadScreen = ObjectCreator.CreateObject <ILoadScreen>(Manifest.LoadScreen.Value); LoadScreen.Init(this, Manifest.LoadScreen.ToDictionary(my => my.Value)); LoadScreen.Display(); } WidgetLoader = new WidgetLoader(this); MapCache = new MapCache(this); SoundLoaders = ObjectCreator.GetLoaders <ISoundLoader>(Manifest.SoundFormats, "sound"); SpriteLoaders = ObjectCreator.GetLoaders <ISpriteLoader>(Manifest.SpriteFormats, "sprite"); VideoLoaders = ObjectCreator.GetLoaders <IVideoLoader>(Manifest.VideoFormats, "video"); var terrainFormat = Manifest.Get <TerrainFormat>(); var terrainLoader = ObjectCreator.FindType(terrainFormat.Type + "Loader"); var terrainCtor = terrainLoader?.GetConstructor(new[] { typeof(ModData) }); if (terrainLoader == null || !terrainLoader.GetInterfaces().Contains(typeof(ITerrainLoader)) || terrainCtor == null) { throw new InvalidOperationException($"Unable to find a terrain loader for type '{terrainFormat.Type}'."); } TerrainLoader = (ITerrainLoader)terrainCtor.Invoke(new[] { this }); var sequenceFormat = Manifest.Get <SpriteSequenceFormat>(); var sequenceLoader = ObjectCreator.FindType(sequenceFormat.Type + "Loader"); var sequenceCtor = sequenceLoader?.GetConstructor(new[] { typeof(ModData) }); if (sequenceLoader == null || !sequenceLoader.GetInterfaces().Contains(typeof(ISpriteSequenceLoader)) || sequenceCtor == null) { throw new InvalidOperationException($"Unable to find a sequence loader for type '{sequenceFormat.Type}'."); } SpriteSequenceLoader = (ISpriteSequenceLoader)sequenceCtor.Invoke(new[] { this }); var modelFormat = Manifest.Get <ModelSequenceFormat>(); var modelLoader = ObjectCreator.FindType(modelFormat.Type + "Loader"); var modelCtor = modelLoader?.GetConstructor(new[] { typeof(ModData) }); if (modelLoader == null || !modelLoader.GetInterfaces().Contains(typeof(IModelSequenceLoader)) || modelCtor == null) { throw new InvalidOperationException($"Unable to find a model loader for type '{modelFormat.Type}'."); } ModelSequenceLoader = (IModelSequenceLoader)modelCtor.Invoke(new[] { this }); ModelSequenceLoader.OnMissingModelError = s => Log.Write("debug", s); Hotkeys = new HotkeyManager(ModFiles, Game.Settings.Keys, Manifest); Translation = new Translation(Game.Settings.Player.Language, Manifest.Translations, DefaultFileSystem); defaultRules = Exts.Lazy(() => Ruleset.LoadDefaults(this)); defaultTerrainInfo = Exts.Lazy(() => { var items = new Dictionary <string, ITerrainInfo>(); foreach (var file in Manifest.TileSets) { var t = TerrainLoader.ParseTerrain(DefaultFileSystem, file); items.Add(t.Id, t); } return((IReadOnlyDictionary <string, ITerrainInfo>)(new ReadOnlyDictionary <string, ITerrainInfo>(items))); }); defaultSequences = Exts.Lazy(() => { var items = DefaultTerrainInfo.ToDictionary(t => t.Key, t => new SequenceProvider(DefaultFileSystem, this, t.Key, null)); return((IReadOnlyDictionary <string, SequenceProvider>)(new ReadOnlyDictionary <string, SequenceProvider>(items))); }); initialThreadId = Environment.CurrentManagedThreadId; }
private ITerrainChannel LoadFileWithLoader(FileInfo file, int numX, int numY, ITerrainLoader loader) { ITerrainChannel tiledChannel = null; string filename = file.FullName; // read the cross region heightmap using the appropriate loader if (IsRawFileLoader(loader)) { IRawFileLoader rawLoader = (IRawFileLoader)loader; tiledChannel = rawLoader.LoadRawFile(filename, numX, numY); } else { tiledChannel = loader.LoadFile(filename); } return tiledChannel; }
/// <summary> /// For all of the passed in regions, save each region to a separate terrain file based on the /// passed in stem using the given loader /// Append the grid coordinates to the stem to generate a unique filename /// </summary> /// <param name="file">the file to form the stem of the written tiles</param> /// <param name="extension"></param> private void Split(FileInfo file, ITerrainLoader loader, Scene[,] scenes) { String stem = Path.Combine(file.DirectoryName, Path.GetFileNameWithoutExtension(file.FullName)); String extension = file.Extension; foreach (Scene scene in scenes) { //split command doesn't rely on a rectangular, contiguous set //of regions... so have to check each one if (scene != null) { String filename = GenerateFilenameForRegion(stem, extension, scene); loader.SaveFile(filename, scene.Heightmap); } } }
private bool IsRawFileLoader(ITerrainLoader loader) { return typeof(IRawFileLoader).IsAssignableFrom(loader.GetType()); }