Portal SAMP
[Ajuda] Colocar um player em um ''evento'' - 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] Colocar um player em um ''evento'' (/showthread.php?tid=3627)



Colocar um player em um ''evento'' - GabrielCampos - 15/05/2023

Bom dia a todos e espero que tenham aproveitado esse final de semana.

Gostaria de uma ajuda pois aqui na minha lógica não estou sabendo como cria. Como eu poderia fazer um evento para os players, por exemplo o player digita /irevento e aí meio que se cria um mundo so pra aquele evento e depois pra sair do evento, oq poderia fazer?


Gostaria de começar a implementar um sistema de eventos, mas nao estou sabendo nem iniciar esse sistema, se alguem tiver algo que eu possa ler ou puder explicar o principio, me ajuda muito. Eventos de team deathmatch, corridas e etc...


RE: Colocar um player em um ''evento'' - Dr Editor - 15/05/2023

Você pode simplesmente estudar um sistema existente do modo que deseja criar do zero, para estudá-lo e aprender como criar um do seu jeito.

Vou te dar um exemplo bem básico sobre TDM. Abaixo os passos utilizados e por fim o código.

1 - Criar um comandos do evento (criar, entrar, sair)
2 - No comando de entrar deve-se atribuir 3 coisas: balanceamento de equipe (no DM é só desconsiderar esta parte), armas e vida do jogador
4 - Ainda no comando você redireciona o jogador para outro mundo virtual e posição do local do evento

Código:
static __playerTeam[MAX_PLAYERS];
static __teamBalance;
static bool:__activeEvent;

CMD:iniciarevento(playerid, params[])
{
    if(__activeEvent)
        return SendClientMessage(playerid, -1, "Este evento já está ativo.");
    
    __activeEvent = true;
    return 1;
}

CMD:pararevento(playerid, params[])
{
    if(!__activeEvent)
        return SendClientMessage(playerid, -1, "O evento não está ativo.");
    
    __activeEvent = false;
    __teamBalance = 0;
    LeavePlayersEvent();
    return 1;
}

CMD:irevento(playerid, params[])
{
    if(!__activeEvent)
        return SendClientMessage(playerid, -1, "O evento não está ativo.");
    
    if(__playerTeam[playerid] > 0)
        return SendClientMessage(playerid, -1, "Você já está no evento.");
    
    JoinPlayerEvent(playerid);
    return 1;
}

CMD:sairevento(playerid, params[])
{
    if(!__activeEvent)
        return SendClientMessage(playerid, -1, "O evento não está ativo.");
    
    if(__playerTeam[playerid] == 0)
        return SendClientMessage(playerid, -1, "Você não está no evento.");
    
    LeavePlayerEvent(playerid);
    return 1;
}

stock JoinPlayerEvent(playerid)
{
    if((__teamBalance % 2) == 0)
    {
        __playerTeam[playerid] = 1;
        SendClientMessage(playerid, -1, "Você pertence ao time 1.");
    }
    else
    {
        __playerTeam[playerid] = 2;
        SendClientMessage(playerid, -1, "Você pertence ao time 2.");
    }
    
    SetPlayerHealth(playerid, 100.0); // Altera a vida em 100%
    GivePlayerWeapon(playerid, 24, 50); // Dá uma Desert Eagle
    SetPlayerVirtualWorld(playerid, 50); // Muda o mundo virtual
    SetPlayerPos(playerid, 1.0, 2.0, 3.0); // Muda a posição do jogador
    
    __teamBalance ++;
}

stock LeavePlayerEvent(playerid)
{
    SendClientMessage(playerid, -1, "O evento terminou.");
    
    SetPlayerHealth(playerid, 100.0); // Altera a vida em 100%
    ResetPlayerWeapons(playerid); // Remove as armas do jogador
    SetPlayerVirtualWorld(playerid, 0); // Muda o mundo virtual
    SetPlayerPos(playerid, 1.0, 2.0, 3.0); // Muda a posição do jogador
    __playerTeam[playerid] = 0;
    
    __teamBalance --;
}

stock LeavePlayersEvent()
{
    for(new i = 0; i < MAX_PLAYERS; i ++)
    {
        if(!IsPlayerConnected(i))
            continue;
        
        SendClientMessage(i, -1, "O evento terminou.");
        
        SetPlayerHealth(i, 100.0); // Altera a vida em 100%
        ResetPlayerWeapons(i); // Remove as armas do jogador
        SetPlayerVirtualWorld(i, 0); // Muda o mundo virtual
        SetPlayerPos(i, 1.0, 2.0, 3.0); // Muda a posição do jogador
        __playerTeam[i] = 0;
    }
}


OBS.:
É um código extremamente simples, mas funcional. Há muitas coisas para adaptar e melhorar.