PDA

Просмотр полной версии : [Function] FIX_SetPlayerAmmo



vovandolg
29.07.2016, 18:19
Описание:

Функция (FIX_SetPlayerAmmo) исправляющая стандартную SetPlayerAmmo

Баг заключался в следующем, если в данном оружие кончается б/к(ammo = 0) и после его пополнить функцией
SetPlayerAmmo, патроны были на месте(всё выдалось благополучно),
но у игрока вместо стрельбы отыгрывало анимацию стрельбы без выстрела и без потери патронов.
То есть проигрывалась имитация стрельбы.

FIX_SetPlayerAmmo возвращает 3 значения:
-1: Игрок не в сети
0 : Не валидный ID оружия (т.е. у Вас нету такого оружия на руках или за спиной)
1 : Патроны установлены успешно

Код:


// объявляем массив в котором указаны слоты к каждому оружию
static const weapon_slot[47] =
{
0, 0,
1, 1, 1, 1, 1, 1, 1, 1,
10, 10, 10, 10, 10, 10,
8, 8, 8,
0, 0, 0, //19-21
2, 2, 2,
3, 3, 3,
4, 4,
5, 5,
4,
6, 6,
7, 7, 7, 7,
8,
12,
9, 9, 9,
11, 11, 11
};

//собственно вот и сам фикс
stock FIX_SetPlayerAmmo(playerid, weaponid, ammo) // устанавливаем кол-во патронов
{
new getweapon, getammo;
if(GetPlayerWeaponData(playerid, weapon_slot[weaponid], getweapon, getammo) == 0)
return -1;
if(weaponid != getweapon)
return 0;
if(getammo != 0) SetPlayerAmmo(playerid, weaponid, ammo);
else GivePlayerWeapon(playerid, weaponid, ammo);
return 1;
}
#if defined _ALS_SetPlayerAmmo
#undef SetPlayerAmmo
#else
#define _ALS_SetPlayerAmmo
#endif
#define SetPlayerAmmo FIX_SetPlayerAmmo
//конец фикса, дальше чисто для собственной нужды писал

//Ещё один олд варик
stock GivePlayerAmmo(playerid, weaponid, amount) // выдаём/забираем кол-во патронов
{
new getweapon, getammo;
if(GetPlayerWeaponData(playerid, weapon_slot[weaponid], getweapon, getammo) == 0)
return -1;
if(weaponid != getweapon)
return 0;
if(getammo != 0) SetPlayerAmmo(playerid, weaponid, getammo + amount);
else GivePlayerWeapon(playerid, weaponid, amount);
return 1;
}


Пример использования:


CMD:setammo(playerid, params[])
{
new weaponid, ammo;
if(sscanf(params, "dd", weaponid, ammo))
return SendClientMessage(playerid, -1, !"Использование: /setammo [id оружия] [кол-во]");
if(SetPlayerAmmo(playerid, weaponid, ammo) != 1)
return SendClientMessage(playerid, -1, !"Игрок не в сети или введён боекомплект к его несуществующему оружию!");
SendClientMessage(playerid, -1, !"Вы установили кол-во патронов в выбранный слот!");
return 1;
}


Автор темы:

vovandolg
Помогал:

ziggi

Redsan
29.07.2016, 18:30
Описал бы баг :scratch_one-s_head:

vovandolg
29.07.2016, 18:37
Обновил шапку темы =)

m1n1vv
27.09.2016, 21:27
Я это таким способом обошел. Нужно было забрать у игрока патроны со слота с одного оружия и выдать другое оружие с того же слота. Забрать с M4 с патронами и выдать AK47.

GivePlayerWeapon(playerid, 31, 1);
SetPlayerAmmo(playerid, 31, 0);
GivePlayerWeapon(playerid, 31, 500);
Глупо, но работает.

Можно такое сделать )

stock GivePlayerNewWeapon(playerid, weaponid, ammo)
{
GivePlayerWeapon(playerid, weaponid, 1);
SetPlayerAmmo(playerid, weaponid, 0);
GivePlayerWeapon(playerid, weaponid, ammo);
return 1;
}

vovandolg
27.09.2016, 22:00
Я это таким способом обошел. Нужно было забрать у игрока патроны со слота с одного оружия и выдать другое оружие с того же слота. Забрать с M4 с патронами и выдать AK47.

GivePlayerWeapon(playerid, 31, 1);
SetPlayerAmmo(playerid, 31, 0);
GivePlayerWeapon(playerid, 31, 500);
Глупо, но работает.

Можно такое сделать )

stock GivePlayerNewWeapon(playerid, weaponid, ammo)
{
GivePlayerWeapon(playerid, weaponid, 1);
SetPlayerAmmo(playerid, weaponid, 0);
GivePlayerWeapon(playerid, weaponid, ammo);
return 1;
}

Ну так ты принуждённо выдаёшь ствол) а у меня проверки разные на то что игрок выдаёт патроны на данный ствол, а не на левый какой то.

Geebrox
06.10.2016, 04:01
я бы возвращал -1 0 и 1, что бы сразу проверять < if(func) код; > ну это чисто для удобства :pardon:

vovandolg
06.10.2016, 04:43
я бы возвращал -1 0 и 1, что бы сразу проверять < if(func) код; > ну это чисто для удобства :pardon:

Удобнее когда видно чему конкретно равняется или не равняется, а просто название в скобках как то одиноко))

Dima_Tushin
28.01.2017, 21:21
Вопросик такой как сделать проверку на Серверное оружие т.е игрока и читерское оружие + CMD для админов

vovandolg
29.01.2017, 01:16
Вопросик такой как сделать проверку на Серверное оружие т.е игрока и читерское оружие + CMD для админов

Weapon-Ammo-Hack (http://pro-pawn.ru/showthread.php?14333-%D0%90%D0%BD%D1%82%D0%B8-Weapon-Ammo-Hack)

Enrique_Black
22.04.2017, 03:44
Ну вообще использовать функцию
GetPlayerWeaponData не хорошо что ли, хотя бы по той причине что она далеко не всегда возвращает правильные значения и не всегда вовремя.

Так же если ты пишешь фикс связанный с патронами то мог сразу и учесть максимальное количество патрон.


value < -32768
value > 32768

vovandolg
25.04.2017, 03:19
Ну вообще использовать функцию
GetPlayerWeaponData не хорошо что ли, хотя бы по той причине что она далеко не всегда возвращает правильные значения и не всегда вовремя.

хм, не когда такое не наблюдал(год где то античит написанный на GPWD не барахлил вообще), кроме случая со смертью(кол-во патронов не обнулялось, но этот баг изи и может любой скриптёр пофиксить)


Так же если ты пишешь фикс связанный с патронами то мог сразу и учесть максимальное количество патрон.


value < -32768
value > 32768

А это тут причём?
Суть бага была в том что если оружие имеет 0(не меньше и не больше) патронов(то бишь прячется за спину пока не появятся в нём патроны)
то при последующем пополнении патронов через SetPlayerAmmo игрок кроме проигрывания анимации не стрелял уже(тупо анимация стрельбы).
Как видишь фиксить нужно было пере выдачу оружия, далее с патронами всё работает прекрасно.

ziggi
25.04.2017, 08:18
хм, не когда такое не наблюдал(год где то античит написанный на GPWD не барахлил вообще), кроме случая со смертью(кол-во патронов не обнулялось, но этот баг изи и может любой скриптёр пофиксить)

Это правда, более того, даже GetPlayerWeapon может возвратить устаревшие данные. Это особенности работы SA-MP, где-то даже была статья на эту тему.