Portal SAMP
[Ajuda] com esse sistema - 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] com esse sistema (/showthread.php?tid=4980)



com esse sistema - LOS_SANTOS - 19/02/2025

bem encontrei esse sistema derby por ai acho que e a do delete do ppc truck entao ueria dar uma modificado para colocar no meu servidor o problema e que os usar /derby de pois de um tempinho o player q entrou ganha o derby queria que se iniciasse com pelo menos 2 ou mais player pois como ta definido se tiver 1 player no derby ele mesmo ganha queria a ajuda de algm com experiencia nessa linguagem para dizer como posso fazer essa verificacao no minimo se dois players tiver no derby caso so tenha 1 o derby nao se inicia 
Código:
#define FILTERSCRIPT

#include a_samp
#include fixchars
#include streamer
#include zcmd

#define function%0(%1)          forward%0(%1);public%0(%1)
#define InDerby(%0)             GetPVarInt(%0, "InDerby")
#define DIALOG_MAPS             6666
#define DERBYCOUNT              20
#define DDVEHICLE               415 // (Cheetah)
#define PLAYERLIMIT             30

enum ddinfos{ IsDerby, IsDerbyStarted, ddplayers, map }
enum asd{ mapname[32], mapauthor[24] }

new   Maps[][asd] = {
        {"Derby 1", "Andre"},
        {"Derby 2", "Andre"},
        {"Derby 3", "Andre"}
    },
    Float:s15pos[30][4] = { // Cross S15
        {756.9044,-3540.9138,3.1379,179.0234}, {775.4280,-3541.4460,3.1116,180.2614}, {794.1912,-3541.3367,3.1155,179.5315}, {812.3196,-3541.2278,3.1210,178.9698},
        {831.3577,-3541.6177,3.1029,179.1547}, {849.8322,-3541.8528,3.1180,180.0865}, {868.5156,-3541.4802,3.1107,181.4539}, {868.3105,-3733.9446,3.1259,359.0275},
        {850.1912,-3733.7065,3.1149,0.4521}, {831.2225,-3733.7874,3.1176,359.8431}, {812.5354,-3733.8701,3.1216,0.2014}, {793.8035,-3733.9099,3.1244,359.1755},
        {775.7811,-3733.7095,3.1137,0.9984}, {756.4110,-3733.4827,3.1059,358.7969}, {716.8422,-3693.1565,3.0976,269.7966}, {716.1367,-3674.8931,3.1293,271.8715},
        {716.3971,-3656.4351,3.1172,269.8341}, {716.4112,-3637.6555,3.1180,273.6064}, {717.2551,-3619.0774,3.0761,268.7869}, {716.6725,-3600.0720,3.1037,272.9206},
        {716.5823,-3581.6777,3.1081,270.5320}, {908.7960,-3582.0232,3.1140,90.6347}, {908.6541,-3600.1563,3.1063,89.5780}, {909.0964,-3618.9082,3.1267,91.2982},
        {908.5549,-3637.3091,3.1035,91.1804}, {908.5914,-3656.1335,3.1078,89.6344}, {909.2120,-3674.4927,3.1315,90.1753}, {909.5079,-3693.5920,3.1451,89.2660},
        {868.3105,-3733.9446,3.1259,359.0275}, {812.2875,-3637.6294,1.3974,315.0211}
    },
    Float:ztpos[30][4] = { // Zaya Training
        {-944.6622,-3306.7258,13.8874,224.5076}, {-943.3749,-3315.0498,13.8851,134.3918}, {-963.0135,-3334.2771,13.8853,134.3916}, {-1017.8218,-3276.1423,3.0149,359.7578},
        {-1012.8713,-3292.9702,3.0149,90.9614}, {-1012.7588,-3319.1631,3.0161,179.6369}, {-1012.9409,-3353.5984,4.2922,180.1514}, {-1012.8218,-3408.7708,10.2433,180.0338},
        {-1012.7954,-3455.2166,4.2829,180.0336}, {-1047.2941,-3434.4543,10.2409,43.6764}, {-1040.5676,-3433.7925,10.2463,312.7609}, {-1022.6121,-3408.8796,10.2418,46.7539},
        {-1044.0714,-3388.6619,10.2474,136.1198}, {-1064.8586,-3416.4795,10.2416,45.5951}, {-1114.9474,-3365.2273,4.3113,357.2206}, {-1112.1831,-3348.6121,4.3115,315.6601},
        {-1081.3710,-3317.0808,4.3165,315.6595}, {-1043.1082,-3278.4094,4.3113,314.9465}, {-1028.0548,-3263.3838,4.3097,314.9471}, {-1010.6964,-3255.5996,4.3192,270.6101},
        {-1017.9971,-3340.2781,10.2464,181.7582}, {-1018.0348,-3350.5977,10.2467,179.8441}, {-999.7271,-3360.5056,10.2498,180.2483}, {-999.6309,-3382.6829,10.2503,180.2482},
        {-964.0109,-3389.6384,1.5515,354.9221}, {-965.9038,-3410.2092,1.5384,317.4788}, {-975.7332,-3446.5098,13.7621,46.3455}, {-982.2931,-3439.7952,13.7611,44.2358},
        {-940.2568,-3372.3130,27.8532,88.6187}, {-946.3826,-3418.2603,24.7574,88.7780}
    },
    Float:rvpos[30][4] = { // Russkaya Vodka
        {4451.1040,-658.1807,3.9008,178.5456}, {4530.3726,-657.2891,3.9022,180.4751}, {4525.2588,-651.9951,3.8970,91.5458}, {4471.0127,-656.9320,3.9014,179.3459},
        {4451.1040,-658.1807,3.9008,178.5456}, {4410.9355,-656.8109,3.9023,180.8332}, {4410.7217,-722.8928,3.9027,180.3781}, {4416.6465,-727.7642,3.9026,263.1605},
        {4491.5527,-723.0516,3.9025,0.3554}, {4529.9287,-723.1869,3.9031,359.3454}, {4537.9614,-690.3776,3.8989,90.3080}, {4492.0015,-690.6239,3.9018,90.3074},
        {4410.0708,-690.1467,3.9020,89.6459}, {4357.7944,-706.1782,16.9854,358.2615}, {4357.6152,-674.0663,16.9849,179.2957}, {4403.4917,-672.8745,16.9846,178.5666},
        {4403.3535,-706.2702,16.9855,0.4106}, {4583.4502,-673.5909,16.9834,177.8225}, {4583.5322,-705.5579,16.9842,359.3588}, {4537.9722,-705.4476,16.9857,359.3521},
        {4538.0791,-672.2876,16.9858,181.6050}, {4516.9312,-690.5862,16.9832,89.2104}, {4430.0161,-690.4833,16.9826,269.8497}, {4448.4961,-701.8934,16.9807,179.4200},
        {4502.5288,-702.0876,16.9812,177.5708}, {4502.2939,-677.9621,16.9815,358.8295}, {4448.9321,-677.8625,16.9816,359.2458}, {4357.6152,-674.0663,16.9849,179.2957},
        {4470.5430,-643.2770,16.9775,89.8258}, {4479.4116,-736.3008,16.9785,87.8211}
    },

    str[128],
    string[1024],
    //Float:p[4],
    DerbyAdatok[ddinfos],
    PlayerText:counttd[2],
    engine, lights, alarm, doors, bonnet, boot, objective,
    timer, timer2, ddcount,
    bool:mapslot[30], pslot
;
public OnFilterScriptInit() {
    LoadDDMaps();
    return 1;
}
public OnFilterScriptExit() {
    if(DerbyAdatok[IsDerby] == 1) {
                DerbyAdatok[ddplayers] = 0;
                KillTimer(timer);
                KillTimer(timer2);
                DerbyAdatok[IsDerbyStarted] = false;
                DerbyAdatok[IsDerby] = false;
    }
    return 1;
}

public OnPlayerConnect(playerid) {
    SetPVarInt(playerid, "Nitro", 2);

    counttd[0] = CreatePlayerTextDraw(playerid,319.000000, 174.000000, "3");
    PlayerTextDrawAlignment(playerid,counttd[0], 2);
    PlayerTextDrawBackgroundColor(playerid,counttd[0], 255);
    PlayerTextDrawFont(playerid,counttd[0], 2);
    PlayerTextDrawLetterSize(playerid,counttd[0], 1.060000, 5.499999);
    PlayerTextDrawColor(playerid,counttd[0], -1);
    PlayerTextDrawSetOutline(playerid,counttd[0], 1);
    PlayerTextDrawSetProportional(playerid,counttd[0], 1);
    PlayerTextDrawSetSelectable(playerid,counttd[0], 0);

    counttd[1] = CreatePlayerTextDraw(playerid,246.000000, 345.000000, "À espera de jogadores...");
    PlayerTextDrawBackgroundColor(playerid,counttd[1], 255);
    PlayerTextDrawFont(playerid,counttd[1], 2);
    PlayerTextDrawLetterSize(playerid,counttd[1], 0.250000, 0.899999);
    PlayerTextDrawColor(playerid,counttd[1], -1);
    PlayerTextDrawSetOutline(playerid,counttd[1], 1);
    PlayerTextDrawSetProportional(playerid,counttd[1], 1);
    PlayerTextDrawSetSelectable(playerid,counttd[1], 0);
    return 1;
}

public OnPlayerDisconnect(playerid, reason) {
    if(InDerby(playerid)) OnPlayerLeaveDD(playerid);
    return 1;
}



public OnPlayerExitVehicle(playerid, vehicleid) {
    if(InDerby(playerid)) {
        ClearAnimations(playerid);
        PutPlayerInVehicle(playerid, vehicleid, 0);
    }
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) {
    if(dialogid == DIALOG_MAPS) {
            if(!response) return 1;
            if(DerbyAdatok[IsDerbyStarted] == 1) return SendClientMessage(playerid, 0xff6666ff, "Erro! o jogo já começou: /dd");
            str[0] = EOS;
            format(str, sizeof(str), "Evento Derby Aberto! Mapa %s | /Derby", inputtext);
            SendClientMessageToAll(-1, str);

            DerbyAdatok[map] = listitem;
            StartDD();
            OnPlayerJoinDD(playerid);
    }
    return 1;
}

public OnVehicleDeath(vehicleid, killerid) {
    for(new i; i < MAX_PLAYERS; i++) {
        if(InDerby(i) && GetPVarInt(i, "ddVeh") == vehicleid) {
            DerbyAdatok[ddplayers] --;
            DestroyVehicle(GetPVarInt(i, "ddVeh"));

            format(string, sizeof(string), "[DERBY] %s {ff6666}morreu no derby! {ffffff} [%i/"#PLAYERLIMIT"]", Name(i), DerbyAdatok[ddplayers]);
            SendClientMessageToAll(-1, string);

            DeletePVar(i, "InDerby");
            SpawnPlayer(i);
            CheckDestructionDerby();
        }
    }
    return 1;
}
new playerInDerby[MAX_PLAYERS];  // 0 = Não está no derby, 1 = Está no derby
CMD:derby(playerid)
{

    if(playerInDerby[playerid] == 1)return SendClientMessage(playerid, 0xFF6666FF, "Você já está participando do derby! Aguarde até sair para tentar novamente.");
    if(DerbyAdatok[IsDerbyStarted] == 1)return SendClientMessage(playerid, 0xFF6666FF, "O derby já começou, você não pode mais participar.");
    if(DerbyAdatok[ddplayers] >= PLAYERLIMIT)return SendClientMessage(playerid, 0xFF6666FF, "Limite de players no derby foi atingido!");
    if(!DerbyAdatok[IsDerby])
    {
        string[0] = EOS;
        for(new i; i < sizeof(Maps); i++)
        {
            strcat(string, "{e0e0e0}");
            format(str, sizeof(str), "%s \n", Maps[i][mapname], Maps[i][mapauthor]);
            strcat(string, str);
        }
        ShowPlayerDialog(playerid, DIALOG_MAPS, 2, "{ff6666}Mapa opcional:", string, "OK", "Cancelar");
        return 1;
        }
    return 1;
}


CMD:sairderby(playerid) {
    if(!InDerby(playerid)) return SendClientMessage(playerid, 0xff6666FF, "Você não está em um derby!");
    if(DerbyAdatok[IsDerby] == 0) return SendClientMessage(playerid, 0xff6666FF, "Não tem nenhum derby para você sair!");
    OnPlayerLeaveDD(playerid);
    SpawnPlayer(playerid);
    return 1;
}

/*function CheckDestructionDerby() {
    if(DerbyAdatok[IsDerby] == 1) {
        for(new i; i < MAX_PLAYERS; i++) {
            if(IsPlayerConnected(i) && InDerby(i)) {
                GetPlayerPos(i, p[0], p[1], p[2]);
                if(p[2] <= 0.0) {
                    DerbyAdatok[ddplayers] --;
                    DestroyVehicle(GetPVarInt(i, "ddVeh"));

                    format(string, sizeof(string), "[DERBY] %s {ff6666}caiu na água no Derby {ffffff} [%i/"#PLAYERLIMIT"]", Name(i), DerbyAdatok[ddplayers]);
                    SendClientMessageToAll(-1, string);

                    DeletePVar(i, "InDerby");
                    SpawnPlayer(i);
                }
                if(DerbyAdatok[ddplayers] < 2) {
                    new playerid = IsDerbyWinner();
                    format(string, sizeof(string), "[DERBY] %s {33aa33}ganhou o Derby e recebeu $1000 !", Name(playerid));
                    SendClientMessageToAll(-1, string);
                    DestroyVehicle(GetPVarInt(playerid, "ddVeh"));
                    DeletePVar(playerid, "InDerby");
                    GivePlayerMoney(playerid, 1000);
                    SpawnPlayer(playerid);

                    DerbyAdatok[ddplayers] = 0;
                    KillTimer(timer2);
                    DerbyAdatok[IsDerbyStarted] = 0;
                    DerbyAdatok[IsDerby] = 0;
                }
            }
        }
    }
    return 1;
}*/
function CheckDestructionDerby() {
    if(DerbyAdatok[IsDerby] == 1) {
        // Conta o número de jogadores conectados no derby
        new playersInDerby = 0;
        for(new i; i < MAX_PLAYERS; i++) {
            if(IsPlayerConnected(i) && InDerby(i)) {
                playersInDerby++;
            }
        }

        // Se houver pelo menos 2 jogadores, começa o derby
        if(playersInDerby >= 2 && DerbyAdatok[IsDerbyStarted] == 0) {
            // Inicia o jogo
            StartDD();
        }

        // Se a quantidade de jogadores cair abaixo de 2, encerre o derby
        if(playersInDerby < 2) {
            if(DerbyAdatok[IsDerbyStarted] == 1) {
                new playerid = IsDerbyWinner();
                format(string, sizeof(string), "[DERBY] %s {33aa33}ganhou o Derby e recebeu $1000!", Name(playerid));
                SendClientMessageToAll(-1, string);
                DestroyVehicle(GetPVarInt(playerid, "ddVeh"));
                DeletePVar(playerid, "InDerby");
                GivePlayerMoney(playerid, 1000);
                SpawnPlayer(playerid);

                DerbyAdatok[ddplayers] = 0;
                KillTimer(timer2);
                DerbyAdatok[IsDerbyStarted] = 0;
                DerbyAdatok[IsDerby] = 0;
            }
        }
    }
    return 1;
}

function CountDownStart() {
    ddcount --;

    for(new i; i < MAX_PLAYERS; i++) {
        if(!IsPlayerConnected(i)) continue;
        if(ddcount == -3) {
            PlayerTextDrawHide(i, counttd[0]);
            KillTimer(timer);
        }
        if(!ddcount) {
            if(DerbyAdatok[ddplayers] < 0) {
                SendClientMessageToAll(-1, "O Derby foi cancelado. Motivo: poucos jogadores!");
                if(DerbyAdatok[ddplayers] == 1) {
                    new playerid = IsDerbyWinner();
                    DestroyVehicle(GetPVarInt(playerid, "ddVeh"));
                    DeletePVar(playerid, "InDerby");
                    SpawnPlayer(playerid);
                    PlayerTextDrawHide(playerid, counttd[0]);
                    PlayerTextDrawHide(playerid, counttd[1]);
                }
                DerbyAdatok[ddplayers] = 0;
                KillTimer(timer);
                KillTimer(timer2);
                DerbyAdatok[IsDerbyStarted] = 0;
                DerbyAdatok[IsDerby] = 0;
                return 1;
            }
            PlayerTextDrawSetString(i, counttd[0], "~g~~h~vai");
            GetVehicleParamsEx(GetPVarInt(i, "ddVeh"), engine, lights, alarm, doors, bonnet, boot, objective);
            SetVehicleParamsEx(GetPVarInt(i, "ddVeh"), engine=1, lights, alarm, doors, bonnet, boot, objective);
            RepairVehicle(GetPlayerVehicleID(i));
            timer2 = SetTimer("CheckDestructionDerby", 1000, true);
            DerbyAdatok[IsDerbyStarted] = 1;
        }
        if(ddcount < 4 && ddcount > 0) {
            PlayerTextDrawHide(i, counttd[1]);
            format(str, sizeof(str), "%i", ddcount);
            PlayerTextDrawSetString(i, counttd[0], str);
            PlayerTextDrawShow(i, counttd[0]);
        }
    }
    return 1;
}

function OnPlayerJoinDD(playerid) {
    PlayerTextDrawShow(playerid, counttd[1]);

    vissza: { pslot = random(30); }

    if(mapslot[pslot] == true) goto vissza;
    mapslot[pslot] = true;

    if(DerbyAdatok[map] == 0) SetPVarInt(playerid, "ddVeh", CreateVehicle(DDVEHICLE, s15pos[pslot][0], s15pos[pslot][1], s15pos[pslot][2]+2, s15pos[pslot][3], 1, 1, -1));
    if(DerbyAdatok[map] == 1) SetPVarInt(playerid, "ddVeh", CreateVehicle(DDVEHICLE, ztpos[pslot][0], ztpos[pslot][1], ztpos[pslot][2]+2, ztpos[pslot][3], 1, 1, -1));
    if(DerbyAdatok[map] == 2) SetPVarInt(playerid, "ddVeh", CreateVehicle(DDVEHICLE, rvpos[pslot][0], rvpos[pslot][1], rvpos[pslot][2]+2, rvpos[pslot][3], 1, 1, -1));

    PutPlayerInVehicle(playerid, GetPVarInt(playerid, "ddVeh"), 0);
    GetVehicleParamsEx(GetPVarInt(playerid, "ddVeh"), engine, lights, alarm, doors, bonnet, boot, objective);
    SetVehicleParamsEx(GetPVarInt(playerid, "ddVeh"), engine=0, lights, alarm, doors, bonnet, boot, objective);

    DerbyAdatok[ddplayers] ++;
    SetPVarInt(playerid, "InDerby", 1);
    format(string, sizeof(string), "[DD] %s foi para o {ff0000}Derby{ffffff} %i/"#PLAYERLIMIT" ( /Derby )", Name(playerid), DerbyAdatok[ddplayers]);
    SendClientMessageToAll(-1, string);
    return 1;
}

function OnPlayerLeaveDD(playerid) {
    DerbyAdatok[ddplayers] --;
    SetPVarInt(playerid, "InDerby", 0);
    DestroyVehicle(GetPVarInt(playerid, "ddVeh"));
    return 1;
}

stock IsDerbyWinner() {
    for(new i; i < MAX_PLAYERS; i++) if(InDerby(i)) return i;
    return -1;
}

stock StartDD()
{
    DerbyAdatok[IsDerby] = true;
    timer = SetTimer("CountDownStart", 1000, true);
    ddcount = DERBYCOUNT;
    return 1;
}



RE: com esse sistema - xbruno1000x - 20/02/2025

Código:
if(DerbyAdatok[ddplayers] < 0) {
                SendClientMessageToAll(-1, "O Derby foi cancelado. Motivo: poucos jogadores!");

O problema está nesse trecho. Está verificando se houver menos de 0 jogadores, o derby é cancelado. Nunca vai haver menos que 0...

Deveria estar assim:
Código:
if(DerbyAdatok[ddplayers] < 2) {
                SendClientMessageToAll(-1, "O Derby foi cancelado. Motivo: poucos jogadores!");
Quando houver menos de 2 jogadores, será cancelado.


RE: com esse sistema - André Santos - 21/02/2025

(20/02/2025 13:48)xbruno1000x Escreveu:
Código:
if(DerbyAdatok[ddplayers] < 0) {
                SendClientMessageToAll(-1, "O Derby foi cancelado. Motivo: poucos jogadores!");

O problema está nesse trecho. Está verificando se houver menos de 0 jogadores, o derby é cancelado. Nunca vai haver menos que 0...

Deveria estar assim:
Código:
if(DerbyAdatok[ddplayers] < 2) {
                SendClientMessageToAll(-1, "O Derby foi cancelado. Motivo: poucos jogadores!");
Quando houver menos de 2 jogadores, será cancelado.

Obg Bruno deu certo agora vlw não prestei atenção nisso