49 lines
2.4 KiB
Go
49 lines
2.4 KiB
Go
package routers
|
||||
|
|
|
|||
|
|
import (
|
|||
|
|
"context"
|
|||
|
|
"sync"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
var _ = sync.Mutex{}
|
|||
|
|
var _ = context.Background
|
|||
|
|
|
|||
|
|
//
|
|||
|
|
// Fashion/wardrobe handlers. The client's appearance panel sends
|
|||
|
|
// AskSetSpiritFashionsWithSource when the player confirms a skin. Without a
|
|||
|
|
// server-side handler the request is dropped and the model reverts to the
|
|||
|
|
// login default when the panel closes. We accept the choice and echo it back
|
|||
|
|
// via SyncSetSpiritFashions so the worn skin persists.
|
|||
|
|
//
|
|||
|
|
// ★ 2026-10-02:补上**老版衣柜入口** AskSetSpiritFashions(63347169)(自 7k-v0.6
|
|||
|
|
// GameRouter.Fashion.cs 移植)。它与带 source 的新入口差 2 字节:
|
|||
|
|
// 老包 = [u32 spiritId][wear object],新包 = [u32 spiritId][short source][wear object]。
|
|||
|
|
// 做法是在偏移 4 处补一个 short 8(FashionWearSource.Spirit,小端 = 08 00),
|
|||
|
|
// 然后**走完全同一套**穿戴逻辑 —— 不另起一条分支,避免两套行为漂移。
|
|||
|
|
// ⛑ 已核对主线契约 AskSetSpiritFashionsWithSource.source 就是 short(FashionMethods.cs:11)
|
|||
|
|
// ⇒ 补 2 字节与捐赠端的字节拼接逐字节一致。
|
|||
|
|
func GameRouter_Fashion_AskSetSpiritFashionsWithSource(ctx context.Context, conn any, msg any) any {
|
|||
|
|
// Router implementation for GameRouter_Fashion_AskSetSpiritFashionsWithSource
|
|||
|
|
var zero any; return zero
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func GameRouter_Fashion_ApplyWearAsync(ctx context.Context, conn any, msg any, spiritId uint32, args any) any {
|
|||
|
|
// Router implementation for GameRouter_Fashion_ApplyWearAsync
|
|||
|
|
var zero any; return zero
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//
|
|||
|
|
// Wardrobe bookkeeping: "mark fashions as seen", "toggle favourite", "read suit list".
|
|||
|
|
// These are INVOKE requests that ask for nothing back — the client only waits for the ack. The
|
|||
|
|
// reference branch answers them with an empty OK, and leaving them unrouted is worse than
|
|||
|
|
// useless: an unanswered INVOKE leaves the caller awaiting forever, which is exactly the
|
|||
|
|
// failure mode that shows up as a wardrobe button that never responds.
|
|||
|
|
// The bodies are deliberately not decoded. They are client-local bookkeeping (read receipts,
|
|||
|
|
// favourite flags), and inventing a contract for bytes we have never seen would risk a decode
|
|||
|
|
// exception on the only path whose job is to always answer.
|
|||
|
|
//
|
|||
|
|
func GameRouter_Fashion_FashionBookkeepingAccept(ctx context.Context, conn any, msg any) any {
|
|||
|
|
// Router implementation for GameRouter_Fashion_FashionBookkeepingAccept
|
|||
|
|
var zero any; return zero
|
|||
|
|
}
|
|||
|
|
|