Como vejo muitas dificuldades nas diferenças entre SetTimer e SetTimerEx, venho aqui trazer um tutorial simples para vocês.
1. De certeza você já ouviu falar daquela expressão: "SetTimer é para todos os jogadores e SetTimerEx é para cada um." Isso está meio que errado. Não é pra isso que foi criado o SetTimer e SetTimerEx.
2. Usamos SetTimer e SetTimerEx quando queremos chamar uma função com atraso, ou seja, por um determinado tempo depois.
3.SetTimer: Sem parametros. SetTimerEx: Com parâmetros.
Explicação:
SetTimer:
Código PHP:
SetTimer(NomeFuncao, Tempo, Repetição);
NomeFuncao: Será o nome de sua função pública. Tempo: O tempo de duração que você quer chamar ela. Repetição: true = repetir sempre, false = apenas uma vez.
NomeFuncao: Será o nome de sua função pública. Tempo: O tempo de duração que você quer chamar ela. Repetição: true = repetir sempre, false = apenas uma vez. formato: tipos de valores. {Float,_}:... : parâmetros (seguindo o formato definido anteriormente).
Até agora, se você é iniciante, você provavelmente está pensando: Eu não entendi nada! Enfim, para isso estou aqui, vou explicar na sua experiência dia-dia.
Vamos imaginar na sua casa: O Microondas, você coloca algo apenas para esquentar, programa ele pra 1 minuto e a contagem começa a descer até chegar ao 0... ( porém o SetTimer(Ex) é incrementando(subindo), e não descendo.
Outro exemplo: você está brincando de esconde-esconde e tem que contar até 10. Quando chegar ao 10, você já pode procurar eles..
Isso é o SetTimer(Ex). Você faz um SetTimer que 'conte' até 10, e quando chegar no 10, irá executar a função de procurar eles.
Agora digamos que você tenha roubado e parou de contar antes dos 10 segundos. Nesse caso, utilizamos o KillTimer parando o SetTimer(Ex)!
Esse é o conceito de SetTimer(Ex)... Ele vai até onde você mandar! Vamos a uns exemplos práticos para entendermos melhor!
Diminuindo tempo pensando em milissegundos.
O tempo do SetTimer(Ex) é feito em milissegundos. Ou Seja:
Código PHP:
1 segundo = 1000 60 segundos = 60000 // [...]
Se você precisa de 2 minutos e 27 segundos por exemplo, sem gerador ou algo do tipo você teria que bater muita cabeça até conseguir. Para facilitar seu trabalho, iniciante, você bota isso no topo do seu GM/FS. Não me lembro do criador do code, mas vou deixar aqui os créditos pro Y_Less. Se alguem souber de quem criou isso, coloca nos comentários
É claro que você não usaria pra dias, semanas, meses, anos, década e muito menos seculos. Para isso usamos GetTimer, mas fica pra outra explicação.
Agora sim! Com esse código definido, fica muito mais fácil trabalharmos! Vamos ver na prática.
Como ficaria o exemplo: "Você está brincando de esconde-esconde e tem que contar até 10. Quando chegar ao 10, você já pode procurar eles.." na prática?
SetTimer
Código PHP:
SetTimer("Contando", segundos(10), false); // Veja como ficou mais fácil definir o tempo. Mas você também pode optar pelo normal: SetTimer("Contando", 10000, false); // Ele cria uma função contando 10 segundos sem repetição!
// Como SetTimer não tem parametro, nunca passamos valor para ela. Sempre utilizaremos ( ).
forward Contando(); public Contando()// Quando completar os 10 segundos, funciona a callback. { print("Contei até 10 segundos ! Agora posso começar a procurar!"); return true; }
Outro exemplo muito conhecido, o sistema de payday:
Código PHP:
public OnGameModeInit() { SetTimer("PayDay", horas(1), true); /* Criamos um Timer com o nome da função PayDay Ele irá contar até 1 hora. / true = ele irá se repetir depois de terminar. ( voltará a funcionar sozinho ).*/ return true; }
forward PayDay(); public PayDay() // Quando completar as 1 hora, funciona a Callback: { for(new i; i < MAX_PLAYERS; ++i) // Loop - Todos os Players { // Mensagem para todos os players. SendClientMessage(i, -1, "Você recebeu o PayDay!"); } return true; }
Realmente, SetTimer poderia ser para todos os players(usando loop). Mas não é isso o conceito dela. Ela vai muito além disso, como utilizar pra sistema de salvamentos ou outras coisas.
Código PHP:
for(new i; i < MAX_PLAYERS; ++i) { SendClientMessage(i, -1, "Você recebeu o PayDay!"); }
Para quem não entendeu isso, procure por tutoriais de Loop. MAX_PLAYERS definido por padrão é 500... Ou seja vai pegar 500 números que são os slots. Até aqui tudo bem. Mas porque trocou no meu SendClientMessage playerid por i ?
playerid = ID DO PLAYER! LEMBREM-SE DISSO!
O Loop, portanto, vai dar 500 voltas... e vai mandar para todos os ID's.
O ID 0 que é o Fulano com Nick A...
Pro ID 1 que é o Fulano com Nick B...
Assim vai até os 500 players(slots).
SetTimerEx
Existem vários exemplos. Mais vou dar apenas dois. Esse, é um simples bloqueio de comando. Depois de usar, ele permitirá que você utilize o comando de novo só depois de 15 segundos.
Código PHP:
new bool:BloquearComando[MAX_PLAYERS char];
get_cmd_noparams(bloquearcomando) // ICMD ( mesma coisa que /bloquearcomando ) { if(BloquearComando{playerid} == true) return SendClientMessage(playerid, -1, "Você já utilizou o comando! Aguarde 15 segundos para utlizar de novo.");
BloquearComando{playerid} = true; SetTimerEx("BloqComando", segundos(15), false, "i", playerid); // Ele irá criar uma função de 15 segundos e não vai ficar se repetindo. // Como eu falei no meu BIZU: playerid carrega o ID do Player. Ele vai levar o ID do player para a função. SendClientMessage(playerid, -1, "Você Utilizou o Comando: /BloquearComando"); return true; }
forward BloqComando(playerid); public BloqComando(playerid) // playerid CARREGA O ID DO PLAYER ! { BloquearComando{playerid} = false; SendClientMessage(playerid, -1, "Já se passou 15 segundos! Agora você já pode utilizar o comando!"); return true; }
Agora que tal um sistema de carregar suas informações simples?
Código PHP:
get_cmd_noparams(minhasinfo) // ICMD ( mesma coisa que /minhasinfo ) { new Idade = 18; new Float:PontosNaEscola = 9.0; // playerid = seu ID SetTimerEx("CarregInfo", 5000, true, "iif", playerid, Idade, PontosNaEscola); return true; }
Temporizadores não são 100% precisos e sim 75%;
Uso de muitos temporizadores aumentará o uso de Memória/CPU.
Lembrando daqueles "i", "iif", etc.. Sugiro ver melhor os tutoriais de Format.
Código:
i Integer.
d Integer.
a Array. The next parameter must be an integer ("i") with the array's size. [CURRENTLY UNUSABLE]
s String. [CURRENTLY UNUSABLE]
f Float.
b Boolean (true/false).
Olá users, estou enfrentando um problema um tanto quanto inexplicável.
Quando adiciono a linha abaixo em OnGameModeInit, o samp-server carrega algumas funções e logo em seguida fecha:
Código PHP:
LimitGlobalChatRadius(100.0);
Esse problema só ocorre quando eu adiciono o código citado, se eu o remover, o servidor abre normalmente.
O final do log, é apresentado os veículos carregados, e uma mensagem de conexão antes de fechar:
Código PHP:
Number of vehicle models: 41 [connection] 127.0.0.1:60310 requests connection cookie.
Citar:Em teoria da informação, a distância Levenshtein ou distância de edição entre dois "strings" (duas sequências de caracteres) é dada pelo número mínimo de operações necessárias para transformar um string no outro. Entendemos por "operações" a inserção, deleção ou substituição de um carácter. O nome advém do cientista russoVladimir Levenshtein, que considerou esta distância já em 1965. É muito útil para aplicações que precisam determinar quão semelhantes dois strings são, como é por exemplo o caso com os verificadores ortográficos.
Essa include se utiliza da distância de Levenshtein para adivinhar o comando que o player gostaria de ter digitado.
Como utilizar:
Código:
public OnPlayerCommandPerformed(playerid, cmdtext[], success) {
if (!success) {
new
guessCmd[32];
Creditos:
- Por: Kirima pela include guess-command.inc
- Southclaws pela Função da Distância de Levenshtein
- Y_Less por y_commands
- Zeex por amx_assembly
Olá, mais um projeto recuperado do antigo Fórum. Créditos ao bruxo00.
doxIT!
Este simples filterscript serve para os administradores do servidor terem mais informações sobre os jogadores. Recorrendo ao comando /dox <playerid> o administrador tem acesso a:
Código PHP:
DNS Reverso Username da Internet Cidade País Código do País Internet Server Provider Latitude Longitude TimeZone Organização Região Nome da Região Código Postal Se está a usar ou não VPN
Este Filterscript é extremamente fácil de adaptar a qualquer gamemode.
A API de verificar se o IP é VPN tem um limite de acessos por dia. Hoje já excedi esse limite por isso é que aparece que o meu IP está banido.
A versão antiga requeria hospedar um .php. Esta versão não é preciso usar nenhum .php, todo o scrapping é feito diretamente no filterscript.
COMO FUNCIONA A DETEÇÃO DE VPN
Citando diretamente a API:
Código:
Given an IP address, the system will return a probabilistic value (between a value of 0 and 1) of how likely the IP is a VPN / proxy / hosting / bad IP. A value of 1 means that IP is explicitly banned (a web host, VPN, or TOR node) by our dynamic lists. Otherwise, the output will return a real number value between 0 and 1, of how likely the IP is bad / VPN / proxy, which is inferred through machine learning & probability theory techniques using dynamic checks with large datasets. Billions of new records are parsed each month to ensure the datasets have the latest information and old records automatically expire. The system is designed to be efficient, fast, simple, and accurate.
Inserido por: Levi.M - 24/02/2021 09:37 - Fórum: Includes
- Sem Respostas
Mais um sistema recuperado da Fórum SA-MP. Créditos ao ipsBruno.
Bini 4
Após algumas semanas de desenvolvimento da nova versão de Bini. Finalmente consigo acaba-la.
A nova versão de Bini não conta com muitas alterações, exceto a engine de manipulação de arquivos na memória. Desta vez utiliza memória cache mais avançada usando Setproperty e Getproperty!
Por mais que não seja necessário o uso de INI_Save. Aconselha o USO DA MESMA, pois em caso de crashs ou eventuais bugs no seu servidor decorrente em outros fatores, alguns arquivos podem ser perdidos !!
Velocidade
Com esta nova engine, a velocidade foi bastante aprimorada. O que já era rápido ficou mais rápido ainda.
Código PHP:
[00:57:47] Bini -> write 3304 ms - read 32 ms - read/write 3336 ms [00:57:47] Dof2 -> write 3557 ms - read 258 ms - read/write 3815 ms
A função write apesar de ser mais rápida que todos os outros sistemas de arquivos ainda precisa de alguns ajustes de velocidade e estabilidade, então eventuais atualizações estão para surgir
printf("Bini -> write %d ms - read %d ms - read/write %d ms", bin[0], bin[1], bin[2]); printf("Dof2 -> write %d ms - read %d ms - read/write %d ms", dof[0], dof[1], dof[2]); return true; }
public OnFilterScriptExit() { DOF2_Exit(); INI_Exit(); return true; }
Usando
Para usar Bini é bastante simples! Basta fazer o seguinte:
Escrevendo:
Números
Código PHP:
INI_WriteInt("arquivo.ini", "key", valor);
Textos
Código PHP:
INI_WriteString("arquivo.ini", "key", "valor");
Lendo valores:
Números
Código PHP:
INI_ReadInt("arquivo.ini", "key");
Textos
Código PHP:
INI_ReadString("arquivo.ini", "key");
deixe
Código PHP:
public OnFilterScriptExit() { INI_Exit(); return true; }
**Importante
- Se você tem arquivos escritos por DOF2 ou Y_Ini este sistema não será compatível pois meu sistema usa o método formal para escrita de escrita em arquivos ini, sem espaço entre as keys
Com está velocidade é permitido que você possa colocar em até 50 escritas/leituras em OnPlayerUpdate. Salve em bini.inc por favor.
Arquivo não salvando
Caso for um único arquivo, veja se o servidor não está sendo fechado corretamente. Quando você não fecha por RCON EXIT o OnGameModeExit/FilterScriptExit não são chamados e logo INI_Exit também não é !!
Caso for vários arquivos tente aumentar o valor max_lines_file para acima de 999
Exemplo:
Código PHP:
#define max_lines_file 5000
Servidor crashando
Certifique-se se antes de usar algum arquivo INI_Open/INI_READ o arquivo existe. Use
Código PHP:
if(fexist(#arquivo.ini)) // o arquivo existe
Ocupando muito AMX
Nem sempre o que ocupa muito amx é lento. Bini usa um sistema avançado de cache, onde tudo é registrado no amx em tempo real. Mas é tudo registrado no AMX, não ocupa nada de memória do seu computador. Só ocupará memória se de alguma forma outros fatores externos a Bini ultrapassarem isto.
Olá, esse é mais um sistema recuperado do antigo Fórum, Créditos ao RedMF.
Anti Cheat 1.4
Anti-fake
Anti-skin bug
Anti-fly
Anti-money
Anti-god Health & Armour hack
Anti-jetpack
God Of Cars / Mod Trol
Código PHP:
/MF - Abre o Dialog para configuração do anti cheat OBS precisa estar logado na RCON
Include usadas:
a_samp -> by SA-MP Team
zcmd -> by Zeex
bini -> by ipsBruno
O Anti Money Hack vai vim desligado caso você tenho um sistema que Salve o money dos players mantenha ele desligado para não bugar porque ele ja salva o money do player.
eae galera bom vi uns tutoriais de otimizações e vi a recomendação da include fixes
porem no log do meu server ta acusando isso:
Código:
* FIXES_PRINTF (GM):
********************************************************************************
* Could not open "DANGEROUS_SERVER_ROOT/server.cfg". Make sure your server is *
* configured to allow server root access. Either via: *
* *
* https://github.com/Misiur/YSI/raw/master/links.rar *
* *
* Or (Windows - CMD): *
* *
* cd scriptfiles *
* mklink /J DANGEROUS_SERVER_ROOT .. *
* *
* Or (Windows - PowerShell): *
* *
* cd scriptfiles *
* cmd /c mklink /J DANGEROUS_SERVER_ROOT .. *
* *
* Or (Linux): *
* *
* cd scriptfiles *
* ln -s .. DANGEROUS_SERVER_ROOT *
* *
* If you're not able to, or just don't want to make these changes you can *
* suppress the warning by defining this at the top of your mode: *
* *
* #define FIXES_ServerVarMsg 0 *
* *
* Or (preferably) disable the relevant fixes with: *
* *
* #define FIX_GetServerVarAsString 0 *
* #define FIX_GetServerVarAsFloat 0 *
* #define FIX_GetServerVarAsInt 0 *
* #define FIX_GetServerVarAsBool 0 *
* *
********************************************************************************
*** fixes.inc warning: Server var `maxplayers` (50) < `MAX_PLAYERS` (1000), wasting memory.
***
*** Disable this message with:
***
*** #define FIXES_GetMaxPlayersMsg 0
***
Filterscript '../scriptfiles/callbackfix.amx' loaded.
50
devo me atentar a isso ou se eu ignorar não terá problemas
no topo da minha gm eu declarei o seguinte:
#if defined MAX_PLAYERS
#undef MAX_PLAYERS
#endif
#define MAX_PLAYERS 50
Boa Tarde, estou com um problema sério aqui, toda vez que vou descompactar alguma Gamemode ele corrompe dando o seguinte erro:
"[font=Muli, "Helvetica Neue", Helvetica, Arial, sans-serif]Run time error 19: "File or function is not found"[/font]
O que posso fazer para resolver isso? Já formatei meu PC para 3 sistemas windows diferentes e todos dão no mesmo, encaixei em outro computador e deu certo..
Algumas vezes ele pede o arquivo msvcp120.dll, mas insiro mas mesmo assim faz o corromper, não sei o que eu faço..
Desde já agradeço
OBS: São várias Gamemodes que acontecem isso, não é só um.