29 lines
1.9 KiB
Go
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.
|