118 lines
6.2 KiB
Markdown
118 lines
6.2 KiB
Markdown
# Система сохранения инвентаря
|
||
|
||
## Описание
|
||
|
||
Система автоматического сохранения и загрузки инвентаря игрока, включая экипированные предметы (одежда, оружие).
|
||
|
||
## Функциональность
|
||
|
||
### Автоматическое сохранение
|
||
- Инвентарь автоматически сохраняется при любых изменениях:
|
||
- Добавление предметов
|
||
- Удаление предметов
|
||
- Экипировка предметов
|
||
- Снятие предметов
|
||
|
||
### Сохранение при выходе из игры
|
||
- **При отключении от сервера** - инвентарь сохраняется автоматически
|
||
- **При закрытии игры** - инвентарь сохраняется при уничтожении объекта игрока
|
||
- **При разрыве соединения** - дополнительное сохранение для защиты от потери данных
|
||
|
||
### Периодическое сохранение
|
||
- **Каждые 60 секунд** - автоматическое сохранение для защиты от сбоев
|
||
- Защищает от потери прогресса при неожиданном закрытии игры
|
||
|
||
### Автоматическая загрузка
|
||
- При входе в игру система автоматически проверяет наличие сохранения
|
||
- Если сохранение найдено, инвентарь загружается автоматически
|
||
- Если сохранения нет, начинается с пустым инвентарем
|
||
|
||
### Сохраняемые данные
|
||
- Все предметы в инвентаре (название, количество, патроны в магазине)
|
||
- Экипированные предметы (одежда, оружие)
|
||
- Слоты экипировки
|
||
|
||
## Использование
|
||
|
||
### В игре
|
||
1. **UI панель**: В правом верхнем углу экрана отображается панель управления сохранением
|
||
- Зеленая индикация = есть сохранение
|
||
- Красная индикация = нет сохранения
|
||
- Кнопки: Сохранить, Загрузить, Очистить
|
||
|
||
### Автоматическое сохранение
|
||
- **При изменениях** - сохранение происходит автоматически
|
||
- **При выходе** - сохранение при отключении/закрытии игры
|
||
- **Периодически** - каждые 60 секунд для защиты от сбоев
|
||
|
||
## Технические детали
|
||
|
||
### Файл сохранения
|
||
- Расположение: `data/inventory_save.json`
|
||
- Формат: JSON
|
||
- Структура:
|
||
```json
|
||
{
|
||
"Items": [
|
||
{
|
||
"ItemDefinitionPath": "path/to/item.resource",
|
||
"Count": 1,
|
||
"MagazineAmmo": 0,
|
||
"Id": "unique-id"
|
||
}
|
||
],
|
||
"EquippedItems": {
|
||
"RightHand": "item-id",
|
||
"Body": "item-id"
|
||
}
|
||
}
|
||
```
|
||
|
||
### Классы системы
|
||
- `InventorySaveSystem` - статический класс для работы с сохранением
|
||
- `InventorySaveData` - модель данных для сохранения
|
||
- `SavedInventoryItem` - модель сохраненного предмета
|
||
|
||
### Интеграция
|
||
- `Inventar` - добавлены методы `AutoSave()`, `LoadFromSave()`, `HasSaveFile()`, `DeleteSaveFile()`
|
||
- `Dedugan.Inventory.cs` - автоматическая загрузка при старте и периодическое сохранение
|
||
- `Dedugan.cs` - сохранение при выходе из игры (`OnDestroy`, `SaveInventoryOnExit()`)
|
||
- `NetworkManager.cs` - сохранение при отключении игрока (`OnDisconnected`, `OnBecomeInactive`)
|
||
- `GUI.razor` - интегрированная панель управления сохранением
|
||
|
||
## Безопасность
|
||
|
||
- Сохранение происходит только на клиенте (Network.IsOwner)
|
||
- Проверка валидности данных при загрузке
|
||
- Обработка ошибок с логированием
|
||
- Fallback на пустой инвентарь при ошибках
|
||
- **Множественные точки сохранения** для максимальной защиты данных
|
||
|
||
## Совместимость
|
||
|
||
- Работает со всеми типами предметов (оружие, одежда, патроны и т.д.)
|
||
- Поддерживает все слоты экипировки
|
||
- Сохраняет патроны в магазине оружия
|
||
- Совместима с существующей системой инвентаря
|
||
|
||
## Устранение неполадок
|
||
|
||
### Проблема: Инвентарь не загружается
|
||
1. Проверьте консоль на ошибки
|
||
2. Убедитесь, что файл `data/inventory_save.json` существует
|
||
3. Проверьте права доступа к папке data
|
||
|
||
### Проблема: Предметы не сохраняются
|
||
1. Убедитесь, что вы владелец игрока (Network.IsOwner)
|
||
2. Проверьте, что предметы имеют валидные определения
|
||
3. Проверьте консоль на ошибки сериализации
|
||
|
||
### Проблема: UI не отображается
|
||
1. Убедитесь, что панель сохранения интегрирована в GUI.razor
|
||
2. Проверьте, что стили добавлены в GUI.razor
|
||
3. Перезапустите игру
|
||
|
||
### Проблема: Сохранение не работает при выходе
|
||
1. Проверьте, что метод `SaveInventoryOnExit()` вызывается
|
||
2. Убедитесь, что NetworkManager правильно обрабатывает отключения
|
||
3. Проверьте логи на наличие ошибок сохранения |