85 lines
4.2 KiB
Go
85 lines
4.2 KiB
Go
package routers
|
|
|
|
import (
|
|
"context"
|
|
"sync"
|
|
)
|
|
|
|
var _ = sync.Mutex{}
|
|
var _ = context.Background
|
|
|
|
//
|
|
// Talent trees (天赋) for build 4229938 — T1-6.
|
|
// The panel is client-driven: it reads the tree layout from its own config tables and only asks the
|
|
// server to activate a node. What the server owns is the point balance and the set of activated
|
|
// nodes, both published in PlayerClientInfo.GameplayTalentInfos (a dictionary keyed by
|
|
// TalentTreeGamePlayConfig id, 1..5 in stock 4229938).
|
|
// ⛑️ Why nothing here sends SyncGameplayTalentPoint (64859579) / SyncActiveGameplayTalentLayer
|
|
// (64743495): those eight S2Cs have no contract, no lua reader in RPCDeserializeAuto and no client
|
|
// reader we can verify, and a hand-built frame with a missing trailing field desynchronises the
|
|
// stream — which on this build does not fail loudly, it takes the client process down (see
|
|
// GameplaySettings.PolicePayloadMode for the same failure mode). SyncPlayerInfo (64682159) carries
|
|
// the very same PlayerClientInfo the client already parses at login, so that is what is re-pushed
|
|
// after an activation; gameplay.talents.pushPlayerInfoOnChange turns it off.
|
|
// ⛑️ gameplayId must be a real TalentTreeGamePlayConfig id. A donor build invented 1020 and the
|
|
// panel then showed no points at all, because the client keys the whole view by that id and never
|
|
// falls back. The ids published here come from the imported table, never from the request alone.
|
|
//
|
|
//
|
|
// AskActiveGameplayTalentLayer (63772877) — activate one or more layers of a talent node.
|
|
// The request is (gameplayId, talentId, addLayer) and carries no cost, so the cost comes from
|
|
// TalentTreeTalentConfig (or flatCost) and the layer cap from the same row.
|
|
//
|
|
func GameRouter_Talent_AskActiveGameplayTalentLayer(ctx context.Context, conn any, msg any) any {
|
|
// Router implementation for GameRouter_Talent_AskActiveGameplayTalentLayer
|
|
var zero any; return zero
|
|
}
|
|
|
|
//
|
|
// AskResetGameplayTalent (63365723) — respec one gameplay tree. Every point spent in the tree is
|
|
// refunded, and the refund is recomputed from the node costs instead of being tracked separately,
|
|
// so the two can never drift apart.
|
|
//
|
|
func GameRouter_Talent_AskResetGameplayTalent(ctx context.Context, conn any, msg any) any {
|
|
// Router implementation for GameRouter_Talent_AskResetGameplayTalent
|
|
var zero any; return zero
|
|
}
|
|
|
|
// Career talent trees (职业天赋) are keyed by character + job class rather than by gameplay id and
|
|
// ride SpiritJob.TalentInfo — plus SpiritInfo.TalentInfo, which is the view the scene HACK limit
|
|
// actually consults. Their nodes are seeded as already-activated from
|
|
// TalentTreeTalentConfig (see RuntimePayloadFactory.CareerTalentInfo4229938,
|
|
// gameplay.talents.seedCareerTalents), because TalentTreeMgr.CheckTalentIsLocked resolves them at
|
|
// registration time and a locked node leaves every hack prompt greyed out. Nothing is persisted
|
|
// here yet, so these three stay ack-only: re-logging in re-seeds the same node set.
|
|
func GameRouter_Talent_AskActiveSpiritJobTalentLayer(ctx context.Context, conn any, msg any) any {
|
|
// Router implementation for GameRouter_Talent_AskActiveSpiritJobTalentLayer
|
|
var zero any; return zero
|
|
}
|
|
|
|
func GameRouter_Talent_AskResetSpiritJobTalent(ctx context.Context, conn any, msg any) any {
|
|
// Router implementation for GameRouter_Talent_AskResetSpiritJobTalent
|
|
var zero any; return zero
|
|
}
|
|
|
|
func GameRouter_Talent_AskConvertCommonSpiritTalentExp(ctx context.Context, conn any, msg any) any {
|
|
// Router implementation for GameRouter_Talent_AskConvertCommonSpiritTalentExp
|
|
var zero any; return zero
|
|
}
|
|
|
|
//
|
|
// Republishes the login frame after a talent change. SyncPlayerInfo is the same payload the
|
|
// client already accepted at login, so GameplayTalentInfos arrives through a wire we know is
|
|
// correct instead of through one of the unverified talent S2Cs.
|
|
//
|
|
func GameRouter_Talent_PublishTalentState4229938(ctx context.Context, conn any, state any, settings any) any {
|
|
// Router implementation for GameRouter_Talent_PublishTalentState4229938
|
|
var zero any; return zero
|
|
}
|
|
|
|
func GameRouter_Talent_TryDecode4229938(ctx context.Context, body []byte) any {
|
|
// Router implementation for GameRouter_Talent_TryDecode4229938
|
|
var zero any; return zero
|
|
}
|
|
|