Эмуляция подъема оружия

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
14
Реакции
6
Добрый вечер. Суть такова: мне нужно каким-то чудом "эмулировать" подбирание оружия у игрока. Сейчас я просто регистрирую ham на touch, проверяю все условия и делаю drop_to_floor(<индекс энтити оружия>). И оно-то вроде работает, но если, например, брать оружие грабом, или если игрок стоит на самом краю, то это не лучший вариант: граб постоянно перемещает его к прицелу, а в ham'е его обратно дропают на землю; а если человек на краю - то оружие и вовсе tp на пол (то есть еще ниже, чем игрок).

Я попытался найти какой-нибудь ham, чтобы сделать подбор оружия игроку через ExecuteHamB, но ничего толкового не нашел. Можно, конечно, немного скостылить и просто выдавать игроку оружие (через fakemeta или что еще), но тогда по идее патроны в обойме тоже будут ставится по новому (ну а даже если делать кучу функций на получение патрон у энтити, то код будет ну уж слишком большим). И-так, суть вопроса: как мне при касании сразу выдавать оружие игроку, при этом сохраняя кол-во патронов в обойме?


Код:
new iWeaponsId[32], iNum;
get_user_weapons(iTouched, iWeaponsId, iNum);
static bHaveWeapon;
bHaveWeapon = false;
new iBitWeapons = pev(iTouched, pev_weapons);
new iWpnID = rg_get_weaponbox_id(iEntity);
if((iBitWeapons & (1<<CSW_GLOCK18|1<<CSW_USP|1<<CSW_P228|1<<CSW_DEAGLE|1<<CSW_ELITE|1<<CSW_FIVESEVEN) && (1<<iWpnID) & (1<<CSW_GLOCK18|1<<CSW_USP|1<<CSW_P228|1<<CSW_DEAGLE|1<<CSW_ELITE|1<<CSW_FIVESEVEN)) ||
(iBitWeapons & (1<<CSW_M3|1<<CSW_XM1014|1<<CSW_MAC10|1<<CSW_TMP|1<<CSW_MP5NAVY|1<<CSW_UMP45|1<<CSW_P90|1<<CSW_GALIL|1<<CSW_FAMAS|1<<CSW_AK47|1<<CSW_M4A1|1<<CSW_SCOUT|1<<CSW_SG552|1<<CSW_AUG|1<<CSW_AWP|1<<CSW_G3SG1|1<<CSW_SG550|1<<CSW_M249) &&
(1<<iWpnID) & (1<<CSW_M3|1<<CSW_XM1014|1<<CSW_MAC10|1<<CSW_TMP|1<<CSW_MP5NAVY|1<<CSW_UMP45|1<<CSW_P90|1<<CSW_GALIL|1<<CSW_FAMAS|1<<CSW_AK47|1<<CSW_M4A1|1<<CSW_SCOUT|1<<CSW_SG552|1<<CSW_AUG|1<<CSW_AWP|1<<CSW_G3SG1|1<<CSW_SG550|1<<CSW_M249))) bHaveWeapon = true;


static Float: fGameTime;
fGameTime = get_gametime();

if(!bHaveWeapon && !(pev(iEntity, pev_flags) & FL_ONGROUND) && fGameTime - get_entvar(iEntity, var_iuser3) > 0.2) drop_to_floor(iEntity);
За код ничего писать не нужно - я пока просто играюсь и смотрю на результат "а что если". Но вот небольшое пояснение:
iWeaponsId - массив, где будут хранится weapon-индексы всех оружий у игрока.
bHaveWeapon - флаг (я знаю, что в коде он интовый), который указывает на то есть у игрока уже это оружие или нет.
iBitWeapons - битсумма, которая хранит в себе битовую сумму оружий игрока (трудно объяснить)
iWpnID - переменная, которая хранит в себе weapon-индекс энтити
fGameTime - get_entvar(iEntity, var_iuser3) > 0.2 - я отлавливаю момент выкидывания оружия и устанавливаю ему в var_iuser3 время (чтобы игрок не подбирал его моментально обратно)

Вроде все. Надеюсь на любую помощь! Хотя бы статейку!!!
 
Сообщения
1,701
Реакции
1,512
Помог
26 раз(а)
Нужно флаг выставлять, что оружие якобы на земле (var_flags | FL_ONGROUND) и делать тач, желательно сразу хамом.
 
Сообщения
14
Реакции
6
fl0wer, спасибо, работает супер)

На самом деле, я изначально тоже так хотел сделать, но побоялся рекурсии и только когда последовал твоему совету увидел, что оказывается в fakemet'е есть 2 функции: одна отлавливает (и может вызвать рекурсию), а другая как раз то, что мне нужно
 
  • Нравится
Реакции: fgd
Статус
В этой теме нельзя размещать новые ответы.

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

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу