29/03/2023 15:49
(29/03/2023 14:11)White_Blue Escreveu:(29/03/2023 13:57)hiwyn Escreveu:(29/03/2023 11:59)White_Blue Escreveu:(29/03/2023 11:37)hiwyn Escreveu:(29/03/2023 11:11)RodrigoMSR Escreveu: Certo.
GetTickDiff está no timer de 1 segundo, não na OnPlayerUpdate, então mesmo que seja um pouco mais lento, não vai afetar em nada. E mesmo se estivesse, ainda é melhor que usar gettime.
Benchmark:
Código:new tick = GetTickCount();
for(new i = 0; i < 2000000; i++)
{
gettime();
}
printf("gettime: %dms", GetTickCount() - tick);
tick = GetTickCount();
for(new i = 0; i < 2000000; i++)
{
GetTickDiff(GetTickCount(), tick);
}
printf("GetTickCount + GetTickDiff: %dms", GetTickCount() - tick);
Resultado (Linux):
gettime: 1676ms
GetTickCount + GetTickDiff: 87ms
No Windows a diferença é bem menor, mas no Linux foi quase 20x mais lento.
muito obrigado, melhor impossivel!
eu fiz certo a resolução pra fugir do overflow?
mais uma coisa, pensei numa parada pra deixar o onplayerupdate mais leve
Código:public OnPlayerUpdate(playerid)
{
if(updatingAFKTime[playerid] == false) {
AFKTime[playerid] = GetTickCount();
updatingAFKTime[playerid] = true;
SetTimerEx("ResetUpdatingAFKTime", 250, false, "i", playerid);
}
return true;
}
public ResetUpdatingAFKTime(playerid) {
updatingAFKTime[playerid] = false;
}
Será que é bom?
Não vejo por que usar a OnPlayerUpdate para esse tipo de coisa, já que ela é chamada milhares de vezes durante a execução do programa e um timer é bem mais otimizado para esse tipo de coisa.
se eu colocar esse
em qualquer timer a verificação de 1 segundoCódigo:AFKTime[playerid] = GetTickCount();
Código:// ongamemodeinit
SetTimerEx("PlayerOneSec", 1000, true, "i", playerid);
Código:public PlayerOneSec(i) {
// check paused
if(paused[i] == false) {
// 3 segundos sem resposta.
if(GetTickCount() - AFKTime[i] > 3000) { OnPlayerPause(i); }
}
if(paused[i] == true) {
if(GetTickCount() - AFKTime[i] < 3000) { OnPlayerUnpause(i); }
}
não funciona, não sei pq, mas nunca detecta qnd o player fica de pause
você consegue fazer funcionar fora do OnPlayerUpdate?
A OnGameModeInit não tem o parâmetro playerid, use na OnPlayerConnect ou na OnPlayerSpawn.
Código PHP:new TimerPause[MAX_PLAYERS] = 0;
public OnPlayerConnect(playerid) {
TimerPause[playerid] = SetTimerEx("Seu_Timer", 1000, true, "d", playerid);
return 1;
}
public OnPlayerDisconnect(playerid, reason) {
KillTimer(TimerPause[playerid]);
return 1;
}
eu escrevi errado, ta no onplayerconnect mesmo, mas testa você aí
usa o meu codigo em um timer que não seja o onplayerupdate ve se alguma hora vai detectar o player como afk
não funciona