using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.Networking; using Newtonsoft.Json; public class MANAGER_Shop : MonoBehaviour { public static MANAGER_Shop Instance { get; private set; } [SerializeField] private string shopUrl = "ТУТ_ТВОЯ_ССЫЛКА_НА_JSON"; public ShopConfig ShopData { get; private set; } public bool IsDataLoaded { get; private set; } = false; private void Awake() { //PlayerPrefs.DeleteAll(); if (Instance == null) { Instance = this; DontDestroyOnLoad(gameObject); } else Destroy(gameObject); } private void Start() { StartCoroutine(LoadShopData()); } private IEnumerator LoadShopData() { IsDataLoaded = false; if (string.IsNullOrEmpty(shopUrl)) { yield break; } using (UnityWebRequest req = UnityWebRequest.Get(shopUrl)) { // Установим таймаут 10 секунд, чтобы запрос не висел вечно req.timeout = 10; yield return req.SendWebRequest(); if (req.result == UnityWebRequest.Result.ConnectionError) { } else if (req.result == UnityWebRequest.Result.ProtocolError) { } else if (req.result == UnityWebRequest.Result.Success) { string json = req.downloadHandler.text; try { ShopData = JsonConvert.DeserializeObject(json); if (ShopData != null && ShopData.shops != null) { IsDataLoaded = true; MANAGER_GameEvents.TriggerUIUpdate(); } else { } } catch (Exception e) { } } else { } } } // Получаем товары, которые: 1) Нужного типа 2) Выполнили условия 3) ЕЩЕ НЕ КУПЛЕНЫ public List GetAvailableItems(string shopType) { if (!IsDataLoaded || ShopData == null || ShopData.shops == null) { return new List(); } List filtered = new List(); foreach (var item in ShopData.shops) { // Исправлено: добавлена проверка и пропуск, если item пустой if (item == null) continue; bool typeMatch = string.Equals(item.shop_type?.Trim(), shopType.Trim(), StringComparison.OrdinalIgnoreCase); bool visible = IsItemVisible(item); bool purchased = IsItemPurchased(item.id); if (typeMatch && visible && !purchased) { filtered.Add(item); } } return filtered; } // Скобка закрывает метод private bool IsItemVisible(ShopItem item) { if (item.availableFromStart) return true; if (item.conditions == null || item.conditions.Count == 0) return true; return true; } public bool CanPlayerAfford(ShopItem item) { if (item.isGift) return true; // ЗАГЛУШКА: Замени на реальное получение валюты из своего кошелька int playerGold = PlayerPrefs.GetInt("Currency_Gold", 1000); int playerIron = PlayerPrefs.GetInt("Currency_Iron", 500); if (item.currency_type.Trim().Equals("Gold", StringComparison.OrdinalIgnoreCase)) return playerGold >= item.FinalPrice; if (item.currency_type.Trim().Equals("Iron", StringComparison.OrdinalIgnoreCase)) return playerIron >= item.FinalPrice; return false; } public bool IsItemPurchased(string itemId) { return PlayerPrefs.GetInt($"Shop_Purchased_{itemId}", 0) == 1; } // Возвращает true, если покупка удалась public void BuyItem(ShopItem item) { if (IsItemPurchased(item.id)) return; // TODO: Здесь добавь списание валюты через твой MANAGER_Economy // Помечаем как купленное PlayerPrefs.SetInt($"Shop_Purchased_{item.id}", 1); PlayerPrefs.Save(); // Оповещаем UI, что нужно обновиться (это заставит список пересобраться) MANAGER_GameEvents.TriggerUIUpdate(); } }