using System.Collections; using System.Reflection; using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Core.Library.Common.Addon; using Milimoe.FunGame.Core.Library.Constant; namespace Milimoe.FunGame.Core.Service { internal class AddonManager { /// /// 从plugins目录加载所有插件 /// /// /// /// /// internal static Dictionary LoadPlugins(Dictionary plugins, Hashtable delegates, params object[] otherobjs) { if (!Directory.Exists(ReflectionSet.PluginFolderPath)) return plugins; string[] dlls = Directory.GetFiles(ReflectionSet.PluginFolderPath, "*.dll"); foreach (string dll in dlls) { // 加载目录下所有的DLL Assembly assembly = Assembly.LoadFrom(dll); // 遍历DLL中继承了Plugin的类型 foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => type.IsSubclassOf(typeof(Plugin)))) { Plugin? instance = (Plugin?)Activator.CreateInstance(type); if (instance != null && instance.Load(otherobjs) && instance.Name.Trim() != "") { instance.Controller = new(instance, delegates); plugins.TryAdd(instance.Name, instance); } } } return plugins; } /// /// 从gamemodes目录加载所有模组 /// /// /// /// /// /// /// /// internal static Dictionary LoadGameModes(Dictionary gamemodes, List characters, List skills, List items, Hashtable delegates, params object[] otherobjs) { if (!Directory.Exists(ReflectionSet.GameModeFolderPath)) return gamemodes; string[] dlls = Directory.GetFiles(ReflectionSet.GameModeFolderPath, "*.dll"); foreach (string dll in dlls) { Assembly assembly = Assembly.LoadFrom(dll); foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => type.IsSubclassOf(typeof(GameMode)))) { GameMode? instance = (GameMode?)Activator.CreateInstance(type); if (instance != null && instance.Load(otherobjs) && instance.Name.Trim() != "") { instance.Controller = new(instance, delegates); gamemodes.TryAdd(instance.Name, instance); } } foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => type.IsSubclassOf(typeof(Character)))) { Character? instance = (Character?)Activator.CreateInstance(type); if (instance != null && instance.Name.Trim() != "" && !characters.Contains(instance)) { characters.Add(instance); } } foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => type.IsSubclassOf(typeof(Skill)))) { Skill? instance = (Skill?)Activator.CreateInstance(type); if (instance != null && instance.Name.Trim() != "" && !skills.Contains(instance)) { skills.Add(instance); } } foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => type.IsSubclassOf(typeof(Item)))) { Item? instance = (Item?)Activator.CreateInstance(type); if (instance != null && instance.Name.Trim() != "" && !items.Contains(instance)) { items.Add(instance); } } } return gamemodes; } /// /// 从gamemodes目录加载所有适用于服务器的模组 /// /// /// /// /// /// /// /// internal static Dictionary LoadGameModesForServer(Dictionary gamemodes, List characters, List skills, List items, Hashtable delegates, params object[] otherobjs) { if (!Directory.Exists(ReflectionSet.GameModeFolderPath)) return gamemodes; string[] dlls = Directory.GetFiles(ReflectionSet.GameModeFolderPath, "*.dll"); foreach (string dll in dlls) { Assembly assembly = Assembly.LoadFrom(dll); foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => type.IsSubclassOf(typeof(GameModeServer)))) { GameModeServer? instance = (GameModeServer?)Activator.CreateInstance(type); if (instance != null && instance.Load(otherobjs) && instance.Name.Trim() != "") { instance.Controller = new(instance, delegates); gamemodes.TryAdd(instance.Name, instance); } } foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => type.IsSubclassOf(typeof(Character)))) { Character? instance = (Character?)Activator.CreateInstance(type); if (instance != null && instance.Name.Trim() != "" && !characters.Contains(instance)) { characters.Add(instance); } } foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => type.IsSubclassOf(typeof(Skill)))) { Skill? instance = (Skill?)Activator.CreateInstance(type); if (instance != null && instance.Name.Trim() != "" && !skills.Contains(instance)) { skills.Add(instance); } } foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => type.IsSubclassOf(typeof(Item)))) { Item? instance = (Item?)Activator.CreateInstance(type); if (instance != null && instance.Name.Trim() != "" && !items.Contains(instance)) { items.Add(instance); } } } return gamemodes; } /// /// 从gamemaps目录加载所有地图 /// /// /// /// internal static Dictionary LoadGameMaps(Dictionary gamemaps, params object[] objs) { if (!Directory.Exists(ReflectionSet.GameMapFolderPath)) return gamemaps; string[] dlls = Directory.GetFiles(ReflectionSet.GameMapFolderPath, "*.dll"); foreach (string dll in dlls) { Assembly assembly = Assembly.LoadFrom(dll); foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => type.IsSubclassOf(typeof(GameMap)))) { GameMap? instance = (GameMap?)Activator.CreateInstance(type); if (instance != null && instance.Load(objs) && instance.Name.Trim() != "") { gamemaps.TryAdd(instance.Name, instance); } } } return gamemaps; } } }