Как использовать иную анимацию оружия в моделе игрока?
Как использовать иную анимацию оружия в моделе игрока?

В данной статье я расскажу о способе как можно поставить любую кастомную анимацию оружия на моделях игрока

Для начала, чтобы использовать кастомные анимации, нужно включить индексирование моделей. Есть два варианта для этого.
Если вы используете модификацию Zombie Plague 4.3 (и новее):

1. Открываем файл zombieplague.ini. Местонахождение: .../addons/amxmodx/configs/zombieplague.ini
2. Находим в конце файла данную строку 

SET MODELINDEX OFFSET = 0
3. Заменяем 0 на 1
4. Сохраняем. Больше к этому не возвращаемся.


Если вы используете любую другую модификацию:

1. Качаем данный плагин: https://forums.alliedmods.net/showthread.php?t=161255
2. Открываем исходный файл плагина
3. Находим данную строку
//#define SET_MODELINDEX_OFFSET
4. Надо раскомментировать данный макрос. Достаточно убрать просто // в начале строки, получится вот так:
#define SET_MODELINDEX_OFFSET
5. Сохраняем. Устанавливаем его на сервер.


Теперь нужно найти анимации для моделей. В моделях из игры Counter-Strike Online / Counter-Strike Nexon Zombies уже есть достаточно много интересных анимаций для оружий. Открываем модель и смотрим сами анимации и их названия.

При открытии модели, смотрим весь список анимаций и выбираем те, что нужны:


На скриншоте я выделил кастомные анимации. Как мы видим у них названия точно такие же, как и у обычных анимаций, однако в конце названия анимации написано название анимации, то есть hammer или m134. Это нам и нужно.

Вот выбрал я к примеру 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 на свою анимацию.
Вот в принципе и всё.

Хотелось бы добавить, при использовании индексации моделей, теперь у вас будут пофикшены хитбоксы. На примере, возьмём данную модель:



При выключенной индексации моделей, хитбоксы у этой модели будут кривыми, потому что модель большая и будут использоваться хитбоксы от стандартных моделей, то есть вы будете стрелять в голову - вы не будете попадать по голове, пули будут проходить сквозь модель и не будет проходить также урон, однако если будете стрелять в тело, будет засчитываться попадание в голову. При включенной индексации моделей хитбоксы будут правильными и такой проблемы не будет.



Можно скачать мой плагин с заменой модели ножа на Hammer и заменой анимации на ..._hammer

You do not have access to download files from our server

Hello, our administration publishes only cannon content, put like under the post below and write the best comment, we are preparing material just for you, Darling Гость.

Donate you can do to the author xUnicorn, a gift in the form of a donation to his electronic piggy bank ;)


Comments 7
Информация
Посетители, находящиеся в группе Guests, не могут оставлять комментарии к данной публикации.
Foundation for your build
ReHLDS 3.4.0.654

ReHLDS (Reverse-engineered) - this is a new step forward that gives a second wind to our servers. ReHLDS works 2 times faster than HLDS.

AmxModx 1.8.3

AMXModX is a Metamod add-on that allows you to create new modifications for Half-Life in the Pawn language

Reunion 0.1.92

Reunion is a continuation of Dproto for ReHLDS. This is a metamod plugin that allows you to log into the 47/48 Non-Steam server.

Revoice 0.1.0.32

Revoice is a Metamod plugin that allows voice chat between non-steam and steam clients.

Metamod-r 1.3.0.127

The new Metamod-r contains a huge number of performance optimizations and much cleaner code. The kernel was written using a JIT compiler.

Ultimate Unprecacher 1.1

Ultimate Unprecacher is a plugin for MetaMod, it works on the principle of disabling unnecessary resources on your server, thereby you can free up space for resources for your plugins, using this module you can get rid of error 512!

ReAuthCheck 0.1.6

ReAuthCheck - this is a Metamod plugin that checks your players for validity, with this module for REHLDS you can protect your server from bots that constantly spam ads or simply clog up a slot on the server!

NetBufExtender (NBEX) 1.0

NetBufExtender or NBEX - This is a metamod plugin that expands the пїЅInternet bufferпїЅ: server and client buffers (not 100% guaranteed). Expands up to 64 kb. This means that players are less likely to be kicked with the error "Reliable channel overflowed"".

UserInfoNetOptimizer (UINO) 1.0

UINO пїЅ metamod plugin that allows you to remove unnecessary fields from userinfo(setinfo) when the engine passes it to other players on the server. This measure reduces the amount of data transferred and slightly reduces the chance of being kicked with "Reliable channel overflowed".

Information

Welcome to TB-TEAM.COM!

Welcome To Our New Website For CS1.6 Resources!.
Register
Create your own account!

Register Now!
Login
Already registered? Come on, log in quickly!

Login to the site