Русское сообщество по скриптингу

Спрайт при убийстве  [Решено]

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

Спрайт при убийстве

Сообщение Hus3n » 05 июн 2019, 17:17

Привет)
Помогите пожалуйста , как сделать чтобы при убийстве этим ножом включался спрайт(например kill.spr)?
Только скажите пожалуйста , что куда вставлять)
Код: Выделить всё
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <fakemeta_util>
#include <hamsandwich>
#include <xs>
#include <cstrike>
#include <fun>

#define PLUGIN                     "[ZP] Extra: CSO Weapon Shelter Axe"
#define VERSION                 "1.0"
#define AUTHOR                     "KORD_12.7"

#pragma ctrlchar                 '\'
#pragma compress                 1

//**********************************************
//* Weapon Settings.                           *
//**********************************************
#define WEAPON_NAME                "weapon_shelteraxe"
#define WEAPON_REFERANCE            "weapon_knife"

#define WEAPON_MODEL_VIEW            "models/pbh_weapons/v_thor.mdl"
#define WEAPON_MODEL_PLAYER            "models/pbh_weapons/p_thor.mdl"

#define WEAPON_DAMAGE                random_float(40.0, 70.0)
#define WEAPON_DAMAGE_STAB            random_float(100.0, 300.0)

#define WEAPON_DISTANCE_ATTACK            70.0
#define WEAPON_DISTANCE_ATTACK_STAB        70.0

//#define WEAPON_KNOCKBACK            1.075
//#define WEAPON_KNOCKBACK_STAB            1.125

#define WEAPON_SOUND_SLASH            "pbh_weapons/thor_slash1.wav"
#define WEAPON_SOUND_SLASH2            "pbh_weapons/thor_slash2.wav"

#define WEAPON_SOUND_STAB            "pbh_weapons/thor_hit.wav"
#define WEAPON_SOUND_MISS            "pbh_weapons/thor_slash1.wav"

#define WEAPON_SOUND_HIT            "pbh_weapons/thor_hit.wav"
#define WEAPON_SOUND_HIT_WALL            "pbh_weapons/thor_wall.wav"


#define ANIM_EXTENSION                "knife"

enum
{    
    ANIM_IDLE
,
    
    ANIM_NULL
,
    ANIM_NULL1,
    
    ANIM_DRAW
,
    
    ANIM_STAB
,
    ANIM_STAB_MISS,

    ANIM_SLASH1,
    ANIM_SLASH2
};

//**********************************************
//* Some macroses.                             *
//**********************************************
#define GET_SHOOTS(%0)            get_pdata_int(%0, m_fInCheckShoots, extra_offset_weapon)
#define SET_SHOOTS(%0,%1)        set_pdata_int(%0, m_fInCheckShoots, %1, extra_offset_weapon)

#define MDLL_Spawn(%0)            dllfunc(DLLFunc_Spawn, %0)
#define MDLL_Touch(%0,%1)        dllfunc(DLLFunc_Touch, %0, %1)

#define SET_MODEL(%0,%1)        engfunc(EngFunc_SetModel, %0, %1)
#define SET_ORIGIN(%0,%1)        engfunc(EngFunc_SetOrigin, %0, %1)

#define PRECACHE_MODEL(%0)        engfunc(EngFunc_PrecacheModel, %0)
#define PRECACHE_SOUND(%0)        engfunc(EngFunc_PrecacheSound, %0)
#define PRECACHE_GENERIC(%0)        engfunc(EngFunc_PrecacheGeneric, %0)

#define MODEL_INDEX(%0)         engfunc(EngFunc_ModelIndex,%0)

#define MESSAGE_BEGIN(%0,%1,%2,%3)    engfunc(EngFunc_MessageBegin, %0, %1, %2, %3)
#define MESSAGE_END()            message_end()

#define WRITE_ANGLE(%0)            engfunc(EngFunc_WriteAngle, %0)
#define WRITE_BYTE(%0)            write_byte(%0)
#define WRITE_COORD(%0)            engfunc(EngFunc_WriteCoord, %0)
#define WRITE_STRING(%0)        write_string(%0)
#define WRITE_SHORT(%0)            write_short(%0)

#define INSTANCE(%0)            ((%0 == -1) ? 0 : %0)

#define BitSet(%0,%1)             (%0 |= (1 << (%1 - 1)))
#define BitClear(%0,%1)         (%0 &= ~(1 << (%1 - 1)))
#define BitCheck(%0,%1)         (%0 & (1 << (%1 - 1)))

//**********************************************
//* PvData Offsets.                            *
//**********************************************

// Linux extra offsets
#define extra_offset_weapon        4
#define extra_offset_player        5

new g_bitIsConnected;

#define m_rgpPlayerItems_CWeaponBox    34
#define m_fInCheckShoots        39
#define m_pPlayer            41
#define m_flNextPrimaryAttack        46
#define m_flNextSecondaryAttack        47
#define m_flTimeWeaponIdle        48
#define m_iDirection            60
#define m_fWeaponState            74
#define m_LastHitGroup             75
#define m_flNextAttack            83
#define m_iLastZoom             109
#define m_fResumeZoom              110
#define m_iFOV                363
#define m_pActiveItem            373
#define m_szAnimExtention        492

#define IsValidPev(%0)             (pev_valid(%0) == 2)
    
new IsKnife
[33];

Weapon_OnPrecache()
{
    PRECACHE_SOUNDS_FROM_MODEL(WEAPON_MODEL_VIEW);
    PRECACHE_MODEL(WEAPON_MODEL_VIEW);
    PRECACHE_MODEL(WEAPON_MODEL_PLAYER);
    
    PRECACHE_SOUND
(WEAPON_SOUND_SLASH);
    PRECACHE_SOUND(WEAPON_SOUND_SLASH2);
    PRECACHE_SOUND(WEAPON_SOUND_STAB);
    PRECACHE_SOUND(WEAPON_SOUND_MISS);
    
    PRECACHE_SOUND
(WEAPON_SOUND_HIT);
    PRECACHE_SOUND(WEAPON_SOUND_HIT_WALL);

    
}

Weapon_OnDeploy(const iItem, const iPlayer)
{
    #pragma unused iItem, iPlayer
    
    Weapon_DefaultDeploy
(iPlayer, WEAPON_MODEL_VIEW, WEAPON_MODEL_PLAYER, ANIM_DRAW, ANIM_EXTENSION);
            
    set_pdata_float
(iItem, m_flTimeWeaponIdle, 1.0, extra_offset_weapon);
    set_pdata_float(iPlayer, m_flNextAttack, 1.0, extra_offset_player);
    
    MsgHook_WeaponList
(78, iItem, iPlayer);
}

Weapon_OnIdle(const iItem, const iPlayer)
{
    #pragma unused iItem, iPlayer
    
    ExecuteHamB
(Ham_Weapon_ResetEmptySound, iItem);

    if (get_pdata_int(iItem, m_flTimeWeaponIdle, extra_offset_weapon) > 0.0)
    {
        return;
    }
    
    Weapon_SendAnim
(iPlayer, ANIM_IDLE);    
    set_pdata_float
(iItem, m_flTimeWeaponIdle, 10.0, extra_offset_weapon);
}

Weapon_OnPrimaryAttack(const iItem, const iPlayer)
{
    #pragma unused iItem, iPlayer
    
    static szAnimation
[64];

    formatex(szAnimation, charsmax(szAnimation), "ref_shoot_%s", ANIM_EXTENSION);
            
    switch 
(GET_SHOOTS(iItem))
    {
        case 0:
        {
            Weapon_SendAnim(iPlayer, ANIM_SLASH1);
                    
            set_pdata_float
(iItem, m_flTimeWeaponIdle, 1.5, extra_offset_weapon);
            set_pdata_float(iItem, m_flNextPrimaryAttack, 0.8,  extra_offset_weapon);
            set_pdata_float(iItem, m_flNextSecondaryAttack, 0.8, extra_offset_weapon);
            PrimarySlash_Attack(iPlayer, iItem, 0.0,0.0, false);
                    
            SET_SHOOTS
(iItem, 1);
            
            engfunc
(EngFunc_EmitSound, iPlayer, CHAN_WEAPON, WEAPON_SOUND_SLASH, 0.9, ATTN_NORM, 0, PITCH_NORM);
        }
        case 1:
        {
            Weapon_SendAnim(iPlayer, ANIM_SLASH2);
                    
            set_pdata_float
(iItem, m_flTimeWeaponIdle, 1.5, extra_offset_weapon);
            set_pdata_float(iItem, m_flNextPrimaryAttack, 0.8, extra_offset_weapon);
            set_pdata_float(iItem, m_flNextSecondaryAttack, 0.8, extra_offset_weapon);

            PrimarySlash_Attack(iPlayer, iItem, 0.0,0.0, false);
                            
            SET_SHOOTS
(iItem, 0);
            
            engfunc
(EngFunc_EmitSound, iPlayer, CHAN_WEAPON, WEAPON_SOUND_SLASH2, 0.9, ATTN_NORM, 0, PITCH_NORM);
        }
    }
    Player_SetAnimation(iPlayer, szAnimation);
}

public Weapon_OnSecondaryAttack(const iItem, const iPlayer)
{
    #pragma unused iItem, iPlayer
        
    set_pdata_float
(iItem, m_flTimeWeaponIdle, 1.5, extra_offset_weapon);
    set_pdata_float(iItem, m_flNextPrimaryAttack, 1.5, extra_offset_weapon);
    set_pdata_float(iItem, m_flNextSecondaryAttack, 1.5, extra_offset_weapon);
    
    PrimarySlash_Attack
(iPlayer, iItem, 0.0,0.0, true);
}

//*********************************************************************
//*           Don't modify the code below this line unless            *
//*               you know _exactly_ what you are doing!!!             *
//*********************************************************************

#define MSGID_WEAPONLIST     78

public plugin_precache()
{
    Weapon_OnPrecache();
    register_clcmd(WEAPON_NAME, "Cmd_WeaponSelect");
    register_message(MSGID_WEAPONLIST, "MsgHook_WeaponList");
}

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR);
    
    RegisterHam
(Ham_Item_AddToPlayer,        WEAPON_REFERANCE,      "HamHook_Item_AddToPlayer",        false);
    RegisterHam(Ham_Item_Deploy,            WEAPON_REFERANCE,     "HamHook_Item_Deploy_Post",        true);

    RegisterHam(Ham_Weapon_WeaponIdle,        WEAPON_REFERANCE,     "HamHook_Item_WeaponIdle",        false);
    RegisterHam(Ham_Weapon_PrimaryAttack,        WEAPON_REFERANCE,     "HamHook_Item_PrimaryAttack",        false);
    RegisterHam(Ham_Weapon_SecondaryAttack,     WEAPON_REFERANCE,     "HamHook_Item_SecondaryAttack",        false);

    RegisterHam(Ham_Spawn,                 "player",        "HamHook_Player_Spawn",          true);
    RegisterHam(Ham_Killed,             "player",         "HamHook_Player_Killed",         true);

    register_forward(FM_UpdateClientData,                    "FakeMeta_UpdateClientData_Post",     true);
}

public plugin_natives()
{
    register_native("SetThor", "native_set_user_knife", true);
    register_native("DelThor", "native_delete_user_knife", true) ;
}

public native_set_user_knife(iPlayer)
{
    if(!(get_user_flags(iPlayer) & ADMIN_LEVEL_E)) 
        return
    IsKnife
[iPlayer] = true;
    Weapon_Select(iPlayer);
}

public native_delete_user_knife(iPlayer)
{
    if(!(get_user_flags(iPlayer) & ADMIN_LEVEL_E)) 
        return
    IsKnife
[iPlayer] = false;
    
    message_begin
(MSG_ONE_UNRELIABLE, get_user_msgid("WeaponList"), _, iPlayer);
    WRITE_STRING(WEAPON_REFERANCE);
    WRITE_BYTE(-1);
    WRITE_BYTE(-1);
    WRITE_BYTE(-1);
    WRITE_BYTE(-1);
    WRITE_BYTE(2);
    WRITE_BYTE(1);
    WRITE_BYTE(29);
    WRITE_BYTE(0);
    MESSAGE_END();
    
    new iItem 
= get_pdata_cbase(iPlayer, m_pActiveItem, extra_offset_player);
    if (pev_valid(iItem))
    {
        ExecuteHamB(Ham_Item_Deploy, iItem);
    }
}

//**********************************************
//* Block client weapon.                       *
//**********************************************
public FakeMeta_UpdateClientData_Post(const iPlayer, const iSendWeapons, const CD_Handle)
{
    static iActiveItem;iActiveItem = get_pdata_cbase(iPlayer, m_pActiveItem, extra_offset_player);
    
    if 
(!IsKnife[iPlayer])
    {
        return FMRES_IGNORED;
    }
    
    if 
(!IsValidPev(iActiveItem) || get_user_weapon(iPlayer) != CSW_KNIFE)
    {
        return FMRES_IGNORED;
    }
    
    if 
(!IsKnife[iPlayer])
    {    
        return FMRES_IGNORED
;
    }

    set_cd(CD_Handle, CD_flNextAttack, get_gametime() + 0.001);
    
    return FMRES_IGNORED
;
}

//**********************************************
//* Item (weapon) hooks.                       *
//**********************************************
    #define _call.%0(%1,%2) \
                                \
    Weapon_On%0                        \
    (                            \
        %1,                         \
        %2                        \
    ) 
    
public HamHook_Item_AddToPlayer
(const iItem, const iPlayer)
{
    if (!IsValidPev(iItem) || !IsKnife[iPlayer])
    {
        return HAM_IGNORED;
    }
    
    MsgHook_WeaponList
(MSGID_WEAPONLIST, iItem, iPlayer);
    
    return HAM_IGNORED
;
}

public HamHook_Item_Deploy_Post(const iItem)
{
    new iPlayer; 
    
    if 
(!CheckItem(iItem, iPlayer))
    {
        return HAM_IGNORED;
    }
    
    _call
.Deploy(iItem, iPlayer);
    return HAM_IGNORED;
}

public HamHook_Item_WeaponIdle(const iItem)
{
    static iPlayer; 
    
    if 
(!CheckItem(iItem, iPlayer))
    {
        return HAM_IGNORED;
    }

    _call.Idle(iItem, iPlayer);
    return HAM_SUPERCEDE;
}

public HamHook_Item_PrimaryAttack(const iItem)
{
    static iPlayer; 
    
    if 
(!CheckItem(iItem, iPlayer))
    {
        return HAM_IGNORED;
    }

    _call.PrimaryAttack(iItem, iPlayer);
    return HAM_SUPERCEDE;
}

public HamHook_Item_SecondaryAttack(const iItem)
{
    static iPlayer; 
    
    if 
(!CheckItem(iItem, iPlayer))
    {
        return HAM_IGNORED;
    }
    
    _call
.SecondaryAttack(iItem, iPlayer);
    return HAM_SUPERCEDE;
}

public HamHook_Player_Spawn(iPlayer)
{
    if(is_user_alive(iPlayer))
    {
        new iItem = get_pdata_cbase(iPlayer, m_pActiveItem, extra_offset_player);

        if (pev_valid(iItem))
        {
            ExecuteHamB(Ham_Item_Deploy, iItem);
            MsgHook_WeaponList(MSGID_WEAPONLIST, iItem, iPlayer);
        }
    }
}

public HamHook_Player_Killed(const iPlayer)
{
    IsKnife[iPlayer] = true;
}

//public client_disconnect(id)
//{
//IsKnife[id] = false;
//}
//**********************************************
//* Attack function.                           *
//**********************************************

PrimarySlash_Attack(const iPlayer, const iItem, const Float: flRightScale = 1.0, const Float: flUpScale = 1.0, bool:bStab=false)
{
    new Float: Origin[3]; 
    new Float
: vecEnd[3];
    new Float: vecScr[3]; 
    
    new Float
: flFraction; 
    
    new iTrace
;
    new iVictim;
    
    Weapon_GetGunPosition
(iPlayer, Origin, vecScr, 0.0, flRightScale, flUpScale);
    
    angle_vector
(vecScr, ANGLEVECTOR_FORWARD, vecScr);

    xs_vec_mul_scalar(vecScr, bStab ? WEAPON_DISTANCE_ATTACK_STAB:WEAPON_DISTANCE_ATTACK, vecEnd);

    xs_vec_add(Origin, vecEnd, vecEnd);
    
    engfunc
(EngFunc_TraceLine, Origin, vecEnd, DONT_IGNORE_MONSTERS, iPlayer, (iTrace = create_tr2()));
    get_tr2(iTrace, TR_flFraction, flFraction);
    
    if 
(bStab)
    {
        Weapon_SendAnim(iPlayer, ANIM_STAB_MISS);
        set_pdata_float(iItem, m_flTimeWeaponIdle, 1.5, extra_offset_weapon);
        engfunc(EngFunc_EmitSound, iPlayer, CHAN_ITEM, WEAPON_SOUND_MISS, 0.9, ATTN_NORM, 0, PITCH_NORM);
    }
    
    if 
(flFraction >= 1.0)
    {
        engfunc(EngFunc_TraceHull, Origin, vecEnd, DONT_IGNORE_MONSTERS, HULL_HEAD, iPlayer, iTrace);
        get_tr2(iTrace, TR_flFraction, flFraction);
        
        if 
(flFraction < 1.0)
        {
            iVictim = INSTANCE(get_tr2(iTrace, TR_pHit));
            
            if 
(!iVictim || ExecuteHamB(Ham_IsBSPModel, iVictim))
            {
                FindHullIntersection(Origin, iTrace, Float: {-16.0, -16.0, -18.0}, Float: {16.0,  16.0,  18.0}, iPlayer);
            }
        }
    }

    get_tr2(iTrace, TR_flFraction, flFraction);
    
    if 
(flFraction < 1.0)
    {
        iVictim = INSTANCE(get_tr2(iTrace, TR_pHit));
        new Float:iDamage = (bStab ? WEAPON_DAMAGE_STAB:WEAPON_DAMAGE);
        
        if 
(bStab)
        {
            Weapon_SendAnim(iPlayer, ANIM_STAB);
            set_pdata_float(iItem, m_flTimeWeaponIdle, 1.5, extra_offset_weapon);
            engfunc(EngFunc_EmitSound, iPlayer, CHAN_ITEM, WEAPON_SOUND_STAB, 0.9, ATTN_NORM, 0, PITCH_NORM);
        }

        if(iVictim > 0 && pev(iVictim, pev_takedamage) != DAMAGE_NO && pev(iVictim, pev_solid) != SOLID_NOT)
        {    
            if 
(!bStab)
            {
                engfunc(EngFunc_EmitSound, iPlayer, CHAN_ITEM, WEAPON_SOUND_HIT, 0.9, ATTN_NORM, 0, PITCH_NORM);
            }
            
            if
(ExecuteHamB(Ham_IsPlayer, iVictim))
            {
                new Float:vecViewAngle[3]; pev(iPlayer, pev_v_angle, vecViewAngle);
                new Float:vecForward[3]; angle_vector(vecViewAngle, ANGLEVECTOR_FORWARD, vecForward);
    
//                FakeKnockBack(iVictim, vecForward, bStab ? WEAPON_KNOCKBACK_STAB:WEAPON_KNOCKBACK);
                
                get_tr2
(iTrace, TR_vecEndPos, vecEnd);
                
                static iHitGroup
;
                switch ((iHitGroup = get_tr2(iTrace, TR_iHitgroup)))
                {
                    case HIT_HEAD:iDamage *= 2;
                    case HIT_CHEST:iDamage *= 1;
                    case HIT_STOMACH:iDamage *= 1.25;
                    case HIT_LEFTARM,HIT_RIGHTARM:iDamage *= 1;
                    case HIT_LEFTLEG,HIT_RIGHTLEG:iDamage *= 0.75;
                }
                set_pdata_int(iVictim, m_LastHitGroup, iHitGroup, extra_offset_player);
            }
            
            ExecuteHamB
(Ham_TakeDamage, iVictim, iItem, iPlayer, iDamage, DMG_CLUB | DMG_NEVERGIB);    
        
}
        else
        
{
            if (!bStab)
            {
                engfunc(EngFunc_EmitSound, iPlayer, CHAN_ITEM, WEAPON_SOUND_HIT_WALL, 0.9, ATTN_NORM, 0, PITCH_NORM);
            }
        }
    }

    free_tr2(iTrace);
}

//**********************************************
//* Create and check our custom weapon.        *
//**********************************************

Weapon_SendAnim(const iPlayer, const iAnim)
{
    set_pev(iPlayer, pev_weaponanim, iAnim);

    MESSAGE_BEGIN(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0.0, 0.0, 0.0}, iPlayer);
    WRITE_BYTE(iAnim);
    WRITE_BYTE(0);
    MESSAGE_END();
}

stock Weapon_DefaultDeploy(const iPlayer, const szViewModel[], const szWeaponModel[], const iAnim, const szAnimExt[])
{
    set_pev(iPlayer, pev_viewmodel2, szViewModel);
    set_pev(iPlayer, pev_weaponmodel2, szWeaponModel);
    set_pev(iPlayer, pev_fov, 90.0);
    
    set_pdata_int
(iPlayer, m_iFOV, 90, extra_offset_player);
    set_pdata_int(iPlayer, m_fResumeZoom, 0, extra_offset_player);
    set_pdata_int(iPlayer, m_iLastZoom, 90, extra_offset_player);
    
    set_pdata_string
(iPlayer, m_szAnimExtention * 4, szAnimExt, -1, extra_offset_player * 4);

    Weapon_SendAnim(iPlayer, iAnim);
}

stock Create_Blood(const Float:vStart[3], const iModel, const iModel2, const iColor, const iScale)
{
    MESSAGE_BEGIN(MSG_BROADCAST, SVC_TEMPENTITY, vStart, 0);
    WRITE_BYTE(TE_BLOODSPRITE);
    WRITE_COORD(vStart[0])
    WRITE_COORD(vStart[1])
    WRITE_COORD(vStart[2])
    WRITE_SHORT(iModel);
    WRITE_SHORT(iModel2);
    WRITE_BYTE(iColor);
    WRITE_BYTE(iScale);
    MESSAGE_END();
}

public client_putinserver(id)
{
    BitSet(g_bitIsConnected, id);
}

public client_disconnected(id)
{
    BitClear(g_bitIsConnected, id);
}

bool: CheckItem(const iItem, &iPlayer)
{
    if (!IsValidPev(iItem))
    {
        return false;
    }
    
    iPlayer 
= get_pdata_cbase(iItem, m_pPlayer, extra_offset_weapon);
    
    if 
(!BitCheck(g_bitIsConnected, iPlayer) || !IsValidPev(iPlayer) || !IsKnife[iPlayer])
    {
        return false;
    }
    
    return true
;
}

//**********************************************
//* Some usefull stocks.                       *
//**********************************************

stock Weapon_GetGunPosition(const iPlayer, Float: fOrigin[3], Float: fAngles[3], Float: add_forward = 0.0, Float: add_right = 0.0, Float: add_up = 0.0)
{
    static Float: Forward[3], Float: Right[3], Float: Up[3];

    if (IsValidPev(iPlayer)) ExecuteHamB(Ham_Player_GetGunPosition, iPlayer, fOrigin);
    
    pev
(iPlayer, pev_angles, fAngles);
    pev(iPlayer, pev_v_angle, fAngles);
    
    global_get
(glb_v_forward, Forward);
    global_get(glb_v_right, Right);
    global_get(glb_v_up, Up);
    
    xs_vec_mul_scalar
(Forward, add_forward, Forward);
    xs_vec_mul_scalar(Right, add_right, Right);
    xs_vec_mul_scalar(Up, add_up, Up);
    
    fOrigin
[0] = fOrigin[0] + Forward[0] + Right[0] + Up[0];
    fOrigin[1] = fOrigin[1] + Forward[1] + Right[1] + Up[1];
    fOrigin[2] = fOrigin[2] + Forward[2] + Right[2] + Up[2];
}

stock FindHullIntersection(const Float: vecSrc[3], &iTrace, const Float: vecMins[3], const Float: vecMaxs[3], const iEntity)
{
    new iTempTrace;
    
    new Float
: flFraction;
    new Float: flThisDistance;
    
    new Float
: vecEnd[3];
    new Float: vecEndPos[3];
    new Float: vecHullEnd[3];
    new Float: vecMinMaxs[2][3];
    
    new Float
: flDistance = 999999.0;
    
    xs_vec_copy
(vecMins, vecMinMaxs[0]);
    xs_vec_copy(vecMaxs, vecMinMaxs[1]);
    
    get_tr2
(iTrace, TR_vecEndPos, vecHullEnd);
    
    xs_vec_sub
(vecHullEnd, vecSrc, vecHullEnd);
    xs_vec_mul_scalar(vecHullEnd, 2.0, vecHullEnd);
    xs_vec_add(vecHullEnd, vecSrc, vecHullEnd);
    
    engfunc
(EngFunc_TraceLine, vecSrc, vecHullEnd, DONT_IGNORE_MONSTERS, iEntity, (iTempTrace = create_tr2()));
    get_tr2(iTempTrace, TR_flFraction, flFraction);
    
    if 
(flFraction < 1.0)
    {
        free_tr2(iTrace);
        
        iTrace 
= iTempTrace;
        return;
    }
    
    for 
(new j, k, i = 0; i < 2; i++)
    {
        for (= 0; j < 2; j++)
        {
            for (= 0; k < 2; k++)
            {
                vecEnd[0] = vecHullEnd[0] + vecMinMaxs[i][0];
                vecEnd[1] = vecHullEnd[1] + vecMinMaxs[j][1];
                vecEnd[2] = vecHullEnd[2] + vecMinMaxs[k][2];
                
                engfunc
(EngFunc_TraceLine, vecSrc, vecEnd, DONT_IGNORE_MONSTERS, iEntity, iTempTrace);
                get_tr2(iTempTrace, TR_flFraction, flFraction);
                
                if 
(flFraction < 1.0)
                {
                    get_tr2(iTempTrace, TR_vecEndPos, vecEndPos);
                    xs_vec_sub(vecEndPos, vecSrc, vecEndPos);
                    
                    if 
((flThisDistance = xs_vec_len(vecEndPos)) < flDistance)
                    {
                        free_tr2(iTrace);
                        
                        iTrace 
= iTempTrace;
                        flDistance = flThisDistance;
                    }
                }
            }
        }
    }
}

stock FakeKnockBack(iPlayer, Float:vecDirection[3], Float:flKnockBack)
{
    static Float:vecVelocity[3]; pev(iPlayer, pev_velocity, vecVelocity);
    
    if 
(pev(iPlayer, pev_flags) & FL_DUCKING)
    {
        flKnockBack *= 0.7;
    }
    
    vecVelocity
[0] = vecDirection[0] * 500.0 * flKnockBack;
    vecVelocity[1] = vecDirection[1] * 500.0 * flKnockBack;
    vecVelocity[2] = 400.0;
    
    set_pev
(iPlayer, pev_velocity, vecVelocity);
}

stock Player_SetAnimation(const iPlayer, const szAnim[])
{
    #define ACT_RANGE_ATTACK1   28
       
    
// Linux extra offsets
    #define extra_offset_animating   4
       
    
// 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, extra_offset_animating);
    set_pdata_int(iPlayer, m_fSequenceFinished, 0, extra_offset_animating);
       
    set_pdata_float
(iPlayer, m_flFrameRate, flFrameRate, extra_offset_animating);
    set_pdata_float(iPlayer, m_flGroundSpeed, flGroundSpeed, extra_offset_animating);
    set_pdata_float(iPlayer, m_flLastEventCheck, flGametime , extra_offset_animating);
       
    set_pdata_int
(iPlayer, m_Activity, ACT_RANGE_ATTACK1, extra_offset_player);
    set_pdata_int(iPlayer, m_IdealActivity, ACT_RANGE_ATTACK1, extra_offset_player);   
    set_pdata_float
(iPlayer, m_flLastAttackTime, flGametime , extra_offset_player);
}

public Cmd_WeaponSelect(iPlayer)
{
    engclient_cmd(iPlayer, WEAPON_REFERANCE);
    return PLUGIN_HANDLED;
}


public Weapon_Select(const iPlayer)
{
    engclient_cmd(iPlayer, WEAPON_REFERANCE);
    
    IsKnife
[iPlayer] = true;
    
    emessage_begin
(MSG_ONE, get_user_msgid("CurWeapon"), _, iPlayer);
    ewrite_byte(1);
    ewrite_byte(CSW_KNIFE);
    ewrite_byte(-1);
    emessage_end();
    
    new iItem 
= get_pdata_cbase(iPlayer, m_pActiveItem, extra_offset_player);

    if (pev_valid(iItem))
    {
        ExecuteHamB(Ham_Item_Deploy, iItem);
        MsgHook_WeaponList(MSGID_WEAPONLIST, iItem, iPlayer);
    }
}

public MsgHook_WeaponList(const iMsgID, const iMsgDest, const iMsgEntity)
{
    static arrWeaponListData[8];
    
    if 
(!iMsgEntity)
    {
        new szWeaponName[32];
        get_msg_arg_string(1, szWeaponName, charsmax(szWeaponName));
        
        if 
(!strcmp(szWeaponName, WEAPON_REFERANCE))
        {
            for (new i, a = sizeof arrWeaponListData; i < a; i++)
            {
                arrWeaponListData[i] = get_msg_arg_int(+ 2);
            }
        }
    }
    else
    
{
        if (!IsKnife[iMsgEntity])
        {
            return;
        }
        
        MESSAGE_BEGIN
(MSG_ONE, iMsgID, {0.0, 0.0, 0.0}, iMsgEntity);
        WRITE_STRING(IsKnife[iMsgEntity] ? WEAPON_NAME : WEAPON_REFERANCE);
        
        for 
(new i, a = sizeof arrWeaponListData; i < a; i++)
        {
            WRITE_BYTE(arrWeaponListData[i]);
        }
        
        MESSAGE_END
();
    }
}

PRECACHE_SOUNDS_FROM_MODEL(const szModelPath[])
{
    new iFile;
    
    if 
((iFile = fopen(szModelPath, "rt")))
    {
        new szSoundPath[64];
        
        new iNumSeq
, iSeqIndex;
        new iEvent, iNumEvents, iEventIndex;
        
        fseek
(iFile, 164, SEEK_SET);
        fread(iFile, iNumSeq, BLOCK_INT);
        fread(iFile, iSeqIndex, BLOCK_INT);
        
        for 
(new k, i = 0; i < iNumSeq; i++)
        {
            fseek(iFile, iSeqIndex + 48 + 176 * i, SEEK_SET);
            fread(iFile, iNumEvents, BLOCK_INT);
            fread(iFile, iEventIndex, BLOCK_INT);
            fseek(iFile, iEventIndex + 176 * i, SEEK_SET);

            for (= 0; k < iNumEvents; k++)
            {
                fseek(iFile, iEventIndex + 4 + 76 * k, SEEK_SET);
                fread(iFile, iEvent, BLOCK_INT);
                fseek(iFile, 4, SEEK_CUR);
                
                if 
(iEvent != 5004)
                {
                    continue;
                }

                fread_blocks(iFile, szSoundPath, 64, BLOCK_CHAR);
                
                if 
(strlen(szSoundPath))
                {
                    strtolower(szSoundPath);
                    PRECACHE_SOUND(szSoundPath);
                }
            }
        }
    }
    
    fclose
(iFile);
}



Добавлено спустя 2 минуты 24 секунды:
И звук, если можно)
Аватара пользователя
Hus3n
 
Сообщения: 17
Зарегистрирован: 05 ноя 2016, 14:01
Благодарил (а): 12 раз.
Поблагодарили: 1 раз.
Языки программирования: Только Русский :D

Re: Спрайт при убийстве  [Решено]

Сообщение Leonidddd » 08 июн 2019, 10:46

Hus3n, можно использовать Вы должны зарегистрироваться, чтобы видеть ссылки. за основу(там есть простой сток вывода спрайта) и в

Код: Выделить всё
RegisterHam(Ham_Killed,             "player",         "HamHook_Player_Killed",         true); 

Выводить, но придется, чтобы отловить нож. true заменить на false и добавить индекс убийцы в

Код: Выделить всё
public HamHook_Player_Killed(const iPlayer

--------------------->
Код: Выделить всё
public HamHook_Player_Killed(const iPlayer, const iKiller


и если в руках игрока-убийцы есть нож выводить свой спрайт:
Код: Выделить всё
if(get_user_weapon(iKiller) == CSW_KNIFE
Аватара пользователя
Leonidddd
Модератор
 
Сообщения: 2557
Зарегистрирован: 08 апр 2012, 18:13
Откуда: г. Запорожье
Благодарил (а): 192 раз.
Поблагодарили: 718 раз.


Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 16