2025-06-29 14:44:00 +03:00
..
2025-06-29 14:44:00 +03:00
2025-06-26 23:24:52 +03:00
asd
2025-06-28 18:13:47 +03:00
2025-06-29 12:39:23 +03:00
upd
2025-06-28 19:17:59 +03:00
2025-06-29 12:39:23 +03:00
2025-06-26 23:24:52 +03:00
2025-06-29 12:39:23 +03:00
2025-06-26 23:24:52 +03:00

Система инвентаря 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
  • Обновлены интерфейсы и базовые классы

Использование

Создание предметов

// Создание предмета оружия
var weaponItem = new InventoryItem
{
    Definition = ResourceLibrary.Get<WeaponItemDefinition>("Items/pistol_test.weapon")
};
inventory.AddItem(weaponItem);

// Создание патронов
var ammoItem = new InventoryItem
{
    Definition = ResourceLibrary.Get<AmmoItemDefinition>("Items/pistol_ammo.ammo")
};
ammoItem.Count = 30;
inventory.AddItem(ammoItem);

Экипировка предметов

// Экипировка предмета
inventory.EquipItem(item);

// Проверка экипированного предмета
var equippedWeapon = inventory.GetEquippedItem(Inventar.InventorySlot.RightHand);

Валидация

// Проверка возможности добавления
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 для добавления тестовых предметов:

// Добавьте компонент к игроку и установите AddTestItems = true
var testComponent = player.GameObject.Components.GetOrCreate<InventoryTest>();
testComponent.AddTestItems = true;

InventoryCompilationTest

Используйте компонент InventoryCompilationTest для проверки компиляции:

// Добавьте компонент к игроку и установите RunTest = true
var testComponent = player.GameObject.Components.GetOrCreate<InventoryCompilationTest>();
testComponent.RunTest = true;

Известные проблемы

  • Убедитесь, что все необходимые ресурсы (префабы, текстуры) существуют
  • Проверьте, что определения предметов правильно настроены в редакторе
  • При использовании в сети убедитесь, что все компоненты имеют правильные атрибуты [Sync]