Skip to content

Releases: NosCoreIO/NosCore.DeveloperTools

ci-20260424-1333-3d1f8de

24 Apr 13:33
3d1f8de

Choose a tag to compare

chore: bump NosCore.Packets to 19.0.0 (#13)

Picks up NsTeST leading-blank field (fixes FormatException on real login
traffic with the vanosilla `NsTeST  <region>` double-space format) and
SuPacketHitMode widened to sbyte with the full -2..7 value set.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

ci-20260424-1258-8842b6c

24 Apr 12:58
8842b6c

Choose a tag to compare

chore: bump NosCore.Packets to 18.0.0 (#12)

Picks up breaking schema fixes: fish reduced to Type + catch-all body,
qstlist flat quest layout, NsTeST unknown fields, NsTeStSubPacket.Port
widened to int? for the -1 sentinel.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

ci-20260424-1059-f5ad9dd

24 Apr 10:59
f5ad9dd

Choose a tag to compare

chore: bump NosCore.Packets to 17.6.0 (#11)

ci-20260424-0958-fd6da26

24 Apr 09:58
fd6da26

Choose a tag to compare

chore: bump NosCore.Packets to 17.5.0 (#10)

ci-20260424-0916-5aea77a

24 Apr 09:16
5aea77a

Choose a tag to compare

chore: bump NosCore.Packets to 17.4.0 (#9)

Picks up:
- NosCoreIO/NosCore.Packets#450 (short-subpacket deserialize fix —
  inv/sayi/msgi/msgi2/mlobjlst/infoi/qslot/fish/qstlist/pinit)
- NosCoreIO/NosCore.Packets#451 (TwkPacket setters, PetskiPacket schema,
  QnamliPacket)
- NosCoreIO/NosCore.Packets#452 (direction-pair packets: gidx/npc_req/
  rsfi server-side, mall/npinfo client-side)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

ci-20260424-0851-3015447

24 Apr 08:52
3015447

Choose a tag to compare

chore: bump NosCore.Packets to 17.1.0 (#8)

Picks up NosCoreIO/NosCore.Packets#449 — list-of-sub-packets
deserialization fix (clinit/flinit/kdlinit/skyinit/finit/pinit/blinit
and anything else using a pipe/dot inner-field separator).

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

ci-20260424-0816-24e20f8

24 Apr 08:16
24e20f8

Choose a tag to compare

perf: batch packet-log UI; rename Send/Recv tags to Client/Server (#5)

* perf: batch packet log UI updates; rename Send/Recv tags to Client/Server

Drain captured packets on a 50 ms UI-thread Timer into a single
BeginUpdate/AddRange/EndUpdate block instead of BeginInvoke-ing the UI
thread once per packet. At high packet rates this was saturating the
message loop; the batched path keeps the ListBox responsive. Cache the
formatted display string on LoggedPacket so repaints don't re-format
per item.

Select All now runs inside BeginUpdate/EndUpdate so 5000-item
selection no longer fires a paint per SetSelected call.

Rename the direction tag from [Send]/[Recv] to [Client]/[Server] —
it was ambiguous whether "Send" meant sent by client or sent by
server. [Client] now unambiguously marks packets that originated on
the game client (client→server) and [Server] marks packets that
originated on the server (server→client).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat: Issues sub-tab — flags missing/wrong-structure/wrong-tag packets (#6)

* feat: Issues sub-tab detecting Missing / WrongStructure / WrongTag packets

Every captured packet is run through NosCore.Packets's deserializer
against its expected direction, and anomalies are logged in a new
Issues sub-tab under the Packets tab:

- Missing         — header not defined anywhere in NosCore.Packets.
- WrongStructure  — header defined for this direction but the
                    deserializer rejects the wire format.
- WrongTag        — header is defined only in the opposite-direction
                    namespace (client header captured as [Server], or
                    vice versa).

Uses two separate Deserializer instances so the
"server loses to client on duplicate header" dedup inside
Deserializer.Initialize<T> doesn't hide wrong-tag cases.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: filter packet types to PacketBase-derived only

NosCore.Packets has classes marked with [PacketHeader] that don't
inherit from PacketBase (e.g. ServerPackets.Event.EventPacket). Passing
those to Deserializer crashed startup:

  ArgumentException: GenericArguments[0], 'EventPacket', on
  'Void Initialize[T]()' violates the constraint of type 'T'.

Add an IsAssignableFrom(PacketBase) filter before constructing the
deserializers.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat: Copy / Copy with tags / Select all on the Issues listbox

Same context menu + Ctrl+C / Ctrl+A handling the Log listbox has, now
on Issues too. Parameterised so the listbox is passed in rather than
hard-coded to _logListBox. Copy picks up Raw text for both item types
(LoggedPacket.Raw and PacketValidationIssue.Packet.Raw); Copy with
tags uses the full ToString() line — including the [Missing] /
[Wrong structure] / [Wrong tag] category and the deserializer detail.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat: colored stripe on Log rows that have a validation issue

Each LoggedPacket carries a nullable ValidationCategory set when the
validator flags it. The Log listbox is owner-drawn and paints a 4px
left stripe per row: gold for Missing, indian-red for WrongStructure,
dark-orange for WrongTag. Selection highlighting still works — the
stripe sits over the normal row background.

Lets you see problematic packets at a glance while reading the Log,
without having to switch to the Issues tab for every packet.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat: failed-headers summary on Issues; drop plain Copy on Issues menu

- Issues sub-tab gets a read-only TextBox docked at the top listing
  every packet header that failed validation (unique, sorted). Cleared
  with the log.
- Context menu on Issues drops the raw "Copy" option — only "Copy
  with tags" makes sense there since the tags carry the category and
  deserializer detail. Ctrl+C on the Issues listbox now copies with
  tags; Log listbox behavior is unchanged.
- Clear handling consolidated into the PacketLogService.Cleared event
  so both the Clear button and any future direct clear call empty the
  log, issues queue, issues listbox, and failed-headers set.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: register sub-packet types so 'key not present in dictionary' goes away

Deserializer.DeserializeValue looks up sub-packet property types by
typeof(T).Name in _packetDeserializerDictionary. Sub-packets don't
carry [PacketHeader] — my original type filter excluded them, so
every parent packet with a sub-packet field failed with e.g.

  The given key 'InCharacterSubPacket' was not present in the dictionary.

Register all PacketBase-derived types without [PacketHeader] on both
client and server deserializer instances (they're direction-neutral).
Keep the _clientHeaders / _serverHeaders sets populated from header-
bearing types only so the direction-match check still works.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: skip the three pre-auth login-handshake lines in validator

Every world-server connection opens with three bare lines from the
client before the encrypted packet stream:

  <sessionId>          — single numeric token
  <account> GF <n>     — username / platform / region
  thisisgfmode         — GF-mode marker

None of them use the header protocol so NosCore.Packets legitimately
doesn't define them. Flagging them as Missing was pure noise on the
Issues tab.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

ci-20260424-0816-218c0f1

24 Apr 08:16
24e20f8

Choose a tag to compare

perf: batch packet-log UI; rename Send/Recv tags to Client/Server (#5)

* perf: batch packet log UI updates; rename Send/Recv tags to Client/Server

Drain captured packets on a 50 ms UI-thread Timer into a single
BeginUpdate/AddRange/EndUpdate block instead of BeginInvoke-ing the UI
thread once per packet. At high packet rates this was saturating the
message loop; the batched path keeps the ListBox responsive. Cache the
formatted display string on LoggedPacket so repaints don't re-format
per item.

Select All now runs inside BeginUpdate/EndUpdate so 5000-item
selection no longer fires a paint per SetSelected call.

Rename the direction tag from [Send]/[Recv] to [Client]/[Server] —
it was ambiguous whether "Send" meant sent by client or sent by
server. [Client] now unambiguously marks packets that originated on
the game client (client→server) and [Server] marks packets that
originated on the server (server→client).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat: Issues sub-tab — flags missing/wrong-structure/wrong-tag packets (#6)

* feat: Issues sub-tab detecting Missing / WrongStructure / WrongTag packets

Every captured packet is run through NosCore.Packets's deserializer
against its expected direction, and anomalies are logged in a new
Issues sub-tab under the Packets tab:

- Missing         — header not defined anywhere in NosCore.Packets.
- WrongStructure  — header defined for this direction but the
                    deserializer rejects the wire format.
- WrongTag        — header is defined only in the opposite-direction
                    namespace (client header captured as [Server], or
                    vice versa).

Uses two separate Deserializer instances so the
"server loses to client on duplicate header" dedup inside
Deserializer.Initialize<T> doesn't hide wrong-tag cases.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: filter packet types to PacketBase-derived only

NosCore.Packets has classes marked with [PacketHeader] that don't
inherit from PacketBase (e.g. ServerPackets.Event.EventPacket). Passing
those to Deserializer crashed startup:

  ArgumentException: GenericArguments[0], 'EventPacket', on
  'Void Initialize[T]()' violates the constraint of type 'T'.

Add an IsAssignableFrom(PacketBase) filter before constructing the
deserializers.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat: Copy / Copy with tags / Select all on the Issues listbox

Same context menu + Ctrl+C / Ctrl+A handling the Log listbox has, now
on Issues too. Parameterised so the listbox is passed in rather than
hard-coded to _logListBox. Copy picks up Raw text for both item types
(LoggedPacket.Raw and PacketValidationIssue.Packet.Raw); Copy with
tags uses the full ToString() line — including the [Missing] /
[Wrong structure] / [Wrong tag] category and the deserializer detail.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat: colored stripe on Log rows that have a validation issue

Each LoggedPacket carries a nullable ValidationCategory set when the
validator flags it. The Log listbox is owner-drawn and paints a 4px
left stripe per row: gold for Missing, indian-red for WrongStructure,
dark-orange for WrongTag. Selection highlighting still works — the
stripe sits over the normal row background.

Lets you see problematic packets at a glance while reading the Log,
without having to switch to the Issues tab for every packet.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat: failed-headers summary on Issues; drop plain Copy on Issues menu

- Issues sub-tab gets a read-only TextBox docked at the top listing
  every packet header that failed validation (unique, sorted). Cleared
  with the log.
- Context menu on Issues drops the raw "Copy" option — only "Copy
  with tags" makes sense there since the tags carry the category and
  deserializer detail. Ctrl+C on the Issues listbox now copies with
  tags; Log listbox behavior is unchanged.
- Clear handling consolidated into the PacketLogService.Cleared event
  so both the Clear button and any future direct clear call empty the
  log, issues queue, issues listbox, and failed-headers set.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: register sub-packet types so 'key not present in dictionary' goes away

Deserializer.DeserializeValue looks up sub-packet property types by
typeof(T).Name in _packetDeserializerDictionary. Sub-packets don't
carry [PacketHeader] — my original type filter excluded them, so
every parent packet with a sub-packet field failed with e.g.

  The given key 'InCharacterSubPacket' was not present in the dictionary.

Register all PacketBase-derived types without [PacketHeader] on both
client and server deserializer instances (they're direction-neutral).
Keep the _clientHeaders / _serverHeaders sets populated from header-
bearing types only so the direction-match check still works.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: skip the three pre-auth login-handshake lines in validator

Every world-server connection opens with three bare lines from the
client before the encrypted packet stream:

  <sessionId>          — single numeric token
  <account> GF <n>     — username / platform / region
  thisisgfmode         — GF-mode marker

None of them use the header protocol so NosCore.Packets legitimately
doesn't define them. Flagging them as Missing was pure noise on the
Issues tab.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

ci-20260424-0329-ec4b843

24 Apr 03:30
ec4b843

Choose a tag to compare

chore: support local NuGet source via NOSCORE_LOCAL_PACKAGES env var …

ci-20260424-0307-217d2c1

24 Apr 03:07
35d7e26

Choose a tag to compare

chore: add local NuGet source via NOSCORE_LOCAL_PACKAGES env var (#3)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>