эм... как бы каждый персонаж уже имеет в базе ссылки на ВСЕ квесты в игре с их состояниями для конкретного персонажа... иначе как она определит - делал перс квест или нет? на квестах завязаны ачивки и сервер должен помнить какие условия ачивок сделаны персонажем.
не имеет, система огромна и раздута, потому что она должна работать с остатками легаси-кода. С ачивками там все по-другому, там гигантская система бинарных деревьев CriteriaTree и PlayerCondition
Все неправы, поскольку кое-что в БФА реально изменилось. Квесты (именно QuestLog) всегда хранились непосредственно в полях игрока (поля - это некие свойства объекта Player, они могут быть видимы другим клиентам, когда объекты создаются а клиенте, а могут быть невидимы для других. Например предметы экипировки видимы всем, а данные по сумкам нет). Точно так же хранились слоты для инвентаря - к вопросу лимита рюкзака. Соответственно сначала их реально было 20 и поля квестлога были одними из первых по порядку в памяти. Соответственно расширять их было невозможно. Но, следующая за ними структура, хранившая итемы, была пересмотрена и сокращена, она лишилась itemCreator, который содержал аж 8 байт или uint64 - типа нафига отдавать другим клиентам itemCreator - для экипированного шмота, когда можно сделать в самом итеме и его полях. Так или иначе, место появилось и квест-лог расширился до 25.
В БФА произошло переписывание старых легаси-структур на новый современный лад, я не знаю какую колоссальную работу они проделали, но это мощно. И хранение данных в полях объекта полностью изменилось. На самом деле, 35 - это просто подачка
См.
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::PartyMember))
{
for (uint32 i = 0; i < 125; ++i)
{
QuestLog.WriteCreate(data, owner, receiver);
}
data < < uint32(QuestSessionQuestLog.size());
}
125 записей доступно на данный момент, здесь кстати показывается, кому должны быть видны эти данные, помимо самого игрока - UpdateFieldFlag::PartyMember.
Еще есть есть массивы QuestsCompleted
for (uint32 i = 0; i < 875; ++i)
{
data << uint64(QuestCompleted[ i ]);
}
И тут не ИД квестов шлется, каждое такое число uint64 (8 байт - 64 бита) - содержит в себе данные о завершении 64 квестов, по 1 биту на статус завершен/не завершен. Итого 875*64 квестов.
DailyQuests, какие-то ReplayedQuests + какое-то отображение квестов для текущей сессии, не совсем понятно, что это. Но размер этих массивов передается сервером.