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
Функция (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