public override void ProcessRequest(object sender, SWEventArgs args) { if (!new string[] { "HubUserLogin", "GuestLogin" }.Contains((string)args.ResponseJson["command"])) { return; } JObject wizard = (JObject)args.ResponseJson["wizard_info"]; List <JObject> monsters = ((JArray)args.ResponseJson["unit_list"]).Cast <JObject>().ToList(); List <JObject> runes = ((JArray)args.ResponseJson["runes"]).Cast <JObject>().ToList(); List <JObject> crafts = ((JArray)args.ResponseJson["rune_craft_item_list"]).Cast <JObject>().ToList(); Optimizer optimizer = new Optimizer(); optimizer.tvalue = args.Response.TValue; optimizer.wizard_id = (long)wizard["wizard_id"]; optimizer.deco_list = args.ResponseJson["deco_list"]; long?storage_id = null; foreach (JObject building in args.ResponseJson["building_list"]) { if ((long)building["building_master_id"] == 25) { storage_id = (long)building["building_id"]; break; } } Dictionary <long, long> monster_id_mapping = new Dictionary <long, long>(); Dictionary <long, long> rune_id_mapping = new Dictionary <long, long>(); int craft_id = 1; foreach (var craft in crafts .OrderBy(c => (long)c["craft_type"]) .ThenBy(c => (long)c["craft_item_id"])) { optimizer.crafts.Add(SWPlugin.MapCraft(craft, craft_id)); craft_id++; } int rune_id = 1; foreach (var rune in runes .OrderBy(r => (long)r["set_id"]) .ThenBy(r => (long)r["slot_no"])) { rune_id_mapping[(long)rune["rune_id"]] = rune_id; rune_id++; } int monster_id = 1; foreach (var monster in monsters .OrderBy(m => (m["building_id"].Equals(storage_id) ? 1 : 0)) .ThenBy(m => 6 - (long)m["class"]) .ThenBy(m => 40 - (long)m["unit_level"]) .ThenBy(m => (long)m["attribute"]) .ThenBy(m => 1 - ((((long)m["unit_master_id"]) / 10) % 10)) .ThenBy(m => (long)m["unit_id"])) { monster_id_mapping[(long)monster["unit_id"]] = monster_id; monster_id++; JEnumerable <JToken> monster_runes; var rr = monster["runes"]; JObject jo = rr as JObject; if (jo != null) { monster_runes = (JEnumerable <JToken>)jo.Values(); } else { monster_runes = rr.Children(); } foreach (var rune in monster_runes .OrderBy(r => (long)r["slot_no"])) { rune_id_mapping[(long)rune["rune_id"]] = rune_id; rune_id++; } } foreach (var rune in runes) { var optimizer_rune = MapRune(rune, rune_id_mapping[(long)rune["rune_id"]]); optimizer.runes.Add(optimizer_rune); } foreach (var monster in monsters) { var optimizer_monster = MapMonster(monster, monster_id_mapping, storage_id); optimizer.mons.Add(optimizer_monster); JEnumerable <JToken> monster_runes; var rr = monster["runes"]; JObject jo = rr as JObject; if (jo != null) { monster_runes = (JEnumerable <JToken>)jo.Values(); } else { monster_runes = rr.Children(); } foreach (var rune in monster_runes) { var optimizer_rune = MapRune((JObject)rune, rune_id_mapping[(long)rune["rune_id"]], monster_id_mapping[(long)monster["unit_id"]], (long)monster["unit_master_id"]); optimizer_rune["monster_n"] = $"{MonsterName((long)monster["unit_master_id"], "Unknown name")}{(((long)monster["building_id"] == storage_id) ? " (In Storage)" : "")}"; optimizer.runes.Add(optimizer_rune); } } File.WriteAllText($"{(int)wizard["wizard_id"]}-optimizer.json", JsonConvert.SerializeObject(optimizer, Formatting.Indented)); Console.WriteLine("Generated optimizer.json"); }
private void LoadPlugins(string path) { if (!Directory.Exists(path)) { Console.WriteLine("No plugin directory: " + path); return; } Console.WriteLine("Loading plugins from " + path); try { string monData = File.ReadAllText(path + "/data/monsterNames.json"); SWReference.MonsterNameMap = JsonConvert.DeserializeObject <Dictionary <string, string> >(monData); } catch { }; string[] dllFileNames = Directory.GetFiles(path, "*.dll"); ICollection <Assembly> assemblies = new List <Assembly>(dllFileNames.Length); foreach (string dllFile in dllFileNames) { AssemblyName an = AssemblyName.GetAssemblyName(dllFile); Assembly assembly = Assembly.Load(an); assemblies.Add(assembly); } Type pluginType = typeof(SWPlugin); ICollection <Type> pluginTypes = new List <Type>(); foreach (Assembly assembly in assemblies) { if (assembly != null) { Type[] types = assembly.GetTypes(); foreach (Type type in types) { if (type.IsInterface || type.IsAbstract) { continue; } else { //if (type.GetInterface(pluginType.FullName) != null) if (pluginType.IsAssignableFrom(type)) { pluginTypes.Add(type); } } } } } plugins = new List <SWPlugin>(pluginTypes.Count); foreach (Type type in pluginTypes) { SWPlugin plugin = null; try { plugin = (SWPlugin)Activator.CreateInstance(type); plugin.OnLoad(); plugins.Add(plugin); this.SWResponse += plugin.ProcessRequest; Console.WriteLine($"Successfully loaded plugin: {plugin.GetType().Name}"); } catch (Exception e) { if (plugin != null) { plugins.Remove(plugin); this.SWResponse -= plugin.ProcessRequest; } Console.WriteLine($"Failed loading plugin: {type.Name} with exception: {e.GetType().Name}: {e.Message}"); #if DEBUG Console.WriteLine(e.StackTrace); #endif } } }