Skip to content

v9.3.2

Latest

Choose a tag to compare

@github-actions github-actions released this 06 Apr 16:46
· 66 commits to main since this release

Bug-fix release focused on the gacha and boost-time systems, with three issues healed via auto-applied migrations. No config or schema changes required.

Highlights

  • Gacha menu crash fix (#175) — characters whose gacha_items column held an empty bytea ('\x') crashed the ZZ client's gacha menu with a buffer overrun. The server now always sends the required leading count byte, and LoadColumnWithDefault treats empty bytea the same as NULL. RTTI-confirmed against CSync_man::putReceive_gacha_item / FUN_11531e90 in mhfo-hd.dll; full RE write-up in docs/re_notes/recv_gacha_item_crash.md.
  • Boost-time consistency fixGetBoostTimeLimit was wrapping pre-1970 boost_time values through a naked uint32(int64) cast, producing far-future timestamps that made the client think a boost was permanently active, even though GetBoostRight correctly reported it as expired. Discovered while testing against a live server where a character's boost_time was year 1906.
  • Missing save fix (#163) — healing migration for characters whose rasta_id was clobbered to 0 by the pre-fix SaveMercenary bug. Silent save failures auto-resolve on upgrade.
  • Login / boost-time config flags fully honored (#187)DisableLoginBoost and DisableBoostTime now apply to every relevant handler; fresh characters no longer show a phantom "Boost Time" overlay.

All fixes

  • Empty-bytea crash in MSG_MHF_RECEIVE_GACHA_ITEM (#175)
  • Silent StructScan failures in GachaRepository — misconfigured gacha_items rows now log a warn pointing at the likely cause (item_type > 255, item_id/quantity > 65535)
  • Stray second ACK in handleMsgMhfGetBoostTimeLimit (latent protocol bug)
  • uint32(int64) wraparound in GetBoostTimeLimit for pre-1970 / already-expired boost_time; harmonised with GetBoostRight
  • Quest tune-value multiplier: ZennyMultiplier: 0.0 no longer silently falls back to 100%; float32 rounding fixed across all 18 multiplier sites
  • DisableLoginBoost / DisableBoostTime now fully honored (#187)
  • Playtime rollback across sessions: updateSaveDataWithStruct now writes the accumulated counter back into the save blob
  • Softlock on forge purchases and N-points: MSG_CA_EXCHANGE_ITEM and MSG_MHF_USE_UD_SHOP_COIN now parse the ack handle and respond with doAckBufFail instead of dropping the packet

Migrations (auto-applied on startup)

  • 0010_fix_zero_rasta_id — NULLs out rasta_id = 0 rows so save loads recover.
  • 0011_fix_stale_boost_time — NULLs out boost_time values older than 1970 or more than 10 years in the future.

Tooling

  • protbot gains --action boost and --action gacha for non-destructive live-server regression testing. Use gacha --roll --gacha-id <id> to actually exercise MSG_MHF_PLAY_NORMAL_GACHA.

Upgrade notes

Fresh build or pull the Docker image, restart the server. Migrations run automatically on startup. No config changes required.

Full changelog: v9.3.1...v9.3.2