|
Нужно перехватить get_user_authid...
|
|
| dArk | Дата: Четверг, 18.09.2008, 18:20:25 | Сообщение # 1 |
|
Подполковник
Группа: Cупер-модеры
Сообщений: 126
Статус: Не в сети
| В общем, цель, во всех плагинах перехватить эту функцию, и если она возвращает VALVE_ID_LAN, заменить возвращаемое значение допустим на V@lve_xyid_inet... Получится допустим, набираем amx_who, и у всех игроков у которых VALVE_ID_LAN написано, будет наша строка написана вместо старой.
|
| |
|
|
| DaTa | Дата: Четверг, 18.09.2008, 20:08:45 | Сообщение # 2 |
|
Генерал-полковник
Группа: Cупер-модеры
Сообщений: 1025
Статус: Не в сети
| Code static cell AMX_NATIVE_CALL get_user_authid(AMX *amx, cell *params) /* 3 param */ { int index = params[1]; const char* authid = 0; if (index > 0 && index <= gpGlobals->maxClients) authid = GETPLAYERAUTHID(g_players[index].pEdict); return set_amxstring(amx, params[2], authid ? authid : "", params[3]); } Так выглядит вызов из амхх'а, вызывается функция движка http://metamod.org/engine_notes.html#GetPlayerAuthId Изменить его можно несколькими способам 1) Хакнуть движок 2) Перекомпилировать амхх с нужными изменениями 3) Перекомпилировать все плагины с новыми изменениями я бы советовал вариант 3, и реализовать его примерно так: открыть amxmodx.inc и изменить строчку Code native get_user_authid(index, authid[] ,len); изменить ее как тебе нужно: Code stock get_user_authid(index, authid[] ,len) { return copy(authid, len, "V@lve_xyid_inet"); }
|
| |
|
|
| dArk | Дата: Четверг, 18.09.2008, 20:20:03 | Сообщение # 3 |
|
Подполковник
Группа: Cупер-модеры
Сообщений: 126
Статус: Не в сети
| А если строка определяется динамически по каким то внутренним факторам, например это ник одного из игроков, тогда как делать? Перехват типо register_forward не катит?
|
| |
|
|
| DaTa | Дата: Четверг, 18.09.2008, 20:42:17 | Сообщение # 4 |
|
Генерал-полковник
Группа: Cупер-модеры
Сообщений: 1025
Статус: Не в сети
| можно создать плагин, а в нем native вызов (amxmodx.inc): Code native register_native(const name[], const handler[], style=0);
|
| |
|
|
| dArk | Дата: Воскресенье, 21.09.2008, 18:58:21 | Сообщение # 5 |
|
Подполковник
Группа: Cупер-модеры
Сообщений: 126
Статус: Не в сети
| Подскажи ещё плз, что за функция GETPLAYERAUTHID(g_players[index].pEdict), её можно изменить, есть её исходники, или она закрыта? //Ой, сорр, ступил смутило то, что разными буквами имена функций написаны))
Сообщение отредактировал dArk - Воскресенье, 21.09.2008, 19:10:57 |
| |
|
|
| dArk | Дата: Суббота, 27.09.2008, 13:46:16 | Сообщение # 6 |
|
Подполковник
Группа: Cупер-модеры
Сообщений: 126
Статус: Не в сети
| В общем, есть модуль, его цель, перехватить вызов функции get_user_authid и подсунуть вместо реального значения какое то моё, уникальный ключ например. Вот код get_user_authid: static cell AMX_NATIVE_CALL get_user_authid(AMX *amx, cell *params) /* 3 param */ { int index = params[1]; const char* authid = 0; if (index > 0 && index <= gpGlobals->maxClients) authid = GETPLAYERAUTHID(g_players[index].pEdict); return set_amxstring(amx, params[2], authid ? authid : "", params[3]); } На сколько я понимаю, нужно либо перехватить эту функцию, либо ещё более нижнюю GETPLAYERAUTHID, помогите с реализацией пожалуйсто, хотя бы с началом...
|
| |
|
|
| DaTa | Дата: Суббота, 27.09.2008, 17:39:52 | Сообщение # 7 |
|
Генерал-полковник
Группа: Cупер-модеры
Сообщений: 1025
Статус: Не в сети
| dArk, такая тема уже существует, зачем создавать дубляж? Соединено.
|
| |
|
|
| dArk | Дата: Суббота, 27.09.2008, 22:58:19 | Сообщение # 8 |
|
Подполковник
Группа: Cупер-модеры
Сообщений: 126
Статус: Не в сети
| Неа, начальник, вопрос про модуль и про плагин нельзя соединять. Сравнил pawn с С++, так что разъединяй обратно, там разный подход очень.
|
| |
|
|
| DaTa | Дата: Суббота, 27.09.2008, 23:35:17 | Сообщение # 9 |
|
Генерал-полковник
Группа: Cупер-модеры
Сообщений: 1025
Статус: Не в сети
| Quote (dArk) Неа, начальник, вопрос про модуль и про плагин нельзя соединять. Сравнил pawn с С++, так что разъединяй обратно, там разный подход очень. Если это чисто вопрос по С++, то в разделе Помощь по скриптингу этой теме нечего делать. Можно спросить подобные вопросы в разделе Любые вопросы. А вообще я бы тебе посоветовал (как и выше) изменить amxmodx.inc, написать плагин, который принимает на себя решение, что делать с этим вызовом. Вот тебе пример(подглядел в http://forums.alliedmods.net/showthread.php?t=40287 ): authid.sma Code #include <amxmodx>
public plugin_init() { //... }
public plugin_natives() { register_native("__custom_get_user_authid", "native__custom_get_user_authid", 1) }
public native__custom_get_user_authid(index, authid[] ,len) { //заполняешь authid, как тебе надо } edit amxmodx.inc Code //... /* Gets player authid. */ //native get_user_authid(index, authid[] ,len); native __custom_get_user_authid(index, authid[] ,len); stock get_user_authid(index, authid[] ,len) return __custom_get_user_authid(index, authid,len); //... перекомпилируешь все плагины с новым amxmodx.inc и у тебя они вызывают authid.sma::native__custom_get_user_authid вместо amxmodx.cpp::get_user_authid
|
| |
|
|