У
Удалённый пользователь 144706
Гость
Автор темы
Примечание:
Внимание! Из топовых проектов скрипт работает только на Diamond RP, так как только там присутствует функция получения FPS игрока. (на DRP больше не работает, пофиксили)
Про "непропадающую надпись SPECTATE":
На самом деле, надпись пропадёт, если с момента последнего RPC_35 пройдёт минута.
Дополнительно:
Для тех, у кого нет SB или, просто, тех кто не хочет компилить скрипт, я приложу готовый файл.
А теперь к описанию работы скрипта:
Принцип прост. В некоторых pwn модах разрабы включают функцию отслеживания FPS игрока. FPS игрока не храниться ни в одной переменной samp-сервера, поэтому изощрённые разрабы вычисляют FPS через функции SetDrunkLevel и GetDrunkLevel. То есть, уровень опьянения падает на количество равное FPS игрока. По разнице друнк-левелов они и определяют FPS. Да, и указывают друнк-левел равный 2000, потому что если указать больше, то камеру начнёт трясти и тут даже скрипт не нужен, чтобы догадаться, что за вами следят. Ну дык вот, народ, к чему я веду. Когда они вызывают SetDrunkLevel на клиент отправляется RPC с номером 35, он так и называется SetPlayerDrunkLevel. Так вот, когда приходит этот RPC, это означает, что за игроком следит админ, иначе накуя серверу ваш FPS. Когда RPC не приходит, это значит что за вами не следят. Я сделал через текстдрав, вы можете переделывать как угодно. Вот исходник:
Про "непропадающую надпись SPECTATE":
На самом деле, надпись пропадёт, если с момента последнего RPC_35 пройдёт минута.
Дополнительно:
Для тех, у кого нет SB или, просто, тех кто не хочет компилить скрипт, я приложу готовый файл.
А теперь к описанию работы скрипта:
Принцип прост. В некоторых pwn модах разрабы включают функцию отслеживания FPS игрока. FPS игрока не храниться ни в одной переменной samp-сервера, поэтому изощрённые разрабы вычисляют FPS через функции SetDrunkLevel и GetDrunkLevel. То есть, уровень опьянения падает на количество равное FPS игрока. По разнице друнк-левелов они и определяют FPS. Да, и указывают друнк-левел равный 2000, потому что если указать больше, то камеру начнёт трясти и тут даже скрипт не нужен, чтобы догадаться, что за вами следят. Ну дык вот, народ, к чему я веду. Когда они вызывают SetDrunkLevel на клиент отправляется RPC с номером 35, он так и называется SetPlayerDrunkLevel. Так вот, когда приходит этот RPC, это означает, что за игроком следит админ, иначе накуя серверу ваш FPS. Когда RPC не приходит, это значит что за вами не следят. Я сделал через текстдрав, вы можете переделывать как угодно. Вот исходник:
CLEO:
{$CLEO .cs}
{$NOSOURCE}
0000: NOP
const
// --- Vars ---
SPECTATE_STATUS = 0 // Наблюдают ли сейчас за игроком
LAST_TIME = 1 // Время последнего RPC_SCRSETPLAYERDRUNKLEVEL
// --- ID RPC ---
RPC_SCRSETPLAYERDRUNKLEVEL = 35 // [ID RPC] Если админ начинает следить, присылается этот RPC
DRUNK_LEVEL = 2000 // Параметр, который устанавливают моды, чтобы определить FPS
// --- ID TextDraw ---
ID_TEXTDRAW_STATUS = 431 // ID текстдрава, сообщающего о слежке
end
03A4: name_thread 'SD_MAIN'
// Ждём запуск SAMP
repeat
wait 100
until SAMP.Available()
// Обнуляем статус слежки
0AB3: var SPECTATE_STATUS = FALSE
// Выводим информацию о скрипте
0C3A: 1@ = string "{5e0fa3}[SpectateDetector]{ffe0a5} Автор:{7db302} Mor" pointer
chatmsg 1@ 0xffffe0a5
0BE3: raknet setup_incoming_rpc_hook @SPECTATE_DETECTOR
:MAIN_CYCLE
wait 100
0AB4: 0@ = var SPECTATE_STATUS
if 0@ == TRUE
then
0AB4: 1@ = var LAST_TIME
01BD: 2@ = current_time_in_ms
0062: 2@ -= 1@
if 04B5: 2@ >= 60000 // Если прошла минута с последнего RPC, то слежка прекратилась
then
// Слежка прекратилась...
0C5E: samp textdraw ID_TEXTDRAW_STATUS delete
0AB3: var SPECTATE_STATUS = FALSE
end
end
jump @MAIN_CYCLE
:SPECTATE_DETECTOR
0BE5: raknet 25@ = get_hook_param 1
if 25@ == RPC_SCRSETPLAYERDRUNKLEVEL
then
0BE5: raknet 26@ = get_hook_param 0
0BF3: raknet 26@ = bit_stream 26@ get_data_ptr
0A8D: 27@ = read_memory 26@ size 4 virtual_protect 0
if 27@ == DRUNK_LEVEL
then
0BFA: push_vars
0AB4: 3@ = var SPECTATE_STATUS
if 04A4: 3@ == TRUE
then
// Пришёл ещё пакет...
// Обновить время последнего RPC_SCRSETPLAYERDRUNKLEVEL
01BD: 4@ = current_time_in_ms
0AB3: var LAST_TIME = 4@
else if 0039: 3@ == FALSE
then
// Слежка началась...
0AB3: var SPECTATE_STATUS = TRUE
01BD: 4@ = current_time_in_ms
0AB3: var LAST_TIME = 4@
// Создать текстдрав
0C48: samp textdraw ID_TEXTDRAW_STATUS create "~r~SPECTATE" pos 130.0 150.0
0C4A: samp textdraw ID_TEXTDRAW_STATUS set_align 2
0C4B: samp textdraw ID_TEXTDRAW_STATUS set_proportional TRUE
0C4C: samp textdraw ID_TEXTDRAW_STATUS set_style 2
0C4E: samp textdraw ID_TEXTDRAW_STATUS set_outline 1 color 0xff000000
0C52: samp textdraw ID_TEXTDRAW_STATUS set_letter_size 1.0 1.0 color -1
end
end
0BFB: pop_vars
end
end
0BE0: raknet hook_ret TRUE
Вложения
Последнее редактирование модератором: