Пример #1
0
        public void LoadFromURL(string url)
        {
            string s = url.Substring(TreeAddress.Length + (url.StartsWith("https") ? 1 : 0)).Replace("-", "+").Replace("_", "/");

            byte[] decbuff = Convert.FromBase64String(s);
            var    i       = BitConverter.ToInt32(new byte[] { decbuff[3], decbuff[2], decbuff[1], decbuff[1] }, 0);
            var    b       = decbuff[4];
            var    j       = 0L;

            if (i > 0)
            {
                j = decbuff[5];
            }
            List <UInt16> nodes = new List <UInt16>();

            for (int k = 6; k < decbuff.Length; k += 2)
            {
                byte[] dbff = new byte[] { decbuff[k + 1], decbuff[k + 0] };
                if (Skillnodes.Keys.Contains(BitConverter.ToUInt16(dbff, 0)))
                {
                    nodes.Add((BitConverter.ToUInt16(dbff, 0)));
                }
            }
            Chartype = b;
            SkilledNodes.Clear();
            SkillTree.SkillNode startnode = Skillnodes.First(nd => nd.Value.name.ToUpper() == CharName[Chartype].ToUpper()).Value;
            SkilledNodes.Add(startnode.id);
            foreach (ushort node in nodes)
            {
                SkilledNodes.Add(node);
            }
            UpdateAvailNodes();
        }
Пример #2
0
        private void border1_MouseMove(object sender, MouseEventArgs e)
        {
            Point    p = e.GetPosition(border1.Child);
            Vector2D v = new Vector2D(p.X, p.Y);

            v             = v * multransform + addtransform;
            textBox1.Text = "" + v.X;
            textBox2.Text = "" + v.Y;
            SkillTree.SkillNode node = null;

            var nodes = Tree.Skillnodes.Where(n => ((n.Value.Position - v).Length < 50));

            if (nodes != null && nodes.Count() != 0)
            {
                node = nodes.First().Value;
            }

            if (node != null && node.Attributes.Count != 0)
            {
                string tooltip = node.name + "\n" + node.attributes.Aggregate((s1, s2) => s1 + "\n" + s2);
                if (!(sToolTip.IsOpen == true && lasttooltip == tooltip))
                {
                    sToolTip.Content = tooltip;
                    sToolTip.IsOpen  = true;
                    lasttooltip      = tooltip;
                }
                if (Tree.SkilledNodes.Contains(node.id))
                {
                    toRemove = Tree.ForceRefundNodePreview(node.id);
                    if (toRemove != null)
                    {
                        Tree.DrawRefundPreview(toRemove);
                    }
                }
                else
                {
                    prePath = Tree.GetShortestPathTo(node.id);
                    Tree.DrawPath(prePath);
                }
            }
            else
            {
                sToolTip.Tag    = false;
                sToolTip.IsOpen = false;
                prePath         = null;
                toRemove        = null;
                if (Tree != null)
                {
                    Tree.ClearPath();
                }
            }
        }
        private void border1_Click(object sender, RoutedEventArgs e)
        {
            Point    p = ((MouseEventArgs)e.OriginalSource).GetPosition(border1.Child);
            Vector2D v = new Vector2D(p.X, p.Y);

            v = v * multransform + addtransform;
            SkillTree.SkillNode node = null;

            var nodes = Tree.Skillnodes.Where(n => ((n.Value.Position - v).Length < 50));

            if (nodes != null && nodes.Count() != 0)
            {
                node = nodes.First().Value;

                if (node.spc == null)
                {
                    if (Keyboard.IsKeyDown(Key.LeftCtrl))
                    {
                        Tree.ToggleToSolve(node.id);
                    }
                    else
                    {
                        if (Tree.SkilledNodes.Contains(node.id))
                        {
                            Tree.ForceRefundNode(node.id);
                            UpdateAllAttributeList();

                            prePath = Tree.GetShortestPathTo(node.id);
                            Tree.DrawPath(prePath);
                        }
                        else if (prePath != null)
                        {
                            foreach (ushort i in prePath)
                            {
                                Tree.SkilledNodes.Add(i);
                            }
                            UpdateAllAttributeList();
                            Tree.UpdateAvailNodes();

                            toRemove = Tree.ForceRefundNodePreview(node.id);
                            if (toRemove != null)
                            {
                                Tree.DrawRefundPreview(toRemove);
                            }
                        }
                    }
                }
            }
            tbSkillURL.Text = Tree.SaveToURL();
        }
Пример #4
0
        private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (justLoaded)
            {
                justLoaded = false;
                return;
            }

            if (Tree == null)
            {
                return;
            }
            SkillTree.SkillNode startnode = Tree.Skillnodes.First(nd => nd.Value.name.ToUpper() == (Tree.CharName[cbCharType.SelectedIndex]).ToUpper()).Value;
            Tree.SkilledNodes.Clear();
            Tree.SkilledNodes.Add(startnode.id);
            Tree.Chartype = Tree.CharName.IndexOf((Tree.CharName[cbCharType.SelectedIndex]).ToUpper());
            Tree.UpdateAvailNodes();
            UpdateAllAttributeList();
        }
Пример #5
0
        /// <summary>
        /// Loads from the unofficial online tool
        /// </summary>
        public static void LoadBuildFromPoezone(SkillTree tree, string buildUrl)
        {
            if (!buildUrl.Contains('#'))
            {
                throw new FormatException( );
            }

            const string dataUrl      = "http://poezone.ru/skilltree/data.js";
            const string buildPostUrl = "http://poezone.ru/skilltree/";
            string       build        = buildUrl.Substring(buildUrl.LastIndexOf('#') + 1);

            string dataFile, buildFile;

            {
                HttpWebRequest req = ( HttpWebRequest )WebRequest.Create(dataUrl);
                req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.30 (KHTML, like Gecko) Iron/12.0.750.0 Chrome/12.0.750.0 Safari/534.30";
                WebResponse resp = req.GetResponse( );
                dataFile = new StreamReader(resp.GetResponseStream( )).ReadToEnd( );
            }

            {
                string         postData  = "build=" + build;
                byte[]         postBytes = Encoding.ASCII.GetBytes(postData);
                HttpWebRequest req       = ( HttpWebRequest )WebRequest.Create(buildPostUrl);
                req.Method                 = "POST";
                req.ContentLength          = postBytes.Length;
                req.ContentType            = "application/x-www-form-urlencoded";
                req.UserAgent              = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.30 (KHTML, like Gecko) Iron/12.0.750.0 Chrome/12.0.750.0 Safari/534.30";
                req.Accept                 = "application/json, text/javascript, */*; q=0.01";
                req.Host                   = "poezone.ru";
                req.Referer                = "http://poezone.ru/skilltree/";
                req.AutomaticDecompression = DecompressionMethods.GZip;
                //req.Headers.Add( "Accept", "application/json, text/javascript" );
                req.Headers.Add("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.3");
                req.Headers.Add("Accept-Encoding", "gzip,deflate,sdch");
                req.Headers.Add("Accept-Language", "en-US,en;q=0.8");

                //req.Headers.Add( "Connection", "keep-alive" );
                //req.Headers.Add( "Host", "poezone.ru" );
                req.Headers.Add("Origin", "http://poezone.ru");
                //req.Headers.Add( "Referer", "http://poezone.ru/skilltree/" );
                //req.Headers.Add( "User-Agent", );
                req.Headers.Add("X-Requested-With", "XMLHttpRequest");
                req.Expect      = "";
                req.Credentials = CredentialCache.DefaultCredentials;

                Stream dataStream = req.GetRequestStream( );
                dataStream.Write(postBytes, 0, postBytes.Length);
                dataStream.Close( );

                WebResponse resp   = req.GetResponse( );
                var         status = (resp as HttpWebResponse).StatusDescription;
                buildFile = new StreamReader(resp.GetResponseStream( )).ReadToEnd( );
            }

            if (!buildFile.Contains("["))
            {
                MessageBox.Show("Build does not exist and/or is corrupt!");
                return;
            }

            // position decompose
            List <Vector2D?> positions = new List <Vector2D?>( );
            var lines = dataFile.Split('\n');

            foreach (var line in lines)
            {
                if (line.StartsWith("skillpos="))
                {
                    string        posString = line.Substring(line.IndexOf('[') + 1, line.LastIndexOf(']') - line.IndexOf('[') - 1);
                    StringBuilder sb        = new StringBuilder( );
                    bool          inBracket = false;
                    foreach (var c in posString)
                    {
                        if (!inBracket && c == ',')
                        {
                            positions.Add(sb.Length == 0 ? null : new Vector2D?(new Vector2D(
                                                                                    int.Parse(sb.ToString( ).Split(',')[0]),
                                                                                    int.Parse(sb.ToString( ).Split(',')[1])
                                                                                    )));
                            sb.Clear( );
                        }
                        else
                        {
                            if (c == '[')
                            {
                                inBracket = true;
                            }
                            else if (c == ']')
                            {
                                inBracket = false;
                            }
                            else
                            {
                                sb.Append(c);
                            }
                        }
                    }
                    positions.Add(sb.Length == 0 ? null : new Vector2D?(new Vector2D(
                                                                            int.Parse(sb.ToString( ).Split(',')[0]),
                                                                            int.Parse(sb.ToString( ).Split(',')[1])
                                                                            )));
                }
            }

            // min max
            double minx = float.MaxValue, miny = float.MaxValue, maxx = float.MinValue, maxy = float.MinValue;

            foreach (var posn in positions)
            {
                if (!posn.HasValue)
                {
                    continue;
                }
                var pos = posn.Value;
                minx = Math.Min(pos.X, minx);
                miny = Math.Min(pos.Y, miny);
                maxx = Math.Max(pos.X, maxx);
                maxy = Math.Max(pos.Y, maxy);
            }

            double nminx = float.MaxValue, nminy = float.MaxValue, nmaxx = float.MinValue, nmaxy = float.MinValue;

            foreach (var node in tree.Skillnodes.Values)
            {
                var pos = node.Position;
                nminx = Math.Min(pos.X, nminx);
                nminy = Math.Min(pos.Y, nminy);
                nmaxx = Math.Max(pos.X, nmaxx);
                nmaxy = Math.Max(pos.Y, nmaxy);
            }

            //respose
            var        buildResp = buildFile.Replace("[", "").Replace("]", "").Split(',');
            int        character = int.Parse(buildResp[0]);
            List <int> skilled   = new List <int>( );

            tree.Chartype = character;
            tree.SkilledNodes.Clear( );
            SkillTree.SkillNode startnode = tree.Skillnodes.First(nd => nd.Value.name == tree.CharName[tree.Chartype].ToUpper( )).Value;
            tree.SkilledNodes.Add(startnode.id);

            for (int i = 1; i < buildResp.Length; ++i)
            {
                if (!positions[int.Parse(buildResp[i])].HasValue)
                {
                    Debugger.Break( );
                }

                var    poezonePos = (positions[int.Parse(buildResp[i])].Value - new Vector2D(minx, miny)) * new Vector2D(1 / (maxx - minx), 1 / (maxy - miny));
                double minDis     = 2;
                KeyValuePair <ushort, SkillTree.SkillNode> minNode = new KeyValuePair <ushort, SkillTree.SkillNode>();
                foreach (var node in tree.Skillnodes)
                {
                    var    nodePos = (node.Value.Position - new Vector2D(nminx, nminy)) * new Vector2D(1 / (nmaxx - nminx), 1 / (nmaxy - nminy));
                    double dis     = (nodePos - poezonePos).Length;
                    if (dis < minDis)
                    {
                        minDis  = dis;
                        minNode = node;
                    }
                }

                tree.SkilledNodes.Add(minNode.Key);
            }
            tree.UpdateAvailNodes( );

            //string dataFile =
        }