Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 14
  1. #1
    Аватар для wAx
    ¯\_(ツ)_/¯

    Статус
    Оффлайн
    Регистрация
    13.12.2013
    Сообщений
    377
    Репутация:
    146 ±

    Защита от читерского ХП

    В начале скажу: Данную тему я разместил именно в этом разделе, потому что, это урок. Да-да, самый настоящий урок...

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

    Для начала следует разобраться, как работает данный чит или по другому "НОП". Данный "НОП" запрещает серверу изменять здоровье игрока посредством функции SetPlayerHealth. Т.е при включенном "НОПе" мы не сможем ни отнять здоровье ни прибавить его. Все, разобрались!

    Теперь переходим к этапу составления защиты. Давайте подумаем... В любых современных модах, здоровье игрока, так же лежит в переменной. Чит может блокировать функции, но до переменных ему не добраться: отсюда делаем вывод. В общем для защиты, нам нужно лишь над каждой функцией SetPlayerHealth устанавливать значение нашей переменной. Тоесть:

    PHP код:
    PlayerInfo[playerid][pHealth] += 0.5;
    SetPlayerHealth(playeridPlayerInfo[playerid][pHealth]); 
    И так, с тем, как спрятать данные от чита, разобрались. Теперь давайте подумаем как можно проверить соответствие данных.
    Будем проверять в секундном таймере, к примеру:

    PHP код:
    new Float:hp;
    GetPlayerHealth(playeridhp);
    if(
    hp PlayerInfo[playerid][pHealth] > 0.5)
    {
        
    Kick(playerid);
        return 
    1;
    }
    PlayerInfo[playerid][pHealth] = hp
    Вот и все! При условии что "видимое" хп игрока больше на 0,5 чем "невидимое" хп, игрока кикнет.
    На этом все! Отзывы прошу в комментарии =)
    Последний раз редактировалось wAx; 24.07.2014 в 09:29.

  2. #2
    Аватар для Salvacore
    Инжунер-погромист

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Адрес
    Аҧсуа бызшәа
    Сообщений
    2,271
    Репутация:
    418 ±
    Молодец...
    Но
    PHP код:
    этот bbcode 
    использовать лучше.

  3. #3
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Странный НОП, если его можно обмануть подобным образом...
    Логики в этом коде не вижу
    PHP код:
    new Float:hp;
    GetPlayerHealth(playeridhp);
    if(
    hp PlayerInfo[playerid][pHealth])//В чём заключается эта проверка? Тут ты отнимешь от значения, полученного в GetPlayerHealth, значение, хранящееся в pHealth. А условие для кика то где?
    {
    Kick(playerid);
    return 
    1;
    }
    PlayerInfo[playerid][pHealth] = hp;//И зачем тогда этот код? Если значение не подходит, кикаем. А если подходит, зачем присваивать его повторно? 
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  4. #4
    Аватар для wAx
    ¯\_(ツ)_/¯

    Статус
    Оффлайн
    Регистрация
    13.12.2013
    Сообщений
    377
    Репутация:
    146 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Странный НОП, если его можно обмануть подобным образом...
    Логики в этом коде не вижу
    PHP код:
    new Float:hp;
    GetPlayerHealth(playeridhp);
    if(
    hp PlayerInfo[playerid][pHealth])//В чём заключается эта проверка? Тут ты отнимешь от значения, полученного в GetPlayerHealth, значение, хранящееся в pHealth. А условие для кика то где?
    {
    Kick(playerid);
    return 
    1;
    }
    PlayerInfo[playerid][pHealth] = hp;//И зачем тогда этот код? Если значение не подходит, кикаем. А если подходит, зачем присваивать его повторно? 
    Дорогой друг! Объясняю на пальцах:

    НОП используется для "обхода" системы сытости и прочих, которые отнимают у игрока ХП. НОП не дает серверу управлять здоровьем игрока с помощью SetPlayerHealth. Обмануть легко? Не вижу в этом ничего страшного...

    Далее, с проверкой, в ней я действительно немного ошибся, исправил. При работе НОП'а, используя пример контроля ХП игрока в переменной, значение полученное через GetPlayerHealth, окажется больше чем значение в переменной, это и послужит причиной кика.

    И последнее. Значение переменной может совпадать, но может быть и меньше (урон от гана, урон от падения). Конечно, можно модернизировать, добавить проверку:

    PHP код:
    if(hp PlayerInfo[playerid][pHealth]) PlayerInfo[playerid][pHealth] = hp
    Но в любом случае смысл не изменяется. Надеюсь я ответил на все твои вопросы!

    Спасибо за критику!

  5. #5
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от wAx Посмотреть сообщение
    НОП используется для "обхода" системы сытости и прочих, которые отнимают у игрока ХП. НОП не дает серверу управлять здоровьем игрока с помощью SetPlayerHealth. Обмануть легко? Не вижу в этом ничего страшного...
    НОП блокирует пакеты от сервера, которые несут в себе информацию о смене HP игроку через серверную функцию. (далее я расписал своё негодование по поводу твоих проверок, но...)
    Кажется я понял то, какого результата ты пытаешься добиться. Раз игрок блокирует НОПом пакеты с SetPlayerHealth, значит здоровье его не меняется. Следовательно мы можем чуть увеличить значение, которое мы посылаем игроку, а после сделать проверку на то, изменилось ли у него здоровье или нет. Но я бы сделал так:
    PHP код:
    stock SetPlayerHealthEx(playeridFloat:Health)
    {
        new 
    Float:OldHealth;
        
    GetPlayerHealth(playeridOldHealth);
        
    SetPlayerHealth(playeridHealth);
        if(
    Health != OldHealthSetTimerEx("CheckNopHealth"10000"iff"playeridHealthOldHealth);
        return 
    1;
    }

    forward CheckNopHealth(playeridFloat:HealthFloat:OldHealth);
    public 
    CheckNopHealth(playeridFloat:HealthFloat:OldHealth)
    {
        new 
    Float:NewHealth;
        
    GetPlayerHealth(playeridNewHealth);
        if(
    NewHealth != OldHealthKick(playerid);
        return 
    1;

    Правда не проверял на работоспособность. Но избавит от добавления кучи строк и избавит мод от вызова GetPlayerHealth для каждого игрока каждую секунду. Да и ложных срабатываний не должно быть.

    UPD: Если присутствует в моде анти-гм, можно спокойно добавить в этот код нужные переменные, хранящие здоровье, и присвоить им новое значение здоровья
    Последний раз редактировалось DeimoS; 12.02.2014 в 20:00.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  6. #6
    Аватар для Salvacore
    Инжунер-погромист

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Адрес
    Аҧсуа бызшәа
    Сообщений
    2,271
    Репутация:
    418 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    НОП блокирует пакеты от сервера, которые несут в себе информацию о смене HP игроку через серверную функцию. (далее я расписал своё негодование по поводу твоих проверок, но...)
    Кажется я понял то, какого результата ты пытаешься добиться. Раз игрок блокирует НОПом пакеты с SetPlayerHealth, значит здоровье его не меняется. Следовательно мы можем чуть увеличить значение, которое мы посылаем игроку, а после сделать проверку на то, изменилось ли у него здоровье или нет. Но я бы сделал так:
    PHP код:
    stock SetPlayerHealthEx(playeridFloat:Health)
    {
        new 
    Float:OldHealth;
        
    GetPlayerHealth(playeridOldHealth);
        
    SetPlayerHealth(playeridHealth);
        if(
    Health != OldHealthSetTimerEx("CheckNopHealth"10000"iff"playeridHealthOldHealth);
        return 
    1;
    }

    forward CheckNopHealth(playeridFloat:HealthFloat:OldHealth);
    public 
    CheckNopHealth(playeridFloat:HealthFloat:OldHealth)
    {
        new 
    Float:NewHealth;
        
    GetPlayerHealth(playeridNewHealth);
        if(
    NewHealth != NewHealth && NewHealth == OldHealthKick(playerid);
        return 
    1;

    Правда не проверял на работоспособность. Но избавит от добавления кучи строк и избавит мод от вызова GetPlayerHealth для каждого игрока каждую секунду. Да и ложных срабатываний не должно быть.

    UPD: Если присутствует в моде анти-гм, можно спокойно добавить в этот код нужные переменные, хранящие здоровье, и присвоить им новое значение здоровья
    Буду пользоваться.

  7. #7
    Аватар для Dima_Tushin
    Пользователь

    Статус
    Оффлайн
    Регистрация
    21.04.2013
    Адрес
    Россия
    Сообщений
    154
    Репутация:
    1 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    НОП блокирует пакеты от сервера, которые несут в себе информацию о смене HP игроку через серверную функцию. (далее я расписал своё негодование по поводу твоих проверок, но...)
    Кажется я понял то, какого результата ты пытаешься добиться. Раз игрок блокирует НОПом пакеты с SetPlayerHealth, значит здоровье его не меняется. Следовательно мы можем чуть увеличить значение, которое мы посылаем игроку, а после сделать проверку на то, изменилось ли у него здоровье или нет. Но я бы сделал так:
    PHP код:
    stock SetPlayerHealthEx(playeridFloat:Health)
    {
        new 
    Float:OldHealth;
        
    GetPlayerHealth(playeridOldHealth);
        
    SetPlayerHealth(playeridHealth);
        if(
    Health != OldHealthSetTimerEx("CheckNopHealth"10000"iff"playeridHealthOldHealth);
        return 
    1;
    }

    forward CheckNopHealth(playeridFloat:HealthFloat:OldHealth);
    public 
    CheckNopHealth(playeridFloat:HealthFloat:OldHealth)
    {
        new 
    Float:NewHealth;
        
    GetPlayerHealth(playeridNewHealth);
        if(
    NewHealth != OldHealthKick(playerid);
        return 
    1;

    Правда не проверял на работоспособность. Но избавит от добавления кучи строк и избавит мод от вызова GetPlayerHealth для каждого игрока каждую секунду. Да и ложных срабатываний не должно быть.

    UPD: Если присутствует в моде анти-гм, можно спокойно добавить в этот код нужные переменные, хранящие здоровье, и присвоить им новое значение здоровья
    как только SPAWN меня кикнуло!

  8. #8
    Аватар для underwoker
    Пользователь

    Статус
    Оффлайн
    Регистрация
    07.03.2014
    Сообщений
    331
    Репутация:
    47 ±
    Цитата Сообщение от Dima_Tushin Посмотреть сообщение
    как только SPAWN меня кикнуло!
    У тебя другая функция выдачи HP. Замени на эту.
    "Власть, кровь, няш-мяш, кровь, власть, Крым наш!" - (c) Наталья Поклонская.

    Критик должен быть готов и способен в любой момент и по первому требованию занять место критикуемого им и выполнять его дело продуктивно и компетентно. В противном случае критика превращается в наглую, самодовлеющую силу и становится тормозом на пути прогресса. (с) AXE

  9. #9
    Аватар для iStrange
    Пользователь

    Статус
    Оффлайн
    Регистрация
    07.03.2014
    Сообщений
    54
    Репутация:
    26 ±
    Довольно таки не плохо и познавательно. Благодарю.

  10. #10
    Аватар для VeRyNaYa
    Пользователь

    Статус
    Оффлайн
    Регистрация
    07.02.2015
    Адрес
    Беларусь
    Сообщений
    4
    Репутация:
    0 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    НОП блокирует пакеты от сервера, которые несут в себе информацию о смене HP игроку через серверную функцию. (далее я расписал своё негодование по поводу твоих проверок, но...)
    Кажется я понял то, какого результата ты пытаешься добиться. Раз игрок блокирует НОПом пакеты с SetPlayerHealth, значит здоровье его не меняется. Следовательно мы можем чуть увеличить значение, которое мы посылаем игроку, а после сделать проверку на то, изменилось ли у него здоровье или нет. Но я бы сделал так:
    PHP код:
    stock SetPlayerHealthEx(playeridFloat:Health)
    {
        new 
    Float:OldHealth;
        
    GetPlayerHealth(playeridOldHealth);
        
    SetPlayerHealth(playeridHealth);
        if(
    Health != OldHealthSetTimerEx("CheckNopHealth"10000"iff"playeridHealthOldHealth);
        return 
    1;
    }

    forward CheckNopHealth(playeridFloat:HealthFloat:OldHealth);
    public 
    CheckNopHealth(playeridFloat:HealthFloat:OldHealth)
    {
        new 
    Float:NewHealth;
        
    GetPlayerHealth(playeridNewHealth);
        if(
    NewHealth != OldHealthKick(playerid);
        return 
    1;

    Правда не проверял на работоспособность. Но избавит от добавления кучи строк и избавит мод от вызова GetPlayerHealth для каждого игрока каждую секунду. Да и ложных срабатываний не должно быть.

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

 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •