sasalka/Code/Inventory/README_SaveSystem.md
2025-06-29 12:39:23 +03:00

118 lines
6.2 KiB
Markdown
Raw 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.

# Система сохранения инвентаря
## Описание
Система автоматического сохранения и загрузки инвентаря игрока, включая экипированные предметы (одежда, оружие).
## Функциональность
### Автоматическое сохранение
- Инвентарь автоматически сохраняется при любых изменениях:
- Добавление предметов
- Удаление предметов
- Экипировка предметов
- Снятие предметов
### Сохранение при выходе из игры
- **При отключении от сервера** - инвентарь сохраняется автоматически
- **При закрытии игры** - инвентарь сохраняется при уничтожении объекта игрока
- **При разрыве соединения** - дополнительное сохранение для защиты от потери данных
### Периодическое сохранение
- **Каждые 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. Проверьте логи на наличие ошибок сохранения