Для начала, чтобы использовать кастомные анимации, нужно включить индексирование моделей. Есть два варианта для этого.
Если вы используете модификацию Zombie Plague 4.3 (и новее):
SET MODELINDEX OFFSET = 0
Если вы используете любую другую модификацию:
//#define SET_MODELINDEX_OFFSET
#define SET_MODELINDEX_OFFSET
При открытии модели, смотрим весь список анимаций и выбираем те, что нужны:

Вот выбрал я к примеру ref_aim_hammer и выглядит оно вот так:

Теперь переходим к основной части гайда. Нужно добавить код, чтобы как раз таки менялись анимации у нужного вам оружия. Открываем плагин вашего оружия и находим функцию, в которой идёт установка моделей оружия (Это Ham_Item_Deploy или CurWeapon), у меня в плагине это
RegisterHam(Ham_Item_Deploy, "weapon_knife", "CKnife__Item_Deploy_Post", true);
Ищем функцию CKnife__Item_Deploy_Post в плагине. Я нашёл, далее добавляем после наших проверок данный код:
// Linux extra offsets
#define linux_diff_weapon 4
#define linux_diff_animating 4
#define linux_diff_player 5
// CBasePlayerItem
#define m_pPlayer 41
// CBasePlayer
#define m_szAnimExtention 492
set_pdata_string(ИНДЕКС_ИГРОКА, m_szAnimExtention * 4, "НАЗВАНИЕ_АНИМАЦИИ", -1, linux_diff_player * linux_diff_animating);
В ИНДЕКС_ИГРОКА вписываем индекс игрока. У меня же это iPlayer, у вас может быть id / player / pPlayer / index.
В НАЗВАНИЕ_АНИМАЦИИ берём именно то, что указано в конце анимации в модельке игрока. То есть hammer или m134.
У меня получился такой код:
public CKnife__Item_Deploy_Post(iItem)
{
// Linux extra offsets
#define linux_diff_weapon 4
#define linux_diff_animating 4
#define linux_diff_player 5
// CBasePlayerItem
#define m_pPlayer 41
// CBasePlayer
#define m_szAnimExtention 492
static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, linux_diff_weapon);
if(zp_get_user_zombie(iPlayer)) return;
set_pev(iPlayer, pev_viewmodel2, KNIFE_VIEW_MODEL);
set_pev(iPlayer, pev_weaponmodel2, KNIFE_PLAYER_MODEL);
set_pdata_string(iPlayer, m_szAnimExtention * 4, "hammer", -1, linux_diff_player * linux_diff_animating);
}
Теперь же, в моём случае, когда я достану нож, у меня будет Хаммер с анимацией не …_knife, а с анимацией …_hammer. Все стандартные анимации …_knife заменены на …_hammer.
Также, есть сток, чтобы вызвать нужную вам анимацию в нужный для вас момент. К примеру, у вас сделана кастомная атака на правую кнопку мыши у какого нибудь огнестрельного оружия. Добавляем данный сток:
stock UTIL_PlayerAnimation(const iPlayer, const szAnim[])
{
#define ACT_RANGE_ATTACK1 28
// Linux extra offsets
#define linux_diff_animating 4
#define linux_diff_player 5
// CBaseAnimating
#define m_flFrameRate 36
#define m_flGroundSpeed 37
#define m_flLastEventCheck 38
#define m_fSequenceFinished 39
#define m_fSequenceLoops 40
// CBaseMonster
#define m_Activity 73
#define m_IdealActivity 74
// CBasePlayer
#define m_flLastAttackTime 220
new iAnimDesired, Float: flFrameRate, Float: flGroundSpeed, bool: bLoops;
if((iAnimDesired = lookup_sequence(iPlayer, szAnim, flFrameRate, bLoops, flGroundSpeed)) == -1)
{
iAnimDesired = 0;
}
new Float: flGameTime = get_gametime();
set_pev(iPlayer, pev_frame, 0.0);
set_pev(iPlayer, pev_framerate, 1.0);
set_pev(iPlayer, pev_animtime, flGameTime);
set_pev(iPlayer, pev_sequence, iAnimDesired);
set_pdata_int(iPlayer, m_fSequenceLoops, bLoops, linux_diff_animating);
set_pdata_int(iPlayer, m_fSequenceFinished, 0, linux_diff_animating);
set_pdata_float(iPlayer, m_flFrameRate, flFrameRate, linux_diff_animating);
set_pdata_float(iPlayer, m_flGroundSpeed, flGroundSpeed, linux_diff_animating);
set_pdata_float(iPlayer, m_flLastEventCheck, flGameTime , linux_diff_animating);
set_pdata_int(iPlayer, m_Activity, ACT_RANGE_ATTACK1, linux_diff_player);
set_pdata_int(iPlayer, m_IdealActivity, ACT_RANGE_ATTACK1, linux_diff_player);
set_pdata_float(iPlayer, m_flLastAttackTime, flGameTime , linux_diff_player);
}
Теперь же, находим нужный нам момент, когда нужно вызвать анимацию и используем данный сток:
UTIL_PlayerAnimation(iPlayer, "crouch_shoot_m134");
В данном же случае, нужно вписывать полное название анимации. Также iPlayer заменяете на свой индекс игрока и crouch_shoot_m134 на свою анимацию.
Вот в принципе и всё.
Хотелось бы добавить, при использовании индексации моделей, теперь у вас будут пофикшены хитбоксы. На примере, возьмём данную модель:
При выключенной индексации моделей, хитбоксы у этой модели будут кривыми, потому что модель большая и будут использоваться хитбоксы от стандартных моделей, то есть вы будете стрелять в голову — вы не будете попадать по голове, пули будут проходить сквозь модель и не будет проходить также урон, однако если будете стрелять в тело, будет засчитываться попадание в голову. При включенной индексации моделей хитбоксы будут правильными и такой проблемы не будет.
