Inserido por: xbruno1000x - 17/08/2025 03:03 - Fórum: Includes
- Sem Respostas
Apresentação - easyEnEx (Atualizado v1.5)
Uma biblioteca leve e flexível para criar entradas e saídas (EnEx) no SA:MP — com suporte a Streamer, schedules e controle por jogador.
O que é?
A easyEnEx é uma dependência em Pawn criada para facilitar a criação e o gerenciamento de entradas/saídas (Exits/Entrances) em interiores do SA:MP — ideal para casas, lojas, armários, etc. Ela abstrai pickups, cria labels 3D, oferece controle de acesso (global e por jogador), agendamento por horário e facilita chamadas de evento para integrar sua lógica. Novidades / Funcionalidades principais (última versão)
Criação dinâmica de EnEx com pickups via Streamer e labels 3D automáticos (nome personalizado na entrada e "Saída" no outro lado).
Parâmetros completos na criação: posição, ângulo, interior e virtual world para ambos os lados (entrada/saída), pickup id customizável e mensagem de entrada fechada personalizada.
Controle de bloqueio/desbloqueio: fechar/abrir EnEx global e por jogador (Enex_Close / Enex_Open / Enex_CloseForPlayer / Enex_OpenForPlayer).
Agendamento de funcionamento: definir horário de abertura/fechamento com suporte a intervalos que passam da meia-noite (Enex_SetSchedule + Enex_CheckSchedule).
Congelar jogador ao teletransportar (opcional) e desfazer o freeze automaticamente com timer.
Hooks e callbacks: integra com callbacks locais e hooks (OnPlayerAttemptEnEx via CallLocalFunction; OnPlayerDeniedEnEx opcional; OnPlayerEnterEnEx / OnPlayerExitEnEx).
Mensagens amigáveis ao jogador (mensagem padrão configurável ou personalizada por EnEx).
Compatibilidade e configuração: usa YSI Iterators, y_hooks, y_timers e Streamer; limite de EnEx configurável via MAX_ENEX.
Enex_CheckSchedule(enexid) → checa horário atual do servidor (usa gettime) e retorna se está aberto.
SendClosedMessage(playerid, enexid) → envia a mensagem de entrada fechada configurada.
SendScheduleMessage(playerid, enexid) → envia a mensagem com horário de funcionamento.
SetPlayerPosEnEx(playerid, x,y,z, angle, vwid=0, intid=0) → teleporta o jogador e ajusta câmera/virtual/interior.
GetXYInFrontOfEnEx(x,y,angle,&outX,&outY,distance) → utilitário para posicionar o jogador levemente à frente do EnEx.
Callbacks / Hooks disponíveis
OnPlayerAttemptEnEx(playerid, enexid) — (chamada local) é invocada antes do teleporte; se retornar 0, a ação é cancelada. (A biblioteca chama CallLocalFunction para isso.)
OnPlayerDeniedEnEx(playerid, enexid) — hook opcional chamado quando o jogador tenta acessar um EnEx fechado (útil para logs/efeitos).
OnPlayerEnterEnEx(playerid, enexid) — chamado quando o jogador entra (após validações).
OnPlayerExitEnEx(playerid, enexid) — chamado quando o jogador sai.
Comportamento de Schedule
A função de schedule aceita intervalos normais (ex: 09 → 18) e intervalos que atravessam meia-noite (ex: 22 → 06). A checagem usa a hora do servidor (gettime). Em caso de EnEx com schedule definido e fora do horário, o jogador recebe uma mensagem com o horário de funcionamento (formatada em HH:00). Observações de implementação e notas técnicas
A implementação usa YSI Iterators para manter IDs livres/ocupados (Iter_Free / Iter_Add).
Pickups são criados com CreateDynamicPickup (Streamer). Labels 3D são criadas com CreateDynamic3DTextLabel. Ajuste TEXTLABEL_STREAMDISTANCE se necessário.
O freeze temporário ao teleporte usa um timer UnfreezePlayer[...] para restaurar o controle do jogador. Há um array de timers com tamanho 1000 por padrão na versão atual.
A tecla padrão para ativação é definida por DEFAULT_KEY (pode ser alterada antes de incluir a biblioteca).
A biblioteca valida enexid (0..MAX_ENEX-1) nas funções públicas onde aplicável.
Instalação
Copie o arquivo easyEnEx.inc para a pasta pawno/includes.
Tenha as dependências instaladas (YSI + Streamer).
Inclua no seu gamemode:
#include easyEnex
Compile e use Enex_Create(...) para adicionar EnEx no OnGameModeInit, por exemplo.
Exemplo rápido
Código:
// Cria uma casa: nome, posição da entrada, posição da saída, vw/int/freeze, pickup id, mensagem fechada
new enex = Enex_Create("Casa do CJ",
1950.0, -1790.0, 14.1, 0.0, // entrada
260.0, -1000.0, 23.5, 90.0, // saída
0, 0, false, // ex_vwid, ex_intid, freeze
0, 0, // en_vwid, en_intid
1318, "Entrada fechada! Volte depois.");
Temos um Gamemode de demonstração com exemplos práticos (duas entradas criadas — Casa do CJ e Armário). Veja o demo no repositório: Clique aqui para ver o demo Changelog resumido (últimas adições)
Suporte a schedules (Enex_SetSchedule / Enex_CheckSchedule).
Controle por jogador (Enex_CloseForPlayer / Enex_OpenForPlayer).
Mensagem de horário ao tentar entrar fora do horário.
CallLocalFunction para OnPlayerAttemptEnEx (permite bloquear via retorno 0).
OnPlayerDeniedEnEx hook quando EnEx está fechado.
Melhor organização das constantes e parâmetros de Enex_Create (virtual/interior para ambos os lados).
Pequenas melhorias de UX: posicionamento levemente à frente do EnEx ao spawnear, criar textlabels com streamdistance configurável.
Créditos
Desenvolvido por: xBruno1000x — contribuições são bem-vindas! Se quiser, abra issue ou PR no repositório. Suporte / Contato
Se quiser adicionar feature request (ex.: suporte a diferentes teclas por EnEx, ou integração com sistemas de permissão), diga o que tem em mente ou abra uma issue no GitHub do projeto.
alguém possuem a include a_samp mais atual pois precisava a minha não tem algumas coisas como GetVehiclePos se algum tiver por favor passa para mim ou s algum souber de includes atualizado me avisa preciso reorganiza meu servidor e tirar as includes velhas
oq há de errado nesse script que não vai para o próximo check point oq fiz de errado ? esse emprego está dentro de uma include queria só saber o motivo mesmo de não ir ao próximo checkpoint automaticamente se tá tudo na lógica certa ,algum erro cometi q não estou sabendo identificar
Código:
/missao onibus
forward rotabus(playerid);
new busjob[256];
new timerbus[MAX_PLAYERS];
new rotabusjob[MAX_PLAYERS] = 0;
CMD:busjob(playerid){
if(corridaativa)return SendClientMessage(playerid,0x00FFFFFF,"voce nao pode usar esse comando agora");
if(GetVehicleModel(GetPlayerVehicleID(playerid)) == 437){
SendClientMessage(playerid, -1,"| INFO | Serviço iniciado com sucesso! Siga o ícone vermelho no mapa para chegar ao primeiro ponto de ônibus!");
if(busjob[playerid] == 0){
busjob[playerid] = 1;
SetPlayerCheckpoint(playerid,2212.9006,-2235.4822,13.5469, 3.0);
timerbus[playerid] = SetTimerEx("rotabus", 1000, false, "i",playerid);
}
}
SendClientMessage(playerid, -1,"| ERRO | Você tem que estar em uma ônibus para começar a rota!");
return 1;
}
stock bus_OnPlayerEnterCheckpoint(playerid){
if(GetVehicleModel(GetPlayerVehicleID(playerid)) == 437){
if(busjob[playerid] == 1){
busjob[playerid] = 2;
TogglePlayerControllable(playerid,0);
SetPlayerCheckpoint(playerid,2029.1879,-2106.7595,13.0503,10);
SendClientMessage(playerid, -1,"| INFO | Os passageiros estão saindo e/ou entrando no ônibus! Aguarde...");
timerbus[playerid] = SetTimerEx("rotabus", 1000, false, "i",playerid);
return 1;
}
if(busjob[playerid] == 2){
busjob[playerid] = 3;
TogglePlayerControllable(playerid,0);
SetPlayerCheckpoint(playerid,1965.0934,-1879.8435,13.0460,10);
SendClientMessage(playerid, -1,"| INFO | Os passageiros estão saindo e/ou entrando no ônibus! Aguarde...");
timerbus[playerid] = SetTimerEx("rotabus", 1000, false, "i",playerid);
return 1;
}
if(busjob[playerid] == 3){
busjob[playerid] = 4;
TogglePlayerControllable(playerid,0);
SetPlayerCheckpoint(playerid,1825.0763,-1641.5555,13.0406,10);
SendClientMessage(playerid, -1,"| INFO | Os passageiros estão saindo e/ou entrando no ônibus! Aguarde...");
timerbus[playerid] = SetTimerEx("rotabus", 1000, false, "i",playerid);
return 1;
}
if(busjob[playerid] == 4){
busjob[playerid] = 5;
TogglePlayerControllable(playerid,0);
SetPlayerCheckpoint(playerid,1661.4106,-1513.8069,13.0394,10);
SendClientMessage(playerid, -1,"| INFO | Os passageiros estão saindo e/ou entrando no ônibus! Aguarde...");
timerbus[playerid] = SetTimerEx("rotabus", 1000, false, "i",playerid);
return 1;
}
if(busjob[playerid] == 5){
busjob[playerid] = 6;
TogglePlayerControllable(playerid,0);
SetPlayerCheckpoint(playerid,1718.1519,-1355.8612,13.0379,10);
SendClientMessage(playerid, -1,"| INFO | Os passageiros estão saindo e/ou entrando no ônibus! Aguarde...");
timerbus[playerid] = SetTimerEx("rotabus", 1000, false, "i",playerid);
return 1;
}
if(busjob[playerid] == 6){
busjob[playerid] = 7;
TogglePlayerControllable(playerid,0);
SetPlayerCheckpoint(playerid,1515.8977,-1157.4445,23.5693,10);
SendClientMessage(playerid, -1,"| INFO | Os passageiros estão saindo e/ou entrando no ônibus! Aguarde...");
timerbus[playerid] = SetTimerEx("rotabus", 1000, false, "i",playerid);
return 1;
}
if(busjob[playerid] == 7){
busjob[playerid] = 8;
TogglePlayerControllable(playerid,0);
SetPlayerCheckpoint(playerid,1007.3337,-1137.6353,23.3041,10);
SendClientMessage(playerid, -1,"| INFO | Os passageiros estão saindo e/ou entrando no ônibus! Aguarde...");
timerbus[playerid] = SetTimerEx("rotabus", 1000, false, "i",playerid);
return 1;
}
if(busjob[playerid] == 8){
busjob[playerid] = 9;
TogglePlayerControllable(playerid,0);
SetPlayerCheckpoint(playerid,913.9140,-1512.6134,13.0294,10);
SendClientMessage(playerid, -1,"| INFO | Os passageiros estão saindo e/ou entrando no ônibus! Aguarde...");
timerbus[playerid] = SetTimerEx("rotabus", 1000, false, "i",playerid);
return 1;
}
if(busjob[playerid] == 9){
busjob[playerid] = 10;
TogglePlayerControllable(playerid,0);
SetPlayerCheckpoint(playerid,668.9059,-1735.8870,13.1442,10);
SendClientMessage(playerid, -1,"| INFO | Os passageiros estão saindo e/ou entrando no ônibus! Aguarde...");
timerbus[playerid] = SetTimerEx("rotabus", 1000, false, "i",playerid);
return 1;
}
if(busjob[playerid] == 10){
busjob[playerid] = 11;
TogglePlayerControllable(playerid,0);
SetPlayerCheckpoint(playerid,716.0936,-1323.2404,13.0542,10);
SendClientMessage(playerid, -1,"| INFO | Os passageiros estão saindo e/ou entrando no ônibus! Aguarde...");
timerbus[playerid] = SetTimerEx("rotabus", 1000, false, "i",playerid);
return 1;
}
if(busjob[playerid] == 11){
busjob[playerid] = 12;
TogglePlayerControllable(playerid,0);
SetPlayerCheckpoint(playerid,1105.4869,-1284.3621,13.0984,10);
SendClientMessage(playerid, -1,"| INFO | Os passageiros estão saindo e/ou entrando no ônibus! Aguarde...");
timerbus[playerid] = SetTimerEx("rotabus", 1000, false, "i",playerid);
return 1;
}
if(busjob[playerid] == 12){
busjob[playerid] = 13;
TogglePlayerControllable(playerid,0);
SetPlayerCheckpoint(playerid,1248.8213,-1152.4312,23.2720,10);
SendClientMessage(playerid, -1,"| INFO | Os passageiros estão saindo e/ou entrando no ônibus! Aguarde...");
timerbus[playerid] = SetTimerEx("rotabus", 1000, false, "i",playerid);
return 1;
}
if(busjob[playerid] == 13){
busjob[playerid] = 14;
TogglePlayerControllable(playerid,0);
SetPlayerCheckpoint(playerid,1598.3813,-1164.2426,23.5697,10);
SendClientMessage(playerid, -1,"| INFO | Os passageiros estão saindo e/ou entrando no ônibus! Aguarde...");
timerbus[playerid] = SetTimerEx("rotabus", 1000, false, "i",playerid);
return 1;
}
if(busjob[playerid] == 14){
busjob[playerid] = 15;
TogglePlayerControllable(playerid,0);
SetPlayerCheckpoint(playerid,1931.6448,-1139.5239,24.7676,10);
SendClientMessage(playerid, -1,"| INFO | Os passageiros estão saindo e/ou entrando no ônibus! Aguarde...");
timerbus[playerid] = SetTimerEx("rotabus", 1000, false, "i",playerid);
return 1;
}
if(busjob[playerid] == 15){
busjob[playerid] = 16;
TogglePlayerControllable(playerid,0);
SetPlayerCheckpoint(playerid,2113.3770,-1304.4203,23.5052,10);
SendClientMessage(playerid, -1,"| INFO | Os passageiros estão saindo e/ou entrando no ônibus! Aguarde...");
timerbus[playerid] = SetTimerEx("rotabus", 1000, false, "i",playerid);
return 1;
}
if(busjob[playerid] == 16){
busjob[playerid] = 17;
TogglePlayerControllable(playerid,0);
SetPlayerCheckpoint(playerid,2349.2502,-1304.5952,23.6209,10);
SendClientMessage(playerid, -1,"| INFO | Os passageiros estão saindo e/ou entrando no ônibus! Aguarde...");
timerbus[playerid] = SetTimerEx("rotabus", 1000, false, "i",playerid);
return 1;
}
if(busjob[playerid] == 17){
busjob[playerid] = 18;
TogglePlayerControllable(playerid,0);
SetPlayerCheckpoint(playerid,2598.7876,-1260.2065,46.9628,10);
SendClientMessage(playerid, -1,"| INFO | Os passageiros estão saindo e/ou entrando no ônibus! Aguarde...");
timerbus[playerid] = SetTimerEx("rotabus", 1000, false, "i",playerid);
return 1;
}
if(busjob[playerid] == 18){
busjob[playerid] = 19;
TogglePlayerControllable(playerid,0);
SetPlayerCheckpoint(playerid,2677.5920,-1051.4144,69.0702,10);
SendClientMessage(playerid, -1,"| INFO | Os passageiros estão saindo e/ou entrando no ônibus! Aguarde...");
timerbus[playerid] = SetTimerEx("rotabus", 1000, false, "i",playerid);
return 1;
}
if(busjob[playerid] == 19){
busjob[playerid] = 20;
TogglePlayerControllable(playerid,0);
SetPlayerCheckpoint(playerid,2834.8110,-1140.3776,24.4193,10);
SendClientMessage(playerid, -1,"| INFO | Os passageiros estão saindo e/ou entrando no ônibus! Aguarde...");
timerbus[playerid] = SetTimerEx("rotabus", 1000, false, "i",playerid);
return 1;
}
if(busjob[playerid] == 20){
busjob[playerid] = 21;
TogglePlayerControllable(playerid,0);
SetPlayerCheckpoint(playerid,2830.0747,-1602.7433,10.5848,10);
SendClientMessage(playerid, -1,"| INFO | Os passageiros estão saindo e/ou entrando no ônibus! Aguarde...");
timerbus[playerid] = SetTimerEx("rotabus", 1000, false, "i",playerid);
return 1;
}
if(busjob[playerid] == 21){
busjob[playerid] = 22;
TogglePlayerControllable(playerid,0);
SetPlayerCheckpoint(playerid,2819.3320,-1923.2450,10.5925,10);
SendClientMessage(playerid, -1,"| INFO | Os passageiros estão saindo e/ou entrando no ônibus! Aguarde...");
timerbus[playerid] = SetTimerEx("rotabus", 1000, false, "i",playerid);
return 1;
}
if(busjob[playerid] == 22){
busjob[playerid] = 23;
TogglePlayerControllable(playerid,0);
SetPlayerCheckpoint(playerid,2646.7800,-2151.7402,10.5687,10);
SendClientMessage(playerid, -1,"| INFO | Os passageiros estão saindo e/ou entrando no ônibus! Aguarde...");
timerbus[playerid] = SetTimerEx("rotabus", 1000, false, "i",playerid);
return 1;
}
if(busjob[playerid] == 23){
busjob[playerid] = 0;
DisablePlayerCheckpoint(playerid);
SendClientMessage(playerid, -1,"| INFO | Serviço finalizado! Você recebeu R$300 por ter completado todo o percurso!");
SendClientMessage(playerid, -1,"| INFO | Volte ao spawn da profissão e inicie o serviço para fazer o percurso novamente use /busjob!");
fiz um script um trabalho de maquinista então ao chegar ao check point queria saber se existe alguém meio de parar o trem instantaneamente pois ele e difícil de parar resolvi fazer assim mas não deu certo
Código:
#define trem_included
forward parada(playerid);
new tremjob[256];
new timertrem[MAX_PLAYERS];
new rotatremjob[MAX_PLAYERS] = 0;
stock trem_Init(){
AddStaticVehicleEx(537,1700.0,-1950.0,13.0,0.0,1,1,60); // trem
AddStaticVehicleEx(569,1690.0,-1950.0,13.0,0.0,1,1,60);//vagao
return 1;
}
stock trem_OnPlayerConnect(playerid){
rotatremjob[playerid] = 0;
return 1;
}
CMD:tremjob(playerid){
if(corridaativa)return SendClientMessage(playerid,0x00FFFFFF,"voce nao pode usar esse comando agora");
if(GetVehicleModel(GetPlayerVehicleID(playerid)) == 537){
SendClientMessage(playerid, -1,"| INFO | Serviço iniciado com sucesso! Siga o ícone vermelho no mapa para chegar ao primeiro ponto de ônibus!");
if(tremjob[playerid] == 0){
tremjob[playerid] = 1;
new vehicleid = GetPlayerVehicleID(playerid);
SetPlayerCheckpoint(playerid,1742.7112,-1953.7690,15.0995, 3.0);
SetVehicleVelocity(vehicleid, 0.0,0.0,0.0);
}
}
SendClientMessage(playerid, -1,"| ERRO | Você tem que estar em uma ônibus para começar a rota!");
return 1;
}
stock trem_OnPlayerEnterCheckpoint(playerid){
new vehicleid = GetPlayerVehicleID(playerid);
if(GetVehicleModel(GetPlayerVehicleID(playerid)) == 537){
if(tremjob[playerid] == 1){
tremjob[playerid] = 2;
TogglePlayerControllable(playerid,0);
SetPlayerCheckpoint(playerid,2864.7500,1297.3916,12.3495,10);
SendClientMessage(playerid, -1,"| INFO | 1/6 Aguarde...");
SetVehicleVelocity(vehicleid,0.0,0.0,0.0);
return 1;
}
if(tremjob[playerid] == 2){
tremjob[playerid] = 3;
TogglePlayerControllable(playerid,0);
SetPlayerCheckpoint(playerid,1435.2920,2632.2500,12.3495,10);
SendClientMessage(playerid, -1,"| INFO | 2/6 Aguarde...");
SetVehicleVelocity(vehicleid,0.0,0.0,0.0);
return 1;
}
if(tremjob[playerid] == 3){
tremjob[playerid] = 4;
TogglePlayerControllable(playerid,0);
SetPlayerCheckpoint(playerid,574.0625,1268.7861,13.4983,10);
SendClientMessage(playerid, -1,"| INFO | 3/6 Aguarde...");
SetVehicleVelocity(vehicleid,0.0,0.0,0.0);
timertrem[playerid] = SetTimerEx("parada", 10000, false, "i",playerid);
return 1;
}
if(tremjob[playerid] == 4){
tremjob[playerid] = 5;
TogglePlayerControllable(playerid,0);
SetPlayerCheckpoint(playerid,-1944.2625,124.2805,27.2245,10);
SendClientMessage(playerid, -1,"| INFO | 4/6 Aguarde...");
SetVehicleVelocity(vehicleid,0.0,0.0,0.0);
timertrem[playerid] = SetTimerEx("parada", 10000, false, "i",playerid);
return 1;
}
if(tremjob[playerid] == 5){
tremjob[playerid] = 6;
TogglePlayerControllable(playerid,0);
SetPlayerCheckpoint(playerid,818.5896,-1369.9158,-0.0131,10);
SendClientMessage(playerid, -1,"| INFO | 5/6 Aguarde...");
SetVehicleVelocity(vehicleid,0.0,0.0,0.0);
timertrem[playerid] = SetTimerEx("parada", 10000, false, "i",playerid);
return 1;
}
if(tremjob[playerid] == 6){
tremjob[playerid] = 0;
DisablePlayerCheckpoint(playerid);
SendClientMessage(playerid, -1,"| INFO | 6/6 Serviço finalizado! Você recebeu R$500 por ter completado todo o percurso!");
SendClientMessage(playerid, -1,"| INFO | Volte ao spawn da profissão e inicie o serviço para fazer o percurso novamente use /tremjob!");
CallRemoteFunction("dinheiro_GivePlayerMoney", "dd", playerid, 500);
}
}
return 1;
}
stock trem_parada(playerid)
{
timertrem[playerid] = SetTimerEx("MsgBus", 100, false, "i",playerid);
TogglePlayerControllable(playerid,1);
return 1;
}