# Система инвентаря Sasalka ## Обзор Новая система инвентаря была полностью переработана для улучшения производительности, сетевой синхронизации и пользовательского опыта. ## Основные изменения ### 1. Inventar (Основной класс инвентаря) - Теперь наследуется от `Component` для лучшей интеграции с S&box - Добавлена сетевая синхронизация с атрибутами `[Sync]` - Улучшена валидация при добавлении предметов - Добавлена поддержка стакания предметов - Новые события: `OnItemAdded`, `OnItemRemoved` ### 2. InventoryItem - Добавлена сетевая синхронизация с `[Sync]` - Улучшена валидация количества предметов - Новые методы: `CanStackWith`, `CanAddCount`, `TryAddCount`, `TryRemoveCount`, `Clone` ### 3. Определения предметов #### BaseItemDefinition - Добавлены категории предметов (`ItemCategory`) - Добавлена система редкости (`ItemRarity`) - Добавлен вес предметов - Улучшен редактор с группировкой свойств #### WeaponItemDefinition - Добавлены свойства оружия (урон, скорострельность, дальность) - Улучшена структура `WeaponDefinition` #### ClothingItemDefinition - Добавлены свойства брони и видимости - Улучшена интеграция с системой одежды #### AmmoItemDefinition (новый) - Специализированное определение для патронов - Система совместимости с оружием - Свойства патронов (урон, пробивная способность) ### 4. UI инвентаря - Добавлена фильтрация по категориям - Улучшен дизайн с поддержкой редкости - Отображение экипированных предметов - Адаптивный интерфейс ## Исправления API ### Сетевая синхронизация - Заменены атрибуты `[Net]` на `[Sync]` для совместимости с S&box - Все изменения инвентаря автоматически синхронизируются между клиентами ### Методы коллекций - Исправлен метод `ContainsValue()` на `Values.Contains()` для `Dictionary` - Обновлены методы работы с коллекциями для совместимости ### Using директивы - Добавлены необходимые `using` директивы в UI файлы - Исправлены namespace для компонентов ### Наследование - Исправлено наследование `PickupItem` от `Sandbox.UI.InteractionButton` - Обновлены интерфейсы и базовые классы ## Использование ### Создание предметов ```csharp // Создание предмета оружия var weaponItem = new InventoryItem { Definition = ResourceLibrary.Get("Items/pistol_test.weapon") }; inventory.AddItem(weaponItem); // Создание патронов var ammoItem = new InventoryItem { Definition = ResourceLibrary.Get("Items/pistol_ammo.ammo") }; ammoItem.Count = 30; inventory.AddItem(ammoItem); ``` ### Экипировка предметов ```csharp // Экипировка предмета inventory.EquipItem(item); // Проверка экипированного предмета var equippedWeapon = inventory.GetEquippedItem(Inventar.InventorySlot.RightHand); ``` ### Валидация ```csharp // Проверка возможности добавления if (inventory.CanAddItem(item)) { inventory.AddItem(item); } // Проверка стакания if (item1.CanStackWith(item2)) { // Предметы можно объединить } ``` ## Создание определений предметов ### Оружие 1. Создайте ресурс типа "Weapon Item Definition" 2. Укажите слот экипировки 3. Настройте параметры оружия (урон, дальность и т.д.) 4. Укажите тип патронов ### Патроны 1. Создайте ресурс типа "Ammo Item Definition" 2. Укажите тип патронов 3. Настройте совместимость с оружием ### Одежда 1. Создайте ресурс типа "Clothing Item Definition" 2. Укажите слот экипировки 3. Добавьте URL одежды из Workshop ## Сетевая синхронизация Все изменения инвентаря автоматически синхронизируются между клиентами благодаря атрибутам `[Sync]` на свойствах `Items` и `EquippedItems`. ## Производительность - Улучшена производительность UI с оптимизированным `BuildHash()` - Добавлено кэширование для `GetUsables()` - Оптимизирована работа с коллекциями ## Миграция Для миграции существующих предметов: 1. Обновите определения предметов с новыми свойствами 2. Измените код создания предметов на новый API 3. Обновите UI для использования новых компонентов ## Тестирование ### InventoryTest Используйте компонент `InventoryTest` для добавления тестовых предметов: ```csharp // Добавьте компонент к игроку и установите AddTestItems = true var testComponent = player.GameObject.Components.GetOrCreate(); testComponent.AddTestItems = true; ``` ### InventoryCompilationTest Используйте компонент `InventoryCompilationTest` для проверки компиляции: ```csharp // Добавьте компонент к игроку и установите RunTest = true var testComponent = player.GameObject.Components.GetOrCreate(); testComponent.RunTest = true; ``` ## Известные проблемы - Убедитесь, что все необходимые ресурсы (префабы, текстуры) существуют - Проверьте, что определения предметов правильно настроены в редакторе - При использовании в сети убедитесь, что все компоненты имеют правильные атрибуты `[Sync]`