PHP Code:
#include < amxmodx >
#include < amxmisc >
#include < fakemeta >
#include < hamsandwich >
#include < zombieplague >
#include < zmvip >
#include < Licence >
#define PLUGIN "[ZP] Knife Mod"
#define VERSION "1.0"
const m_pPlayer = 41;
const XO_WEAPON = 4;
new const MeleeLocationModels[ ] = "ZmLand"
new const MeleeLocationSounds[ ] = "ZmLand"
new const Melee_Names[][] =
{
"Nata Knife",
"Katana",
"Dragon Claws",
"Hammer \r(Vip Only)"
}
new const Melee_Models[][] =
{
"strong",
"katana",
"dragontail",
"hammer"
}
new const Float:Melee_KnockBack[] =
{
150.0,
200.0,
300.0,
500.0
}
new const Float:Melee_Damage[] =
{
1.0,
1.0,
2.0,
3.0
}
new const Melee_OnlyVip[] =
{
0,
0,
0,
1
}
new g_iKnife[ 33 ];
new Array:a_Melee_ModelV, Array:a_Melee_ModelP, Array:a_Melee_SoundMiss, Array:a_Melee_SoundHWall, Array:a_Melee_SoundHit,
Array:a_Melee_SoundStab, Array:a_Melee_SoundDraw;
public plugin_precache( )
{
a_Melee_ModelV = ArrayCreate( 64, 1 );
a_Melee_ModelP = ArrayCreate( 64, 1 );
a_Melee_SoundMiss = ArrayCreate( 64, 1 );
a_Melee_SoundHWall = ArrayCreate( 64, 1 );
a_Melee_SoundHit = ArrayCreate( 64, 1 );
a_Melee_SoundStab = ArrayCreate( 64, 1 );
a_Melee_SoundDraw = ArrayCreate( 64, 1 );
new buffer[64], i;
for( i = 0; i < sizeof ( Melee_Models ); i ++ )
{
formatex( buffer, charsmax( buffer ), "models/%s/v_%s.mdl", MeleeLocationModels, Melee_Models[ i ] );
precache_model( buffer );
ArrayPushString( a_Melee_ModelV, buffer )
formatex( buffer, charsmax( buffer ), "models/%s/p_%s.mdl", MeleeLocationModels, Melee_Models[ i ] );
precache_model( buffer );
ArrayPushString( a_Melee_ModelP, buffer )
formatex( buffer, charsmax( buffer ), "%s/%s_miss.wav", MeleeLocationSounds, Melee_Models[ i ] )
precache_sound( buffer )
ArrayPushString( a_Melee_SoundMiss, buffer )
formatex( buffer, charsmax( buffer ), "%s/%s_hitwall.wav", MeleeLocationSounds, Melee_Models[ i ] )
precache_sound( buffer )
ArrayPushString( a_Melee_SoundHWall, buffer )
formatex( buffer, charsmax( buffer ), "%s/%s_hit1.wav", MeleeLocationSounds, Melee_Models[ i ] )
precache_sound( buffer )
ArrayPushString( a_Melee_SoundHit, buffer )
formatex( buffer, charsmax( buffer ), "%s/%s_stab.wav", MeleeLocationSounds, Melee_Models[ i ] )
precache_sound( buffer )
ArrayPushString( a_Melee_SoundStab, buffer )
formatex( buffer, charsmax( buffer ), "%s/%s_deploy.wav", MeleeLocationSounds, Melee_Models[ i ] )
precache_sound( buffer )
ArrayPushString( a_Melee_SoundDraw, buffer )
}
}
public plugin_init( )
{
Licence( );
register_plugin( PLUGIN, VERSION, "Cristi. C" );
RegisterHam( Ham_Item_Deploy, "weapon_knife", "fw_Knife_Deploy", 1 );
RegisterHam( Ham_TakeDamage, "player", "fw_TakeDamage" );
RegisterHam( Ham_TraceAttack, "player", "fw_TraceAttack", 1 );
register_forward( FM_EmitSound, "fw_EmitSound" );
register_clcmd( "say /knife", "clcmd_knife" );
register_clcmd( "knife_menu", "clcmd_knife" );
}
public client_putinserver( id )
{
g_iKnife[ id ] = 0;
}
public fw_Knife_Deploy( const knife )
{
if( pev_valid( knife ) != 2 )
{
return;
}
new id = get_pdata_cbase( knife, m_pPlayer, XO_WEAPON );
if( !is_user_alive( id ) || zp_get_user_zombie( id ) )
{
return;
}
new __knife;
if( ( __knife = g_iKnife[ id ] ) != -1 )
{
new szModel[ 33 ];
ArrayGetString( a_Melee_ModelV, __knife, szModel, charsmax(szModel))
set_pev( id, pev_viewmodel2, szModel );
ArrayGetString( a_Melee_ModelP, __knife, szModel, charsmax(szModel))
set_pev( id, pev_weaponmodel2, szModel );
}
}
public fw_TakeDamage( victim, inflictor, attacker, Float:damage, damage_type )
{
if( !is_user_alive( attacker ) || zp_get_user_zombie( attacker ) )
{
return;
}
static __knife;
if( get_user_weapon( attacker ) == CSW_KNIFE && ( __knife = g_iKnife[ attacker ] ) != -1 )
{
SetHamParamFloat( 4, damage * Melee_Damage[ __knife ] );
}
}
// Ham Trace Attack Forward
public fw_TraceAttack( victim, attacker, Float:damage, Float:direction[ 3 ], tracehandle, damage_type )
{
// Non-player damage or self damage
if (victim == attacker || !is_user_alive(attacker) || zp_get_user_zombie( attacker ) )
return;
if( !zp_get_user_zombie( victim ) )
return;
static __knife;
if( get_user_weapon( attacker ) == CSW_KNIFE && ( __knife = g_iKnife[ attacker ] ) != -1 )
{
if( Melee_KnockBack[__knife] <= 0.0 )
return;
// Get victim's velocity
static Float:velocity[ 3 ]
pev(victim, pev_velocity, velocity )
direction[ 0 ] *= Melee_KnockBack[ __knife ];
direction[ 1 ] *= Melee_KnockBack[ __knife ];
direction[ 2 ] *= Melee_KnockBack[ __knife ];
velocity[ 0 ] += direction[ 0 ]
velocity[ 1 ] += direction[ 1 ]
velocity[ 2 ] += direction[ 2 ]
// Set the knockback'd victim's velocity
set_pev( victim, pev_velocity, direction )
}
}
public fw_EmitSound( id, channel, const sample[ ], Float:volume, Float:attn, flags, pitch )
{
if( !is_user_alive( id ) || zp_get_user_zombie( id ) )
{
return FMRES_IGNORED;
}
if ( sample[ 8 ] == 'k' && sample[ 9 ] == 'n' && sample[ 10 ] == 'i' )
{
new __knife, sound[ 64 ];
if( ( __knife = g_iKnife[ id ] ) != -1 )
{
if (sample[ 14 ] == 's' && sample[15] == 'l' && sample[16] == 'a') // slash
{
ArrayGetString( a_Melee_SoundMiss, __knife, sound, charsmax( sound ) )
emit_sound( id, channel, sound, volume, attn, flags, pitch )
return FMRES_SUPERCEDE;
}
if ( sample[ 14 ] == 'h' && sample[ 15 ] == 'i' && sample[ 16 ] == 't' ) // hit
{
if ( sample[ 17 ] == 'w' ) // wall
{
ArrayGetString( a_Melee_SoundHWall, __knife, sound, charsmax( sound ) )
emit_sound( id, channel, sound, volume, attn, flags, pitch )
return FMRES_SUPERCEDE;
}
else
{
ArrayGetString( a_Melee_SoundHit, __knife, sound, charsmax( sound ) )
emit_sound(id, channel, sound, volume, attn, flags, pitch )
return FMRES_SUPERCEDE;
}
}
if ( sample[ 14 ] == 's' && sample[ 15 ] == 't' && sample[ 16 ] == 'a' ) // stab
{
ArrayGetString( a_Melee_SoundStab, __knife, sound, charsmax( sound ) )
emit_sound( id, channel, sound, volume, attn, flags, pitch )
return FMRES_SUPERCEDE;
}
if ( sample[ 14 ] == 'd' && sample[ 15 ] == 'e' && sample[ 16 ] == 'p' ) // deploy
{
ArrayGetString( a_Melee_SoundDraw, __knife, sound, charsmax( sound ) )
emit_sound( id, channel, sound, volume, attn, flags, pitch )
return FMRES_SUPERCEDE;
}
}
}
return FMRES_IGNORED;
}
// Items Menu
show_items_menu( id )
{
static menu[ 128 ];
new menuid, i, itemdata[ 2 ]
menuid = menu_create( "Knife Menu", "menu_knifes" )
for( i = 0; i < sizeof ( Melee_Models ); i ++ )
{
formatex( menu, charsmax( menu ), "%s", Melee_Names[ i ] )
itemdata[ 0 ] = i
itemdata[ 1 ] = 0
menu_additem( menuid, menu, itemdata )
}
// No items to display?
if ( menu_items( menuid ) <= 0 )
{
client_print( id, print_chat, "No knifes available." )
menu_destroy( menuid )
return;
}
// Back - Next - Exit
menu_setprop( menuid, MPROP_BACKNAME, "Back" )
menu_setprop( menuid, MPROP_NEXTNAME, "Next" )
menu_setprop( menuid, MPROP_EXITNAME, "Exit" )
// Fix for AMXX custom menus
set_pdata_int( id, 205, 0 )
menu_display( id, menuid )
}
public menu_knifes( id, menuid, knife )
{
if ( knife == MENU_EXIT )
{
menu_destroy( menuid )
return PLUGIN_HANDLED;
}
new itemdata[ 2 ], dummy, knifeid;
menu_item_getinfo(menuid, knife, dummy, itemdata, charsmax( itemdata ), _, _, dummy )
knifeid = itemdata[ 0 ];
if( Melee_OnlyVip[ knifeid ] != 0 )
{
//if( !( zv_get_user_flags( id ) & ZV_UNLIMITED ) )
if( !( get_user_flags( id ) & ADMIN_LEVEL_H ) )
{
menu_destroy( menuid );
show_items_menu( id )
return PLUGIN_HANDLED;
}
}
g_iKnife[ id ] = knifeid
menu_destroy( menuid )
if( get_user_weapon( id ) == CSW_KNIFE )
{
fw_Knife_Deploy( fm_cs_get_current_weapon_ent( id ) )
}
return PLUGIN_HANDLED;
}
public clcmd_knife( id )
{
show_items_menu( id )
}
fm_cs_get_current_weapon_ent( id )
{
if ( pev_valid( id ) != 2 )
return -1;
return get_pdata_cbase( id, 373 );
}