172 lines
7.1 KiB
Markdown
172 lines
7.1 KiB
Markdown
# Система инвентаря 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]` |