Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 2 из 2
  1. #1
    Аватар для verteich
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.03.2019
    Сообщений
    117
    Репутация:
    2 ±

    Система семей и их загрузка

    У меня есть проблема, к примеру люди создают 3 семьи, после рестарта, они нормально выгрузились из базы данных, но если удалить к примеру 1 семью, то игрок с 2 семьей, имеет 3 семью, как это можно решить?
    1. #define MAX_FAMILY (1000)
    2. enum e_FAMILY_INFO
    3. {
    4. famID,
    5. famName[15],
    6. famSlogan[40],
    7. famOnline,
    8. famMembersCount,
    9. famCreator[MAX_PLAYER_NAME],
    10. famZam[MAX_PLAYER_NAME],
    11. famZam2[MAX_PLAYER_NAME],
    12. famChatColor,
    13. famGalka,
    14. famBrand,
    15. famDiscord[40],
    16. famRaidCall[10]
    17. }
    18. new FamilyInfo[MAX_FAMILY][e_FAMILY_INFO];

    1. mysql_tquery(mysql, "SELECT * FROM family ORDER BY family.id ASC ", "@LoadFamily", "");

    1. @LoadFamily();
    2. @LoadFamily()
    3. {
    4. new time = GetTickCount();
    5.  
    6. new rows, fields;
    7. cache_get_data(rows, fields);
    8.  
    9. if(rows)
    10. {
    11. for(new i = 0; i < rows; i++)
    12. {
    13. FamilyInfo[i+1][famID] = cache_get_field_content_int(i, "id", mysql);
    14. cache_get_field_content(i, "slogan", FamilyInfo[i+1][famSlogan], mysql);
    15. cache_get_field_content(i, "name", FamilyInfo[i+1][famName], mysql);
    16. FamilyInfo[i+1][famMembersCount] = cache_get_field_content_int(i, "memberscount", mysql);
    17. cache_get_field_content(i, "creator", FamilyInfo[i+1][famCreator], mysql);
    18. cache_get_field_content(i, "zam", FamilyInfo[i+1][famZam], mysql);
    19. cache_get_field_content(i, "zam2", FamilyInfo[i+1][famZam2], mysql);
    20. FamilyInfo[i+1][famChatColor] = cache_get_field_content_int(i, "chatcolor", mysql);
    21. FamilyInfo[i+1][famGalka] = cache_get_field_content_int(i, "galka", mysql);
    22. FamilyInfo[i+1][famBrand] = cache_get_field_content_int(i, "brand", mysql);
    23. cache_get_field_content(i, "discord", FamilyInfo[i+1][famDiscord], mysql);
    24. cache_get_field_content(i, "raidcall", FamilyInfo[i+1][famRaidCall], mysql);
    25.  
    26. TOTALFAMILY ++;
    27. }
    28. }
    29.  
    30. printf("[Загружено семей]: <%i>. Потрачено: <%i ms>.", TOTALFAMILY, GetTickCount() - time);
    31. return 1;
    32. }

    Структура базы данных семей:
    Скриншот
    Последний раз редактировалось verteich; 25.08.2019 в 12:56.

  2. #2
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Эмм, а зачем вообще грузить все семьи в память сервера? Что будешь делать при реальном онлайне, когда семей, со временем, создадут несколько тысяч?
    Грузить нужно только те семьи, участники которой находятся в сети, выгружая данные когда последний участник вышел. Либо вообще хранить информацию о семье в массиве игрока и при авторизации загружать данные о семье. В этих случаях ты с лимитом не столкнёшься.

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

    Ну и вместо вот такого странного подсчёта:
    PHP код:
    TOTALFAMILY ++; 
    Лучше использовать итератор.


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

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •