package routers import ( "context" "sync" ) var _ = sync.Mutex{} var _ = context.Background // // 钓鱼玩法(build 4229938)—— 从零接上服务端链路。 // 原版链路(已用 dump.cs + 代理解码器 RPCDeserializeAuto.lua 坐实): // 走近钓点 → 客户端发 AskFishingSpotFullSync(fishGroupId) 拉鱼池 // → 服务端回 SyncFishingSpotFull(Reader[335]) 推全量鱼池 // → 交互跑 PlayFishingGameAction 小游戏 // → 成功触发 OnFishingSuccess → 客户端发 AskFishingSuccess(fishGroupId, fishId) 记账 // → 百科全书用 SyncFishAdd(Reader[277]) 登记。 // 线格式铁律(UxContract.cs):复杂体只先写 TypeMark 字节(默认 0xFF)再按声明顺序写公共字段, // 客户端代理端 Auto.Reader[N] 的 N 只是解码索引、对线路字节无意义。所以下面每个 wire DTO 只要 // 「字段顺序 / 类型」对齐代理的 Reader[335]/[338]/[277]/[347] 即可,类名无关。 // 鱼池种子数据 100% 来自真实配置(FishingSpotConfig / FishingFishGroupConfig / FishingFishConfig), // 已复制进 ClientData/4229938/Configs/。客户端传什么 fishGroupId 都能接: // - 命中 FishingFishGroupConfig 的组号(1/2) → 用它的 InitGroup(短 id → 10105000+id) // - 命中 FishingSpotConfig 的 spot id(10105150…) → 用它的 InitGroup(已是全 id) // - 都不中 → 退回一套通用鱼,保证客户端永远有鱼可钓。 // // ═══════════════════════════ 常驻:拉鱼池 ═══════════════════════════ func GameRouter_Fishing_AskFishingSpotFullSync(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_Fishing_AskFishingSpotFullSync var zero any; return zero } // ═══════════════════════════ 常驻:钓上鱼记账 ═══════════════════════════ func GameRouter_Fishing_AskFishingSuccess(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_Fishing_AskFishingSuccess var zero any; return zero } func GameRouter_Fishing_TryRecordCatch(ctx context.Context, state any, fishGroupId uint32, fishId uint32, uniqueId uint32, templateId uint32, weight float32, length float32) bool { // Router implementation for GameRouter_Fishing_TryRecordCatch return true } // ═══════════════════════════ GM:发 / 收钓竿 ═══════════════════════════ func GameRouter_Fishing_GmAddFishingGear(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_Fishing_GmAddFishingGear var zero any; return zero } func GameRouter_Fishing_GmRemoveFishingGear(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_Fishing_GmRemoveFishingGear var zero any; return zero } // ═══════════════════════════ GM:钓点 / 鱼池维护 ═══════════════════════════ func GameRouter_Fishing_GmInitFishingSpot(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_Fishing_GmInitFishingSpot var zero any; return zero } func GameRouter_Fishing_GmSpawnFishingSpotFish(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_Fishing_GmSpawnFishingSpotFish var zero any; return zero } func GameRouter_Fishing_GmResetAllFishingSpots(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_Fishing_GmResetAllFishingSpots var zero any; return zero } func GameRouter_Fishing_GmClearFishing(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_Fishing_GmClearFishing var zero any; return zero } // ═══════════════════════════ GM:百科全书灌全鱼 ═══════════════════════════ func GameRouter_Fishing_GmAddAllFishes(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_Fishing_GmAddAllFishes var zero any; return zero } // ═══════════════════════════ GM:强制记一笔钓获 ═══════════════════════════ func GameRouter_Fishing_GmOnFishingSuccess(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_Fishing_GmOnFishingSuccess var zero any; return zero } // ═══════════════════════════ GM:调试查看(有 string 返回) ═══════════════════════════ // ⛑⛑ 2026-09-29 修正:这两条**不是 void**,客户端 // `midToReturnMessageReader[GmViewFishingSpot/GmViewFishingInfo]` 都是 // `reader.ReadString(reader)`(裸 string)。原来 `ReturnEmptyOkAsync` 是 **0 字节载荷** // (Connection.cs:32 `Array.Empty()`)⇒ 客户端读空 buffer,GM 面板什么都看不到。 // 实测 [FISHING] 一轮 9 次(一直在点)。现在把已经拼好的 dump **真的回给客户端**。 // wire:`UxWriter.UxString` —— null 写 0x00,有值写 `VarInt(len+1)` + UTF8(空串 = 0x01)。 // ⛑ 回滚:把 return 换回 `await conn.ReturnEmptyOkAsync(msg)` + 签名改回 `async Task`。 func GameRouter_Fishing_GmViewFishingSpot(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_Fishing_GmViewFishingSpot var zero any; return zero } func GameRouter_Fishing_GmViewFishingInfo(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_Fishing_GmViewFishingInfo var zero any; return zero } // ── wire DTO:字段顺序严格对齐代理 Reader[335] / [338] / [277] / [347] ────────────────────── type FishingSpotFullSyncPayload4229938 struct { FishGroupId uint32 `json:"fishGroupId"` Fishes []FishingSpotFishWire4229938 `json:"fishes"` LastRefreshTime uint32 `json:"lastRefreshTime"` LastResetTime uint32 `json:"lastResetTime"` MaxCount uint32 `json:"maxCount"` } type FishingSpotFishWire4229938 struct { Id uint32 `json:"id"` FishConfigId uint32 `json:"fishConfigId"` Weight float32 `json:"weight"` Length float32 `json:"length"` } type FishingFishAddWire4229938 struct { UniqueId uint32 `json:"uniqueId"` TemplateId uint32 `json:"templateId"` Weight float32 `json:"weight"` Length float32 `json:"length"` IsPlaced bool `json:"isPlaced"` } type FishingGearWire4229938 struct { UniqueId uint32 `json:"uniqueId"` TemplateId uint32 `json:"templateId"` RemainingDurability uint32 `json:"remainingDurability"` } // // 钓鱼配置目录(懒加载一次)。读真实 JSON(FishingSpotConfig / FishingFishGroupConfig / // FishingFishConfig),找不到文件就退化为通用鱼池,绝不让钓鱼链路崩。 // type FishingCatalog4229938 struct { Spots map[uint32]FishingSpotRec `json:"spots"` Groups map[uint32]FishingGroupRec `json:"groups"` AllFishIdsField []uint32 `json:"allFishIdsField"` // fishId → (NormalWeight 克, NormalLength 厘米),取自 FishingFishConfig,用于生成贴近原版的体重/体长。 FishBody map[uint32]any `json:"fishBody"` Rng any `json:"rng"` Gate any `json:"gate"` AllFishIds []uint32 `json:"allFishIds"` } func GameRouter_Fishing_NowUnix(ctx context.Context, ) uint32 { // Router implementation for GameRouter_Fishing_NowUnix return 0 } func GameRouter_Fishing_EnsurePool(ctx context.Context, state any, fishGroupId uint32) any { // Router implementation for GameRouter_Fishing_EnsurePool var zero any; return zero } func GameRouter_Fishing_GetOrCreatePool(ctx context.Context, state any, fishGroupId uint32) any { // Router implementation for GameRouter_Fishing_GetOrCreatePool var zero any; return zero } func GameRouter_Fishing_PickFishConfigId(ctx context.Context, ) uint32 { // Router implementation for GameRouter_Fishing_PickFishConfigId return 0 } func GameRouter_Fishing_BuildPool(ctx context.Context, fishGroupId uint32) any { // Router implementation for GameRouter_Fishing_BuildPool var zero any; return zero } // FishingFishGroupConfig 用的是短 id(2/10/3/7…),补成全 id(10105002…);已是全 id 的不动。 func GameRouter_Fishing_NormalizeFishId(ctx context.Context, raw uint32) uint32 { // Router implementation for GameRouter_Fishing_NormalizeFishId return 0 } // // 宽容 uint 读取:客户端导出的 JSON 里数字字段混用 number / string(如 "FishId": "2"、 // "Id": 10105001),直接 GetUInt32() 会在 string 上抛 InvalidOperationException。 // func GameRouter_Fishing_ReadUIntEl(ctx context.Context, el any) uint32 { // Router implementation for GameRouter_Fishing_ReadUIntEl return 0 } func GameRouter_Fishing_LoadSpots(ctx context.Context, path string) any { // Router implementation for GameRouter_Fishing_LoadSpots var zero any; return zero } func GameRouter_Fishing_LoadGroups(ctx context.Context, path string) any { // Router implementation for GameRouter_Fishing_LoadGroups var zero any; return zero } func GameRouter_Fishing_LoadFish(ctx context.Context, path string) any { // Router implementation for GameRouter_Fishing_LoadFish var zero any; return zero } type FishingInitGroup struct { FishId uint32 `json:"fishId"` Num uint32 `json:"num"` } type FishingSpotRec struct { Id uint32 `json:"id"` InitGroup []FishingInitGroup `json:"initGroup"` } type FishingGroupRec struct { Id uint32 `json:"id"` MaxCount uint32 `json:"maxCount"` InitGroup []FishingInitGroup `json:"initGroup"` }