PDA

Просмотр полной версии : [Include] u_ac_money.inc | Античит на деньги



Desulaid
02.12.2015, 17:43
U_AC_MONEY.INC BY UNTONYST
Обновил из-за утери того инклуда :с

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

Работа с инклудом:

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

#include <u_ac_money>
При ложных срабатываниях, связанные с проблемами с сетью, высоким пингом или чем-нибудь еще, перед подключением инклуда добавим

#define AC_MONEY_IGNORE_TIME 1000
#include <u_ac_money>


Работа с функциями инклуда:

Функция CheckPlayerOnMoney.

Опциональный параметр:

CheckPlayerOnMoney(playerid, call=0)
Если вызывать функция с дополнительным вторым параметром, то вместе с функцией вызовется колбэк OnMoneyCheatDetected, если вы его используете, в котором вы можете указать свое наказание. Кроме того, у игрока будет восстановлен счет вне зависимости от используете вы колбэк или нет. А если не указывать, то вызвано ничего не будет, кроме возвращаемых значений.

Возвращаемый значения:

0: Игрок не использовал читы. Результат отрицательный.
1: Игрок использовал читы. Результат положительный.


Колбэк OnMoneyCheatDetected:

public OnMoneyCheatDetected(playerid, cheat_money, money)
{

}
Функция не возвращает никакого конкретного значения.

Аргументы:

cheat_money: Сколько игрок начитерил денег.
money: Сколько у игрока по настоящему денег.



Использование:

#include <zcmd>
#include <sscanf2>

CMD:checkplayer(playerid, params[])
{
new targetid;
if(sscanf(params, "u", targetid))
return SendClientMessage(playerid, -1,
!"Введите /checkplayer [игрок]"
);
if(CheckPlayerOnMoney(targetid) == 1)
{
static const fmt_str[] =
"У игрока %s (id %i) была обнаружено использование чита на деньги.";
new str[sizeof fmt_str + (-2+MAX_PLAYER_NAME) + (-2+4)];
GetPlayerName(targetid, str, MAX_PLAYER_NAME);
format(str, sizeof str, fmt_str, str, targetid);
return SendClientMessage(playerid, -1, str);
}
return SendClientMessage(playerid, -1,
!"Использование чита на деньги не обнаружено."
);
}

Скачать:

dropbox.com (https://www.dropbox.com/s/fwkzz35cb1s1ao6/u_ac_money_hack.zip?dl=0)

Unreal
02.12.2015, 22:49
Можно на pastebin ?

Desulaid
02.12.2015, 23:21
Можно на pastebin ?

А чем вам гист не нравится?

Profyan
03.12.2015, 13:07
Для чего

ac_money_timer[playerid] = SetTimerEx("AC_MoneyCore", 1000, false, "i", playerid);
Вызывать каждый раз и на 1 раз. Разве нельзя третьему параметру присвоить значение true?
Ведь таймер не вызовет функцию еще раз, пока она не завершиться.

Desulaid
03.12.2015, 15:49
Для чего

ac_money_timer[playerid] = SetTimerEx("AC_MoneyCore", 1000, false, "i", playerid);
Вызывать каждый раз и на 1 раз. Разве нельзя третьему параметру присвоить значение true?
Ведь таймер не вызовет функцию еще раз, пока она не завершиться.

Вместо тысячи слов (http://pro-pawn.ru/showthread.php?5249-Pawn-%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B5%D1%81%D0%BD%D1%8B%D0%B5-%D1%81%D0%BE%D0%B2%D0%B5%D1%82%D1%8B-%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D1%8B) (см. пункт два)

Profyan
03.12.2015, 20:19
Вместо тысячи слов (http://pro-pawn.ru/showthread.php?5249-Pawn-%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B5%D1%81%D0%BD%D1%8B%D0%B5-%D1%81%D0%BE%D0%B2%D0%B5%D1%82%D1%8B-%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D1%8B) (см. пункт два)

Согласен, проверил на собственном опыте.И убедился , что таймеры стоят в некой очереди. Т.е пока выполняется один, другие не выполняются.

Но тогда последняя придирка( C: ), почему ты таймер в public AC_MoneyCore(playerid) вызываешь в начале тела,а не в конце?

Desulaid
03.12.2015, 20:25
Согласен, проверил на собственном опыте.И убедился , что таймеры стоят в некой очереди. Т.е пока выполняется один, другие не выполняются.

Но тогда последняя придирка( C: ), почему ты таймер в public AC_MoneyCore(playerid) вызываешь в начале тела,а не в конце?

Когда я вызывал его после условия, то у меня флудило сообщениями, потом я поставил перезапуск вверх и флуд прекратился :*

Profyan
03.12.2015, 20:30
Когда я вызывал его после условия, то у меня флудило сообщениями, потом я поставил перезапуск вверх и флуд прекратился :*

Ну ясно)) Хорошая работа!

Daniel_Cortez
03.12.2015, 21:45
Но тогда последняя придирка( C: ), почему ты таймер в public AC_MoneyCore(playerid) вызываешь в начале тела,а не в конце?
На результат это всё равно не повлияет. Очередь таймеров обработается только после выполнения функции.


Добавлю несколько своих замечаний.
1. Определись с префиксом.



U_AC_MONEY[MAX_PLAYERS]
AC_MoneyCore // Какой здесь вообще префикс? "AC_Money" или "AC" ?
ac_money[MAX_PLAYERS] // Аналогично...
u_OnPlayerConnect
ac_money__GivePlayerMoney

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

2. В чём смысл делать пустые строки?


public AC_MoneyCore(playerid)
{

ac_money_timer[playerid] = SetTimerEx("AC_MoneyCore", 1000, false, "i", playerid);

if(GetPlayerMoney(playerid) != ac_money[playerid])
{
ResetPlayerMoney(playerid);
GivePlayerMoney(playerid, ac_money[playerid]);

#if defined OnMoneyCheatDetected
OnMoneyCheatDetected(playerid);
#endif

return 1;
}

return 0;
}

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

3. Табуляция кое-где хромает. Мало того, лишние пробелы и табы в конце строк.
http://ihost.pro-pawn.ru/image.php?di=D5XL

4. Если у игрока списать деньги, они снимутся со счёта на стороне античита, но у игрока они по разным причинам, связанными с сетью, могут сняться не сразу. Следует хотя бы в течении 1-2 секунд после изменений пропускать проверку игрока.

5. В чём профит делать такой отступ?


stock
ac_money__GivePlayerMoney(playerid, money)
{
ac_money[playerid] = money;
GivePlayerMoney(playerid, money);
}

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

6. Нет перехвата функции GetPlayerMoney. Как результат, игрок таки может начитерить себе деньги и использовать их до того, как спалится античитом (например, передать их кому-нибудь). Ещё проще читеру будет, если пропускать проверки после выдачи денег, как я написал в п.4, поэтому перехват GetPlayerMoney просто необходим.

7. ResetPlayerMoney тоже не помешало бы перехватить. Главное, чтобы эти перехваты, как и перехват GivePlayerMoney, были после AC_MoneyCore, чтобы не влиять на результаты проверок античита.


Сама по себе работа простая: идея довольно древняя, код в основе работы - тоже, но подкупает наличие перехватов и коллбэка, вызываемого при обнаружении читерства. Как результат, установка и использование предельно просты, нет никаких привязок к конкретному моду. Побольше бы здесь таких работ.


UPD: Заменил [php] на [code] в п.1.

Desulaid
03.12.2015, 21:55
Daniel_Cortez, я помню, как ты говорил, что стоит подражать коду того же Y_Less. Может другими словами, но суть та. Поэтому я открыл в YSI библиотеку y_gui.inc и там такое


stock
GUI_ShowForPlayer(playerid, GUI: gui)
{
if (!Bit_Get(YSI_g_sGUIBeingUsed, _:gui))
return 0;

// ---------------------------------------------------------------------

if (!Bit_Get(YSI_g_spGUIUsing, playerid))
Bit_Let(YSI_g_spGUIUsing, playerid);

// ---------------------------------------------------------------------

YSI_g_spGUI[playerid] = _:gui;
YSI_g_spGUIItem[playerid] = 0;

// ---------------------------------------------------------------------

if (Bit_Get(YSI_g_sGUITitleUsing, _:gui))
TextDrawShowForPlayer(playerid, YSI_g_sGUITextTitle[_:gui][0]);

if (Bit_Get(YSI_g_sGUITitleBox, _:gui))
TextDrawShowForPlayer(playerid, YSI_g_sGUITextTitle[_:gui][1]);

// ---------------------------------------------------------------------

// Maybe you can use y_iterate here
for (new pos; pos < MAX_GUI_ELEMENTS; pos ++)
if (Bit_Get(YSI_g_sGUIItemUsing[_:gui], pos))
TextDrawShowForPlayer(playerid, YSI_g_sGUITextButton[_:gui][pos]);

// ---------------------------------------------------------------------

return 1;
}

Ну мне понравилось :D А отступами я делаю как бы визуальные границы, которые оприделают как бы вызуальные группы.


forward AC_MoneyCore(playerid);
public AC_MoneyCore(playerid)
{

ac_money_timer[playerid] = SetTimerEx("AC_MoneyCore", 1000, false, "i", playerid);

if(GetPlayerMoney(playerid) != ac_money[playerid])
{
ResetPlayerMoney(playerid);
GivePlayerMoney(playerid, ac_money[playerid]);

#if defined OnMoneyCheatDetected
OnMoneyCheatDetected(playerid);
#endif

return 1;
}

return 0;
}


public OnPlayerConnect(playerid)
{
ac_money[playerid] = 0;

ac_money_timer[playerid] = SetTimerEx("AC_MoneyCore", 1000, false, "i", playerid);

#if defined u_OnPlayerConnect
u_OnPlayerConnect(playerid);
#endif
return 1;
}
// ...

* строки, для работы с деньгами.
* строки, для работы с таймером.

Бзик у меня такой (в мою новую коллекцию :D)

Все замечания учтутся, все исправим :)

VVWVV
03.12.2015, 22:24
4. Если у игрока списать деньги, они снимутся со счёта на стороне античита, но у игрока они по разным причинам, связанными с сетью, могут сняться не сразу. Следует хотя бы в течении 1-2 секунд после изменений пропускать проверку игрока.

Насколько я помню, это можно сделать через GetTickCount().

2. Проблему с префиксами можно решить, создав одну константу.


#if !defined <name>
#define <name> <prefix>
#endif
и использовать в коде:


stock
<name>AnotherFunction(/* Arguments */)
{
/* Something... */


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

1. Это стиль кода.
2. Хороший программист всегда следит за своим кодом.
3. В Sublime Text 3 не определяется подсветка синтаксиса имени функции, а при переходе на другую строку она загорается.

With new line:
http://ihost.pro-pawn.ru/image.php?di=CIGJ

Without:
http://ihost.pro-pawn.ru/image.php?di=14LU

В остальном я с вами согласен.

Desulaid
03.12.2015, 22:33
:trollface: проблему с префиксами можно решить изначально правильными руками, растущими из нужного места

Desulaid
03.12.2015, 23:54
Обновил

Unreal
09.12.2015, 11:47
А чем вам гист не нравится?

просто не заметил его