PDA

Просмотр полной версии : [Вопрос] Как окончательно забрать оружие у игрока



m1n1vv
18.06.2016, 22:41
Столкнулся с такой проблемой. Не получается окончательно забрать оружие у игрока.
Сохранение:

for (new i = 0; i < 13; i++)
{
GetPlayerWeaponData(playerid, i, pInfo[playerid][pWeapons][i], pInfo[playerid][pAmmo][i]);
if (pInfo[playerid][pWeapons][i] != 0 && pInfo[playerid][pAmmo][i] == 0)
pInfo[playerid][pWeapons][i] = 0;
}
Но даже если это выполнится, положительный результат на отсутствие оружия будет после смерти или повторного входа на сервер.

Сама проверка в инклуде:

new
mn_player_weapons[7],
mn_player_ammo[7];
for (new i = 2; i < 7; i++)
{
GetPlayerWeaponData(playerid, i, mn_player_weapons[i], mn_player_ammo[i]);
if (mn_player_weapons[i] == mn_weaponid{playerid})
return SendClientMessage(playerid, 0xAA3333AA, !"У Вас уже есть это оружие");
}

И если выполнить команду, то оружие появится на долю секунды.

CMD:d(playerid)
{
for (new i = 0; i < 13; i++)
{
GetPlayerWeaponData(playerid, i, pInfo[playerid][pWeapons][i], pInfo[playerid][pAmmo][i]);
GivePlayerWeapon(playerid, pInfo[playerid][pWeapons][i], pInfo[playerid][pAmmo][i]);
}
return 1;
}

С ResetPlayerWeapons(playerid) условие, что у игрока нет оружия, положительное, но это не выход из ситуации.

vovandolg
19.06.2016, 00:35
Может патронташ тоже стоит обнулять?


if (pInfo[playerid][pWeapons][i] > 0 || pInfo[playerid][pAmmo][i] > 0)
pInfo[playerid][pWeapons][i] = 0, pInfo[playerid][pAmmo][i] = 0;

m1n1vv
19.06.2016, 01:13
Может патронташ тоже стоит обнулять?


if (pInfo[playerid][pWeapons][i] > 0 || pInfo[playerid][pAmmo][i] > 0)
pInfo[playerid][pWeapons][i] = 0, pInfo[playerid][pAmmo][i] = 0;

Не до конца понял. Мне нужно забрать 1 оружие, например AK-47.

Когда я выдаю оружие, AK-47, и патроны, все записывается в бд. Но когда заканчиваются патроны, это оружие не приравнивается к 0. Поэтому такое условие:

if (pInfo[playerid][pWeapons][i] != 0 && pInfo[playerid][pAmmo][i] == 0)
pInfo[playerid][pWeapons][i] = 0;
Но почему когда у меня нет этого оружия, а GetPlayerWeaponData его находит я не понимаю.

vovandolg
19.06.2016, 01:24
Да так и есть) поэтому следить за патронами надо:smoke:
Ибо как кроме сброса не чем ты там не аннулируешь.

m1n1vv
19.06.2016, 02:18
Да так и есть) поэтому следить за патронами надо:smoke:
Ибо как кроме сброса не чем ты там не аннулируешь.

Ну я же и онулирую через эту функцию. Если ид оружия не равен 0, а патроны на нуле, то тот ид приравнять к 0.

if (pInfo[playerid][pWeapons][i] != 0 && pInfo[playerid][pAmmo][i] == 0)
pInfo[playerid][pWeapons][i] = 0;

ziggi
19.06.2016, 02:30
Можно просто изменить проверку, добавив в условие патроны:

new
mn_player_weapons[7],
mn_player_ammo[7];
for (new i = 2; i < 7; i++)
{
GetPlayerWeaponData(playerid, i, mn_player_weapons[i], mn_player_ammo[i]);
if (mn_player_weapons[i] == mn_weaponid{playerid} && mn_player_ammo[i] != 0)
return SendClientMessage(playerid, 0xAA3333AA, !"У Вас уже есть это оружие");
}

или после сохранения производить эти действия, но это не оптимально:

ResetPlayerWeapons(playerid);

for (new i = 0; i < 13; i++) {
GivePlayerWeapon(playerid, pInfo[playerid][pWeapons][i], pInfo[playerid][pAmmo][i]);
}

m1n1vv
19.06.2016, 03:01
Можно просто изменить проверку, добавив в условие патроны:

new
mn_player_weapons[7],
mn_player_ammo[7];
for (new i = 2; i < 7; i++)
{
GetPlayerWeaponData(playerid, i, mn_player_weapons[i], mn_player_ammo[i]);
if (mn_player_weapons[i] == mn_weaponid{playerid} && mn_player_ammo[i] != 0)
return SendClientMessage(playerid, 0xAA3333AA, !"У Вас уже есть это оружие");
}

или после сохранения производить эти действия, но это не оптимально:

ResetPlayerWeapons(playerid);

for (new i = 0; i < 13; i++) {
GivePlayerWeapon(playerid, pInfo[playerid][pWeapons][i], pInfo[playerid][pAmmo][i]);
}

Первый вариант решил проблему. Спасибо.