Страница 1 из 1

В какой момент производить запись в БД?

СообщениеДобавлено: 21 сен 2017, 18:32
DarkDeivel
Всем привет! Добрался я до такой для меня важной темы как сохранение прогресса в БД. Проблема в том что я не совсем понимаю в какие моменты мне отправлять данные в БД и как лучше. Наверное что касается денег там попроще будет, во время покупки\продажи\подбора отправлять запрос в БД и обновлять значение(если я не прав поправьте пожалуйста), а вот как быть с координатами х,у,z? Каждый кадр отправлять это круто слишком, может быть отправлять каждые там 3-5 секунд в БД новые значения? Спасибо всем за помощь!

Я использую Photon Cloud.

Re: В какой момент производить запись в БД?

СообщениеДобавлено: 22 сен 2017, 15:35
Shekn
Достаточно будет сохранять все состояния игроков раз в минуту (или пол минуты, как хочется) и при выходе из игры.

Re: В какой момент производить запись в БД?

СообщениеДобавлено: 22 сен 2017, 16:00
DarkDeivel
Shekn писал(а):Достаточно будет сохранять все состояния игроков раз в минуту (или пол минуты, как хочется) и при выходе из игры.


Спасибо за первый ответ! Про выход из игры я конечно думал, но вдруг резко выкинет(интернет отвалится или свет выключат). Как сохранять инвентарь? Я вот читал что каждый предмет сохраняется отдельной строчкой в таблице, так тогда этих строчек могут быть десятки\сотни тысяч, это нормально? В какой момент нужно всё сохранять(подобрал\купил\выкинул)?

Re: В какой момент производить запись в БД?

СообщениеДобавлено: 22 сен 2017, 17:26
Woolf
Я использую Photon Cloud


ээм.. А как там можно что-то записать в БД? Вы что же, из клиента пишете в базу? Так категорически нельзя делать, это страшная уязвимость.

Re: В какой момент производить запись в БД?

СообщениеДобавлено: 23 сен 2017, 07:11
DarkDeivel
Woolf писал(а):
Я использую Photon Cloud


ээм.. А как там можно что-то записать в БД? Вы что же, из клиента пишете в базу? Так категорически нельзя делать, это страшная уязвимость.


Я хочу от него отказаться т.к. я на нем учился, но я сразу заранее про БД и спрашиваю когда и как записывать.

Как быть с инвентарем? Почитал в инете информацию. Пришел к выводу что должна быть таблица где прописывается игрок и предмет какой он имеет в инвентаре... У ла2 предметы хранятся в xml в виде:

Синтаксис:
Используется xml
<?xml version="1.0" encoding="UTF-8"?>
-<list>
-<item name="short_sword" id="1">
-<for>
<set stat="pAtk" order="0x08" val="8"/>
<set stat="mAtk" order="0x08" val="6"/>
<set stat="rCrit" order="0x08" val="8"/>
<add stat="accCombat" order="0x10" val="0"/>
<set stat="pAtkSpd" order="0x08" val="379"/>
<enchant stat="pAtk" order="0x0C" val="0"/>
<enchant stat="mAtk" order="0x0C" val="0"/>
</for>
</item>
</list>


Это довольно таки удобно, но я не пойму где это на сервере хранится и как оно считывается...

Можно конечно сделать таблицу в БД и назвать её items и в каждой строчке эти параметры указывать, но почему-то мне кажется вариант xml как выше лучше?

Re: В какой момент производить запись в БД?

СообщениеДобавлено: 24 сен 2017, 14:57
IDoNotExist
DarkDeivel писал(а):Как быть с инвентарем? Почитал в инете информацию. Пришел к выводу что должна быть таблица где прописывается игрок и предмет какой он имеет в инвентаре...

Не предмет, а его ID, по этому ID уже тащим из xml файла данные предмета.

Re: В какой момент производить запись в БД?

СообщениеДобавлено: 25 сен 2017, 07:28
DarkDeivel
IDoNotExist писал(а):
DarkDeivel писал(а):Как быть с инвентарем? Почитал в инете информацию. Пришел к выводу что должна быть таблица где прописывается игрок и предмет какой он имеет в инвентаре...

Не предмет, а его ID, по этому ID уже тащим из xml файла данные предмета.

Можете подсказать где должны эти xml хранится, не в клиенте же? И как считать его тому же клиенту.

Re: В какой момент производить запись в БД?

СообщениеДобавлено: 25 сен 2017, 08:28
IDoNotExist
DarkDeivel писал(а):Можете подсказать где должны эти xml хранится, не в клиенте же? И как считать его тому же клиенту.

Хранить на сервере, передавать с сервера на клиент.

Re: В какой момент производить запись в БД?

СообщениеДобавлено: 27 сен 2017, 01:02
Alex_Hell
если хочешь надежно и в меру не-крякабельно, то вся логика на сервере, например клиент говорит серву "открой сундук", серв выполняет код который проверяет шанс выпадения предмета, выдает предмет в инвентарь (в памяти, и сохраняет синхронно/асинхронно в БД возможно сразу а возможно батчами раз в N сек), и сообщает клиенту что он получил и должен показать юзеру.

конфиги предметов - статы урон, и что там еще - храни на сервере, передавай при старте на клиент в виде JSON (не XML), в юнити есть парсер JSON. Для серва тоже - на PHP,Java.

Как БД не выбирай файлы, они запароться могут, и работать "правильно" с ними сложней, изучи СУБД типа MySQL, и юзай SQL скрипты с серверной стороны вызываемые на UPDATE/INSERT/SELECT.

В таблице предметов можешь ввести например:
(long) UserId - (long) ItemTypeId
1 - 1
1 - 2
2 - 1
2 - 3

тут понятно какие предметы имеются в инвентаре какого игрока,
а по ItemTypeId понятно что за характеристики из сопутствующего связанного конфига ItemTypeId -> ItemInfo , с любыми под-параметрами, в зависимости от того на сколько универсальна система - какие атрибуты и на сколько одинаковые у предметов есть, может быть, может быть если это Урон у всех оружий, Броня у доспехов, тут можешь делить ItemType еще как Id 1 например Оружий, Id 2 Броня.
Главное во всех ID не запутаться, т.к. каждый из своего множества, т.е апельсины с человеками не смешивать

Re: В какой момент производить запись в БД?

СообщениеДобавлено: 27 сен 2017, 01:05
Alex_Hell
DarkDeivel писал(а):
Shekn писал(а):Достаточно будет сохранять все состояния игроков раз в минуту (или пол минуты, как хочется) и при выходе из игры.

Я вот читал что каждый предмет сохраняется отдельной строчкой в таблице, так тогда этих строчек могут быть десятки\сотни тысяч, это нормально?

СУБД для миллионов строк и придуманы, есть индексы для быстрого поиска, чтобы не выбирать все строки в поиске предметов нужного игрока по ID, или удалении предмета по Id предмета у Id игрока.