package methods // // Talent tree (天赋) client->server wire contracts for build 4229938. // Every shape below is read straight off the client's own interface declaration in dump.cs, so the // fields and their order are not guessed: // AskActiveGameplayTalentLayer(uint gameplayId, uint talentId, uint addLayer = 1) — 63772877 // AskResetGameplayTalent(uint gameplayId) — 63365723 // AskActiveSpiritJobTalentLayer(uint spiritId, uint jobClassId, uint talentId, uint addLayer = 1) // — 63162837 // AskResetSpiritJobTalent(uint spiritId, uint jobClassId) — 63343248 // AskConvertCommonSpiritTalentExp(uint spiritId, uint convertExp) — 63901381 // All five are declared on IClientToGame (dump.cs:1727011-1728358) and return UXRPCTask, i.e. void: // the reply is an empty OK, which is exactly what a missing handler already produced — the point of // routing them is that the server now also keeps the state the reply implies. // Observed traffic (logs/unknown-methods.log, 2026-09-16/20) matches the decoding byte for byte: // 63772877 bytes=12 hex=030000003D60F40501000000 -> gameplayId=3 talentId=99901501 addLayer=1 // so these are three raw little-endian uint32s with no marker, no count and no trailing field. // An [UxContract(Inline = true)] struct of plain uint fields serializes to exactly that. // // Client invoke: AskActiveGameplayTalentLayer (63772877). Activate talent layers on one // gameplay tree. addLayer is how many layers to add in this call (the client sends 1). // Client invoke: AskResetGameplayTalent (63365723). Refund one gameplay tree. // Client invoke: AskActiveSpiritJobTalentLayer (63162837). Career talent tree, keyed by // character + job class instead of by gameplay id. // Client invoke: AskResetSpiritJobTalent (63343248). // Client invoke: AskConvertCommonSpiritTalentExp (63901381). Turn shared talent exp into // one character's exp.