github Xian55/HermesProxy v4.2.2
Release v4.2.2 (2026-04-07)

latest releases: v4.5.13, v4.5.12, v4.5.11...
5 months ago

HermesProxy v4.2.2

Patch release covering bug fixes and codebase modernization since v4.2.1. No protocol or behavioral regressions are expected — refactors are mechanical and fixes are scoped to reported issues.

Bug fixes

Slice and Dice shows stale duration on refresh (#24)

In vanilla, SMSG_UPDATE_AURA_DURATION only carries durationLeft, never durationFull. The previous proactive aura-refresh path fell back to the decayed remaining time as the "full" duration, sending an incorrect value to the modern client and compounding the error on every subsequent refresh.

For the current player, SMSG_UPDATE_AURA_DURATION arrives shortly after SMSG_SPELL_GO with the correct server-authoritative duration (already accounting for combo points and talents like Improved Slice and Dice). The proactive refresh now skips duration for self and lets the server packet provide the authoritative value. Non-self targets keep the best-guess fallback since they do not receive SMSG_UPDATE_AURA_DURATION. HandleUpdateAuraDuration also now stores durationFull alongside durationLeft so future refreshes have an accurate cached value.

Auction House posts entire stack instead of single item (#23)

Pre-3.2.2a servers have no quantity field in CMSG_AUCTION_SELL_ITEM, so the entire item stack was always auctioned regardless of the quantity selected in the modern client. The proxy now splits the requested quantity into a temporary bag slot and auctions that, leaving the original stack intact with the remainder. Inventory utility helpers (FindItemInInventory, FindEmptyInventorySlot, GetItemStackCount) were added to GameSessionData for reuse in similar scenarios.

Master loot only works for first player to view corpse (#21)

The legacy server sends SMSG_LOOT_MASTER_LIST only once per corpse — to whoever loots first, even if they aren't the master looter. The previous handler immediately forwarded this as LootList packets, hardcoding Master = CurrentPlayerGuid, which gave the master-loot UI to the wrong player.

Fixes:

  • Cache SMSG_LOOT_MASTER_LIST candidates instead of forwarding immediately.
  • Send LootList + MasterLootCandidateList from HandleLootResponse, only when the current player is actually the master looter.
  • Use GetCurrentGroup() instead of hardcoded CurrentGroups[0].
  • Deduplicate to avoid re-sending on loot refreshes after distribution.
  • Clear cached state on loot release and group changes.
  • Fall back to the group roster if cached candidates are unavailable (e.g. after a disconnect).

Temporary enchant slot not read for visible item weapon visuals (#22)

PLAYER_VISIBLE_ITEM only read the permanent enchant slot (offset +1), missing temporary enchants at offset +2 (shaman imbues, rogue poisons). Both slots are now read, with temporary enchants taking visual priority. Note: a few enchant visuals (e.g. Instant Poison, visual 26) use ItemVisuals ModelFileID slot 4, which the 1.14.x client doesn't render — that is a client limitation rather than a proxy issue.

Refactors

Convert solution to file-scoped namespaces (09a29b3)

All remaining block-scoped namespace declarations across Framework, HermesProxy, and HermesProxy.Tests were converted to the file-scoped form (namespace Foo;). The bulk is mechanical — drop the wrapping { } and dedent one level — but two files in HermesProxy/World/Enums declared multiple sibling nested namespaces (Vanilla / TBC / WotLK / Classic):

  • PlayerDefines.cs held four InventorySlots structs.
  • EnchantmentSlot.cs held four EnchantmentSlot static classes.

C# does not allow file-scoped namespace declarations to coexist with other namespace declarations in the same file, so each version-specific type was extracted into its own file mirroring the namespace path:

HermesProxy/World/Enums/Vanilla/InventorySlots.cs
HermesProxy/World/Enums/TBC/InventorySlots.cs
HermesProxy/World/Enums/WotLK/InventorySlots.cs
HermesProxy/World/Enums/Classic/InventorySlots.cs
HermesProxy/World/Enums/Vanilla/EnchantmentSlot.cs
HermesProxy/World/Enums/TBC/EnchantmentSlot.cs
HermesProxy/World/Enums/WotLK/EnchantmentSlot.cs
HermesProxy/World/Enums/Classic/EnchantmentSlot.cs

Fully qualified namespace identity is preserved, so the 13 existing call sites compile unchanged. No behavior changes.

Modernize GameSessionData collection patterns (26080ca)

Replaced ContainsKey + indexer antipatterns (two hash probes per access) with TryGetValue and CollectionsMarshal.GetValueRefOrAddDefault (single probe) across ~25 helper methods covering aura duration, aura caster, spell mods, player cache, guild, channel, and inventory state.

Other cleanups bundled in:

  • Channel name reverse lookup is now O(1) via a paired ChannelNamesById dictionary kept in sync inside SetChannelId, replacing the previous O(n) linear scan over ChannelIds.
  • Replace new Dictionary<...>() / new HashSet<...>() field initializers and ??= fallbacks with collection expressions ([]).
  • Replace inventory slot magic numbers (255, 19, 23, 39) with the existing ItemConst.NullSlot and World.Enums.Vanilla.InventorySlots constants.
  • Add ArenaTeamConst.MaxArenaSlot = 3 and use it in place of the hardcoded 3 in StoreArenaTeamDataForPlayer and CharacterHandler.

Tooling

Add dbc-lookup skill for WoW DB2 data verification (5a5d247)

Custom slash command that uses the wago.tools CSV endpoints together with the xan CLI to look up DBC/DB2 data for all supported client versions. Useful when verifying packet structures and field values during development.

Full changelog

Commit Summary
09a29b3 Refactor: Convert solution to file-scoped namespaces
26080ca Refactor: Modernize GameSessionData collection patterns
ede781c Fix: Slice and Dice shows stale duration on refresh
0ab5e3f Fix: Auction House posts entire stack instead of single item
9e5cb2e Fix: Master loot only works for first player to view corpse
5a5d247 Add dbc-lookup skill for WoW DB2 data verification
d0ed02d Fix: Read temporary enchant slot for visible item weapon visuals

Diff: v4.2.1...v4.2.2

Downloads

Platform Asset
Windows HermesProxy-Windows-v4.2.2.zip
Linux HermesProxy-Ubuntu-v4.2.2.tar.gz
macOS (universal) HermesProxy-MacOS-v4.2.2.zip

Verify downloads against checksums-sha256.txt using the bundled verify-checksums.sh (Linux/macOS) or verify-checksums.ps1 (Windows).

Don't miss a new HermesProxy release

NewReleases is sending notifications on new releases.