package catalogs import ( "encoding/json" "os" "path/filepath" "sync" ) var _ = json.RawMessage{} var _ = sync.Mutex{} var _ = os.ReadFile var _ = filepath.Join // // 改装店改装件的落盘(save/vehicles/<pid>.json)。 // 为什么需要:donor 最初把购买结果只放在 WorldEntryState 的内存字典里, // 服务端一重启买过的件全没了(donor backlog #2 的原话)。买一次就要写一次盘 —— 没有可靠的 // session-end 钩子,所以走「每次购买后立刻写」。 // 开关 gameplay.repairShop.persistTuning(默认 false = 与 donor 默认一致): // 关掉时本类只读不写,行为完全等同 donor 未接 store 时的样子。 // 写盘用 tmp + move 的原子替换,避免写一半崩掉留下截断的 json。 // var ( VehicleTuningStore_cacheLock sync.RWMutex VehicleTuningStore_cached = false VehicleTuningStore_entries []any ) // LoadVehicleTuningStore loads catalog records from client config directory func LoadVehicleTuningStore(configDir string) ([]any, error) { VehicleTuningStore_cacheLock.RLock() if VehicleTuningStore_cached { defer VehicleTuningStore_cacheLock.RUnlock() return VehicleTuningStore_entries, nil } VehicleTuningStore_cacheLock.RUnlock() VehicleTuningStore_cacheLock.Lock() defer VehicleTuningStore_cacheLock.Unlock() if VehicleTuningStore_cached { return VehicleTuningStore_entries, nil } filePath := filepath.Join(configDir, "VehicleTuningStore.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) } } VehicleTuningStore_entries = result VehicleTuningStore_cached = true return result, nil } func VehicleTuningStore_PathFor(pid uint64) string { // Catalog helper VehicleTuningStore_PathFor return "" } // 把当前会话的改装状态写盘。开关关闭或 world 为空时直接返回。 func VehicleTuningStore_Save(pid uint64, world *any) { // Catalog helper VehicleTuningStore_Save } type SaveFile struct { Vehicles []VehicleDto `json:"vehicles"` } type VehicleDto struct { ConfigId uint32 `json:"configId"` SuitId uint32 `json:"suitId"` Parts []PartDto `json:"parts"` } type PartDto struct { Type uint32 `json:"type"` ConfigId uint32 `json:"configId"` }