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; }
/// <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()); } }
/// <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(); } }); }
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()); }
private void OnSelected(PalePacket palePacket) { if (form != null && !form.IsDisposed) { form.OnSelected(palePacket); } }
/// <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(); } }); }
/// <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); }
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(); }
/// <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); } } }
private void OnSelectedHex(PalePacket palePacket, int start) { if (form == null || form.IsDisposed) { return; } form.UpdateValues(buffer, start); }
/// <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); } }
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; }
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); }
private void OnSelected(PalePacket palePacket) { if (palePacket != null) { buffer = palePacket.Packet.GetBuffer(); } else { buffer = null; } form.UpdateValues(buffer, 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); }
/// <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); } }
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; } }
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); }
/// <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); }
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); }
/// <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); }
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; }
/// <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); }
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); } } } }
/// <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); }
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()); }
/// <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); }
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()); }
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()); }
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()); }