PDA

Просмотр полной версии : [Вопрос] TimerFix



Mr_LemoneZ
22.01.2017, 18:42
После установки постоянно флудит в консоль:

(TimerFix) WARNING: The function "UpdateTimers" took 14ms to execute! This will affect other timers.
Но ведь это нормально, что ему не нравится?

ziggi
22.01.2017, 18:56
Можно отключить проверку производительности добавив перед подключением timerfix это:

#define TIMER_FIX_PERFORMANCE_CHECKS false

Но это не решение проблемы - медленного выполнения кода, это лишь сокрытие этого сообщения.

P.S. Вообще, эту библиотеку лучше не использовать, но если точные таймеры очень нужны, то лучше воспользоваться плагином (https://github.com/udan11/samp-plugin-timerfix) (но даже этот плагин не решает всех проблем с таймерами).

Mr_LemoneZ
22.01.2017, 19:25
Медленного? Он мне даже вот на это ругался:

@_Kick(playerid)
{
return Kick(playerid);
}
Это скорее всего из-за моего древнего ПК, на котором даже браузер тормозит.

ziggi
22.01.2017, 19:37
Медленного? Он мне даже вот на это ругался:

@_Kick(playerid)
{
return Kick(playerid);
}
Это скорее всего из-за моего древнего ПК, на котором даже браузер тормозит.

Покажи весь код. Ты же понимаешь, что эта библиотека объединяет все таймеры в один?

Mr_LemoneZ
22.01.2017, 19:46
Покажи весь код. Ты же понимаешь, что эта библиотека объединяет все таймеры в один?

Не знал об этом. А какой именно кусок кода нужно показать, где задаётся таймер?

ziggi
22.01.2017, 20:08
Не знал об этом.

Дак ты понял почему выходит это сообщение?


А какой именно кусок кода нужно показать, где задаётся таймер?

Все public функции, для которых вызывается SetTimer.

Mr_LemoneZ
22.01.2017, 22:03
Дак ты понял почему выходит это сообщение?

Уже понял.


Все public функции, для которых вызывается SetTimer.



publics SetHeadpiece(playerid)
{
SetPVarInt(playerid, !"headpiece", 1);
SpawnPlayer(playerid);

SetPlayerVirtualWorld(playerid, playerid);
SetPlayerPos(playerid, 1787.3605, -1311.8920, 120.2656);
SetPlayerFacingAngle(playerid, 180.0);
SetPlayerCameraPos(playerid, 1860.065673, -1388.359985, 136.248153);
SetPlayerCameraLookAt(playerid, 1855.589721, -1386.343872, 137.197555);
return 1;
}

@_RegistrationAndLoginTimer(playerid, bool:type);
@_RegistrationAndLoginTimer(playerid, bool:type)
{
if(type)
SendClientMessage(playerid, COLOR_LRED,!"Время не авторизацию ограничено! \
Для выхода введите {FFA500}/q{FF4E4E}.");
else
SendClientMessage(playerid, COLOR_LRED, !"Время не регистрацию ограничено! \
Для выхода введите {FFA500}/q{FF4E4E}.");
return KickEx(playerid);
}

publics UpdateTimers()
{
new time = gettime();
if(timers[0] <= time) // Ежесекундный
{
gettime(hours, minutes, seconds);
if(!seconds && !minutes)
PayDay();

foreach(new i : Player)
{
if(GetPlayerMoney(i) != player_info[i][pMoney])
{
ResetPlayerMoney(i);
GivePlayerMoney(i, player_info[i][pMoney]);
}
}
timers[0] ++;
}
if(timers[1] <= time) // Каждые 20 секунд
{
foreach(new i : Player)
{
if(player_flood_attempts{i})
player_flood_attempts{i} = 0;
}
timers[1] = gettime() + 20;
}
return SetTimer(!"UpdateTimers", 200, false);
}

ziggi
22.01.2017, 22:19
publics UpdateTimers()
{
new time = gettime();
if(timers[0] <= time) // Ежесекундный
{
gettime(hours, minutes, seconds);
if(!seconds && !minutes)
PayDay();

foreach(new i : Player)
{
if(GetPlayerMoney(i) != player_info[i][pMoney])
{
ResetPlayerMoney(i);
GivePlayerMoney(i, player_info[i][pMoney]);
}
}
timers[0] ++;
}
if(timers[1] <= time) // Каждые 20 секунд
{
foreach(new i : Player)
{
if(player_flood_attempts{i})
player_flood_attempts{i} = 0;
}
timers[1] = gettime() + 20;
}
return SetTimer(!"UpdateTimers", 200, false);
}


Попробуй создать нормальный таймер, а не этот позор. Я к тому, что для подобных таймеров в функции SetTimer существует специальный аргумент - repeating, с помощью которого и нужно создавать подобные таймеры.

Mr_LemoneZ
22.01.2017, 22:29
Попробуй создать нормальный таймер, а не этот позор. Я к тому, что для подобных таймеров в функции SetTimer существует специальный аргумент - repeating, с помощью которого и нужно создавать подобные таймеры.

Но если создавать обычные таймеры, то они уже не будет такими точными. Например, у счётчика AFK будет большая погрешность (это я говорю, если не использовать инклуд).

DeimoS
22.01.2017, 22:55
Для чего тебе точность в странной реализации античита на деньги и в, как я понимаю, антифлуде?
И почему нельзя для кода, который срабатывает раз в 20 секунд, создать таймер на 20 секунд, а не делать винегрет в одном таймере?

Mr_LemoneZ
22.01.2017, 23:09
Для чего тебе точность в странной реализации античита на деньги и в, как я понимаю, антифлуде?
И почему нельзя для кода, который срабатывает раз в 20 секунд, создать таймер на 20 секунд, а не делать винегрет в одном таймере?

Почему же античит на деньги странный? Вызывается он каждую секунду и проверяет, столько же денег у игрока, сколько записано в массиве или нет. Точность понадобится для подсчёта того, сколько секунд игрок находится в AFK, а именно, будет считать каждую секунду и складывать.

ziggi
22.01.2017, 23:17
Точность понадобится для подсчёта того, сколько секунд игрок находится в AFK, а именно, будет считать каждую секунду и складывать.

Запоминаешь время входа игрока в AFK и периодически показываешь время, вычитая текущее время из запомненного, точные таймеры здесь не нужны.

На самом деле, если всё нормально реализовывать, точные таймеры вообще не нужны.

Mr_LemoneZ
22.01.2017, 23:27
Запоминаешь время входа игрока в AFK и периодически показываешь время, вычитая текущее время из запомненного, точные таймеры здесь не нужны.

Что-то об этом даже не подумал. Ладно, закрывайте.

DeimoS
23.01.2017, 00:10
Почему же античит на деньги странный? Вызывается он каждую секунду и проверяет, столько же денег у игрока, сколько записано в массиве или нет.

Что мешает просто хранить деньги на стороне сервера и не париться по поводу того, сколько денег у игрока?
То бишь, вот весь античит:

stock ac_money_GivePlayerMoney(playerid, money)
{
pInfo[playerid][pMoney] += money;
ResetPlayerMoney(playerid);
return GivePlayerMoney(playerid, pInfo[playerid][pMoney]);
}
#if defined _ALS_GivePlayerMoney
#undef GivePlayerMoney
#else
#define _ALS_GivePlayerMoney
#endif
#define GivePlayerMoney ac_money_GivePlayerMoney
Сколько бы игрок не читерил денег, при попытке воспользоваться ими, ему вернётся старое значение

Mr_LemoneZ
23.01.2017, 00:18
Что мешает просто хранить деньги на стороне сервера и не париться по поводу того, сколько денег у игрока?
То бишь, вот весь античит:

stock ac_money_GivePlayerMoney(playerid, money)
{
pInfo[playerid][pMoney] += money;
ResetPlayerMoney(playerid);
return GivePlayerMoney(playerid, pInfo[playerid][pMoney]);
}
#if defined _ALS_GivePlayerMoney
#undef GivePlayerMoney
#else
#define _ALS_GivePlayerMoney
#endif
#define GivePlayerMoney ac_money_GivePlayerMoney
Сколько бы игрок не читерил денег, при попытке воспользоваться ими, ему вернётся старое значение

Понял, благодарю.