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

Ножи ZombiePlague

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

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

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

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

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

Ножи ZombiePlague

Сообщение Максим_SerJanT » 26 авг 2022, 10:00

Появилась проблема. Есть меню ножей. Есть плагин на нож Thanatos9, в нём готовые нативы. В меню прописал, вроде выдаются, но после антидота, или после смерти - спадает (Дефолт нож(не стандартный с плагина))
Помогите, пжпж.

Код: Выделить всё
#include <amxmodx>
#include <fun>
#include <fakemeta>
#include <hamsandwich>
#include <zombieplague>

#define PLUGIN    "Knife"
#define VERSION    "1.0"
#define AUTHOR    "BlackCat"

#define MAX_CLIENTS                32

#define VIP ADMIN_LEVEL_A
#define VIPS ADMIN_LEVEL_H

new KNIFE1_V_MODEL[] = "models/kn_csa/v_kn3.mdl"
new KNIFE1_P_MODEL[] = "models/kn_csa/p_kn3.mdl"

new KNIFE2_V_MODEL[] = "models/kn_csa/v_kn1.mdl"
new KNIFE2_P_MODEL[] = "models/kn_csa/p_kn1.mdl"

new KNIFE3_V_MODEL[] = "models/kn_csa2/v_kn2.mdl"
new KNIFE3_P_MODEL[] = "models/kn_csa2/p_kn2.mdl"

new KNIFE4_V_MODEL[] = "models/kn_csa2/v_katana.mdl"
new KNIFE4_P_MODEL[] = "models/kn_csa2/p_katana.mdl"

new KNIFE5_V_MODEL[] = "models/kn_csa3/v_ruyi-stick.mdl"
new KNIFE5_P_MODEL[] = "models/kn_csa3/p_ruyi-stick.mdl"

new KNIFESURV_V_MODEL[] = "models/kn_csa/v_kn3.mdl"
new KNIFESURV_P_MODEL[] = "models/kn_csa/p_kn3.mdl"

new bool:g_has_axe[33]
new bool:g_has_strong[33]
new bool:g_has_combat[33]
new bool:g_has_hammer[33]
new bool:g_has_mumiy[33]
new bool:g_has_survivoraxe[33]

new g_knife_menu, g_nvip_knife_menu, g_vip_knife_menu
new cvar_knock_axe
, cvar_jump_axe, cvar_speed_axe, cvar_damage_axe
new cvar_knock_strong
, cvar_jump_strong, cvar_speed_strong, cvar_damage_strong
new cvar_knock_combat
, cvar_jump_combat, cvar_speed_combat, cvar_damage_combat
new cvar_knock_hammer
, cvar_jump_hammer, cvar_speed_hammer, cvar_damage_hammer
new cvar_knock_mumiy
, cvar_jump_mumiy, cvar_speed_mumiy, cvar_damage_mumiy
new cvar_knock_surv
, cvar_jump_surv, cvar_speed_surv, cvar_damage_surv

native SetUserTh9
(id);
native DelUserTh9(id);

new const g_sound_knife[] = { "items/gunpickup2.wav" }

new const axe_sounds[][] =
{
        "zm_battle/combat_draw.wav",
        "zm_battle/combat_hit_01.wav",
        "zm_battle/combat_hit_01.wav",
        "zm_battle/combat_hit_wall.wav",
        "zm_battle/combat_miss.wav",
        "zm_battle/combat_stab.wav"
}

new const strong_sounds[][] =
{
        "zm_battle/hammer_draw.wav",
        "zm_battle/hammer_stab.wav",
        "zm_battle/hammer_stab.wav",
        "zm_battle/hammer_stab.wav",
        "zm_battle/hammer_slash1.wav",
        "zm_battle/hammer_stab.wav"
}

new const combat_sounds[][] =
{
        "zm_battle/serp_draw.wav",
        "zm_battle/serp_hit1.wav",
        "zm_battle/serp_hit1.wav",
        "zm_battle/srp_hitwall1.wav",
        "zm_battle/serp_slash1.wav",
        "zm_battle/serp_stab.wav"
}

new const hammer_sounds[][] =
{
        "zm_battle/top_draw.wav",
        "zm_battle/combat_hit_01.wav",
        "zm_battle/combat_hit_01.wav",
        "zm_battle/combat_hit_wall.wav",
        "zm_battle/combat_miss.wav",
        "zm_battle/combat_stab.wav"
}

new const mumiy_sounds[][] =
{
        "zm_battle/ruyi-stick_draw.wav",
        "zm_battle/ruyi-stick_hit1.wav",
        "zm_battle/ruyi-stick_hit2.wav",
        "zm_battle/ruyi-stick_hit_wall.wav",
        "zm_battle/ruyi-stick_slash1.wav",
        "zm_battle/coilhammer_stab.wav"
}

new const surv_sounds[][] =
{
        "zm_battle/combat_draw.wav",
        "zm_battle/combat_hit_01.wav",
        "zm_battle/combat_hit_01.wav",
        "zm_battle/combat_hit_wall.wav",
        "zm_battle/combat_miss.wav",
        "zm_battle/combat_stab.wav"
} 

public plugin_init
()
{
    register_plugin(PLUGIN , VERSION , AUTHOR);
    register_cvar("zp_addon_knife", VERSION, FCVAR_SERVER);

    g_knife_menu = menu_create("Выбор ножей","menu_handle")
    g_nvip_knife_menu = menu_create("Выбор ножей","menu_handle_nvip")
    g_vip_knife_menu = menu_create("Выбор ножей","menu_handle_vip")
        
    register_clcmd
("say /knife","knifemenu",ADMIN_ALL,"knife_menu")
    register_clcmd("knife","knifemenu",ADMIN_ALL,"knife_menu")
        
    build_menu
()
    build_menu_nvip()
    build_menu_vip()

    register_event("CurWeapon","checkWeapon","be","1=1");

    register_forward(FM_EmitSound, "CEntity__EmitSound");
    register_forward(FM_PlayerPreThink, "fw_PlayerPreThink");

    RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage");
    RegisterHam(Ham_Spawn, "player", "fw_playerspawn_post", 1)
    RegisterHam(Ham_Use, "func_tank", "fw_UseStationary_Post", 1)
    RegisterHam(Ham_Use, "func_tankmortar", "fw_UseStationary_Post", 1)
    RegisterHam(Ham_Use, "func_tankrocket", "fw_UseStationary_Post", 1)
    RegisterHam(Ham_Use, "func_tanklaser", "fw_UseStationary_Post", 1)

    register_message(get_user_msgid("DeathMsg"), "message_DeathMsg"); 
        
        
/* register_clcmd("zm_knife_strong", "clcmd_knife")
        register_clcmd("zm_knife_hammer", "clcmd_knife")
        register_clcmd("zm_knife_combat", "clcmd_knife")
        register_clcmd("zm_knife_mumiy", "clcmd_mumiy")
        register_clcmd("zm_knife_axe", "clcmd_knife") */

    cvar_jump_axe = register_cvar("zp_axe_jump", "260.0")
    cvar_speed_axe = register_cvar("zp_axe_speed", "240.0")
    cvar_damage_axe = register_cvar("zp_axe_damage", "4.3")
    cvar_knock_axe = register_cvar("zp_axe_knockback", "0.1")
  
    cvar_jump_strong 
= register_cvar("zp_strong_jump", "370.0")
    cvar_speed_strong = register_cvar("zp_strong_speed", "240.0")
    cvar_damage_strong = register_cvar("zp_strong_damage", "4.3")
    cvar_knock_strong = register_cvar("zp_strong_knockback", "5.0")

    cvar_jump_combat = register_cvar("zp_combat_jump", "260.0")
    cvar_speed_combat = register_cvar("zp_combat_speed", "340.0")
    cvar_damage_combat = register_cvar("zp_combat_damage", "4.3")
    cvar_knock_combat = register_cvar("zp_combat_knockback", "5.0")

    cvar_jump_hammer = register_cvar("zp_hammer_jump", "370.0")
    cvar_speed_hammer = register_cvar("zp_hammer_speed", "280.0")
    cvar_damage_hammer = register_cvar("zp_hammer_damage", "4.3")
    cvar_knock_hammer = register_cvar("zp_hammer_knockback", "5.0")
    
    cvar_jump_mumiy 
= register_cvar("zp_mumiy_jump", "380.0")
    cvar_speed_mumiy = register_cvar("zp_mumiy_speed", "290.0")
    cvar_damage_mumiy = register_cvar("zp_mumiy_damage", "4.5")
    cvar_knock_mumiy = register_cvar("zp_mumiy_knockback", "5.0")
 
    cvar_jump_surv 
= register_cvar("zp_axe_surv_jump", "280.0")
    cvar_speed_surv = register_cvar("zp_axe_surv_speed", "300.0")
    cvar_damage_surv = register_cvar("zp_axe_surv_damage", "15.5")
    cvar_knock_surv = register_cvar("zp_axe_surv_knockback", "5.0")
}

public client_connect(id)
{
        g_has_axe[id] = true
        g_has_strong
[id] = false
        g_has_combat
[id] = false
        g_has_hammer
[id] = false
        g_has_mumiy
[id] = false
        g_has_survivoraxe
[id] = false
}

public client_disconnect(id)
{
        g_has_axe[id] = false
        g_has_strong
[id] = false
        g_has_combat
[id] = false
        g_has_hammer
[id] = false
        g_has_mumiy
[id] = false
        g_has_survivoraxe
[id] = false
}

public plugin_precache()
{
        precache_model(KNIFE1_V_MODEL)
        precache_model(KNIFE1_P_MODEL)
        precache_model(KNIFE2_V_MODEL)
        precache_model(KNIFE2_P_MODEL)
        precache_model(KNIFE3_V_MODEL)
        precache_model(KNIFE3_P_MODEL)
        precache_model(KNIFE4_V_MODEL)
        precache_model(KNIFE4_P_MODEL)
        precache_model(KNIFE5_V_MODEL)
        precache_model(KNIFE5_P_MODEL)
        precache_model(KNIFESURV_V_MODEL)
        precache_model(KNIFESURV_P_MODEL)
        
        
/*precache_generic("sprites/zm_knife_strong.txt")
        precache_generic("sprites/zm_knife_hammer.txt")
        precache_generic("sprites/zm_knife_combat.txt")
        precache_generic("sprites/zm_knife_axe.txt")
        precache_generic("sprites/weapon_monkeywpnset3.txt")
        
        precache_generic("sprites/zm_cso/640hud7.spr")
        precache_generic("sprites/zm_cso/640hud21.spr")
        precache_generic("sprites/zm_cso/640hud23.spr")
        precache_generic("sprites/zm_cso/640hud38.spr")
        precache_generic("sprites/zm_cso/640hud39.spr")
        precache_generic("sprites/zm_cso/640hud97.spr")*/
        
        precache_sound
(g_sound_knife)

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

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

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

        for(new i = 0; i < sizeof hammer_sounds; i++)
                precache_sound(hammer_sounds[i])
                
        for
(new i = 0; i < sizeof mumiy_sounds; i++)
                precache_sound(mumiy_sounds[i])
                
        for
(new i = 0; i < sizeof surv_sounds; i++)
                precache_sound(surv_sounds[i])
}

public clcmd_knife(id)
{
    if(!is_user_alive(id))
        return;

    engclient_cmd(id, "weapon_knife")
}

build_menu()
{
          
        menu_additem
(g_knife_menu, "Комбат \r[\yОбычный\r]", "1")
        menu_additem(g_knife_menu, "Кувалда \r[\yГрав+Отброс\r]", "2")
        menu_additem(g_knife_menu, "Серп \r[\yСкор+Отброс\r]", "3")
        menu_additem(g_knife_menu, "\dКатана \r[\yVIP\r]", "4")
        menu_additem(g_knife_menu, "\dRuyi Stick \r[\yVIP+\r]", "5")
        menu_additem(g_knife_menu, "\dRuyi Stick \r[\yVIP+\r]", "6")
        menu_setprop(g_knife_menu, MPROP_EXITNAME, "Выход")
}

build_menu_nvip()
{
  
        menu_additem
(g_nvip_knife_menu, "Комбат \r[\yОбычный\r]", "1")
        menu_additem(g_nvip_knife_menu, "Кувалда \r[\yГрав+Отброс\r]", "2")
        menu_additem(g_nvip_knife_menu, "Серп \r[\yСкор+Отброс\r]", "3")
        menu_additem(g_nvip_knife_menu, "Катана \r[\yVIP\r]", "4")
        menu_additem(g_nvip_knife_menu, "\dRuyi Stick \r[\yVIP+\r]", "5")
        menu_additem(g_nvip_knife_menu, "\dRuyi Stick \r[\yVIP+\r]", "6")
        menu_setprop(g_nvip_knife_menu, MPROP_EXITNAME, "Выход")
}
    

build_menu_vip
()
{
  
        menu_additem
(g_vip_knife_menu, "Комбат \r[\yОбычный\r]", "1")
        menu_additem(g_vip_knife_menu, "Кувалда \r[\yГрав+Отброс\r]", "2")
        menu_additem(g_vip_knife_menu, "Серп \r[\yСкор+Отброс\r]", "3")
        menu_additem(g_vip_knife_menu, "Катана \r[\yVIP\r]", "4")
        menu_additem(g_vip_knife_menu, "Ruyi Stick \r[\yVIP+\r]", "5")
        menu_additem(g_vip_knife_menu, "\dRuyi Stick \r[\yVIP+\r]", "6")
        menu_setprop(g_vip_knife_menu, MPROP_EXITNAME, "Выход")
}

public knifemenu(id)
{
        if (zp_has_round_started())
                return;

        if (!zp_has_round_started())
        {
            if (get_user_flags(id) & VIP)
            {
                menu_display(id, !(get_user_flags(id) & VIP) ? g_knife_menu : g_nvip_knife_menu, 0)
            }
            if (get_user_flags(id) & VIPS)
            {
                menu_display(id, !(get_user_flags(id) & VIPS) ? g_knife_menu : g_vip_knife_menu, 0)
            }
        }

}

public menu_handle_nvip(id, menu, item)
{
        if(item < 0) 
                return PLUGIN_CONTINUE
        
        new cmd
[2];
        new access, callback;
        menu_item_getinfo(menu, item, access, cmd,2,_,_, callback);
        new choice = str_to_num(cmd)
        
        switch 
(choice)
        {
                case 1: buy_knife1(id)
                case 2: buy_knife2(id)
                case 3: buy_knife3(id)
                case 4: buy_knife4(id)
                case 5: buy_knife5(id)
                case 6: buy_knife6(id)
        }
        return PLUGIN_HANDLED;
}
 

public menu_handle_vip
(id, menu, item)
{
        if(item < 0) 
                return PLUGIN_CONTINUE
        
        new cmd
[2];
        new access, callback;
        menu_item_getinfo(menu, item, access, cmd,2,_,_, callback);
        new choice = str_to_num(cmd)
        
        switch 
(choice)
        {
                case 1: buy_knife1(id)
                case 2: buy_knife2(id)
                case 3: buy_knife3(id)
                case 4: buy_knife4(id)
                case 5: buy_knife5(id)
                case 6: buy_knife6(id)
        }
        return PLUGIN_HANDLED;
}
 

public menu_handle
(id, menu, item)
{
        if(item < 0) 
                return PLUGIN_CONTINUE
        
        new cmd
[2];
        new access, callback;
        menu_item_getinfo(menu, item, access, cmd,2,_,_, callback);
        new choice = str_to_num(cmd)
        
        switch 
(choice)
        {
                case 1: buy_knife1(id)
                case 2: buy_knife2(id)
                case 3: buy_knife3(id)
                case 4: buy_knife4(id)
                case 5: buy_knife5(id)
                case 6: buy_knife6(id)
        }
        return PLUGIN_HANDLED;
}
 



public buy_knife1
(id)
{
    g_has_axe[id] = true     
    g_has_strong
[id] = false    
    g_has_combat
[id] = false
        g_has_hammer
[id] = false
        g_has_mumiy
[id] = false
        g_has_survivoraxe
[id] = false
        DelUserTh9
(id)
        
    
//set_sprite(id)
        
    message_begin
(MSG_ONE, get_user_msgid("WeapPickup"), {0,0,0}, id) 
    write_byte
(29)
    message_end()
        
        checkWeapon
(id)

        engfunc(EngFunc_EmitSound, id, CHAN_BODY, g_sound_knife, 1.0, ATTN_NORM, 0, PITCH_NORM)
}

public buy_knife2(id)
{
    g_has_axe[id] = false    
    g_has_strong
[id] = true     
    g_has_combat
[id] = false
    g_has_hammer
[id] = false
    g_has_mumiy
[id] = false
    g_has_survivoraxe
[id] = false
    DelUserTh9
(id)
        
    
//set_sprite(id)
        
    message_begin
(MSG_ONE, get_user_msgid("WeapPickup"), {0,0,0}, id) 
    write_byte
(29)
    message_end()
        
    checkWeapon
(id)

    engfunc(EngFunc_EmitSound, id, CHAN_BODY, g_sound_knife, 1.0, ATTN_NORM, 0, PITCH_NORM)
}

public buy_knife3(id)
{
        g_has_axe[id] = false    
        g_has_strong
[id] = false    
        g_has_combat
[id] = true
        g_has_hammer
[id] = false
        g_has_mumiy
[id] = false
        g_has_survivoraxe
[id] = false
        DelUserTh9
(id)
        
        
//set_sprite(id)
        
    message_begin
(MSG_ONE, get_user_msgid("WeapPickup"), {0,0,0}, id) 
    write_byte
(29)
    message_end()
        
    checkWeapon
(id)

    engfunc(EngFunc_EmitSound, id, CHAN_BODY, g_sound_knife, 1.0, ATTN_NORM, 0, PITCH_NORM)
}

public buy_knife4(id)
{
    if (get_user_flags(id) & VIP)
    {
        g_has_axe[id] = false    
        g_has_strong
[id] = false    
        g_has_combat
[id] = false
        g_has_hammer
[id] = true
        g_has_mumiy
[id] = false
        g_has_survivoraxe
[id] = false
        DelUserTh9
(id)
                
    
//set_sprite(id)
                
        message_begin
(MSG_ONE, get_user_msgid("WeapPickup"), {0,0,0}, id) 
        write_byte
(29)
    message_end()
                
        checkWeapon
(id)

        engfunc(EngFunc_EmitSound, id, CHAN_BODY, g_sound_knife, 1.0, ATTN_NORM, 0, PITCH_NORM)
    }
    else 
    
{
        knifemenu(id)
        ChatColor(id, "")
    }

}

public buy_knife5(id)
{
    if (get_user_flags(id) & VIPS)
    {
                g_has_axe[id] = false    
                g_has_strong
[id] = false    
                g_has_combat
[id] = false
                g_has_hammer
[id] = false
                g_has_mumiy
[id] = true
                g_has_survivoraxe
[id] = false
                DelUserTh9
(id)
                
                
//set_sprite(id)
                
                message_begin
(MSG_ONE, get_user_msgid("WeapPickup"), {0,0,0}, id) 
                write_byte
(29)
        message_end()
                
                checkWeapon
(id)

                engfunc(EngFunc_EmitSound, id, CHAN_BODY, g_sound_knife, 1.0, ATTN_NORM, 0, PITCH_NORM)
        }
        else 
        
{
                knifemenu(id)
                ChatColor(id, "")
        }

}

public buy_knife6(id)
{
    if (get_user_flags(id) & VIPS)
    {
                g_has_axe[id] = false    
                g_has_strong
[id] = false    
                g_has_combat
[id] = false
                g_has_hammer
[id] = false
                g_has_mumiy
[id] = false
                g_has_survivoraxe
[id] = false
                SetUserTh9
(id)
                
                
//set_sprite(id)
                
                message_begin
(MSG_ONE, get_user_msgid("WeapPickup"), {0,0,0}, id) 
                write_byte
(29)
        message_end()
                
                checkWeapon
(id)

                engfunc(EngFunc_EmitSound, id, CHAN_BODY, g_sound_knife, 1.0, ATTN_NORM, 0, PITCH_NORM)
        }
        else 
        
{
                knifemenu(id)
                ChatColor(id, "")
        }

}

public fw_UseStationary_Post(entity, caller, activator, use_type)
{
    if (use_type == 0 && is_user_connected(caller))
        checkWeapon(caller)
}

public zp_user_infected_post(id)
{
    //set_sprite(id)
}

public checkWeapon(id)
{
        if(get_user_weapon(id) != CSW_KNIFE)
                return;
                
        if 
(g_has_axe[id] || g_has_strong[id] || g_has_combat[id] || g_has_hammer[id] || g_has_mumiy[id] || g_has_survivoraxe[id])
        {
                checkModel(id)
        }
        return;
}

public checkModel(id)
{
        if (zp_get_user_zombie(id))
        {
                //set_sprite(id)
                return;
        }
                
        if
(get_user_weapon(id) != CSW_KNIFE)
                return;
    
        if 
(g_has_axe[id])
        {
                set_pev(id, pev_viewmodel2, KNIFE1_V_MODEL)
                set_pev(id, pev_weaponmodel2, KNIFE1_P_MODEL)
        }
        else if (g_has_strong[id])
        {
                set_pev(id, pev_viewmodel2, KNIFE2_V_MODEL)
                set_pev(id, pev_weaponmodel2, KNIFE2_P_MODEL)
        }
        else if (g_has_combat[id])
        {
                set_pev(id, pev_viewmodel2, KNIFE3_V_MODEL)
                set_pev(id, pev_weaponmodel2, KNIFE3_P_MODEL)
        }
        else if (g_has_hammer[id])
        {
                set_pev(id, pev_viewmodel2, KNIFE4_V_MODEL)
                set_pev(id, pev_weaponmodel2, KNIFE4_P_MODEL)
        }
        else if (g_has_mumiy[id])
        {
                set_pev(id, pev_viewmodel2, KNIFE5_V_MODEL)
                set_pev(id, pev_weaponmodel2, KNIFE5_P_MODEL)
        }
        else if(g_has_survivoraxe[id])
        {
                set_pev(id, pev_viewmodel2, KNIFESURV_V_MODEL)
                set_pev(id, pev_weaponmodel2, KNIFESURV_P_MODEL)
        }
    //set_sprite(id)
}

public fw_playerspawn_post(id)
{
    if(!is_user_alive(id))
        return;
        
    
//if(g_has_survivoraxe[id])
    {
        //g_has_axe[id] = true
            //g_has_strong[id] = false
            //g_has_combat[id] = false
            //g_has_hammer[id] = false
            //g_has_mumiy[id] = false
            //g_has_survivoraxe[id] = false
            
            
//set_sprite(id)
        }
    return;
}

public CEntity__EmitSound(id, channel, const sample[], Float:volume, Float:attn, flags, pitch)
{
    if (!is_user_connected(id)) 
        return HAM_IGNORED
    
    if 
(zp_get_user_zombie(id)) 
        return HAM_IGNORED
    
    if 
(sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i')
    {
        
        if 
(sample[14] == 'd') 
        
{
            if(g_has_axe[id])
                emit_sound(id, channel, axe_sounds[0], volume, attn, flags, pitch)
            if(g_has_strong[id])
                emit_sound(id, channel, strong_sounds[0], volume, attn, flags, pitch)
            if(g_has_combat[id])
                emit_sound(id, channel, combat_sounds[0], volume, attn, flags, pitch)
            if(g_has_hammer[id])
                emit_sound(id, channel, hammer_sounds[0], volume, attn, flags, pitch)
            if(g_has_mumiy[id])
                emit_sound(id, channel, mumiy_sounds[0], volume, attn, flags, pitch)
            if(g_has_survivoraxe[id])
                emit_sound(id, channel, surv_sounds[0], volume, attn, flags, pitch)
        }
        else if (sample[14] == 'h')
        {
            if (sample[17] == 'w') 
            
{
                if(g_has_axe[id])
                    emit_sound(id, channel, axe_sounds[3], volume, attn, flags, pitch)
                if(g_has_strong[id])
                    emit_sound(id, channel, strong_sounds[3], volume, attn, flags, pitch)
                if(g_has_combat[id])
                    emit_sound(id, channel, combat_sounds[3], volume, attn, flags, pitch)
                if(g_has_hammer[id])
                    emit_sound(id, channel, hammer_sounds[3], volume, attn, flags, pitch)
                if(g_has_mumiy[id])
                    emit_sound(id, channel, mumiy_sounds[3], volume, attn, flags, pitch)
                if(g_has_survivoraxe[id])
                    emit_sound(id, channel, surv_sounds[3], volume, attn, flags, pitch)
            }
            else
            
{
                if(g_has_axe[id])
                    emit_sound(id, channel, axe_sounds[random_num(1,2)], volume, attn, flags, pitch)
                if(g_has_strong[id])
                    emit_sound(id, channel, strong_sounds[random_num(1,2)], volume, attn, flags, pitch)
                if(g_has_combat[id])
                    emit_sound(id, channel, combat_sounds[random_num(1,2)], volume, attn, flags, pitch)
                if(g_has_hammer[id])
                    emit_sound(id, channel, hammer_sounds[random_num(1,2)], volume, attn, flags, pitch)
                if(g_has_mumiy[id])
                    emit_sound(id, channel, mumiy_sounds[random_num(1,2)], volume, attn, flags, pitch)
                if(g_has_survivoraxe[id])
                    emit_sound(id, channel, surv_sounds[random_num(1,2)], volume, attn, flags, pitch)
            }
        }
        else
        
{
            if (sample[15] == 'l') 
            
{
                if(g_has_axe[id])
                    emit_sound(id, channel, axe_sounds[4], volume, attn, flags, pitch)
                if(g_has_strong[id])
                    emit_sound(id, channel, strong_sounds[4], volume, attn, flags, pitch)
                if(g_has_combat[id])
                    emit_sound(id, channel, combat_sounds[4], volume, attn, flags, pitch)
                if(g_has_hammer[id])
                    emit_sound(id, channel, hammer_sounds[4], volume, attn, flags, pitch)
                if(g_has_mumiy[id])
                    emit_sound(id, channel, mumiy_sounds[4], volume, attn, flags, pitch)
                if(g_has_survivoraxe[id])
                    emit_sound(id, channel, surv_sounds[4], volume, attn, flags, pitch)
            }
            else 
            
{
                if(g_has_axe[id])
                    emit_sound(id, channel, axe_sounds[5], volume, attn, flags, pitch)
                if(g_has_strong[id] )
                    emit_sound(id, channel, strong_sounds[5], volume, attn, flags, pitch)
                if(g_has_combat[id] )
                    emit_sound(id, channel, combat_sounds[5], volume, attn, flags, pitch)
                if(g_has_hammer[id])
                    emit_sound(id, channel, hammer_sounds[5], volume, attn, flags, pitch)
                if(g_has_mumiy[id])
                    emit_sound(id, channel, mumiy_sounds[5], volume, attn, flags, pitch)
                if(g_has_survivoraxe[id])
                    emit_sound(id, channel, surv_sounds[5], volume, attn, flags, pitch)
            }
        }
        return HAM_SUPERCEDE
    
}
    return HAM_IGNORED
}

public fw_PlayerPreThink(id)
{
        if(!is_user_alive(id) || zp_get_user_zombie(id))
                return FMRES_IGNORED

        new temp
[2], weapon = get_user_weapon(id, temp[0], temp[1])

        if (weapon == CSW_KNIFE && g_has_axe[id])
        {
                set_user_maxspeed(id,get_pcvar_float(cvar_speed_axe))
                
                if 
((pev(id, pev_button) & IN_JUMP) && !(pev(id, pev_oldbuttons) & IN_JUMP))
                {
                        new flags = pev(id, pev_flags)
                        new waterlvl = pev(id, pev_waterlevel)
                        
                        if 
(!(flags & FL_ONGROUND))
                                return FMRES_IGNORED

                        if 
(flags & FL_WATERJUMP)
                                return FMRES_IGNORED

                        if 
(waterlvl > 1)
                                return FMRES_IGNORED
                        
                        new Float
:fVelocity[3]
                        pev(id, pev_velocity, fVelocity)
                        
                        fVelocity
[2] += get_pcvar_num(cvar_jump_axe)
                        
                        set_pev
(id, pev_velocity, fVelocity)
                        set_pev(id, pev_gaitsequence, 6)
                }
        }
        
        if
(weapon == CSW_KNIFE && g_has_strong[id])
        {
                set_user_maxspeed(id,get_pcvar_float(cvar_speed_strong)) 
                
                if 
((pev(id, pev_button) & IN_JUMP) && !(pev(id, pev_oldbuttons) & IN_JUMP))
                {
                        new flags = pev(id, pev_flags)
                        new waterlvl = pev(id, pev_waterlevel)
                        
                        if 
(!(flags & FL_ONGROUND))
                                return FMRES_IGNORED

                        if 
(flags & FL_WATERJUMP)
                                return FMRES_IGNORED

                        if 
(waterlvl > 1)
                                return FMRES_IGNORED
                        
                        new Float
:fVelocity[3]
                        pev(id, pev_velocity, fVelocity)
                        
                        fVelocity
[2] += get_pcvar_num(cvar_jump_strong)
                        
                        set_pev
(id, pev_velocity, fVelocity)
                        set_pev(id, pev_gaitsequence, 6)
                }       
        
}

        if(weapon == CSW_KNIFE && g_has_combat[id])   
        
{     
                if 
((pev(id, pev_button) & IN_JUMP) && !(pev(id, pev_oldbuttons) & IN_JUMP))
                {
                        new flags = pev(id, pev_flags)
                        new waterlvl = pev(id, pev_waterlevel)
                        
                        if 
(!(flags & FL_ONGROUND))
                                return FMRES_IGNORED

                        if 
(flags & FL_WATERJUMP)
                                return FMRES_IGNORED

                        if 
(waterlvl > 1)
                                return FMRES_IGNORED
                        
                        new Float
:fVelocity[3]
                        pev(id, pev_velocity, fVelocity)
                        
                        fVelocity
[2] += get_pcvar_num(cvar_jump_combat)
                        
                        set_pev
(id, pev_velocity, fVelocity)
                        set_pev(id, pev_gaitsequence, 6)
                }
                
                set_user_maxspeed
(id,get_pcvar_float(cvar_speed_combat))  
        
}
        if (weapon == CSW_KNIFE && g_has_hammer[id])
        {
                if ((pev(id, pev_button) & IN_JUMP) && !(pev(id, pev_oldbuttons) & IN_JUMP))
                {
                        new flags = pev(id, pev_flags)
                        new waterlvl = pev(id, pev_waterlevel)
                        
                        if 
(!(flags & FL_ONGROUND))
                                return FMRES_IGNORED

                        if 
(flags & FL_WATERJUMP)
                                return FMRES_IGNORED

                        if 
(waterlvl > 1)
                                return FMRES_IGNORED
                        
                        new Float
:fVelocity[3]
                        pev(id, pev_velocity, fVelocity)
                        
                        fVelocity
[2] += get_pcvar_num(cvar_jump_hammer)
                        
                        set_pev
(id, pev_velocity, fVelocity)
                        set_pev(id, pev_gaitsequence, 6)
                }
                
                set_user_maxspeed
(id, get_pcvar_float(cvar_speed_hammer))
        }
        if (weapon == CSW_KNIFE && g_has_mumiy[id])
        {
                if ((pev(id, pev_button) & IN_JUMP) && !(pev(id, pev_oldbuttons) & IN_JUMP))
                {
                        new flags = pev(id, pev_flags)
                        new waterlvl = pev(id, pev_waterlevel)
                        
                        if 
(!(flags & FL_ONGROUND))
                                return FMRES_IGNORED

                        if 
(flags & FL_WATERJUMP)
                                return FMRES_IGNORED

                        if 
(waterlvl > 1)
                                return FMRES_IGNORED
                        
                        new Float
:fVelocity[3]
                        pev(id, pev_velocity, fVelocity)
                        
                        fVelocity
[2] += get_pcvar_num(cvar_jump_mumiy)
                        
                        set_pev
(id, pev_velocity, fVelocity)
                        set_pev(id, pev_gaitsequence, 6)
                }
                
                set_user_maxspeed
(id, get_pcvar_float(cvar_speed_mumiy))
        }
        if(weapon == CSW_KNIFE && g_has_survivoraxe[id])
        {
                if ((pev(id, pev_button) & IN_JUMP) && !(pev(id, pev_oldbuttons) & IN_JUMP))
                {
                        new flags = pev(id, pev_flags)
                        new waterlvl = pev(id, pev_waterlevel)
                        
                        if 
(!(flags & FL_ONGROUND))
                                return FMRES_IGNORED

                        if 
(flags & FL_WATERJUMP)
                                return FMRES_IGNORED

                        if 
(waterlvl > 1)
                                return FMRES_IGNORED
                        
                        new Float
:fVelocity[3]
                        pev(id, pev_velocity, fVelocity)
                        
                        fVelocity
[2] += get_pcvar_num(cvar_jump_surv)
                        
                        set_pev
(id, pev_velocity, fVelocity)
                        set_pev(id, pev_gaitsequence, 6)
                }
                set_user_maxspeed(id, get_pcvar_float(cvar_speed_surv))
        }
        return FMRES_IGNORED
}  

public fw_TakeDamage
(victim, inflictor, attacker, Float:damage, damage_type)
{
        if(!is_user_connected(attacker))
                return HAM_IGNORED
        
        if
(zp_get_user_zombie(attacker))
                return HAM_IGNORED
        
        if
(get_user_weapon(attacker) == CSW_KNIFE)
        {
        
                if 
(g_has_axe[attacker])
                {
                        SetHamParamFloat(4, damage * get_pcvar_float(cvar_damage_axe)) 
                        
                        new Float
:vec[3];
                        new Float:oldvelo[3];
                        pev(victim, pev_velocity, oldvelo);
                        create_velocity_vector(victim , attacker , vec);
                        vec[0] += oldvelo[0] + get_pcvar_float(cvar_knock_axe);
                        vec[1] += oldvelo[1] + 0;
                        set_pev(victim, pev_velocity, vec);   
                
}
                else if (g_has_strong[attacker])
                {       
                        SetHamParamFloat
(4, damage * get_pcvar_float(cvar_damage_strong)) 
                        
                        new Float
:vec[3];
                        new Float:oldvelo[3];
                        pev(victim, pev_velocity, oldvelo);
                        create_velocity_vector(victim , attacker , vec);
                        vec[0] += oldvelo[0] + get_pcvar_float(cvar_knock_strong);
                        vec[1] += oldvelo[1] + 0;
                        set_pev(victim, pev_velocity, vec);   
                
}
                else if (g_has_combat[attacker])
                {       
                        SetHamParamFloat
(4, damage * get_pcvar_float(cvar_damage_combat)) 
                        
                        new Float
:vec[3];
                        new Float:oldvelo[3];
                        pev(victim, pev_velocity, oldvelo);
                        create_velocity_vector(victim , attacker , vec);
                        vec[0] += oldvelo[0] + get_pcvar_float(cvar_knock_combat);
                        vec[1] += oldvelo[1] + 0;
                        set_pev(victim, pev_velocity, vec);   
                
}
                else if (g_has_hammer[attacker])
                {       
                        SetHamParamFloat
(4, damage * get_pcvar_float(cvar_damage_hammer)) 
                        
                        new Float
:vec[3];
                        new Float:oldvelo[3];
                        pev(victim, pev_velocity, oldvelo);
                        create_velocity_vector(victim , attacker , vec);
                        vec[0] += oldvelo[0] + get_pcvar_float(cvar_knock_hammer);
                        vec[1] += oldvelo[1] + 0;
                        set_pev(victim, pev_velocity, vec);
                }
                else if (g_has_mumiy[attacker])
                {       
                        SetHamParamFloat
(4, damage * get_pcvar_float(cvar_damage_mumiy)) 
                        
                        new Float
:vec[3];
                        new Float:oldvelo[3];
                        pev(victim, pev_velocity, oldvelo);
                        create_velocity_vector(victim , attacker , vec);
                        vec[0] += oldvelo[0] + get_pcvar_float(cvar_knock_mumiy);
                        vec[1] += oldvelo[1] + 0;
                        set_pev(victim, pev_velocity, vec);
                }
                else if(g_has_survivoraxe[attacker])
                {       
                        SetHamParamFloat
(4, damage * get_pcvar_float(cvar_damage_surv)) 
                        
                        new Float
:vec[3];
                        new Float:oldvelo[3];
                        pev(victim, pev_velocity, oldvelo);
                        create_velocity_vector(victim , attacker , vec);
                        vec[0] += oldvelo[0] + get_pcvar_float(cvar_knock_surv);
                        vec[1] += oldvelo[1] + 0;
                        set_pev(victim, pev_velocity, vec);
                }
                more_blood(victim)
        }

        return HAM_IGNORED
}

public message_DeathMsg(msg_id, msg_dest, id)
{
        static szTruncatedWeapon[33], iattacker, ivictim
        
        get_msg_arg_string
(4, szTruncatedWeapon, charsmax(szTruncatedWeapon))
        
        iattacker 
= get_msg_arg_int(1)
        ivictim = get_msg_arg_int(2)
        
        if
(!is_user_connected(iattacker) || iattacker == ivictim)
                return PLUGIN_CONTINUE

        if 
(!zp_get_user_zombie(iattacker))
        {
                if(equal(szTruncatedWeapon, "knife") && get_user_weapon(iattacker) == CSW_KNIFE)
                {
                        if(g_has_axe[iattacker])
                                set_msg_arg_string(4, "axe")
                }
        
                if
(equal(szTruncatedWeapon, "knife") && get_user_weapon(iattacker) == CSW_KNIFE)
                {
                        if(g_has_strong[iattacker])
                                set_msg_arg_string(4, "hatchet")
                }
        
                if
(equal(szTruncatedWeapon, "knife") && get_user_weapon(iattacker) == CSW_KNIFE)
                {
                        if(g_has_combat[iattacker])
                                set_msg_arg_string(4, "mastercombat")
                }
        
                if
(equal(szTruncatedWeapon, "knife") && get_user_weapon(iattacker) == CSW_KNIFE)
                {
                        if(g_has_hammer[iattacker])
                                set_msg_arg_string(4, "hammer")
                }
                
                if
(equal(szTruncatedWeapon, "knife") && get_user_weapon(iattacker) == CSW_KNIFE)
                {
                        if(g_has_hammer[iattacker])
                                set_msg_arg_string(4, "mumiy")
                }
                
                if
(equal(szTruncatedWeapon, "knife") && get_user_weapon(iattacker) == CSW_KNIFE)
                {
                        if(g_has_survivoraxe[iattacker])
                                set_msg_arg_string(4, "survivoraxe")
                }
        
                if
(equal(szTruncatedWeapon, "knife") && get_user_weapon(iattacker) == CSW_KNIFE)
                {
                        if(!g_has_axe[iattacker] && !g_has_strong[iattacker] && !g_has_combat[iattacker] && !g_has_hammer[iattacker] && !g_has_mumiy[iattacker] && !g_has_survivoraxe[iattacker] && !zp_get_user_zombie(iattacker))
                                set_msg_arg_string(4, "knife")
                }
        }
        if (zp_get_user_zombie(iattacker))
        {
                if(equal(szTruncatedWeapon, "knife") && get_user_weapon(iattacker) == CSW_KNIFE)
                {
                        if(g_has_axe[iattacker] || g_has_strong[iattacker] || g_has_combat[iattacker] || g_has_hammer[iattacker] || g_has_mumiy[iattacker] || g_has_survivoraxe[iattacker])
                                set_msg_arg_string(4, "Claws")
                }
        }
        return PLUGIN_CONTINUE
}

stock fm_set_user_health( index, health ) 
health 
> 0 ? set_pev(index, pev_health, float(health)) : dllfunc(DLLFunc_ClientKill, index)

stock create_velocity_vector(victim,attacker,Float:velocity[3])
{
        if(!zp_get_user_zombie(victim) || !is_user_alive(attacker))
                return 0;

        new Float:vicorigin[3];
        new Float:attorigin[3];
        pev(victim, pev_origin , vicorigin);
        pev(attacker, pev_origin , attorigin);

        new Float:origin2[3]
        origin2[0] = vicorigin[0] - attorigin[0];
        origin2[1] = vicorigin[1] - attorigin[1];

        new Float:largestnum = 0.0;

        if(floatabs(origin2[0])>largestnum) largestnum = floatabs(origin2[0]);
        if(floatabs(origin2[1])>largestnum) largestnum = floatabs(origin2[1]);

        origin2[0] /= largestnum;
        origin2[1] /= largestnum;
        
        if 
(g_has_axe[attacker])
        {
                velocity[0] = ( origin2[0] * get_pcvar_float(cvar_knock_axe) * 10000 ) / floatround(get_distance_f(vicorigin, attorigin));
                velocity[1] = ( origin2[1] * get_pcvar_float(cvar_knock_axe) * 10000 ) / floatround(get_distance_f(vicorigin, attorigin));
        }
        else if (g_has_strong[attacker])
        {
                velocity[0] = ( origin2[0] * get_pcvar_float(cvar_knock_strong) * 10000 ) / floatround(get_distance_f(vicorigin, attorigin));
                velocity[1] = ( origin2[1] * get_pcvar_float(cvar_knock_strong) * 10000 ) / floatround(get_distance_f(vicorigin, attorigin));
        }
        else if (g_has_combat[attacker])
        {
                velocity[0] = ( origin2[0] * get_pcvar_float(cvar_knock_combat) * 10000 ) / floatround(get_distance_f(vicorigin, attorigin));
                velocity[1] = ( origin2[1] * get_pcvar_float(cvar_knock_combat) * 10000 ) / floatround(get_distance_f(vicorigin, attorigin));
        }
        else if (g_has_hammer[attacker])
        {
                velocity[0] = ( origin2[0] * get_pcvar_float(cvar_knock_hammer) * 10000 ) / floatround(get_distance_f(vicorigin, attorigin));
                velocity[1] = ( origin2[1] * get_pcvar_float(cvar_knock_hammer) * 10000 ) / floatround(get_distance_f(vicorigin, attorigin));
        }
        else if (g_has_mumiy[attacker])
        {
                velocity[0] = ( origin2[0] * get_pcvar_float(cvar_knock_mumiy) * 10000 ) / floatround(get_distance_f(vicorigin, attorigin));
                velocity[1] = ( origin2[1] * get_pcvar_float(cvar_knock_mumiy) * 10000 ) / floatround(get_distance_f(vicorigin, attorigin));
        }
        else if(g_has_survivoraxe[attacker])
        {
                velocity[0] = ( origin2[0] * get_pcvar_float(cvar_knock_surv) * 10000 ) / floatround(get_distance_f(vicorigin, attorigin));
                velocity[1] = ( origin2[1] * get_pcvar_float(cvar_knock_surv) * 10000 ) / floatround(get_distance_f(vicorigin, attorigin));
        }
 
        if
(velocity[0] <= 20.0 || velocity[1] <= 20.0)
        velocity[2] = random_float(200.0 , 275.0);

        return 1;
}

public zp_user_humanized_post(id,survivor)
{
        if(!zp_get_user_survivor(id))
        {
                if(g_has_survivoraxe[id])
                {
                        g_has_axe[id] = true
                        g_has_strong
[id] = false
                        g_has_combat
[id] = false
                        g_has_hammer
[id] = false
                        g_has_mumiy
[id] = false
                        g_has_survivoraxe
[id] = false
                        
//set_sprite(id)
                }
        }
        else if(zp_get_user_survivor(id)) 
        
{    
                g_has_axe
[id] = false
                g_has_strong
[id] = false
                g_has_combat
[id] = false
                g_has_hammer
[id] = false
                g_has_mumiy
[id] = false
                g_has_survivoraxe
[id] = true
                
//set_sprite(id)
        }
}

stock fm_set_user_maxspeed(index, Float:speed = -1.0) 
{
        engfunc(EngFunc_SetClientMaxspeed, index, speed);
        set_pev(index, pev_maxspeed, speed);

        return 1;
}
       

more_blood
(id)
{
        static iOrigin[3]
        get_user_origin(id, iOrigin)
        
        message_begin
(MSG_PVS, SVC_TEMPENTITY, iOrigin)
        write_byte(TE_BLOODSTREAM)
        write_coord(iOrigin[0])
        write_coord(iOrigin[1])
        write_coord(iOrigin[2]+10)
        write_coord(random_num(-360, 360))
        write_coord(random_num(-360, 360))
        write_coord(-10)
        write_byte(70)
        write_byte(random_num(50, 100))
        message_end()

        for (new j = 0; j < 4; j++) 
        
{
                message_begin(MSG_PVS, SVC_TEMPENTITY, iOrigin)
                write_byte(TE_WORLDDECAL)
                write_coord(iOrigin[0]+random_num(-100, 100))
                write_coord(iOrigin[1]+random_num(-100, 100))
                write_coord(iOrigin[2]-36)
                write_byte(random_num(190, 197))
                message_end()
        }
}

public sprite(const player, const string_msg[], byte_1, byte_2, byte_3, byte_4, byte_5, byte_6, byte_7, byte_8)
{
    message_begin( MSG_ONE, get_user_msgid("WeaponList"), .player = player );
    {
        write_string(string_msg);
        write_byte(byte_1);
        write_byte(byte_2);
        write_byte(byte_3);
        write_byte(byte_4);
        write_byte(byte_5);
        write_byte(byte_6);
        write_byte(byte_7);
        write_byte(byte_8);
    }
    message_end();
}

/*public set_sprite(id)
{
        if(!is_user_alive(id))
        {
                return;
        }
                
        if(zp_get_user_zombie(id))
        {
                sprite(id, "weapon_knife", -1, -1, -1, -1, 2, 1, 29, 0)
                return;
    }

        if(g_has_axe[id])
        {
                sprite(id, "zm_knife_axe", -1, -1, -1, -1, 2, 1, 29, 0)
                return;
        }
        
        if(g_has_strong[id])
        {
                sprite(id, "zm_knife_strong", -1, -1, -1, -1, 2, 1, 29, 0)
                return;
        }
        
        if(g_has_combat[id])
        {
                sprite(id, "zm_knife_combat", -1, -1, -1, -1, 2, 1, 29, 0)
                return;
        }
         
        if(g_has_hammer[id])
        {
                sprite(id, "zm_knife_hammer", -1, -1, -1, -1, 2, 1, 29, 0)
                return;
        }
        
        if(g_has_mumiy[id])
        {
                sprite(id, "zm_knife_mumiy", -1, -1, -1, -1, 2, 1, 29, 0)
                return;
        }
        
        if(g_has_survivoraxe[id])
        {
                sprite(id, "zm_knife_axe", -1, -1, -1, -1, 2, 1, 29, 0)
        return;
    }
}*/

stock ChatColor(const id, const input[], any:...)
{
    new count = 1, players[32]
    static msg[191]
    vformat(msg, 190, input, 3)
    
    replace_all
(msg, 190, "!g", "^4")
    replace_all(msg, 190, "!y", "^1")
    replace_all(msg, 190, "!team", "^3")
    
    if 
(id) players[0] = id; else get_players(players, count, "ch")
    {
        for (new i = 0; i < count; i++)
        {
            if (is_user_connected(players[i]))
            {
                message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i]);
                write_byte(players[i]);
                write_string(msg);
                message_end();
            }
        }
    }
}

Код: Выделить всё
#include <amxmodx>
#include <fakemeta>
#include <fakemeta_util>
#include <hamsandwich>
#include <zombieplague>

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

#pragma ctrlchar                 '\'
#pragma compress                 1

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

#define WEAPON_MODEL_VIEW            "models/v_thanatos9_fix.mdl"
#define WEAPON_MODEL_PLAYER            "models/p_th9Pack.mdl"

#define WEAPON_DAMAGE                random_float(100.0, 150.0)
#define WEAPON_DAMAGE_MODE            random_float(100.0, 130.0)

#define WEAPON_DISTANCE_ATTACK            90.0
#define WEAPON_DISTANCE_ATTACK_MODE        85.0

#define WEAPON_KNOCKBACK            2.0

#define SOUND_DRAW                 "weapons/thanatos9_drawa.wav"
#define SOUND_SHOOT                "weapons/thanatos9_shootb_loop.wav"
#define SOUND_SLASH                 "weapons/thanatos9_shoota1.wav"
#define SOUND_SLASH2                 "weapons/thanatos9_shoota2.wav"
#define SOUND_HIT                 "weapons/katana_hit1.wav"
#define SOUND_HIT_WALL                "weapons/strong_knife_hitwall.wav"
#define SOUND_HIT_WALL2                "weapons/tomahawk_wall.wav"

#define WEAPON_HUD_TXT                "sprites/weapon_thanatos9.txt"

#define WEAPON_HUD_SPR1                "sprites/640hud79.spr"
#define WEAPON_HUD_SPR2                "sprites/640hud7.spr"

#define ANIM_EXTENSION                "knife"

enum
{    
    ANIM_DRAW_A
,
    
    ANIM_SHOOT_B_LOOP
,
    ANIM_SHOOT_B_START,
    ANIM_SHOOT_B_END,
    
    ANIM_IDLE_B
,
    ANIM_IDLE_A,
    
    ANIM_DRAW_B
,
    
    ANIM_SLASH_A
,
    ANIM_SLASH_A2,
    
    ANIM_CHANGE_B
,
    ANIM_CHANGE_A    
};

//**********************************************
//* 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 GET_STATE(%0)            get_pdata_int(%0, m_fWeaponState, extra_offset_weapon)
#define SET_STATE(%0,%1)        set_pdata_int(%0, m_fWeaponState, %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)

#define THINK_ATTACK            2151636

#define set_time(%0,%1,%2)            \
                        \
    remove_task(%0+THINK_ATTACK);         \
    set_task(%2,%1,%0+THINK_ATTACK)
    
new IsKnife
[33];
new iBlood[2];

enum
{
    STATE_NONE = 0,
    STATE_MODE = 1
}

Weapon_OnPrecache()
{
    PRECACHE_SOUNDS_FROM_MODEL(WEAPON_MODEL_VIEW);
    PRECACHE_MODEL(WEAPON_MODEL_VIEW);
    PRECACHE_MODEL(WEAPON_MODEL_PLAYER);

    PRECACHE_SOUND(SOUND_DRAW);
    PRECACHE_SOUND(SOUND_SHOOT);
    PRECACHE_SOUND(SOUND_SLASH);
    PRECACHE_SOUND(SOUND_SLASH2);
    PRECACHE_SOUND(SOUND_HIT);
    PRECACHE_SOUND(SOUND_HIT_WALL);
    PRECACHE_SOUND(SOUND_HIT_WALL2);
    
    PRECACHE_GENERIC
(WEAPON_HUD_TXT);
    PRECACHE_GENERIC(WEAPON_HUD_SPR1);
    PRECACHE_GENERIC(WEAPON_HUD_SPR2);
    
    iBlood
[0] = PRECACHE_MODEL("sprites/bloodspray.spr");
    iBlood[1] = PRECACHE_MODEL("sprites/blood.spr");
}

Weapon_OnDeploy(const iItem, const iPlayer)
{
    #pragma unused iItem, iPlayer
    
    remove_task
(iPlayer+THINK_ATTACK);
        
    Weapon_DefaultDeploy
(iPlayer, WEAPON_MODEL_VIEW, WEAPON_MODEL_PLAYER, GET_STATE(iItem) ? ANIM_DRAW_B:ANIM_DRAW_A, ANIM_EXTENSION);
            
    engfunc
(EngFunc_EmitSound, iPlayer, CHAN_WEAPON, SOUND_DRAW, 1.0, ATTN_NORM, 0, PITCH_NORM);
    
    set_pdata_float
(iItem, m_flTimeWeaponIdle, 2.0, extra_offset_weapon);
    set_pdata_float(iPlayer, m_flNextAttack, 1.0, extra_offset_player);
    
    Weapon_ShowSprite
(iPlayer);
}

Weapon_OnHolster(const iItem, const iPlayer)
{
    #pragma unused iItem, iPlayer
    
    remove_task
(iPlayer+THINK_ATTACK);
    
    set_pev
(iItem, pev_iuser1, 0);
    set_pev(iItem, pev_iuser2, 0);
    set_pev(iItem, pev_fuser1, 0.0);
}

Weapon_OnIdle(const iItem, const iPlayer)
{
    #pragma unused iItem, iPlayer
    
    static iState
;pev(iItem, pev_iuser1, iState);
    static iState2;pev(iItem, pev_iuser2, iState2);
    
    static Float
:iTime;pev(iItem, pev_fuser1, iTime);
    
    if 
(iState2 && get_pdata_float(iItem, m_flNextPrimaryAttack, extra_offset_weapon) <= 0.0)
    {
        Weapon_SendAnim(iPlayer, ANIM_CHANGE_A);
        
        set_pdata_float
(iItem, m_flTimeWeaponIdle, 3.5, extra_offset_weapon);
        set_pdata_float(iItem, m_flNextPrimaryAttack, 3.5, extra_offset_weapon);
        set_pdata_float(iItem, m_flNextSecondaryAttack, 3.5, extra_offset_weapon);
        
        set_pev
(iItem, pev_iuser1, 0);
        set_pev(iItem, pev_iuser2, 0);
        
        SET_STATE
(iItem, STATE_NONE);
    }
    
    ExecuteHamB
(Ham_Weapon_ResetEmptySound, iItem);

    if (get_pdata_int(iItem, m_flTimeWeaponIdle, extra_offset_weapon) > 0.0)
    {
        return;
    }
    
    switch 
(GET_STATE(iItem))
    {
        case STATE_NONE:
        {
            Weapon_SendAnim(iPlayer, ANIM_IDLE_A);    
            set_pdata_float
(iItem, m_flTimeWeaponIdle, 10.0, extra_offset_weapon);
        }
        case STATE_MODE:
        {
            Weapon_SendAnim(iPlayer, ANIM_IDLE_B);    
            set_pdata_float
(iItem, m_flTimeWeaponIdle, 10.0, extra_offset_weapon);
        }
    }
}

Weapon_OnPrimaryAttack(const iItem, const iPlayer)
{
    #pragma unused iItem, iPlayer
    
    switch 
(GET_STATE(iItem))
    {
        case STATE_NONE:
        {
            static szAnimation[64];

            formatex(szAnimation, charsmax(szAnimation), "ref_shoot_%s", ANIM_EXTENSION);
            
            switch 
(GET_SHOOTS(iItem))
            {
                case 0:
                {
                    Weapon_SendAnim(iPlayer, ANIM_SLASH_A);
                    
                    set_pdata_float
(iItem, m_flTimeWeaponIdle, 2.5, extra_offset_weapon);
                    set_pdata_float(iItem, m_flNextPrimaryAttack, 2.0, extra_offset_weapon);
                    set_pdata_float(iItem, m_flNextSecondaryAttack, 2.0, extra_offset_weapon);
                    
                    engfunc
(EngFunc_EmitSound, iPlayer, CHAN_WEAPON, SOUND_SLASH, 1.0, ATTN_NORM, 0, PITCH_NORM);
                    
                    set_time
(iPlayer, "WeaponSlash", 0.95);
                    
                    SET_SHOOTS
(iItem, 1);
                }
                case 1:
                {
                    Weapon_SendAnim(iPlayer, ANIM_SLASH_A2);
                    
                    set_pdata_float
(iItem, m_flTimeWeaponIdle, 2.5, extra_offset_weapon);
                    set_pdata_float(iItem, m_flNextPrimaryAttack, 2.0, extra_offset_weapon);
                    set_pdata_float(iItem, m_flNextSecondaryAttack, 2.0, extra_offset_weapon);
                    
                    engfunc
(EngFunc_EmitSound, iPlayer, CHAN_WEAPON, SOUND_SLASH2, 1.0, ATTN_NORM, 0, PITCH_NORM);
                    
                    set_time
(iPlayer, "WeaponSlash", 0.95);
                    
                    SET_SHOOTS
(iItem, 0);
                }
            }
            Player_SetAnimation(iPlayer, szAnimation);
        }
        case STATE_MODE:
        {
            if (pev(iItem, pev_iuser1) || pev(iItem, pev_iuser2))
            {
                return;
            }
            
            Weapon_SendAnim
(iPlayer, ANIM_SHOOT_B_START);
            
            set_pdata_float
(iItem, m_flTimeWeaponIdle, 0.5, extra_offset_weapon);
            set_pdata_float(iItem, m_flNextPrimaryAttack, 0.5, extra_offset_weapon);
            set_pdata_float(iItem, m_flNextSecondaryAttack, 0.5, extra_offset_weapon);
            
            set_pev
(iItem, pev_iuser1, 1);
            
            set_pev
(iItem, pev_fuser1, get_gametime() + 6.0);
        }
    }
}

public Weapon_OnSecondaryAttack(const iItem, const iPlayer)
{
    #pragma unused iItem, iPlayer
    
    Weapon_SendAnim
(iPlayer,  GET_STATE(iItem) ? ANIM_CHANGE_A:ANIM_CHANGE_B)

    SET_STATE(iItem, GET_STATE(iItem) == STATE_NONE ? STATE_MODE:STATE_NONE);
            
    set_pdata_float
(iItem, m_flTimeWeaponIdle, !GET_STATE(iItem) ? 3.5:4.5, extra_offset_weapon);
    set_pdata_float(iItem, m_flNextPrimaryAttack, !GET_STATE(iItem) ? 3.5:4.5, extra_offset_weapon);
    set_pdata_float(iItem, m_flNextSecondaryAttack, !GET_STATE(iItem) ? 3.5:4.5, extra_offset_weapon);
}

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

public plugin_precache()
{
    Weapon_OnPrecache();
    register_clcmd(WEAPON_NAME, "Cmd_WeaponSelect");
    //register_message(get_user_msgid("DeathMsg"), "MsgHook_Death");
}

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_Item_Holster,            WEAPON_REFERANCE,     "HamHook_Item_Holster",            false);
    
    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_Item_PostFrame,            WEAPON_REFERANCE,     "HamHook_Item_PostFrame",        false);
    
    RegisterHam
(Ham_Spawn,                 "player",        "HamHook_Player_Spawn",          true);
    RegisterHam(Ham_Killed,             "player",         "HamHook_Player_Killed",         false);

    register_forward(FM_UpdateClientData,                    "FakeMeta_UpdateClientData_Post",     true);
    register_forward(FM_ClientCommand ,                     "FakeMeta_ClientCommand",        false)
    
    register_clcmd
("Th9", "native_set_user_thanatos");
    register_clcmd("Th9D", "native_delete_user_thanatos");
    
}

public plugin_natives()
{
 
    register_native
("SetUserTh9", "native_set_user_thanatos", true);
    register_native("DelUserTh9", "native_delete_user_thanatos", true) ;
}

public native_set_user_thanatos(iPlayer)
{
    IsKnife[iPlayer] = true;
    Weapon_Select(iPlayer);
}

public native_delete_user_thanatos(iPlayer)
{
    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
(zp_get_user_zombie(iPlayer) || !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
;
}

public FakeMeta_ClientCommand(iPlayer)
{
    if (!is_user_alive(iPlayer))
    {
        return FMRES_IGNORED;
    }
    
    static cCmd
[32];read_argv(0, cCmd, 31);
    static iItem;iItem = get_pdata_cbase(iPlayer, m_pActiveItem, extra_offset_player);
    
    if 
(!IsValidPev(iItem) || get_user_weapon(iPlayer) != CSW_KNIFE)
    {
        return FMRES_IGNORED;
    }
    
    if 
(!pev(iItem, pev_iuser1))
    {
        return FMRES_IGNORED;
    }

    if (equal(cCmd,"weapon_", 7) || equal(cCmd,"lastinv"))
    {
        return FMRES_SUPERCEDE;
    }

    return FMRES_IGNORED;
}

//**********************************************
//* Item (weapon) hooks.                       *
//**********************************************
    #define _call.%0(%1,%2) \
                                \
    Weapon_On%0                        \
    (                            \
        %1,                         \
        %2                        \
    ) 
    
public HamHook_Item_AddToPlayer
(const iItem, const iPlayer)Weapon_ShowSprite(iPlayer)

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_Holster(const iItem)
{
    new iPlayer; 
    
    if 
(!CheckItem(iItem, iPlayer))
    {
        return HAM_IGNORED;
    }
    
    set_pev
(iPlayer, pev_viewmodel, 0);
    set_pev(iPlayer, pev_weaponmodel, 0);
    
    _call
.Holster(iItem, iPlayer);
    return HAM_SUPERCEDE;
}

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_Item_PostFrame(const iItem)
{
    static iPlayer;

    if (!CheckItem(iItem, iPlayer))
    {
        return HAM_IGNORED;
    }
    
    static Float
:iTime;pev(iItem, pev_fuser1, iTime);
    static iState;pev(iItem, pev_iuser1, iState);
    static iState2;pev(iItem, pev_iuser2, iState2);
    
    if 
(iState && !iState2 && get_pdata_float(iItem, m_flNextPrimaryAttack, extra_offset_weapon) <= 0.0 && iTime <= get_gametime())
    {
        Weapon_SendAnim(iPlayer, ANIM_SHOOT_B_END);
        
        set_pdata_float
(iItem, m_flTimeWeaponIdle, 0.5, extra_offset_weapon);
        set_pdata_float(iItem, m_flNextPrimaryAttack, 0.5, extra_offset_weapon);
        set_pdata_float(iItem, m_flNextSecondaryAttack, 0.5, extra_offset_weapon);
        
        
//set_pev(iItem, pev_iuser1, 0);
        set_pev(iItem, pev_iuser2, 1);
        
        engfunc
(EngFunc_EmitSound, iPlayer, CHAN_WEAPON, SOUND_SHOOT, 0.0, 0.0, SND_STOP, PITCH_NORM);
    }
    
    if 
(iState && !iState2 && get_pdata_float(iItem, m_flNextPrimaryAttack, extra_offset_weapon) <= 0.0)
    {
        Weapon_SendAnim(iPlayer, ANIM_SHOOT_B_LOOP);
        
        set_pdata_float
(iItem, m_flTimeWeaponIdle, 1.0, extra_offset_weapon);
        set_pdata_float(iPlayer, m_flNextAttack, 0.16, extra_offset_player);
        set_pdata_float(iItem, m_flNextSecondaryAttack, 0.16, extra_offset_weapon);
        
        PrimarySlash_Attack
(iPlayer, iItem, .bStab = true);
        
        engfunc
(EngFunc_EmitSound, iPlayer, CHAN_WEAPON, SOUND_SHOOT, 0.8, ATTN_NORM, 0, PITCH_NORM);
    }
        
    return HAM_IGNORED
;
}

public HamHook_Player_Spawn(iPlayer)
{
    if(is_user_alive(iPlayer))
    {
        if (IsKnife[iPlayer])
        {
            Weapon_Select(iPlayer);
        }
    }
}

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

//**********************************************
//* Doing some weapon stuff.                   *
//**********************************************

public WeaponSlash(iPlayer)
{
    iPlayer -= THINK_ATTACK;
    
    new iItem
;
    
    if 
(!CheckItem2(iPlayer, iItem))
    {
        return;
    }

    new Float:flRightBase = -10.0;
    
    for 
(new i = 0; i < 10; i++)
    {
        PrimarySlash_Attack(iPlayer, iItem, .flRightScale = flRightBase += 10.0);
    }
}

//**********************************************
//* Attack function.                           *
//**********************************************

PrimarySlash_Attack(const iPlayer, const iItem, const Float: flRightScale = 1.0, const Float: flUpScale = 1.0, const bool: bStab = false)
{
    new Float: Origin[3]; 
    new Float
: vecEnd[3];
    new Float: vecScr[3]; 
    
    new Float
: flFraction; 
    
    new iTrace
;
    new iVictim;
    
    SET_SHOOTS
(iItem, GET_SHOOTS(iItem) == 1 ? 0:1);

    Weapon_GetGunPosition(iPlayer, Origin, vecScr, 0.0, flRightScale, flUpScale);
    
    angle_vector
(vecScr, ANGLEVECTOR_FORWARD, vecScr);

    xs_vec_mul_scalar(vecScr, (bStab ? WEAPON_DISTANCE_ATTACK_MODE : 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 
(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_MODE:WEAPON_DAMAGE)
        
        if
(iVictim > 0 && pev(iVictim, pev_takedamage) != DAMAGE_NO && pev(iVictim, pev_solid) != SOLID_NOT)
        {    
            if
(ExecuteHamB(Ham_IsPlayer, iVictim))
            {
                emit_sound(iPlayer, CHAN_ITEM, SOUND_HIT, 1.0, ATTN_NORM, 0, PITCH_NORM);
                
                if
(!zp_get_user_zombie(iVictim))
                {
                    return;
                }
                
                new Float
:vecViewAngle[3]; pev(iPlayer, pev_v_angle, vecViewAngle);
                new Float:vecForward[3]; angle_vector(vecViewAngle, ANGLEVECTOR_FORWARD, vecForward);
    
                FakeKnockBack
(iVictim, vecForward, WEAPON_KNOCKBACK);
                
                get_tr2
(iTrace, TR_vecEndPos, vecEnd);
                Create_Blood(vecEnd, iBlood[0], iBlood[1], 76, 10);
                
                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
        
{
            emit_sound(iPlayer, CHAN_ITEM, bStab ? SOUND_HIT_WALL2:SOUND_HIT_WALL, 1.0, ATTN_NORM, 0, PITCH_NORM);
        }
    }

    free_tr2(iTrace);
}

public FakeKnockBack(iPlayer, Float: vecDirection[3], Float:flKnockBack)
{
    set_pdata_float(iPlayer, 108, 1.0, 5);
    
    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);
    
    return 1
;
}

//**********************************************
//* 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) || zp_get_user_zombie(iPlayer) || !IsKnife[iPlayer])
    {
        return false;
    }
    
    return true
;
}

bool: CheckItem2(const iPlayer, &iItem)
{
    if (!BitCheck(g_bitIsConnected, iPlayer) || !IsValidPev(iPlayer) || zp_get_user_zombie(iPlayer) || get_user_weapon(iPlayer) != CSW_KNIFE)
    {
        return false;
    }
    
    iItem 
= get_pdata_cbase(iPlayer, m_pActiveItem, extra_offset_player);
    
    if 
(!IsValidPev(iItem))
    {
        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 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 MsgHook_Death(const iMsgID, const iMsgDest, const iMsgEntity)
{
    static szWeapon[64];get_msg_arg_string(4, szWeapon, charsmax(szWeapon));
    
    static iPlayer
;
    static iItem; 
    
    if 
(strcmp(szWeapon, "knife"))
    {
        return PLUGIN_CONTINUE;
    }
    
    iPlayer 
= get_msg_arg_int(1);
    
    iItem 
= get_pdata_cbase(iPlayer, m_pActiveItem, extra_offset_player);
    
    if 
(!IsValidPev(iItem) || !IsKnife[iPlayer])
    {    
        return PLUGIN_CONTINUE
;
    }

    set_msg_arg_string(4, "hammer");
    
    return PLUGIN_CONTINUE
}

public zp_user_infected_post(iPlayer) 
{
    remove_task(iPlayer+THINK_ATTACK);
    
    IsKnife
[iPlayer] = false;
    Weapon_ShowSprite(iPlayer);
}

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();
    
    Weapon_ShowSprite
(iPlayer);
    
    new iItem 
= get_pdata_cbase(iPlayer, m_pActiveItem, extra_offset_player);

    if (pev_valid(iItem))
    {
        ExecuteHamB(Ham_Item_Deploy, iItem);
    }
}

public Weapon_ShowSprite(const iPlayer)
{
 
    message_begin
(MSG_ONE_UNRELIABLE, get_user_msgid("WeaponList"), _, iPlayer);
    WRITE_STRING(IsKnife[iPlayer] ? WEAPON_NAME: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();
}

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);
}

P.S: не обращайте внимание на табуляцию ;)
Аватара пользователя
Максим_SerJanT
 
Сообщения: 75
Зарегистрирован: 16 авг 2017, 01:32
Благодарил (а): 7 раз.
Поблагодарили: 1 раз.

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

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

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