В оригинальном ТЧ (а может и в ЧН/ЗП) есть баг со скрытием оружия.
Есть вызываем скриптовый метод db.actor:hide_weapon() то оружие исчезает сразу, не отыгрывая анимацию holster (hide). При этом, если скрыть оружие кнопкой на клавиатуре (например, для слота автоматов это кнопка 3), то оружие скрывается нормально, отыгрывая анимацию.
Долго ковыряв стек вызовов, решил сравнить, что происходит при скрытии оружия кнопкой. Сравнил стек функции
CInventory::Activate и понял, что он абсолютно идентичен что при скрытии кнопкой, так и при скрытии через скрипт. Постепенно стал идти по стеку вызова функций и нашел место, где происходит разное поведение:
Если скрыть оружие таким образом
Код
pActor->inventory().SetSlotsBlocked(u16(INV_STATE_BLOCK_ALL), true);
то все
ОК.
А вот если вызвать
Код
pActor->SetWeaponHideState(INV_STATE_BLOCK_ALL, true);
то оружие
исчезнет сразу.
Но самое интересное, что SetWeaponHideState делает почти тоже самое, только вызов идет пересылками через пакет:
Код
void CActor::SetWeaponHideState (u32 State, bool bSet)
{
if (g_Alive() && this == Level().CurrentControlEntity())
{
NET_Packet P;
u_EventGen (P, GEG_PLAYER_WEAPON_HIDE_STATE, ID());
P.w_u32 (State);
P.w_u8 (u8(bSet));
u_EventSend (P);
};
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void CActor::OnEvent(NET_Packet& P, u16 type)
{
...
case GEG_PLAYER_WEAPON_HIDE_STATE:
{
u32 State = P.r_u32();
BOOL Set = !!P.r_u8();
inventory().SetSlotsBlocked ((u16)State, !!Set);
}break;
...
}
Спрашивается, в чем тут магия и почему разное поведение?
Попутно, заметил еще кое-что:
1) Болт скрывается с анимацией и по кнопке, и по скрипту. Но это происходит скорее всего из-за того, что для него не вызывается CHudItem::Deactivate() в родительских классах, в котором в свою очередь вызывается OnHiddenItem(), который херит всю малину (сразу переключает стейт на hidden)
2) Оружие при скрытии скриптом, похоже скрывается не до конца, а убирается из рендера, так как звук скрытия и стейт Hide отыгрывается.
Короче, какая-то странная дичь