Ejemplo n.º 1
0
        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");
        }
Ejemplo n.º 2
0
        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
                }
            }
        }