PDA

Просмотр полной версии : [Вопрос] Убивает после захода на сервер.



nikvlad
03.10.2016, 14:14
Решил я, значит, написать античит на хп. Что-то пошло не так, и теперь при заходе на сервер меня убивает, после смерти появляюсь на 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 - меня не убьет, НО если я ее уберу - не буду получать урон от падений.

Может кто подсказать адекватное решение?

m1n1vv
03.10.2016, 14:19
Данные с поля в переменную pData[playerid][pHealth] загружаются?

nikvlad
03.10.2016, 15:01
Данные с поля в переменную pData[playerid][pHealth] загружаются?

Да, загружаются.


cache_get_field_content(0, "health", temp), pData[playerid][pHealth] = floatstr(temp);

m1n1vv
03.10.2016, 15:15
Да, загружаются.


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.

nikvlad
03.10.2016, 15:48
В базе корректно отображает?


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"

m1n1vv
03.10.2016, 16:28
Лучше сохраняй без остатка %.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?

nikvlad
03.10.2016, 16:41
Лучше сохраняй без остатка %.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?

Сохранил без остатка (использовал Ваш код), без изменений.

m1n1vv
03.10.2016, 16:58
Еще можно сделать так:

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;
}

BadPawn
03.10.2016, 17:36
Что означает '_:'?

m1n1vv
03.10.2016, 17:41
Что означает '_:'?

_: ставится, чтобы не было вызова floatcmp

qwezert
03.10.2016, 18:04
Дебаг, дебаг и еще раз дебаг. Перед спавном игрока выведи в printf кол-во хп которые ему должен выдать сервер. Смотри почему у тебя теряется это кол-во. Не советовал бы сохранять в БД в строку а потом доставать оттуда через floatstr. 0.5 хп для игрока что ли жалко?)
Все переменные хп задебагай и смотри в консоли - сколько загружается, сколько передается и сколько игроку в итоге присваивает сервер. Тогда поймешь в чем трабла.

nikvlad
03.10.2016, 19:41
Еще можно сделать так:

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

DeimoS
03.10.2016, 19:50
Я бы советовал отключить собейт. Это во-первых.

Во-вторых, нужно логировать загрузку/сохранение. Смотрите сколько HP загружается из БД и сколько потом сохранится. От этого и нужно плясать

vovandolg
03.10.2016, 20:07
Пока игрок не загрузил данные с БД его жизни ушли в стандартный 0.0 от античита вот и помер достойно:grin:
Отключай античит пока ты не заспавнился и всё будет в ажуре

Ещё хотелось бы узреть как ты создал данную переменную

pData[playerid][pHealth]

nikvlad
03.10.2016, 20:21
Я бы советовал отключить собейт. Это во-первых.

Во-вторых, нужно логировать загрузку/сохранение. Смотрите сколько 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]

и покажи как ты её сделал, во вторых тебя убивает при входе, паблик получения/нанесения дамага тут не причем, настраивай таймер в апдейте чтобы до спавна не проверял тебя..

m1n1vv
03.10.2016, 20:26
Добавь в дисконект

pData[playerid][pHealth] = 0;

vovandolg
03.10.2016, 20:28
Добавь в дисконект

pData[playerid][pHealth] = 0;

Это ж Float)) во вторых это тут не нужно, у него грузит при коннекте с БД, ему что осталось решить так это в апдейте паузу сделать пока он спавнится или умирает...

nikvlad
03.10.2016, 20:30
Ммм ты мне не тот код показал и другая надпись не то...
Во первых найди переменную


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;
}

m1n1vv
03.10.2016, 21:06
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 и издеваться над сервером путем тролля античита)) Нарушил так нарушил, в бан или кик...

nikvlad
03.10.2016, 21:22
Я подставил свой код чтобы его не гуфало на серваке, остальное он пусть сам решает, вдруг он её где то пускает)

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

nikvlad
03.10.2016, 21:26
Так ты посмотри в своем моде где и как юзаешь 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;

nikvlad
03.10.2016, 21:36
if(issuerid == INVALID_PLAYER_ID) return 0;

Урон от падения считать тогда не будет

vovandolg
03.10.2016, 21:40
Урон от падения считать тогда не будет

Я тебе открою секрет если ГМщик заведётся то и твоим способом он не засчитает урон, получается ты зря сделал этот хук)
Поэтому возьми простенький античит на HP(хоть который я тебе написал не до конца, проверок пару других нужных добавить и пользуйся)..

nikvlad
03.10.2016, 21:48
Я тебе открою секрет если ГМщик заведётся то и твоим способом он не засчитает урон, получается ты зря сделал этот хук)
Поэтому возьми простенький античит на HP(хоть который я тебе написал не до конца, проверок пару других нужных добавить и пользуйся)..

Можно ссылочку на простенькие античиты? желательно на ПП (я искал, не нашел:black_eye:)
Видимо, еще недостаточно опыта у меня для написания античита.
Твой способ у меня так же отказался работать.

DeimoS
03.10.2016, 21:54
А зачем выключать собейт? Он мне помогает находить координаты, быстро перемещаться по карте.


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

- - - Добавлено - - -


А зачем выключать собейт? Он мне помогает находить координаты, быстро перемещаться по карте.

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;
}

nikvlad
03.10.2016, 22:00
Потому что в собейте нативно включены некоторые "приколы", которые часто приводят к багам при тестировании. Например, раньше часто ловили собейтеров благодаря тому, что с собейтом координаты камеры при входе не такие, какие у игроков без собейта. И таких приколов много (в каждой сборке они свои)

- - - Добавлено - - -



Эмм, ну так видишь, у тебя отрицательное 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 и откуда это число вообще, если я только зашел в игру?


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

nikvlad
03.10.2016, 22:16
...

Хм, однако, я могу бегать с собейтом по разным серверам и меня не будет убивать, тут явно есть недостаток/ошибка. Сейчас сделаю тест без собейта

- - - Добавлено - - -


Хм, однако, я могу бегать с собейтом по разным серверам и меня не будет убивать, тут явно есть недостаток/ошибка. Сейчас сделаю тест без собейта

Без собейта не убивает, но, очень большой процент коммьюнити его использует, это не решение

vovandolg
03.10.2016, 23:37
Без собейта не убивает,

Ну вот если сервер с античитом получается читеров Вы баните или кикаете,
вот и пожалуйста будет защита от такого собейта, что не так то?

m1n1vv
04.10.2016, 00:02
Я подставил свой код чтобы его не гуфало на серваке, остальное он пусть сам решает, вдруг он её где то пускает)

В конце та переменная приравнивается к нулю

DeimoS
04.10.2016, 09:59
Хм, однако, я могу бегать с собейтом по разным серверам и меня не будет убивать, тут явно есть недостаток/ошибка.

Ну так прологируй OnPlayerTakeDamage без собейта. Скорее всего собейт отправляет фейковый пакет с уроном и всё. Твой античит на здоровье довольно примитивен, от того и такие проблемы.