This repository has been archived on 2026-10-31. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files

29 lines
1.9 KiB
Go

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.