как добавить звук отскакивания (bounce) любой гранате

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
552
Реакции
49
Предупреждения
2
Помог
4 раз(а)
всем привет. кто знает, как сделать звук отскакивания или же bounce, любой гранате? например жабе (jump bomb). Код:
Код:
/*
- Создание плагинов на закз:

- Контакты:
- Vk: http://vk.com/Opo4uMapy
- ICQ: 585552410
*/

#include < amxmodx >
#include < fakemeta >
#include < hamsandwich >
#include < zombieplague >

#define PLUGIN        "[ZP] Extra Item: Jump Bomb"
#define VERSION        "1.0"
#define AUTHOR        "Opo4uMapy"

native BlotterGetBombs(iPlayer);
native BlotterSetBombs(iPlayer, iAmount);
native BlotterRemoveBomb(iPlayer);

native cs_get_user_bpammo(index, weapon)
native cs_set_user_bpammo(index, weapon, amount)

#define JUMPBOMB_ID        55556

/////////////////////////////////////Cvars/////////////////////////////////////

#define ITEM_NAME        "JUMP"     // Имя айтема
#define ITEM_COST        6         // Стоимость за 1 бомбу
#define MAX_GRENADE            5         // Лимит гранат
#define RADIUS            300.0         // Радиус взрыва
#define JUMP_EXP        800.0        // Сила отдачи от гранаты   

#define BLOTTER_BOMB_W "models/xman2030/grenade/w_blotter_bomb_ability.mdl"

#define GRENADE_ICON                //Иконка с лева. Что бы отключить поставьте //


#define TRAIL        //Трайл за гранатой. Что бы отключить закоментируем ( //#define TRAIL )

/////////////////////////////////////WeaponList/////////////////////////////////////

#define WEAPONLIST     // WeaponList. Что бы отключить закоментируем ( //#define WEAPONLIST )

#define WEAPON_DEFAULT        "weapon_smokegrenade"    //Weapon под которую сделана граната
#define DEFAULT_CSW        CSW_SMOKEGRENADE    //CSW под которую сделана граната

#if defined WEAPONLIST
#define WEAPON_NEW        "weapon_zombj1_sisa"    //Название WeaponList'a новой гранаты

new const WeaponList_Sprite[][] =
{
    "sprites/weapon_zombj1_sisa.txt",
    "sprites/640hud61.spr",
    "sprites/640hud7x.spr"
}

enum
{
    prim_ammoid         = 13,
    prim_ammomaxamount     = 1,
    sec_ammoid         = -1,
    sec_ammomaxamount     = -1,
    slotid             = 3,
    number_in_slot         = 3,
    weaponid         = 9,
    flags             = 24
}
#endif

////////////////////////////////////////////////////////////////////////////////////

// Модели гранаты
new const BOMB_MODEL[][] =
{
    "models/xman2030/grenade/v_zombibomb.mdl",
    "models/xman2030/grenade/p_zombibomb.mdl",
    "models/xman2030/grenade/w_zombibomb.mdl"
}

//Звуки покупки
#define    g_SoundGrenadeBuy    "items/gunpickup2.wav"
#define g_SoundAmmoPurchase    "items/9mmclip1.wav"
    
//Звук взрыва
#define g_SoundBombExplode    "xman2030/jump/zombi_bomb_exp.wav"

//Не изменять! Звуки прописаны в модели.
new const frogbomb_sound[][] =
{
    "xman2030/jump/zombi_bomb_pull_1.wav",
    "xman2030/jump/zombi_bomb_deploy.wav",
    "xman2030/jump/zombi_bomb_throw.wav"
}

new const frogbomb_sound_idle[][] =
{
    "xman2030/jump/zombi_bomb_idle_1.wav",
    "xman2030/jump/zombi_bomb_idle_2.wav",
    "xman2030/jump/zombi_bomb_idle_3.wav",
    "xman2030/jump/zombi_bomb_idle_4.wav"
}
new g_itemid

new g_JumpGrenadeCount[33], g_iExplo
#if defined TRAIL
new g_trailSpr
#endif
#if defined GRENADE_ICON
new grenade_icons[33][32]
#endif

public plugin_precache()
{
    static i

    for(i = 0; i < sizeof BOMB_MODEL; i++)
        precache_model(BOMB_MODEL[i])
    
    precache_model(BLOTTER_BOMB_W)

    for(i = 0; i < sizeof frogbomb_sound; i++)
        precache_sound(frogbomb_sound[i])

    for(i = 0; i < sizeof frogbomb_sound_idle; i++)
        precache_sound(frogbomb_sound_idle[i])

    precache_sound(g_SoundGrenadeBuy)
    precache_sound(g_SoundAmmoPurchase)
    precache_sound(g_SoundBombExplode)

    #if defined WEAPONLIST
    register_clcmd(WEAPON_NEW, "hook")

    for(i = 0; i < sizeof WeaponList_Sprite; i++)
        precache_generic(WeaponList_Sprite[i])

    #endif

    g_iExplo = precache_model("sprites/xman2030/zombiebomb_exp.spr")

    #if defined TRAIL
    g_trailSpr = precache_model("sprites/laserbeam.spr")
    #endif
}

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR)

    //Ham
    RegisterHam(Ham_Think, "grenade", "fw_ThinkGrenade")
    RegisterHam(Ham_Item_Deploy, WEAPON_DEFAULT, "DeployPost", 1)

    //Forward
    register_forward(FM_SetModel, "fw_SetModel")

    //Event
    register_event("DeathMsg", "DeathMsg", "a")

    #if defined GRENADE_ICON
    register_event("CurWeapon", "grenade_icon", "be", "1=1")
    #endif

    //Extra Item
    g_itemid = zp_register_extra_item(ITEM_NAME, ITEM_COST, ZP_TEAM_ZOMBIE)
}

#if defined WEAPONLIST
public hook(id)
{
    if(!is_user_connected(id))
        return PLUGIN_CONTINUE
        
    engclient_cmd(id, WEAPON_DEFAULT)
    
    return PLUGIN_HANDLED
}
#endif

public plugin_natives() register_native("give_jump", "give_bomb", 1);

public zp_extra_item_selected(id, Item)
{
    if(Item == g_itemid)
        give_bomb(id, false);

    return PLUGIN_HANDLED
}

public give_bomb(id, bool:bBlotter) {
    
    if(!bBlotter && g_JumpGrenadeCount[id] >= MAX_GRENADE) {
    
        return ZP_PLUGIN_HANDLED
        
    }

    new Ammo = cs_get_user_bpammo(id, DEFAULT_CSW)
    new iBlotterBombs = BlotterGetBombs(id);
    
    if(!iBlotterBombs && g_JumpGrenadeCount[id] <= 0) {
    
        if(!bBlotter) g_JumpGrenadeCount[id] = 1
        else BlotterSetBombs(id, iBlotterBombs + 1);
        
        fm_give_item(id, WEAPON_DEFAULT)
        emit_sound(id, CHAN_ITEM, g_SoundGrenadeBuy, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
    
    } else {
    
        if(!bBlotter) g_JumpGrenadeCount[id]++
        else BlotterSetBombs(id, iBlotterBombs + 1);
        
        cs_set_user_bpammo(id, DEFAULT_CSW, Ammo + 1)
        emit_sound(id, CHAN_ITEM, g_SoundAmmoPurchase, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
        
    }

    AmmoPickup(id)
    #if defined WEAPONLIST
    WeaponList(id, 1)
    #endif

    return PLUGIN_HANDLED
}

public zp_user_infected_post(id, infector, nemesis)
{
    if(zp_get_user_nemesis(id) || zp_is_survivor_round() || zp_is_nemesis_round())
        return

    g_JumpGrenadeCount[id] = 0

    fm_give_item(id, WEAPON_DEFAULT)   
    cs_set_user_bpammo(id, DEFAULT_CSW, 1)
    emit_sound(id, CHAN_ITEM, g_SoundGrenadeBuy, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)       

    AmmoPickup(id)

    g_JumpGrenadeCount[id] = 1
    #if defined WEAPONLIST
    WeaponList(id, 1)
    #endif
}

public zp_user_humanized_post(id, survivor)
{
    g_JumpGrenadeCount[id] = 0
    #if defined WEAPONLIST
    WeaponList(id, 0)
    #endif
}

public DeployPost(entity)
{
    static id
    id = get_pdata_cbase(entity, 41, 4)

    if(!is_user_alive(id) || !zp_get_user_zombie(id) || zp_get_user_nemesis(id) || zp_get_user_survivor(id))
        return PLUGIN_CONTINUE


    set_pev(id, pev_viewmodel2, BOMB_MODEL[0])
    set_pev(id, pev_weaponmodel2, BOMB_MODEL[1])

    return PLUGIN_CONTINUE
}

public grenade_throw(iPlayer, iGrenade, iWeapon) {

    if(iWeapon == CSW_SMOKEGRENADE) {

        if(BlotterGetBombs(iPlayer)) BlotterRemoveBomb(iPlayer);
        else if(g_JumpGrenadeCount[iPlayer] >= 1) g_JumpGrenadeCount[iPlayer]--;
        
        if(!BlotterGetBombs(iPlayer) && g_JumpGrenadeCount[iPlayer]) ExecuteHamB(Ham_Item_Deploy, get_pdata_cbase(iPlayer, 373, 5));
    
    }

}

public fw_SetModel(Entity, const Model[])
{
    if (Entity < 0)
        return FMRES_IGNORED

    if (pev(Entity, pev_dmgtime) == 0.0)
        return FMRES_IGNORED

    new iOwner = pev(Entity, pev_owner)
 
     if(!(0 < iOwner < 33))
         return FMRES_IGNORED
        
    if(!zp_get_user_zombie(iOwner) || !BlotterGetBombs(iOwner) && g_JumpGrenadeCount[iOwner] <= 0)
        return FMRES_IGNORED
    
    if(equal(Model[7], "w_sm", 4)) {
        
        set_pev(Entity, pev_flTimeStepSound, JUMPBOMB_ID)
        set_pev(Entity, pev_body, 23)

        fm_set_rendering(Entity, kRenderFxGlowShell, 0, 255, 0, kRenderNormal, 16)

        #if defined TRAIL
        message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
        write_byte(TE_BEAMFOLLOW)
        write_short(Entity)         // entity
        write_short(g_trailSpr)     // sprite
        write_byte(2)             // life
        write_byte(5)             // width
        write_byte(0)             // r
        write_byte(200)         // g
        write_byte(0)             // b
        write_byte(200)         // brightness
        message_end()
        #endif

        if(BlotterGetBombs(iOwner)) engfunc(EngFunc_SetModel, Entity, BLOTTER_BOMB_W)
        else engfunc(EngFunc_SetModel, Entity, BOMB_MODEL[2])

        return FMRES_SUPERCEDE
    
    }
    
    return FMRES_IGNORED
}

public fw_ThinkGrenade(Entity)
{
    if(!pev_valid(Entity))
        return HAM_IGNORED
      
    static Float:dmg_time
    pev(Entity, pev_dmgtime, dmg_time)
      
    if(dmg_time > get_gametime())
        return HAM_IGNORED
      
    if(pev(Entity, pev_flTimeStepSound) == JUMPBOMB_ID)
    {
        JumpBombExplode(Entity)
        return HAM_SUPERCEDE
    }
    return HAM_IGNORED
}

public JumpBombExplode(Entity)
{
    if(Entity < 0)
        return
      
    static Float:Origin[3]
    pev(Entity, pev_origin, Origin)

    engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, Origin, 0)
    write_byte(TE_SPRITE)
    engfunc(EngFunc_WriteCoord, Origin[0])
    engfunc(EngFunc_WriteCoord, Origin[1])
    engfunc(EngFunc_WriteCoord, Origin[2] + 45.0)
    write_short(g_iExplo)
    write_byte(35)
    write_byte(186)
    message_end()
          
    emit_sound(Entity, CHAN_WEAPON, g_SoundBombExplode, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
      
    for(new victim = 1; victim <= get_maxplayers(); victim++)
    {
        if (!is_user_alive(victim))
            continue
                  
        new Float:VictimOrigin[3]
        pev(victim, pev_origin, VictimOrigin)
                  
        new Float:Distance = get_distance_f(Origin, VictimOrigin)   
                  
        if(Distance <= RADIUS)
        {
            static Float:NewSpeed

            NewSpeed = JUMP_EXP * (1.0 - (Distance / RADIUS))
                          
            static Float:Velocity[3]
            get_speed_vector(Origin, VictimOrigin, NewSpeed, Velocity)
                          
            set_pev(victim, pev_velocity, Velocity)
            
            message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("ScreenShake"), _, victim)
            write_short(1<<12 * 10)       
            write_short(1<<12 * 10)
            write_short(1<<12 * 10)
            message_end()
        }
    }
    engfunc(EngFunc_RemoveEntity, Entity)
}       
#if defined GRENADE_ICON
public grenade_icon(id)
{
    remove_grenade_icon(id)
        
    if(is_user_bot(id))
        return

    static igrenade, grenade_sprite[16], grenade_color[3]
    igrenade = get_user_weapon(id)
    
    switch(igrenade)
    {
        case DEFAULT_CSW:
        {
            if(!is_user_alive(id) || zp_get_user_zombie(id))
            {
                grenade_sprite = "dmg_gas"
                grenade_color = {255, 165, 0}
            }
            else
            {
                grenade_sprite = ""
                grenade_color = {0, 0, 0}
            }
        }
        default: return
    }
    grenade_icons[id] = grenade_sprite
    
    message_begin(MSG_ONE, get_user_msgid("StatusIcon"),{0, 0, 0}, id)
    write_byte(1)
    write_string(grenade_icons[id])
    write_byte(grenade_color[0])
    write_byte(grenade_color[1])
    write_byte(grenade_color[2])
    message_end()

    return
}
#endif
public zp_round_ended()
{
    for(new id = 1; id <= get_maxplayers(); id++)
    {
        if(!is_user_alive(id) || !zp_get_user_zombie(id))
            continue

        ham_strip_weapon(id, WEAPON_DEFAULT)
        g_JumpGrenadeCount[id] = 0
    }
}

public DeathMsg()
{
    new attacker = read_data(1)
    new victim = read_data(2)

    if(!is_user_connected(attacker))
        return HAM_IGNORED

    if(victim == attacker || !victim)
        return HAM_IGNORED

    if(!zp_get_user_zombie(victim))
        return HAM_IGNORED

    #if defined GRENADE_ICON
    remove_grenade_icon(victim)
    #endif

    #if defined WEAPONLIST
    WeaponList(victim, 0)
    #endif

    g_JumpGrenadeCount[victim] = 0

        return HAM_HANDLED
}

public client_connect(id) g_JumpGrenadeCount[id] = 0

#if defined WEAPONLIST
WeaponList(index, mode = 0)
{
    if (!is_user_connected(index))
        return
    
    message_begin(MSG_ONE, get_user_msgid("WeaponList"), {0, 0, 0}, index)
    write_string(mode ? WEAPON_NEW : WEAPON_DEFAULT)
    write_byte(prim_ammoid)
    write_byte(prim_ammomaxamount)
    write_byte(sec_ammoid)
    write_byte(sec_ammomaxamount)
    write_byte(slotid)
    write_byte(number_in_slot)
    write_byte(weaponid)
    write_byte(flags)
    message_end()
}
#endif

#if defined GRENADE_ICON
static remove_grenade_icon(index)
{
    message_begin(MSG_ONE, get_user_msgid("StatusIcon"), {0, 0, 0}, index)
    write_byte(0)
    write_string(grenade_icons[index])
    message_end()
}
#endif

stock set_user_takedamage(index, damage)
{
    if(!is_user_alive(index))
        return

    new vec[3]
    FVecIVec(get_target_origin_f(index), vec)

    message_begin(MSG_ONE, get_user_msgid("Damage"), _, index)
    write_byte(0)
    write_byte(damage)
    write_long(DMG_CRUSH)
    write_coord(vec[0])
    write_coord(vec[1])
    write_coord(vec[2])
    message_end()

    if(pev(index, pev_health) - 20.0 <= 0)
        ExecuteHamB(Ham_Killed, index, index, 1)
    else ExecuteHamB(Ham_TakeDamage, index, 0, index, float(damage), DMG_BLAST)
}

stock AmmoPickup(index)
{
    message_begin(MSG_ONE, get_user_msgid("AmmoPickup"), _, index)
    write_byte(13)
    write_byte(1)
    message_end()
}

stock Float:get_target_origin_f(index)
{
    new Float:orig[3]
    pev(index, pev_origin, orig)

    if(index > get_maxplayers())
    {
        new Float:mins[3], Float:maxs[3]
        pev(index, pev_mins, mins)
        pev(index, pev_maxs, maxs)
        
        if(!mins[2]) orig[2] += maxs[2] / 2
    }
    return orig
}

stock get_speed_vector(const Float:origin1[3],const Float:origin2[3],Float:speed, Float:new_velocity[3])
{
    new_velocity[0] = origin2[0] - origin1[0]
    new_velocity[1] = origin2[1] - origin1[1]
    new_velocity[2] = origin2[2] - origin1[2]
    new Float:num = floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2]))
    new_velocity[0] *= num
    new_velocity[1] *= num
    new_velocity[2] *= num

    return 1
}

stock fm_set_rendering(entity, fx = kRenderFxNone, r = 255, g = 255, b = 255, render = kRenderNormal, amount = 16)
{
    new Float:RenderColor[3]
    RenderColor[0] = float(r)
    RenderColor[1] = float(g)
    RenderColor[2] = float(b)

    set_pev(entity, pev_renderfx, fx)
    set_pev(entity, pev_rendercolor, RenderColor)
    set_pev(entity, pev_rendermode, render)
    set_pev(entity, pev_renderamt, float(amount))

    return 1
}

stock fm_give_item(index, const item[])
{
    if (!equal(item, "weapon_", 7) && !equal(item, "ammo_", 5))
        return 0

    new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, item))
    if (!pev_valid(ent))
        return 0

    new Float:origin[3]
    pev(index, pev_origin, origin)
    set_pev(ent, pev_origin, origin)
    set_pev(ent, pev_spawnflags, pev(ent, pev_spawnflags) | SF_NORESPAWN)
    dllfunc(DLLFunc_Spawn, ent)

    new save = pev(ent, pev_solid)
    dllfunc(DLLFunc_Touch, ent, index)
    if (pev(ent, pev_solid) != save)
        return ent

    engfunc(EngFunc_RemoveEntity, ent)

    return -1
}

stock ham_strip_weapon(index, weapon[])
{
    if(!equal(weapon, "weapon_", 7))
        return 0

        new wId = get_weaponid(weapon)
        if(!wId) return 0

        new wEnt
        while((wEnt = engfunc(EngFunc_FindEntityByString, wEnt, "classname", weapon)) && pev(wEnt,pev_owner) != index) {}

        if(!wEnt)
        return 0

        if(get_user_weapon(index) == wId)
        ExecuteHamB(Ham_Weapon_RetireWeapon,wEnt)

        if(!ExecuteHamB(Ham_RemovePlayerItem, index, wEnt))
        return 0

        ExecuteHamB(Ham_Item_Kill, wEnt)

        set_pev(index, pev_weapons, pev(index, pev_weapons) & ~(1<<wId))

        return 1
}
 
Сообщения
494
Реакции
341
Помог
11 раз(а)
Регистрировать прикосновение некоторых сущностей с гранатой (worldspawn, func_wall и другие по надобности). В обработчике касания воспроизводить звук. Воспроизведение звука делать лучше с задержкой через get_gametime, ибо прикосновение будет вызываться очень часто.
 
Сообщения
552
Реакции
49
Предупреждения
2
Помог
4 раз(а)
bizon, спасибо, сделал. решено.
28 Сен 2022
я имел ввиду что я сделал
 
Статус
В этой теме нельзя размещать новые ответы.

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу