59 lines
2.8 KiB
Go
59 lines
2.8 KiB
Go
package routers
|
|||
|
|
|
||
|
|
import (
|
||
|
|
"context"
|
||
|
|
"sync"
|
||
|
|
)
|
||
|
|
|
||
|
|
var _ = sync.Mutex{}
|
||
|
|
var _ = context.Background
|
||
|
|
|
||
|
|
//
|
||
|
|
// Gang-boss summon wheel (嘉姆 / 帮派Boss, Tab then dial to the second wheel),
|
||
|
|
// methodId 63745420 AskSummonGangMember.
|
||
|
|
// THE ONE SENTENCE THAT MATTERS: this is a real C2S round trip, so unlike the Z switch wheel
|
||
|
|
// the server decides what appears. That is why this wheel can surface characters the Z wheel
|
||
|
|
// never can — the Z wheel's membership lives in FightSpiritConfig.CanJoin behind a client-side
|
||
|
|
// gate, while this one hands the server an id and waits to see what comes back.
|
||
|
|
// What arrives is a single uint32 and what it means is not stable across builds: measurements on
|
||
|
|
// the reference branch saw the same slot send a gang-member row id (10520022) at one point and
|
||
|
|
// the display row's AgentQuoteId (40651920) at another. Neither is required to name something
|
||
|
|
// spawnable — 10520022 matches no config this server owns at all.
|
||
|
|
// Two things make this build more forgiving than the reference:
|
||
|
|
// 1. SlotOverrides lets sent-id be remapped server-side (see SummonWheelSettings), so the
|
||
|
|
// outcome never depends on guessing which id shape the client picked.
|
||
|
|
// 2. A failure prints the exact id plus the literal JSON to fix it, so an unresolvable slot
|
||
|
|
// costs one run to configure instead of one round of guesswork.
|
||
|
|
// The reply body is ignored by the client: summonCb reads only the retcode and maps a non-zero
|
||
|
|
// one through MessageConfig, which has no row for "this member cannot be projected" — an error
|
||
|
|
// would surface as an empty toast. So this always answers OK and reports through the console.
|
||
|
|
//
|
||
|
|
// Returns true the first time this slot id is seen, so the caller can log it once.
|
||
|
|
func GameRouter_GangBoss_NoteObservedSummonSentId(ctx context.Context, sentId uint32) bool {
|
||
|
|
// Router implementation for GameRouter_GangBoss_NoteObservedSummonSentId
|
||
|
|
return true
|
||
|
|
}
|
||
|
|
|
||
|
|
func GameRouter_GangBoss_AskSummonGangMember(ctx context.Context, conn any, msg any) any {
|
||
|
|
// Router implementation for GameRouter_GangBoss_AskSummonGangMember
|
||
|
|
var zero any; return zero
|
||
|
|
}
|
||
|
|
|
||
|
|
//
|
||
|
|
// "Disband all" on the same wheel (63243016). Without a handler the button is a dead no-op and
|
||
|
|
// every summoned character stays in the world forever — there is no other despawn path.
|
||
|
|
//
|
||
|
|
func GameRouter_GangBoss_AskDestroyAllGangMember(ctx context.Context, conn any, msg any) any {
|
||
|
|
// Router implementation for GameRouter_GangBoss_AskDestroyAllGangMember
|
||
|
|
var zero any; return zero
|
||
|
|
}
|
||
|
|
|
||
|
|
//
|
||
|
|
// Maps the id the client sent onto the id to actually spawn. Returns the input unchanged when
|
||
|
|
// this slot is not configured, which keeps the reference branch's behaviour as the default.
|
||
|
|
//
|
||
|
|
func GameRouter_GangBoss_ResolveSummonTarget(ctx context.Context, sentId uint32, label any) uint32 {
|
||
|
|
// Router implementation for GameRouter_GangBoss_ResolveSummonTarget
|
||
|
|
return 0
|
||
|
|
}
|
||
|
|
|