Clique Aqui‎ para ler as Regras do xat.

[FS] Semaforo Central LV

 [FS] Semaforo Central LV

Como prometido aqui um filterscript básico de um semáforo Em breve função e include de adiciona-los

Foto:

Download:

pawn Code:


new redGreen = 1;
new sinalVermelho = 0;
new Float:angleSinal;

public OnPlayerUpdate(playerid)
{

    if(!IsPlayerConnected(playerid)) return false;
    if(IsPlayerNPC(playerid)) return true;

    /*

    ================

        0 -> 89 (norte)
        90 -> 179 (leste)
        180 -> 269 (sul)
        270 -> 359 (oeste)

    ===============

    */


    GetPlayerFacingAngle(playerid, angleSinal);

    static bool:enviada[MAX_PLAYERS];

    // verificar se ele está dentro da área da sinaleira
    if(sinalVermelho) {
        GameTextForPlayer(playerid, "Sinal ~r~Vermelho", 1000, 1);
    }
    else {
        GameTextForPlayer(playerid, "Sinal ~g~Verde", 1000, 1);
    }

    if(!IsPlayerInRangeOfLight(playerid, 2042.0878, 1283.0818, 2)  && sinalVermelho && gettime() - GetPVarInt(playerid, #sinaleiraPassada) < 10 && enviada[playerid] == true) {
        SendClientMessage(playerid, -1, "Voce passou com a sinaleira vermelha (ou saio da pista). Caara");
        enviada[playerid] = false;
    }

    if(IsPlayerInRangeOfLight(playerid, 2042.0878, 1283.0818, 2)) {
        // verificar se o cara está na posição NORTE -> SUL (que é o sentido da nossa sinaleira)
        if(300 > angleSinal > 160) {
            // Verificar se está logo abaixo da sinaleira. Nesta parte é aconselhável você checar se a velocidade do carro está acima de 10 km/h
            if(!enviada[playerid] && sinalVermelho) {
                SetPVarInt(playerid, #sinaleiraPassada, gettime());
                SendClientMessage(playerid, -1, "Sinal vermelho.");
                enviada[playerid] = true;
            }
        }
    }
    return true;
}




public OnTrafficLightChange()
{
    sinalVermelho = !!((redGreen++ - 1) % 3);
    return true;
}


#define DEBUG_BRS

IsPlayerInRangeOfLight(playerid, Float:xmax, Float:ymax, sentido)
{

    /*
        Por Bruno da Silva

    ======================

        sentido = 0 NORTE
        sentido = 1 LESTE
        sentido = 2 SUL
        sentido = 3 OESTE

    ========================

        y
        y
        xxxxyxxxxxx
        y
        y

        ou

        +
        ----+++++++
        -
        -

        estar direção N = +y
        estar direção S = -y

    */


    static
        Float:px, Float:py, Float:pz, Float:xmin, Float:ymin
        ;

    GetPlayerPos(playerid, px, py, pz);

    switch(sentido) {

                                                  // sul
        case 2: ymin = ymax + 40.0, xmax = xmax + 5.0, xmin = xmax - 10.0;
                                                  // norte
        case 0: ymin = ymax - 40.0, xmax = xmax + 5.0, xmin = xmax - 10.0;

    /// leste e oeste nao testados, rachei a cuca pra fazer isto (burro '-')
    /// nao testei para estes lados. funcao dificil, muito ABSTRATA

        case 3: xmin = xmax + 40.0, ymax = ymax + 5.0, ymin = ymax - 10.0;
        case 1: xmin = xmax - 40.0, ymax = ymax + 5.0, ymin = ymax - 10.0;
        default: return false;
    }

    #if defined DEBUG_BRS
    static executado;

    // Criar GangZone da Sinaleira para dar DEBUG
    // Sera criada uma gangzone BRANCA perto da sinaleira, na parte onde os jogadores vao esperar de carro

    if(!executado) {
        GangZoneShowForAll(GangZoneCreate(xmin, ymin, xmax, ymax),-1);
        executado = 1;
    }
    #endif

    return (px >= xmin && px <= xmax && py >= ymax && py <= ymin);
}


Ou:

Semáforo fica no centro de LV. Já coloco a print screen Estou a quase 1 semana em dormir quase nada, estou meio cansado e não consegui pensar em alguma lógica melhor para isto :/

As vezes pode bugar, mas isto é só o código mesmo para checar se o jogador está no semáforo. Não saia usando isto em seu servidor. É PARA ESTUDOS.

A callback OnTrafficLightChange não é nada precisa, mas não achei jeito melhor. (só adicionando objetos manualmente e deletando as sinaleiras atuais, mas como não mexo muito com jogo não vou fazer isto, quem quiser me passar as coordenadas para deletar todas sinaleiras e fazer eu prosseguir com o projeto, aí sim) ..
Portanto olhe o GameText para ver se o semáforo está vermelho ou verde.

Você vai gostar também...

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *