el problema esta en ...
PHP Code:
#include < amxmodx >
#include < fakemeta >
#include < hamsandwich >
#include < fun >
#include < zombieplague >
//#include < zombie_plague_advance >
#define NO_RECOIL_WEAPONS_BITSUM ( 1<<2 | 1<<CSW_KNIFE | 1<<CSW_HEGRENADE | 1<<CSW_FLASHBANG | 1<<CSW_SMOKEGRENADE | 1<<CSW_C4 )
#define m_flNextPrimaryAttack 46
#define m_flNextSecondaryAttack 47
#define m_flTimeWeaponIdle 48
new const VERSION[ ] = "1.5a"
// This will limit medic class to prevent massive disinfection/healing(Over-powered)
new iMedicLimit
// PCVars
new cvar_recoil[ 31 ], cvar_ROF[ 31 ], cvar_medicamt, cvar_disinfect_mindist, cvar_medic_delay_use, cvar_maxmedic, cvar_dmgmulti, cvar_kbpower[ 31 ],
c_medicamt, c_disinfect_mindist, Float:c_medic_delay_use, c_maxmedic, Float:c_dmgmulti, zp_human_health
// Current Class | Current Weapon | Medical Kit Mode
new g_iCurClass[ 33 ], g_iCurWeapon[ 33 ], g_iCurMode[ 33 ], g_iMedUsable[ 33 ], g_iSaveCurClass[ 33 ]
// Push Angle
new Float:cl_pushangle[ 33 ][ 3 ], Float:g_iLastUsedCmd[ 33 ]
// Models
new const medkit_viewmodel[ ] = "models/v_medkit.mdl"
new const medkit_playermodel[ ] = "models/p_medkit.mdl"
new const default_knifemodel_v[ ] = "models/v_knife.mdl"
new const default_knifemodel_p[ ] = "models/p_knife.mdl"
public plugin_init( )
{
register_plugin( "Zombie Plague Human Class", VERSION, "Excalibur.007" )
new weapon_name[ 20 ], cvar_name1[ 30 ], cvar_name2[ 30 ], cvar_name3[ 30 ]
for( new i = CSW_P228; i <= CSW_P90; i ++ )
{
if( !( NO_RECOIL_WEAPONS_BITSUM & ( 1 << i ) ) && get_weaponname( i, weapon_name, charsmax( weapon_name ) ) )
{
RegisterHam( Ham_Weapon_PrimaryAttack, weapon_name, "fw_Ham_PrimaryAttack" )
RegisterHam( Ham_Weapon_PrimaryAttack, weapon_name, "fw_Ham_PrimaryAttack_Post", 1 )
formatex( cvar_name1, charsmax( cvar_name1 ), "zp_hclass_ROF_%s", weapon_name[ 7 ] )
cvar_ROF[ i ] = register_cvar( cvar_name1, "0.85" )
formatex( cvar_name2, charsmax( cvar_name2 ), "zp_hclass_recoil_%s", weapon_name[ 7 ] )
cvar_recoil[ i ] = register_cvar( cvar_name2, "0.8" )
formatex( cvar_name3, charsmax( cvar_name3 ), "zp_hclass_kbpower_%s", weapon_name[ 7 ] )
cvar_kbpower[ i ] = register_cvar( cvar_name3, "10" )
}
}
// The default of IN_ATTACK2 knife damage + 1(No HS, No leg, No backstab)
cvar_medicamt = register_cvar( "zp_hclass_heal_amt", "66" )
cvar_disinfect_mindist = register_cvar( "zp_hclass_disinfect_mindist", "300" )
cvar_medic_delay_use = register_cvar( "zp_hclass_medic_cmd_delay", "0.5" )
cvar_maxmedic = register_cvar( "zp_hclass_max_medic", "3" )
cvar_dmgmulti = register_cvar( "zp_hclass_dmg_multi", "1.1" )
register_clcmd( "say /hclass", "HumanClassMenu" )
register_clcmd( "say_team /hclass", "HumanClassMenu" )
register_clcmd( "say /hclass_reenable", "ResetSaveCurClass" )
register_clcmd( "say_team /hclass_reenable", "ResetSaveCurClass" )
register_event( "CurWeapon", "event_CurWeapon", "be","1=1" )
register_event( "HLTV", "event_new_round", "a", "1=0", "2=0" )
register_forward( FM_CmdStart, "fw_CmdStart" )
RegisterHam( Ham_Spawn, "player", "fw_HamSpawn_Post", 1 )
RegisterHam( Ham_TakeDamage, "player", "fw_TakeDamage_Post", 1 )
zp_human_health = get_cvar_pointer( "zp_human_health" )
}
public plugin_precache( )
{
engfunc( EngFunc_PrecacheModel, medkit_viewmodel )
engfunc( EngFunc_PrecacheModel, medkit_playermodel )
// I precached this because your default knife may be a different model
engfunc( EngFunc_PrecacheModel, default_knifemodel_v )
engfunc( EngFunc_PrecacheModel, default_knifemodel_p )
}
public plugin_cfg( )
{
c_medicamt = get_pcvar_num( cvar_medicamt )
c_disinfect_mindist = get_pcvar_num( cvar_disinfect_mindist )
c_medic_delay_use = get_pcvar_float( cvar_medic_delay_use )
c_maxmedic = get_pcvar_num( cvar_maxmedic )
c_dmgmulti = get_pcvar_float( cvar_dmgmulti )
}
public client_putinserver( id )
{
if( is_user_bot( id ) )
set_task( 0.1, "register_ham_czbots", id )
}
public register_ham_czbots( id )
{
if( !is_user_connected( id ) )
return
RegisterHamFromEntity( Ham_Spawn, id, "fw_HamSpawn_Post", 1 )
RegisterHamFromEntity( Ham_TakeDamage, id, "fw_TakeDamage_Post", 1 )
if( is_user_alive( id ) )
fw_HamSpawn_Post( id )
}
public HumanClassMenu( id )
{
if( zp_get_user_zombie( id ) || g_iSaveCurClass[ id ] != 0 )
{
client_print( id, print_chat, "[ZP] You are a zombie or you've saved your class, type /hclass_reenable, then type /hclass!" )
return PLUGIN_HANDLED
}
new menu = menu_create( "\yChoose your human class:", "menu_handler" )
menu_additem( menu, "\wWeapon Specialist - Faster ROF", "1" )
menu_additem( menu, "\wMedic - Heal/Disinfect", "2" )
menu_additem( menu, "\wMarksman - Lesser recoil", "3" )
menu_additem( menu, "\wImproved Bullet - Damage multiplier", "4" )
menu_additem( menu, "\wHardened Bullet - More knockback", "5" )
menu_additem( menu, "\wSave Current Class", "6" )
menu_setprop( menu, MPROP_EXIT, MEXIT_ALL )
menu_display( id, menu, 0 )
return PLUGIN_HANDLED
}
public menu_handler( id, menu, item )
{
if( item == MENU_EXIT )
{
menu_destroy( menu )
return PLUGIN_HANDLED
}
new data[ 6 ], iName[ 64 ]
new access, callback
menu_item_getinfo( menu, item, access, data,5, iName, 63, callback )
new key = str_to_num( data )
switch( key )
{
case 1:
{
if( zp_get_user_zombie( id ) || !is_user_alive( id ) || g_iCurClass[ id ] != 0 )
{
menu_destroy( menu )
return PLUGIN_HANDLED
}
g_iCurClass[ id ] = 1
client_print( id, print_chat, "[ZP] You've chosen Weapon Specialist." )
}
case 2:
{
if( zp_get_user_zombie( id ) || !is_user_alive( id ) || g_iCurClass[ id ] != 0 )
{
menu_destroy( menu )
return PLUGIN_HANDLED
}
if( iMedicLimit >= c_maxmedic )
{
client_print( id, print_chat, "[ZP] Max amount of medic reached: %i", c_maxmedic )
menu_destroy( menu )
return PLUGIN_HANDLED
}
g_iCurClass[ id ] = 2
g_iMedUsable[ id ] = 1
g_iCurMode[ id ] = 1
client_print( id, print_chat, "[ZP] You've chosen Medic." )
iMedicLimit ++
}
case 3:
{
if( zp_get_user_zombie( id ) || !is_user_alive( id ) || g_iCurClass[ id ] != 0 )
{
menu_destroy( menu )
return PLUGIN_HANDLED
}
g_iCurClass[ id ] = 3
client_print( id, print_chat, "[ZP] You've chosen Marksman." )
}
case 4:
{
if( zp_get_user_zombie( id ) || !is_user_alive( id ) || g_iCurClass[ id ] != 0 )
{
menu_destroy( menu )
return PLUGIN_HANDLED
}
g_iCurClass[ id ] = 4
client_print( id, print_chat, "[ZP] You've chosen Improved Bullet." )
}
case 5:
{
if( zp_get_user_zombie( id ) || !is_user_alive( id ) || g_iCurClass[ id ] != 0 )
{
menu_destroy( menu )
return PLUGIN_HANDLED
}
g_iCurClass[ id ] = 5
client_print( id, print_chat, "[ZP] You've chosen Hardened Bullet." )
}
case 6:
{
if( g_iCurClass[ id ] == 0 )
{
client_print( id, print_chat, "[ZP] Please choose a class before using this function!" )
menu_destroy( menu )
return PLUGIN_HANDLED
}
g_iSaveCurClass[ id ] = g_iCurClass[ id ]
}
}
client_print( id, print_chat, "[ZP] Type /hclass_reenable to stop saving current class." )
menu_destroy( menu )
return PLUGIN_HANDLED
}
public ResetSaveCurClass( id )
{
if( !is_user_connected( id ) )
return PLUGIN_HANDLED
g_iSaveCurClass[ id ] = 0
return PLUGIN_HANDLED
}
public event_CurWeapon( id )
{
if( zp_get_user_zombie( id ) )
return PLUGIN_HANDLED
g_iCurWeapon[ id ] = read_data( 2 )
if( !g_iCurWeapon[ id ] || g_iCurWeapon[ id ] == 6 || g_iCurWeapon[ id ] > 30 )
return PLUGIN_HANDLED
if( g_iCurClass[ id ] == 1 )
{
if( g_iCurWeapon[ id ] == CSW_KNIFE )
return PLUGIN_HANDLED
static Float:N_Speed
N_Speed = get_pcvar_float( cvar_ROF[ g_iCurWeapon[ id ] ] )
if( N_Speed < 1.0 )
{
static weapon[ 32 ], ent
get_weaponname( g_iCurWeapon[ id ], weapon, 31 )
ent = fm_find_ent_by_owner( -1, weapon, id )
if( ent )
{
static Float:Delay, Float:M_Delay
Delay = get_pdata_float( ent, 46, 4 ) * N_Speed
M_Delay = get_pdata_float( ent, 47, 4 ) * N_Speed
if( Delay > 0.0 )
{
set_pdata_float( ent, 46, Delay, 4 )
set_pdata_float( ent, 47, M_Delay, 4 )
}
}
}
}
else if( g_iCurClass[ id ] == 2 )
{
if( g_iCurWeapon[ id ] == CSW_KNIFE && g_iMedUsable[ id ] == 1 )
{
set_pev( id, pev_viewmodel2, medkit_viewmodel )
set_pev( id, pev_weaponmodel2, medkit_playermodel )
}
}
else if( g_iCurWeapon[ id ] == CSW_KNIFE && g_iCurClass[ id ] != 2 )
{
set_pev( id, pev_viewmodel2, default_knifemodel_v )
set_pev( id, pev_weaponmodel2, default_knifemodel_p )
}
return PLUGIN_HANDLED
}
public event_new_round( )
{
iMedicLimit = 0
c_medicamt = get_pcvar_num( cvar_medicamt )
c_disinfect_mindist = get_pcvar_num( cvar_disinfect_mindist )
c_medic_delay_use = get_pcvar_float( cvar_medic_delay_use )
c_maxmedic = get_pcvar_num( cvar_maxmedic )
c_dmgmulti = get_pcvar_float( cvar_dmgmulti )
zp_human_health = get_cvar_pointer("zp_human_health")
}
public fw_CmdStart( id, uc_handle, seed )
{
if( !is_user_alive( id ) || zp_get_user_zombie( id ) || zp_get_user_survivor( id ) || get_user_weapon( id ) != CSW_KNIFE || g_iCurClass[ id ] != 2 || g_iMedUsable[ id ] != 1 )
return FMRES_IGNORED
new target, body, dist = 150, target_zm, body_zm
get_user_aiming( id, target, body, dist )
get_user_aiming( id, target_zm, body_zm, c_disinfect_mindist )
static buttons
buttons = get_uc( uc_handle, UC_Buttons )
new sz_Name1[ 32 ], sz_Name2[ 32 ], sz_Name3[ 32 ]
get_user_name( id, sz_Name1, sizeof( sz_Name1 ) - 1 )
get_user_name( target, sz_Name2, sizeof( sz_Name2 ) - 1 )
get_user_name( target_zm, sz_Name3, sizeof( sz_Name3 ) - 1 )
if( get_gametime( ) - g_iLastUsedCmd[ id ] < c_medic_delay_use )
return FMRES_IGNORED
if( ( buttons & IN_ATTACK ) && get_user_health( id ) < zp_human_health )
{
set_user_health( id, get_user_health( id ) + c_medicamt )
g_iMedUsable[ id ] = 0
if( get_user_health( id > zp_human_health ) )
set_user_health( id, 100 )
}
else if( ( buttons & IN_ATTACK2 ) )
{
switch( g_iCurMode[ id ] )
{
case 1:
{
// Disinfect
g_iCurMode[ id ] = 2
client_print( id, print_center, "Medical Kit Mode: Disinfect" )
}
case 2:
{
// Heal
g_iCurMode[ id ] = 1
client_print( id, print_center, "Medical Kit Mode: Heal" )
}
}
}
else if( ( buttons & IN_USE ) )
{
switch( g_iCurMode[ id ] )
{
case 1:
{
if( !zp_get_user_zombie( target ) && is_user_alive( target ) && get_user_health( target ) < zp_human_health )
{
set_user_health( target, get_user_health( target ) + c_medicamt )
client_print( target, print_chat,"[ZP] You've been healed by %s", sz_Name1 )
client_print( id, print_chat, "[ZP] You've healed %s", sz_Name2 )
g_iMedUsable[ id ] = 0
if( get_user_health( target > zp_human_health ) )
set_user_health( target, 100 )
}
}
case 2:
{
new iCountZombie = zp_get_zombie_count( )
if( iCountZombie <= 1 )
{
client_print( id, print_chat, "[ZP] There is only one zombie or no zombie!" )
return FMRES_IGNORED
}
else if( zp_is_swarm_round() || zp_is_lnj_round() || zp_is_plague_round())
{
client_print( id, print_chat, "[ZP] You can't disinfect during Swarm or Plague mode!" )
return FMRES_IGNORED
}
if( zp_get_user_zombie( target_zm ) && is_user_alive( target_zm ) )
{
zp_disinfect_user( target_zm, 1 )
client_print( target_zm, print_chat,"[ZP] You've been disinfected by %s", sz_Name1 )
client_print( id, print_chat, "[ZP] You've disinfected %s", sz_Name3 )
g_iMedUsable[ id ] = 0
}
}
}
}
g_iLastUsedCmd[ id ] = get_gametime( )
return FMRES_IGNORED
}
public fw_HamSpawn_Post( id )
{
if( !is_user_alive( id ) )
return PLUGIN_HANDLED
g_iCurClass[ id ] = g_iSaveCurClass[ id ]
g_iCurMode[ id ] = 0
if( g_iCurClass[ id ] != 0 )
{
client_print( id, print_chat, "[ZP] Type /hclass_reenable to stop saving current class and choose a new one." )
}
else
{
client_print( id, print_chat, "[ZP] Type /hclass to choose your class!" )
}
if( g_iCurClass[ id ] == 2 )
g_iMedUsable[ id ] = 1
else
g_iMedUsable[ id ] = 0
return PLUGIN_HANDLED
}
public fw_Ham_PrimaryAttack( ent )
{
new id = pev( ent, pev_owner )
if( !is_user_alive( id ) || g_iCurClass[ id ] != 3 )
return HAM_IGNORED
pev( id, pev_punchangle, cl_pushangle[ id ] )
return HAM_IGNORED
}
public fw_Ham_PrimaryAttack_Post( ent )
{
new id = pev( ent, pev_owner )
if( g_iCurClass[ id ] == 3 )
{
new Float:push[ 3 ]
pev( id, pev_punchangle, push )
xs_vec_sub( push, cl_pushangle[ id ], push )
xs_vec_mul_scalar( push, get_pcvar_float( cvar_recoil[ g_iCurWeapon[ id ] ] ), push )
xs_vec_add( push, cl_pushangle[ id ], push )
set_pev( id, pev_punchangle, push )
return HAM_IGNORED
}
return HAM_IGNORED
}
public fw_TakeDamage_Post( victim, inflictor, attacker, Float:damage )
{
if( victim == attacker )
return HAM_IGNORED
if( pev_valid( attacker ) && !zp_get_user_zombie( attacker ) && is_user_alive( attacker ) && is_user_alive( victim ) )
{
if( g_iCurClass[ attacker ] == 4 )
{
SetHamParamFloat( 4, damage * c_dmgmulti )
}
else if( g_iCurClass[ attacker ] == 5 )
{
static Float:velocity[ 3 ], Float:kb_power
kb_power = get_pcvar_float( cvar_kbpower[ g_iCurWeapon[ attacker ] ] )
zp_set_victim_knockback( victim, attacker, Float:velocity, kb_power )
}
}
return HAM_IGNORED
}
public zp_user_infected_post( id, infector )
{
if( is_user_connected( id ) )
{
g_iCurClass[ id ] = 0
g_iCurMode[ id ] = 0
}
}
public zp_round_started( gamemode, id )
{
if( gamemode == MODE_SURVIVOR || gamemode == MODE_PLAGUE || gamemode == MODE_LNJ )
{
if( zp_get_user_survivor( id ) )
{
g_iCurClass[ id ] = 0
return PLUGIN_HANDLED
}
}
if( !zp_get_user_zombie( id ) && !zp_get_user_survivor( id ) && g_iCurClass[ id ] == 0 )
{
client_print( id, print_chat, "[ZP] Don't have a class? Type /hclass to choose one!" )
HumanClassMenu( id )
}
return PLUGIN_HANDLED
}
stock fm_find_ent_by_owner( index, const classname[ ], owner, jghgtype = 0 )
{
new strtype[ 11 ] = "classname", ent = index
switch( jghgtype )
{
case 1: strtype = "target"
case 2: strtype = "targetname"
}
while( ( ent = engfunc( EngFunc_FindEntityByString, ent, strtype, classname ) ) && pev( ent, pev_owner ) != owner ) {}
return ent
}
stock xs_vec_add( const Float:in1[ ], const Float:in2[ ], Float:out[ ] )
{
out[ 0 ] = in1[ 0 ] + in2[ 0 ]
out[ 1 ] = in1[ 1 ] + in2[ 1 ]
out[ 2 ] = in1[ 2 ] + in2[ 2 ]
}
stock xs_vec_sub( const Float:in1[ ], const Float:in2[ ], Float:out[ ] )
{
out[ 0 ] = in1[ 0 ] - in2[ 0 ]
out[ 1 ] = in1[ 1 ] - in2[ 1 ]
out[ 2 ] = in1[ 2 ] - in2[ 2 ]
}
stock xs_vec_mul_scalar( const Float:vec[ ], Float:scalar, Float:out[ ] )
{
out[ 0 ] = vec[ 0 ] * scalar
out[ 1 ] = vec[ 1 ] * scalar
out[ 2 ] = vec[ 2 ] * scalar
}
pero pongo otros modos ... Assassin .. Sinapsis y Sniper
y no se cae el sv..