Форум Pawn.Wiki - Воплоти мечту в реальность!: Диалоговое окно подтверждения - Форум Pawn.Wiki - Воплоти мечту в реальность!

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

[ Pawn ]
Диалоговое окно подтверждения

#1
Пользователь офлайн   WilyaManaliev 

  • Новичок
  • Вставить ник
  • Раскрыть информацию
Доброго времени суток! Помогите пожалуйста, добавить такое диалоговое окно:
Изображение

CMD:offmute(playerid, params[])
{
	if(GetPlayerAdminEx(playerid) < 3) return 1;
	if(GetPlayerData(playerid, P_ADMIN_LOGGED) == 0) return 1;

	if(!strlen(params)) return SendClientMessage(playerid, 0xCECECEFF, "{FFA500}• Используйте: {FFFFFF}/offmute [ник игрока] [время] [причина]");

	extract params -> new string: player_name[30], mute_time, string: reason[30];

	if(!(1 <= mute_time <= 500)) return SendClientMessage(playerid, 0xCECECEFF, "{FF0000}* {FFFFFF}Время должно быть не меньше 1 и не больше 500 минут.");

	if(IsPlayerConnected(GetPlayerID(player_name))) return SendClientMessage(playerid, 0x999999FF, "{FF0000}* {FFFFFF}Игрок с таким именем находится на сервере.");

	new query[144],
		Cache: result,
		rows,
		uid,
		admin,
		mute;

	mysql_format(mysql, query, sizeof query, "SELECT id, admin, mute FROM accounts WHERE name='%s'", player_name);
	result = mysql_query(mysql, query, true);

	rows = cache_num_rows();

	if(rows)
	{
		uid = cache_get_row_int(0, 0);
		admin = cache_get_row_int(0, 1);
		mute = cache_get_row_int(0, 2);
	}

	cache_delete(result);

	if(!rows || !uid) return SendClientMessage(playerid, 0x999999FF, "{FF0000}* {FFFFFF}Игрок с таким именем не найден.");

	if(GetPlayerAdminEx(playerid) < admin) return SendClientMessage(playerid, 0x999999FF, "{FF0000}* {FFFFFF}Нельзя выдать мут администратору старше..");

	mysql_format(mysql, query, sizeof query, "SELECT * FROM accounts WHERE id='%d'", uid);
	result = mysql_query(mysql, query, true);

	rows = cache_num_rows();

	cache_delete(result);

	if(!rows) return SendClientMessage(playerid, 0x999999FF, "{FF0000}* {FFFFFF}Аккаунт не найден.");
	if(mute > 0) return SendClientMessage(playerid, 0x999999FF, "{FF0000}* {FFFFFF}Игрок уже имеет мут.");
	format(query, sizeof query, "{8B0000}[М] Администратор %s выдал мут оффлайн игроку %s на %d минут.", GetPlayerNameEx(playerid), player_name, mute_time);

	SendClientMessageToAll(0xFF99AADD, query);
	
	AddPlayerData(playerid, P_ASTATSMUTE, +, 1);
    UpdatePlayerDatabaseInt(playerid, "astats mute",
    GetPlayerData(playerid, P_ASTATSMUTE));
    SavePlayerAccount(playerid);

	format(query, sizeof query, "%s[%d] выдал оффлайн мут игроку %s[%d] на %d мин.", GetPlayerNameEx(playerid), GetPlayerAccountID(playerid), player_name, uid, mute_time);
	SendLog(playerid, LOG_TYPE_ADMIN_ACTION, query);
	
	mysql_format(mysql, query, sizeof query, "UPDATE accounts SET mute='%d' WHERE id='%d'", mute_time * 60, uid);
	mysql_query(mysql, query, false);

	return 1;
}

0

#2
Пользователь офлайн   Kuara 

  • Пользователь
  • Вставить ник
  • Раскрыть информацию
Попробуй так

CMD:offmute(playerid, params[])
{
    if(GetPlayerAdminEx(playerid) < 3) return 1;
    if(GetPlayerData(playerid, P_ADMIN_LOGGED) == 0) return 1;

    if(!strlen(params)) return SendClientMessage(playerid, 0xCECECEFF, "{FFA500}• Используйте: {FFFFFF}/offmute [ник игрока] [время] [причина]");

    extract params -> new string: player_name[30], mute_time, string: reason[30];

    if(!(1 <= mute_time <= 500)) return SendClientMessage(playerid, 0xCECECEFF, "{FF0000}* {FFFFFF}Время должно быть не меньше 1 и не больше 500 минут.");

    if(IsPlayerConnected(GetPlayerID(player_name))) return SendClientMessage(playerid, 0x999999FF, "{FF0000}* {FFFFFF}Игрок с таким именем находится на сервере.");

    new query[144],
        Cache: result,
        rows,
        uid,
        admin,
        mute;

    mysql_format(mysql, query, sizeof query, "SELECT id, admin, mute FROM accounts WHERE name='%s'", player_name);
    result = mysql_query(mysql, query, true);

    rows = cache_num_rows();

    if(rows)
    {
        uid = cache_get_row_int(0, 0);
        admin = cache_get_row_int(0, 1);
        mute = cache_get_row_int(0, 2);
    }

    cache_delete(result);

    if(!rows || !uid) return SendClientMessage(playerid, 0x999999FF, "{FF0000}* {FFFFFF}Игрок с таким именем не найден.");

    if(GetPlayerAdminEx(playerid) < admin) return SendClientMessage(playerid, 0x999999FF, "{FF0000}* {FFFFFF}Нельзя выдать мут администратору старше.");

    mysql_format(mysql, query, sizeof query, "SELECT * FROM accounts WHERE id='%d'", uid);
    result = mysql_query(mysql, query, true);

    rows = cache_num_rows();

    cache_delete(result);

    if(!rows) return SendClientMessage(playerid, 0x999999FF, "{FF0000}* {FFFFFF}Аккаунт не найден.");
    if(mute > 0) return SendClientMessage(playerid, 0x999999FF, "{FF0000}* {FFFFFF}Игрок уже имеет мут.");

 
    new dialogInfo[3];
    dialogInfo[0] = playerid; // ID администратора
    dialogInfo[1] = uid; // ID аккаунта игрока
    dialogInfo[2] = mute_time; // Время мута

   
    new dialogText[256];
    format(dialogText, sizeof(dialogText), "Вы уверены, что хотите выдать мут игроку?\n\nИмя игрока: %s\nID аккаунта: %d\nСрок мута: %d минут", player_name, uid, mute_time);

    
    ShowPlayerDialog(playerid, DIALOG_OFFMUTE_CONFIRM, DIALOG_STYLE_MSGBOX, "Подтверждение выдачи мута", dialogText, "Подтвердить", "Отмена");

    
    SetPVarInt(playerid, "OffMute_PlayerID", uid);
    SetPVarInt(playerid, "OffMute_Time", mute_time);
    SetPVarString(playerid, "OffMute_PlayerName", player_name);

    return 1;
}


public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    if(dialogid == DIALOG_OFFMUTE_CONFIRM)
    {
        if(response) // Если нажата кнопка "Подтвердить"
        {
            new uid = GetPVarInt(playerid, "OffMute_PlayerID");
            new mute_time = GetPVarInt(playerid, "OffMute_Time");
            new player_name[30];
            GetPVarString(playerid, "OffMute_PlayerName", player_name, sizeof(player_name));

            
            new query[256];
            mysql_format(mysql, query, sizeof query, "UPDATE accounts SET mute='%d' WHERE id='%d'", mute_time * 60, uid);
            mysql_query(mysql, query, false);

         
            format(query, sizeof query), "{8B0000}[М] Администратор %s выдал мут оффлайн игроку %s на %d минут.", GetPlayerNameEx(playerid), player_name, mute_time);
            SendClientMessageToAll(0xFF99AADD, query);

            format(query, sizeof query), "%s[%d] выдал оффлайн мут игроку %s[%d] на %d мин.", GetPlayerNameEx(playerid), GetPlayerAccountID(playerid), player_name, uid, mute_time);
            SendLog(playerid, LOG_TYPE_ADMIN_ACTION, query);

            
            AddPlayerData(playerid, P_ASTATSMUTE, +, 1);
            UpdatePlayerDatabaseInt(playerid, "astats mute", GetPlayerData(playerid, P_ASTATSMUTE));
            SavePlayerAccount(playerid);
        }
        else
        {
            SendClientMessage(playerid, 0xCECECEFF, "{FF0000}* {FFFFFF}Выдача мута отменена.");
        }

        /
        DeletePVar(playerid, "OffMute_PlayerID");
        DeletePVar(playerid, "OffMute_Time");
        DeletePVar(playerid, "OffMute_PlayerName");
    }
    return 1;
}

0

#3
Пользователь офлайн   WilyaManaliev 

  • Новичок
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияKuara (13 марта 2025 - 08:35) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]

ByteCROWNnew.pwn(71502) : error 017: undefined symbol "DIALOG_OFFMUTE_CONFIRM"
ByteCROWNnew.pwn(71514) : error 021: symbol already defined: "ac_OnDialogResponse"
ByteCROWNnew.pwn(71515) : error 017: undefined symbol "DIALOG_OFFMUTE_CONFIRM"
ByteCROWNnew.pwn(71530) : error 001: expected token: ";", but found ")"
ByteCROWNnew.pwn(71530) : error 029: invalid expression, assumed zero
ByteCROWNnew.pwn(71533) : error 001: expected token: ";", but found ")"
ByteCROWNnew.pwn(71533) : error 029: invalid expression, assumed zero
ByteCROWNnew.pwn(71546) : error 029: invalid expression, assumed zero
0

#4
Пользователь офлайн   Kuara 

  • Пользователь
  • Вставить ник
  • Раскрыть информацию
Так у тебя уже есть public OnDialogResponse ты в него должен вставить это, вместо этого ты ещё раз создаешь этот коллбэк

найди public OnDialogResponse и вставь в него
if(dialogid == DIALOG_OFFMUTE_CONFIRM)
    {
        if(response) // Если нажата кнопка "Подтвердить"
        {
            new uid = GetPVarInt(playerid, "OffMute_PlayerID");
            new mute_time = GetPVarInt(playerid, "OffMute_Time");
            new player_name[30];
            GetPVarString(playerid, "OffMute_PlayerName", player_name, sizeof(player_name));

            
            new query[256];
            mysql_format(mysql, query, sizeof query, "UPDATE accounts SET mute='%d' WHERE id='%d'", mute_time * 60, uid);
            mysql_query(mysql, query, false);

         
            format(query, sizeof query), "{8B0000}[М] Администратор %s выдал мут оффлайн игроку %s на %d минут.", GetPlayerNameEx(playerid), player_name, mute_time);
            SendClientMessageToAll(0xFF99AADD, query);

            format(query, sizeof query), "%s[%d] выдал оффлайн мут игроку %s[%d] на %d мин.", GetPlayerNameEx(playerid), GetPlayerAccountID(playerid), player_name, uid, mute_time);
            SendLog(playerid, LOG_TYPE_ADMIN_ACTION, query);

            
            AddPlayerData(playerid, P_ASTATSMUTE, +, 1);
            UpdatePlayerDatabaseInt(playerid, "astats mute", GetPlayerData(playerid, P_ASTATSMUTE));
            SavePlayerAccount(playerid);
        }
        else
        {
            SendClientMessage(playerid, 0xCECECEFF, "{FF0000}* {FFFFFF}Выдача мута отменена.");
        }

        /
        DeletePVar(playerid, "OffMute_PlayerID");
        DeletePVar(playerid, "OffMute_Time");
        DeletePVar(playerid, "OffMute_PlayerName");
    }

0

#5
Пользователь офлайн   WilyaManaliev 

  • Новичок
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияKuara (13 марта 2025 - 15:40) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]

../gamemodes/modules/core/admin/dialogs.pwn(116) : error 048: array dimensions do not match
ByteCROWNnew.pwn(8052) : error 035: argument type mismatch (argument 2)
ByteCROWNnew.pwn(8055) : error 035: argument type mismatch (argument 2)
ByteCROWNnew.pwn(8259) : error 035: argument type mismatch (argument 1)
ByteCROWNnew.pwn(8265) : error 035: argument type mismatch (argument 1)
ByteCROWNnew.pwn(8271) : error 035: argument type mismatch (argument 1)
ByteCROWNnew.pwn(8299) : error 048: array dimensions do not match
ByteCROWNnew.pwn(8302) : error 048: array dimensions do not match
ByteCROWNnew.pwn(8535) : error 035: argument type mismatch (argument 1)
ByteCROWNnew.pwn(8540) : error 035: argument type mismatch (argument 1)
ByteCROWNnew.pwn(8546) : error 035: argument type mismatch (argument 1)
ByteCROWNnew.pwn(8559) : error 048: array dimensions do not match
ByteCROWNnew.pwn(8585) : error 048: array dimensions do not match
ByteCROWNnew.pwn(8588) : error 048: array dimensions do not match
ByteCROWNnew.pwn(8595) : error 048: array dimensions do not match
ByteCROWNnew.pwn(8598) : error 048: array dimensions do not match
ByteCROWNnew.pwn(8601) : error 048: array dimensions do not match
ByteCROWNnew.pwn(8645) : error 035: argument type mismatch (argument 1)
ByteCROWNnew.pwn(8684) : error 035: argument type mismatch (argument 1)
ByteCROWNnew.pwn(8899) : error 035: argument type mismatch (argument 1)
ByteCROWNnew.pwn(9746) : error 048: array dimensions do not match
ByteCROWNnew.pwn(9754) : error 048: array dimensions do not match
ByteCROWNnew.pwn(9757) : error 048: array dimensions do not match
ByteCROWNnew.pwn(9778) : error 048: array dimensions do not match
ByteCROWNnew.pwn(9786) : error 048: array dimensions do not match
ByteCROWNnew.pwn(9789) : error 048: array dimensions do not match


Можем в ТГ?
0

#6
Пользователь офлайн   Kuara 

  • Пользователь
  • Вставить ник
  • Раскрыть информацию
Скинь весь OnDialogResponse
0

#7
Пользователь офлайн   WilyaManaliev 

  • Новичок
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияKuara (13 марта 2025 - 19:54) писал:

Скинь весь OnDialogResponse

Там ооооооочень много, все не смогу, го в тг?
0

#8
Пользователь офлайн   Coquette 

  • Местный
  • Вставить ник
  • Раскрыть информацию
Приветствую. Вот сделал тебе код:
CMD:offmute(playerid, params[])
{
    if(GetPlayerAdminEx(playerid) < 3) return 1;
    if(GetPlayerData(playerid, P_ADMIN_LOGGED) == 0) return 1;

    if(!strlen(params)) return SendClientMessage(playerid, 0xCECECEFF, "{FFA500}• Используйте: {FFFFFF}/offmute [ник игрока] [время] [причина]");

    extract params -> new string: player_name[30], mute_time;

    if(!(1 <= mute_time <= 500)) return SendClientMessage(playerid, 0xCECECEFF, "{FF0000}* {FFFFFF}Время должно быть не меньше 1 и не больше 500 минут.");

    if(IsPlayerConnected(GetPlayerID(player_name))) return SendClientMessage(playerid, 0x999999FF, "{FF0000}* {FFFFFF}Игрок с таким именем находится на сервере.");

    SetPVarString(playerid, "offmute_name", player_name);
    SetPVarInt(playerid, "offmute_min", mute_time);

    new query[144],
            Cache: result,
            rows,
            uid,
            admin,
            mute;

    mysql_format(mysql, query, sizeof query, "SELECT id, admin, mute FROM accounts WHERE name='%s' LIMIT 1", player_name);
    mysql_tquery(mysql, query, "FindPlayerForMute", "i", playerid);

    return 1;
}

forward FindPlayerForMute(playerid);
public FindPlayerForMute(playerid) {
    new rows;
    cache_get_row_count(rows);
    if(!rows) {
        DeletePVar(playerid, "offmute_name");
        DeletePVar(playerid, "offmute_min");
        return SendClientMessage(playerid, 0x999999FF, "{FF0000}* {FFFFFF}Игрок с таким ником не найден.");
    }

    new uuid, player_name[MAX_PLAYER_NAME], mute_time, currmute, admin;
    cache_get_value_name_int(0, "id", uuid);
    cache_get_value_name_int(0, "mute", currmute);
    cache_get_value_name_int(0, "admin", admin);

    if(GetPlayerAdminEx(playerid) < admin) {
        DeletePVar(playerid, "offmute_name");
        DeletePVar(playerid, "offmute_min");       
        return SendClientMessage(playerid, 0x999999FF, "{FF0000}* {FFFFFF}Нельзя выдать мут администратору старше..");
    }

    if(currmute > 0) {
        DeletePVar(playerid, "offmute_name");
        DeletePVar(playerid, "offmute_min");
        return SendClientMessage(playerid, 0x999999FF, "{FF0000}* {FFFFFF}Игрок уже имеет мут.");
    }

    SetPVarInt(playerid, "offmute_uuid", uuid);
    GetPVarString(playerid, "offmute_name", player_name, MAX_PLAYER_NAME);
    mute_time = GetPVarInt(playerid, "offmute_min");

    static const dlg_fmt[] = "{FFFFFF}Вы действительно желаете {FFFF00}Выдать блокировку чата{FFFFFF}?\n\n\
    Ник: {64F164}%s\n{FFFFFF}Номер аккаунта: {FFFF00}%d\n\n{FFFFFF}Сроком на: {64F164}%d минут";
    new dlg[sizeof dlg_fmt + (-6) + MAX_PLAYER_NAME + 11 + 3];
    format(dlg, sizeof dlg, dlg_fmt, player_name, uuid, mute_time);

    ShowPlayerDialog(playerid, 111, DIALOG_STYLE_MSGBOX, "{FFFFFF}Подтверждение", dlg, "Да", "Нет");
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) {
    switch(dialogid) {
        case 111: {
            if(!response) {
                DeletePVar(playerid, "offmute_name");
                DeletePVar(playerid, "offmute_min");
                DeletePVar(playerid, "offmute_uuid");
                return 1;
            }
            new query[69 + (-6) + MAX_PLAYER_NAME * 2 + 3 + 1], player_name[MAX_PLAYER_NAME], mute_time, uuid;

            GetPVarString(playerid, "offmute_name", player_name, MAX_PLAYER_NAME);
            mute_time = GetPVarInt(playerid, "offmute_min");
            uuid = GetPVarInt(playerid, "offmute_uuid");

            format(query, sizeof query, "{8B0000}[М] Администратор %s выдал мут оффлайн игроку %s на %d минут.", GetPlayerNameEx(playerid), player_name, mute_time);
            SendClientMessageToAll(0xFF99AADD, query);
        
            AddPlayerData(playerid, P_ASTATSMUTE, +, 1);
            UpdatePlayerDatabaseInt(playerid, "astats mute",
            GetPlayerData(playerid, P_ASTATSMUTE));
            SavePlayerAccount(playerid);

            format(query, sizeof query, "%s[%d] выдал оффлайн мут игроку %s[%d] на %d мин.", GetPlayerNameEx(playerid), GetPlayerAccountID(playerid), player_name, uuid, mute_time);
            SendLog(playerid, LOG_TYPE_ADMIN_ACTION, query);
            
            mysql_format(mysql, query, sizeof query, "UPDATE accounts SET mute='%d' WHERE id='%d' LIMIT 1", mute_time * 60, uuid);
            mysql_tquery(mysql, query, "", "");
        }
    }

    return 1;
}


Я в OnDialogResponse использовал структуру switch...case, если у тебя через if(dialogid) то вот OnDialogResponse под if:

Скрытый текст [Показать]


Не советую использовать mysql_query, т.к. пока он ожидает ответа от бд - сервер /встаёт/, из-за чего могут быть заметные провисания у игроков.
Так-же советую использовать LIMIT 1 в запросах, если знаешь что у тебя может быть только максимум 1 запись. Т.к. запрос SELECT и UPDATE будет искать все возможные варианты, а т.к. у тебя может быть только один аккаунт с одним никнеймом - нет смысла делать лишний поиск по базе.

Сообщение отредактировал Coquette: 13 марта 2025 - 20:09

0

#9
Пользователь офлайн   WilyaManaliev 

  • Новичок
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияCoquette (13 марта 2025 - 20:07) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]

Пошли в тг?
0

#10
Пользователь офлайн   Coquette 

  • Местный
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияWilyaManaliev (13 марта 2025 - 20:08) писал:

Пошли в тг?

@clownaga
У меня в профиле указан ТГ
1

Поделиться темой:


Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей


Яндекс.Метрика