PDA

Просмотр полной версии : [Вопрос] Help с античитом (ФС)



StevenH
31.12.2015, 00:50
Всем привет. Пытаюсь написать античит на FS, но вот проблемка.
Например в ФС мне нужен паблик OnPlayerConnect ИЗ САМОГО мода (но не ФС), как так сделать?
Читал что можно как то с помощью перехватов, но так и не получилось.

UPD: ещё как то с помощью инклудов делают.. там что ли эти "перехваты"

Sp1ke
31.12.2015, 00:59
Почитай:
1. http://pro-pawn.ru/showthread.php?10447-%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%B2%D0%B0%D1%82-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9-%D1%87%D0%B0%D1%81%D1%82%D1%8C-1-%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B
2. http://pro-pawn.ru/showthread.php?10611-%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%B2%D0%B0%D1%82-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9-%D1%87%D0%B0%D1%81%D1%82%D1%8C-2-%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B0-%D0%BF%D0%B8%D1%88%D0%B5%D0%BC-%D0%B0%D0%BD%D1%82%D0%B8%D1%87%D0%B8%D1%82-%D0%BD%D0%B0-HP

StevenH
31.12.2015, 02:09
Почитай:
1. http://pro-pawn.ru/showthread.php?10447-%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%B2%D0%B0%D1%82-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9-%D1%87%D0%B0%D1%81%D1%82%D1%8C-1-%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B
2. http://pro-pawn.ru/showthread.php?10611-%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%B2%D0%B0%D1%82-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9-%D1%87%D0%B0%D1%81%D1%82%D1%8C-2-%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B0-%D0%BF%D0%B8%D1%88%D0%B5%D0%BC-%D0%B0%D0%BD%D1%82%D0%B8%D1%87%D0%B8%D1%82-%D0%BD%D0%B0-HP

За ссылки спасибо, но запутался чуть чуть.
В моде и ФС подключил #include <anticheat>
В инклуде сделал:


stock ac_OnPlayerEnterVehicle(playerid, vehicleid, ispassenger) return CallRemoteFunction("ac_OnPlayerEnterVehicle", "ddd", playerid, vehicleid, ispassenger);

#if defined _ALS_OnPlayerEnterVehicle
#undef OnPlayerEnterVehicle
#else
#define _ALS_OnPlayerEnterVehicle
#endif
#define OnPlayerEnterVehicle ac_OnPlayerEnterVehicle


В ФС:


#include <a_samp>
#include <anticheat>

forward ac_OnPlayerEnterVehicle(playerid, vehicleid, ispassenger);
public ac_OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
SetPVarInt(playerid, "AC_AirBreak", 65);
print("Hamilton_AC: OnPlayerConnect загружен!");
return true;
}

Ошибка:

error 021: symbol already defined: "ac_OnPlayerEnterVehicle"

Что я не так делаю?

VVWVV
31.12.2015, 10:44
Вы смотрели перехват функций, а вам нужен перехват коллбеков.



Перехват коллбэков реализуется следующим образом:

// CallbackFunc - название перехватываемой функции
// param1, param2 - параметры перехватываемой функции
public CallbackFunc(param1, param2)
{
// здесь место для Вашего кода, ради которого и осуществляется перехват
// ...

// если перехватываемая функция существует - нужно вызвать и её,
// после чего вернуть значение, которая вернёт перехватываемая функция
// (LibName - название Вашей библиотеки (в случае с Pawn - инклуда),
// в котором перехватывается функция CallbackFunc)
#if defined LibName__CallbackFunc
return Libname__CallbackFunc(param1, param2);
#endif
}

// если объявлен макрос с префиксом "_ALS_" и именем функции после него -
// это значит, что такая функция уже была где-то перехвачена

// если функция CallbackFunc уже была перехвачена - уберём макрос, сделанный
// в предыдущем перехвате (назначение этого макроса будет объяснено далее)
#if defined _ALS_CallbackFunc
#undef CallbackFunc

// если же функция ещё не была перехвачена,
// дадим знать о её перехвате, объявив макрос "_ALS_CallbackFunc"
#else
#define _ALS_CallbackFunc
#endif

Desulaid
31.12.2015, 10:51
Нельзя задавать двум функциям одно и то же название. Кроме того, вы не правильно используете технику перехватов. У вас же не нативная функция, а каллбэк.


public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
/*
никогда не работал с фс, да и с этой функцией,
но нельзя вызвать ее напрямую?

ac_OnPlayerEnterVehicle(playerid, vehicleid, ispassenger);
*/

CallRemoteFunction("ac_OnPlayerEnterVehicle", "ddd", playerid, vehicleid, ispassenger);
#if defined hook__OnPlayerEnterVehicle
hook__OnPlayerEnterVehicle(playerid, vehicleid, ispassenger);
#endif
return 1;
}
#if defined _ALS_OnPlayerEnterVehicle
#undef OnPlayerEnterVehicle
#else
#define _ALS_OnPlayerEnterVehicle
#endif
#define OnPlayerEnterVehicle hook__OnPlayerEnterVehicle
#if defined hook__OnPlayerEnterVehicle
forward hook__OnPlayerEnterVehicle(playerid, vehicleid, ispassenger);
#endif

forward ac_OnPlayerEnterVehicle(playerid, vehicleid, ispassenger);
public ac_OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
SetPVarInt(playerid, "AC_AirBreak", 65);
print("Hamilton_AC: OnPlayerConnect загружен!");
return true;
}

StevenH
31.12.2015, 12:57
Нельзя задавать двум функциям одно и то же название. Кроме того, вы не правильно используете технику перехватов. У вас же не нативная функция, а каллбэк.


public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
/*
никогда не работал с фс, да и с этой функцией,
но нельзя вызвать ее напрямую?

ac_OnPlayerEnterVehicle(playerid, vehicleid, ispassenger);
*/

CallRemoteFunction("ac_OnPlayerEnterVehicle", "ddd", playerid, vehicleid, ispassenger);
#if defined hook__OnPlayerEnterVehicle
hook__OnPlayerEnterVehicle(playerid, vehicleid, ispassenger);
#endif
return 1;
}
#if defined _ALS_OnPlayerEnterVehicle
#undef OnPlayerEnterVehicle
#else
#define _ALS_OnPlayerEnterVehicle
#endif
#define OnPlayerEnterVehicle hook__OnPlayerEnterVehicle
#if defined hook__OnPlayerEnterVehicle
forward hook__OnPlayerEnterVehicle(playerid, vehicleid, ispassenger);
#endif

forward ac_OnPlayerEnterVehicle(playerid, vehicleid, ispassenger);
public ac_OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
SetPVarInt(playerid, "AC_AirBreak", 65);
print("Hamilton_AC: OnPlayerConnect загружен!");
return true;
}

Оу, работает! Спасибо. Но теперь проблемка в другом.
В ФС этот паблик вызывается 2 раза!

DeimoS
01.01.2016, 18:44
Эмм, так зачем что-то перехватывать? Просто прописывайте нужный колбэк, ибо стандартные колбэки идентичны как для мода, так и для скриптов. Всё различие в том, что колбэки скриптов выполняются первыми + в зависимости от того, какое значение в колбэке возвращать в скрипте, будет зависеть то, обработает ли сервер колбэк мода или же оборвёт обработку на колбэке того скрипта, где было возвращено значение. Ну и скрипты обрабатываются по порядку подключения... В общем, ничего не надо перехватывать.
P.S. А если всё же Вам кажется, что перехват нужен, опишите суть проблемы. Может Вы костыль изобретаете сейчас