// plugin to underbind the usage of action: shot-switchweapon-switchweapon-shot to shot faster again with rifle and snipers !

#include <amxmodx> 
#include <amxmisc> 

#include <engine> 
#include <fun> 
#include <dodfun> 

#include <dodx> 
#include <fakemeta> 
#include <fakemeta_util> 

#define VERSION "0.1gh" 
#define SVERSION "v0.1gh - by ghzero" 


public plugin_init() 
{ 
    register_plugin("dod antiswitch","0.1gh","ghzero"); 
    register_cvar("dod_antiswitch_stats",SVERSION,FCVAR_SERVER|FCVAR_SPONLY) 
     
    register_event( "ResetHUD", "event_resethud", "be" ); 
    register_event( "CurWeapon", "event_shotfired","be","1=1"); 
     
    register_forward( FM_PlayerPreThink, "hook_PlayerPreThink" ); 
} 

new users_ammo[33]; 
new users_w[33]; 
new Float:users_shot[33]=0.0; 
new Float:users_nextshot[33]=0.0; 
new users_nextwpn[33]; 
public event_resethud(id) 
{ 
    users_nextshot[id]=get_gametime(); 
} 
public event_shotfired( id ) 
{ 
    new ammo = read_data(3), weapon = read_data(2); // I read it only once to save CPU time. 
    switch(weapon) 
    { 
        case DODW_SCOPED_KAR,DODW_KAR, DODW_SPRINGFIELD, DODW_SCOPED_ENFIELD,DODW_ENFIELD: 
        { 
            if(users_ammo[id]>ammo && ammo>=0) 
            {// 
                new Float:shotdif = get_gametime() - users_shot[id]; 
                users_shot[id] = get_gametime(); 
                 
                //debug 
                //client_print(id,print_chat,"wpn:%d wpnclass:%d shotdelay:%f", weapon, get_weapongroup(weapon), shotdif ); 
                //log_amx("wpn:%d wpnclass:%d shotdelay:%f", weapon, get_weapongroup(weapon), shotdif ); 
                 
                switch(weapon) 
                {//firerate of toleranted next attack !! 
                    case DODW_SCOPED_KAR, DODW_KAR: 
                    {//k98/scope 
                        users_nextshot[id]=get_gametime()+1.5;//firerate-limiter for kar - original > 1.65 
                        users_nextwpn[id]=weapon; 
                    } 
                    case DODW_SPRINGFIELD: 
                    {//springfield 
                        users_nextshot[id]=get_gametime()+1.6;//firerate-limiter for springfield - original > 1.87 
                        users_nextwpn[id]=weapon; 
                    } 
                    case DODW_SCOPED_ENFIELD, DODW_ENFIELD: 
                    {//enfield/scoped 
                        users_nextshot[id]=get_gametime()+1.5;//firerate-limiter for enfield - original > 1.69 
                        users_nextwpn[id]=weapon; 
                    } 
                } 
            } 
            users_w[id]=weapon; 
            users_ammo[id]=ammo; 
        } 
    } 
     
    return PLUGIN_HANDLED; 
} 
public hook_PlayerPreThink(id) 
{ 
    if(is_user_alive(id)) 
    { 
        if(users_nextshot[id] > get_gametime() ) 
        { 
            if( (pev( id, pev_button ) & IN_ATTACK)) 
            { 
                new clip, ammo, wpnid = dod_ghget_user_weapon(id,clip,ammo) 
                if(users_nextwpn[id]==wpnid) 
                {// NO attack until the time has gone 
                    //client_print(id,print_chat,"player is gambling with weapon-switch!"); 
                    set_pev(id,pev_button,pev(id,pev_button) & ~IN_ATTACK); 
                } 
            } 
        } 
    } 
} 

/* 
public dod_client_weaponswitch(id, wpnew, wpnold) 
{ 
    users_w[id]=wpnew; 
    new clip, ammo, wpnid = dod_ghget_user_weapon(id,clip,ammo) 
    users_ammo[id]=ammo; 
    //if wpnold == sniper dann checken ob lastshot kuerzer her als x secs. dann als broken markieren/merken 
} 
*/ 

public dod_ghget_user_weapon(id, &clip, &ammo) 
{ 
    new gclip, gammo, wpnid = dod_get_user_weapon(id, gclip, gammo); 
    clip=gclip; 
    ammo=gammo; 
    if(ammo==0) 
    { 
        switch( wpnid ) 
        { 
            case DODW_SCOPED_FG42 : 
            { 
                gammo = dod_get_user_ammo( id, DODW_FG42 ); 
                ammo=gammo; 
            } 
            case DODW_SCOPED_ENFIELD : 
            { 
                gammo = dod_get_user_ammo( id, DODW_ENFIELD ); 
                ammo=gammo; 
            } 
            //case DODW_M1_CARBINE : 
            //{ 
            //    gammo = dod_get_user_ammo( id, DODW_FOLDING_CARBINE ); 
            //    ammo=gammo; 
            //} 
        } 
    } 
     
    return wpnid; 
} 

public dod_ghget_user_ammo(id, wpnid) 
{ 
    switch( wpnid ) 
    { 
        case DODW_SCOPED_FG42 : 
        { 
            return dod_get_user_ammo(id, DODW_FG42); 
        } 
        case DODW_SCOPED_ENFIELD : 
        { 
            return dod_get_user_ammo(id, DODW_ENFIELD); 
        } 
        //case DODW_M1_CARBINE : 
        //    return dod_get_user_ammo(id, DODW_FOLDING_CARBINE); 
    } 
     
    return dod_get_user_ammo(id, wpnid); 
} 


public get_weapongroup(id)
{
	switch( id )
	{
		case DODW_AMERKNIFE, DODW_GERKNIFE, DODW_BRITKNIFE, DODW_KAR_BAYONET, DODW_ENFIELD_BAYONET :
			return 1;//knifes
		case DODW_HANDGRENADE, DODW_STICKGRENADE, DODW_STICKGRENADE_EX, DODW_HANDGRENADE_EX, DODW_MILLS_BOMB :
			return 2;//grenades
		case DODW_BAZOOKA, DODW_PANZERSCHRECK, DODW_PIAT :
			return 3;//rockets
		case DODW_SPADE, DODW_GARAND_BUTT, DODW_K43_BUTT :
			return 4;//forceimpacts
		case DODW_COLT, DODW_LUGER, DODW_WEBLEY :
			return 5;//pistols
		case DODW_THOMPSON, DODW_GREASEGUN, DODW_STEN, DODW_MP40, DODW_STG44 :
			return 6;//mps
		case DODW_ENFIELD, DODW_GARAND, DODW_M1_CARBINE, DODW_FOLDING_CARBINE, DODW_K43, DODW_KAR :
			return 7;//rifles
		case DODW_SPRINGFIELD, DODW_SCOPED_ENFIELD, DODW_SCOPED_KAR, DODW_SCOPED_FG42 :
			return 8;//sniper-riffles
		case DODW_MG34, DODW_MG42, DODW_BREN, DODW_30_CAL, DODW_BAR, DODW_FG42 :
			return 9;//mgs
		case DODW_MORTAR :
			return 10;//mortars/bombs
	}
	return 0;
}
