This repository has been archived on 2026-10-31. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files

223 lines
9.7 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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<byte>()`)⇒ 客户端读空 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"`
}