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 }