try this
Code:
#include <amxmodx>
#include <fakemeta>
#define DO_DAMAGE_AT_CHARGE_OFF
public plugin_init()
{
register_plugin( "ChargeDamage", "1.0", "core|Greenberet" );
register_clcmd( "+charge", "cmdChargeOn" );
register_clcmd( "-charge", "cmdChargeOff" );
register_forward( FM_PlayerPreThink, "PlayerPreThink" );
}
enum charge_t
{
chOn,
chPreFrame,
#if defined DO_DAMAGE_AT_CHARGE_OFF
chDamage,
#endif
};
stock Charge[33][charge_t];
public cmdChargeOn( Client )
{
Charge[ Client ] [ chOn ] = 1;
Charge[ Client ] [ chPreFrame ] = _:get_gametime();
#if defined DO_DAMAGE_AT_CHARGE_OFF
Charge[ Client ] [ chDamage ] = 0;
#endif
}
public cmdChargeOff( Client )
{
Charge[ Client ] [ chOn ] = 0;
#if defined DO_DAMAGE_AT_CHARGE_OFF
//Do damage here
#endif
}
public PlayerPreThink( Client )
{
new Float:CurrentFrame = get_gametime( );
if ( Charge[ Client ] [ chOn ] && ( CurrentFrame - Float:Charge[ Client ] [ chPreFrame ] ) < ( 1.0 ) )
return 0;
Charge[ Client ] [ chPreFrame ] = _:CurrentFrame;
#if defined DO_DAMAGE_AT_CHARGE_OFF
Charge[ Client ] [ chDamage ] += 2;
#else
// Do damage here
#endif
return 0;
}
btw. you have to bind +charge and not charge.
there are better ways eg. register/unregister_forward in cmdChargeOn/cmdChargeOff so you don't have to check every PreThink if the client is charging or not.
undefine DO_DAMAGE_AT_CHARGE_OFF if you want to do the damage each second
BTW. i didn't test it, but it should work