package methods // // SyncSpiritJobInfo (64913222) — the runtime urban-job record for one controllable character. // Signature: void SyncSpiritJobInfo(uint spiritId, Dictionary<uint, SpiritJob> spiritJobs, uint currentJob) // Why a runtime push and not part of the login payload: a non-empty // SpiritJobInfo.AvailableJobs dictionary inside the big PlayerInfo packet desynchronizes // the 4229938 Lua reader and blocks scene entry. The login payload therefore carries // CurrentJob only; this packet is the only place allowed to populate the job dictionary. // CurrentJob = 0 is NOT a valid UrbanJobConfig id — it makes the client's SpiritJobManager // dereference a missing config once a job record arrives. Use 100 (Jobless). // Wire (7k-verified 2026-09-20): the lua reader consumes the three parameters bare — no // top-level marker — hence Inline=true; Auto.SpiritJobTalentInfo carries TypeMark=1 so the // TalentInfo dispatch tag reads "base type" (0x00 means null and would swallow the rest of the // record — that misalignment is what crashed the client's CheckActivateJob in the codec era). //