В процессе написания плагина понадобилось сэмулировать наличие у игрока определенного оружия в инвентаре поверх имеющего. Ок, это сделали, но вот как побороть ниже описанный баг не представляю.
Фото №1 - Игрок получил нож, но он не отображается в худе
Фото №2 - Игрок дополнительно получил пистолет, и нож отобразился
Фото №3 - Игрок дополнительно получает еще оружие, но оно не отображается(Как видим веапонлист корректно обновился, но в списке его нет оО)
Отсылка клиенту нового списка оружия:
- Код: Выделить всё
public FM_Hook_UpdateClientData_Post(iClient, SendWeapons, CD_Handle)
{
static pView; pView = iClient;
if(!IsUserAlive(pView))
{
if(!(pView = get_cd(CD_Handle, CD_iUser2)))
return FMRES_IGNORED;
}
#if defined _zdt_wc_testfunc
static Float:fDelayMsg[33]; //DEBUG
if(fDelayMsg[pView] <= get_gametime() && pView == iClient)
{
new Msg[128], i;
static wpn[32], buf[2], name[32];
for(i = 1; i <= CSW_LAST_WEAPON+1; i++)
{
if(!(g_UserWeapons[pView] & BIT(i)))
continue;
get_weaponname(i, wpn, 31);
strtok(wpn, buf, charsmax(buf), name, charsmax(name), '_');
format(Msg, charsmax(Msg), "%s|%s", Msg, name);
}
fDelayMsg[pView] = get_gametime() + 1.0;
client_print(iClient, print_chat, "Weapons:%s", Msg);
}
static Weapons; Weapons = get_cd(CD_Handle, CD_Weapons);
if(Weapons & BIT(CSW_VEST))
Weapons = BIT(CSW_VEST);
Weapons |= g_UserWeapons[pView]
set_cd(CD_Handle, CD_Weapons, Weapons);
#endif
return FMRES_IGNORED;
}
Отсылка клиенту обновленного веапонлиста:
- Код: Выделить всё
stock ShowWeaponList(pPlayer, pItem)
{
new szWeaponName[ML_WPN_WEAPONLIST];
ITEM_GetWeaponlist(pItem, szWeaponName, charsmax(szWeaponName));
if(!szWeaponName[0])
rg_get_iteminfo(pItem, ItemInfo_pszName, szWeaponName, charsmax(szWeaponName));
new iPriAmmoType = get_member(pItem, m_Weapon_iPrimaryAmmoType);
new iMaxPriAmmo = rg_get_iteminfo(pItem, ItemInfo_iMaxAmmo1);
new iSecAmmoType = get_member(pItem, m_Weapon_iSecondaryAmmoType);
new iMaxSecAmmo = rg_get_iteminfo(pItem, ItemInfo_iMaxAmmo2);
new iSlot = rg_get_iteminfo(pItem, ItemInfo_iSlot);
new iPosition = rg_get_iteminfo(pItem, ItemInfo_iPosition);
new iId = rg_get_iteminfo(pItem, ItemInfo_iId);
new iFlags = rg_get_iteminfo(pItem, ItemInfo_iFlags);
#if defined _zdt_wc_testfunc
iId = ITEM_GetIconID(pItem); //Новый CSW_ID оружия
#endif
message_begin(MSG_ONE, MSG_ID_WEAPONLIST, _, pPlayer);
write_string(szWeaponName)
write_byte(iPriAmmoType)
write_byte(iMaxPriAmmo)
write_byte(iSecAmmoType)
write_byte(iMaxSecAmmo)
write_byte(iSlot)
write_byte(iPosition)
write_byte(iId)
write_byte(iFlags)
message_end()
}
Смотрел исходники клиента HL, но кроме составления списка оружия на основании weapons ничего больше не заметил