예제 #1
0
        public void OnSelected(PalePacket palePacket)
        {
            if (palePacket == null)
            {
                TxtInfo.Visible = false;
                return;
            }

            TxtInfo.WordWrap = false;

            try
            {
                if (_analyzers.TryGetValue(palePacket.Op, out var analyzer))
                {
                    TxtInfo.Text = analyzer.AnalyzePacket(palePacket);
                }
                else
                {
                    TxtInfo.Text = "No information.";
                }
            }
            catch (Exception ex)
            {
                TxtInfo.Text = "Error: " + ex.ToString();
            }

            TxtInfo.Visible = true;
        }
예제 #2
0
        /// <summary>
        /// Fires End event.
        /// </summary>
        internal void OnSelected(PalePacket palePacket)
        {
            var ev = Selected;

            if (ev == null)
            {
                return;
            }

            try
            {
                var evs = ev.GetInvocationList().Cast <Action <PalePacket> >();
                foreach (var e in evs)
                {
                    e(palePacket);
                    if (palePacket != null)
                    {
                        palePacket.Packet.Rewind();
                    }
                }
            }
            catch (Exception ex)
            {
                Trace.TraceError(ex.ToString());
            }
        }
예제 #3
0
파일: FrmMain.cs 프로젝트: Vinna/MabiPale2
        /// <summary>
        /// Adds packet to list, scrolls down if scroll is true.
        /// </summary>
        /// <param name="palePacket"></param>
        /// <param name="scroll"></param>
        private void AddPacketToFormList(PalePacket palePacket, bool scroll)
        {
            var name = "?";

            lock (opNames)
            {
                if (opNames.ContainsKey(palePacket.Op))
                {
                    name = opNames[palePacket.Op];
                }
            }

            var lvi = new ListViewItem((palePacket.Received ? "<" : ">") + palePacket.Op.ToString("X8"));

            lvi.UseItemStyleForSubItems = false;
            lvi.BackColor = palePacket.Received ? Color.FromArgb(0x0033bbff) : Color.FromArgb(0x00ff5522);
            lvi.ForeColor = Color.White;
            lvi.Tag       = palePacket;

            lvi.SubItems.Add(palePacket.Id.ToString("X16"));
            lvi.SubItems.Add(name);
            lvi.SubItems.Add(palePacket.Time > DateTime.MinValue ? palePacket.Time.ToString("hh:mm:ss.fff") : "");

            LstPackets.InvokeIfRequired((MethodInvoker) delegate
            {
                LstPackets.Items.Add(lvi);

                if (scroll)
                {
                    LstPackets.Items[LstPackets.Items.Count - 1].EnsureVisible();
                }
            });
        }
예제 #4
0
        public string AnalyzePacket(PalePacket palePacket)
        {
            palePacket.Packet.GetByte();
            var count = palePacket.Packet.GetInt();

            var sb = new StringBuilder();

            for (int i = 0; i < count; ++i)
            {
                sb.AppendFormat("{0}: ", (Stat)palePacket.Packet.GetInt());

                switch (palePacket.Packet.Peek())
                {
                case Shared.PacketElementType.Byte: sb.AppendLine(palePacket.Packet.GetByte().ToString()); break;

                case Shared.PacketElementType.Short: sb.AppendLine(palePacket.Packet.GetShort().ToString()); break;

                case Shared.PacketElementType.Int: sb.AppendLine(palePacket.Packet.GetInt().ToString()); break;

                case Shared.PacketElementType.Long: sb.AppendLine(palePacket.Packet.GetLong().ToString()); break;

                case Shared.PacketElementType.Float: sb.AppendLine(palePacket.Packet.GetFloat().ToString(CultureInfo.InvariantCulture)); break;

                case Shared.PacketElementType.String: sb.AppendLine(palePacket.Packet.GetString().ToString()); break;

                default: palePacket.Packet.Skip(1); sb.AppendLine("?"); break;
                }
            }

            return(sb.ToString());
        }
예제 #5
0
 private void OnSelected(PalePacket palePacket)
 {
     if (form != null && !form.IsDisposed)
     {
         form.OnSelected(palePacket);
     }
 }
예제 #6
0
        /// <summary>
        /// Adds packet to list, scrolls down if scroll is true.
        /// </summary>
        /// <param name="palePacket"></param>
        /// <param name="scroll"></param>
        private void AddPacketToFormList(PalePacket palePacket, bool scroll)
        {
            var name = palePacket.OpName;

            if (name == "ZC_NORMAL")
            {
                var size  = palePacket.Packet.GetShort();
                var subOp = palePacket.Packet.GetInt();
                name += "(0x" + subOp.ToString("X2") + ")";
                palePacket.Packet.Rewind();
            }

            var lvi = new ListViewItem((palePacket.Received ? "<" : ">") + palePacket.Op.ToString("X8"));

            lvi.UseItemStyleForSubItems = false;
            lvi.BackColor = palePacket.Received ? Color.FromArgb(0x0033bbff) : Color.FromArgb(0x00ff5522);
            lvi.ForeColor = Color.White;
            lvi.Tag       = palePacket;

            lvi.SubItems.Add(name);
            lvi.SubItems.Add(palePacket.Time > DateTime.MinValue ? palePacket.Time.ToString("hh:mm:ss.fff") : "");

            LstPackets.InvokeIfRequired((MethodInvoker) delegate
            {
                LstPackets.Items.Add(lvi);

                if (scroll)
                {
                    LstPackets.Items[LstPackets.Items.Count - 1].EnsureVisible();
                }
            });
        }
예제 #7
0
파일: FrmMain.cs 프로젝트: xyfc/PaleTree
        /// <summary>
        /// Window message handler, handles incoming data from provider.
        /// </summary>
        /// <param name="m"></param>
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WinApi.WM_COPYDATA)
            {
                var cds = (WinApi.COPYDATASTRUCT)Marshal.PtrToStructure(m.LParam, typeof(WinApi.COPYDATASTRUCT));

                // The op will *always* be there, who knows about the
                // other things.
                if (cds.cbData < 2)
                {
                    return;
                }

                var recv = (int)cds.dwData == Sign.Recv;

                var data = new byte[cds.cbData];
                Marshal.Copy(cds.lpData, data, 0, cds.cbData);

                var type       = (!recv ? PacketType.ClientServer : PacketType.ServerClient);
                var packet     = new Packet(data, type);
                var name       = Shared.Op.GetName(packet.Op);
                var length     = Shared.Op.GetSize(packet.Op);
                var palePacket = new PalePacket(name, length, packet, DateTime.Now, recv);

                lock (packetQueue)
                    packetQueue.Enqueue(palePacket);
            }
            base.WndProc(ref m);
        }
예제 #8
0
        private void ParseConditionUpdate(PalePacket palePacket)
        {
            var conditionsA = palePacket.Packet.GetLong();
            var conditionsB = palePacket.Packet.GetLong();
            var conditionsC = palePacket.Packet.GetLong();
            var conditionsD = palePacket.Packet.Peek() == Shared.PacketElementType.Long ? palePacket.Packet.GetLong() : 0;
            var conditionsE = palePacket.Packet.Peek() == Shared.PacketElementType.Long ? palePacket.Packet.GetLong() : 0;
            var conditionsF = palePacket.Packet.Peek() == Shared.PacketElementType.Long ? palePacket.Packet.GetLong() : 0;
            var conditionsG = palePacket.Packet.Peek() == Shared.PacketElementType.Long ? palePacket.Packet.GetLong() : 0;

            var sb = new StringBuilder();

            sb.AppendLine("A: {0}", (ConditionsA)conditionsA);
            sb.AppendLine("B: {0}", (ConditionsB)conditionsB);
            sb.AppendLine("C: {0}", (ConditionsC)conditionsC);
            sb.AppendLine("D: {0}", (ConditionsD)conditionsD);
            sb.AppendLine("E: {0}", (ConditionsE)conditionsE);
            sb.AppendLine("F: {0}", (ConditionsF)conditionsF);
            sb.AppendLine("G: {0}", (ConditionsG)conditionsG);

            var extraCount = palePacket.Packet.GetInt();

            if (extraCount != 0)
            {
                sb.AppendLine();
            }

            for (int i = 0; i < extraCount; ++i)
            {
                var id  = palePacket.Packet.GetInt();
                var str = palePacket.Packet.GetString();
                var div = id / 64;
                var mod = id % 64;

                switch (div)
                {
                case 0: sb.AppendLine("{0} - {1}", (ConditionsA)((ulong)1 << mod), str); break;

                case 1: sb.AppendLine("{0} - {1}", (ConditionsB)((ulong)1 << mod), str); break;

                case 2: sb.AppendLine("{0} - {1}", (ConditionsC)((ulong)1 << mod), str); break;

                case 3: sb.AppendLine("{0} - {1}", (ConditionsD)((ulong)1 << mod), str); break;

                case 4: sb.AppendLine("{0} - {1}", (ConditionsE)((ulong)1 << mod), str); break;

                case 5: sb.AppendLine("{0} - {1}", (ConditionsF)((ulong)1 << mod), str); break;

                case 6: sb.AppendLine("{0} - {1}", (ConditionsG)((ulong)1 << mod), str); break;

                default:
                    var ident = (char)('A' + div) + ":0x" + ((ulong)1 << mod).ToString("X16");
                    sb.AppendLine("{0} - {1}", ident, str);
                    break;
                }
            }

            TxtInfo.Text = sb.ToString();
        }
예제 #9
0
파일: FrmMain.cs 프로젝트: Vinna/MabiPale2
        /// <summary>
        /// Loads log file and adds packets to list.
        /// </summary>
        /// <param name="path"></param>
        private void LoadFile(string path)
        {
            var newPackets = new List <PalePacket>();

            using (var sr = new StreamReader(path))
            {
                string line;
                while ((line = sr.ReadLine()) != null)
                {
                    line = line.Trim();
                    var recv = false;

                    if (string.IsNullOrWhiteSpace(line) || (!line.StartsWith("Send") && !(recv = line.StartsWith("Recv"))))
                    {
                        continue;
                    }

                    var spaceIdx = line.IndexOf(' ');

                    var date = DateTime.MinValue;
                    if (line[4] == '@')
                    {
                        date = DateTime.Parse(line.Substring(5, spaceIdx - 5));
                    }

                    var packetStr  = line.Substring(spaceIdx + 1, line.Length - spaceIdx - 1);
                    var packetArr  = HexTool.ToByteArray(packetStr);
                    var packet     = new Packet(packetArr, 0);
                    var palePacket = new PalePacket(packet, date, recv);

                    newPackets.Insert(0, palePacket);
                }
            }

            LstPackets.BeginUpdate();

            foreach (var palePacket in newPackets)
            {
                AddPacketToFormList(palePacket, false);
            }

            LstPackets.EndUpdate();

            UpdateCount();

            foreach (var palePacket in newPackets)
            {
                if (palePacket.Received)
                {
                    pluginManager.OnRecv(palePacket);
                }
                else
                {
                    pluginManager.OnSend(palePacket);
                }
            }
        }
예제 #10
0
파일: Main.cs 프로젝트: xyfc/PaleTree
        private void OnSelectedHex(PalePacket palePacket, int start)
        {
            if (form == null || form.IsDisposed)
            {
                return;
            }

            form.UpdateValues(buffer, start);
        }
예제 #11
0
파일: FrmFind.cs 프로젝트: xyfc/MabiPale2
        /// <param name="packet">Packet to test.</param>
        /// <param name="opNames">Definitions pairing opcodes with their human-readable name.</param>
        /// <returns>Whether <paramref name="packet"/> matches against this SearchParametres object.</returns>
        /// <exception cref="InvalidOperationException">Thrown if this SearchParametres object has its search mode set to 'NoOp'.</exception>
        public bool IsMatch(PalePacket packet, Dictionary <int, string> opNames)
        {
            // Handle obvious mismatches
            if (this.SearchMode == SearchModes.NoOp)
            {
                throw new InvalidOperationException("This object has its search mode set to 'NoOp'. Cannot evaluate packet.");
                return(false);
            }

            if (!this.PacketBounds.HasFlag(packet.Received ? SendOrRecv.Recv : SendOrRecv.Send))
            {
                return(false);
            }



            // Begin probing packet
            if (this.SearchMode == SearchModes.Hexadecimal)
            {
                return(HexTool.ToString(packet.Packet.GetBuffer()).IndexOf(this.StringQuery, StringComparison.OrdinalIgnoreCase) >= 0);
            }
            else             //if (this.SearchMode == SearchModes.String)
            {
                StringComparison comp = this.CaseSensitive ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase;

                if (this.LookAt.HasFlag(LookAtCandidates.Ops))
                {
                    if ((opNames.ContainsKey(packet.Op) && opNames[packet.Op].IndexOf(this.StringQuery, comp) >= 0) ||                  // Try op name
                        (packet.Op.ToString("X8").IndexOf(this.StringQuery, StringComparison.OrdinalIgnoreCase) >= 0))                            // Try op code
                    {
                        return(true);
                    }
                }

                if (this.LookAt.HasFlag(LookAtCandidates.Ids))
                {
                    if (packet.Id.ToString("X16").IndexOf(this.StringQuery, StringComparison.OrdinalIgnoreCase) >= 0)
                    {
                        return(true);
                    }
                }

                if (this.LookAt.HasFlag(LookAtCandidates.Data_String))
                {
                    if (packet.ToString().IndexOf(this.StringQuery, comp) >= 0)
                    {
                        return(true);
                    }
                }

                return(false);
            }
        }
예제 #12
0
        private void ParseNpcTalkSelect(PalePacket palePacket)
        {
            var xml = palePacket.Packet.GetString();

            var regex = Regex.Match(xml, @"<return type=""[^""]+"">([^<]+)</return>");

            if (!regex.Success)
            {
                throw new Exception();
            }

            TxtInfo.Text = "Response: " + regex.Groups[1].Value;
        }
예제 #13
0
        public string AnalyzePacket(PalePacket palePacket)
        {
            var xml = palePacket.Packet.GetString();

            var regex = Regex.Match(xml, @"<return type=""[^""]+"">([^<]+)</return>");

            if (!regex.Success)
            {
                throw new Exception();
            }

            return("Response: " + regex.Groups[1].Value);
        }
예제 #14
0
파일: Main.cs 프로젝트: xyfc/PaleTree
        private void OnSelected(PalePacket palePacket)
        {
            if (palePacket != null)
            {
                buffer = palePacket.Packet.GetBuffer();
            }
            else
            {
                buffer = null;
            }

            form.UpdateValues(buffer, 0);
        }
예제 #15
0
        /// <summary>
        /// Fired when the selected byte in the hex control changes.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void HexBox_SelectionStartChanged(object sender, EventArgs e)
        {
            PalePacket palePacket = null;
            int        start      = -1;

            if (LstPackets.SelectedItems.Count != 0)
            {
                palePacket = (PalePacket)LstPackets.SelectedItems[0].Tag;
                start      = (int)HexBox.SelectionStart;
            }

            pluginManager.OnSelectedHex(palePacket, start);
        }
예제 #16
0
        /// <param name="packet">Packet to test.</param>
        /// <param name="opNames">Definitions pairing opcodes with their human-readable name.</param>
        /// <returns>Whether <paramref name="packet"/> matches against this SearchParametres object.</returns>
        /// <exception cref="InvalidOperationException">Thrown if this SearchParametres object has its search mode set to 'NoOp'.</exception>
        public bool IsMatch(PalePacket packet, Dictionary <int, string> opNames)
        {
            // Handle obvious mismatches
            if (this.SearchMode == SearchModes.NoOp)
            {
                throw new InvalidOperationException("This object has its search mode set to 'NoOp'. Cannot evaluate packet.");
                return(false);
            }

            if (!this.PacketBounds.HasFlag(packet.Received ? SendOrRecv.Recv : SendOrRecv.Send))
            {
                return(false);
            }



            // Begin probing packet
            if (this.SearchMode == SearchModes.Hexadecimal)
            {
                return(HexTool.ToString(packet.Packet.GetBuffer()).Contains(this.StringQuery));
            }
            else             //if (this.SearchMode == SearchModes.String)
            {
                if (this.LookAt.HasFlag(LookAtCandidates.Ops))
                {
                    if (opNames.ContainsKey(packet.Op) && opNames[packet.Op].Contains(this.StringQuery))
                    {
                        return(true);
                    }
                }

                if (this.LookAt.HasFlag(LookAtCandidates.Ids))
                {
                    if (packet.Id.ToString("X16").Contains(this.StringQuery.ToUpper()))
                    {
                        return(true);
                    }
                }

                if (this.LookAt.HasFlag(LookAtCandidates.Data_String))
                {
                    if (packet.ToString().Contains(this.StringQuery))
                    {
                        return(true);
                    }
                }

                return(false);
            }
        }
예제 #17
0
파일: Main.cs 프로젝트: xyfc/MabiPale2
 private void OnSend(PalePacket palePacket)
 {
     if (palePacket.Op == Op.ChannelLogin)
     {
         var packet = palePacket.Packet;
         packet.GetString();
         packet.GetString();
         packet.GetLong();
         this.MyEntityId = packet.GetLong();
     }
     else if (palePacket.Id >= MabiId.Characters && palePacket.Id < MabiId.Pets)
     {
         this.MyEntityId = palePacket.Id;
     }
 }
예제 #18
0
파일: Main.cs 프로젝트: xyfc/MabiPale2
        private void OnSelected(PalePacket palePacket)
        {
            if (form == null || form.IsDisposed || palePacket.Op != Op.DungeonInfo)
            {
                return;
            }

            palePacket.Packet.GetLong();
            palePacket.Packet.GetLong();
            palePacket.Packet.GetByte();
            var name      = palePacket.Packet.GetString();
            var itemId    = palePacket.Packet.GetInt();
            var seed      = palePacket.Packet.GetInt();
            var floorPlan = palePacket.Packet.GetInt();

            form.SetValuesAndGenerate(name, itemId, floorPlan);
        }
예제 #19
0
파일: FrmMain.cs 프로젝트: Vinna/MabiPale2
        /// <summary>
        /// Called when selecting a packet in the list,
        /// shows the packet in the textbox.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void LstPackets_SelectedIndexChanged(object sender, EventArgs e)
        {
            PalePacket palePacket = null;

            if (LstPackets.SelectedItems.Count == 0)
            {
                TxtPacket.Text = "";
            }
            else
            {
                palePacket = (PalePacket)LstPackets.SelectedItems[0].Tag;

                TxtPacket.Text = palePacket.ToString();
            }

            pluginManager.OnSelected(palePacket);
        }
예제 #20
0
파일: Main.cs 프로젝트: exectails/PaleTree
        private void OnSelected(PalePacket palePacket)
        {
            if (form == null || form.IsDisposed)
            {
                return;
            }

            if (palePacket != null)
            {
                buffer = palePacket.Packet.GetBuffer();
            }
            else
            {
                buffer = null;
            }

            form.UpdateValues(buffer, 0);
        }
예제 #21
0
        /// <summary>
        /// Called when selecting a packet in the list,
        /// shows the packet in the textbox.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void LstPackets_SelectedIndexChanged(object sender, EventArgs e)
        {
            PalePacket palePacket = null;

            if (LstPackets.SelectedItems.Count == 0)
            {
                TxtPacketInfo.Text  = "";
                HexBox.ByteProvider = null;
            }
            else
            {
                palePacket = (PalePacket)LstPackets.SelectedItems[0].Tag;

                TxtPacketInfo.Text  = palePacket.GetPacketInfo();
                HexBox.ByteProvider = new DynamicByteProvider(palePacket.Packet.GetBuffer());
            }

            pluginManager.OnSelected(palePacket);
        }
예제 #22
0
        public void OnSelected(PalePacket palePacket)
        {
            if (palePacket == null)
            {
                TxtInfo.Visible = false;
                return;
            }

            TxtInfo.WordWrap = true;

            try
            {
                switch (palePacket.Op)
                {
                case Op.ConditionUpdate: ParseConditionUpdate(palePacket); break;

                case Op.StatUpdatePublic:
                case Op.StatUpdatePrivate: ParseStatUpdate(palePacket); break;

                case Op.NpcTalk: ParseNpcTalk(palePacket); break;

                case Op.NpcTalkSelect: ParseNpcTalkSelect(palePacket); break;

                case Op.OpenNpcShop:
                case Op.AddToNpcShop: ParseOpenNpcShop(palePacket); break;

                case Op.CombatActionPack: ParseCombatActionPacket(palePacket); break;

                case Op.ItemUpdate:
                case Op.ItemNew: ParseItemNew(palePacket); break;

                default: ParseUnknown(palePacket); break;
                }
            }
            catch (Exception ex)
            {
                TxtInfo.Text = "Error: " + ex.ToString();
            }

            TxtInfo.Visible = true;
        }
예제 #23
0
파일: FrmMain.cs 프로젝트: Vinna/MabiPale2
        /// <summary>
        /// Returns (first) currently selected packet or null.
        /// </summary>
        /// <returns></returns>
        public PalePacket GetSelectedPacket()
        {
            if (LstPackets.SelectedItems.Count == 0)
            {
                return(null);
            }

            if (!LstPackets.InvokeRequired)
            {
                return((PalePacket)LstPackets.SelectedItems[0].Tag);
            }

            PalePacket result = null;

            LstPackets.Invoke((MethodInvoker) delegate
            {
                result = (PalePacket)LstPackets.SelectedItems[0].Tag;
            });

            return(result);
        }
예제 #24
0
파일: Main.cs 프로젝트: xyfc/MabiPale2
        private void OnRecv(PalePacket palePacket)
        {
            // EntityAppears
            if (palePacket.Op == 0x520C)
            {
                AddCreatureInfo(palePacket.Packet);
            }
            // PropAppears
            if (palePacket.Op == 0x52D0)
            {
                AddProp(palePacket.Packet);
            }
            // EntitiesAppear
            else if (palePacket.Op == 0x5334)
            {
                var entityCount = palePacket.Packet.GetShort();
                for (int i = 0; i < entityCount; ++i)
                {
                    var type       = palePacket.Packet.GetShort();
                    var len        = palePacket.Packet.GetInt();
                    var entityData = palePacket.Packet.GetBin();

                    // Creature
                    if (type == 16)
                    {
                        var entityPacket = new Packet(entityData, 0);
                        AddCreatureInfo(entityPacket);
                    }
                    // Prop
                    else if (type == 160)
                    {
                        var entityPacket = new Packet(entityData, 0);
                        AddProp(entityPacket);
                    }
                }
            }
        }
예제 #25
0
파일: FrmMain.cs 프로젝트: Vinna/MabiPale2
        /// <summary>
        /// Window message handler, handles incoming data from Alissa.
        /// </summary>
        /// <param name="m"></param>
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WinApi.WM_COPYDATA)
            {
                var cds = (WinApi.COPYDATASTRUCT)Marshal.PtrToStructure(m.LParam, typeof(WinApi.COPYDATASTRUCT));

                if (cds.cbData < 12)
                {
                    return;
                }

                var recv = (int)cds.dwData == Sign.Recv;

                var data = new byte[cds.cbData];
                Marshal.Copy(cds.lpData, data, 0, cds.cbData);

                var packet     = new Packet(data, 0);
                var palePacket = new PalePacket(packet, DateTime.Now, recv);

                lock (packetQueue)
                    packetQueue.Enqueue(palePacket);
            }
            base.WndProc(ref m);
        }
예제 #26
0
        public string AnalyzePacket(PalePacket palePacket)
        {
            palePacket.Packet.GetString();
            palePacket.Packet.GetByte();
            palePacket.Packet.GetByte();
            palePacket.Packet.GetInt();

            var tabCount = palePacket.Packet.GetByte();
            var tabs     = new Dictionary <string, List <ShopItem> >();

            for (int i = 0; i < tabCount; ++i)
            {
                var name = palePacket.Packet.GetString();

                if (!tabs.ContainsKey(name))
                {
                    tabs.Add(name, new List <ShopItem>());
                }

                // [160200] ?
                if (palePacket.Packet.NextIs(Shared.PacketElementType.Byte))
                {
                    palePacket.Packet.GetByte();
                }

                var itemCount = palePacket.Packet.GetShort();
                for (int j = 0; j < itemCount; ++j)
                {
                    palePacket.Packet.GetLong();
                    palePacket.Packet.GetByte();
                    var itemInfo       = palePacket.Packet.GetObj <ItemInfo>();
                    var itemOptionInfo = palePacket.Packet.GetObj <ItemOptionInfo>();
                    var metaData1      = palePacket.Packet.GetString();
                    var metaData2      = "";
                    if (palePacket.Packet.NextIs(Shared.PacketElementType.String))
                    {
                        metaData2 = palePacket.Packet.GetString();
                    }
                    palePacket.Packet.GetByte();
                    palePacket.Packet.GetLong();

                    // [190100, NA200 (2015-01-15)] New/Combined
                    if (palePacket.Packet.NextIs(Shared.PacketElementType.Byte))
                    {
                        palePacket.Packet.GetByte();
                        palePacket.Packet.GetByte();
                    }

                    // [200200, NA252 (2017-05-18)]
                    // New long that is equal to the owner's entity id for all
                    // items in the creature info packet. Maybe the id of the
                    // owner?
                    {
                        palePacket.Packet.GetLong();
                    }

                    tabs[name].Add(new ShopItem()
                    {
                        Info = itemInfo, OptionInfo = itemOptionInfo, MetaData1 = metaData1
                    });
                }
            }

            var sb   = new StringBuilder();
            var prev = "";

            foreach (var tab in tabs.OrderBy(a => a.Key))
            {
                var name = tab.Key.Substring(tab.Key.IndexOf("]") + 1);

                if (prev != name)
                {
                    if (prev != "")
                    {
                        sb.AppendLine();
                    }
                    //sb.AppendLine("// " + name);
                }

                prev = name;

                foreach (var item in tab.Value.OrderBy(a => a.Info.Id))
                {
                    var others = tab.Value.Count(a => a.Info.Id == item.Info.Id && a.Info.Amount != item.Info.Amount) != 0;

                    if (!string.IsNullOrWhiteSpace(item.MetaData1) && item.Info.Id != 70023)
                    {
                        if (item.MetaData1.Contains("FORMID:"))
                        {
                            sb.AppendLine("Add(\"{0}\", {1}, \"{2}\", {3});", name, item.Info.Id, item.MetaData1, item.OptionInfo.Price);
                        }
                        else if (item.MetaData1.Contains("QSTTIP:"))
                        {
                            var start     = "QSTTIP:s:N_".Length;
                            var questName = item.MetaData1.Substring(start, item.MetaData1.IndexOf("|") - start);
                            sb.AppendLine("//AddQuest(\"{0}\", InsertQuestId, {2}); // {3}", name, item.Info.Id, item.OptionInfo.Price, questName);
                        }
                        else
                        {
                            sb.AppendLine("Add(\"{0}\", {1}, \"{2}\");", name, item.Info.Id, item.MetaData1);
                        }
                    }
                    else if (item.Info.Amount <= 1 && !others)
                    {
                        sb.AppendLine("Add(\"{0}\", {1});", name, item.Info.Id);
                    }
                    else
                    {
                        sb.AppendLine("Add(\"{0}\", {1}, {2});", name, item.Info.Id, Math.Max(1, (int)item.Info.Amount));
                    }
                }
            }

            //TxtInfo.WordWrap = false;
            return(sb.ToString());
        }
예제 #27
0
        /// <summary>
        /// Window message handler, handles incoming data from provider.
        /// </summary>
        /// <param name="m"></param>
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WinApi.WM_COPYDATA)
            {
                var cds = (WinApi.COPYDATASTRUCT)Marshal.PtrToStructure(m.LParam, typeof(WinApi.COPYDATASTRUCT));

                // The op will *always* be there, who knows about the
                // other things.
                if (cds.cbData < 2)
                {
                    return;
                }

                var data = new byte[cds.cbData];
                Marshal.Copy(cds.lpData, data, 0, cds.cbData);

                var sign = (int)cds.dwData;
                if (sign == Sign.OpList)
                {
                    try
                    {
                        Op.UseBinaryList(data);
                        receivedOpList = true;
                    }
                    catch
                    {
                        // If something goes wrong, we _can_ continue, but
                        // the ops and size would potentially be incorrect,
                        // since we'll be using the last opcodes we had.
                        // Ask the user what they want to do.
                        var result = MessageBox.Show($"Failed to read remote opcode list. The displayed op names and sizes might be incorrect, continue anyway?", this.Text, MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                        if (result != DialogResult.Yes)
                        {
                            this.Disconnect();
                            return;
                        }

                        receivedOpWarning = true;
                    }
                }
                else
                {
                    // If we didn't receive an op list upon connection,
                    // but are now receiving packets, Zemyna is presumably
                    // outdated. Ask the user what they want to do.
                    if (!receivedOpList && !receivedOpWarning)
                    {
                        var result = MessageBox.Show($"You're using an outdated version of Zemyna. The displayed op names and sizes might be incorrect, continue anyway?", this.Text, MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                        if (result != DialogResult.Yes)
                        {
                            this.Disconnect();
                            return;
                        }

                        receivedOpWarning = true;
                    }

                    var recv = (int)cds.dwData == Sign.Recv;

                    var type       = (!recv ? PacketType.ClientServer : PacketType.ServerClient);
                    var packet     = new Packet(data, type);
                    var name       = Shared.Op.GetName(packet.Op);
                    var length     = Shared.Op.GetSize(packet.Op);
                    var palePacket = new PalePacket(name, length, packet, DateTime.Now, recv);

                    lock (packetQueue)
                        packetQueue.Enqueue(palePacket);
                }
            }
            base.WndProc(ref m);
        }
예제 #28
0
        public string AnalyzePacket(PalePacket palePacket)
        {
            var sb = new StringBuilder();

            sb.AppendLine("Id: " + palePacket.Packet.GetInt());
            sb.AppendLine("Prev Id: " + palePacket.Packet.GetInt());
            sb.AppendLine("Hit: " + palePacket.Packet.GetByte());
            palePacket.Packet.GetByte();             // [220200, NA296 (2019-04-11)]
            sb.AppendLine("Type: " + palePacket.Packet.GetByte());
            palePacket.Packet.GetByte();
            sb.AppendLine();

            var count = palePacket.Packet.GetInt();

            for (int i = 0; i < count; ++i)
            {
                var len  = palePacket.Packet.GetInt();
                var buff = palePacket.Packet.GetBin();

                var actionPacket = new MabiPale2.Shared.Packet(buff, 0);
                actionPacket.GetInt();
                if (i > 0)
                {
                    sb.AppendLine();
                }

                var creatureEntityId = actionPacket.GetLong();
                var type             = (CombatActionType)actionPacket.GetByte();

                var attackeraction = len < 86 && type != 0;                 // Hot fix, TODO: Proper check of type.

                sb.AppendLine(attackeraction ? "Attacker Action" : "Target Action");
                sb.AppendLine("--------------------");
                sb.AppendLine("Creature: " + creatureEntityId.ToString("X16"));
                sb.AppendLine("Type: " + type);
                sb.AppendLine("Stun: " + actionPacket.GetShort());
                sb.AppendLine("Skill Id: " + (SkillId)actionPacket.GetShort());
                actionPacket.GetShort();
                if (actionPacket.Peek() == Shared.PacketElementType.Short)
                {
                    actionPacket.GetShort();                     // [200300, NA258 (2017-08-19)] ?
                }
                // AttackerAction
                if (attackeraction)
                {
                    sb.AppendLine("Target: " + actionPacket.GetLong().ToString("X16"));

                    var options = new List <uint>();
                    var topt    = actionPacket.GetInt();
                    for (uint foo2 = 1; foo2 < 0x80000000;)
                    {
                        if ((topt & foo2) != 0)
                        {
                            options.Add(foo2);
                        }
                        foo2 <<= 1;
                    }
                    var strOptions = string.Join(", ", options.Select(a =>
                    {
                        var en = (AttackerOptions)a;
                        return("0x" + a.ToString("X2") + (en.ToString() != a.ToString() ? "(" + en + ")" : ""));
                    }));

                    sb.AppendLine("Options: " + strOptions);

                    actionPacket.GetByte();
                    actionPacket.GetByte();

                    // Another int was added in front of the position at
                    // some point, to handle old and new logs we have to
                    // read the first two ints and then determine if there's
                    // another one. If there is, we shift the information,
                    // so the variables point to the correct info.

                    int unkInt, x, y;

                    x = actionPacket.GetInt();
                    y = actionPacket.GetInt();

                    if (actionPacket.NextIs(Shared.PacketElementType.Int))
                    {
                        unkInt = x;
                        x      = y;
                        y      = actionPacket.GetInt();
                    }

                    sb.AppendLine("X: " + x);
                    sb.AppendLine("Y: " + y);
                    if (actionPacket.NextIs(Shared.PacketElementType.Long))
                    {
                        sb.AppendLine("Prop: " + actionPacket.GetLong().ToString("X16"));
                    }
                }
                // TargetAction
                else
                {
                    // Target actions might end here, widnessed with a packet
                    // that had "97" as the previous short.
                    if (actionPacket.Peek() != Shared.PacketElementType.None)
                    {
                        // Target used Defense or Counter
                        if (type.HasFlag(CombatActionType.Defended) || type.HasFlag(CombatActionType.CounteredHit) || type.HasFlag((CombatActionType)0x73) || type.HasFlag((CombatActionType)0x13))
                        {
                            var attackerEntityId = actionPacket.GetLong();
                            actionPacket.GetInt();
                            actionPacket.GetByte();
                            actionPacket.GetByte();
                            actionPacket.GetInt();
                            var x = actionPacket.GetInt();
                            var y = actionPacket.GetInt();
                        }

                        var options = new List <uint>();
                        var topt    = actionPacket.GetInt();
                        for (uint foo2 = 1; foo2 < 0x80000000;)
                        {
                            if ((topt & foo2) != 0)
                            {
                                options.Add(foo2);
                            }
                            foo2 <<= 1;
                        }
                        var strOptions = string.Join(", ", options.Select(a =>
                        {
                            var en = (TargetOptions)a;
                            return("0x" + a.ToString("X2") + (en.ToString() != a.ToString() ? "(" + en + ")" : ""));
                        }));

                        sb.AppendLine("Options: " + strOptions);
                        sb.AppendLine("Damage: " + actionPacket.GetFloat());
                        sb.AppendLine("? Damage: " + actionPacket.GetFloat());
                        sb.AppendLine("Mana Damage?: " + actionPacket.GetInt());

                        if (actionPacket.NextIs(Shared.PacketElementType.Int))
                        {
                            actionPacket.GetInt();                             // [210100, NA280 (2018-06-14)]
                        }
                        sb.AppendLine("X-Diff: " + actionPacket.GetFloat());
                        sb.AppendLine("Y-Diff: " + actionPacket.GetFloat());
                        if (actionPacket.NextIs(Shared.PacketElementType.Float))
                        {
                            sb.AppendLine("New X: " + actionPacket.GetFloat());
                            sb.AppendLine("New Y: " + actionPacket.GetFloat());

                            // [190200, NA203 (22.04.2015)]
                            if (actionPacket.Peek() == Shared.PacketElementType.Int)
                            {
                                actionPacket.PutInt(0);
                            }
                        }

                        sb.AppendLine("EffectFlags: " + actionPacket.GetByte());
                        sb.AppendLine("Delay: " + actionPacket.GetInt());
                        sb.AppendLine("Attacker: " + actionPacket.GetLong().ToString("X16"));
                    }
                }
            }

            return(sb.ToString());
        }
예제 #29
0
        public string AnalyzePacket(PalePacket palePacket)
        {
            var sb = new StringBuilder();

            // [200300, NA262 (2017-10-20)]
            // The condition format changed, first, with the longs, is the
            // old one, the other is the new one.
            if (palePacket.Packet.Peek() == Shared.PacketElementType.Long)
            {
                var conditionsA = palePacket.Packet.GetLong();
                var conditionsB = palePacket.Packet.GetLong();
                var conditionsC = palePacket.Packet.GetLong();
                var conditionsD = palePacket.Packet.Peek() == Shared.PacketElementType.Long ? palePacket.Packet.GetLong() : 0;
                var conditionsE = palePacket.Packet.Peek() == Shared.PacketElementType.Long ? palePacket.Packet.GetLong() : 0;
                var conditionsF = palePacket.Packet.Peek() == Shared.PacketElementType.Long ? palePacket.Packet.GetLong() : 0;
                var conditionsG = palePacket.Packet.Peek() == Shared.PacketElementType.Long ? palePacket.Packet.GetLong() : 0;

                sb.AppendLine("A: {0}", (ConditionsA)conditionsA);
                sb.AppendLine("B: {0}", (ConditionsB)conditionsB);
                sb.AppendLine("C: {0}", (ConditionsC)conditionsC);
                sb.AppendLine("D: {0}", (ConditionsD)conditionsD);
                sb.AppendLine("E: {0}", (ConditionsE)conditionsE);
                sb.AppendLine("F: {0}", (ConditionsF)conditionsF);
                sb.AppendLine("G: {0}", (ConditionsG)conditionsG);

                var extraCount = palePacket.Packet.GetInt();
                if (extraCount != 0)
                {
                    sb.AppendLine();
                }

                for (int i = 0; i < extraCount; ++i)
                {
                    var id  = palePacket.Packet.GetInt();
                    var str = palePacket.Packet.GetString();
                    var div = id / 64;
                    var mod = id % 64;

                    switch (div)
                    {
                    case 0: sb.AppendLine("{0} - {1}", (ConditionsA)((ulong)1 << mod), str); break;

                    case 1: sb.AppendLine("{0} - {1}", (ConditionsB)((ulong)1 << mod), str); break;

                    case 2: sb.AppendLine("{0} - {1}", (ConditionsC)((ulong)1 << mod), str); break;

                    case 3: sb.AppendLine("{0} - {1}", (ConditionsD)((ulong)1 << mod), str); break;

                    case 4: sb.AppendLine("{0} - {1}", (ConditionsE)((ulong)1 << mod), str); break;

                    case 5: sb.AppendLine("{0} - {1}", (ConditionsF)((ulong)1 << mod), str); break;

                    case 6: sb.AppendLine("{0} - {1}", (ConditionsG)((ulong)1 << mod), str); break;

                    default:
                        var ident = (char)('A' + div) + ":0x" + ((ulong)1 << mod).ToString("X16");
                        sb.AppendLine("{0} - {1}", ident, str);
                        break;
                    }
                }
            }
            else
            {
                var active      = palePacket.Packet.GetBool();
                var conditionId = palePacket.Packet.GetInt();

                sb.AppendLine("Condition Id: {0} ({1})", (ConditionId)conditionId, conditionId);
                sb.AppendLine("Active: {0}", (active ? "Yes" : "No"));

                if (active)
                {
                    palePacket.Packet.GetLong();
                    var parameters = palePacket.Packet.GetString();

                    sb.AppendLine("Parameters: {0}", parameters);
                }
            }

            return(sb.ToString());
        }
예제 #30
0
        public string AnalyzePacket(PalePacket palePacket)
        {
            var sb = new StringBuilder();

            sb.AppendLine("Item Entity Id: {0:X16}", palePacket.Packet.GetLong());
            sb.AppendLine("Type: {0}", palePacket.Packet.GetByte());
            sb.AppendLine();

            var info = palePacket.Packet.GetObj <ItemInfo>();

            sb.AppendLine("Amount: {0}", info.Amount);
            sb.AppendLine("Color1: 0x{0:X6}", info.Color1);
            sb.AppendLine("Color2: 0x{0:X6}", info.Color2);
            sb.AppendLine("Color3: 0x{0:X6}", info.Color3);
            sb.AppendLine("Id: {0}", info.Id);
            sb.AppendLine("KnockCount: {0}", info.KnockCount);
            sb.AppendLine("Pocket: {0}", info.Pocket);
            sb.AppendLine("Region: {0}", info.Region);
            sb.AppendLine("FigureA: {0}", info.State);
            sb.AppendLine("FigureB: {0}", info.FigureB);
            sb.AppendLine("FigureC: {0}", info.FigureC);
            sb.AppendLine("FigureD: {0}", info.FigureD);
            sb.AppendLine("X: {0}", info.X);
            sb.AppendLine("Y: {0}", info.Y);
            sb.AppendLine();

            var optioninfo = palePacket.Packet.GetObj <ItemOptionInfo>();

            sb.AppendLine("__unknown15: {0}", optioninfo.__unknown15);
            sb.AppendLine("__unknown16: {0}", optioninfo.__unknown16);
            sb.AppendLine("__unknown17: {0}", optioninfo.__unknown17);
            sb.AppendLine("__unknown24: {0}", optioninfo.__unknown24);
            sb.AppendLine("__unknown25: {0}", optioninfo.__unknown25);
            sb.AppendLine("__unknown3: {0}", optioninfo.__unknown3);
            sb.AppendLine("__unknown31: {0}", optioninfo.__unknown31);
            sb.AppendLine("AttackMax: {0}", optioninfo.AttackMax);
            sb.AppendLine("AttackMin: {0}", optioninfo.AttackMin);
            sb.AppendLine("AttackSpeed: {0}", optioninfo.AttackSpeed);
            sb.AppendLine("Balance: {0}", optioninfo.Balance);
            sb.AppendLine("Critical: {0}", optioninfo.Critical);
            sb.AppendLine("Defense: {0}", optioninfo.Defense);
            sb.AppendLine("DucatPrice: {0}", optioninfo.DucatPrice);
            sb.AppendLine("Durability: {0}", optioninfo.Durability);
            sb.AppendLine("DurabilityMax: {0}", optioninfo.DurabilityMax);
            sb.AppendLine("DurabilityOriginal: {0}", optioninfo.DurabilityOriginal);
            sb.AppendLine("EffectiveRange: {0}", optioninfo.EffectiveRange);
            sb.AppendLine("Elemental: {0}", optioninfo.Elemental);
            sb.AppendLine("EP: {0}", optioninfo.EP);
            sb.AppendLine("Experience: {0}", optioninfo.Experience);
            sb.AppendLine("ExpireTime: {0}", optioninfo.ExpireTime);
            sb.AppendLine("Flags: {0}", optioninfo.Flags);
            sb.AppendLine("Grade: {0}", optioninfo.Grade);
            sb.AppendLine("JoustPointPrice: {0}", optioninfo.JoustPointPrice);
            sb.AppendLine("KnockCount: {0}", optioninfo.KnockCount);
            sb.AppendLine("LinkedPocketId: {0}", optioninfo.LinkedPocketId);
            sb.AppendLine("PonsPrice: {0}", optioninfo.PointPrice);
            sb.AppendLine("Prefix: {0}", optioninfo.Prefix);
            sb.AppendLine("Price: {0}", optioninfo.Price);
            sb.AppendLine("Protection: {0}", optioninfo.Protection);
            sb.AppendLine("SellingPrice: {0}", optioninfo.SellingPrice);
            sb.AppendLine("StackRemainingTime: {0}", optioninfo.StackRemainingTime);
            sb.AppendLine("StarPrice: {0}", optioninfo.StarPrice);
            sb.AppendLine("Suffix: {0}", optioninfo.Suffix);
            sb.AppendLine("Upgraded: {0}", optioninfo.Upgraded);
            sb.AppendLine("UpgradeMax: {0}", optioninfo.UpgradeMax);
            sb.AppendLine("InjuryMax: {0}", optioninfo.InjuryMax);
            sb.AppendLine("InjuryMin: {0}", optioninfo.InjuryMin);
            sb.AppendLine("WeaponType: {0}", optioninfo.WeaponType);

            return(sb.ToString());
        }