• 0
Sign in to follow this  
Followers 0

[закрыто] Система аксессуаров

Question

Всем привет, я сделал систему аксессуаров на своем сервере, но задаюсь вопросом, как сделать проверку на занятость слотов, у меня на сервере у игрока будет возможность иметь 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//Это значение если что отвечает за то что появляется ли аксесуар на игроке при спавне или он выключен.

 

 

Share this post


Link to post

3 answers to this question

  • 0

UP

Share this post


Link to post
  • 0

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

Share this post


Link to post
  • 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 вместил в одно предложение все то, о чем сказал и я. Здорово, когда мысли людей сходятся. И вам, автор, звоночек, что такое решение действительно правильнее и лучше по многим факторам.

Share this post


Link to post
This topic is now closed to further replies.
Sign in to follow this  
Followers 0
  • Recently Browsing   0 members

    No registered users viewing this page.