Releases: NosCoreIO/NosCore.DeveloperTools
Releases · NosCoreIO/NosCore.DeveloperTools
ci-20260424-1333-3d1f8de
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
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
chore: bump NosCore.Packets to 17.6.0 (#11)
ci-20260424-0958-fd6da26
chore: bump NosCore.Packets to 17.5.0 (#10)
ci-20260424-0916-5aea77a
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
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
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
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
chore: support local NuGet source via NOSCORE_LOCAL_PACKAGES env var …
ci-20260424-0307-217d2c1
chore: add local NuGet source via NOSCORE_LOCAL_PACKAGES env var (#3) Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>