Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 2 из 4 ПерваяПервая 1 2 3 4 ПоследняяПоследняя
Показано с 11 по 20 из 33
  1. #11
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    Цитата Сообщение от Geebrox Посмотреть сообщение
    То есть обмен данными между пабликом, единственный выход?
    Вообще-то я имел в виду ваши слова о том, что OnPlayerTakeDamage вызывается при падении. Впрочем, я не знаю, как это можно использовать, да ещё и без ложных срабатываний.


    Цитата Сообщение от DeimoS Посмотреть сообщение
    Но вообще можешь попробовать вот в этом инклюде найти нужный тебе код:
    https://github.com/oscar-broman/samp...pon-config.inc
    Как говорит автор, этот инклюд полностью реализует здоровье на стороне сервера.
    Этот инклуд блокирует обычный урон, добавляя всех в одну команду (SetPlayerTeam). Правда, его использование может показаться немного сложным из-за того, что он предоставляет не совсем тот набор коллбэков, которые есть в SA-MP. Вместо OnPlayerGiveDamage и OnPlayerTakeDamage остался только коллбэк OnPlayerDamage. Мало того, добавились новые коллбэки OnPlayerDamageDone, OnPlayerPrepareDeath, OnPlayerDeathFinished, OnRejectedHit и OnInvalidWeaponDamage.

    Из плюсов можно отметить то, что в инклуде многое продумано: проверяется каждый выстрел и попадание - сделано это, чтобы избавиться от дефектов, возникающих из-за лагов, и исключить читерство.
    Например, если кто-то читами заставит дигл стрелять со скоростью пулемёта - видимый эффект останется, но слишком частого урона не будет. Мало того, будет вызываться коллбэк OnRejectedHit с информацией о выстреле/ударе (ID оружия, время выстрела, причина "отсеивания"), по которой можно будет сделать определённые выводы и забанить читера.

    Удивительно, что никто до сих пор не написал урока по использованию этого инклуда.
    По сути он реализует то, что могло бы быть в SA-MP из коробки, если бы куй реально занимался развитием мультиплеера, а не прикрывался "мнением держателей крупных проектов".


    Цитата Сообщение от DeimoS Посмотреть сообщение
    Можешь взять прямо его, а можешь попробовать вырезать нужный код.
    Нарушение авторских прав же.


    Цитата Сообщение от Geebrox Посмотреть сообщение
    А насчет инклуда, я в нем уже порылся, код не "супер", лучше уж свою реализовать, вот и открыл тему...
    Либо вы не имеете представления о качестве кода, либо плохо понимаете, с чем работаете - а работаете вы с SA-MP, мультплеером, в котором любые баги нужно исправлять с помощью своих костылей, ибо глупо надеяться, что Kalcor просто так возьмёт и исправит их сам.
    Да, тот инклуд не до конца исправляет проблему с NOP OnPlayerTakeDamage (при падении с высоты всё ещё можно заблокировать урон) но он и не специализируется на этой конкретной проблеме - зато устраняет кучу других проблем, которые могут возникнуть, если вы попытаетесь сделать свою систему серверного урона.
    Что касается урона от падений - вряд ли можно однозначно обнаружить читера, блокирующего такой тип урона. Можете попытаться установить факт падения (по анимации, скорости перемещения по оси Z, ненахождению в машине) и при остановке проверять изменение HP, но будут ложные срабатывания, поскольку можно даже без читов упасть с высоты и не разбиться (приземлиться на машину, в воду, на наклонную поверхность или узкий участок поверхности, на котором игрок застрянет).
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  2. Пользователь сказал cпасибо:
    Geebrox (08.07.2016)
  3. #12
    Аватар для Geebrox
    Пользователь

    Статус
    Оффлайн
    Регистрация
    24.08.2015
    Адрес
    Ташкент
    Сообщений
    375
    Репутация:
    97 ±
    Daniel_Cortez, спасибо за ответ, я еще раз попытаюсь разобраться в этом инклуде

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Что касается урона от падений - вряд ли можно однозначно обнаружить читера, блокирующего такой тип урона. Можете попытаться установить факт падения (по анимации, скорости перемещения по оси Z, ненахождению в машине) и при остановке проверять изменение HP, но будут ложные срабатывания, поскольку можно даже без читов упасть с высоты и не разбиться (приземлиться на машину, в воду, на наклонную поверхность или узкий участок поверхности, на котором игрок застрянет).
    можно же отследить падение игрока в OnPlayerTakeDamage без ложных срабатывание

    Выглядит это примерно так:

    PHP код:
    if(issuerid == INVALID_PLAYER_ID && amount 2.5
    && weaponid == WEAPON_COLLISION && bodypart == 3)
    {
        new 
    Float:health;
        
    GetPlayerHealth(playeridhealth);
        
    health -= amount;
        return 
    SetPlayerHealth(playeridhealth);

    или это не сработает?
    Последний раз редактировалось Geebrox; 08.07.2016 в 21:36.

  4. #13
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    Цитата Сообщение от Geebrox Посмотреть сообщение
    можно же отследить падение игрока в OnPlayerTakeDamage без ложных срабатывание
    Просто взгляните ещё раз на название темы.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  5. #14
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Нарушение авторских прав же.
    Оно лицензируется под Apache License 2.0, а это значит, что библиотеку или её часть, можно использовать практически как угодно. Wiki: "Единственным условием, накладываемым лицензией Apache, является информирование получателя о факте использования исходного кода.".
    Сама библиотека хорошая, но мне интересно услышать отзывы от держателей более-менее нагруженных серверов.
    Последний раз редактировалось ziggi; 08.07.2016 в 23:40.

  6. 2 пользователя(ей) сказали cпасибо:
    Nash_Brigers (10.07.2016) VVWVV (08.07.2016)
  7. #15
    Аватар для Geebrox
    Пользователь

    Статус
    Оффлайн
    Регистрация
    24.08.2015
    Адрес
    Ташкент
    Сообщений
    375
    Репутация:
    97 ±
    Сделал примерное обмен данными между OnPlayerTakeDamage и секундным пабликом:

    PHP код:
    //Уникальные параметры, что бы понимать, что public был вызван секундным таймером:
    #define WEAPON_SYNC 99
    #define BODY_PART_SYNC 99

    //Использовал бит, что бы добавить синхронизацию и для других public'ов, если все выйдет успешным
    enum(<<= 1)
    {
            
    OPTD_sync 1,
            
    OPGD_sync
    };
    new 
    player_sync[playerid];

    //Секундный таймер
    public OnPlayerUpdateStatus(playerid)
    {
            if((
    player_sync[playerid] & OPTD_sync) != 0)
                
    Kick(playerid);
            
    player_sync[playerid] ^= OPTD_sync;
            
    CallLocalFunction("OnPlayerTakeDamage""iifii",
            
    playeridINVALID_PLAYER_ID0.0WEAPON_SYNCBODY_PART_SYNC); //вызов OPTD с уникальными параметрами
            //Повторная настройка таймера, не добавил сюда
            
    return 1;
    }

    //OPTD
    public OnPlayerTakeDamage(playeridissueridFloat:amountweaponidbodypart)
    {
            if(
    issuerid == INVALID_PLAYER_ID && amount == 0.0
            
    && weaponid == WEAPON_SYNC && bodypart == BODY_PART_SYNC//Если все параметры совпадают с уникальными для синхронизации
            
    {
                if((
    player_sync[playerid] & OPTD_sync) == 0)
                        
    Kick(playerid);
                
    player_sync[playerid] ^= OPTD_sync;
                return 
    0;
            }
            return 
    1;

    Вроде все без ошибки реализовал, но не ловит NOP. Помогите пожалуйста

    P.S. weapon_config.inc не буду использовать, я почти все реализовал и не хочу менять
    Последний раз редактировалось Geebrox; 09.07.2016 в 01:11.

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

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    547
    Репутация:
    158 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Удивительно, что никто до сих пор не написал урока по использованию этого инклуда.
    На самом деле самым сложным было лишь найти плагин SKY, на котором это всё работает, под линукс (благо добрые люди скомпилили в комментах). Какие проблемы могут возникнуть при простом вырезании кода из OnPlayerGive/TakeDamage в OnPlayerDamage я не понмаю (ну разве что те люди будут умом тронутые). А все остальные фичи, такие как настройка урона от выстрелов или падения выставляются парой функций, также ничего сложного.

    Цитата Сообщение от Geebrox Посмотреть сообщение
    Вроде все без ошибки реализовал, но не ловит NOP. Помогите пожалуйста
    Опиши принцип работы твоего кода, а то во все эти битовые операции лень вникать.
    Последний раз редактировалось Nexius_Tailer; 09.07.2016 в 01:14.
    Не хотите постоянно проверять обновления моих скриптов?
    Подключите его последним, после всех остальных
    Nexius's Update Checker

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

    Статус
    Оффлайн
    Регистрация
    24.08.2015
    Адрес
    Ташкент
    Сообщений
    375
    Репутация:
    97 ±
    Цитата Сообщение от Nexius_Tailer Посмотреть сообщение


    Опиши принцип работы твоего кода, а то во все эти битовые операции лень вникать.
    Если описать как обычный переменный, то в секундном таймере проверяется, если переменный не равен 0 значит заблокирован вызов OPTD, далее присваивается переменному 0, вызывается OPTD с уникальными параметрами что бы понять, что вызов был для проверки синхронизации, там присваивается переменному 1, и так далее по кругу, если один из public'ов сбился со счета значит чит, ну примерно так, я не мастер объяснений
    Последний раз редактировалось Geebrox; 09.07.2016 в 01:25.

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

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    547
    Репутация:
    158 ±
    Цитата Сообщение от Geebrox Посмотреть сообщение
    Если описать как обычный переменный, то в секундном таймере проверяется, если переменный не равен 0 значит заблокирован вызов OPTD, далее присваивается переменному 0, вызывается OPTD с уникальными параметрами что бы понять, что вызов был для проверки синхронизации, там присваивается переменному 1, и так далее по кругу, если один из public'ов сбился со счета значит чит, ну примерно так, я не мастер объяснений
    Так ты же сервером этот паблик вызываешь. Ноп - это игнорирование пакетов сервера клиентом, а не сервером :D
    Т.е. вызывая этот паблик самому, он будет вызываться независимо от того, стоят ли нопы у игрока, есть ли такой игрок на сервере вообще и тому подобное.
    Кароче выход из ситуации это наверное вышеупомянутый wc. Либо проверка, как написали выше, анимаций и подобного (кстати, когда-то анти-гм даже от пуль видел сделанный через проверку анимок, когда ещё даже OnPlayerGiveDamage не было). Хотя обойти это, зная что ты проверяешь будет скорее всего не сложно.

    П.с. Вся соль ещё и в том, что при нанесении урона одним игроком другому мы точно знаем хотя-бы на 50%, что урон должен быть нанесён, и даже отключив вызов TakeDamage у жертвы, нам об этом сообщал киллер. А в данном случае у нас нет больше данных, кроме как от самой жертвы.
    Последний раз редактировалось Nexius_Tailer; 09.07.2016 в 01:41.
    Не хотите постоянно проверять обновления моих скриптов?
    Подключите его последним, после всех остальных
    Nexius's Update Checker

  11. Пользователь сказал cпасибо:
    Geebrox (09.07.2016)
  12. #19
    Аватар для Geebrox
    Пользователь

    Статус
    Оффлайн
    Регистрация
    24.08.2015
    Адрес
    Ташкент
    Сообщений
    375
    Репутация:
    97 ±
    ааа вот значит что! Простите я просто не до конца понял принцип работы NOP

    Да Вы обсолютно правы, про жертву и цель) Попробую что-то другое реализовать. Спасибо за ответ

    P.S. а можно обратится к памяти клиента и отследить работу OnPlayerTakeDamage?

  13. #20
    Аватар для Nexius_Tailer
    Пользователь

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    547
    Репутация:
    158 ±
    Цитата Сообщение от Geebrox Посмотреть сообщение
    P.S. а можно обратится к памяти клиента и отследить работу OnPlayerTakeDamage?
    Скорее всего можно.
    Увы, я на этот вопрос не отвечу, ибо я против любых вмешательств в память клиента, даже если тот читер (такие уж у меня взгляды).
    Был где-то мануал как пользоваться самой функцией, но адресов там очень много, и наверное потребуется какое-то время, чтобы найти нужный.
    Не хотите постоянно проверять обновления моих скриптов?
    Подключите его последним, после всех остальных
    Nexius's Update Checker

  14. Пользователь сказал cпасибо:
    Geebrox (09.07.2016)
 

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

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

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

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

Ваши права

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