Portal SAMP
[Ajuda] Como colocar comando em ON e OFF - 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] Como colocar comando em ON e OFF (/showthread.php?tid=3607)



Como colocar comando em ON e OFF - GabrielCampos - 11/05/2023

Uso o zcmd e tenho duvida em como colocar um comando ON e off 

exemplo to fazendo um comando onde ele vai pintar o carro automaticamente num loop, e ficar mudando de cores
Código:
CMD:rgb(playerid)
{
    new vehicleid = GetPlayerVehicleID(playerid);
    new id, id2;
    id = randomEx(0, 7);
    id2 = randomEx(0, 7);

    for(new i = 0; i < MAX_PLAYERS; i++)
       {
        ChangeVehicleColor(vehicleid, id, id2);
    }
    

    return 1;
}
Como fazer tipo o player digita /rgb ele executa o comando e ele digitar novamente o comando para de funcionar


RE: Como colocar comando em ON e OFF - Sysner - 11/05/2023

Umas das formas de fazer isso, é criando uma variável booleana que armazenar apenas valores True(1) ou False(0)
Código:
new bool:EffectRgbVehicle[MAX_PLAYERS];

aí e só fazer um código para alternar os valores toda vez que usar comando CMD:rgb
Código:
new bool:EffectRgbVehicle[MAX_PLAYERS];
CMD:rgb(playerid)
{

    EffectRgbVehicle[playerid] = EffectRgbVehicle[playerid] == true ? false : true;

    if(EffectRgbVehicle[playerid])
    {
        // codigo para ativao o efeito
    }
    else if(!EffectRgbVehicle[playerid])
    {
        // codigo para desativa o efeito
    }
    return 1;
}


Se você quer uma efeito para os veículos pisca de cor aletoriamente
Esse código não e apropriado, porque faz o Loop somente ate o numero de jogadores suportado pelo servido MAX_PLAYERS, isso instantaneamente, sem intervalor para o jogador visualizar todas as cores trocadas.

Seria melhor usar uma função SetTimerEx com intervalo de segundos, é o comando CMD:rgb controlará o efeito iniciando função TimeEx para ativa ou destruindo o TimerEx para desativa

Exemplo rápido:
Código:
new bool:EffectRgbVehicle[MAX_PLAYERS], IDTempEffectRgbVehicle[MAX_PLAYERS];
forward EffectRgbVehicleProcess(vehicleid);
public EffectRgbVehicleProcess(vehicleid)
{
    new id, id2;
    id = random(0, 7);
    id2 = random(0, 7);
    ChangeVehicleColor(vehicleid, id, id2);
    return 1;
}


CMD:rgb(playerid)
{

    EffectRgbVehicle[playerid] = EffectRgbVehicle[playerid] == true ? false : true;

    if(EffectRgbVehicle[playerid])
    {
        new vehicleid = GetPlayerVehicleID(playerid);
        IDTempEffectRgbVehicle[playerid] = SetTimerEx("EffectRgbVehicleProcess", 1000, true, "i", vehicleid);
        SendClientMessage(playerid, -1, "RGB Ativado");
    }
    else if(!EffectRgbVehicle[playerid])
    {
        KillTimer(IDTempEffectRgbVehicle[playerid]);
        SendClientMessage(playerid, -1, "RGB Desativado");
    }
    return 1;
}

A partir daí e só enriquece mais o sistema.


RE: Como colocar comando em ON e OFF - GabrielCampos - 11/05/2023

(11/05/2023 02:03)Sysner Escreveu: Umas das formas de fazer isso, é criando uma variável booleana que armazenar apenas valores True(1) ou False(0)
Código:
new bool:EffectRgbVehicle[MAX_PLAYERS];

aí e só fazer um código para alternar os valores toda vez que usar comando CMD:rgb
Código:
new bool:EffectRgbVehicle[MAX_PLAYERS];
CMD:rgb(playerid)
{

    EffectRgbVehicle[playerid] = EffectRgbVehicle[playerid] == true ? false : true;

    if(EffectRgbVehicle[playerid])
    {
        // codigo para ativao o efeito
    }
    else if(!EffectRgbVehicle[playerid])
    {
        // codigo para desativa o efeito
    }
    return 1;
}


Se você quer uma efeito para os veículos pisca de cor aletoriamente
Esse código não e apropriado, porque faz o Loop somente ate o numero de jogadores suportado pelo servido MAX_PLAYERS, isso instantaneamente, sem intervalor para o jogador visualizar todas as cores trocadas.

Seria melhor usar uma função SetTimerEx com intervalo de segundos, é o comando CMD:rgb controlará o efeito iniciando função TimeEx para ativa ou destruindo o TimerEx para desativa

Exemplo rápido:
Código:
new bool:EffectRgbVehicle[MAX_PLAYERS], IDTempEffectRgbVehicle[MAX_PLAYERS];
forward EffectRgbVehicleProcess(vehicleid);
public EffectRgbVehicleProcess(vehicleid)
{
    new id, id2;
    id = random(0, 7);
    id2 = random(0, 7);
    ChangeVehicleColor(vehicleid, id, id2);
    return 1;
}


CMD:rgb(playerid)
{

    EffectRgbVehicle[playerid] = EffectRgbVehicle[playerid] == true ? false : true;

    if(EffectRgbVehicle[playerid])
    {
        new vehicleid = GetPlayerVehicleID(playerid);
        IDTempEffectRgbVehicle[playerid] = SetTimerEx("EffectRgbVehicleProcess", 1000, true, "i", vehicleid);
        SendClientMessage(playerid, -1, "RGB Ativado");
    }
    else if(!EffectRgbVehicle[playerid])
    {
        KillTimer(IDTempEffectRgbVehicle[playerid]);
        SendClientMessage(playerid, -1, "RGB Desativado");
    }
    return 1;
}

A partir daí e só enriquece mais o sistema.
Obrigado!! Alem de me tirar a duvida, consertou a minha lógica, agradeço muito, pois ainda estou aprendendo a programação e é muito bom estudar e aprender a lógicar por esse angulo mais avançado


RE: Como colocar comando em ON e OFF - Dr Editor - 11/05/2023

Dica rápida sobre booleano:
Você pode usar o valor oposto da variável ao invés de aplicar operação ternária.
Código:
EffectRgbVehicle[playerid] = !EffectRgbVehicle[playerid]