package catalogs import ( "encoding/json" "os" "path/filepath" "sync" ) var _ = json.RawMessage{} var _ = sync.Mutex{} var _ = os.ReadFile var _ = filepath.Join // One authored weapon skin: its id and the weapon scene item it belongs to. type WeaponSkin4229938 struct { SkinId uint32 `json:"skinId"` SceneItemId uint32 `json:"sceneItemId"` IsDefault bool `json:"isDefault"` } // // Reads Configs/WeaponSkinConfig.json — the engine's authored weapon-skin table (221 rows in stock // 4229938, ids 20300002..20300505, 215 of them flagged IsDefault). // The client owns the same table, so the server only needs the id list to say "these are owned" and // the scene-item mapping so an equipped skin can be validated against the weapon it is applied to. // Names, icons and quality stay client-side. // A missing or malformed file is not fatal: the catalog turns empty and LoadError // explains why, so login seeds an empty skin list instead of throwing. // var ( WeaponSkinCatalog4229938_cacheLock sync.RWMutex WeaponSkinCatalog4229938_cached = false WeaponSkinCatalog4229938_entries []any ) // LoadWeaponSkinCatalog4229938 loads catalog records from client config directory func LoadWeaponSkinCatalog4229938(configDir string) ([]any, error) { WeaponSkinCatalog4229938_cacheLock.RLock() if WeaponSkinCatalog4229938_cached { defer WeaponSkinCatalog4229938_cacheLock.RUnlock() return WeaponSkinCatalog4229938_entries, nil } WeaponSkinCatalog4229938_cacheLock.RUnlock() WeaponSkinCatalog4229938_cacheLock.Lock() defer WeaponSkinCatalog4229938_cacheLock.Unlock() if WeaponSkinCatalog4229938_cached { return WeaponSkinCatalog4229938_entries, nil } filePath := filepath.Join(configDir, "WeaponSkinCatalog.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) } } WeaponSkinCatalog4229938_entries = result WeaponSkinCatalog4229938_cached = true return result, nil } func WeaponSkinCatalog4229938_TryGet(skinId uint32, skin WeaponSkin4229938) bool { // Catalog helper WeaponSkinCatalog4229938_TryGet return false }