PDA

Просмотр полной версии : [Вопрос] GetPlayerWeapon в машине



Glant
29.07.2016, 21:41
А что за баг 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 нет этого фикса, что странно.

Daniel_Cortez
29.07.2016, 23:11
В SA-MP wiki так и сказано, что это не баг, а фича (http://wiki.sa-mp.com/wiki/GetPlayerWeapon) и никто это исправлять не будет.

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.