Portal SAMP
[Ajuda] dialog - Versão de Impressão

+- Portal SAMP (https://portalsamp.com)
+-- Fórum: SA-MP (https://portalsamp.com/forumdisplay.php?fid=5)
+--- Fórum: Área de suporte (https://portalsamp.com/forumdisplay.php?fid=6)
+--- Tópico: [Ajuda] dialog (/showthread.php?tid=4908)



dialog - reset157 - 30/10/2024

boa noite, estou precisando de ajuda em um sistema de avisar guerra, a ajuda que eu necessito é na parte da dialog, eu preciso que a dialog chega para apenas dois frentes da favela selecionada, e quando a  dialog chegar para os frentes os dois deveram aceitar a proposta da guerra para a guerra começar, caso um dos frentes aceite e o outro não, a guerra não começara, e aparecer uma mensagem de tipo, 'o frente s% aceitou a proposta (1/2) "ai devera aparecer isso (1/2), e quando o outro frente aceitar ela ficar (2/2), a guerra começara quando os dois frentes aceitar, agora caso ele não aceite a proposta de guerra ira expirar!

o código estará abaixo:

Código:
public Start_Guerra(playerid, fid)
{
    for(new f = 1; f < MAX_FACCOES; f++)
    {
        for(new i = 0; i < MAX_PLAYERS; i++)
        {
            if(PlayerInfo[i][pFrente] == f && PlayerInfo[i][pFavela] == fid)
            {
                new String[128];

                GuerraInfo[fid][gTipo] = 1;
                GuerraInfo[fid][gAtaque] = PlayerInfo[playerid][pFavela];
                GuerraInfo[fid][gDefende] = fid;
                GuerraInfo[fid][gTempo] = 0;
                GuerraInfo[fid][gDominada] = false;
                GuerraInfo[fid][gTempoCifrao] = 0;
                GuerraInfo[fid][gCifraoLiberado] = false;
                GuerraInfo[fid][gPegouCifrao] = false;

                SetPVarInt(playerid, "namewar", i);

                format(String, sizeof(String), "[Guerra] %s fez uma proposta de guerra para comunidade '%s'!", Nome(playerid), FaccaoInfo[fid][fNome]);
                SendClientMessageToAllEx(COLOR_WHITE, String);

                format(String, sizeof(String), "%s fez uma proposta de guerra contra a sua comunidade\n", Nome(playerid));
                ShowPlayerDialog(i, DIALOG_ACTGUERRA, DIALOG_STYLE_MSGBOX, "{FFFFFF}Convite Guerra", String, "Aceitar", "Recusar");
                break;
            }
        }
    }
    return true;
}

case DIALOG_ACTGUERRA:
{
    if(response)
    {
        new i = GetPVarInt(i, "namewar"), fid = PlayerInfo[i][pFavela];

        if(GuerraInfo[fid][gAtaque] != -1)
        {
            GuerraInfo[fid][gAcontecendo] = true;

            SendFormattedMessageToAll(COLOR_WHITE, "[Guerra] '%s' iniciou uma guerra contra a comunidade '%s'!", FaccaoInfo[GuerraInfo[fid][gAtaque]][fNome], FaccaoInfo[GuerraInfo[fid][gDefende]][fNome]);
            SendFormattedMessage(i, COLOR_LIGHTYELLOW, "[PROPOSTA] %s aceitou a guerra.", Nome(playerid));
            SendClientMessage(i, COLOR_ORANGE, "[PROPOSTA] Voce aceitou a guerra.");
        }
    }
}



RE: dialog - BitSain - 30/10/2024

Código:
new bool:gAceitar[2];
new gAceitarCount = 0;

public Start_Guerra(playerid, fid) {
    gAceitar[0] = false;
    gAceitar[1] = false;

    new f1 = PlayerInfo[playerid][pFrente];

    for (new i = 0; i < MAX_PLAYERS; i++) {
        if (PlayerInfo[i][pFrente] != f1 || PlayerInfo[i][pFavela] != fid) continue;

        new String[128];
        GuerraInfo[fid][gTipo] = 1;
        GuerraInfo[fid][gAtaque] = PlayerInfo[playerid][pFavela];
        GuerraInfo[fid][gDefende] = fid;
        GuerraInfo[fid][gTempo] = 0;
        GuerraInfo[fid][gDominada] = false;
        GuerraInfo[fid][gTempoCifrao] = 0;
        GuerraInfo[fid][gCifraoLiberado] = false;
        GuerraInfo[fid][gPegouCifrao] = false;

        SetPVarInt(playerid, "namewar", i);
        
        format(String, sizeof(String), "[Guerra] %s fez uma proposta de guerra para comunidade '%s'!", Nome(playerid), FaccaoInfo[fid][fNome]);
        SendClientMessageToAllEx(COLOR_WHITE, String);
        
        format(String, sizeof(String), "%s fez uma proposta de guerra contra a sua comunidade\n", Nome(playerid));
        ShowPlayerDialog(i, DIALOG_ACTGUERRA, DIALOG_STYLE_MSGBOX, "{FFFFFF}Convite Guerra", String, "Aceitar", "Recusar");
    }

    return true;
}

case DIALOG_ACTGUERRA: {
    new i = GetPVarInt(playerid, "namewar");
    new fid = PlayerInfo[i][pFavela];

    if (response) {
        if (!gAceitar[0]) {
            gAceitar[0] = true;
            gAceitarCount++;
            SendFormattedMessageToAll(COLOR_WHITE, "[Guerra] '%s' aceitou a proposta de guerra (1/2).", Nome(playerid));
        } else if (!gAceitar[1]) {
            gAceitar[1] = true;
            gAceitarCount++;
            SendFormattedMessageToAll(COLOR_WHITE, "[Guerra] '%s' aceitou a proposta de guerra (2/2).", Nome(playerid));
            GuerraInfo[fid][gAcontecendo] = true;
            SendFormattedMessageToAll(COLOR_WHITE, "[Guerra] '%s' iniciou uma guerra contra a comunidade '%s'!",
                FaccaoInfo[GuerraInfo[fid][gAtaque]][fNome],
                FaccaoInfo[GuerraInfo[fid][gDefende]][fNome]);
        }
    } else {
        SendClientMessage(i, COLOR_ORANGE, "[PROPOSTA] Você recusou a guerra.");
    }

    if (gAceitarCount == 2) {
        // Guerra aceita por ambas as partes, já tratado anteriormente
    } else if (gAceitar[0] || gAceitar[1]) {
        SendClientMessageToAll(COLOR_RED, "[Guerra] Proposta de guerra não aceita por ambas as partes.");
    }
}

Interprete o código, foi melhorado.
Além de adaptar por suas necessidades, troque seus loops de MAX_PLAYERS por um foreach. Não há necessidade de rodar algo 1000 vezes, ao invés de iterar sobre os jogadores conectados.