Поиск Плагин для слеповой и боевой гранаты

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
332
Реакции
75
Предупреждения
9
Помог
1 раз(а)
Суть: когда игрок выдергивает чеку, граната должна взрываться через определенное время. Например через 3 секунды. Даже если граната находится в руках. Пусть взрывается в руках. Чеку игрок выдернул - отчет времени пошел. Также, чтобы был запрет сохранения гранаты, если игрок выдернул чеку.
Для чего? Например я знаю, что граната взрывается через 3 секунды. Я выдергиваю чеку, жду 2 секунды, кидаю гранату, противник не успевает отвернуться и слепнет.
 
Сообщения
658
Реакции
462
Помог
10 раз(а)
можно хукнуть SV_StartAnim(чтобы не использовать PostFrame, а WeaponIdle), выставить значение оффсета nextidle 3sec и проверять оффсет m_flStartThrow в WeaponIdle

Как один из вариантов
 
Сообщения
327
Реакции
289
Помог
9 раз(а)
Чеку игрок выдернул - отчет времени пошел
Вам бы в армию сходить.. или хоть на начальные курсы БП.
Многим будет непонятно, почему граната взорвалась в руках.
 
Сообщения
288
Реакции
226
Помог
6 раз(а)
zhorzh78, во время выдергивания чеки уведомлять игроков, что у них есть несколько секунд для броска гранаты
 
Сообщения
332
Реакции
75
Предупреждения
9
Помог
1 раз(а)
Вам бы в армию сходить.. или хоть на начальные курсы БП.
Многим будет непонятно, почему граната взорвалась в руках.
хихи. Не на всех гранатах можно чеку обратно вставить. В армии я был 8 лет назад)
20 Июл 2018
zhorzh78, а ты про спусковой рычаг имел ввиду наверное) ну так я дал понять, чтобы в игре отчет был именно после выдергивания чеки.
 
Сообщения
62
Реакции
129
Помог
4 раз(а)
А если выдернуть чеку и сменить оружие, граната все равно должна взорваться?
 
Сообщения
658
Реакции
462
Помог
10 раз(а)
Сообщения
133
Реакции
441
Помог
2 раз(а)
Помню очень давно видел что-то подобное.

upd. Нашел. Но тут для HE. Ну и код конечно из 2006
Код:
/*
exploding gernade

by P34nut

*/

#include <amxmodx>
#include <engine>

#define PLUGIN_NAME "Exploding Gernade"
#define PLUGIN_VERSION "1.0"
#define PLUGIN_CREATOR "P34nut"


#define EXPLODE_DELAY 10.0

new g_ExplosionMdl, g_SmokeMdl
new bool:task[32] = false
new bool:done[32] = false

public plugin_init() {
    register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_CREATOR)
    register_event("ResetHUD", "rst_done", "b")
    register_event("SendAudio","grenade_throw","bc","2=%!MRAD_FIREINHOLE")
    register_event("CurWeapon", "cur_weapon", "be")
}

public plugin_precache() {
    g_ExplosionMdl = precache_model("sprites/zerogxplode.spr")
    g_SmokeMdl = precache_model("sprites/steam1.spr")
}

public plugin_modules() {
    require_module("engine")
}

public client_PreThink(id) {
    if(is_user_connected(id) && is_user_alive(id)) {
        new u_Weapon, w_Clip, w_Ammo, w_Name[32], szMessage[164]
        
        
        if((entity_get_int(id, EV_INT_button) & IN_ATTACK)) {
            // Player is in attack.. check his weapon
            u_Weapon = get_user_weapon(id, w_Clip, w_Ammo)
            
            // If the player dont have a weapon..stop!...
            if(!u_Weapon) {
                return PLUGIN_HANDLED
            }
            
            get_weaponname(u_Weapon, w_Name, 31)
            // Check if the weapon is the he grenade
            if(equal(w_Name, "weapon_hegrenade") && !done[id] && !task[id]) {
                
                // Make a green message so you have to see it....
                format(szMessage, 163, "^x04 У вас есть 10 секунд для того что-бы бросить гранату!")
                
                message_begin(MSG_ONE,get_user_msgid("SayText"), {0,0,0}, id)
                write_byte(3)
                write_string(szMessage)
                message_end ()
        
                // make the task
                set_task(EXPLODE_DELAY, "make_explode", id)
                task[id] = true
            
            } else {
                // Player switched his weapon... remove task
                if(task_exists(id) && !task[id]) {
                    remove_task(id)
                }
            }
            
        } else if(task_exists(id) && !task[id]) {
            // Player is not in attack anymore.. remove task
            remove_task(id)
        }
        
    }
    return PLUGIN_CONTINUE
}

public make_explode(id) {
    new u_Grenade, g_hs
    new uWeaponName[32]
        
    // Make the explosion
    make_explosion(id,  g_ExplosionMdl, g_SmokeMdl)
    
    // Kill the player and make a deathMSG
    user_silentkill(id)
    g_hs = random_num(0, 1)
    format(uWeaponName, 31, "grenade")
    make_deathmsg(0 , id, g_hs, uWeaponName)
    
    // Remove the grenade
    u_Grenade = get_grenade(id)
    remove_entity(u_Grenade)
        
    done[id] = true

}

public rst_done() {
    new g_plNum = get_playersnum()
    for(new i = 1; i <= g_plNum; i++) {
        if(done[i]){
            
            done[i] = false
        }
        if(task[i]) {
            task[i] = false
        }
    }
    return PLUGIN_HANDLED
}

public grenade_throw() {
    new id = read_data(1)
    if(task[id]) {
        task[id] = false
    }
}

public cur_weapon(id) {
    new w_ID, w_Clip, w_Ammo, w_Name[32]
    
    w_ID = get_user_weapon(id, w_Clip, w_Ammo)
    if(!w_ID) {
        return PLUGIN_HANDLED
    }
    get_weaponname(w_ID, w_Name, 31)
    
    if(!equal(w_Name, "weapon_hegrenade")) {
        if(task[id]) {
            task[id] = false
        }
    }
    return PLUGIN_CONTINUE
}

stock make_explosion(id,  ExplosionMdl, SmokeMdl = false, BeamCilinderMdl = false) {
    new origin[3]
    
    get_user_origin(id, origin)
    
    // Explosion
    message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
    write_byte(3) // TE_EXPLOSION
    write_coord(origin[0]) // startorigin
    write_coord(origin[1])
    write_coord(origin[2] + 5)
    write_short(ExplosionMdl) // sprite
    write_byte(random_num(0,20) + 20)
    write_byte(12)
    write_byte(0)
    message_end()
    
    if(SmokeMdl) {
        // Smoke
        message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
        write_byte(5) // TE_SMOkE
        write_coord(origin[0]) // startorigin
        write_coord(origin[1])
        write_coord(origin[2] + 15)
        write_short(SmokeMdl) // sprite
        write_byte(60)
        write_byte(10)
        message_end()
    }
        
    if(BeamCilinderMdl) {
        //BeamCilinder
        message_begin( MSG_BROADCAST,SVC_TEMPENTITY,origin )
        write_byte ( 21 ) //TE_BEAMCYLINDER
        write_coord( origin[0] )
        write_coord( origin[1] )
        write_coord( origin[2] )
        write_coord( origin[0] )
        write_coord( origin[1] )
        write_coord( origin[2]+200 )
        write_short( BeamCilinderMdl )
        write_byte ( 0 )
        write_byte ( 1 )
        write_byte ( 6 )
        write_byte ( 8 )
        write_byte ( 1 )
        write_byte ( 255 )
        write_byte ( 255 )
        write_byte ( 192 )
        write_byte ( 128 )
        write_byte ( 5 )
        message_end()
    }
    return true
}
+ еще один плагин, с ним уже можно будет поработать.

Код:
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>

#define PLUGIN    "Hand Grenade Explode"
#define AUTHOR    "OT"
#define VERSION    "1.0"

#define add_user_has_nade(%0)              bs_userhasnade |= (1<<((%0)-1))
#define remove_user_has_nade(%0)          bs_userhasnade &= ~(1<<((%0)-1))
#define user_has_nade(%0)                  (bs_userhasnade & (1<<((%0)-1)))

#define OFFSET_GRENADE_PINPULL_TIME        31
#define OFFSET_WEAPON_OWNER                41
#define OFFSET_WEAPON_ID                43

#define OFFSET_PLAYER_NEXT_ATTACK        83

#define EXTRA_OFFSET_WEAPON_LINUX        4
#define EXTRA_OFFSET_PLAYER_LINUX        5

#define pev_explodetime                    pev_dmgtime

new const NADE_RACE[] =
{
    CSW_HEGRENADE,
    CSW_FLASHBANG,
    CSW_SMOKEGRENADE
}

new const NADE_MODEL[][] =
{
    "w_hegrenade.mdl",
    "w_flashbang.mdl",
    "w_smokegrenade.mdl"
}

new weapon[33]
new must_explode[33]
new Float:cuttime[33]

new pcv_cut_dmgtime

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR)
    register_cvar("gren_hand_ex_vs", VERSION, (FCVAR_SPONLY | FCVAR_SERVER))
    
    register_event("CurWeapon", "event_active_weapon", "be", "1=1")
    
    RegisterHam(Ham_Think, "weapon_hegrenade",     "fw_think")
    RegisterHam(Ham_Think, "weapon_flashbang",     "fw_think")
    RegisterHam(Ham_Think, "weapon_smokegrenade","fw_think")
    
    set_task(1.0, "task_reg_setmodel")
    
    pcv_cut_dmgtime = register_cvar("hdex_cutexplotime", "1")
}

public task_reg_setmodel()
{
    // Register it after to let other plugins make the modifications
    register_forward(FM_SetModel, "fw_setmodel", 1)
}

public fw_think(ent)
{
    new owner = get_pdata_cbase(ent, OFFSET_WEAPON_OWNER, EXTRA_OFFSET_WEAPON_LINUX)
    new Float:explode_time
    pev(ent, pev_explodetime, explode_time)
    
    if (get_pdata_float(ent, OFFSET_GRENADE_PINPULL_TIME, EXTRA_OFFSET_WEAPON_LINUX) == 0.0 && explode_time == 0.0)
    {
        cuttime[owner] = get_gametime() + 0.4
        set_pev(ent, pev_explodetime, get_gametime() + 2.0)
    }
    
    if (get_pdata_float(ent, OFFSET_GRENADE_PINPULL_TIME, EXTRA_OFFSET_WEAPON_LINUX) > 0.0)
    {
        set_pev(ent, pev_explodetime, 0.0)
    }
    
    if (explode_time < get_gametime() && explode_time != 0.0)
    {
        new weapon_id = get_pdata_int(ent, OFFSET_WEAPON_ID, EXTRA_OFFSET_WEAPON_LINUX)
        
        if (weapon_id == weapon[owner])
        {
            must_explode[owner] = weapon[owner]
            
            client_cmd(owner, "-attack")
        }
        else
        {
            new classname[32]
            pev(ent, pev_classname, classname, charsmax(classname))
            
            engclient_cmd(owner, classname)
            
            must_explode[owner] = weapon_id
            
            set_pdata_float(owner, OFFSET_PLAYER_NEXT_ATTACK, 0.0, EXTRA_OFFSET_PLAYER_LINUX)
            
            client_cmd(owner, "+attack ; wait ; -attack")
        }
        
        set_pev(ent, pev_explodetime, 0.0)
    }
    
    return HAM_IGNORED
}

public event_active_weapon(id)
{
    weapon[id] = read_data(2)
    return PLUGIN_CONTINUE
}

public fw_setmodel(ent, model[])
{
    if (!pev_valid(ent))
    {
        return FMRES_IGNORED
    }
    
    new Float:gravity
    pev(ent, pev_gravity, gravity)
    
    // Not yet thrown
    if (gravity == 0.0)
    {
        return FMRES_IGNORED
    }
    
    new owner = pev(ent, pev_owner)
    
    if (!must_explode[owner])
    {
        if (!get_pcvar_num(pcv_cut_dmgtime))
            return FMRES_IGNORED
        
        for (new i=0;i<3;i++)
        {
            if (containi(model, NADE_MODEL[i]) != -1)
            {
                new Float:substract
                pev(ent, pev_dmgtime, substract)
                substract -= get_gametime() - cuttime[owner]
                set_pev(ent, pev_dmgtime, substract)
                
                return FMRES_IGNORED
            }
        }
    }
    
    for (new i=0;i<3;i++)
    {
        if (containi(model, NADE_MODEL[i]) != -1)
        {
            if (NADE_RACE[i] == must_explode[owner])
            {
                set_pev(ent, pev_nextthink, get_gametime() + 0.02)
                set_pev(ent, pev_movetype, MOVETYPE_FOLLOW)
                set_pev(ent, pev_aiment, owner)
                set_pev(ent, pev_dmgtime, 0.0)
                set_pev(ent, pev_flags, pev(ent, pev_flags) & FL_ONGROUND)
                must_explode[owner] = 0
                return FMRES_IGNORED
            }
        }
    }
    
    return FMRES_IGNORED
}
 
Статус
В этой теме нельзя размещать новые ответы.

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

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