Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 2 из 2
  1. #1
    Аватар для Glant
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.07.2014
    Сообщений
    54
    Репутация:
    3 ±

    GetPlayerWeapon в машине

    А что за баг GetPlayerWeapon, когда игрок находится в машине? И почему его до сих пор не пофиксили?
    Для тех кто не знает что за баг: Если при вызове функции игрок находится в транспорте, то функция возвращает id оружия, которое было до того, как он собственно оказался в транспорте.

    До сей поры применял примерно такой метод:
    Макрос выдачи оружия:
    Код:
    #define GiveWeapon(%0,%1,%2) GivePlayerWeapon(%0,%1,%2), SetPVarInt(%0,"ArmedWeapon",%1)
    И для получения:
    Код:
    #define GetWeapon(%0) GetPVarint(%0,"ArmedWeapon")
    Конечно лучше было бы реализовывать это с перехватчиками функций, но общей сути это не меняет.


    Но здесь есть проблема, если игрок имеет оружие типа UZI, но садится в машину с кулаком или любым другим оружием, то когда игрок сел, у него в руках оказывается тот самый UZI. И тут уж никак не отследишь изменения.


    Сейчас есть такая идея, в паблике OnPlayerStateChange делать проверку на водителя, затем запарсить весь арсенал игрока на наличие одного из 3 моделей оружия (теки, узи, и мп5, они все занимают 1 слот) с GetPlayerWeaponData и в случае нахождения, записывать в переменную id оружия.
    Однако и тут загвоздка, из личного опыта знаю, что при наличии такого вида оружия при посадке отнюдь не всегда в руках оказывается оно самое, и иногда приходилось пересаживаться заного.

    Вот такая головоломка, может у кого нибудь есть решение?

    P.S в fixes.inc нет этого фикса, что странно.
    Последний раз редактировалось Glant; 29.07.2016 в 21:45.

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    В SA-MP wiki так и сказано, что это не баг, а фича и никто это исправлять не будет.
    Prior to version 0.3z R1-2, when the player state is PLAYER_STATE_PASSENGER this function returns the weapon held by the player before they entered the vehicle. If a cheat is used to spawn a weapon inside a vehicle, this function will not report it.
    Ок, на самом деле там нет никаких слов о том, что этот баг не исправят. Но давайте будем реалистами: в SA-MP если баг не приводит к крашу сервера или клиента, его оставят, не то изменится логика работы сервера и бедным владельцам крупных проектов придётся переписывать свои скрипты (бедапечаль). В результате рядовым скриптерам приходится самостоятельно делать костыли - так было раньше и будет всегда, пока SA-MP не протухнет окончательно.

    Как раз такой костыль и можно сделать: перехватить GetPlayerWeapon и в этом перехвате, если игрок в машине, по определённой логике "угадать", какое у него оружие на самом деле. Кроме того, следует учесть ситуацию, что можно использовать функции GivePlayerWeapon, SetPlayerArmedWeapon и ResetPlayerWeapons, пока игрок в транспорте, а значит придётся перехватывать ещё и эти функции и дублировать инфу об оружии и патронах на стороне сервера. Впрочем, этого всего на целый античит должно хватить.

    В общем, советую вам посмотреть в сторону уже существующих античитов на оружие, чтобы не изобретать велосипед. Сам бы порекомендовал какой-нибудь античит из паблика, но давно уже ничего не делал в SA-MP.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

 

 

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

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

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

Ваши права

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