2025-06-26 23:24:52 +03:00

172 lines
7.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Система инвентаря 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<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);
```
### Экипировка предметов
```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<InventoryTest>();
testComponent.AddTestItems = true;
```
### InventoryCompilationTest
Используйте компонент `InventoryCompilationTest` для проверки компиляции:
```csharp
// Добавьте компонент к игроку и установите RunTest = true
var testComponent = player.GameObject.Components.GetOrCreate<InventoryCompilationTest>();
testComponent.RunTest = true;
```
## Известные проблемы
- Убедитесь, что все необходимые ресурсы (префабы, текстуры) существуют
- Проверьте, что определения предметов правильно настроены в редакторе
- При использовании в сети убедитесь, что все компоненты имеют правильные атрибуты `[Sync]`