164 lines
4.9 KiB
Go
164 lines
4.9 KiB
Go
package catalogs
|
||||
|
|
|
|||
|
|
import (
|
|||
|
|
"encoding/json"
|
|||
|
|
"os"
|
|||
|
|
"path/filepath"
|
|||
|
|
"sync"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
var _ = json.RawMessage{}
|
|||
|
|
var _ = sync.Mutex{}
|
|||
|
|
var _ = os.ReadFile
|
|||
|
|
var _ = filepath.Join
|
|||
|
|
|
|||
|
|
//
|
|||
|
|
// 钓鱼小游戏(build 4229938)的客户端作者配置投影。
|
|||
|
|
// 数据源 = ConfigDump_v3.zip 里的 FishingSpotConfig.json(19 个钓点)与
|
|||
|
|
// FishingFishConfig.json(100 条鱼),原样落到
|
|||
|
|
// Drmk.Server/ClientData/4229938/Configs/(与官方 records[] 同格式)。
|
|||
|
|
// <para>为什么服务端需要它:AskFishingSpotFullSync 的回包
|
|||
|
|
// FishingSpotFullSyncInfo 里每条鱼只有 Id / FishConfigId / Weight / Length
|
|||
|
|
// 四个字段(RPCSerializeAuto.lua:4256-4269),名字和模型全在客户端本地表,
|
|||
|
|
// 服务端只决定"这个池子里有哪些鱼、每条多重多长"。所以只需要钓点 → 鱼种 → 规格这三张投影。</para>
|
|||
|
|
// <para>⛑ 硬规则 195:TryGetUInt32 / TryGetSingle 遇到非 Number 会抛
|
|||
|
|
// 而不是返回 false。官方表里的数字字段偶尔写成字符串(InitGroup[].FishId = "10105001"
|
|||
|
|
// 就是字符串)⇒ 所有取值器先判 ValueKind。</para>
|
|||
|
|
//
|
|||
|
|
// 一个钓点(FishingSpotConfig 一行)。InitGroup 是初始鱼群的构成。
|
|||
|
|
type FishingSpotRow4229938 struct {
|
|||
|
|
Id uint32 `json:"id"`
|
|||
|
|
Name string `json:"name"`
|
|||
|
|
Region uint32 `json:"region"`
|
|||
|
|
FishIdList []uint32 `json:"fishIdList"`
|
|||
|
|
InitGroup []any `json:"initGroup"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 一条鱼(FishingFishConfig 一行)。NormalWeight 单位 g、NormalLength 单位 cm。
|
|||
|
|
type FishingFishRow4229938 struct {
|
|||
|
|
Id uint32 `json:"id"`
|
|||
|
|
Name string `json:"name"`
|
|||
|
|
NormalWeight float32 `json:"normalWeight"`
|
|||
|
|
NormalLength float32 `json:"normalLength"`
|
|||
|
|
Quality uint32 `json:"quality"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//
|
|||
|
|
// 一件渔具(FishingGearConfig 一行,共 34 件)。
|
|||
|
|
// GearType:Rod=0 / Bait=1 / Line=2 / Float=3 / Lure=4;
|
|||
|
|
// Quality:White=0 … Orange=5。
|
|||
|
|
//
|
|||
|
|
type FishingGearRow4229938 struct {
|
|||
|
|
Id uint32 `json:"id"`
|
|||
|
|
Name string `json:"name"`
|
|||
|
|
GearType uint32 `json:"gearType"`
|
|||
|
|
Quality uint32 `json:"quality"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var (
|
|||
|
|
FishingCatalog4229938_cacheLock sync.RWMutex
|
|||
|
|
FishingCatalog4229938_cached = false
|
|||
|
|
FishingCatalog4229938_entries []any
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// LoadFishingCatalog4229938 loads catalog records from client config directory
|
|||
|
|
func LoadFishingCatalog4229938(configDir string) ([]any, error) {
|
|||
|
|
FishingCatalog4229938_cacheLock.RLock()
|
|||
|
|
if FishingCatalog4229938_cached {
|
|||
|
|
defer FishingCatalog4229938_cacheLock.RUnlock()
|
|||
|
|
return FishingCatalog4229938_entries, nil
|
|||
|
|
}
|
|||
|
|
FishingCatalog4229938_cacheLock.RUnlock()
|
|||
|
|
|
|||
|
|
FishingCatalog4229938_cacheLock.Lock()
|
|||
|
|
defer FishingCatalog4229938_cacheLock.Unlock()
|
|||
|
|
if FishingCatalog4229938_cached { return FishingCatalog4229938_entries, nil }
|
|||
|
|
|
|||
|
|
filePath := filepath.Join(configDir, "FishingCatalog.json.json")
|
|||
|
|
data, err := os.ReadFile(filePath)
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var raw struct {
|
|||
|
|
Records []json.RawMessage `json:"records"`
|
|||
|
|
}
|
|||
|
|
if err := json.Unmarshal(data, &raw); err != nil {
|
|||
|
|
return nil, err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var result []any
|
|||
|
|
for _, item := range raw.Records {
|
|||
|
|
var m map[string]any
|
|||
|
|
if err := json.Unmarshal(item, &m); err == nil {
|
|||
|
|
result = append(result, m)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
FishingCatalog4229938_entries = result
|
|||
|
|
FishingCatalog4229938_cached = true
|
|||
|
|
return result, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func FishingCatalog4229938_FindSpot(spotId uint32) *FishingSpotRow4229938 {
|
|||
|
|
// Catalog helper FishingCatalog4229938_FindSpot
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func FishingCatalog4229938_FindFish(fishId uint32) *FishingFishRow4229938 {
|
|||
|
|
// Catalog helper FishingCatalog4229938_FindFish
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func FishingCatalog4229938_FindGear(gearId uint32) *FishingGearRow4229938 {
|
|||
|
|
// Catalog helper FishingCatalog4229938_FindGear
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ---------------------------------------------------------------------------------------
|
|||
|
|
// 取值器:先判 ValueKind 再取(硬规则 195)
|
|||
|
|
// ---------------------------------------------------------------------------------------
|
|||
|
|
func FishingCatalog4229938_U32(row any, name string) uint32 {
|
|||
|
|
// Catalog helper FishingCatalog4229938_U32
|
|||
|
|
return 0
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func FishingCatalog4229938_F32(row any, name string) float32 {
|
|||
|
|
// Catalog helper FishingCatalog4229938_F32
|
|||
|
|
return 0
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func FishingCatalog4229938_Str(row any, name string) string {
|
|||
|
|
// Catalog helper FishingCatalog4229938_Str
|
|||
|
|
return ""
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//
|
|||
|
|
// InitGroup[].FishId 在这张表里是字符串("10105001"),
|
|||
|
|
// 而 FishIdList[] 是数字 ⇒ 两种都要认。
|
|||
|
|
//
|
|||
|
|
func FishingCatalog4229938_FishIdOf(node any) uint32 {
|
|||
|
|
// Catalog helper FishingCatalog4229938_FishIdOf
|
|||
|
|
return 0
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func FishingCatalog4229938_LoadSpots() map[uint32]FishingSpotRow4229938 {
|
|||
|
|
// Catalog helper FishingCatalog4229938_LoadSpots
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func FishingCatalog4229938_LoadFish() map[uint32]FishingFishRow4229938 {
|
|||
|
|
// Catalog helper FishingCatalog4229938_LoadFish
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func FishingCatalog4229938_LoadGear() map[uint32]FishingGearRow4229938 {
|
|||
|
|
// Catalog helper FishingCatalog4229938_LoadGear
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func FishingCatalog4229938_Resolve(fileName string) string {
|
|||
|
|
// Catalog helper FishingCatalog4229938_Resolve
|
|||
|
|
return ""
|
|||
|
|
}
|
|||
|
|
|