Перейти к содержанию
Авторизация  
RineGO

Система ATM с возможностью создания из игры.

Рекомендуемые сообщения

RineGO

Сегодня мы с вами напишем систему АТМ для сервера с возможностью создания из игры.
Система на MySQL!

Командный процессор DC_CMD!

[1] Ко всем define:

#define MAX_ATM     1000 // максимальное количество банкоматов.
#define dbank       4 // ID диалога АТМ. 

[2] Ко всем переменным new:

new TOTALATM = 1; // Всего АТМ
new BankObject; // объект АТМ

[3] Ко всем enum:

enum BDATA
{
    bID,
    Float:bX,
    Float:bY,
    Float:bZ,
    Float:bRX,
    Float:bRY,
    Float:bRZ
}
new bInfo[MAX_ATM][BDATA];

[4] Теперь ко всем командам добавим:

CMD:atm(playerid, params[])
{
    new Float:POS[3]; // Переменные для записи позиции персонажа!
    GetPlayerPos(playerid, POS[0], POS[1], POS[2]); // Узнаем позицию персонажа и записываем их в POS. 
    BankObject = CreateObject(2942,POS[0]+2, POS[1], POS[2],0,0,270); // Создаем объект АТМ.
    EditObject(playerid, BankObject); // Назначаем переменной BankObject функцию редактирования объекта.
    SetPVarInt(playerid, "bEDIT", 1); // Установим число 1 в переменную игрока.
    return true;
}

[5] Далее переходим в public OnPlayerEditObject (если его нет создайте):

    if(response == EDIT_RESPONSE_FINAL) // Если игрок нажал на иконку сохранить.
    {
        if(GetPVarInt(playerid, "bEDIT") == 1) // Проверяем переменную игрока на число 1.
	{
	    new query[200]; // Переменная для запроса.
	    mysql_format(mysql, query, sizeof(query), "INSERT INTO `ATM` (`bID`, `bX`, `bY`, `bZ`, `bRX`, `bRY`, `bRZ`) VALUES ('%d', '%f', '%f', '%f', '%f', '%f', '%f')", TOTALATM, fX, fY, fZ, fRotX, fRotY, fRotZ);
	    mysql_tquery(mysql, query, "", ""); // Запрос на БД.
	    bInfo[TOTALATM][bX] = fX; // Записываем позицию объекта(x) в переменную bX.
	    bInfo[TOTALATM][bY] = fY; // Записываем позицию объекта(y) в переменную bY.
	    bInfo[TOTALATM][bZ] = fZ; // Записываем позицию объекта(z) в переменную bZ.
	    TOTALATM++;
	    Create3DTextLabel("Банкомат\nНажмите {529b43}'Y'", -1, fX, fY, fZ, 10.0, 0, 1); // Создаем 3D текст у банкомата
	    SendClientMessage(playerid, -1, "Банкомат успешно создан!"); // Если все прошло успешно выводим текст.
        }
    }
    if(response == EDIT_RESPONSE_CANCEL) // Если игрок нажал на ESC
    {
        if(GetPVarInt(playerid, "bEDIT") == 1) // Проверяем переменную игрока на число 1.
        {
	    DestroyObject(BankObject); // Удаляем АТМ.
	    SendClientMessage(playerid, -1, "Банкомат удален!"); // Если все прошло успешно выводим текст.
	    DeletePVar(playerid, "bEDIT"); // Обнуляем переменную игрока.
	}
    }

[6] В конец мода или там где у вас находится загрузка данных:

stock LoadAtm() return mysql_function_query(mysql, "SELECT * FROM `ATM` ORDER BY  `ATM`.`bID` ASC ", false, "OnAccountBank",""); // stock для загрузки ATM.
forward OnAccountBank(playerid);
public OnAccountBank(playerid)
{
    new rows, fields;// Создаем переменные для выгрузки кол-во строк-граф
    cache_get_data(rows, fields);// Выгружаем примечание не выгружает если выключено кзширование
    new i = 0;// Переменная для хранения временного
    new temp[128];
    if(rows)// Проверка есть ли строчки в таблице.
    { 
        for(new idx = 1; idx <= rows; idx++)
        {
            cache_get_row(i, 0, temp), bInfo[idx][bID] = strval(temp); // Загружаем 1 строчку БД.
            cache_get_row(i, 1, temp), bInfo[idx][bX] = floatstr(temp); // Загружаем 2 строчку БД.
            cache_get_row(i, 2, temp), bInfo[idx][bY] = floatstr(temp); // Загружаем 3 строчку БД.
            cache_get_row(i, 3, temp), bInfo[idx][bZ] = floatstr(temp); // Загружаем 4 строчку БД.
            cache_get_row(i, 4, temp), bInfo[idx][bRX] = floatstr(temp); // Загружаем 5 строчку БД.
            cache_get_row(i, 5, temp), bInfo[idx][bRY] = floatstr(temp); // Загружаем 6 строчку БД.
            cache_get_row(i, 6, temp), bInfo[idx][bRZ] = floatstr(temp); // Загружаем 7 строчку БД.
            TOTALATM++, i++;
            CreateObject(2942, bInfo[idx][bX], bInfo[idx][bY], bInfo[idx][bZ], bInfo[idx][bRX], bInfo[idx][bRY], bInfo[idx][bRZ]); // Создаем АТМ.
            Create3DTextLabel("Банкомат\nНажмите {529b43}'Y'", -1, bInfo[idx][bX], bInfo[idx][bY], bInfo[idx][bZ], 10.0, 0, 1); // Создаем 3D текст.
        }
    }
    return printf("[Система АТМ]: Было загружено - %d", TOTALATM); // Показываем сколько банкоматов было загружено.
}

[7] Теперь public OnGameModeInit():

LoadAtm();

И так с созданием АТМ и его загрузкой мы закончили. Теперь собственно сделаем чтобы банкомат работал:)

[1] В public OnPlayerKeyStateChange:

if(newkeys == KEY_YES) // если игрок нажал на Y
{
    for(new b = 1; b <= TOTALATM; b++)
    {
        if(IsPlayerInRangeOfPoint(playerid, 1.0, bInfo[b][bX], bInfo[b][bY], bInfo[b][bZ])) // Проверяем стоит ли игрок рядом с банкоматом. Если да то выводим диалог ниже :)
        {
            ShowPlayerDialog(playerid, dbank, DIALOG_STYLE_LIST, "{FFFFFF}Банкомат", "{529b43}[1] {ffffff}Баланс\n{529b43}[2] {ffffff}Снять наличные\n{529b43}[3] {ffffff}Внести наличные", "Войти", "Выйти");
        }
    }
    return true;
}

[2] В public OnDialogResponse:

    switch(dialogid)
    {
        case dbank:
        {
            if(!response) return true; // Игрок нажал на вторую кнопку!
            switch(listitem)
            {
                case 0: // Игрок выбрал первый пункт!
                {
		    new string[50]; // Переменная которая хранит длину текста!
		    format(string,sizeof(string),"{FFFFFF}Баланс: {529b43}%d {FFFFFF}р.", pInfo[playerid][BankAccount]);
		    SendClientMessage(playerid, -1, string);
		    ShowPlayerDialog(playerid, dbank, DIALOG_STYLE_LIST, "{FFFFFF}Банкомат", "{529b43}[1] {ffffff}Баланс\n{529b43}[2] {ffffff}Снять наличные\n{529b43}[3] {ffffff}Внести наличные", "Далее", "Выйти");
		}
		case 1: // Игрок выбрал второй пункт!
		{
		    ShowPlayerDialog(playerid, dbank+1, DIALOG_STYLE_INPUT, "{FFFFFF}Банкомат{529b43} [Снять наличные]", "{ffffff}Введите сумму которую хотите снять:", "Снять", "Выйти");
		}
		case 2: // Игрок выбрал третий пункт!
		{
		    ShowPlayerDialog(playerid, dbank+2, DIALOG_STYLE_INPUT, "{FFFFFF}Банкомат{529b43} [Внести наличные]", "{ffffff}Введите сумму которую хотите внести:", "Внести", "Выйти");
		}
            }
        }
        case dbank+1:
        {
	    if(!response) return ShowPlayerDialog(playerid, dbank, DIALOG_STYLE_LIST, "{FFFFFF}Банкомат", "{529b43}[1] {ffffff}Баланс\n{529b43}[2] {ffffff}Снять наличные\n{529b43}[3] {ffffff}Внести наличные", "Далее", "Выйти");
            if(strval(inputtext) > pInfo[playerid][BankAccount]) // Проверяем хватает ли денег в банке. Если нет выводим диалог и текст!
            {
                ShowPlayerDialog(playerid, dbank+1, DIALOG_STYLE_INPUT, "{FFFFFF}Банкомат{529b43} [Снять наличные]", "{ffffff}Введите сумму которую хотите снять:", "Снять", "Выйти");
                return SendClientMessage(playerid, -1, "Недостаточно средств!");
            }
            pInfo[playerid][BankAccount] -= strval(inputtext);
            pInfo[playerid][Money] += strval(inputtext);
            GivePlayerMoney(playerid, strval(inputtext));
        }
        case dbank+2:
        {
	    if(!response) return ShowPlayerDialog(playerid, dbank, DIALOG_STYLE_LIST, "{FFFFFF}Банкомат", "{529b43}[1] {ffffff}Баланс\n{529b43}[2] {ffffff}Снять наличные\n{529b43}[3] {ffffff}Внести наличные", "Далее", "Выйти");
            if(strval(inputtext) > pInfo[playerid][Money]) // проверяем хватает ли денег у игрока. Если нет то выводим диалог и текст!
            {
                ShowPlayerDialog(playerid, dbank+2, DIALOG_STYLE_INPUT, "{FFFFFF}Банкомат{529b43} [Внести наличные]", "{ffffff}Введите сумму которую хотите внести:", "Внести", "Выйти");
                return SendClientMessage(playerid, -1, "Недостаточно средств!");
            }
            pInfo[playerid][BankAccount] += strval(inputtext);
            GivePlayerMoney(playerid, -strval(inputtext));
        }
}  

Теперь нам нужно создать БД для АТМ. Создаем таблицу и называем ее ATM и далее делаем как на фото:[spoiler=фото]qaYgBuFF7es.jpg




Ну вот и все, система АТМ готова. Обзор https://youtu.be/QRxkcy1aw18
Прикрепил PWN :)

P.S: pInfo[playerid][bankAccount], pInfo[playerid][Money] и запрос mysql нужно заменить на свое чтобы не было ошибок!

ATM.pwn

Изменено пользователем RineGO
  • Like 1

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


Ссылка на сообщение
Поделиться на другие сайты
noname_idk

Хорошая работа, только один косяк заметил:

stock LoadAtm() return mysql_function_query(mysql, "SELECT * FROM `ATM` ORDER BY  `ATM`.`bID` ASC ", false, "OnAccountBank",""); // stock для загрузки ATM.

Ты вызываешь функцию OnAccountBank, в которую не передаешь никаких аргументов, а в ее объявлении появляется аргумент playerid, который даже не используется:

forward OnAccountBank(playerid);
public OnAccountBank(playerid)

Ну, и так, на будущее:

1. Не используй массивы там, где не нужно (я говорю про получение позиции игрока и запись их в массив в команде atm).

2. Зачем в коде диалога несколько раз писать strval(inputtext)? Сделай один раз извлечение числа из строки, запиши в отдельную переменную и в будущем обращайся к ней:

new variable;
variable = strval(inputtext);

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


Ссылка на сообщение
Поделиться на другие сайты
RineGO

, Учту :D83DDE0A:

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


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Войти

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

Войти
Авторизация  

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

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

×

Важная информация

Мы разместили cookie-файлы на ваше устройство, чтобы помочь сделать этот сайт лучше. Вы можете изменить свои настройки cookie-файлов, или продолжить без изменения настроек.