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
Ananta-ps/internal/gameserver/routers/game_router_fishing.go
T

222 lines
9.7 KiB
Go
Raw Normal View History

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"`
}