А как ты архитектуру нарисовал красиво, это прога какая то или сам ручками?
- - - Добавлено - - -
в джите не шарю как там по коду предложки делать или ещё что то подобное, поэтому отпишусь из своего опыта по античиту тута
твой код к примеру
Почему бы не ускорить всё и сделать к примеру так:
PHP код:
#if defined _armour_hack_protection
#endinput
#endif
#define _armour_hack_protection
#if !defined ARMOUR_HACK_UPDATE_INTERVAL
#define ARMOUR_HACK_UPDATE_INTERVAL 1000
#endif
forward ahp_CheckPlayer(playerid);
static ahp_timer[MAX_PLAYERS], ahp_tick[MAX_PLAYERS char];
stock ahp_OnPlayerLogin(playerid)
{
ahp_timer[playerid] = SetTimerEx(!"ahp_CheckPlayer",
ARMOUR_HACK_UPDATE_INTERVAL, true, !"i", playerid); // пусть сам циклится, чё теребонькать то?))
return 1;
}
public ahp_CheckPlayer(playerid)
{
new
Float:player_armour,
Float:account_armour;
GetPlayerArmour(playerid, player_armour);
GetAccountArmour(playerid, account_armour);
if(ahp_tick[playerid] > 0) // зачем теребонькать функцию таймера, когда можно сделать легонько, переменной
{
ahp_tick[playerid]--;
goto skip_check;
}
if(_:player_armour == _:account_armour) goto skip_check; // floatcmp не вызываем если броня не менялась(самый частый юз алгоритма будет)
else if(player_armour < account_armour) // второй по счёту юз алгоритма если на этом сервере будут играть адекватные игроки
{
SetAccountArmour(playerid, player_armour);
}
else if(player_armour > account_armour) // ну и третий если обнаружим читера(самый мало срабатываемый)
{
Kick(playerid, KICK_TEXT_REASON"\
Ïîäîçðåíèå â ÷èòåðñòâå, êîä: #ahp_CP"KICK_TEXT_TIP);
return 0;
}
skip_check:
// можно убрать goto и заменить возвратами; писал goto пока не увидел что ещё таймер вызывается частенько
return 1;
}
stock ahp_GetPlayerArmour(playerid, &Float:armour)
{
return GetAccountArmour(playerid, armour);
}
#if defined _ALS_GetPlayerArmour
#undef GetPlayerArmour
#else
#define _ALS_GetPlayerArmour
#endif
#define GetPlayerArmour ahp_GetPlayerArmour
stock ahp_SetPlayerArmour(playerid, Float:armour)
{
new result; // зачем тут 1 устанавливать, если ниже однозначно установится какое то значение из SetPlayerArmour
ahp_tick[playerid] = 2; //2 секунды раз таймер односекундый
SetAccountArmour(playerid, armour);
result = SetPlayerArmour(playerid, armour);
return result;
}
#if defined _ALS_SetPlayerArmour
#undef SetPlayerArmour
#else
#define _ALS_SetPlayerArmour
#endif
#define SetPlayerArmour ahp_SetPlayerArmour
stock ahp_OnPlayerDisconnect(playerid)
{
KillTimer(ahp_timer[playerid]); // зачем было тогда тут ставить килл если таймер не циклился, в прочем теперь он тут пригодится...
return 1;
}
А и кстате почему каждый античит в отдельном таймере? Зачем плодить таймеры как кроликов?
Один глобальный таймер и индивидуальный один каждому игроку я думаю вполне норма будет...