PDA

Просмотр полной версии : [Вопрос] Система семей и их загрузка



verteich
25.08.2019, 12:52
У меня есть проблема, к примеру люди создают 3 семьи, после рестарта, они нормально выгрузились из базы данных, но если удалить к примеру 1 семью, то игрок с 2 семьей, имеет 3 семью, как это можно решить?
#define MAX_FAMILY (1000)
enum e_FAMILY_INFO
{
famID,
famName[15],
famSlogan[40],
famOnline,
famMembersCount,
famCreator[MAX_PLAYER_NAME],
famZam[MAX_PLAYER_NAME],
famZam2[MAX_PLAYER_NAME],
famChatColor,
famGalka,
famBrand,
famDiscord[40],
famRaidCall[10]
}
new FamilyInfo[MAX_FAMILY][e_FAMILY_INFO];
mysql_tquery(mysql, "SELECT * FROM family ORDER BY family.id ASC ", "@LoadFamily", "");
@LoadFamily();
@LoadFamily()
{
new time = GetTickCount();

new rows, fields;
cache_get_data(rows, fields);

if(rows)
{
for(new i = 0; i < rows; i++)
{
FamilyInfo[i+1][famID] = cache_get_field_content_int(i, "id", mysql);
cache_get_field_content(i, "slogan", FamilyInfo[i+1][famSlogan], mysql);
cache_get_field_content(i, "name", FamilyInfo[i+1][famName], mysql);
FamilyInfo[i+1][famMembersCount] = cache_get_field_content_int(i, "memberscount", mysql);
cache_get_field_content(i, "creator", FamilyInfo[i+1][famCreator], mysql);
cache_get_field_content(i, "zam", FamilyInfo[i+1][famZam], mysql);
cache_get_field_content(i, "zam2", FamilyInfo[i+1][famZam2], mysql);
FamilyInfo[i+1][famChatColor] = cache_get_field_content_int(i, "chatcolor", mysql);
FamilyInfo[i+1][famGalka] = cache_get_field_content_int(i, "galka", mysql);
FamilyInfo[i+1][famBrand] = cache_get_field_content_int(i, "brand", mysql);
cache_get_field_content(i, "discord", FamilyInfo[i+1][famDiscord], mysql);
cache_get_field_content(i, "raidcall", FamilyInfo[i+1][famRaidCall], mysql);

TOTALFAMILY ++;
}
}

printf("[Загружено семей]: <%i>. Потрачено: <%i ms>.", TOTALFAMILY, GetTickCount() - time);
return 1;
}
Структура базы данных семей:
Скриншот (https://prnt.sc/ox7cwv)

DeimoS
25.08.2019, 13:43
Эмм, а зачем вообще грузить все семьи в память сервера? Что будешь делать при реальном онлайне, когда семей, со временем, создадут несколько тысяч?
Грузить нужно только те семьи, участники которой находятся в сети, выгружая данные когда последний участник вышел. Либо вообще хранить информацию о семье в массиве игрока и при авторизации загружать данные о семье. В этих случаях ты с лимитом не столкнёшься.

А ещё вот за такое

FamilyInfo[i+1][famID] = cache_get_field_content_int(i, "id", mysql);
Пока пальцы отрубать. Для чего оставлять нулевую ячейку пустой? Если так хочется, чтоб для игрока ID семей начинались с единицы, а не с нуля - просто прибавляй к ID семьи единицу при форматировании сообщения. А делать так, как делаешь ты - крайне странная тенденция, распространённая непонятно кем.

Ну и вместо вот такого странного подсчёта:


TOTALFAMILY ++;
Лучше использовать итератор.


Касаемо самого вопроса: тут проблема не в загрузке, скорее всего, а в неправильной работе с массивом. Собственно, нужно учесть замечания сверху + при авторизации игрока прогонять циклом массив семей, сравнивая ID семьи игрока с ID загруженных семей. Нашёл совпадение - записал индекс массива семей в переменную семьи игрока и уже по этой переменной обращаешься к массиву в будущем.
То бишь, не должно быть такого, что в аккаунт игрока ты тупо записываешь индекс ячейки массива семьи. В аккаунте должен хранится ID семьи из базы, например. И при входе ты уже через цикл определяешь индекс, сверяя ID.