• 0
Mason

Система аксессуаров

Вопросы

Всем привет, я сделал систему аксессуаров на своем сервере, но задаюсь вопросом, как сделать проверку на занятость слотов, у меня на сервере у игрока будет возможность иметь 4 аксессуара, соответственно мне в диалоге покупки как-то надо сделать проверку на занятость слотов, если у игрока занят 1 слот, то запись в базу идёт на второй, если 3 то на 4 и.т.д, и ещё такая проблема, когда я покупаю аксессуар, он остаётся на игроке, но после перезахода, проподает. Хотя загрузка аксессуаров и их появление при спавне присутствует.

Прилагаю участки кода:
 

Спойлер

//Диалог покупки аксессуаров
        case 12589:
        {
            if(!response) return 1;
            switch(listitem)
            {
                case 0:
                {
                    SetPlayerAttachedObject(playerid, 6219026);
                    SetPVarInt(playerid,"AksID",19026);
                    SetPlayerAttachedObject(playerid,6,19026,2);
                    EditAttachedObject(playerid,6);
                    SetPVarInt(playerid,"AccesoriesEdit",1);
                    SendClientMessage(playerid, COLOR_WHITE, " Для отмены покупки, нажмите - {FFFF00}ESC");
                    Accesoriescost[playerid] = 255;
                }
            }
        }
//Паблик редактирования аксессуаров
public OnPlayerEditAttachedObject(playerid, response, index, modelid, boneid, Float:fOffsetX, Float:fOffsetY, Float:fOffsetZ, Float:fRotX, Float:fRotY, Float:fRotZ, Float:fScaleX, Float:fScaleY, Float:fScaleZ)
{
    if(response == EDIT_RESPONSE_FINAL)
    {
        if(GetPVarInt(playerid,"AccesoriesEdit") > 0)
        {
            if(PlayerInfo[playerid][pCash] < Accesoriescost[playerid]) return SendClientMessage(playerid, COLOR_GREY, "У вас не хватает денег!");
            mysql_format(ConnectDB, query, sizeof(query), "UPDATE "TABLE_ACCOUNT" SET Accesories1 = '%d, %d, %d, 6, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f' WHERE Nickname = '%s'", index, GetPVarInt(playerid,"ID"), boneid, fOffsetX, fOffsetY, fOffsetZ, fRotX, fRotY, fRotZ, fScaleX, fScaleY, fScaleZ,PlayerInfo[playerid][pNickname]);
            mysql_query(ConnectDB, query);
            SendClientMessage(playerid, COLOR_YELLOW, " Вы приобрели вещь! (Снять, выбросить или редактировать положение обьекта - /clothes)");
            GiveMoney(playerid, -Accesoriescost[playerid]);
            Accesoriescost[playerid] = 0;
        }
    }
    if(response == EDIT_RESPONSE_CANCEL)
    {
        DeletePVar(playerid,"AksID");
        DeletePVar(playerid,"AccesoriesEdit");
        RemovePlayerAttachedObject(playerid, 6);
    }
    return 1;
}
//Появление при спавне                          
if(PlayerInfo[playerid][pAccesories1] != EOS && PlayerInfo[playerid][pAccesoriess1Int][3] == 1) SetPlayerAttachedObject(playerid, PlayerInfo[playerid][pAccesoriess1Int][0], PlayerInfo[playerid][pAccesoriess1Int][1], PlayerInfo[playerid][pAccesoriess1Int][2], PlayerInfo[playerid][pAccesoriess1Float][0], PlayerInfo[playerid][pAccesoriess1Float][1], PlayerInfo[playerid][pAccesoriess1Float][2], PlayerInfo[playerid][pAccesoriess1Float][3], PlayerInfo[playerid][pAccesoriess1Float][4], PlayerInfo[playerid][pAccesoriess1Float][5], PlayerInfo[playerid][pAccesoriess1Float][6], PlayerInfo[playerid][pAccesoriess1Float][7], PlayerInfo[playerid][pAccesoriess1Float][8]);
if(PlayerInfo[playerid][pAccesories2] != EOS && PlayerInfo[playerid][pAccesoriess1Int][3] == 1) SetPlayerAttachedObject(playerid, PlayerInfo[playerid][pAccesoriess2Int][0], PlayerInfo[playerid][pAccesoriess2Int][1], PlayerInfo[playerid][pAccesoriess2Int][2], PlayerInfo[playerid][pAccesoriess2Float][0], PlayerInfo[playerid][pAccesoriess2Float][1], PlayerInfo[playerid][pAccesoriess2Float][2], PlayerInfo[playerid][pAccesoriess2Float][3], PlayerInfo[playerid][pAccesoriess2Float][4], PlayerInfo[playerid][pAccesoriess2Float][5], PlayerInfo[playerid][pAccesoriess2Float][6], PlayerInfo[playerid][pAccesoriess2Float][7], PlayerInfo[playerid][pAccesoriess2Float][8]);
if(PlayerInfo[playerid][pAccesories3] != EOS && PlayerInfo[playerid][pAccesoriess1Int][3] == 1) SetPlayerAttachedObject(playerid, PlayerInfo[playerid][pAccesoriess3Int][0], PlayerInfo[playerid][pAccesoriess3Int][1], PlayerInfo[playerid][pAccesoriess3Int][2], PlayerInfo[playerid][pAccesoriess3Float][0], PlayerInfo[playerid][pAccesoriess3Float][1], PlayerInfo[playerid][pAccesoriess3Float][2], PlayerInfo[playerid][pAccesoriess3Float][3], PlayerInfo[playerid][pAccesoriess3Float][4], PlayerInfo[playerid][pAccesoriess3Float][5], PlayerInfo[playerid][pAccesoriess3Float][6], PlayerInfo[playerid][pAccesoriess3Float][7], PlayerInfo[playerid][pAccesoriess3Float][8]);
if(PlayerInfo[playerid][pAccesories4] != EOS && PlayerInfo[playerid][pAccesoriess1Int][3] == 1) SetPlayerAttachedObject(playerid, PlayerInfo[playerid][pAccesoriess4Int][0], PlayerInfo[playerid][pAccesoriess4Int][1], PlayerInfo[playerid][pAccesoriess4Int][2], PlayerInfo[playerid][pAccesoriess4Float][0], PlayerInfo[playerid][pAccesoriess4Float][1], PlayerInfo[playerid][pAccesoriess4Float][2], PlayerInfo[playerid][pAccesoriess4Float][3], PlayerInfo[playerid][pAccesoriess4Float][4], PlayerInfo[playerid][pAccesoriess4Float][5], PlayerInfo[playerid][pAccesoriess4Float][6], PlayerInfo[playerid][pAccesoriess4Float][7], PlayerInfo[playerid][pAccesoriess4Float][8]);
PlayerInfo[playerid][pAccesoriess1Int][3//Это значение если что отвечает за то что появляется ли аксесуар на игроке при спавне или он выключен.

 

 

Поделиться сообщением


Ссылка на сообщение

3 ответа на этот вопрос

  • 0

UP

Поделиться сообщением


Ссылка на сообщение
  • 0

Создай таблицу именно для акссесуаров, легче будет

Поделиться сообщением


Ссылка на сообщение
  • 0
В 6/22/2024 в 18:33, Mason сказал:

'%d, %d, %d, 6, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f'

Ради всего святого, не храните так данные в MySQL. Пересматривайте архитектуру вашей базы данных таким образом, чтобы каждому из перечисленных спецификаторов соответствовал свой столбец в таблице базы данных.

 

В идеале создаете таблицу accessories, которая будет включать следующие поля:

  1. id (порядковый номер записи (первичный ключ, уникальное значение).
  2. accountid (ID аккаунта игрока, для которого предназначена текущая запись (первичный ключ).
  3. accessoryid (ID аксессуара).
  4. boneid (видимо, идентификатор части тела).
  5. fOffsetX.
  6. fOffsetY.
  7. fOffsetZ.
  8. fRotX.
  9. fRotY.
  10. fRotZ.
  11. fScaleX.
  12. fScaleY.
  13. fScaleZ.

Теперь для того, чтобы проверить, есть ли свободные слоты у игрока, вы просто подсчитываете количество строк, удовлетворяющих условию: "ID аккаунта эквивалентно идентификатору аккаунта рассматриваемого игрока"): если их больше-равно четырем, значит свободных слотов нет. Ну, и для отображения всех аксессуаров просто загружаете на основе того же условия все строки из базы данных. Такой подход способствует не только развитию правильной архитектуре в вашей базе данных, но и вносит некую гибкость: так, например, вы можете для некоторых игроков делать лимит по слотам больше (скажем, для игроков с VIP-статусом, будь они не ладны). Либо можете вовсе отказаться от лимитов - вас теперь не ограничивает ничего.

 

Для подсчета используйте возможности SQL-запросов - ни в коем случае не загружайте все-все записи, чтобы потом их посчитать на стороне сервера. Далее приведен пример.

"SELECT COUNT(id) FROM acessories WHERE accountid = %d", PlayerInfo[playerid][pAccountID]

 

Поправите все оговоренное выше убедитесь в работоспособности выдачи, сохранения и загрузки - рассмотрим следующую обозначенную вами проблему.

В 6/22/2024 в 18:33, Mason сказал:

когда я покупаю аксессуар, он остаётся на игроке, но после перезахода, проподает

 

upd. Пока писал это сообщение, пользователь @moffes вместил в одно предложение все то, о чем сказал и я. Здорово, когда мысли людей сходятся. И вам, автор, звоночек, что такое решение действительно правильнее и лучше по многим факторам.

Поделиться сообщением


Ссылка на сообщение

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!


Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.


Войти
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу