Portal SAMP
[Ajuda] Strcmp - 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] Strcmp (/showthread.php?tid=1199)



Strcmp - virtuS_ - 18/05/2021

Alguém sabe por quê não funciona?

Código:
public OnPlayerCommandReceived(playerid, cmd[], params[], flags)
{
        if(APlayerData[playerid][PlayerAfk] == true)
    {
        if(strcmp(cmd, "/sairafk"))
        {
            SendClientMessage(playerid, -1, "{FF0000}* Você não pode usar comandos estando ausente.");
            return 0;
        }
    }

    return 1;
}
O objetivo é comparar se o jogador está utilizando o comando "/sairafk", pois ele seria o único comando liberado quando o jogador estiver afk(PlayerAfk).


RE: Strcmp - xbruno1000x - 18/05/2021

Primeiramente, pare de usar strcmp. O uso de qualquer outro processador de comandos é muito mais otimizado!


[Imagem: v43AinV.png]

Segundo:
Você não pode utilizar uma IF dessa forma fora do comando, não faz sentido.

Código:
if(strcmp(cmd, "/sairafk")) // Caso o player digite o comando sairafk irá ler o código abaixo.
{
    if(APlayerData[playerid][PlayerAfk] == true) // Caso o player estiver de AFK, o código abaixo será lido. Caso contrário, não ocorrerá nada.
    {
          APlayerData[playerid][PlayerAfk] = false; // Se a condição acima for verdadeira, irá tirar o jogador de AFK. Caso contrário, essa parte do código será pulada e não acontecerá nada in-game.
    }
    return 1;
}

Você também pode usar um return para impedir o jogador em AFK de usar comandos.
Código:
if(APlayerData[playerid][PlayerAfk] == true) return SendClientMessage(playerid, -1, "ERRO: você não pode utilizar um comando de AFK.");

Mas da forma como você fez não faz sentido, pois em nenhum momento você coloca a bool: PlayerAfk em negativo novamente.


RE: Strcmp - virtuS_ - 18/05/2021

Utilizo o Pawn.CMD mesmo, coloquei como condição o "strcmp" no "OnPlayerCommandReceived" para verificar se o jogador usou qualquer outro comando que não seja o /sairafk, enviando aquela mensagem de saída. Mas não funciona.

O comando no Pawn.CMD já está feito corretamente, só me resta aquilo.
Código:
CMD:sairafk(playerid, params[])
{
    // Envie o comando a todos os administradores para que possam vê-lo
    SendAdminText(playerid, "/sairafk", params);    

    // Cria variáveis locais
    new string[124], Name[MAX_PLAYER_NAME];

    // Gera o nome do jogador
    GetPlayerName(playerid, Name, sizeof(Name));

    // Verifique se o jogador não está logado
    if (APlayerData[playerid][LoggedIn] != true)
        return SendClientMessage(playerid, -1, "{FF0000}* Logue-se para usar o comando.");

    // Verifica se o jogador não está afk
    if (APlayerData[playerid][PlayerAfk] != true)
        return SendClientMessage(playerid, -1, "{FF0000}* Você não está no modo afk.");


    format(string, sizeof(string), "{008B00}* {9ACD32}%s {008B00}não está mais ausente.", Name);
    SendClientMessageToAll(-1, string); // Envia uma mensagem informando a todos que ele saiu do afk

    APlayerData[playerid][PlayerAfk] = false; // Tira o jogador do afk

    TogglePlayerControllable(playerid, 1); // Deixa o jogador movimentar-se

    SendClientMessage(playerid, -1, "{9AC0CD}* {FFFFFF}Você saiu do modo ausente."); // Envia uma mensagem para ele

    // Excluí a textdraw do afk
    PlayerTextDrawHide(playerid, TD_Afk[playerid][0]);
    PlayerTextDrawHide(playerid, TD_Afk[playerid][1]);

    return 1;
}

Ou seja, apenas o '/sairafk' poderia ser utilizado por um jogador ausente.


Código:
public OnPlayerCommandReceived(playerid, cmd[], params[], flags)
{
    if (APlayerData[playerid][PlayerAfk] == true && strcmp(cmd, "/sairafk"))
    {
        SendClientMessage(playerid, -1, "* Você não pode utilizar comando estando ausentes.");
        return 0;
    }

return 1;
}



RE: Strcmp - xbruno1000x - 18/05/2021

Estava ocupado e acabei postando a última mensagem na pressa e fui editando. Vou ser mais sucinto nessa mensagem.

Por que não funciona?
Acredito que a variavel APlayerData[playerid][PlayerAfk] = true; signifique que o jogador está de AFK. Se o jogador estiver de afk e digitar o comando /sairafk, irá retornar que ele não pode usar comando, e ele nunca sairá do AFK. Por isso eu disse que dessa forma não funcionaria. Você até pode fazer dessa forma, mas terá que alterar o código.

Código:
public OnPlayerCommandReceived(playerid, cmd[], params[], flags)
{
      if (APlayerData[playerid][PlayerAfk] == true && strcmp(cmd, "/sairafk")) // Confere se um jogador em AFK digitou o comando sairafk.
      {
           SendClientMessage(playerid, -1, "Você saiu do AFK!");
           APLayerData[playerid][PlayerAfk] = false;
      }
      return 1;
}

Para impedir o jogador de digitar um comando diferente de /sairafk e permitir que ele saia do afk quando for uma situação oposta, pode tentar substituir pela if abaixo
Código:
if(APlayerData[playerid][PlayerAfk] == true && !strcmp(cmd, "/sairafk")) return 0; //Dessa forma, quando o player estiver afk e digitar um comando diferente de /sairafk, não ocorrerá nada.