Просмотр полной версии : [Вопрос] Убивает после захода на сервер.
Решил я, значит, написать античит на хп. Что-то пошло не так, и теперь при заходе на сервер меня убивает, после смерти появляюсь на Groove Street. Что делать? В интернете видел подобные вопросы, но решения так и не нашел.
OnPlayerDeath:
public OnPlayerDeath(playerid, killerid, reason)
{
for(new i = 0; i < 7; i++)
{
TextDrawHideForPlayer(playerid,Logo[i]);
}
SetPlayerHealthEx(playerid,13.31);
return 1;
}
OnPlayerSpawn:
public OnPlayerSpawn(playerid)
{
DeleteF4Bug[playerid] = false;
if(pData[playerid][pSkin] == 0)
{
if(pData[playerid][pGender] == 1)
{
SetPlayerSkin(playerid, MaleSkins[0]);
}
else
{
SetPlayerSkin(playerid, FemaleSkins[0]);
}
SCM(playerid,COLOR_ORANGE,"Âûáåðèòå âíåøíîñòü Âàøåãî ïåðñîíàæà");
TogglePlayerControllable(playerid,0);
SetPlayerVirtualWorld(playerid,playerid+1);
SetPlayerPos(playerid,1575.8920,-1235.2469,151.6970);
SetPlayerFacingAngle(playerid,129.8999);
SetPlayerCameraPos(playerid,1571.8352,-1239.6108,153.0927);
SetPlayerCameraLookAt(playerid,1576.4738,-1234.8547,151.6970);
SelectTextDraw(playerid, 0xFFFFFFFF);
return 1;
}
if(GetPVarInt(playerid, "loggined") == 1)
{
for(new i = 0; i < 7; i++)
{
TextDrawHideForPlayer(playerid,Logo[i]),TextDrawShowForPlayer(playerid,Logo[i]);
}
SetPlayerScore(playerid, pData[playerid][pLevel]);
GivePlayerMoney(playerid, pData[playerid][pMoney]);
SetPlayerHealthEx(playerid, pData[playerid][pHealth]);
if(pData[playerid][pFractionSkin] == 0)
{
SetPlayerSkin(playerid,pData[playerid][pSkin]);
}
else
{
SetPlayerSkin(playerid,pData[playerid][pFractionSkin]);
}
SetPlayerVirtualWorld(playerid,0);
TogglePlayerControllable(playerid,0);
if(pData[playerid][pSpawn] == 1)
{
if(pData[playerid][pLevel] <= 3)
{
new spawnls = random(4);
if(spawnls == 0)
{
SetPlayerPos(playerid,1762.3660,-1893.1317,13.5606);
SetPlayerFacingAngle(playerid,270.7868);
}
if(spawnls == 1)
{
SetPlayerPos(playerid,1154.5562,-1768.4633,16.5938);
SetPlayerFacingAngle(playerid,1.7675);
}
if(spawnls == 2)
{
SetPlayerPos(playerid,1765.0052,-1903.4672,13.5663);
SetPlayerFacingAngle(playerid,270.7868);
}
if(spawnls == 3)
{
SetPlayerPos(playerid,1147.7163,-1768.9059,16.5992);
SetPlayerFacingAngle(playerid,0.7231);
}
}
if(pData[playerid][pLevel] > 3 && pData[playerid][pLevel] <= 8)
{
SetPlayerPos(playerid,-1969.0582,159.8374,27.6875);
SetPlayerFacingAngle(playerid,177.5901);
}
if(pData[playerid][pLevel] >= 9)
{
SetPlayerPos(playerid,2846.0134,1291.2833,11.3906);
SetPlayerFacingAngle(playerid,92.5072);
}
}
if(pData[playerid][pSpawn] == 2)
{
if(pData[playerid][pRank] == gFractionRankCount[pData[playerid][pFraction]-1])
{
SetPlayerPos(playerid,gFractionSpawnPos[pData[playerid][pFraction]-1][0],gFractionSpawnPos[pData[playerid][pFraction]-1][1],gFractionSpawnPos[pData[playerid][pFraction]-1][2]);
SetPlayerFacingAngle(playerid,gFractionSpawnPos[pData[playerid][pFraction]-1][3]);
}
else
{
new fraction = pData[playerid][pFraction]-1, subfraction = pData[playerid][pSubFraction]-1;
SetPlayerPos(playerid,gSubFractionSpawnPos[fraction][subfraction][0],gSubFractionSpawnPos[fraction][subfraction][1],gSubFractionSpawnPos[fraction][subfraction][2]);
SetPlayerFacingAngle(playerid,gSubFractionSpawnPos[fraction][subfraction][3]);
}
}
SetCameraBehindPlayer(playerid);
if(!pData[playerid][pFraction]) SetPlayerColor(playerid,0xFFFFFFFF);
else
{
SetPlayerColor(playerid,gFractionColor[pData[playerid][pFraction]-1]);
}
SetTimerEx("UnFreeze",2000,false,"i",playerid);
}
return 1;
}
OnPlayerTakeDamage:
public OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid, bodypart)
{
if(bodypart == 9)
{
if(issuerid != INVALID_PLAYER_ID)
{
SetPlayerHealthEx(playerid,0.0);
}
}
if(spawned[playerid] == false)
{
SetPlayerHealthEx(playerid,pData[playerid][pHealth]-amount);
}
else spawned[playerid] = false;
return 1;
}
Таймер проверки ХП:
forward secondupdate();
public healthupdate()
{
foreach(new i:Player)
{
GetPlayerHealth(i,pTemp[i][pHealth]);
if(pTemp[i][pHealth] != pData[i][pHealth]) SetPlayerHealthEx(i,pData[i][pHealth]);
pTemp[i][pHealth] = 0.0;
}
}
И тут я выяснил, что если убрать строку
SetPlayerHealthEx(playerid,pData[playerid][pHealth]-amount); в OnPlayerTakeDamage - меня не убьет, НО если я ее уберу - не буду получать урон от падений.
Может кто подсказать адекватное решение?
Данные с поля в переменную pData[playerid][pHealth] загружаются?
Данные с поля в переменную pData[playerid][pHealth] загружаются?
Да, загружаются.
cache_get_field_content(0, "health", temp), pData[playerid][pHealth] = floatstr(temp);
Да, загружаются.
cache_get_field_content(0, "health", temp), pData[playerid][pHealth] = floatstr(temp);
В базе корректно отображает?
100
pData[playerid][pHealth] = cache_get_field_content_float(0, "health", /*ID подключения*/);
Ошибка может быть в функции SetPlayerHealthEx.
В базе корректно отображает?
pData[playerid][pHealth] = cache_get_field_content_float(0, "health", /*ID подключения*/);
Ошибка может быть в функции SetPlayerHealthEx.
http://dl2.joxi.net/drive/2016/10/03/0004/1911/292727/27/52d71b639f.jpg
SetPlayerHealthEx:
stock SetPlayerHealthEx(playerid,Float:hp)
{
pData[playerid][pHealth] = hp;
SetPlayerHealth(playerid,pData[playerid][pHealth]);
new query[86];
format(query,sizeof(query), "UPDATE `accounts` SET `health`= '%.2f' WHERE `nickname` = '%s'",pData[playerid][pHealth],pData[playerid][pNickname]);
mysql_function_query(dbHandle, query, false, "", "");
}
C:\Users\Íèêèòà\Desktop\ÒÅÑÒ ÐÅÊÓÐÑÈÈ\gamemodes\Untitled.pwn(1611) : error 017: undefined symbol "cache_get_field_content_float"
Лучше сохраняй без остатка %.0f.
stock SetPlayerHealthEx(playerid,Float:hp)
{
static const
str[] = "UPDATE `accounts` SET `health`= '%.0f' WHERE `nickname` = '%s'";
new
query[sizeof str + 3 + MAX_PLAYER_NAME - (4 + 2)];
pData[playerid][pHealth] = hp;
SetPlayerHealth(playerid, hp);
format(query, sizeof(query), str, hp, pData[playerid][pNickname]);
mysql_function_query(dbHandle, query, false, "", "");
return 1;
}
C:\Users\Íèêèòà\Desktop\ÒÅÑÒ ÐÅÊÓÐÑÈÈ\gamemodes\Untitled.pwn(1611) : error 017: undefined symbol "cache_get_field_content_float"
Версия MySQL?
Лучше сохраняй без остатка %.0f.
stock SetPlayerHealthEx(playerid,Float:hp)
{
static const
str[] = "UPDATE `accounts` SET `health`= '%.0f' WHERE `nickname` = '%s'";
new
query[sizeof str + 3 + MAX_PLAYER_NAME - (4 + 2)];
pData[playerid][pHealth] = hp;
SetPlayerHealth(playerid, hp);
format(query, sizeof(query), str, hp, pData[playerid][pNickname]);
mysql_function_query(dbHandle, query, false, "", "");
return 1;
}
C:\Users\Íèêèòà\Desktop\ÒÅÑÒ ÐÅÊÓÐÑÈÈ\gamemodes\Untitled.pwn(1611) : error 017: undefined symbol "cache_get_field_content_float"
Версия MySQL?
> MySQL plugin R7-2 successfully loaded.
- - - Добавлено - - -
Лучше сохраняй без остатка %.0f.
stock SetPlayerHealthEx(playerid,Float:hp)
{
static const
str[] = "UPDATE `accounts` SET `health`= '%.0f' WHERE `nickname` = '%s'";
new
query[sizeof str + 3 + MAX_PLAYER_NAME - (4 + 2)];
pData[playerid][pHealth] = hp;
SetPlayerHealth(playerid, hp);
format(query, sizeof(query), str, hp, pData[playerid][pNickname]);
mysql_function_query(dbHandle, query, false, "", "");
return 1;
}
C:\Users\Íèêèòà\Desktop\ÒÅÑÒ ÐÅÊÓÐÑÈÈ\gamemodes\Untitled.pwn(1611) : error 017: undefined symbol "cache_get_field_content_float"
Версия MySQL?
Сохранил без остатка (использовал Ваш код), без изменений.
Еще можно сделать так:
forward secondupdate();
public healthupdate()
{
new
Float:health;
foreach(new i:Player)
{
GetPlayerHealth(i, health);
if(_:health != _:pData[i][pHealth])
SetPlayerHealthEx(i, pData[i][pHealth]);
}
return 1;
}
Что означает '_:'?
_: ставится, чтобы не было вызова floatcmp
Дебаг, дебаг и еще раз дебаг. Перед спавном игрока выведи в printf кол-во хп которые ему должен выдать сервер. Смотри почему у тебя теряется это кол-во. Не советовал бы сохранять в БД в строку а потом доставать оттуда через floatstr. 0.5 хп для игрока что ли жалко?)
Все переменные хп задебагай и смотри в консоли - сколько загружается, сколько передается и сколько игроку в итоге присваивает сервер. Тогда поймешь в чем трабла.
Еще можно сделать так:
forward secondupdate();
public healthupdate()
{
new
Float:health;
foreach(new i:Player)
{
GetPlayerHealth(i, health);
if(_:health != _:pData[i][pHealth])
SetPlayerHealthEx(i, pData[i][pHealth]);
}
return 1;
}
До сих пор умираю
- - - Добавлено - - -
Дебаг, дебаг и еще раз дебаг. Перед спавном игрока выведи в printf кол-во хп которые ему должен выдать сервер. Смотри почему у тебя теряется это кол-во. Не советовал бы сохранять в БД в строку а потом доставать оттуда через floatstr. 0.5 хп для игрока что ли жалко?)
Все переменные хп задебагай и смотри в консоли - сколько загружается, сколько передается и сколько игроку в итоге присваивает сервер. Тогда поймешь в чем трабла.
Залогировал паблик OnPlayerTakeDamage, а именно переменные amount и pData[playerid][pHealth]:
http://joxi.ru/V2Vn4Kqh090L42.jpg
Тут творится ахинея! Откуда берется урон 1079194420?
- - - Добавлено - - -
Немного тупанул, вот новые логи:
http://dl1.joxi.net/drive/2016/10/03/0004/1911/292727/27/44bce9628e.jpg
В чем проблема? Вот код еще раз:
public OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid, bodypart)
{
if(GetPVarInt(playerid, "loggined") == 0) return 0;
printf("OnPlayerTakeDamage (pData[playerid][pHealth]) = %f",pData[playerid][pHealth]);
printf("OnPlayerTakeDamage (amount) = %f",amount);
SetPlayerHealthEx(playerid,pData[playerid][pHealth]-amount);
return 1;
}
- - - Добавлено - - -
Снял видео, так как я не всегда умирал, а лишь после перезахода:
https://www.youtube.com/watch?v=-KfHBfi3iOI&feature=youtu.be
Я бы советовал отключить собейт. Это во-первых.
Во-вторых, нужно логировать загрузку/сохранение. Смотрите сколько HP загружается из БД и сколько потом сохранится. От этого и нужно плясать
vovandolg
03.10.2016, 20:07
Пока игрок не загрузил данные с БД его жизни ушли в стандартный 0.0 от античита вот и помер достойно:grin:
Отключай античит пока ты не заспавнился и всё будет в ажуре
Ещё хотелось бы узреть как ты создал данную переменную
pData[playerid][pHealth]
Я бы советовал отключить собейт. Это во-первых.
Во-вторых, нужно логировать загрузку/сохранение. Смотрите сколько HP загружается из БД и сколько потом сохранится. От этого и нужно плясать
А зачем выключать собейт? Он мне помогает находить координаты, быстро перемещаться по карте.
http://dl2.joxi.net/drive/2016/10/03/0004/1911/292727/27/c44164b50b.jpg
http://dl1.joxi.net/drive/2016/10/03/0004/1911/292727/27/8c222132e4.jpg
http://dl2.joxi.net/drive/2016/10/03/0004/1911/292727/27/1e5e55ba12.jpg
- - - Добавлено - - -
Пока игрок не загрузил данные с БД его жизни ушли в стандартный 0.0 от античита вот и помер достойно:grin:
Отключай античит пока ты не заспавнился и всё будет в ажуре
Ещё хотелось бы узреть как ты создал данную переменную
pData[playerid][pHealth]
Тоже об этом думал, сделал уже:
http://dl2.joxi.net/drive/2016/10/03/0004/1911/292727/27/cd5646a2e8.jpg
- - - Добавлено - - -
Пока игрок не загрузил данные с БД его жизни ушли в стандартный 0.0 от античита вот и помер достойно:grin:
Отключай античит пока ты не заспавнился и всё будет в ажуре
Ещё хотелось бы узреть как ты создал данную переменную
pData[playerid][pHealth]
Вот так создал:
enum PDATA
{
pID,
pNickname[24],
pPassword[32],
pAdminPassword[32],
pEmail[32],
pAdmin,
pGender,
pAge,
pRace,
pSkin,
pRegData[25],
pRegIP[25],
pLevel,
pFraction,
pSubFraction,
pRank,
pSpawn,
pFractionSkin,
Float:pHealth,
pMoney,
};
vovandolg
03.10.2016, 20:22
Ммм ты мне не тот код показал и другая надпись не то...
Во первых найди переменную
pData[playerid][pHealth]
и покажи как ты её сделал, во вторых тебя убивает при входе, паблик получения/нанесения дамага тут не причем, настраивай таймер в апдейте чтобы до спавна не проверял тебя..
Добавь в дисконект
pData[playerid][pHealth] = 0;
vovandolg
03.10.2016, 20:28
Добавь в дисконект
pData[playerid][pHealth] = 0;
Это ж Float)) во вторых это тут не нужно, у него грузит при коннекте с БД, ему что осталось решить так это в апдейте паузу сделать пока он спавнится или умирает...
Ммм ты мне не тот код показал и другая надпись не то...
Во первых найди переменную
pData[playerid][pHealth]
и покажи как ты её сделал, во вторых тебя убивает при входе, паблик получения/нанесения дамага тут не причем, настраивай таймер в апдейте чтобы до спавна не проверял тебя..
Ам, извиняюсь, выделение pHealth красным сбило меня с толку.
new pData[MAX_PLAYERS][PDATA];
Я уже сделал так, чтобы меня не трогало до логина, смотри выше скрин.
- - - Добавлено - - -
Добавь в дисконект
pData[playerid][pHealth] = 0;
Уже есть такое:
pData[playerid][pHealth] = 0.0;
vovandolg
03.10.2016, 20:46
new pPauseAC[MAX_PLAYERS char];
public healthupdate()
{
foreach(new i:Player)
{
new state = GetPlayerState(i) ;
if(state == 7 || state == 8 || state == 9) continue;
if(pPauseAC{i} > 0)
{
pPauseAC{i}--;
continue;
}
GetPlayerHealth(i, pTemp[i][pHealth]);
if(_:pTemp[i][pHealth] != _:pData[i][pHealth]) SetPlayerHealthEx(i, pData[i][pHealth]);
pTemp[i][pHealth] = 0.0;
}
return 1;
}
stock SetPlayerHealthEx(playerid, Float:hp)
{
//сохранять HP тут не советую, флудануть можно так, что БД ляжет, сохранять можно 1 раз при дисконнекте и достаточно
pPauseAC{i} = 3; //3 секунды или 2 отрегулируешь на свой вкус
pData[playerid][pHealth] = hp;
SetPlayerHealth(playerid, hp);
return 1;
}
new pPauseAC[MAX_PLAYERS char];
public healthupdate()
{
foreach(new i:Player)
{
new state = GetPlayerState(i) ;
if(state == 7 || state == 8 || state == 9) continue;
if(pPauseAC{i} > 0)
{
pPauseAC{i}--;
continue;
}
GetPlayerHealth(i, pTemp[i][pHealth]);
if(_:pTemp[i][pHealth] != _:pData[i][pHealth]) SetPlayerHealthEx(i, pData[i][pHealth]);
pTemp[i][pHealth] = 0.0;
}
return 1;
}
stock SetPlayerHealthEx(playerid, Float:hp)
{
//сохранять HP тут не советую, флудануть можно так, что БД ляжет, сохранять можно 1 раз при дисконнекте и достаточно
pPauseAC{i} = 3; //3 секунды или 2 отрегулируешь на свой вкус
pData[playerid][pHealth] = hp;
SetPlayerHealth(playerid, hp);
return 1;
}
Не вижу смысла в переменной с массивом pTemp[i][pHealth]
vovandolg
03.10.2016, 21:14
Не вижу смысла в переменной с массивом pTemp[i][pHealth]
Я подставил свой код чтобы его не гуфало на серваке, остальное он пусть сам решает, вдруг он её где то пускает)
UPD: Я бы вообще такой античит не ставил на сервер, так как могут зайти гопники с HP hack и издеваться над сервером путем тролля античита)) Нарушил так нарушил, в бан или кик...
Я подставил свой код чтобы его не гуфало на серваке, остальное он пусть сам решает, вдруг он её где то пускает)
UPD: Я бы вообще такой античит не ставил на сервер, так как могут зайти гопники с HP hack и издеваться над сервером путем тролля античита)) Нарушил так нарушил, в бан или кик...
Думал над этим, но эти убийства на пустом месте сбили меня с пути, твой вариант опять же не помогает, когда я спавнюсь, мне начисляется 330 дамага, это может быть из-за телепортаций игрока?
- - - Добавлено - - -
http://dl2.joxi.net/drive/2016/10/03/0004/1911/292727/27/65062cbda1.jpg
vovandolg
03.10.2016, 21:23
Del
Так ты посмотри в своем моде где и как юзаешь SetPlayerHealth, само по себе с HP не произойдет такое...
Я не про то, мне, когда спавнюсь, паблик OnPlayerTakeDamage в переменную amount зачисляет 330 дамага. Откуда берется этот дамаг?
http://dl2.joxi.net/drive/2016/10/03/0004/1911/292727/27/f380c16dbc.jpg
vovandolg
03.10.2016, 21:31
if(issuerid == INVALID_PLAYER_ID) return 0;
if(issuerid == INVALID_PLAYER_ID) return 0;
Урон от падения считать тогда не будет
vovandolg
03.10.2016, 21:40
Урон от падения считать тогда не будет
Я тебе открою секрет если ГМщик заведётся то и твоим способом он не засчитает урон, получается ты зря сделал этот хук)
Поэтому возьми простенький античит на HP(хоть который я тебе написал не до конца, проверок пару других нужных добавить и пользуйся)..
Я тебе открою секрет если ГМщик заведётся то и твоим способом он не засчитает урон, получается ты зря сделал этот хук)
Поэтому возьми простенький античит на HP(хоть который я тебе написал не до конца, проверок пару других нужных добавить и пользуйся)..
Можно ссылочку на простенькие античиты? желательно на ПП (я искал, не нашел:black_eye:)
Видимо, еще недостаточно опыта у меня для написания античита.
Твой способ у меня так же отказался работать.
А зачем выключать собейт? Он мне помогает находить координаты, быстро перемещаться по карте.
Потому что в собейте нативно включены некоторые "приколы", которые часто приводят к багам при тестировании. Например, раньше часто ловили собейтеров благодаря тому, что с собейтом координаты камеры при входе не такие, какие у игроков без собейта. И таких приколов много (в каждой сборке они свои)
- - - Добавлено - - -
А зачем выключать собейт? Он мне помогает находить координаты, быстро перемещаться по карте.
http://dl2.joxi.net/drive/2016/10/03/0004/1911/292727/27/c44164b50b.jpg
http://dl1.joxi.net/drive/2016/10/03/0004/1911/292727/27/8c222132e4.jpg
http://dl2.joxi.net/drive/2016/10/03/0004/1911/292727/27/1e5e55ba12.jpg
Эмм, ну так видишь, у тебя отрицательное HP в БД сохраняется. Вполне возможно, что причина в этом.
Сделай так
stock SetPlayerHealthEx(playerid,Float:hp)
{
static const
str[] = "UPDATE `accounts` SET `health`= '%.0f' WHERE `nickname` = '%s'";
new
query[sizeof str + 3 + MAX_PLAYER_NAME - (4 + 2)];
pData[playerid][pHealth] = (hp < 0.0 ? 0.0 : hp);
SetPlayerHealth(playerid, hp);
format(query, sizeof(query), str, hp, pData[playerid][pNickname]);
mysql_function_query(dbHandle, query, false, "", "");
return 1;
}
Потому что в собейте нативно включены некоторые "приколы", которые часто приводят к багам при тестировании. Например, раньше часто ловили собейтеров благодаря тому, что с собейтом координаты камеры при входе не такие, какие у игроков без собейта. И таких приколов много (в каждой сборке они свои)
- - - Добавлено - - -
Эмм, ну так видишь, у тебя отрицательное HP в БД сохраняется. Вполне возможно, что причина в этом.
Сделай так
stock SetPlayerHealthEx(playerid,Float:hp)
{
static const
str[] = "UPDATE `accounts` SET `health`= '%.0f' WHERE `nickname` = '%s'";
new
query[sizeof str + 3 + MAX_PLAYER_NAME - (4 + 2)];
pData[playerid][pHealth] = (hp < 0.0 ? 0.0 : hp);
SetPlayerHealth(playerid, hp);
format(query, sizeof(query), str, hp, pData[playerid][pNickname]);
mysql_function_query(dbHandle, query, false, "", "");
return 1;
}
Отрицательные хп сохраняются потому, что я умер и мои ХП = -320. После спавна ХП стало 10 (как и надо). Дело в том, что я сохраняю хп каждую секунду (уже переделал).
Тут вопрос вот в чем: откуда берутся 330 ХП? На скрине показано, как паблик OnPlayerTakeDamage дал переменной amount значение 330. Почему именно 330 и откуда это число вообще, если я только зашел в игру?
vovandolg
03.10.2016, 22:10
Отрицательные хп сохраняются потому, что я умер и мои ХП = -320. После спавна ХП стало 10 (как и надо). Дело в том, что я сохраняю хп каждую секунду (уже переделал).
Тут вопрос вот в чем: откуда берутся 330 ХП? На скрине показано, как паблик OnPlayerTakeDamage дал переменной amount значение 330. Почему именно 330 и откуда это число вообще, если я только зашел в игру?
Потому что в собейте нативно включены некоторые "приколы", которые часто приводят к багам при тестировании. Например, раньше часто ловили собейтеров благодаря тому, что с собейтом координаты камеры при входе не такие, какие у игроков без собейта. И таких приколов много (в каждой сборке они свои)
...
...
Хм, однако, я могу бегать с собейтом по разным серверам и меня не будет убивать, тут явно есть недостаток/ошибка. Сейчас сделаю тест без собейта
- - - Добавлено - - -
Хм, однако, я могу бегать с собейтом по разным серверам и меня не будет убивать, тут явно есть недостаток/ошибка. Сейчас сделаю тест без собейта
Без собейта не убивает, но, очень большой процент коммьюнити его использует, это не решение
vovandolg
03.10.2016, 23:37
Без собейта не убивает,
Ну вот если сервер с античитом получается читеров Вы баните или кикаете,
вот и пожалуйста будет защита от такого собейта, что не так то?
Я подставил свой код чтобы его не гуфало на серваке, остальное он пусть сам решает, вдруг он её где то пускает)
В конце та переменная приравнивается к нулю
Хм, однако, я могу бегать с собейтом по разным серверам и меня не будет убивать, тут явно есть недостаток/ошибка.
Ну так прологируй OnPlayerTakeDamage без собейта. Скорее всего собейт отправляет фейковый пакет с уроном и всё. Твой античит на здоровье довольно примитивен, от того и такие проблемы.
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot