Em breve função e include de adiciona-los
Include usada:
http://forum.sa-mp.com/showthread.php?t=356010
Filterscript:
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); }
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.

---------------------------------------------------