packet D0:31 missformat

Issue #325 resolved
darkagent created an issue

Client: official ncsoft lineage2 hf installer.
Protocol [268] (High Five Update 1)

Client packet opcode: D0:31 (i.e. RequestListPartyMatchingWaitingRoom)

In your original implementation we have packet missformat:

your original code (from master branch):

private int _page;
private int _minlvl;
private int _maxlvl;
private int _mode; // 1 - waitlist 0 - room waitlist

@Override
protected void readImpl() {
    _page = readD();
    _minlvl = readD();
    _maxlvl = readD();
    _mode = readD();
}

Missformat begins after maxlvl field.
Attached screenshots for example.

Full packet format is (little-endian):

  • Packet opcode: byte + short [D0, 31:00]
  • Page: int [01:00:00:00]
  • Level min: int [01:00:00:00]
  • Level max: int [55:00:00:00] (85 in hex)
  • Role (number of class ids in role-list): int (yellow field in screenshot)
    there're a screenshots for example:

    • according to screenshots, Role "healer/buffer" can represents [0C:00:00:00] i.e. 12 class ids (red fields in screenshot)
      [10:00:00:00] 0x10 (Human mystic)
      [11:00:00:00] 0x11 (Human wizard)
      [1E:00:00:00] 0x1E (Cleric)
      [2B:00:00:00] 0x2B (Elven Oracle)
      [34:00:00:00] 0x34 (Warcryer)
      [33:00:00:00] 0x33 (Overlord)
      [61:00:00:00] 0x61 (Cardinal)
      [62:00:00:00] 0x62 (Hierophant)
      [69:00:00:00] 0x69 (Eva's Saint)
      [70:00:00:00] 0x70 (Shillien Saint)
      [74:00:00:00] 0x74 (Doom Cryer)
      [73:00:00:00] 0x73 (Dominator)
  • Name filter : string with \0 (00:00) at the end, even if string length is 0. (blue field for string, green for zeroend)

mode is not a "mode" itself, it's a count of enumerated classes, used in search list.
if you choose any "role" in party matching waiting list search filter,
you'll get number of classes in field "mode" and classlist enumeration after it.
After all, there's a string field "name filter" at the end.
According to packet dump, i'd like to sugget you reimplementation of this packet structure:

(sorry for not a java code, it’s sharp, but i think you can understand and implement it)

private readonly int _count;
private readonly int[] _classlist;
private readonly string _filter = "";
...
[in packet read section]
_page = packet.ReadInt();
_minlvl = packet.ReadInt();
_maxlvl = packet.ReadInt();
_count = packet.ReadInt();
if (_count > 0)
{
  _classlist = new int[_count];
  for (int i = 0; i < _classlist.Length; i++)
  _classlist[i] = packet.ReadInt();
}

if (packet.Left > 2)
  _filter = packet.ReadString();

In packet write section of ExListPartyMatchingWaitingRoom packet (FE:36) you can apply those match conditions to your output

Comments (3)

  1. Zoey76

    Okay, I managed to implement the changes, also correctly implemented ExListPartyMatchingWaitingRoom with region and instance listing, I’ll commit it after some testing.

    Do you have more information about other packets?

  2. Zoey76

    Party Matching fixes

    Fixed packet structure, reported by darkagent Added class filter. Added text filter. Added pagination support. Added region display of players in waiting room. Added instance display of players in waiting room with reuse.

    Requires MMOCore update.

    Fixes #325

    → <<cset c118d13af6bb>>

  3. Log in to comment