/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//--------------------------------------| Dual Barrel |-------------------------------------------------------
//======================================= sDs|Aragon* =======================================================
#if defined DUALBARREL
DualBarrel_Init() {
register_clcmd("furien30_dualbarrel", "Hook_DualBarrel");
register_message(get_user_msgid("DeathMsg"), "DualBarrel_DeathMsg");
register_event("CurWeapon", "DualBarrel_ViewModel", "be", "1=1");
register_event("WeapPickup","DualBarrel_ViewModel","b","1=19");
register_forward(FM_SetModel, "DualBarrel_WorldModel");
register_forward(FM_UpdateClientData, "DualBarrel_UpdateClientData", 1);
register_forward(FM_PlaybackEvent, "DualBarrel_PlaybackEvent");
register_forward(FM_CmdStart, "DualBarrel_CmdStart");
RegisterHam(Ham_TakeDamage, "player", "DualBarrel_TakeDamage");
RegisterHam(Ham_TraceAttack, "worldspawn", "DualBarrel_TraceAttack_Post", 1);
RegisterHam(Ham_TraceAttack, "player", "DualBarrel_TraceAttack_Post", 1);
RegisterHam(Ham_TraceAttack, "func_breakable", "DualBarrel_TraceAttack_Post", 1);
RegisterHam(Ham_TraceAttack, "func_wall", "DualBarrel_TraceAttack_Post", 1);
RegisterHam(Ham_TraceAttack, "func_door", "DualBarrel_TraceAttack_Post", 1);
RegisterHam(Ham_TraceAttack, "func_door_rotating", "DualBarrel_TraceAttack_Post", 1);
RegisterHam(Ham_TraceAttack, "func_plat", "DualBarrel_TraceAttack_Post", 1);
RegisterHam(Ham_TraceAttack, "func_rotating", "DualBarrel_TraceAttack_Post", 1);
RegisterHam(Ham_Item_Deploy , weapon_dualbarrel, "DualBarrel_Deploy_Post", 1);
RegisterHam(Ham_Weapon_PrimaryAttack, weapon_dualbarrel, "DualBarrel_PrimaryAttack");
RegisterHam(Ham_Weapon_PrimaryAttack, weapon_dualbarrel, "DualBarrel_PrimaryAttack_Post", 1);
RegisterHam(Ham_Item_AddToPlayer, weapon_dualbarrel, "DualBarrel_AddToPlayer");
RegisterHam(Ham_Weapon_Reload, weapon_dualbarrel, "DualBarrel_Reload");
RegisterHam(Ham_Weapon_Reload, weapon_dualbarrel, "DualBarrel_Reload_Post", 1);
RegisterHam(Ham_Item_PostFrame, weapon_dualbarrel, "DualBarrel_PostFrame");
dualbarreldamage = register_cvar("furien30_dualbarrel_damage", "3"); //| DualBarrel Damage |//
dualbarrelreloadtime = register_cvar("furien30_dualbarrel_reload_time", "1.67"); //| DualBarrel Reload Time |//
dualbarrelrecoil = register_cvar("furien30_dualbarrel_recoil", "0.8"); //| DualBarrel Recoil |//
}
DualBarrel_Precache() {
register_forward(FM_PrecacheEvent, "DualBarrel_Precache_PrecacheEvent_Post", 1);
precache_model(DualBarrelModel_V);
precache_model(DualBarrelModel_P);
precache_model(DualBarrelModel_W);
for(new i = 0; i < sizeof(DualBarrel_Sound); i++)
engfunc(EngFunc_PrecacheSound, DualBarrel_Sound);
for(new i = 0; i < sizeof(DualBarrel_Generic); i++)
engfunc(EngFunc_PrecacheGeneric, DualBarrel_Generic);
}
DualBarrel_Natives() {
register_native("get_user_dualbarrel", "get_user_dualbarrel", 1);
register_native("set_user_dualbarrel", "set_user_dualbarrel", 1);
}
DualBarrel_Menu( const Num[] = "1") {
new DualBarrel[64];
formatex(DualBarrel,sizeof(DualBarrel)-1,"\wDual Barrel");
menu_additem(Menu, DualBarrel, Num, 0);
}
public DualBarrel_DeathMsg(msg_id, msg_dest, id) {
static TruncatedWeapon[33], Attacker, Victim;
get_msg_arg_string(4, TruncatedWeapon, charsmax(TruncatedWeapon));
Attacker = get_msg_arg_int(1);
Victim = get_msg_arg_int(2);
if(!is_user_connected(Attacker) || Attacker == Victim)
return PLUGIN_CONTINUE;
if(equal(TruncatedWeapon, "m3") && get_user_weapon(Attacker) == CSW_DUALBARREL) {
if(get_user_dualbarrel(Attacker))
set_msg_arg_string(4, "DualBarrel");
}
return PLUGIN_CONTINUE;
}
public DualBarrel_ViewModel(id) {
if(get_user_weapon(id) == CSW_DUALBARREL && get_user_dualbarrel(id)) {
set_pev(id, pev_viewmodel2, DualBarrelModel_V);
set_pev(id, pev_weaponmodel2, DualBarrelModel_P);
}
}
public DualBarrel_WorldModel(entity, model[]) {
if(!is_valid_ent(entity))
return FMRES_IGNORED;
static ClassName[33];
entity_get_string(entity, EV_SZ_classname, ClassName, charsmax(ClassName));
if(!equal(ClassName, "weaponbox"))
return FMRES_IGNORED;
new Owner = entity_get_edict(entity, EV_ENT_owner);
new DualBarrel = find_ent_by_owner(-1, weapon_dualbarrel, entity);
if(get_user_dualbarrel(Owner) && is_valid_ent(DualBarrel) && equal(model, "models/w_m3.mdl")) {
entity_set_int(DualBarrel, EV_INT_impulse, DUALBARREL_WEAPONKEY);
HaveDualBarrel[Owner] = false;
entity_set_model(entity, DualBarrelModel_W);
return FMRES_SUPERCEDE;
}
return FMRES_IGNORED;
}
public DualBarrel_UpdateClientData(id, sendweapons, cd_handle) {
if(is_user_alive(id) && is_user_connected(id)) {
if(get_user_weapon(id) == CSW_DUALBARREL && get_user_dualbarrel(id))
set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001);
}
}
public DualBarrel_PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2) {
if(!is_user_connected(invoker))
return FMRES_IGNORED;
if(eventid != dualbarrel_event)
return FMRES_IGNORED;
playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2);
return FMRES_SUPERCEDE;
}
public DualBarrel_PrecacheEvent_Post(type, const name[]) {
if(equal("events/m3.sc", name)) {
dualbarrel_event = get_orig_retval();
return FMRES_HANDLED;
}
return FMRES_IGNORED;
}
public DualBarrel_CmdStart(id, uc_handle, seed) {
if(is_user_alive(id) && is_user_connected(id)) {
static CurButton;
CurButton = get_uc(uc_handle, UC_Buttons);
new Float:NextAttack = get_pdata_float(id, 83, 5);
new DualBarrel = find_ent_by_owner(-1, weapon_dualbarrel, id);
if(CurButton & IN_ATTACK) {
if(get_user_weapon(id) == CSW_DUALBARREL && get_user_dualbarrel(id)) {
if(cs_get_weapon_ammo(DualBarrel) > 0 && !dualbarrel_reload[id] && NextAttack <= 0.0) {
emit_sound(id, CHAN_WEAPON, DualBarrel_Sound[0], 1.0, ATTN_NORM, 0, PITCH_NORM);
ExecuteHamB(Ham_Weapon_PrimaryAttack, DualBarrel);
set_weapon_anim(id, random_num(1, 2));
if(cs_get_weapon_ammo(DualBarrel) > 0 && !dualbarrel_reload[id] && NextAttack <= 0.0)
set_pdata_float(id, 83, dualbarrel_shotdelay, 5);
}
}
}
if(CurButton & IN_ATTACK2) {
if(get_user_weapon(id) == CSW_DUALBARREL && get_user_dualbarrel(id)) {
if(cs_get_weapon_ammo(DualBarrel) > 0 && !dualbarrel_reload[id] && NextAttack <= 0.0) {
static Ammo;
Ammo = cs_get_weapon_ammo(DualBarrel);
emit_sound(id, CHAN_WEAPON, DualBarrel_Sound[0], 1.0, ATTN_NORM, 0, PITCH_NORM);
for(new i = 0; i < Ammo; i++) {
ExecuteHamB(Ham_Weapon_PrimaryAttack, DualBarrel);
}
set_weapon_anim(id, random_num(1, 2));
if(cs_get_weapon_ammo(DualBarrel) > 0 && !dualbarrel_reload[id] && NextAttack <= 0.0)
set_pdata_float(id, 83, dualbarrel_shotdelay, 5);
}
}
}
}
}
public DualBarrel_TakeDamage(victim, inflictor, attacker, Float:damage, damagetype) {
if(is_user_connected(attacker) && !(damagetype & DMG_HEGRENADE)) {
if(get_user_weapon(attacker) == CSW_DUALBARREL && get_user_dualbarrel(attacker)) {
SetHamParamFloat(4, damage * get_pcvar_float(dualbarreldamage));
}
}
}
public DualBarrel_TraceAttack_Post(ent, attacker, Float:Damage, Float:Dir[3], pentru, DamageType) {
if(!is_user_alive(attacker) || !is_user_connected(attacker))
return HAM_IGNORED;
if(get_user_weapon(attacker) != CSW_DUALBARREL)
return HAM_IGNORED;
if(!get_user_dualbarrel(attacker))
return HAM_IGNORED;
static Float:End[3];
get_tr2(pentru, TR_vecEndPos, End);
make_bullet(attacker, End);
return HAM_HANDLED;
}
public DualBarrel_AddToPlayer(Weapon, id) {
if(is_valid_ent(Weapon) && is_user_connected(id) && entity_get_int(Weapon, EV_INT_impulse) == DUALBARREL_WEAPONKEY) {
HaveDualBarrel[id] = true;
entity_set_int(Weapon, EV_INT_impulse, 0);
WeaponList(id, DUALBARREL_WEAPONKEY)
}
}
public DualBarrel_Deploy_Post(entity) {
static Owner;
Owner = get_pdata_cbase(entity, 41, 4);
if(get_user_dualbarrel(Owner)) {
set_pev(Owner, pev_viewmodel2, DualBarrelModel_V);
set_pev(Owner, pev_weaponmodel2, DualBarrelModel_P);
set_pdata_float(Owner, 83, 1.1, 5);
set_weapon_anim(Owner, 4);
static clip;
clip = cs_get_weapon_ammo(entity);
if(clip > 0)
dualbarrel_reload[Owner] = 0;
}
}
public DualBarrel_PrimaryAttack(Weapon) {
new id = get_pdata_cbase(Weapon, 41, 4);
if(get_user_dualbarrel(id)) {
pev(id,pev_punchangle,cl_pushangle[id]);
dualbarrel_clip[id] = cs_get_weapon_ammo(Weapon);
}
}
public DualBarrel_PrimaryAttack_Post(Weapon) {
new id = get_pdata_cbase(Weapon, 41, 4);
new ActiveItem = get_pdata_cbase(id, 373);
if(dualbarrel_clip[id] > 0 && pev_valid(ActiveItem)) {
if(is_user_alive(id) && get_user_dualbarrel(id)) {
set_pdata_int(ActiveItem, 57, Shell, 4) ;
set_pdata_float(id, 111, get_gametime());
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(dualbarrelrecoil),Push);
xs_vec_add(Push,cl_pushangle[id],Push);
set_pev(id,pev_punchangle,Push);
emit_sound(id, CHAN_WEAPON, DualBarrel_Sound[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
set_weapon_anim(id, random_num(1,2));
}
}
}
public DualBarrel_Reload(ent) {
if(!pev_valid(ent))
return HAM_IGNORED;
new id;
id = pev(ent, pev_owner);
if(!is_user_alive(id) || !get_user_dualbarrel(id))
return HAM_IGNORED;
dualbarrel_clip[id] = -1;
new Ammo = cs_get_user_bpammo(id, CSW_DUALBARREL);
if(Ammo <= 0)
return HAM_SUPERCEDE;
new Clip = get_pdata_int(ent, 51, 4);
if(Clip >= 2)
return HAM_SUPERCEDE;
dualbarrel_clip[id] = Clip;
dualbarrel_reload[id] = 1;
return HAM_IGNORED;
}
public DualBarrel_Reload_Post(ent) {
if(!pev_valid(ent))
return HAM_IGNORED;
new id;
id = pev(ent, pev_owner);
if(!is_user_alive(id) || !get_user_dualbarrel(id))
return HAM_IGNORED;
if(dualbarrel_clip[id] == -1)
return HAM_IGNORED;
new Float:reload_time = get_pcvar_float(dualbarrelreloadtime);
set_pdata_int(ent, 51, dualbarrel_clip[id], 4);
set_pdata_float(ent, 48, reload_time, 4);
set_pdata_float(id, 83, reload_time, 5);
set_pdata_int(ent, 54, 1, 4);
set_weapon_anim(id, 3);
return HAM_IGNORED;
}
public DualBarrel_PostFrame(ent) {
if(!pev_valid(ent))
return HAM_IGNORED;
new id;
id = pev(ent, pev_owner);
if(!is_user_alive(id) || !get_user_dualbarrel(id))
return HAM_IGNORED;
new Float:NextAttack = get_pdata_float(id, 83, 5);
new Ammo = cs_get_user_bpammo(id, CSW_DUALBARREL);
new Clip = get_pdata_int(ent, 51, 4);
new InReload = get_pdata_int(ent, 54, 4);
if(InReload && NextAttack <= 0.0) {
new Temp = min(2 - Clip, Ammo);
set_pdata_int(ent, 51, Clip + Temp, 4);
cs_set_user_bpammo(id, CSW_DUALBARREL, Ammo - Temp);
set_pdata_int(ent, 54, 0, 4);
InReload = 0;
dualbarrel_reload[id] = 0;
}
return HAM_IGNORED;
}
public Hook_DualBarrel(id) {
engclient_cmd(id, weapon_dualbarrel);
}
public get_user_dualbarrel(id) {
return HaveDualBarrel[id];
}
public set_user_dualbarrel(id, dualbarrel) {
if(dualbarrel) {
if(!HaveDualBarrel[id]) {
drop_primary_weapons(id);
HaveDualBarrel[id] = true;
dualbarrel_reload[id] = 0;
WeaponList(id, DUALBARREL_WEAPONKEY)
fm_give_item(id, weapon_dualbarrel);
new clip = fm_get_user_weapon_entity(id, CSW_DUALBARREL);
cs_set_weapon_ammo(clip, 2);
}
}
else {
if(HaveDualBarrel[id]) {
HaveDualBarrel[id] = false;
}
}
}
#endif