eroare plugin

Tutoriale scripting, cod si portiuni de cod.

Moderators: Moderatori ajutatori, Moderatori, Echipa eXtreamCS.com

Post Reply
samburel23
Membru, skill 0
Membru, skill 0
Posts: 10
Joined: 29 Jan 2020, 15:42
Detinator Steam: Nu
CS Status: Citesc forumul eXtreamCS.com...!
Fond eXtream: 0

02 Feb 2020, 14:51

Uitati sursa
| Afiseaza codul
#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <engine>
#include <fakemeta>
#include <fakemeta_util>
#include <hamsandwich>

#define PLUGIN "Weapons Menu"
#define VERSION "3.0"
#define AUTHOR "Aragon*"


#define OWNER_LEVEL ADMIN_IMMUNITY
#define VIPGOLD_LEVEL    ADMIN_IMMUNITY
#define VIPSILVER_LEVEL ADMIN_IMMUNITY

#define OICW

//#define AT4
#define SALAMANDER
#define CROSSBOW
#define ETHEREAL

#define QUADBARREL
#define DUALMP7A1
#define K1ASES
#define F2000

#define HK416
#define AK47KNIFE
//#define TAR21
#define M134
#define THOMPSON
#define DUALBARREL
#define M1887
#define L85
//#define SKULL5
//#define SL8
//#define AW50

#define M79
//#define DUALDEAGLE
#define INFINITY
//#define DEAGLEGOLD
//#define K5
#define SKULL1
#define ANACONDA

new Menu
new bool:ShowMenu[33], bool:HavePrimaryWeapon[33], bool:HaveSecondaryWeapon[33], PrimaryWeapon[33], SecondaryWeapon[33];

//------| Weapons Menu |------//
#define DMG_HEGRENADE       (1<<24)
#define AMMOWP_NULL         (1<<0 | 1<<CSW_KNIFE | 1<<CSW_FLASHBANG | 1<<CSW_HEGRENADE | 1<<CSW_SMOKEGRENADE | 1<<CSW_C4)

new Shell;
new Float:cl_pushangle[33][3];
new BloodSpray, BloodDrop;

new const WeaponsAmmo[][] = {
    { -1, -1 },
    { 13, 52 },
    { -1, -1 },
    { 10, 90 },
    { -1, -1 },
    { 7, 32 },
    { -1, -1 },
    { 30, 100 },
    { 30, 90 },
    { -1, -1 },
    { 30, 120 },
    { 20, 100 },
    { 25, 100 },
    { 30, 90 },
    { 35, 90 },
    { 25, 90 },
    { 12, 100 },
    { 20, 120 },
    { 10, 30 },
    { 30, 120 },
    { 100, 200 },
    { 8, 32 },
    { 30, 90 },
    { 30, 120 },
    { 20, 90 },
    { -1, -1 },
    { 7, 35 },
    { 30, 90 },
    { 30, 90 },
    { -1, -1 },
    { 50, 100 }
}


//--| Primary Weapons |--//
new PRIMARY_WEAPONS_BITSUM = (1<<CSW_SCOUT)|(1<<CSW_XM1014)|(1<<CSW_MAC10)|(1<<CSW_AUG)|(1<<CSW_UMP45)|(1<<CSW_SG550)|(1<<CSW_GALIL)|(1<<CSW_FAMAS)|(1<<CSW_AWP)|(1<<CSW_MP5NAVY)|(1<<CSW_M249)|(1<<CSW_M3)|(1<<CSW_M4A1)|(1<<CSW_TMP)|(1<<CSW_G3SG1)|(1<<CSW_SG552)|(1<<CSW_AK47)|(1<<CSW_P90);

#if defined OICW
#define OICW_WEAPONKEY      99
#define weapon_oicw     "weapon_galil"
#define CSW_OICW        CSW_GALIL
#define OICW_CLASS      "oicw_grenade"
#define oicw_shotdelay      3.0 // Refire rate
new OICWModel_V[] = "models/furien30_weapons/Primary/v_oicw.mdl";
new OICWModel_P[] = "models/furien30_weapons/Primary/p_oicw.mdl";
new OICWModel_W[] = "models/furien30_weapons/Primary/w_oicw.mdl";
new OICWModel_S[] = "models/furien30_weapons/Primary/s_oicwgrenade.mdl";
new OICW_Sound[][] = {
    "weapons/oicw_shoot1.wav",
    "weapons/oicw_grenade_shoot1.wav",
    //"weapons/oicw_grenade_shoot2.wav",
    "weapons/oicw_foley1.wav",
    "weapons/oicw_foley2.wav",
    "weapons/oicw_foley3.wav",
    "weapons/oicw_move_carbine.wav",
    "weapons/oicw_move_grenade.wav"
};
new OICW_Generic[][] = {
    //"sprites/furien30_oicw.txt",
    "sprites/furien30_weapons/OICW.spr",
    "sprites/furien30_weapons/640hud7x.spr"
};

new bool:HaveOICW[33], OICWCarabineAmmo[33], oicw_launcher[33], oicw_clip[33], oicw_reload[33], oicw_event, oicw_trail, oicw_explode;
new oicwdamage, oicwdamage2, oicwclip, oicwrecoil, oicwradius, oicwknockback, oicwreloadtime, oicwreloadtime2;
#endif

//--| VIP GOLD |--//
#if defined AT4
#define AT4_WEAPONKEY       100
#define weapon_at4      "weapon_m249"
#define CSW_AT4         CSW_M249
#define AT4_CLASS       "at4ex_rocket"
#define AT4_CLASS_DETECTOR  "at4ex_rocket_detector"
#define AT4_CLASS_LASERDOT  "at4_laserdot"
#define at4_shotdelay       4.0 // Refire rate
new AT4Model_V[] = "models/furien30_weapons/Primary/v_at4.mdl";
new AT4Model_P[] = "models/furien30_weapons/Primary/p_at4.mdl";
new AT4Model_W[] = "models/furien30_weapons/Primary/w_at4.mdl";
new AT4Model_S[] = "models/furien30_weapons/Primary/s_at4rocket.mdl";
new AT4Model_LASER[] = "sprites/laserdot.spr";
new AT4_Sound[][] = {
    "weapons/at4_shoot1.wav",
    "weapons/at4_clipin1.wav",
    "weapons/at4_clipin2.wav",
    "weapons/at4_clipin3.wav",
    "weapons/at4_draw.wav"
};
new AT4_Generic[][] = {
    //"sprites/furien30_at4.txt",
    "sprites/furien30_weapons/At4.spr",
    "sprites/furien30_weapons/640hud7x.spr"
};

new bool:HaveAT4[33], at4_clip[33], at4_reload[33], at4_detector[33], at4_smoke, at4_trail, at4_explode;
new at4damage, at4damage2, at4radius, at4knockback, at4reloadtime;
#endif

#if defined SALAMANDER
#define SALAMANDER_WEAPONKEY        101
#define weapon_salamander       "weapon_m249"
#define CSW_SALAMANDER          CSW_M249
#define SALAMANDER_CLASS        "salamander_fire"
#define salamander_shotdelay        0.05 // Refire rate
new SalamanderModel_V[] = "models/furien30_weapons/Primary/v_salamander.mdl";
new SalamanderModel_P[] = "models/furien30_weapons/Primary/p_salamander.mdl";
new SalamanderModel_W[] = "models/furien30_weapons/Primary/w_salamander.mdl";
new SalamanderModel_FIRE[] = "sprites/furien30_weapons/fire_salamander.spr";
new Salamander_Sound[][] = {
    "weapons/flamegun_shoot1.wav",
    //"weapons/flamegun_shoot2.wav",
    "weapons/flamegun_clipin1.wav",
    "weapons/flamegun_clipout1.wav",
    "weapons/flamegun_clipout2.wav",
    "weapons/flamegun_draw.wav"
};
new Salamander_Generic[][] = {
    //"sprites/furien30_salamander.txt",
    "sprites/furien30_weapons/Salamander.spr",
    "sprites/furien30_weapons/640hud7x.spr"
};

new bool:HaveSalamander[33], salamander_clip[33], salamander_reload[33];
new salamanderdamage, salamanderclip, salamanderreloadtime, salamanderradius;
#endif

#if defined CROSSBOW
#define CROSSBOW_WEAPONKEY  102
#define weapon_crossbow     "weapon_sg552"
#define CSW_CROSSBOW        CSW_SG552
#define CROSSBOW_CLASS      "crossbow_bolt"
#define crossbow_shotdelay  1.0 // Refire rate
new CrossBowModel_V[] = "models/furien30_weapons/Primary/v_crossbow.mdl";
new CrossBowModel_P[] = "models/furien30_weapons/Primary/p_crossbow.mdl";
new CrossBowModel_W[] = "models/furien30_weapons/Primary/w_crossbow.mdl";
new CrossBowModel_S[] = "models/furien30_weapons/Primary/s_crossbowbolt.mdl";
new CrossBow_Sound[][] = {
    "weapons/crossbow_shoot1.wav",
    "weapons/crbow_fl4.wav",
    "weapons/crbow_fl111.wav",
    "weapons/crbow_foley2.wav",
    "weapons/crbow_foley33.wav",
    "weapons/crbow_drw.wav"
};
new CrossBow_Generic[][] = {
    //"sprites/furien30_crossbow.txt",
    "sprites/furien30_weapons/Crossbow.spr",
    "sprites/furien30_weapons/640hud7x.spr"
};
new bool:HaveCrossBow[33], crossbow_clip[33], crossbow_reload[33], crossbow_trail, crossbow_explode;
new crossbowdamage, crossbowclip, crossbowreloadtime, crossbowradius, crossbowknockback;
#endif

#if defined ETHEREAL
#define ETHEREAL_WEAPONKEY  103
#define weapon_ethereal     "weapon_galil"
#define CSW_ETHEREAL        CSW_GALIL
#define ethereal_shotdelay  0.15 // Refire rate

new EtherealModel_V[] = "models/furien30_weapons/Primary/v_ethereal.mdl";
new EtherealModel_P[] = "models/furien30_weapons/Primary/p_ethereal.mdl";
new EtherealModel_W[] = "models/furien30_weapons/Primary/w_ethereal.mdl";
new EtherealMuzzleFlash[]  = "sprites/muz6.spr";
new Ethereal_Sound[][] = {
    "weapons/ethereal_shoot1.wav",
    "weapons/ethereal_hit.wav",
    "weapons/ethereal_idle1.wav",
    "weapons/ethereal_reload.wav",
    "weapons/ethereal_draw.wav"
};
new Ethereal_Generic[][] = {
    //"sprites/furien30_ethereal.txt",
    "sprites/furien30_weapons/Ethereal.spr",
    "sprites/furien30_weapons/640hud2.spr"
};
new bool:HaveEthereal[33], ethereal_clip[33], ethereal_reload[33], ethereal_beam, ethereal_explode;
new etherealdamage, etherealclip, etherealreloadtime, etherealknockback;
#endif


//--| VIP SILVER |--//
#if defined QUADBARREL
#define QUADBARREL_WEAPONKEY    104
#define quadbarrel_shotdelay    0.40
#define weapon_quadbarrel   "weapon_m3"
#define CSW_QUADBARREL      CSW_M3
new QuadBarrelModel_V[] = "models/furien30_weapons/Primary/v_quadbarrel.mdl";
new QuadBarrelModel_P[] = "models/furien30_weapons/Primary/p_quadbarrel.mdl";
new QuadBarrelModel_W[] = "models/furien30_weapons/Primary/w_quadbarrel.mdl";
new QuadBarrel_Sound[][] = {
    "weapons/qbarrel_shoot1.wav",
    "weapons/qbarrel_draw.wav",
    "weapons/qbarrel_clipout1.wav",
    "weapons/qbarrel_clipin1.wav",
    "weapons/qbarrel_clipin2.wav"
};
new QuadBarrel_Generic[][] = {
    //"sprites/furien30_quadbarrel.txt",
    "sprites/furien30_weapons/QuadBarrel.spr",
    "sprites/furien30_weapons/640hud7x.spr"
};
new bool:HaveQuadBarrel[33], quadbarrel_clip[33], quadbarrel_reload[33], quadbarrel_event;
new quadbarreldamage, quadbarrelreloadtime, quadbarrelrecoil;
#endif

#if defined DUALMP7A1
#define DUALMP7A1_WEAPONKEY 105
#define weapon_dualmp7a1    "weapon_mp5navy"
#define CSW_DUALMP7A1       CSW_MP5NAVY
new DualMP7A1Model_V[] = "models/furien30_weapons/Primary/v_dualmp7a1.mdl";
new DualMP7A1Model_P[] = "models/furien30_weapons/Primary/p_dualmp7a1.mdl";
new DualMP7A1Model_W[] = "models/furien30_weapons/Primary/w_dualmp7a1.mdl";
new DualMP7A1_Sound[][] = {
    "weapons/Dmp7_shoot1.wav",
    "weapons/Dmp7_drop.wav",
    "weapons/Dmp7_draw.wav",
    "weapons/mp7_foley2.wav",
    "weapons/mp7_foley4.wav"
};
new DualMP7A1_Generic[][] = {
    //"sprites/furien30_dualmp7a1.txt",
    "sprites/furien30_weapons/DualMp7a1.spr",
    "sprites/furien30_weapons/640hud7x.spr"
};
new bool:HaveDualMP7A1[33], dualmp7a1_clip[33], dualmp7a1_reload[33], dualmp7a1_event;
new dualmp7a1damage, dualmp7a1clip, dualmp7a1reloadtime, dualmp7a1recoil;
#endif

#if defined K1ASES
#define K1ASES_WEAPONKEY    106
#define weapon_k1ases       "weapon_mp5navy"
#define CSW_K1ASES      CSW_MP5NAVY
new K1asesModel_V[] = "models/furien30_weapons/Primary/v_k1ases.mdl";
new K1asesModel_P[] = "models/furien30_weapons/Primary/p_k1ases.mdl";
new K1asesModel_W[] = "models/furien30_weapons/Primary/w_k1ases.mdl";
new K1ases_Sound[][] = {
    "weapons/k1a_shoot1.wav",
    "weapons/k1a_ability.wav",
    "weapons/k1a_clipin.wav",
    "weapons/k1a_clipout.wav",
    "weapons/k1a_draw.wav",
    "weapons/k1a_foley1.wav"
};
new K1ases_Generic[][] = {
    //"sprites/furien30_k1ases.txt",
    "sprites/furien30_weapons/K1ases.spr",
    "sprites/furien30_weapons/640hud7x.spr"
};
new bool:HaveK1ases[33], k1ases_clip[33], k1ases_reload[33], K1ases_Ability_Delay[33], k1ases_explode, k1ases_event;
new k1asesdamage, k1asesclip, k1asesreloadtime, k1asesrecoil, k1asesabilitydamage, k1asesabilitydelay, k1asesabilityradius;
#endif

#if defined F2000
#define F2000_WEAPONKEY     107
#define weapon_f2000        "weapon_aug"
#define CSW_F2000       CSW_AUG
new F2000Model_V[] = "models/furien30_weapons/Primary/v_f2000.mdl";
new F2000Model_P[] = "models/furien30_weapons/Primary/p_f2000.mdl";
new F2000Model_W[] = "models/furien30_weapons/Primary/w_f2000.mdl";
new F2000Model_S[] = "models/furien30_weapons/Primary/s_f2000.mdl";
new F2000_Sound[][] = {
    "weapons/f2000_shoot1.wav",
    //"weapons/f2000_shoot2.wav",
    "weapons/f2000_Boltpull.wav",
    "weapons/f2000_Clipin.wav",
    "weapons/f2000_Clipou.wav"
};
new F2000_Generic[][] = {
    "sprites/furien30_weapons/F2000.spr",
    "sprites/furien30_weapons/640hud7x.spr"
};
new bool:HaveF2000[33], f2000_clip[33], f2000_reload[33], f2000_event;
new f2000damage, f2000clip, f2000reloadtime, f2000recoil;
#endif

#if defined HK416
#define HK416_WEAPONKEY     108
#define weapon_hk416        "weapon_m4a1"
#define CSW_HK416       CSW_M4A1
new HK416Model_V[] = "models/furien30_weapons/Primary/v_hk416.mdl";
new HK416Model_P[] = "models/furien30_weapons/Primary/p_hk416.mdl";
new HK416Model_W[] = "models/furien30_weapons/Primary/w_hk416.mdl";
new HK416_Sound[][] = {
    "weapons/hk416_shoot1.wav",
    "weapons/hk416_unsil_shoot1.wav",
    "weapons/hk416_clipin.wav",
    "weapons/hk416_clipon.wav",
    "weapons/hk416_clipout.wav",
    "weapons/hk416_draw.wav",
    "weapons/hk416_foley.wav",
    "weapons/hk416_siloff.wav",
    "weapons/hk416_silon.wav"
};
new HK416_Generic[][] = {
    //"sprites/furien30_hk416.txt",
    "sprites/furien30_weapons/HK416.spr",
    "sprites/furien30_weapons/640hud7x.spr"
};
new bool:HaveHK416[33], hk416_clip[33], hk416_reload[33], hk416_event;
new hk416damage, hk416clip, hk416reloadtime, hk416recoil;
#endif

#if defined AK47KNIFE
#define AK47KNIFE_WEAPONKEY 109
#define weapon_ak47knife    "weapon_ak47"
#define CSW_AK47KNIFE       CSW_AK47
new AK47KnifeModel_V[] = "models/furien30_weapons/Primary/v_ak47knife.mdl";
new AK47KnifeModel_P[] = "models/furien30_weapons/Primary/p_ak47knife.mdl";
new AK47KnifeModel_W[] = "models/furien30_weapons/Primary/w_ak47knife.mdl";
new AK47Knife_Sound[][] = {
    "weapons/ak47-1.wav",
    //"weapons/ak47-2.wav",
    "weapons/acum_draw.wav",
    "weapons/ak47knife_hitplayer.wav",
    "weapons/ak47knife_hitwall.wav",
    "weapons/ak47knife_hitmiss.wav"
};
new AK47Knife_Generic[][] = {
    //"sprites/furien30_ak47knife.txt",
    "sprites/furien30_weapons/Ak47Knife.spr",
    "sprites/furien30_weapons/640hud7x.spr"
};
new bool:HaveAK47Knife[33], ak47knife_clip[33], ak47knife_reload[33], ak47knife_event;
new ak47knifedamage, ak47knifeclip, ak47knifereloadtime, ak47kniferecoil, ak47knifeabilitydamage, ak47knifeabilityknockback;
#endif

#if defined TAR21
#define TAR21_WEAPONKEY     110
#define weapon_tar21        "weapon_sg552"
#define CSW_TAR21       CSW_SG552
new Tar21Model_V[] = "models/furien30_weapons/Primary/v_tar21.mdl";
new Tar21Model_P[] = "models/furien30_weapons/Primary/p_tar21.mdl";
new Tar21Model_W[] = "models/furien30_weapons/Primary/w_tar21.mdl";
new Tar21_Sound[][] = {
    "weapons/tar21_shoot1.wav",
    "weapons/tar21_boltpull.wav",
    "weapons/tar21_clipin.wav",
    "weapons/tar21_clipout.wav"
};
new Tar21_Generic[][] = {
    //"sprites/furien30_tar21.txt",
    //"sprites/furien30_weapons/Tar21.spr",
    "sprites/furien30_weapons/640hud7x.spr"
};
new bool:HaveTar21[33], tar21_clip[33], tar21_reload[33], tar21_event;
new tar21damage, tar21clip, tar21reloadtime, tar21recoil;
#endif

#if defined M134
#define M134_WEAPONKEY      111
#define weapon_m134     "weapon_m249"
#define CSW_M134        CSW_M249
new M134Model_V[] = "models/furien30_weapons/Primary/v_m134.mdl";
new M134Model_P[] = "models/furien30_weapons/Primary/p_m134.mdl";
new M134Model_W[] = "models/furien30_weapons/Primary/w_m134.mdl";
new M134_Sound[][] = {
    "weapons/m134_shoot1.wav",
    "weapons/m134_clipoff.wav",
    "weapons/m134_clipon.wav",
    "weapons/m134_spindown.wav",
    "weapons/m134_spinup.wav",
    "weapons/m134_pinpull.wav"
};
new M134_Generic[][] = {
    //"sprites/furien30_m134.txt",
    "sprites/furien30_weapons/M134.spr",
    "sprites/furien30_weapons/640hud7x.spr"
};
new bool:HaveM134[33], m134_clip[33], m134_reload[33], m134_event;
new m134damage, m134clip, m134reloadtime, m134recoil;
#endif

#if defined THOMPSON
#define THOMPSON_WEAPONKEY  112
#define weapon_thompson     "weapon_p90"
#define CSW_THOMPSON        CSW_P90
new ThompsonModel_V[] = "models/furien30_weapons/Primary/v_thompson.mdl";
new ThompsonModel_P[] = "models/furien30_weapons/Primary/p_thompson.mdl";
new ThompsonModel_W[] = "models/furien30_weapons/Primary/w_thompson.mdl";
new Thompson_Sound[][] = {
    "weapons/thompsongold_shoot1.wav",
    "weapons/thompsongold_clipin.wav",
    "weapons/thompsongold_clipout.wav",
    "weapons/thompsongold_draw.wav"
};
new Thompson_Generic[][] = {
    //"sprites/furien30_thompson.txt",
    "sprites/furien30_weapons/Thompson.spr",
    "sprites/furien30_weapons/640hud7x.spr"
};
new bool:HaveThompson[33], thompson_clip[33], thompson_reload[33], thompson_event;
new thompsondamage, thompsonclip, thompsonreloadtime, thompsonrecoil;
#endif

#if defined DUALBARREL
#define DUALBARREL_WEAPONKEY    113
#define dualbarrel_shotdelay    0.40
#define weapon_dualbarrel   "weapon_m3"
#define CSW_DUALBARREL      CSW_M3
new DualBarrelModel_V[] = "models/furien30_weapons/Primary/v_dualbarrel.mdl";
new DualBarrelModel_P[] = "models/furien30_weapons/Primary/p_dualbarrel.mdl";
new DualBarrelModel_W[] = "models/furien30_weapons/Primary/w_dualbarrel.mdl";
new DualBarrel_Sound[][] = {
    "weapons/dbarrel_shoot1.wav",
    "weapons/dbarrel_draw.wav",
    "weapons/dbarrel_foley1.wav",
    "weapons/dbarrel_foley2.wav",
    "weapons/dbarrel_foley3.wav",
    "weapons/dbarrel_foley4.wav"
};
new DualBarrel_Generic[][] = {
    //"sprites/furien30_dualbarrel.txt",
    "sprites/furien30_weapons/DualBarrel.spr",
    "sprites/furien30_weapons/640hud7x.spr"
};
new bool:HaveDualBarrel[33], dualbarrel_clip[33], dualbarrel_reload[33], dualbarrel_event;
new dualbarreldamage, dualbarrelreloadtime, dualbarrelrecoil;
#endif

#if defined M1887
#define M1887_WEAPONKEY     114
#define weapon_m1887        "weapon_m3"
#define CSW_M1887       CSW_M3
new M1887Model_V[] = "models/furien30_weapons/Primary/v_m1887.mdl";
new M1887Model_P[] = "models/furien30_weapons/Primary/p_m1887.mdl";
new M1887Model_W[] = "models/furien30_weapons/Primary/w_m1887.mdl";
new M1887_Sound[][] = {
    "weapons/m1887_shoot1.wav",
    "weapons/m1887_draw.wav",
    "weapons/m1887_insert.wav",
    "weapons/m1887_restart.wav"
};
new M1887_Generic[][] = {
    //"sprites/furien30_m1887.txt",
    "sprites/furien30_weapons/M1887.spr",
    "sprites/furien30_weapons/640hud7x.spr"
};
new bool:HaveM1887[33], m1887_clip[33], m1887_reload[33], m1887_event;
new m1887damage, /*m1887clip, m1887reloadtime,*/ m1887recoil;
#endif

#if defined L85
#define L85_WEAPONKEY       115
#define weapon_l85      "weapon_famas"
#define CSW_L85         CSW_FAMAS
new L85Model_V[] = "models/furien30_weapons/Primary/v_l85.mdl";
new L85Model_P[] = "models/furien30_weapons/Primary/p_l85.mdl";
new L85Model_W[] = "models/furien30_weapons/Primary/w_l85.mdl";
new L85_Sound[][] = {
    "weapons/l85_shoot1.wav",
    "weapons/l85_foley1.wav",
    "weapons/l85_foley2.wav",
    "weapons/l85_foley4.wav",
    "weapons/l85_foley3.wav"
};
new L85_Generic[][] = {
    //"sprites/furien30_l85.txt",
    "sprites/furien30_weapons/L85.spr",
    "sprites/furien30_weapons/640hud7x.spr"
};
new bool:HaveL85[33], l85_clip[33], l85_reload[33], l85_event;
new l85damage, l85clip, l85reloadtime, l85recoil;
#endif

#if defined SKULL5
#define SKULL5_WEAPONKEY    116
#define weapon_skull5       "weapon_sg550"
#define CSW_SKULL5      CSW_SG550
new Skull5Model_V[] = "models/furien30_weapons/Primary/v_skull5.mdl";
new Skull5Model_P[] = "models/furien30_weapons/Primary/p_skull5.mdl";
new Skull5Model_W[] = "models/furien30_weapons/Primary/w_skull5.mdl";
new Skull5_Sound[][] = {
    "weapons/skull5_shoot1.wav",
    "weapons/skull5_boltpull.wav",
    "weapons/skull5_clipin.wav",
    "weapons/skull5_clipout.wav",
    "weapons/skull5_draw.wav"
};
new Skull5_Generic[][] = {
    //"sprites/furien30_skull5.txt",
    //"sprites/furien30_weapons/Skull5.spr",
    "sprites/furien30_weapons/640hud7x.spr"
};
new bool:HaveSkull5[33], skull5_clip[33], skull5_reload[33], skull5_event;
new skull5damage, skull5clip, skull5reloadtime, skull5recoil;
#endif

#if defined SL8
#define SL8_WEAPONKEY   117
#define weapon_sl8  "weapon_g3sg1"
#define CSW_SL8     CSW_G3SG1
new SL8Model_V[] = "models/furien30_weapons/Primary/v_sl8.mdl";
new SL8Model_P[] = "models/furien30_weapons/Primary/p_sl8.mdl";
new SL8Model_W[] = "models/furien30_weapons/Primary/w_sl8.mdl";
new SL8_Sound[][] = {
    "weapons/sl8_shoot1.wav",
    "weapons/sl8_boltpull.wav",
    "weapons/sl8_clipin.wav",
    "weapons/sl8_clipout.wav",
    "weapons/sl8_draw.wav"
};
new SL8_Generic[][] = {
    //"sprites/furien30_sl8.txt",
    "sprites/furien30_weapons/SL8.spr",
    "sprites/furien30_weapons/640hud7x.spr"
};
new bool:HaveSL8[33], sl8_clip[33], sl8_reload[33], sl8_event;
new sl8damage, sl8clip, sl8reloadtime, sl8recoil;
#endif

#if defined AW50
#define AW50_WEAPONKEY      118
#define weapon_aw50     "weapon_awp"
#define CSW_AW50        CSW_AWP
new AW50Model_V[] = "models/furien30_weapons/Primary/v_aw50.mdl";
new AW50Model_P[] = "models/furien30_weapons/Primary/p_aw50.mdl";
new AW50Model_W[] = "models/furien30_weapons/Primary/w_aw50.mdl";
new AW50_Sound[][] = {
    "weapons/aw50_shoot1.wav",
    "weapons/aw50_clipin.wav",
    "weapons/aw50_clipout.wav",
    "weapons/aw50_foley1.wav",
    "weapons/aw50_foley2.wav"
};
new AW50_Generic[][] = {
    //"sprites/furien30_aw50.txt",
    "sprites/furien30_weapons/AW50.spr",
    "sprites/furien30_weapons/640hud7x.spr"
};
new bool:HaveAW50[33], aw50_clip[33], aw50_reload[33], aw50_event;
new aw50damage, aw50clip, aw50reloadtime, aw50recoil;
#endif


//--| Secondary Weapons |--//
new SECONDARY_WEAPONS_BITSUM = (1<<CSW_GLOCK18)|(1<<CSW_USP)|(1<<CSW_P228)|(1<<CSW_DEAGLE)|(1<<CSW_FIVESEVEN)|(1<<CSW_ELITE);
new IsInPrimaryAttack;

#if defined M79
#define M79_WEAPONKEY   200
#define M79_CLASS   "m79_grenade"
#define weapon_m79  "weapon_deagle"
#define CSW_M79     CSW_DEAGLE
#define m79_shotdelay   3.0 // Refire rate
new M79Model_V[] = "models/furien30_weapons/Secondary/v_m79.mdl";
new M79Model_P[] = "models/furien30_weapons/Secondary/p_m79.mdl";
new M79Model_W[] = "models/furien30_weapons/Secondary/w_m79.mdl";
new M79Model_S[] = "models/furien30_weapons/Secondary/s_m79grenade.mdl";
new M79_Sound[][] = {
    "weapons/m79_shoot1.wav",
    //"weapons/m79_shoot2.wav",
    "weapons/m79_clipin.wav",
    "weapons/m79_clipon.wav",
    "weapons/m79_clipout.wav"
};
new M79_Generic[][] = {
    //"sprites/furien30_m79.txt",
    "sprites/furien30_weapons/M79.spr",
    "sprites/furien30_weapons/640hud7x.spr"
};
new bool:HaveM79[33], m79_clip[33], m79_reload[33], m79_trail, m79_explode;
new m79damage, m79radius, m79knockback, m79reloadtime;
#endif

#if defined DUALDEAGLE
#define DUALDEAGLE_WEAPONKEY    201
#define weapon_dualdeagle   "weapon_elite"
#define CSW_DUALDEAGLE      CSW_ELITE
new DualDeagleModel_V[] = "models/furien30_weapons/Secondary/v_dualdeagle.mdl";
new DualDeagleModel_P[] = "models/furien30_weapons/Secondary/p_dualdeagle.mdl";
new DualDeagleModel_W[] = "models/furien30_weapons/Secondary/w_dualdeagle.mdl";
new DualDeagle_Sound[][] = {
    "weapons/DDe_shoot1.wav",
    "weapons/DDe_Clipout.wav",
    "weapons/DDe_clipin.wav",
    "weapons/DDe_clipoff.wav",
    "weapons/DDe_twirl.wav",
    "weapons/DDe_Load.wav"
};
new DualDeagle_Generic[][] = {
    //"sprites/furien30_dualdeagle.txt",
    "sprites/furien30_weapons/DualDeagle.spr",
    "sprites/furien30_weapons/640hud7x.spr"
};
new bool:HaveDualDeagle[33], dualdeagle_clip[33], dualdeagle_reload[33], dualdeagle_event;
new dualdeagledamage, dualdeagleclip, dualdeaglereloadtime, dualdeaglerecoil;
#endif

#if defined INFINITY
#define INFINITY_WEAPONKEY  202
#define weapon_infinity     "weapon_elite"
#define CSW_INFINITY        CSW_ELITE
new InfinityModel_V[] = "models/furien30_weapons/Secondary/v_infinity.mdl";
new InfinityModel_P[] = "models/furien30_weapons/Secondary/p_infinity.mdl";
new InfinityModel_W[] = "models/furien30_weapons/Secondary/w_infinity.mdl";
new Infinity_Sound[][] = {
    "weapons/infi_shoot1.wav",
    //"weapons/infi_shoot2.wav",
    "weapons/infi_clipout.wav",
    "weapons/infi_clipin.wav",
    "weapons/infi_clipon.wav",
    "weapons/infi_draw.wav"
};
new Infinity_Generic[][] = {
    //"sprites/furien30_infinity.txt",
    "sprites/furien30_weapons/Infinity.spr",
    "sprites/furien30_weapons/640hud7x.spr"
};
new bool:HaveInfinity[33], infinity_clip[33], infinity_reload[33], infinity_event;
new infinitydamage, infinityclip, infinityreloadtime, infinityrecoil;
#endif

#if defined DEAGLEGOLD
#define DEAGLEGOLD_WEAPONKEY    203
#define weapon_deaglegold   "weapon_deagle"
#define CSW_DEAGLEGOLD      CSW_DEAGLE
new DeagleGoldModel_V[] = "models/furien30_weapons/Secondary/v_deaglegold.mdl";
new DeagleGoldModel_P[] = "models/furien30_weapons/Secondary/p_deaglegold.mdl";
new DeagleGoldModel_W[] = "models/furien30_weapons/Secondary/w_deaglegold.mdl";
new DeagleGold_Sound[][] = {
    "weapons/deagle-1.wav"/*,
    "weapons/deagle-2.wav"*/
};

new bool:HaveDeagleGold[33], deaglegold_clip[33], deaglegold_reload[33], deaglegold_event;
new deaglegolddamage, deaglegoldclip, deaglegoldreloadtime, deaglegoldrecoil;
#endif

#if defined K5
#define K5_WEAPONKEY        204
#define weapon_k5       "weapon_p228"
#define CSW_K5          CSW_P228
new K5Model_V[] = "models/furien30_weapons/Secondary/v_k5.mdl";
new K5Model_P[] = "models/furien30_weapons/Secondary/p_k5.mdl";
new K5Model_W[] = "models/furien30_weapons/Secondary/w_k5.mdl";
new K5_Sound[][] = {
    "weapons/k5_shoot1.wav",
    //"weapons/k5_shoot2.wav",
    "weapons/k5_clipout.wav",
    "weapons/k5_clipin.wav",
    "weapons/k5_sliderelease.wav",
    "weapons/k5_slidepull.wav"
};
new bool:HaveK5[33], k5_clip[33], k5_reload[33], k5_event;
new k5damage, k5clip, k5reloadtime, k5recoil;
#endif

#if defined SKULL1
#define SKULL1_WEAPONKEY    205
#define weapon_skull1       "weapon_deagle"
#define CSW_SKULL1      CSW_DEAGLE
new Skull1Model_V[] = "models/furien30_weapons/Secondary/v_skull1.mdl";
new Skull1Model_P[] = "models/furien30_weapons/Secondary/p_skull1.mdl";
new Skull1Model_W[] = "models/furien30_weapons/Secondary/w_skull1.mdl";
new Skull1_Sound[][] = {
    "weapons/skull1_shoot1.wav",
    "weapons/skull1_draw.wav",
    "weapons/skull1_clipin.wav",
    "weapons/skull1_clipout.wav"
};
new Skull1_Generic[][] = {
    //"sprites/furien30_skull1.txt",
    "sprites/furien30_weapons/Skull1.spr",
    "sprites/furien30_weapons/640hud7x.spr"
};
new bool:HaveSkull1[33], skull1_clip[33], skull1_reload[33], skull1_event;
new skull1damage, skull1clip, skull1reloadtime, skull1recoil;
#endif

#if defined ANACONDA
#define ANACONDA_WEAPONKEY  206
#define weapon_anaconda     "weapon_deagle"
#define CSW_ANACONDA        CSW_DEAGLE
new AnacondaModel_V[] = "models/furien30_weapons/Secondary/v_anaconda.mdl";
new AnacondaModel_P[] = "models/furien30_weapons/Secondary/p_anaconda.mdl";
new AnacondaModel_W[] = "models/furien30_weapons/Secondary/w_anaconda.mdl";
new Anaconda_Sound[][] = {
    "weapons/ana_shoot1.wav",
    //"weapons/ana_shoot2.wav",
    "weapons/ana_foley1.wav",
    "weapons/ana_foley2.wav",
    "weapons/ana_foley3.wav",
    "weapons/ana_foley4.wav",
    "weapons/ana_foley5.wav"
};
new Anaconda_Generic[][] = {
    //"sprites/furien30_anaconda.txt",
    "sprites/furien30_weapons/Anaconda.spr",
    "sprites/furien30_weapons/640hud7x.spr"
};
new bool:HaveAnaconda[33], anaconda_clip[33], anaconda_reload[33], anaconda_event;
new anacondadamage, anacondaclip, anacondareloadtime, anacondarecoil;
#endif


public plugin_init() {
    register_plugin(PLUGIN, VERSION, AUTHOR)

    register_clcmd("guns", "CMD_Guns");
    register_clcmd("say guns", "CMD_Guns");
    register_clcmd("say /weapon", "CMD_Guns");
    register_clcmd("say_team guns", "CMD_Guns");
    register_clcmd("say_team /weapon", "CMD_Guns");

    register_logevent("RoundStart", 2, "1=Round_Start");
    register_event("CurWeapon", "EVENT_CurWeapon", "be", "1=1")

    RegisterHam(Ham_Spawn, "player", "HAM_Spawn_Post", 1);

    Shell = engfunc(EngFunc_PrecacheModel, "models/rshell.mdl");

    #if defined OICW
    OICW_Init();
    #endif

    #if defined AT4
    AT4_Init();
    #endif
    #if defined SALAMANDER
    Salamander_Init();
    #endif
    #if defined CROSSBOW
    CrossBow_Init();
    #endif
    #if defined ETHEREAL
    Ethereal_Init();
    #endif

    #if defined QUADBARREL
    QuadBarrel_Init();
    #endif
    #if defined DUALMP7A1
    DualMP7A1_Init();
    #endif
    #if defined K1ASES
    K1ases_Init();
    #endif
    #if defined F2000
    F2000_Init();
    #endif

    #if defined HK416
    HK416_Init();
    #endif
    #if defined AK47KNIFE
    AK47Knife_Init();
    #endif
    #if defined TAR21
    Tar21_Init();
    #endif
    #if defined M134
    M134_Init();
    #endif
    #if defined THOMPSON
    Thompson_Init();
    #endif
    #if defined DUALBARREL
    DualBarrel_Init();
    #endif
    #if defined M1887
    M1887_Init();
    #endif
    #if defined L85
    L85_Init();
    #endif
    #if defined SKULL5
    Skull5_Init();
    #endif
    #if defined SL8
    SL8_Init();
    #endif
    #if defined AW50
    AW50_Init();
    #endif

    #if defined M79
    M79_Init();
    #endif
    #if defined DUALDEAGLE
    DualDeagle_Init();
    #endif
    #if defined INFINITY
    Infinity_Init();
    #endif
    #if defined DEAGLEGOLD
    DeagleGold_Init();
    #endif
    #if defined K5
    K5_Init();
    #endif
    #if defined SKULL1
    Skull1_Init();
    #endif
    #if defined ANACONDA
    Anaconda_Init();
    #endif
}

public plugin_precache() {
    BloodSpray = precache_model("sprites/bloodspray.spr");
    BloodDrop  = precache_model("sprites/blood.spr");

    #if defined OICW
    OICW_Precache();
    #endif

    #if defined AT4
    AT4_Precache();
    #endif
    #if defined SALAMANDER
    Salamander_Precache();
    #endif
    #if defined CROSSBOW
    CrossBow_Precache();
    #endif
    #if defined ETHEREAL
    Ethereal_Precache();
    #endif


    #if defined QUADBARREL
    QuadBarrel_Precache();
    #endif
    #if defined DUALMP7A1
    DualMP7A1_Precache();
    #endif
    #if defined K1ASES
    K1ases_Precache();
    #endif
    #if defined F2000
    F2000_Precache();
    #endif

    #if defined HK416
    HK416_Precache();
    #endif
    #if defined AK47KNIFE
    AK47Knife_Precache();
    #endif
    #if defined TAR21
    Tar21_Precache();
    #endif
    #if defined M134
    M134_Precache();
    #endif
    #if defined THOMPSON
    Thompson_Precache();
    #endif
    #if defined DUALBARREL
    DualBarrel_Precache();
    #endif
    #if defined M1887
    M1887_Precache();
    #endif
    #if defined L85
    L85_Precache();
    #endif
    #if defined SKULL5
    Skull5_Precache();
    #endif
    #if defined SL8
    SL8_Precache();
    #endif
    #if defined AW50
    AW50_Precache();
    #endif

    #if defined M79
    M79_Precache();
    #endif
    #if defined DUALDEAGLE
    DualDeagle_Precache();
    #endif
    #if defined INFINITY
    Infinity_Precache();
    #endif
    #if defined DEAGLEGOLD
    DeagleGold_Precache();
    #endif
    #if defined K5
    K5_Precache();
    #endif
    #if defined SKULL1
    Skull1_Precache();
    #endif
    #if defined ANACONDA
    Anaconda_Precache();
    #endif
}

public plugin_natives() {
    #if defined OICW
    OICW_Natives();
    #endif

    #if defined AT4
    AT4_Natives();
    #endif
    #if defined SALAMANDER
    Salamander_Natives();
    #endif
    #if defined CROSSBOW
    CrossBow_Natives();
    #endif
    #if defined ETHEREAL
    Ethereal_Natives();
    #endif

    #if defined QUADBARREL
    QuadBarrel_Natives();
    #endif
    #if defined DUALMP7A1
    DualMP7A1_Natives();
    #endif
    #if defined K1ASES
    K1ases_Natives();
    #endif
    #if defined F2000
    F2000_Natives();
    #endif

    #if defined HK416
    HK416_Natives();
    #endif
    #if defined AK47KNIFE
    AK47Knife_Natives();
    #endif
    #if defined TAR21
    Tar21_Natives();
    #endif
    #if defined M134
    M134_Natives();
    #endif
    #if defined THOMPSON
    Thompson_Natives();
    #endif
    #if defined DUALBARREL
    DualBarrel_Natives();
    #endif
    #if defined M1887
    M1887_Natives();
    #endif
    #if defined L85
    L85_Natives();
    #endif
    #if defined SKULL5
    Skull5_Natives();
    #endif
    #if defined SL8
    SL8_Natives();
    #endif
    #if defined AW50
    AW50_Natives();
    #endif

    #if defined M79
    M79_Natives();
    #endif
    #if defined DUALDEAGLE
    DualDeagle_Natives();
    #endif
    #if defined INFINITY
    Infinity_Natives();
    #endif
    #if defined DEAGLEGOLD
    DeagleGold_Natives();
    #endif
    #if defined K5
    K5_Natives();
    #endif
    #if defined SKULL1
    Skull1_Natives();
    #endif
    #if defined ANACONDA
    Anaconda_Natives();
    #endif
}

public client_putinserver(id) {
    ShowMenu[id] = true
    PrimaryWeapon[id] = 0
    SecondaryWeapon[id] = 0
}

public RoundStart() {
    #if defined OICW
    remove_entity_name(OICW_CLASS);
    #endif
    #if defined AT4
    remove_entity_name(AT4_CLASS);
    remove_entity_name(AT4_CLASS_DETECTOR);
    remove_entity_name(AT4_CLASS_LASERDOT);
    #endif
    #if defined SALAMANDER
    remove_entity_name(SALAMANDER_CLASS);
    #endif
    #if defined CROSSBOWO
    remove_entity_name(CROSSBOW_CLASS);
    #endif
    #if defined M79
    remove_entity_name(M79_CLASS);
    #endif
}

public EVENT_CurWeapon(id) {
    if(is_user_connected(id) && is_user_alive(id)) {
        static Weapon
        Weapon = read_data(2)


        if(!(AMMOWP_NULL &(1<<Weapon))) {
            static Ammo
            Ammo = fm_get_user_bpammo(id, Weapon)

            if(Ammo < WeaponsAmmo[Weapon][1])
                fm_set_user_bpammo(id, Weapon, WeaponsAmmo[Weapon][1])
        }
    }
}

public HAM_Spawn_Post(id) {
    if(is_user_connected(id)) {
        HavePrimaryWeapon[id] = false
        HaveSecondaryWeapon[id] = false

        #if defined OICW
        set_user_oicw(id, false);
        #endif

        #if defined AT4
        set_user_at4(id, false);
        #endif
        #if defined SALAMANDER
        set_user_salamander(id, false);
        #endif
        #if defined CROSSBOW
        set_user_crossbow(id, false);
        #endif
        #if defined ETHEREAL
        set_user_ethereal(id, false);
        #endif

        #if defined QUADBARREL
        set_user_quadbarrel(id, false);
        #endif
        #if defined DUALMP7A1
        set_user_dualmp7a1(id, false);
        #endif
        #if defined K1ASES
        set_user_k1ases(id, false);
        #endif
        #if defined F2000
        set_user_f2000(id, false);
        #endif

        #if defined HK416
        set_user_hk416(id, false);
        #endif
        #if defined AK47KNIFE
        set_user_ak47knife(id, false);
        #endif
        #if defined TAR21
        set_user_tar21(id, false);
        #endif
        #if defined M134
        set_user_m134(id, false);
        #endif
        #if defined THOMPSON
        set_user_thompson(id, false);
        #endif
        #if defined DUALBARREL
        set_user_dualbarrel(id, false);
        #endif
        #if defined M1887
        set_user_m1887(id, false);
        #endif
        #if defined L85
        set_user_l85(id, false);
        #endif
        #if defined SKULL5
        set_user_skull5(id, false);
        #endif
        #if defined SL8
        set_user_sl8(id, false);
        #endif
        #if defined AW50
        set_user_aw50(id, false);
        #endif

        #if defined M79
        set_user_m79(id, false);
        #endif
        #if defined DUALDEAGLE
        set_user_dualdeagle(id, false);
        #endif
        #if defined INFINITY
        set_user_infinity(id, false);
        #endif
        #if defined DEAGLEGOLD
        set_user_deaglegold(id, false);
        #endif
        #if defined K5
        set_user_k5(id, false);
        #endif
        #if defined SKULL1
        set_user_skull1(id, false);
        #endif
        #if defined ANACONDA
        set_user_anaconda(id, false);
        #endif

        if(ShowMenu[id] && get_user_team(id) == 2)
            Equipment(id)
        else if(!ShowMenu[id] && get_user_team(id) == 2)
            GiveLastWeapons(id)
    }
}

public CMD_Guns(id) {
    if(!ShowMenu[id]) {
        ShowMenu[id] = true
        ColorChat(id, "!g[FURIEN]!n Guns menu has been re-enabled!");
    }
    if(!HavePrimaryWeapon[id] && !HaveSecondaryWeapon[id])
        Equipment(id)
    else if(!HavePrimaryWeapon[id])
        Primary(id)
    else if(!HaveSecondaryWeapon[id])
        Secondary(id)
}

public Equipment(id) {
    if(is_user_alive(id) && get_user_team(id) == 2) {
        Menu = menu_create("\wEquipments.", "EquipmentCmd");
        menu_additem(Menu, "\wNew weapons!", "1", 0);
        if(PrimaryWeapon[id] && SecondaryWeapon[id]) {
            menu_additem(Menu, "\wPrevious Weapons", "2", 0);
            menu_additem(Menu, "\wEvery spawn i want previous weapons.^n", "3", 0);
        }
        else {
            menu_additem(Menu, "\dPrevious Weapons", "2", 0);
            menu_additem(Menu, "\dEvery spawn i want previous weapons.^n", "3", 0);
        }
        menu_setprop(Menu, MPROP_EXIT, MEXIT_NEVER)
        menu_display(id, Menu, 0);
    }
}

public EquipmentCmd(id, menu, item) {
    if(item == MENU_EXIT || !is_user_alive(id) || get_user_team(id) != 2) {
        menu_destroy(menu);
        return PLUGIN_HANDLED;
    }
    new Data[6], Name[64];
    new Access, CallBack;
    menu_item_getinfo(menu, item, Access, Data,5, Name, 63, CallBack);
    new Key = str_to_num(Data);
    switch(Key) {
        case 1: {
            if(!HavePrimaryWeapon[id])
                Primary(id)
            else if(!HaveSecondaryWeapon[id])
                Secondary(id)
        }
        case 2: {
            if(PrimaryWeapon[id] && SecondaryWeapon[id]) {
                GiveLastWeapons(id)
            }
            else Equipment(id)
        }
        case 3: {
            if(PrimaryWeapon[id] && SecondaryWeapon[id]) {
                ShowMenu[id] = false
                GiveLastWeapons(id)
            }
            else Equipment(id)
        }

        default: return PLUGIN_HANDLED;
    }
    menu_destroy(menu);
    return PLUGIN_HANDLED;
}
public Primary(id) {
    if(is_user_alive(id) && get_user_team(id) == 2)
    {
        Menu = menu_create("\w[\yFURIEN\w] \yChoose \rPrimary \yWeapons", "PrimaryCmd");

        if(get_user_flags(id) & OWNER_LEVEL)
            menu_additem(Menu, "\yOwners Weapon", "1", 0);
        else
            menu_additem(Menu, "\dOwners Weapon", "1", 0);

        if(get_user_flags(id) & VIPGOLD_LEVEL)
            menu_additem(Menu, "\rV.I.P Weapons", "2", 0);
        else
            menu_additem(Menu, "\dV.I.P Weapons", "2", 0);

        menu_additem(Menu, "\wOrdinary guns.", "3", 0);

        menu_setprop(Menu, MPROP_EXIT, MEXIT_NEVER)
        menu_display(id, Menu, 0);
    }
}

public PrimaryCmd(id, menu, item) {
    if(item == MENU_EXIT || !is_user_alive(id) || get_user_team(id) != 2) {
        menu_destroy(menu);
        return PLUGIN_HANDLED;
    }
    new Data[6], Name[64];
    new Access, CallBack;
    menu_item_getinfo(menu, item, Access, Data,5, Name, 63, CallBack);
    new Key = str_to_num(Data);
    switch(Key) {
        case 1: {
            if(get_user_flags(id) & OWNER_LEVEL)
                Primary_Owner(id)
            else {
                if(!HavePrimaryWeapon[id])
                    Primary(id)
                else if(!HaveSecondaryWeapon[id])
                    Secondary(id)
                ColorChat(id, "!g[FURIEN]!n You don't have permission on this category.");
            }
        }
        case 2: {
            if(get_user_flags(id) & VIPGOLD_LEVEL)
                Primary_Gold(id)
            else {
                if(!HavePrimaryWeapon[id])
                    Primary(id)
                else if(!HaveSecondaryWeapon[id])
                    Secondary(id)
                ColorChat(id, "!g[FURIEN]!n You don't have permission on this category.");
            }
        }

        case 3: {
            Primary_Normal(id)
        }

        default: return PLUGIN_HANDLED;
    }
    menu_destroy(menu);
    return PLUGIN_HANDLED;
}

public Primary_Owner(id) {
    if(is_user_alive(id) && get_user_team(id) == 2) {
        Menu = menu_create("\w[\yFURIEN\w] \yOwner Weapons", "Primary_OwnerCmd");

        #if defined OICW
        OICW_Menu(id, "1");
        #endif

        menu_setprop(Menu, MPROP_EXITNAME, "Back")
        menu_setprop(Menu, MPROP_EXIT, MEXIT_ALL)
        menu_display(id, Menu, 0);
    }
}

public Primary_OwnerCmd(id, menu, item) {
    if(item == MENU_EXIT || !is_user_alive(id) || get_user_team(id) != 2 || !(get_user_flags(id) & OWNER_LEVEL)) {
        menu_destroy(menu);

        Primary(id)
        return PLUGIN_HANDLED;
    }
    new Data[6], Name[64];
    new Access, CallBack;
    menu_item_getinfo(menu, item, Access, Data,5, Name, 63, CallBack);
    new Key = str_to_num(Data);
    switch(Key) {
        #if defined OICW
        case 1: {
            set_user_oicw(id, true);
            PrimaryWeapon[id] = OICW_WEAPONKEY
            HavePrimaryWeapon[id] = true
            Secondary(id)
        }
        #endif

        default: return PLUGIN_HANDLED;
    }
    menu_destroy(menu);
    return PLUGIN_HANDLED;
}

public Primary_Gold(id) {
    if(is_user_alive(id) && get_user_team(id) == 2) {
        Menu = menu_create("\w[\yFURIEN\w] \rVIP Weapons", "Primary_GoldCmd");

        #if defined AT4
        AT4_Menu(id, "1");
        #endif

        #if defined SALAMANDER
        Salamander_Menu(id, "2");
        #endif

        #if defined CROSSBOW
        CrossBow_Menu(id, "3");
        #endif

        #if defined ETHEREAL
        Ethereal_Menu(id, "4");
        #endif

        #if defined QUADBARREL
        QuadBarrel_Menu(id, "5");
        #endif

        #if defined DUALMP7A1
        DualMP7A1_Menu(id, "6");
        #endif

        #if defined K1ASES
        K1ases_Menu(id, "7");
        #endif

        #if defined F2000
        F2000_Menu(id, "8");
        #endif

        menu_setprop(Menu, MPROP_EXITNAME, "Back")
        menu_setprop(Menu, MPROP_EXIT, MEXIT_ALL)
        menu_display(id, Menu, 0);
    }
}

public Primary_GoldCmd(id, menu, item) {
    if(item == MENU_EXIT || !is_user_alive(id) || get_user_team(id) != 2 || !(get_user_flags(id) & VIPGOLD_LEVEL)) {
        menu_destroy(menu);

        Primary(id)
        return PLUGIN_HANDLED;
    }
    new Data[6], Name[64];
    new Access, CallBack;
    menu_item_getinfo(menu, item, Access, Data,5, Name, 63, CallBack);
    new Key = str_to_num(Data);
    switch(Key) {
        #if defined AT4
        case 1: {
            set_user_at4(id, true);
            PrimaryWeapon[id] = AT4_WEAPONKEY
            HavePrimaryWeapon[id] = true
            Secondary(id)
        }
        #endif

        #if defined SALAMANDER
        case 2: {
            set_user_salamander(id, true);
            PrimaryWeapon[id] = SALAMANDER_WEAPONKEY
            HavePrimaryWeapon[id] = true
            Secondary(id)
        }
        #endif

        #if defined CROSSBOW
        case 3: {
            set_user_crossbow(id, true);
            PrimaryWeapon[id] = CROSSBOW_WEAPONKEY
            HavePrimaryWeapon[id] = true
            Secondary(id)
        }
        #endif

        #if defined ETHEREAL
        case 4: {
            set_user_ethereal(id, true);
            PrimaryWeapon[id] = ETHEREAL_WEAPONKEY
            HavePrimaryWeapon[id] = true
            Secondary(id)
        }
        #endif

        #if defined QUADBARREL
        case 5: {
            set_user_quadbarrel(id, true);
            PrimaryWeapon[id] = QUADBARREL_WEAPONKEY
            HavePrimaryWeapon[id] = true
            Secondary(id)
        }
        #endif

        #if defined DUALMP7A1
        case 6: {
            set_user_dualmp7a1(id, true);
            PrimaryWeapon[id] = DUALMP7A1_WEAPONKEY
            HavePrimaryWeapon[id] = true
            Secondary(id)
        }
        #endif

        #if defined K1ASES
        case 7: {
            set_user_k1ases(id, true);
            PrimaryWeapon[id] = K1ASES_WEAPONKEY
            HavePrimaryWeapon[id] = true
            Secondary(id)
        }
        #endif

        #if defined F2000
        case 8: {
            set_user_f2000(id, true);
            PrimaryWeapon[id] = F2000_WEAPONKEY
            HavePrimaryWeapon[id] = true
            Secondary(id)
        }
        #endif


        default: return PLUGIN_HANDLED;
    }
    menu_destroy(menu);
    return PLUGIN_HANDLED;
}

public Primary_Normal(id) {
    if(is_user_alive(id) && get_user_team(id) == 2) {
        Menu = menu_create("\w[\yFURIEN\w] \yNormal Weapons", "Primary_NormalCmd");

        #if defined HK416
        HK416_Menu("1");
        #endif

        #if defined AK47KNIFE
        AK47Knife_Menu("2");
        #endif

        #if defined TAR21
        Tar21_Menu("3");
        #endif

        #if defined M134
        M134_Menu("4");
        #endif

        #if defined THOMPSON
        Thompson_Menu("5");
        #endif

        #if defined DUALBARREL
        DualBarrel_Menu("6");
        #endif

        #if defined M1887
        M1887_Menu("7");
        #endif

        #if defined L85
        L85_Menu("8");
        #endif

        #if defined SKULL5
        Skull5_Menu("9");
        #endif

        #if defined SL8
        SL8_Menu("10");
        #endif

        #if defined AW50
        AW50_Menu("11");
        #endif
        menu_setprop(Menu, MPROP_EXITNAME, "Back")
        menu_setprop(Menu, MPROP_EXIT, MEXIT_ALL)
        menu_display(id, Menu, 0);
    }
}

public Primary_NormalCmd(id, menu, item) {
    if(item == MENU_EXIT || !is_user_alive(id) || get_user_team(id) != 2) {
        menu_destroy(menu);

        Primary(id)
        return PLUGIN_HANDLED;
    }
    new Data[6], Name[64];
    new Access, CallBack;
    menu_item_getinfo(menu, item, Access, Data,5, Name, 63, CallBack);
    new Key = str_to_num(Data);
    switch(Key) {
        #if defined HK416
        case 1: {
            set_user_hk416(id, true);
            PrimaryWeapon[id] = HK416_WEAPONKEY
            HavePrimaryWeapon[id] = true
            Secondary(id)
        }
        #endif
        #if defined AK47KNIFE
        case 2: {
            set_user_ak47knife(id, true);
            PrimaryWeapon[id] = AK47KNIFE_WEAPONKEY
            HavePrimaryWeapon[id] = true
            Secondary(id)
        }
        #endif
        #if defined TAR21
        case 3: {
            set_user_tar21(id, true);
            PrimaryWeapon[id] = TAR21_WEAPONKEY
            HavePrimaryWeapon[id] = true
            Secondary(id)
        }
        #endif
        #if defined M134
        case 4: {
            set_user_m134(id, true);
            PrimaryWeapon[id] = M134_WEAPONKEY
            HavePrimaryWeapon[id] = true
            Secondary(id)
        }
        #endif
        #if defined THOMPSON
        case 5: {
            set_user_thompson(id, true);
            PrimaryWeapon[id] = THOMPSON_WEAPONKEY
            HavePrimaryWeapon[id] = true
            Secondary(id)
        }
        #endif
        #if defined DUALBARREL
        case 6: {
            set_user_dualbarrel(id, true);
            PrimaryWeapon[id] = DUALBARREL_WEAPONKEY
            HavePrimaryWeapon[id] = true
            Secondary(id)
        }
        #endif
        #if defined M1887
        case 7: {
            set_user_m1887(id, true);
            PrimaryWeapon[id] = M1887_WEAPONKEY
            HavePrimaryWeapon[id] = true
            Secondary(id)
        }
        #endif
        #if defined L85
        case 8: {
            set_user_l85(id, true);
            PrimaryWeapon[id] = L85_WEAPONKEY
            HavePrimaryWeapon[id] = true
            Secondary(id)
        }
        #endif
        #if defined SKULL5
        case 9: {
            set_user_skull5(id, true);
            PrimaryWeapon[id] = SKULL5_WEAPONKEY
            HavePrimaryWeapon[id] = true
            Secondary(id)
        }
        #endif
        #if defined SL8
        case 10: {
            set_user_sl8(id, true);
            PrimaryWeapon[id] = SL8_WEAPONKEY
            HavePrimaryWeapon[id] = true
            Secondary(id)
        }
        #endif
        #if defined AW50
        case 11: {
            set_user_aw50(id, true);
            PrimaryWeapon[id] = AW50_WEAPONKEY
            HavePrimaryWeapon[id] = true
            Secondary(id)
        }
        #endif

        default: return PLUGIN_HANDLED;
    }
    menu_destroy(menu);
    return PLUGIN_HANDLED;
}

public Secondary(id) {
    if(is_user_alive(id)  && get_user_team(id) == 2 && !HaveSecondaryWeapon[id]) {
        Menu = menu_create("\w[\yFURIEN\w] \wSecundary Pistols.", "SecondaryCmd");

        #if defined M79
        M79_Menu(id, "1")
        #endif
        #if defined DUALDEAGLE
        DualDeagle_Menu("2")
        #endif
        #if defined INFINITY
        Infinity_Menu("3")
        #endif
        #if defined DEAGLEGOLD
        DeagleGold_Menu("4")
        #endif
        #if defined K5

        K5_Menu("5")
        #endif
        #if defined SKULL1
        Skull1_Menu("6")
        #endif
        #if defined ANACONDA
        Anaconda_Menu("7")
        #endif

        menu_setprop(Menu, MPROP_EXIT, MEXIT_NEVER)
        menu_display(id, Menu, 0);
    }
    return PLUGIN_CONTINUE;
}

public SecondaryCmd(id, menu, item) {
    if(item == MENU_EXIT || !is_user_alive(id) || get_user_team(id) != 2) {
        menu_destroy(menu);
        return PLUGIN_HANDLED;
    }
    new Data[6], Name[64];
    new Access, CallBack;
    menu_item_getinfo(menu, item, Access, Data,5, Name, 63, CallBack);
    new Key = str_to_num(Data);
    switch(Key) {
        #if defined M79
        case 1: {
            if(get_user_flags(id) & VIPGOLD_LEVEL || get_user_flags(id) & VIPSILVER_LEVEL) {
                set_user_m79(id, true);
                SecondaryWeapon[id] = M79_WEAPONKEY
                HaveSecondaryWeapon[id] = true
            }
            else
                Secondary(id)
        }
        #endif

        #if defined DUALDEAGLE
        case 2: {
            set_user_dualdeagle(id, true);
            SecondaryWeapon[id] = DUALDEAGLE_WEAPONKEY
            HaveSecondaryWeapon[id] = true
        }
        #endif

        #if defined INFINITY
        case 3: {
            set_user_infinity(id, true);
            SecondaryWeapon[id] = INFINITY_WEAPONKEY
            HaveSecondaryWeapon[id] = true
        }
        #endif

        #if defined DEAGLEGOLD
        case 4: {
            set_user_deaglegold(id, true);
            SecondaryWeapon[id] = DEAGLEGOLD_WEAPONKEY
            HaveSecondaryWeapon[id] = true
        }
        #endif

        #if defined K5
        case 5: {
            set_user_k5(id, true);
            SecondaryWeapon[id] = K5_WEAPONKEY
            HaveSecondaryWeapon[id] = true
        }
        #endif

        #if defined SKULL1
        case 6: {
            set_user_skull1(id, true);
            SecondaryWeapon[id] = SKULL1_WEAPONKEY
            HaveSecondaryWeapon[id] = true
        }
        #endif

        #if defined ANACONDA
        case 7: {
            set_user_anaconda(id, true);
            SecondaryWeapon[id] = ANACONDA_WEAPONKEY
            HaveSecondaryWeapon[id] = true
        }
        #endif

        default: return PLUGIN_HANDLED;
    }
    menu_destroy(menu);
    return PLUGIN_HANDLED;
}

public GiveLastWeapons(id) {
    if(!HavePrimaryWeapon[id]) {
        switch(PrimaryWeapon[id]) {
            #if defined OICW
            case OICW_WEAPONKEY: {
                if(get_user_flags(id) & OWNER_LEVEL) {
                    set_user_oicw(id, true)
                    HavePrimaryWeapon[id] = true
                }
                else
                    PrimaryWeapon[id] = 0
            }
            #endif

            #if defined AT4
            case AT4_WEAPONKEY: {
                if(get_user_flags(id) & VIPGOLD_LEVEL) {
                    set_user_at4(id, true)
                    HavePrimaryWeapon[id] = true
                }
                else
                    PrimaryWeapon[id] = 0
            }
            #endif

            #if defined SALAMANDER
            case SALAMANDER_WEAPONKEY: {
                if(get_user_flags(id) & VIPGOLD_LEVEL) {
                    set_user_salamander(id, true)
                    HavePrimaryWeapon[id] = true
                }
                else
                    PrimaryWeapon[id] = 0
            }
            #endif

            #if defined CROSSBOW
            case CROSSBOW_WEAPONKEY: {
                if(get_user_flags(id) & VIPGOLD_LEVEL) {
                    set_user_crossbow(id, true)
                    HavePrimaryWeapon[id] = true
                }
                else
                    PrimaryWeapon[id] = 0
            }
            #endif

            #if defined QUADBARREL
            case QUADBARREL_WEAPONKEY: {
                if(get_user_flags(id) & VIPGOLD_LEVEL) {
                    set_user_quadbarrel(id, true)
                    HavePrimaryWeapon[id] = true
                }
                else
                    PrimaryWeapon[id] = 0
            }
            #endif

            #if defined ETHEREAL
            case ETHEREAL_WEAPONKEY: {
                if(get_user_flags(id) & VIPSILVER_LEVEL) {
                    set_user_ethereal(id, true)
                    HavePrimaryWeapon[id] = true
                }
                else
                    PrimaryWeapon[id] = 0
            }
            #endif

            #if defined K1ASES
            case K1ASES_WEAPONKEY: {
                if(get_user_flags(id) & VIPSILVER_LEVEL) {
                    set_user_k1ases(id, true)
                    HavePrimaryWeapon[id] = true
                }
                else
                    PrimaryWeapon[id] = 0
            }
            #endif

            #if defined F2000
            case F2000_WEAPONKEY: {
                if(get_user_flags(id) & VIPSILVER_LEVEL) {
                    set_user_f2000(id, true)
                    HavePrimaryWeapon[id] = true
                }
                else
                    PrimaryWeapon[id] = 0

            }
            #endif

            #if defined HK416
            case HK416_WEAPONKEY: {
                set_user_hk416(id, true)
                HavePrimaryWeapon[id] = true
            }
            #endif

            #if defined AK47KNIFE
            case AK47KNIFE_WEAPONKEY: {
                set_user_ak47knife(id, true)
                HavePrimaryWeapon[id] = true
            }
            #endif

            #if defined TAR21
            case TAR21_WEAPONKEY: {
                set_user_tar21(id, true)
                HavePrimaryWeapon[id] = true
            }
            #endif

            #if defined M134
            case M134_WEAPONKEY: {
                set_user_m134(id, true)
                HavePrimaryWeapon[id] = true
            }
            #endif

            #if defined THOMPSON
            case THOMPSON_WEAPONKEY: {
                set_user_thompson(id, true)
                HavePrimaryWeapon[id] = true
            }
            #endif

            #if defined DUALBARREL
            case DUALBARREL_WEAPONKEY: {
                set_user_dualbarrel(id, true)
                HavePrimaryWeapon[id] = true
            }
            #endif

            #if defined DUALMP7A1
            case DUALMP7A1_WEAPONKEY: {
                set_user_dualmp7a1(id, true)
                HavePrimaryWeapon[id] = true
            }
            #endif

            #if defined M1887
            case M1887_WEAPONKEY: {
                set_user_m1887(id, true)
                HavePrimaryWeapon[id] = true
            }
            #endif

            #if defined L85
            case L85_WEAPONKEY: {
                set_user_l85(id, true)
                HavePrimaryWeapon[id] = true
            }
            #endif

            #if defined SKULL5
            case SKULL5_WEAPONKEY: {
                set_user_sl8(id, true)
                HavePrimaryWeapon[id] = true
            }
            #endif

            #if defined SL8
            case SL8_WEAPONKEY: {
                set_user_sl8(id, true)
                HavePrimaryWeapon[id] = true
            }
            #endif

            #if defined AW50
            case AW50_WEAPONKEY: {
                set_user_aw50(id, true)
                HavePrimaryWeapon[id] = true
            }
            #endif
        }
    }

    if(!HaveSecondaryWeapon[id]) {
        switch(SecondaryWeapon[id]) {
            #if defined M79
            case M79_WEAPONKEY: {
                if(get_user_flags(id) & VIPGOLD_LEVEL || get_user_flags(id) & VIPSILVER_LEVEL) {
                    set_user_m79(id, true)
                    HaveSecondaryWeapon[id] = true
                }
                else
                    SecondaryWeapon[id] = 0
            }
            #endif
            #if defined DUALDEAGLE
            case DUALDEAGLE_WEAPONKEY: {
                set_user_dualdeagle(id, true)
                HaveSecondaryWeapon[id] = true
            }
            #endif
            #if defined INFINITY
            case INFINITY_WEAPONKEY: {
                set_user_infinity(id, true)
                HaveSecondaryWeapon[id] = true
            }
            #endif
            #if defined DEAGLEGOLD
            case DEAGLEGOLD_WEAPONKEY: {
                set_user_deaglegold(id, true)
                HaveSecondaryWeapon[id] = true
            }
            #endif
            #if defined K5
            case K5_WEAPONKEY: {
                set_user_k5(id, true)
                HaveSecondaryWeapon[id] = true
            }
            #endif
            #if defined SKULL1
            case SKULL1_WEAPONKEY: {
                set_user_skull1(id, true)
                HaveSecondaryWeapon[id] = true
            }
            #endif
            #if defined ANACONDA
            case ANACONDA_WEAPONKEY: {
                set_user_anaconda(id, true)
                HaveSecondaryWeapon[id] = true
            }
            #endif
        }
    }
}


/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//---------------------------------------| OICW |--------------------------------------------------------
//======================================= sDs|Aragon* =======================================================
#if defined OICW
OICW_Init() {
    register_clcmd("furien30_oicw", "Hook_OICW");

    register_message(get_user_msgid("DeathMsg"), "OICW_DeathMsg");

    register_event("CurWeapon", "OICW_ViewModel", "be", "1=1");
    register_event("WeapPickup","OICW_ViewModel","b","1=19");

    register_forward(FM_SetModel, "OICW_WorldModel");
    register_forward(FM_UpdateClientData, "OICW_UpdateClientData_Post", 1);
    register_forward(FM_PlaybackEvent, "OICW_PlaybackEvent");
    register_forward(FM_CmdStart, "OICW_CmdStart");

    RegisterHam(Ham_TakeDamage, "player", "OICW_TakeDamage");
    RegisterHam(Ham_TraceAttack, "worldspawn", "OICW_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "player", "OICW_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_breakable", "OICW_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_wall", "OICW_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door", "OICW_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door_rotating", "OICW_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_plat", "OICW_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_rotating", "OICW_TraceAttack_Post", 1);
    RegisterHam(Ham_Item_Deploy , weapon_oicw, "OICW_Deploy_Post", 1);
    RegisterHam(Ham_Weapon_WeaponIdle, weapon_oicw, "OICW_WeaponIdle_Post", 1)
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_oicw, "OICW_PrimaryAttack");
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_oicw, "OICW_PrimaryAttack_Post", 1);
    RegisterHam(Ham_Item_AddToPlayer, weapon_oicw, "OICW_AddToPlayer");
    RegisterHam(Ham_Weapon_Reload, weapon_oicw, "OICW_Reload");
    RegisterHam(Ham_Weapon_Reload, weapon_oicw, "OICW_Reload_Post", 1);
    RegisterHam(Ham_Item_PostFrame, weapon_oicw, "OICW_PostFrame");

    register_touch(OICW_CLASS, "*", "OICW_Touch");

    oicwdamage = register_cvar("furien30_oicw_damage", "120");          //| OICW Damage |//
    oicwclip = register_cvar("furien30_oicw_clip", "50");               //| OICW Clip |//
    oicwrecoil = register_cvar("furien30_oicw_recoil", "0.5");          //| OICW Recoil |//
    oicwreloadtime = register_cvar("furien30_oicw_reload_time", "3.6");     //| OICW Reload Time |//
    oicwdamage2 = register_cvar("furien30_oicw_damage2", "300");            //| OICW Grenade Damage |//
    oicwreloadtime2 = register_cvar("furien30_oicw_reload_time2", "3.0");       //| OICW Grenade Reload Time |//
    oicwradius = register_cvar("furien30_oicw_radius", "250.0");            //| OICW Grenade Radius |//
    oicwknockback = register_cvar("furien30_oicw_knockback", "6.0");            //| OICW Grenade Knockback |//
}

OICW_Precache() {
    register_forward(FM_PrecacheEvent, "OICW_PrecacheEvent_Post", 1);

    oicw_trail = precache_model("sprites/xbeam3.spr");
    oicw_explode = precache_model("sprites/furien30_weapons/explode.spr");

    precache_model(OICWModel_V);
    precache_model(OICWModel_P);
    precache_model(OICWModel_W);
    precache_model(OICWModel_S);
    for(new i = 0; i < sizeof(OICW_Sound); i++)
        engfunc(EngFunc_PrecacheSound, OICW_Sound);
    for(new i = 0; i < sizeof(OICW_Generic); i++)
        engfunc(EngFunc_PrecacheGeneric, OICW_Generic);
}

OICW_Natives() {
    register_native("get_user_oicw", "get_user_oicw", 1);
    register_native("set_user_oicw", "set_user_oicw", 1);
}

OICW_Menu(id, const Num[] = "1") {
    new _OICW[256];
    if(get_user_flags(id) & OWNER_LEVEL)
        formatex(_OICW,sizeof(_OICW)-1,"\wOICW");
    else
        formatex(_OICW,sizeof(_OICW)-1,"\dOICW \w- \rOnly OWNER\w");
    menu_additem(Menu, _OICW, Num, 0);
}

public OICW_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, "galil") && get_user_weapon(Attacker) == CSW_OICW) {
        if(get_user_oicw(Attacker))
            set_msg_arg_string(4, "OICW");
    }
    return PLUGIN_CONTINUE;
}

public OICW_ViewModel(id) {
    if(get_user_weapon(id) == CSW_OICW && get_user_oicw(id)) {
        set_pev(id, pev_viewmodel2, OICWModel_V);
        set_pev(id, pev_weaponmodel2, OICWModel_P);
    }
}

public OICW_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 _OICW = find_ent_by_owner(-1, weapon_oicw, entity);

    if(get_user_oicw(Owner) && is_valid_ent(_OICW) && equal(model, "models/w_galil.mdl")) {
        entity_set_int(_OICW, EV_INT_impulse, OICW_WEAPONKEY);
        HaveOICW[Owner] = false;
        entity_set_model(entity, OICWModel_W);
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}

public OICW_UpdateClientData_Post(id, sendweapons, cd_handle) {
    if(is_user_alive(id) && is_user_connected(id)) {
        if(get_user_weapon(id) == CSW_OICW && get_user_oicw(id))
            set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001);
    }
}

public OICW_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 != oicw_event)
        return FMRES_IGNORED;

    playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2);

    return FMRES_SUPERCEDE;
}

public OICW_PrecacheEvent_Post(type, const name[]) {
    if (equal("events/galil.sc", name)) {
        oicw_event = get_orig_retval();
        return FMRES_HANDLED;
    }
    return FMRES_IGNORED;
}

public OICW_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);

        static _OICW;
        _OICW = fm_find_ent_by_owner(-1, weapon_oicw, id);

        if(CurButton & IN_ATTACK && oicw_launcher[id]) {
            if(get_user_weapon(id) == CSW_OICW && get_user_oicw(id)) {
                if(cs_get_weapon_ammo(_OICW) > 0 && !oicw_reload[id] && NextAttack <= 0.0) {
                    set_weapon_anim(id, 7);
                    emit_sound(id, CHAN_WEAPON, OICW_Sound[1], 1.0, ATTN_NORM, 0, PITCH_NORM);

                    OICW_Fire(id);

                    static Float:PunchAngles[3];

                    PunchAngles[0] = random_float(-5.0, -10.0);
                    PunchAngles[1] = 0.0;
                    PunchAngles[2] = 0.0;

                    set_pev(id, pev_punchangle, PunchAngles);
                    cs_set_weapon_ammo(_OICW, cs_get_weapon_ammo(_OICW) - 1);
                    if(cs_get_weapon_ammo(_OICW) > 0 && !oicw_reload[id] && NextAttack <= 0.0)
                        set_pdata_float(id, 83, oicw_shotdelay, 5);
                }
                CurButton &= ~IN_ATTACK;
                set_uc(uc_handle, UC_Buttons, CurButton);
            }
        }

        if(CurButton & IN_ATTACK2 && !(pev(id, pev_oldbuttons) & IN_ATTACK2)) {
            if(get_user_weapon(id) == CSW_OICW && get_user_oicw(id) && NextAttack <= 0.0) {
                if(oicw_launcher[id]) {
                    oicw_launcher[id] = false;
                    cs_set_weapon_ammo(_OICW, OICWCarabineAmmo[id]);
                    set_pdata_float(_OICW, 48, 2.3, 4)
                    set_pdata_float(id, 83, 1.2, 5);
                    set_weapon_anim(id, 10)
                }
                else {
                    oicw_launcher[id] = true;
                    OICWCarabineAmmo[id] = cs_get_weapon_ammo(_OICW)
                    cs_set_weapon_ammo(_OICW, 1);
                    set_pdata_float(_OICW, 48, 2.3, 4)
                    set_pdata_float(id, 83, 1.2, 5);
                    set_weapon_anim(id, 9)

                }
            }
            CurButton &= ~IN_ATTACK2;
            set_uc(uc_handle, UC_Buttons, CurButton);
        }

    }
}

public OICW_TakeDamage(victim, inflictor, attacker, Float:damage, damagetype) {
    if(is_user_connected(attacker) && !(damagetype & DMG_HEGRENADE)) {
        new Body, Target, Float:NewDamage;
        if(get_user_weapon(attacker) == CSW_OICW && get_user_oicw(attacker)) {
            if(is_user_connected(victim)) {
                get_user_aiming(attacker, Target, Body, 999999);
                NewDamage = float(get_damage_body(Body, get_pcvar_float(oicwdamage)));
                SetHamParamFloat(4, NewDamage);
            }
            else {
                SetHamParamFloat(4, get_pcvar_float(oicwdamage));
            }
        }
    }
}

public OICW_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_OICW)
        return HAM_IGNORED;
    if(!get_user_oicw(attacker))
        return HAM_IGNORED;

    static Float:End[3];
    get_tr2(pentru, TR_vecEndPos, End);

    Make_Bullet(attacker, End);

    return HAM_HANDLED;
}

public OICW_AddToPlayer(Weapon, id) {
    if(is_valid_ent(Weapon) && is_user_connected(id) && entity_get_int(Weapon, EV_INT_impulse) == OICW_WEAPONKEY) {
        HaveOICW[id] = true;
        OICWCarabineAmmo[id] = get_pcvar_num(oicwclip)
        entity_set_int(Weapon, EV_INT_impulse, 0);
        WeaponList(id, OICW_WEAPONKEY)
    }
}

public OICW_Deploy_Post(entity) {
    static Owner;
    Owner = get_pdata_cbase(entity, 41, 4);
    if(get_user_oicw(Owner)) {
        set_pev(Owner, pev_viewmodel2, OICWModel_V);
        set_pev(Owner, pev_weaponmodel2, OICWModel_P);
        set_pdata_float(Owner, 83, 1.2, 5);
        set_weapon_anim(Owner, 5)
        static clip;
        clip = cs_get_weapon_ammo(entity);
        if(clip > 0)
            oicw_reload[Owner] = 0;
    }
}

public OICW_WeaponIdle_Post(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_oicw(id))
        return HAM_IGNORED;

    if(get_pdata_float(ent, 48, 4) <= 0.1)  {
        set_weapon_anim(id, oicw_launcher[id] ? 6 : 0)
        set_pdata_float(ent, 48, 2.7, 4)
    }
    return HAM_IGNORED;
}

public OICW_PrimaryAttack(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);

    if (get_user_oicw(id)) {
        pev(id,pev_punchangle,cl_pushangle[id]);
        oicw_clip[id] = cs_get_weapon_ammo(Weapon);
    }
}

public OICW_PrimaryAttack_Post(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);
    new ActiveItem = get_pdata_cbase(id, 373) ;

    if(oicw_clip[id] > 0 && pev_valid(ActiveItem)) {
        if(is_user_alive(id) && get_user_oicw(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(oicwrecoil),Push);
            xs_vec_add(Push,cl_pushangle[id],Push);
            set_pev(id,pev_punchangle,Push);

            emit_sound(id, CHAN_WEAPON, OICW_Sound[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
            set_weapon_anim(id, random_num(1, 3))
        }
    }
}

public OICW_Reload(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_oicw(id))
        return HAM_IGNORED;

    oicw_clip[id] = -1;

    new Ammo = cs_get_user_bpammo(id, CSW_OICW);
    if(Ammo <= 0)
        return HAM_SUPERCEDE;

    new Clip = get_pdata_int(ent, 51, 4);
    if(Clip >= get_pcvar_num(oicwclip))
        return HAM_SUPERCEDE;

    oicw_clip[id] = Clip;
    oicw_reload[id] = 1;

    return HAM_IGNORED;
}

public OICW_Reload_Post(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_oicw(id))
        return HAM_IGNORED;

    if(oicw_clip[id] == -1)
        return HAM_IGNORED;

    new Float:reload_time = oicw_launcher[id] ? get_pcvar_float(oicwreloadtime2) : get_pcvar_float(oicwreloadtime);

    set_pdata_int(ent, 51, oicw_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);
    if(!oicw_launcher[id])
        set_weapon_anim(id, 4)

    return HAM_IGNORED;
}

public OICW_PostFrame(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_oicw(id))
        return HAM_IGNORED;

    new Float:NextAttack = get_pdata_float(id, 83, 5);
    new Ammo = cs_get_user_bpammo(id, CSW_OICW);

    new Clip = get_pdata_int(ent, 51, 4);
    new InReload = get_pdata_int(ent, 54, 4);

    if(InReload && NextAttack <= 0.0) {
        new Temp = min((oicw_launcher[id] ? 1 : get_pcvar_num(oicwclip)) - Clip, Ammo);

        set_pdata_int(ent, 51, Clip + Temp, 4);
        cs_set_user_bpammo(id, CSW_OICW, Ammo - Temp);
        set_pdata_int(ent, 54, 0, 4);

        InReload = 0;
        oicw_reload[id] = 0;

        if(!oicw_launcher[id])
            OICWCarabineAmmo[id] = get_pcvar_num(oicwclip)
    }

    return HAM_IGNORED;
}

public OICW_Fire(id) {
    new ent, Float:Origin[3], Float:Angles[3], Float:Velocity[3];

    ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
    engfunc(EngFunc_GetAttachment, id, 0, Origin, Angles);
    pev(id, pev_angles, Angles);

    set_pev(ent, pev_origin, Origin);
    set_pev(ent, pev_angles, Angles);
    set_pev(ent, pev_solid, 2);
    set_pev(ent, pev_movetype, MOVETYPE_PUSHSTEP);

    set_pev(ent, pev_classname, OICW_CLASS);

    set_pev(ent, pev_owner, id);
    engfunc(EngFunc_SetModel, ent, OICWModel_S);

    set_pev(ent, pev_mins, {-1.0, -1.0, -1.0});
    set_pev(ent, pev_maxs, {1.0, 1.0, 1.0});

    velocity_by_aim(id, 2000, Velocity);
    set_pev(ent, pev_velocity, Velocity);

    message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
    write_byte(TE_BEAMFOLLOW); // TE id
    write_short(ent); // entity:attachment to follow
    write_short(oicw_trail); // sprite index
    write_byte(25); // life in 0.1's
    write_byte(1); // line width in 0.1's
    write_byte(255); // r
    write_byte(0); // g
    write_byte(0); // b
    write_byte(200); // brightness
    message_end();

    set_pev(ent, pev_iuser4, 0);
}

public OICW_Touch(grenade, touch) {
    if(is_valid_ent(grenade)) {
        static Float:GrenadeOrigin[3];
        pev(grenade, pev_origin, GrenadeOrigin);
        new id = pev(grenade, pev_owner);

        message_begin(MSG_BROADCAST ,SVC_TEMPENTITY);
        write_byte(TE_EXPLOSION);
        engfunc(EngFunc_WriteCoord, GrenadeOrigin[0]);
        engfunc(EngFunc_WriteCoord, GrenadeOrigin[1]);
        engfunc(EngFunc_WriteCoord, GrenadeOrigin[2]);
        write_short(oicw_explode);  // sprite index
        write_byte(20);         // scale in 0.1's
        write_byte(30);         // framerate
        write_byte(0);          // flags
        message_end();

        message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
        write_byte(TE_WORLDDECAL)
        engfunc(EngFunc_WriteCoord, GrenadeOrigin[0])
        engfunc(EngFunc_WriteCoord, GrenadeOrigin[1])
        engfunc(EngFunc_WriteCoord, GrenadeOrigin[2])
        write_byte(random_num(46, 48))
        message_end()

        if(is_user_connected(touch) && is_user_alive(touch) && !fm_get_user_godmode(touch) && get_user_team(touch) != get_user_team(id) && touch != id) {
            new Float:Damage = get_pcvar_float(oicwdamage2);

            new Float:VictimOrigin[3]
            pev(touch, pev_origin, VictimOrigin);
            new BloodColor = ExecuteHam(Ham_BloodColor, touch);
            if(BloodColor != -1) {
                new Amount = floatround(Damage);

                Amount *= 2; //according to HLSDK

                message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
                write_byte(TE_BLOODSPRITE);
                write_coord(floatround(VictimOrigin[0]));
                write_coord(floatround(VictimOrigin[1]));
                write_coord(floatround(VictimOrigin[2]));
                write_short(BloodSpray);
                write_short(BloodDrop);
                write_byte(BloodColor);
                write_byte(min(max(3, Amount/10), 16));
                message_end();
            }

            make_knockback(touch, GrenadeOrigin, get_pcvar_float(oicwknockback) * Damage);

            if(get_user_health(touch) - Damage >= 1) {
                ExecuteHam(Ham_TakeDamage, touch, id, id, Damage, DMG_BLAST);

                message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("Damage"), _, touch);
                write_byte(0);
                write_byte(0);
                write_long(DMG_BLAST);
                write_coord(0) ;
                write_coord(0);
                write_coord(0);
                message_end();

                message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("ScreenFade"), {0,0,0}, touch);
                write_short(1<<13);
                write_short(1<<14);
                write_short(0x0000);
                write_byte(255);
                write_byte(255);
                write_byte(255);
                write_byte(100) ;
                message_end();

                message_begin(MSG_ONE, get_user_msgid("ScreenShake"), {0,0,0}, touch);
                write_short(0xFFFF);
                write_short(1<<13);
                write_short(0xFFFF) ;
                message_end();
            }
            else {
                death_message(id, touch, "OICW");
            }

        }
        else {
            static ClassName[32];
            pev(touch, pev_classname, ClassName, charsmax(ClassName));
            if(equal(ClassName, "func_breakable")) {
                if(entity_get_float(touch, EV_FL_health) <= get_pcvar_num(oicwdamage2)) {
                    force_use(id, touch);
                }
            }
        }

        for(new Victim = 1; Victim < get_maxplayers(); Victim++) {
            if(is_user_connected(Victim) && is_user_alive(Victim) && !fm_get_user_godmode(Victim) && get_user_team(Victim) != get_user_team(id) && Victim != id && Victim != touch) {
                new Float:VictimOrigin[3], Float:Distance_F, Distance;
                pev(Victim, pev_origin, VictimOrigin);
                Distance_F = get_distance_f(GrenadeOrigin, VictimOrigin);
                Distance = floatround(Distance_F);
                if(Distance <= get_pcvar_float(oicwradius)) {
                    new Float:DistanceRatio, Float:Damage;
                    DistanceRatio = floatdiv(float(Distance), get_pcvar_float(oicwradius));
                    Damage = get_pcvar_float(oicwdamage2) - floatround(floatmul(get_pcvar_float(oicwdamage2), DistanceRatio));

                    new BloodColor = ExecuteHam(Ham_BloodColor, Victim);
                    if(BloodColor != -1) {
                        new Amount = floatround(Damage);

                        Amount *= 2; //according to HLSDK

                        message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
                        write_byte(TE_BLOODSPRITE);
                        write_coord(floatround(VictimOrigin[0]));
                        write_coord(floatround(VictimOrigin[1]));
                        write_coord(floatround(VictimOrigin[2]));
                        write_short(BloodSpray);
                        write_short(BloodDrop);
                        write_byte(BloodColor);
                        write_byte(min(max(3, Amount/10), 16));
                        message_end();
                    }

                    make_knockback(Victim, GrenadeOrigin, get_pcvar_float(oicwknockback)*Damage);

                    if(get_user_health(Victim) - Damage >= 1) {
                        ExecuteHam(Ham_TakeDamage, Victim, id, id, Damage, DMG_BLAST);

                        message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("Damage"), _, Victim);
                        write_byte(0);
                        write_byte(0);
                        write_long(DMG_BLAST);
                        write_coord(0) ;
                        write_coord(0);
                        write_coord(0);
                        message_end();

                        message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("ScreenFade"), {0,0,0}, Victim);
                        write_short(1<<13);
                        write_short(1<<14);
                        write_short(0x0000);
                        write_byte(255);
                        write_byte(255);
                        write_byte(255);
                        write_byte(100) ;
                        message_end();

                        message_begin(MSG_ONE, get_user_msgid("ScreenShake"), {0,0,0}, Victim);
                        write_short(0xFFFF);
                        write_short(1<<13);
                        write_short(0xFFFF) ;
                        message_end();
                    }
                    else {
                        death_message(id, Victim, "OICW");
                    }
                }
            }
            else {
                static ClassName[32];
                pev(Victim, pev_classname, ClassName, charsmax(ClassName));
                if(equal(ClassName, "func_breakable")) {
                    if(entity_get_float(Victim, EV_FL_health) <= get_pcvar_num(oicwdamage2)) {
                        force_use(id, Victim);
                    }
                }
            }
        }
        engfunc(EngFunc_RemoveEntity, grenade);
    }
}

public Hook_OICW(id) {
    engclient_cmd(id, weapon_oicw);
}

public get_user_oicw(id) {
    return HaveOICW[id];
}

public set_user_oicw(id, oicw) {
    if(oicw) {
        if(!HaveOICW[id]) {
            drop_primary_weapons(id);
            HaveOICW[id] = true;
            oicw_reload[id] = 0;
            WeaponList(id, OICW_WEAPONKEY)
            fm_give_item(id, weapon_oicw);
            new Clip = fm_get_user_weapon_entity(id, CSW_OICW);
            cs_set_weapon_ammo(Clip, oicw_launcher[id] ? 1 : get_pcvar_num(oicwclip));
            OICWCarabineAmmo[id] = get_pcvar_num(oicwclip)
        }
    }
    else {
        if(HaveOICW[id]) {
            HaveOICW[id] = false;
        }
    }
}
#endif


/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//---------------------------------------| AT4 |--------------------------------------------------------
//======================================= sDs|Aragon* =======================================================
#if defined AT4
AT4_Init() {
    register_clcmd("furien30_at4", "Hook_AT4");

    register_event("CurWeapon", "AT4_ViewModel", "be", "1=1");
    register_event("WeapPickup","AT4_ViewModel","b","1=19");

    register_forward(FM_SetModel, "AT4_WorldModel");
    register_forward(FM_UpdateClientData, "AT4_UpdateClientData_Post", 1);
    register_forward(FM_CmdStart, "AT4_CmdStart");

    RegisterHam(Ham_Item_Deploy , weapon_at4, "AT4_Deploy_Post", 1);
    RegisterHam(Ham_Item_Holster , weapon_at4, "AT4_Holster");
    RegisterHam(Ham_Item_AddToPlayer, weapon_at4, "AT4_AddToPlayer");
    RegisterHam(Ham_Weapon_Reload, weapon_at4, "AT4_Reload");
    RegisterHam(Ham_Weapon_Reload, weapon_at4, "AT4_Reload_Post", 1);
    RegisterHam(Ham_Item_PostFrame, weapon_at4, "AT4_PostFrame");

    register_think(AT4_CLASS, "AT4_Think");
    register_think(AT4_CLASS_DETECTOR, "AT4_Think2");
    register_think(AT4_CLASS_LASERDOT, "AT4_LaserDot_Think");

    register_touch(AT4_CLASS, "*", "AT4_Touch");
    register_touch(AT4_CLASS_DETECTOR, "*", "AT4_Touch2");

    at4damage = register_cvar("furien30_at4_damage", "200.0");      //| AT4 Damage |//
    at4damage2 = register_cvar("furien30_at4_damage2", "100.0");        //| At4 Damage2 |//
    at4radius = register_cvar("furien30_at4_radius", "220.0");      //| AT4 Radius |//
    at4knockback = register_cvar("furien30_at4_knockback", "8");        //| At4 KnockBack |//
    at4reloadtime = register_cvar("furien30_at4_reload_time", "3.33");  //| AT4 Reload Time |//
}

AT4_Precache() {
    at4_smoke = precache_model("sprites/effects/rainsplash.spr");
    at4_trail = precache_model("sprites/xbeam3.spr");
    at4_explode = precache_model("sprites/furien30_weapons/explode.spr");

    precache_model(AT4Model_V);
    precache_model(AT4Model_P);
    precache_model(AT4Model_W);
    precache_model(AT4Model_S);
    precache_model(AT4Model_LASER);

    for(new i = 0; i < sizeof(AT4_Sound); i++)
        engfunc(EngFunc_PrecacheSound, AT4_Sound);
    for(new i = 0; i < sizeof(AT4_Generic); i++)
        engfunc(EngFunc_PrecacheGeneric, AT4_Generic);
}

AT4_Natives() {
    register_native("get_user_at4", "get_user_at4", 1);
    register_native("set_user_at4", "set_user_at4", 1);
}

AT4_Menu(id, const Num[] = "1") {
    new _AT4[256];
    if(get_user_flags(id) & VIPGOLD_LEVEL)
        formatex(_AT4,sizeof(_AT4)-1,"\wAT4");
    else
        formatex(_AT4,sizeof(_AT4)-1,"\dAT4 \w- \rOnly VIP\w");
    menu_additem(Menu, _AT4, Num, 0);
}

public AT4_ViewModel(id) {
    if(get_user_weapon(id) == CSW_AT4 && get_user_at4(id)) {
        set_pev(id, pev_viewmodel2, AT4Model_V);
        set_pev(id, pev_weaponmodel2, AT4Model_P);
        set_pdata_int(id, 361, get_pdata_int(id, 361) | (1<<6));
    }
}

public AT4_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 _AT4 = find_ent_by_owner(-1, weapon_at4, entity);

    if(get_user_at4(Owner) && is_valid_ent(_AT4) && equal(model, "models/w_m249.mdl")) {
        entity_set_int(_AT4, EV_INT_impulse, AT4_WEAPONKEY);
        HaveAT4[Owner] = false;
        entity_set_model(entity, AT4Model_W);
        set_pdata_int(Owner, 361, get_pdata_int(Owner, 361) & ~ (1<<6));
        new Laser = find_ent_by_owner(-1, AT4_CLASS_LASERDOT, Owner);
        if(is_valid_ent(Laser))
            remove_entity(Laser);
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}

public AT4_UpdateClientData_Post(id, sendweapons, cd_handle) {
    if(is_user_alive(id) && is_user_connected(id)) {
        if(get_user_weapon(id) == CSW_AT4 && get_user_at4(id))
            set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001);
    }
}

public AT4_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);

        static _AT4;
        _AT4 = fm_find_ent_by_owner(-1, weapon_at4, id);

        if(get_user_weapon(id) == CSW_AT4 && get_user_at4(id) && at4_detector[id]) {
            new Float: origin[3];
            fm_get_aim_origin(id,origin);
            new Laser = find_ent_by_owner(-1, AT4_CLASS_LASERDOT, id);

            if(!is_valid_ent(Laser)) {
                new at4_laser = create_entity("info_target");
                set_pev(at4_laser, pev_classname, AT4_CLASS_LASERDOT);
                set_pev(at4_laser, pev_owner, id);
                engfunc(EngFunc_SetModel, at4_laser, AT4Model_LASER);
                set_pev(at4_laser, pev_renderfx, kRenderFxNoDissipation);
                set_pev(at4_laser, pev_rendermode, kRenderGlow);
                set_pev(at4_laser, pev_renderamt, 255.0);
                set_pev(at4_laser, pev_light_level, 255.0);
                set_pev(at4_laser, pev_scale, 1.0);
                set_pev(at4_laser, pev_movetype, MOVETYPE_FLY);
                set_pev(at4_laser, pev_nextthink, halflife_time() + 0.001);
            }
        }
        else {
            new Laser = find_ent_by_owner(-1, AT4_CLASS_LASERDOT, id);
            if(is_valid_ent(Laser))
                remove_entity(Laser);
        }

        if(CurButton & IN_ATTACK) {
            if(get_user_weapon(id) == CSW_AT4 && get_user_at4(id)) {
                if(cs_get_weapon_ammo(_AT4) > 0 && !at4_reload[id] && NextAttack <= 0.0) {
                    set_weapon_anim(id, 1);
                    emit_sound(id, CHAN_WEAPON, AT4_Sound[0], 1.0, ATTN_NORM, 0, PITCH_NORM);

                    if(at4_detector[id])
                        AT4_Fire(id, 0);
                    else
                        AT4_Fire(id, 1);

                    static Float:PunchAngles[3];

                    PunchAngles[0] = random_float(-15.0, -20.0);
                    PunchAngles[1] = 0.0;
                    PunchAngles[2] = 0.0;

                    set_pev(id, pev_punchangle, PunchAngles);
                    cs_set_weapon_ammo(_AT4, cs_get_weapon_ammo(_AT4) - 1);
                    if(cs_get_weapon_ammo(_AT4) > 0 && !at4_reload[id] && NextAttack <= 0.0)
                        set_pdata_float(id, 83, at4_shotdelay, 5);
                }
                CurButton &= ~IN_ATTACK;
                set_uc(uc_handle, UC_Buttons, CurButton);
            }
        }

        if(CurButton & IN_ATTACK2 && !(pev(id, pev_oldbuttons) & IN_ATTACK2)) {
            if(get_user_weapon(id) == CSW_AT4 && get_user_at4(id) && NextAttack <= 0.0) {
                if(at4_detector[id]) {
                    at4_detector[id] = false;
                }
                else {
                    at4_detector[id] = true;
                }
            }
        }

    }
}

public AT4_AddToPlayer(Weapon, id) {
    if(is_valid_ent(Weapon) && is_user_connected(id) && entity_get_int(Weapon, EV_INT_impulse) == AT4_WEAPONKEY) {
        HaveAT4[id] = true;
        entity_set_int(Weapon, EV_INT_impulse, 0);
        WeaponList(id, AT4_WEAPONKEY)
    }
}

public AT4_Deploy_Post(entity) {
    static Owner;
    Owner = get_pdata_cbase(entity, 41, 4);
    if(get_user_at4(Owner)) {
        set_pev(Owner, pev_viewmodel2, AT4Model_V);
        set_pev(Owner, pev_weaponmodel2, AT4Model_P);
        set_pdata_float(Owner, 83, 1.16, 5);
        set_weapon_anim(Owner, 4);
        static clip;
        clip = cs_get_weapon_ammo(entity);
        if(clip > 0)
            at4_reload[Owner] = 0;
        set_pdata_int(Owner, 361, get_pdata_int(Owner, 361) | (1<<6));
    }
}

public AT4_Holster(entity) {
    static Owner;
    Owner = get_pdata_cbase(entity, 41, 4);
    if(get_user_at4(Owner)) {
        set_pdata_int(Owner, 361, get_pdata_int(Owner, 361) & ~ (1<<6));
    }
}

public AT4_Reload(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_at4(id))
        return HAM_IGNORED;

    at4_clip[id] = -1;

    new Ammo = cs_get_user_bpammo(id, CSW_AT4);
    if(Ammo <= 0)
        return HAM_SUPERCEDE;

    new Clip = get_pdata_int(ent, 51, 4);
    if(Clip >= 1)
        return HAM_SUPERCEDE;

    at4_clip[id] = Clip;
    at4_reload[id] = 1;

    return HAM_IGNORED;
}

public AT4_Reload_Post(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_at4(id))
        return HAM_IGNORED;

    if(at4_clip[id] == -1)
        return HAM_IGNORED;

    new Float:reload_time = get_pcvar_float(at4reloadtime);

    set_pdata_int(ent, 51, at4_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 AT4_PostFrame(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_at4(id))
        return HAM_IGNORED;

    new Float:NextAttack = get_pdata_float(id, 83, 5);
    new Ammo = cs_get_user_bpammo(id, CSW_AT4);

    new Clip = get_pdata_int(ent, 51, 4);
    new InReload = get_pdata_int(ent, 54, 4);

    if(InReload && NextAttack <= 0.0) {
        new Temp = min(1 - Clip, Ammo);

        set_pdata_int(ent, 51, Clip + Temp, 4);
        cs_set_user_bpammo(id, CSW_AT4, Ammo - Temp);
        set_pdata_int(ent, 54, 0, 4);

        InReload = 0;
        at4_reload[id] = 0;
    }

    return HAM_IGNORED;
}

public AT4_Fire(id, type) {
    new ent, Float:Origin[3], Float:Angles[3], Float:Velocity[3];

    ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
    engfunc(EngFunc_GetAttachment, id, 0, Origin, Angles);
    pev(id, pev_angles, Angles);

    set_pev(ent, pev_origin, Origin);
    set_pev(ent, pev_angles, Angles);
    set_pev(ent, pev_solid, 2);
    set_pev(ent, pev_movetype, 5);

    if(type > 0)
        set_pev(ent, pev_classname, AT4_CLASS);
    else
        set_pev(ent, pev_classname, AT4_CLASS_DETECTOR);

    set_pev(ent, pev_owner, id);
    engfunc(EngFunc_SetModel, ent, AT4Model_S);

    set_pev(ent, pev_mins, {-1.0, -1.0, -1.0});
    set_pev(ent, pev_maxs, {1.0, 1.0, 1.0});

    velocity_by_aim(id, 2000, Velocity);
    set_pev(ent, pev_velocity, Velocity);

    message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
    write_byte(TE_BEAMFOLLOW); // TE id
    write_short(ent); // entity:attachment to follow
    write_short(at4_trail); // sprite index
    write_byte(25); // life in 0.1's
    write_byte(2); // line width in 0.1's
    write_byte(255); // r
    write_byte(255); // g
    write_byte(255); // b
    write_byte(200); // brightness
    message_end();

    set_pev(ent, pev_iuser4, 0);
    set_pev(ent, pev_nextthink, halflife_time() + 0.1);
}

public AT4_Think(ent) {
    if(is_valid_ent(ent)) {
        static Float:Origin[3];
        pev(ent, pev_origin, Origin);

        message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
        write_byte(TE_SPRITE);
        engfunc(EngFunc_WriteCoord, Origin[0]);
        engfunc(EngFunc_WriteCoord, Origin[1]);
        engfunc(EngFunc_WriteCoord, Origin[2]);
        write_short(at4_smoke);
        write_byte(2);
        write_byte(200);
        message_end();

        set_pev(ent, pev_nextthink, halflife_time() + 0.075);
    }
}

public AT4_Think2(ent) {
    if(is_valid_ent(ent)) {
        static Float:Origin[3];
        pev(ent, pev_origin, Origin);

        message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
        write_byte(TE_SPRITE);
        engfunc(EngFunc_WriteCoord, Origin[0]);
        engfunc(EngFunc_WriteCoord, Origin[1]);
        engfunc(EngFunc_WriteCoord, Origin[2]);
        write_short(at4_smoke);
        write_byte(2);
        write_byte(200);
        message_end();
        if(pev(ent, pev_iuser4) == 0) {
            static Victim;
            Victim = FindClosesEnemy(ent);

            if(is_user_alive(Victim)) {
                set_pev(ent, pev_iuser4, Victim);
            }
        }
        else {
            static Victim;
            Victim = pev(ent, pev_iuser4);

            if(is_user_alive(Victim)) {
                static Float:VicOrigin[3];
                pev(Victim, pev_origin, VicOrigin);

                hook_ent(ent, Victim, 2000.0);
            }
            else {
                set_pev(ent, pev_iuser4, 0);
            }
        }

        set_pev(ent, pev_nextthink, halflife_time() + 0.075);
    }
}

public AT4_LaserDot_Think(entity) {
    if(is_valid_ent(entity)) {
        new Owner, Float:origin[3];
        Owner = pev(entity, pev_owner);
        pev(Owner, pev_origin, origin);
        fm_get_aim_origin(Owner, origin);

        set_pev(entity, pev_origin, origin);
        set_pev(entity, pev_nextthink, halflife_time() + 0.001);
    }
}

public AT4_Touch(rocket, touch) {
    if(is_valid_ent(rocket)) {
        static Float:RocketOrigin[3];
        pev(rocket, pev_origin, RocketOrigin);
        new id = pev(rocket, pev_owner);

        message_begin(MSG_BROADCAST ,SVC_TEMPENTITY);
        write_byte(TE_EXPLOSION);
        engfunc(EngFunc_WriteCoord, RocketOrigin[0]);
        engfunc(EngFunc_WriteCoord, RocketOrigin[1]);
        engfunc(EngFunc_WriteCoord, RocketOrigin[2]);
        write_short(at4_explode);   // sprite index
        write_byte(40);         // scale in 0.1's
        write_byte(30);         // framerate
        write_byte(0);          // flags
        message_end();

        message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
        write_byte(TE_WORLDDECAL)
        engfunc(EngFunc_WriteCoord, RocketOrigin[0])
        engfunc(EngFunc_WriteCoord, RocketOrigin[1])
        engfunc(EngFunc_WriteCoord, RocketOrigin[2])
        write_byte(random_num(46, 48))
        message_end()

        if(is_user_connected(touch) && is_user_alive(touch) && !fm_get_user_godmode(touch) && get_user_team(touch) != get_user_team(id) && touch != id) {
            new Float:VictimOrigin[3]
            pev(touch, pev_origin, VictimOrigin);

            new Float:Damage = get_pcvar_float(at4damage)

            new BloodColor = ExecuteHam(Ham_BloodColor, touch);
            if(BloodColor != -1) {
                new Amount = floatround(Damage);

                Amount *= 2; //according to HLSDK

                message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
                write_byte(TE_BLOODSPRITE);
                write_coord(floatround(VictimOrigin[0]));
                write_coord(floatround(VictimOrigin[1]));
                write_coord(floatround(VictimOrigin[2]));
                write_short(BloodSpray);
                write_short(BloodDrop);
                write_byte(BloodColor);
                write_byte(min(max(3, Amount/10), 16));
                message_end();
            }

            make_knockback(touch, RocketOrigin, get_pcvar_float(at4knockback) * Damage);

            if(get_user_health(touch) - Damage >= 1) {
                ExecuteHam(Ham_TakeDamage, touch, id, id, Damage, DMG_BLAST);

                message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("Damage"), _, touch);
                write_byte(0);
                write_byte(0);
                write_long(DMG_BLAST);
                write_coord(0) ;
                write_coord(0);
                write_coord(0);
                message_end();

                message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("ScreenFade"), {0,0,0}, touch);
                write_short(1<<13);
                write_short(1<<14);
                write_short(0x0000);
                write_byte(255);
                write_byte(255);
                write_byte(255);
                write_byte(100) ;
                message_end();

                message_begin(MSG_ONE, get_user_msgid("ScreenShake"), {0,0,0}, touch);
                write_short(0xFFFF);
                write_short(1<<13);
                write_short(0xFFFF) ;
                message_end();
            }
            else {
                death_message(id, touch, "AT4");
            }
        }

        else {
            static ClassName[32];
            pev(touch, pev_classname, ClassName, charsmax(ClassName));
            if(equal(ClassName, "func_breakable")) {
                if(entity_get_float(touch, EV_FL_health) <= get_pcvar_num(at4damage)) {
                    force_use(id, touch);
                }
            }
        }
        for(new Victim = 1; Victim < get_maxplayers(); Victim++) {
            if(is_user_connected(Victim) && is_user_alive(Victim) && !fm_get_user_godmode(Victim) && get_user_team(Victim) != get_user_team(id) && Victim != id && Victim != touch) {
                new Float:VictimOrigin[3], Float:Distance_F, Distance;
                pev(Victim, pev_origin, VictimOrigin);
                Distance_F = get_distance_f(RocketOrigin, VictimOrigin);
                Distance = floatround(Distance_F);
                if(Distance <= get_pcvar_float(at4radius)) {
                    new Float:DistanceRatio, Float:Damage;
                    DistanceRatio = floatdiv(float(Distance), get_pcvar_float(at4radius));
                    Damage = get_pcvar_float(at4damage) - floatround(floatmul(get_pcvar_float(at4damage), DistanceRatio));

                    new BloodColor = ExecuteHam(Ham_BloodColor, Victim);
                    if(BloodColor != -1) {
                        new Amount = floatround(Damage);

                        Amount *= 2; //according to HLSDK

                        message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
                        write_byte(TE_BLOODSPRITE);
                        write_coord(floatround(VictimOrigin[0]));
                        write_coord(floatround(VictimOrigin[1]));
                        write_coord(floatround(VictimOrigin[2]));
                        write_short(BloodSpray);
                        write_short(BloodDrop);
                        write_byte(BloodColor);
                        write_byte(min(max(3, Amount/10), 16));
                        message_end();
                    }

                    make_knockback(Victim, RocketOrigin, get_pcvar_float(at4knockback)*Damage);

                    if(get_user_health(Victim) - Damage >= 1) {
                        ExecuteHam(Ham_TakeDamage, Victim, id, id, Damage, DMG_BLAST);

                        message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("Damage"), _, Victim);
                        write_byte(0);
                        write_byte(0);
                        write_long(DMG_BLAST);
                        write_coord(0) ;
                        write_coord(0);
                        write_coord(0);
                        message_end();

                        message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("ScreenFade"), {0,0,0}, Victim);
                        write_short(1<<13);
                        write_short(1<<14);
                        write_short(0x0000);
                        write_byte(255);
                        write_byte(255);
                        write_byte(255);
                        write_byte(100) ;
                        message_end();

                        message_begin(MSG_ONE, get_user_msgid("ScreenShake"), {0,0,0}, Victim);
                        write_short(0xFFFF);
                        write_short(1<<13);
                        write_short(0xFFFF) ;
                        message_end();
                    }
                    else {
                        death_message(id, Victim, "AT4");
                    }
                }
            }
        }
        engfunc(EngFunc_RemoveEntity, rocket);
    }
}

public AT4_Touch2(rocket, touch) {
    if(is_valid_ent(rocket)) {
        static Float:RocketOrigin[3];
        pev(rocket, pev_origin, RocketOrigin);
        new id = pev(rocket, pev_owner);

        message_begin(MSG_BROADCAST ,SVC_TEMPENTITY);
        write_byte(TE_EXPLOSION);
        engfunc(EngFunc_WriteCoord, RocketOrigin[0]);
        engfunc(EngFunc_WriteCoord, RocketOrigin[1]);
        engfunc(EngFunc_WriteCoord, RocketOrigin[2]);
        write_short(at4_explode);   // sprite index
        write_byte(40);         // scale in 0.1's
        write_byte(30);         // framerate
        write_byte(0);          // flags
        message_end();

        message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
        write_byte(TE_WORLDDECAL)
        engfunc(EngFunc_WriteCoord, RocketOrigin[0])
        engfunc(EngFunc_WriteCoord, RocketOrigin[1])
        engfunc(EngFunc_WriteCoord, RocketOrigin[2])
        write_byte(random_num(46, 48))
        message_end()

        for(new Victim = 1; Victim < get_maxplayers(); Victim++) {
            if(is_user_connected(Victim) && is_user_alive(Victim) && !fm_get_user_godmode(Victim) && get_user_team(Victim) != get_user_team(id) && Victim != id) {
                new Float:VictimOrigin[3], Float:Distance_F, Distance;
                pev(Victim, pev_origin, VictimOrigin);
                Distance_F = get_distance_f(RocketOrigin, VictimOrigin);
                Distance = floatround(Distance_F);

                if(Distance <= get_pcvar_float(at4radius)) {
                    new Float:DistanceRatio, Float:Damage;
                    DistanceRatio = floatdiv(float(Distance), get_pcvar_float(at4radius));
                    Damage = get_pcvar_float(at4damage2) - floatround(floatmul(get_pcvar_float(at4damage2), DistanceRatio));

                    new BloodColor = ExecuteHam(Ham_BloodColor, Victim);
                    if(BloodColor != -1) {
                        new Amount = floatround(Damage);

                        Amount *= 2; //according to HLSDK

                        message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
                        write_byte(TE_BLOODSPRITE);
                        write_coord(floatround(VictimOrigin[0]));
                        write_coord(floatround(VictimOrigin[1]));
                        write_coord(floatround(VictimOrigin[2]));
                        write_short(BloodSpray);
                        write_short(BloodDrop);
                        write_byte(BloodColor);
                        write_byte(min(max(3, Amount/10), 16));
                        message_end();
                    }

                    make_knockback(Victim, RocketOrigin, get_pcvar_float(at4knockback)*Damage);

                    if(get_user_health(Victim) - Damage >= 1) {
                        ExecuteHam(Ham_TakeDamage, Victim, id, id, Damage, DMG_BLAST);

                        message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("Damage"), _, Victim);
                        write_byte(0);
                        write_byte(0);
                        write_long(DMG_BLAST);
                        write_coord(0) ;
                        write_coord(0);
                        write_coord(0);
                        message_end();

                        message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("ScreenFade"), {0,0,0}, Victim);
                        write_short(1<<13);
                        write_short(1<<14);
                        write_short(0x0000);
                        write_byte(255);
                        write_byte(255);
                        write_byte(255);
                        write_byte(100) ;
                        message_end();

                        message_begin(MSG_ONE, get_user_msgid("ScreenShake"), {0,0,0}, Victim);
                        write_short(0xFFFF);
                        write_short(1<<13);
                        write_short(0xFFFF) ;
                        message_end();
                    }
                    else {
                        death_message(id, Victim, "AT4");
                    }
                }
            }
        }
        static ClassName[32];
        pev(touch, pev_classname, ClassName, charsmax(ClassName));
        if(equal(ClassName, "func_breakable")) {
            if(entity_get_float(touch, EV_FL_health) <= get_pcvar_num(at4damage2)) {
                force_use(id, touch);
            }
        }

        engfunc(EngFunc_RemoveEntity, rocket);
    }
}

public Hook_AT4(id) {
    engclient_cmd(id, weapon_at4);
}

public get_user_at4(id) {
    return HaveAT4[id];
}

public set_user_at4(id, at4) {
    if(at4) {
        if(!HaveAT4[id]) {
            drop_primary_weapons(id);
            HaveAT4[id] = true;
            at4_reload[id] = 0;
            WeaponList(id, AT4_WEAPONKEY)
            fm_give_item(id, weapon_at4);
            new Clip = fm_get_user_weapon_entity(id, CSW_AT4);
            cs_set_weapon_ammo(Clip, 1);
        }
    }
    else {
        if(HaveAT4[id]) {
            HaveAT4[id] = false;
        }
    }
}

stock FindClosesEnemy(entid) {
    new Float:Dist;
    new Float:maxdistance=300.0;
    new indexid=0;
    for(new i=1;i<=get_maxplayers();i++){
        if(is_user_alive(i) && is_valid_ent(i) && can_see_fm(entid, i)
        && pev(entid, pev_owner) != i && cs_get_user_team(pev(entid, pev_owner)) != cs_get_user_team(i)) {
            Dist = entity_range(entid, i);
            if(Dist <= maxdistance) {
                maxdistance=Dist;
                indexid=i;

                return indexid;
            }
        }
    }
    return 0;
}
stock bool:can_see_fm(entindex1, entindex2) {
    if(!entindex1 || !entindex2)
        return false;

    if(pev_valid(entindex1) && pev_valid(entindex1)) {
        new flags = pev(entindex1, pev_flags);
        if(flags & EF_NODRAW || flags & FL_NOTARGET) {
            return false;
        }

        new Float:lookerOrig[3];
        new Float:targetBaseOrig[3];
        new Float:targetOrig[3];
        new Float:temp[3];

        pev(entindex1, pev_origin, lookerOrig);
        pev(entindex1, pev_view_ofs, temp);
        lookerOrig[0] += temp[0];
        lookerOrig[1] += temp[1];
        lookerOrig[2] += temp[2];

        pev(entindex2, pev_origin, targetBaseOrig);
        pev(entindex2, pev_view_ofs, temp);
        targetOrig[0] = targetBaseOrig[0] + temp[0];
        targetOrig[1] = targetBaseOrig[1] + temp[1];
        targetOrig[2] = targetBaseOrig[2] + temp[2];

        engfunc(EngFunc_TraceLine, lookerOrig, targetOrig, 0, entindex1, 0); //  checks the had of seen player
        if(get_tr2(0, TraceResult:TR_InOpen) && get_tr2(0, TraceResult:TR_InWater)) {
            return false;
        }
        else {
            new Float:flFraction;
            get_tr2(0, TraceResult:TR_flFraction, flFraction);
            if(flFraction == 1.0 ||(get_tr2(0, TraceResult:TR_pHit) == entindex2)) {
                return true;
            }
            else {
                targetOrig[0] = targetBaseOrig[0];
                targetOrig[1] = targetBaseOrig[1];
                targetOrig[2] = targetBaseOrig[2];
                engfunc(EngFunc_TraceLine, lookerOrig, targetOrig, 0, entindex1, 0); //  checks the body of seen player
                get_tr2(0, TraceResult:TR_flFraction, flFraction);
                if(flFraction == 1.0 ||(get_tr2(0, TraceResult:TR_pHit) == entindex2)) {
                    return true;
                }
                else {
                    targetOrig[0] = targetBaseOrig[0];
                    targetOrig[1] = targetBaseOrig[1];
                    targetOrig[2] = targetBaseOrig[2] - 17.0;
                    engfunc(EngFunc_TraceLine, lookerOrig, targetOrig, 0, entindex1, 0); //  checks the legs of seen player
                    get_tr2(0, TraceResult:TR_flFraction, flFraction);
                    if(flFraction == 1.0 ||(get_tr2(0, TraceResult:TR_pHit) == entindex2)) {
                        return true;
                    }
                }
            }
        }
    }
    return false;
}
stock hook_ent(ent, victim, Float:speed) {
    static Float:fl_Velocity[3];
    static Float:VicOrigin[3], Float:EntOrigin[3];

    pev(ent, pev_origin, EntOrigin);
    pev(victim, pev_origin, VicOrigin);

    static Float:distance_f;
    distance_f = get_distance_f(EntOrigin, VicOrigin);

    if(distance_f > 10.0) {
        new Float:fl_Time = distance_f / speed;

        fl_Velocity[0] = (VicOrigin[0] - EntOrigin[0]) / fl_Time;
        fl_Velocity[1] = (VicOrigin[1] - EntOrigin[1]) / fl_Time;
        fl_Velocity[2] = (VicOrigin[2] - EntOrigin[2]) / fl_Time;
    }
    else {
        fl_Velocity[0] = 0.0;
        fl_Velocity[1] = 0.0;
        fl_Velocity[2] = 0.0;
    }

    entity_set_vector(ent, EV_VEC_velocity, fl_Velocity);
}
#endif

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//--------------------------------------| Salamander |-------------------------------------------------------
//======================================= sDs|Aragon* =======================================================
#if defined SALAMANDER
Salamander_Init() {
    register_clcmd("furien30_salamander", "Hook_Salamander");

    register_event("CurWeapon", "Salamander_ViewModel", "be", "1=1");
    register_event("WeapPickup","Salamander_ViewModel","b","1=19");

    register_forward(FM_SetModel, "Salamander_WorldModel");
    register_forward(FM_UpdateClientData, "Salamander_UpdateClientData", 1);
    register_forward(FM_CmdStart, "Salamander_CmdStart");

    RegisterHam(Ham_Item_Deploy , weapon_salamander, "Salamander_Deploy_Post", 1);
    RegisterHam(Ham_Item_AddToPlayer, weapon_salamander, "Salamander_AddToPlayer");
    RegisterHam(Ham_Weapon_Reload, weapon_salamander, "Salamander_Reload");
    RegisterHam(Ham_Weapon_Reload, weapon_salamander, "Salamander_Reload_Post", 1);
    RegisterHam(Ham_Item_PostFrame, weapon_salamander, "Salamander_PostFrame");

    register_think(SALAMANDER_CLASS, "Salamander_Think");

    register_touch(SALAMANDER_CLASS, "*", "Salamander_Touch");

    salamanderdamage = register_cvar("furien30_salamander_damage", "30.0");     //| Salamander Damage |//
    salamanderclip = register_cvar("furien30_salamander_clip", "120");      //| Salamander Clip |//
    salamanderreloadtime = register_cvar("furien30_salamander_reload_time", "5.0"); //| Salamander Reload Time |//
    salamanderradius = register_cvar("furien30_salamander_radius", "50.0");     //| Salamander Radius |//
}

Salamander_Precache() {
    register_forward(FM_PrecacheEvent, "Salamander_PrecacheEvent_Post", 1);
    precache_model(SalamanderModel_FIRE);

    precache_model(SalamanderModel_V);
    precache_model(SalamanderModel_P);
    precache_model(SalamanderModel_W);
    precache_model(SalamanderModel_FIRE);
    for(new i = 0; i < sizeof(Salamander_Sound); i++)
        engfunc(EngFunc_PrecacheSound, Salamander_Sound);
    for(new i = 0; i < sizeof(Salamander_Generic); i++)
        engfunc(EngFunc_PrecacheGeneric, Salamander_Generic);
}

Salamander_Natives() {
    register_native("get_user_salamander", "get_user_salamander", 1);
    register_native("set_user_salamander", "set_user_salamander", 1);
}

Salamander_Menu(id, const Num[] = "1") {
    new Salamander[256];
    if(get_user_flags(id) & VIPGOLD_LEVEL)
        formatex(Salamander,sizeof(Salamander)-1,"\wSalamander");
    else
        formatex(Salamander,sizeof(Salamander)-1,"\dSalamander \w- \rOnly VIP\w");
    menu_additem(Menu, Salamander, Num, 0);
}

public Salamander_ViewModel(id) {
    if(get_user_weapon(id) == CSW_SALAMANDER && get_user_salamander(id)) {
        set_pev(id, pev_viewmodel2, SalamanderModel_V);
        set_pev(id, pev_weaponmodel2, SalamanderModel_P);
    }
}

public Salamander_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 Salamander = find_ent_by_owner(-1, weapon_salamander, entity);

    if(get_user_salamander(Owner) && is_valid_ent(Salamander) && equal(model, "models/w_m249.mdl")) {
        entity_set_int(Salamander, EV_INT_impulse, SALAMANDER_WEAPONKEY);
        HaveSalamander[Owner] = false;
        entity_set_model(entity, SalamanderModel_W);
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}

public Salamander_UpdateClientData(id, sendweapons, cd_handle) {
    if(is_user_alive(id) && is_user_connected(id)) {
        if(get_user_weapon(id) == CSW_SALAMANDER && get_user_salamander(id))
            set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001);
    }
}

public Salamander_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);
        static Salamander;
        Salamander = fm_find_ent_by_owner(-1, weapon_salamander, id);


        if(CurButton & IN_ATTACK) {
            if(get_user_weapon(id) == CSW_SALAMANDER && get_user_salamander(id) && pev(id, pev_waterlevel) <= 1) {
                if(cs_get_weapon_ammo(Salamander) > 0 && !salamander_reload[id] && NextAttack <= 0.0) {
                    set_weapon_anim(id, 1);
                    emit_sound(id, CHAN_WEAPON, Salamander_Sound[0], 1.0, ATTN_NORM, 0, PITCH_NORM);

                    Salamander_Fire(id);

                    static Float:PunchAngles[3];

                    PunchAngles[0] = random_float(-3.0, -5.0);
                    PunchAngles[1] = 0.0;
                    PunchAngles[2] = 0.0;

                    set_pev(id, pev_punchangle, PunchAngles);
                    cs_set_weapon_ammo(Salamander, cs_get_weapon_ammo(Salamander) - 1);
                    if(cs_get_weapon_ammo(Salamander) > 0 && !salamander_reload[id] && NextAttack <= 0.0)
                        set_pdata_float(id, 83, salamander_shotdelay, 5);
                }
                CurButton &= ~IN_ATTACK;
                set_uc(uc_handle, UC_Buttons, CurButton);
            }
        }
        if(!(CurButton & IN_ATTACK) &&(pev(id, pev_oldbuttons) & IN_ATTACK) && pev(id, pev_weaponanim) == 1) {
            if(get_user_weapon(id) == CSW_SALAMANDER && get_user_salamander(id)) {
                if(cs_get_weapon_ammo(Salamander) > 0 && !salamander_reload[id]) {
                    set_weapon_anim(id, 2);
                }
            }
        }

    }
}

public Salamander_AddToPlayer(Weapon, id) {
    if(is_valid_ent(Weapon) && is_user_connected(id) && entity_get_int(Weapon, EV_INT_impulse) == SALAMANDER_WEAPONKEY) {
        HaveSalamander[id] = true;
        entity_set_int(Weapon, EV_INT_impulse, 0);
        WeaponList(id, SALAMANDER_WEAPONKEY)
    }
}

public Salamander_Deploy_Post(entity) {
    static Owner;
    Owner = get_pdata_cbase(entity, 41, 4);
    if(get_user_salamander(Owner)) {
        set_pev(Owner, pev_viewmodel2, SalamanderModel_V);
        set_pev(Owner, pev_weaponmodel2, SalamanderModel_P);
        set_pdata_float(Owner, 83, 1.16, 5);
        set_weapon_anim(Owner, 4);
        static clip;
        clip = cs_get_weapon_ammo(entity);
        if(clip > 0)
            salamander_reload[Owner] = 0;
    }
}

public Salamander_Reload(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_salamander(id))
        return HAM_IGNORED;

    salamander_clip[id] = -1;

    new Ammo = cs_get_user_bpammo(id, CSW_SALAMANDER);
    if(Ammo <= 0)
        return HAM_SUPERCEDE;

    new Clip = get_pdata_int(ent, 51, 4);
    if(Clip >= get_pcvar_num(salamanderclip))
        return HAM_SUPERCEDE;

    salamander_clip[id] = Clip;
    salamander_reload[id] = 1;

    return HAM_IGNORED;
}

public Salamander_Reload_Post(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_salamander(id))
        return HAM_IGNORED;

    if(salamander_clip[id] == -1)
        return HAM_IGNORED;

    new Float:reload_time = get_pcvar_float(salamanderreloadtime);

    set_pdata_int(ent, 51, salamander_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 Salamander_PostFrame(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_salamander(id))
        return HAM_IGNORED;

    new Float:NextAttack = get_pdata_float(id, 83, 5);
    new Ammo = cs_get_user_bpammo(id, CSW_SALAMANDER);

    new Clip = get_pdata_int(ent, 51, 4);
    new InReload = get_pdata_int(ent, 54, 4);

    if(InReload && NextAttack <= 0.0) {
        new Temp = min(get_pcvar_num(salamanderclip) - Clip, Ammo);

        set_pdata_int(ent, 51, Clip + Temp, 4);
        cs_set_user_bpammo(id, CSW_SALAMANDER, Ammo - Temp);
        set_pdata_int(ent, 54, 0, 4);

        InReload = 0;
        salamander_reload[id] = 0;
    }

    return HAM_IGNORED;
}

public Salamander_Fire(id) {
    new ent, Float:Origin[3], Float:Angles[3], Float:Velocity[3];
    ent = create_entity("env_sprite");
    engfunc(EngFunc_GetAttachment, id, 0, Origin, Angles);
    pev(id, pev_angles, Angles);

    set_pev(ent, pev_movetype, MOVETYPE_FLY);
    set_pev(ent, pev_rendermode, kRenderTransAdd);
    set_pev(ent, pev_renderamt, 250.0);
    set_pev(ent, pev_scale, 0.5);

    entity_set_string(ent, EV_SZ_classname, SALAMANDER_CLASS);
    engfunc(EngFunc_SetModel, ent, SalamanderModel_FIRE);
    set_pev(ent, pev_mins, Float:{-1.0, -1.0, -1.0});
    set_pev(ent, pev_maxs, Float:{1.0, 1.0, 1.0});
    set_pev(ent, pev_origin, Origin);
    set_pev(ent, pev_gravity, 0.01);
    set_pev(ent, pev_angles, Angles);
    set_pev(ent, pev_solid, SOLID_TRIGGER);
    set_pev(ent, pev_owner, id)
    set_pev(ent, pev_frame, 0.0);

    velocity_by_aim(id, fm_get_speed(id) + 500, Velocity);
    set_pev(ent, pev_velocity, Velocity);

    set_pev(ent, pev_nextthink, halflife_time() + 0.040);
}

public Salamander_Think(ent) {
    if(is_valid_ent(ent)) {
        static Float:FireOrigin[3];
        pev(ent, pev_origin, FireOrigin);
        //new id = pev(ent, pev_owner);

        new origin[3];
        FVecIVec(FireOrigin,origin);

        message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
        write_byte(TE_DLIGHT);
        write_coord(origin[0]); // x
        write_coord(origin[1]); // y
        write_coord(origin[2]); // z
        write_byte(floatround(get_pcvar_float(salamanderradius) / 10.0)); // radius
        write_byte(255); // red
        write_byte(150); // green
        write_byte(15); // blue
        write_byte(1); // life
        write_byte(60); // decay rate
        message_end();

        set_pev(ent, pev_nextthink, halflife_time() + 0.040);

        new Float:Frame, Float:Scale
        pev(ent, pev_frame, Frame);
        pev(ent, pev_scale, Scale);

        Frame += 1.0;
        Scale += 0.1;

        set_pev(ent, pev_frame, Frame);
        set_pev(ent, pev_scale, Scale);

        if(Frame >= 21.0)
            set_pev(ent, pev_flags, pev(ent, pev_flags) | FL_KILLME);
    }
}

public Salamander_Touch(fire, touch) {
    if(is_valid_ent(fire)) {
        static Float:FireOrigin[3];
        pev(fire, pev_origin, FireOrigin);
        new id = pev(fire, pev_owner);
        static ClassName[32];
        pev(touch, pev_classname, ClassName, charsmax(ClassName));

        message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
        write_byte(TE_WORLDDECAL)
        engfunc(EngFunc_WriteCoord, FireOrigin[0])
        engfunc(EngFunc_WriteCoord, FireOrigin[1])
        engfunc(EngFunc_WriteCoord, FireOrigin[2])
        write_byte(random_num(46, 48))
        message_end()

        if(is_user_connected(touch) && is_user_alive(touch) && !fm_get_user_godmode(touch) && get_user_team(touch) != get_user_team(id) && touch != id) {
            new Float:VictimOrigin[3]
            pev(touch, pev_origin, VictimOrigin);

            new Float:Damage = get_pcvar_float(salamanderdamage)
            new BloodColor = ExecuteHam(Ham_BloodColor, touch);
            if(BloodColor != -1) {
                new Amount = floatround(Damage);

                Amount *= 2; //according to HLSDK

                message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
                write_byte(TE_BLOODSPRITE);
                write_coord(floatround(VictimOrigin[0]));
                write_coord(floatround(VictimOrigin[1]));
                write_coord(floatround(VictimOrigin[2]));
                write_short(BloodSpray);
                write_short(BloodDrop);
                write_byte(BloodColor);
                write_byte(min(max(3, Amount/10), 16));
                message_end();
            }

            if(get_user_health(touch) - Damage >= 1) {
                ExecuteHam(Ham_TakeDamage, touch, id, id, Damage, DMG_BURN);

                message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("Damage"), _, touch);
                write_byte(0);
                write_byte(0);
                write_long(DMG_BURN);
                write_coord(0) ;
                write_coord(0);
                write_coord(0);
                message_end();

                message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("ScreenFade"), {0,0,0}, touch);
                write_short(1<<13);
                write_short(1<<14);
                write_short(0x0000);
                write_byte(255);
                write_byte(0);
                write_byte(0);
                write_byte(100) ;
                message_end();

                message_begin(MSG_ONE, get_user_msgid("ScreenShake"), {0,0,0}, touch);
                write_short(0xFFFF);
                write_short(1<<13);
                write_short(0xFFFF) ;
                message_end();
            }
            else {
                death_message(id, touch, "Salamander");
            }
        }

        else {
            if(equal(ClassName, "func_breakable")) {
                if(entity_get_float(touch, EV_FL_health) <= get_pcvar_float(salamanderdamage) * 2) {
                    force_use(id, touch);
                }
            }
        }

        for(new Victim = 1; Victim < get_maxplayers(); Victim++) {
            if(is_user_connected(Victim) && is_user_alive(Victim) && !fm_get_user_godmode(Victim) && get_user_team(Victim) != get_user_team(id) && Victim != id && Victim != touch) {
                new Float:VictimOrigin[3], Float:Distance_F, Distance;
                pev(Victim, pev_origin, VictimOrigin);
                Distance_F = get_distance_f(FireOrigin, VictimOrigin);
                Distance = floatround(Distance_F);

                if(Distance <= get_pcvar_float(salamanderradius)) {
                    new Float:DistanceRatio, Float:Damage;
                    DistanceRatio = floatdiv(float(Distance), get_pcvar_float(salamanderdamage));
                    Damage = get_pcvar_float(salamanderdamage) - floatround(floatmul(get_pcvar_float(salamanderdamage), DistanceRatio));
                    new BloodColor = ExecuteHam(Ham_BloodColor, touch);
                    if(BloodColor != -1) {
                        new Amount = floatround(Damage);

                        Amount *= 2; //according to HLSDK

                        message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
                        write_byte(TE_BLOODSPRITE);
                        write_coord(floatround(VictimOrigin[0]));
                        write_coord(floatround(VictimOrigin[1]));
                        write_coord(floatround(VictimOrigin[2]));
                        write_short(BloodSpray);
                        write_short(BloodDrop);
                        write_byte(BloodColor);
                        write_byte(min(max(3, Amount/10), 16));
                        message_end();
                    }

                    if(get_user_health(Victim) - Damage >= 1) {
                        if(Damage > 0)
                            ExecuteHam(Ham_TakeDamage, Victim, id, id, Damage, DMG_BURN);

                        message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("Damage"), _, Victim);
                        write_byte(0);
                        write_byte(0);
                        write_long(DMG_BURN);
                        write_coord(0) ;
                        write_coord(0);
                        write_coord(0);
                        message_end();

                        message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("ScreenFade"), {0,0,0}, Victim);
                        write_short(1<<13);
                        write_short(1<<14);
                        write_short(0x0000);
                        write_byte(255);
                        write_byte(0);
                        write_byte(0);
                        write_byte(100) ;
                        message_end();

                        message_begin(MSG_ONE, get_user_msgid("ScreenShake"), {0,0,0}, Victim);
                        write_short(0xFFFF);
                        write_short(1<<13);
                        write_short(0xFFFF) ;
                        message_end();
                    }
                    else {
                        death_message(id, Victim, "Salamander");
                    }
                }
            }
        }

        if(id != touch && !equal(ClassName, SALAMANDER_CLASS)) {
            set_pev(fire, pev_movetype, MOVETYPE_NONE);
            set_pev(fire, pev_solid, SOLID_NOT);
        }
    }
}

public Hook_Salamander(id) {
    engclient_cmd(id, weapon_salamander);
}

public get_user_salamander(id) {
    return HaveSalamander[id];
}

public set_user_salamander(id, salamander) {
    if(salamander) {
        if(!HaveSalamander[id]) {
            drop_primary_weapons(id);
            HaveSalamander[id] = true;
            salamander_reload[id] = 0;
            WeaponList(id, SALAMANDER_WEAPONKEY)
            fm_give_item(id, weapon_salamander);
            new Clip = fm_get_user_weapon_entity(id, CSW_SALAMANDER);
            cs_set_weapon_ammo(Clip, get_pcvar_num(salamanderclip));
        }
    }
    else {
        if(HaveSalamander[id]) {
            HaveSalamander[id] = false;
        }
    }
}
#endif

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//---------------------------------------| CrossBow |--------------------------------------------------------
//======================================= sDs|Aragon* =======================================================
#if defined CROSSBOW
CrossBow_Init() {
    register_clcmd("furien30_crossbow", "Hook_CrossBow");

    register_event("CurWeapon", "CrossBow_ViewModel", "be", "1=1");
    register_event("WeapPickup","CrossBow_ViewModel","b","1=19");

    register_forward(FM_SetModel, "CrossBow_WorldModel");
    register_forward(FM_UpdateClientData, "CrossBow_UpdateClientData_Post", 1);
    register_forward(FM_CmdStart, "CrossBow_CmdStart");

    RegisterHam(Ham_Item_Deploy , weapon_crossbow, "CrossBow_Deploy_Post", 1);
    RegisterHam(Ham_Item_Holster , weapon_crossbow, "CrossBow_Holster");
    RegisterHam(Ham_Item_AddToPlayer, weapon_crossbow, "CrossBow_AddToPlayer");
    RegisterHam(Ham_Weapon_Reload, weapon_crossbow, "CrossBow_Reload");
    RegisterHam(Ham_Weapon_Reload, weapon_crossbow, "CrossBow_Reload_Post", 1);
    RegisterHam(Ham_Item_PostFrame, weapon_crossbow, "CrossBow_PostFrame");

    register_touch(CROSSBOW_CLASS, "*", "CrossBow_Touch");

    crossbowdamage = register_cvar("furien30_crossbow_damage", "100");          //| CrossBow Damage |//
    crossbowclip = register_cvar("furien30_crossbow_clip", "20");           //| CrossBow Clip |//
    crossbowreloadtime = register_cvar("furien30_crossbow_reload_time", "3.33");    //| CrossBow Reload Time |//
    crossbowradius = register_cvar("furien30_crossbow_radius", "200");          //| CrossBow Radius |//
    crossbowknockback = register_cvar("furien30_crossbow_knockback", "6");      //| CrossBow KnockBack |//
}

CrossBow_Precache() {
    BloodSpray = precache_model("sprites/bloodspray.spr");
    BloodDrop  = precache_model("sprites/blood.spr");

    crossbow_trail = precache_model("sprites/xbeam3.spr");
    crossbow_explode = precache_model("sprites/furien30_weapons/explode.spr");

    precache_model(CrossBowModel_V);
    precache_model(CrossBowModel_P);
    precache_model(CrossBowModel_W);
    precache_model(CrossBowModel_S);
    for(new i = 0; i < sizeof(CrossBow_Sound); i++)
        engfunc(EngFunc_PrecacheSound, CrossBow_Sound);
    for(new i = 0; i < sizeof(CrossBow_Generic); i++)
        engfunc(EngFunc_PrecacheGeneric, CrossBow_Generic);
}

CrossBow_Natives() {
    register_native("get_user_crossbow", "get_user_crossbow", 1);
    register_native("set_user_crossbow", "set_user_crossbow", 1);
}

CrossBow_Menu(id, const Num[] = "1") {
    new CrossBow[256];
    if(get_user_flags(id) & VIPGOLD_LEVEL)
        formatex(CrossBow,sizeof(CrossBow)-1,"\wCrossBow");
    else
        formatex(CrossBow,sizeof(CrossBow)-1,"\dCrossBow \w- \rOnly VIP\w");
    menu_additem(Menu, CrossBow, Num, 0);
}

public CrossBow_ViewModel(id) {
    if(get_user_weapon(id) == CSW_CROSSBOW && get_user_crossbow(id)) {
        set_pev(id, pev_viewmodel2, CrossBowModel_V);
        set_pev(id, pev_weaponmodel2, CrossBowModel_P);
        set_pdata_int(id, 361, get_pdata_int(id, 361) | (1<<6));
    }
}

public CrossBow_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 CrossBow = find_ent_by_owner(-1, weapon_crossbow, entity);

    if(get_user_crossbow(Owner) && is_valid_ent(CrossBow) && equal(model, "models/w_sg552.mdl")) {
        entity_set_int(CrossBow, EV_INT_impulse, CROSSBOW_WEAPONKEY);
        HaveCrossBow[Owner] = false;
        entity_set_model(entity, CrossBowModel_W);
        set_pdata_int(Owner, 361, get_pdata_int(Owner, 361) & ~ (1<<6));
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}

public CrossBow_UpdateClientData_Post(id, sendweapons, cd_handle) {
    if(is_user_alive(id) && is_user_connected(id)) {
        if(get_user_weapon(id) == CSW_CROSSBOW && get_user_crossbow(id))
            set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001);
    }
}

public CrossBow_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);

        if(CurButton & IN_ATTACK) {
            if(get_user_weapon(id) == CSW_CROSSBOW && get_user_crossbow(id)) {
                static CrossBow;
                CrossBow = fm_find_ent_by_owner(-1, weapon_crossbow, id);

                if(cs_get_weapon_ammo(CrossBow) > 0 && !crossbow_reload[id] && NextAttack <= 0.0) {
                    set_weapon_anim(id, random_num(1,2));
                    emit_sound(id, CHAN_WEAPON,CrossBow_Sound[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);

                    CrossBow_Fire(id);

                    static Float:PunchAngles[3];

                    PunchAngles[0] = random_float(-4.0, -5.0);
                    PunchAngles[1] = 0.0;
                    PunchAngles[2] = 0.0;

                    set_pev(id, pev_punchangle, PunchAngles);
                    cs_set_weapon_ammo(CrossBow, cs_get_weapon_ammo(CrossBow) - 1);
                    if(cs_get_weapon_ammo(CrossBow) > 0 && !crossbow_reload[id] && NextAttack <= 0.0)
                        set_pdata_float(id, 83, crossbow_shotdelay, 5);
                }
                CurButton &= ~IN_ATTACK;
                set_uc(uc_handle, UC_Buttons, CurButton);
            }

        }
    }
}

public CrossBow_AddToPlayer(Weapon, id) {
    if(is_valid_ent(Weapon) && is_user_connected(id) && entity_get_int(Weapon, EV_INT_impulse) == CROSSBOW_WEAPONKEY) {
        HaveCrossBow[id] = true;
        entity_set_int(Weapon, EV_INT_impulse, 0);
        WeaponList(id, CROSSBOW_WEAPONKEY)
    }
}

public CrossBow_Deploy_Post(entity) {
    static Owner;
    Owner = get_pdata_cbase(entity, 41, 4);
    if(get_user_crossbow(Owner)) {
        set_pev(Owner, pev_viewmodel2, CrossBowModel_V);
        set_pev(Owner, pev_weaponmodel2, CrossBowModel_P);
        set_pdata_float(Owner, 83, 1.03, 5);
        set_weapon_anim(Owner, 4);
        static clip;
        clip = cs_get_weapon_ammo(entity);
        if(clip > 0)
            crossbow_reload[Owner] = 0;
        set_pdata_int(Owner, 361, get_pdata_int(Owner, 361) | (1<<6));
    }
}

public CrossBow_Holster(entity) {
    static Owner;
    Owner = get_pdata_cbase(entity, 41, 4);
    if(get_user_crossbow(Owner)) {
        set_pdata_int(Owner, 361, get_pdata_int(Owner, 361) & ~ (1<<6));
    }
}

public CrossBow_Reload(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_crossbow(id))
        return HAM_IGNORED;

    crossbow_clip[id] = -1;

    new Ammo = cs_get_user_bpammo(id, CSW_CROSSBOW);
    if(Ammo <= 0)
        return HAM_SUPERCEDE;

    new Clip = get_pdata_int(ent, 51, 4);
    if(Clip >= get_pcvar_num(crossbowclip))
        return HAM_SUPERCEDE;

    crossbow_clip[id] = Clip;
    crossbow_reload[id] = 1;

    return HAM_IGNORED;
}

public CrossBow_Reload_Post(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_crossbow(id))
        return HAM_IGNORED;

    if(crossbow_clip[id] == -1)
        return HAM_IGNORED;

    new Float:reload_time = get_pcvar_float(crossbowreloadtime);

    set_pdata_int(ent, 51, crossbow_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 CrossBow_PostFrame(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_crossbow(id))
        return HAM_IGNORED;

    new Float:NextAttack = get_pdata_float(id, 83, 5);
    new Ammo = cs_get_user_bpammo(id, CSW_CROSSBOW);

    new Clip = get_pdata_int(ent, 51, 4);
    new InReload = get_pdata_int(ent, 54, 4);

    if(InReload && NextAttack <= 0.0) {
        new Temp = min(get_pcvar_num(crossbowclip) - Clip, Ammo);

        set_pdata_int(ent, 51, Clip + Temp, 4);
        cs_set_user_bpammo(id, CSW_CROSSBOW, Ammo - Temp);
        set_pdata_int(ent, 54, 0, 4);

        InReload = 0;
        crossbow_reload[id] = 0;
    }

    return HAM_IGNORED;
}

public CrossBow_Fire(id) {
    new ent, Float:Origin[3], Float:Angles[3], Float:Velocity[3];

    ent = create_entity("info_target");
    engfunc(EngFunc_GetAttachment, id, 0, Origin, Angles);
    pev(id, pev_angles, Angles);

    set_pev(ent, pev_origin, Origin);
    set_pev(ent, pev_angles, Angles);
    set_pev(ent, pev_solid, 2);
    set_pev(ent, pev_movetype, 5);

    set_pev(ent, pev_classname, CROSSBOW_CLASS);

    set_pev(ent, pev_owner, id);
    engfunc(EngFunc_SetModel, ent, CrossBowModel_S);

    set_pev(ent, pev_mins, {-1.0, -1.0, -1.0});
    set_pev(ent, pev_maxs, {1.0, 1.0, 1.0});

    velocity_by_aim(id, 2000, Velocity);
    set_pev(ent, pev_velocity, Velocity);

    message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
    write_byte(TE_BEAMFOLLOW); // TE id
    write_short(ent); // entity:attachment to follow
    write_short(crossbow_trail); // sprite index
    write_byte(25); // life in 0.1's
    write_byte(1); // line width in 0.1's
    write_byte(255); // r
    write_byte(0); // g
    write_byte(0); // b
    write_byte(200); // brightness
    message_end();

    set_pev(ent, pev_iuser4, 0);

    return PLUGIN_CONTINUE;
}

public CrossBow_Touch(bolt, touch) {
    if(is_valid_ent(bolt)) {
        new id = pev(bolt, pev_owner);

        new Float:BoltOrigin[3];
        pev(bolt, pev_origin, BoltOrigin);

        message_begin(MSG_BROADCAST ,SVC_TEMPENTITY);
        write_byte(TE_EXPLOSION);
        engfunc(EngFunc_WriteCoord, BoltOrigin[0]);
        engfunc(EngFunc_WriteCoord, BoltOrigin[1]);
        engfunc(EngFunc_WriteCoord, BoltOrigin[2]);
        write_short(crossbow_explode);  // sprite index
        write_byte(30);         // scale in 0.1's
        write_byte(30);         // framerate
        write_byte(0);          // flags
        message_end();

        message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
        write_byte(TE_WORLDDECAL)
        engfunc(EngFunc_WriteCoord, BoltOrigin[0])
        engfunc(EngFunc_WriteCoord, BoltOrigin[1])
        engfunc(EngFunc_WriteCoord, BoltOrigin[2])
        write_byte(random_num(46, 48))
        message_end()

        if(is_user_connected(touch) && is_user_alive(touch) && !fm_get_user_godmode(touch) && get_user_team(touch) != get_user_team(id) && touch != id) {
            new Float:VictimOrigin[3]
            pev(touch, pev_origin, VictimOrigin);
            new Float:Damage = get_pcvar_float(crossbowdamage)

            new BloodColor = ExecuteHam(Ham_BloodColor, touch);
            if(BloodColor != -1) {
                new Amount = floatround(Damage);

                Amount *= 2; //according to HLSDK

                message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
                write_byte(TE_BLOODSPRITE);
                write_coord(floatround(VictimOrigin[0]));
                write_coord(floatround(VictimOrigin[1]));
                write_coord(floatround(VictimOrigin[2]));
                write_short(BloodSpray);
                write_short(BloodDrop);
                write_byte(BloodColor);
                write_byte(min(max(3, Amount/10), 16));
                message_end();
            }

            make_knockback(touch, BoltOrigin, get_pcvar_float(crossbowknockback) * Damage);

            if(get_user_health(touch) - Damage >= 1) {
                ExecuteHam(Ham_TakeDamage, touch, id, id, Damage, DMG_BLAST);

                message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("Damage"), _, touch);
                write_byte(0);
                write_byte(0);
                write_long(DMG_BLAST);
                write_coord(0) ;
                write_coord(0);
                write_coord(0);
                message_end();

                message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("ScreenFade"), {0,0,0}, touch);
                write_short(1<<13);
                write_short(1<<14);
                write_short(0x0000);
                write_byte(255);
                write_byte(255);
                write_byte(255);
                write_byte(100) ;
                message_end();

                message_begin(MSG_ONE, get_user_msgid("ScreenShake"), {0,0,0}, touch);
                write_short(0xFFFF);
                write_short(1<<13);
                write_short(0xFFFF) ;
                message_end();
            }
            else {
                death_message(id, touch, "CrossBow");
            }
        }

        else {
            static ClassName[32];
            pev(touch, pev_classname, ClassName, charsmax(ClassName));
            if(equal(ClassName, "func_breakable")) {
                if(entity_get_float(touch, EV_FL_health) <= get_pcvar_num(crossbowdamage)) {
                    force_use(id, touch);
                }
            }
        }

        for(new Victim = 1; Victim < get_maxplayers(); Victim++) {
            if(is_user_connected(Victim) && is_user_alive(Victim) && !fm_get_user_godmode(Victim) && get_user_team(Victim) != get_user_team(id) && Victim != id && Victim != touch) {
                new Float:VictimOrigin[3], Float:Distance_F, Distance;
                pev(Victim, pev_origin, VictimOrigin);
                Distance_F = get_distance_f(BoltOrigin, VictimOrigin);
                Distance = floatround(Distance_F);

                if(Distance <= get_pcvar_float(crossbowradius)) {
                    new Float:DistanceRatio, Float:Damage;
                    DistanceRatio = floatdiv(float(Distance), get_pcvar_float(crossbowradius));
                    Damage = get_pcvar_float(crossbowdamage) - floatround(floatmul(get_pcvar_float(crossbowdamage), DistanceRatio));

                    new BloodColor = ExecuteHam(Ham_BloodColor, Victim);
                    if(BloodColor != -1) {
                        new Amount = floatround(Damage);

                        Amount *= 2; //according to HLSDK

                        message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
                        write_byte(TE_BLOODSPRITE);
                        write_coord(floatround(VictimOrigin[0]));
                        write_coord(floatround(VictimOrigin[1]));
                        write_coord(floatround(VictimOrigin[2]));
                        write_short(BloodSpray);
                        write_short(BloodDrop);
                        write_byte(BloodColor);
                        write_byte(min(max(3, Amount/10), 16));
                        message_end();
                    }

                    make_knockback(Victim, BoltOrigin, get_pcvar_float(crossbowknockback)*Damage);

                    if(get_user_health(Victim) - Damage >= 1) {
                        ExecuteHam(Ham_TakeDamage, Victim, id, id, Damage, DMG_BLAST);

                        message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("Damage"), _, Victim);
                        write_byte(0);
                        write_byte(0);
                        write_long(DMG_BLAST);
                        write_coord(0) ;
                        write_coord(0);
                        write_coord(0);
                        message_end();

                        message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("ScreenFade"), {0,0,0}, Victim);
                        write_short(1<<13);
                        write_short(1<<14);
                        write_short(0x0000);
                        write_byte(255);
                        write_byte(255);
                        write_byte(255);
                        write_byte(100) ;
                        message_end();

                        message_begin(MSG_ONE, get_user_msgid("ScreenShake"), {0,0,0}, Victim);
                        write_short(0xFFFF);
                        write_short(1<<13);
                        write_short(0xFFFF) ;
                        message_end();
                    }
                    else {
                        death_message(id, Victim, "CrossBow");
                    }
                }
            }
        }
        engfunc(EngFunc_RemoveEntity, bolt);
    }
}

public Hook_CrossBow(id) {
    engclient_cmd(id, weapon_crossbow);
}

public get_user_crossbow(id) {
    return HaveCrossBow[id];
}

public set_user_crossbow(id, crossbow) {
    if(crossbow) {
        if(!HaveCrossBow[id]) {
            drop_primary_weapons(id);
            HaveCrossBow[id] = true;
            crossbow_reload[id] = 0;
            WeaponList(id, CROSSBOW_WEAPONKEY)
            fm_give_item(id, weapon_crossbow);
            new Clip = fm_get_user_weapon_entity(id, CSW_CROSSBOW);
            cs_set_weapon_ammo(Clip, get_pcvar_num(crossbowclip));
        }
    }
    else {
        if(HaveCrossBow[id]) {
            HaveCrossBow[id] = false;
        }
    }
}
#endif

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//--------------------------------------| Quad Barrel |-------------------------------------------------------
//======================================= sDs|Aragon* =======================================================
#if defined QUADBARREL
QuadBarrel_Init() {
    register_clcmd("furien30_quadbarrel", "Hook_QuadBarrel");

    register_message(get_user_msgid("DeathMsg"), "QuadBarrel_DeathMsg");

    register_event("CurWeapon", "QuadBarrel_ViewModel", "be", "1=1");
    register_event("WeapPickup","QuadBarrel_ViewModel","b","1=19");

    register_forward(FM_SetModel, "QuadBarrel_WorldModel");
    register_forward(FM_UpdateClientData, "QuadBarrel_UpdateClientData", 1);
    register_forward(FM_PlaybackEvent, "QuadBarrel_PlaybackEvent");
    register_forward(FM_CmdStart, "QuadBarrel_CmdStart");

    RegisterHam(Ham_TakeDamage, "player", "QuadBarrel_TakeDamage");
    RegisterHam(Ham_TraceAttack, "worldspawn", "QuadBarrel_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "player", "QuadBarrel_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_breakable", "QuadBarrel_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_wall", "QuadBarrel_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door", "QuadBarrel_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door_rotating", "QuadBarrel_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_plat", "QuadBarrel_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_rotating", "QuadBarrel_TraceAttack_Post", 1);
    RegisterHam(Ham_Item_Deploy , weapon_quadbarrel, "QuadBarrel_Deploy_Post", 1);
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_quadbarrel, "QuadBarrel_PrimaryAttack");
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_quadbarrel, "QuadBarrel_PrimaryAttack_Post", 1);
    RegisterHam(Ham_Item_AddToPlayer, weapon_quadbarrel, "QuadBarrel_AddToPlayer");
    RegisterHam(Ham_Weapon_Reload, weapon_quadbarrel, "QuadBarrel_Reload");
    RegisterHam(Ham_Weapon_Reload, weapon_quadbarrel, "QuadBarrel_Reload_Post", 1);
    RegisterHam(Ham_Item_PostFrame, weapon_quadbarrel, "QuadBarrel_PostFrame");

    quadbarreldamage = register_cvar("furien30_quadbarrel_damage", "3");        //| QuadBarrel Damage |//
    quadbarrelreloadtime = register_cvar("furien30_quadbarrel_reload_time", "3.03");    //| QuadBarrel Reload Time |//
    quadbarrelrecoil = register_cvar("furien30_quadbarrel_recoil", "0.8");      //| QuadBarrel Recoil |//
}

QuadBarrel_Precache() {
    register_forward(FM_PrecacheEvent, "QuadBarrel_Precache_PrecacheEvent_Post", 1);

    precache_model(QuadBarrelModel_V);
    precache_model(QuadBarrelModel_P);
    precache_model(QuadBarrelModel_W);
    for(new i = 0; i < sizeof(QuadBarrel_Sound); i++)
        engfunc(EngFunc_PrecacheSound, QuadBarrel_Sound);
    for(new i = 0; i < sizeof(QuadBarrel_Generic); i++)
        engfunc(EngFunc_PrecacheGeneric, QuadBarrel_Generic);
}

QuadBarrel_Natives() {
    register_native("get_user_quadbarrel", "get_user_quadbarrel", 1);
    register_native("set_user_quadbarrel", "set_user_quadbarrel", 1);
}

QuadBarrel_Menu(id, const Num[] = "1") {
    new QuadBarrel[256];
    if(get_user_flags(id) & VIPSILVER_LEVEL)
        formatex(QuadBarrel,sizeof(QuadBarrel)-1,"\wQuad Barrel");
    else
        formatex(QuadBarrel,sizeof(QuadBarrel)-1,"\dQuad Barrel \w- \rOnly VIP\w");
    menu_additem(Menu, QuadBarrel, Num, 0);
}

public QuadBarrel_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_QUADBARREL) {
        if(get_user_quadbarrel(Attacker))
            set_msg_arg_string(4, "QuadBarrel");
    }
    return PLUGIN_CONTINUE;
}

public QuadBarrel_ViewModel(id) {
    if(get_user_weapon(id) == CSW_QUADBARREL && get_user_quadbarrel(id)) {
        set_pev(id, pev_viewmodel2, QuadBarrelModel_V);
        set_pev(id, pev_weaponmodel2, QuadBarrelModel_P);
    }
}

public QuadBarrel_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 QuadBarrel = find_ent_by_owner(-1, weapon_quadbarrel, entity);

    if(get_user_quadbarrel(Owner) && is_valid_ent(QuadBarrel) && equal(model, "models/w_m3.mdl")) {
        entity_set_int(QuadBarrel, EV_INT_impulse, QUADBARREL_WEAPONKEY);
        HaveQuadBarrel[Owner] = false;
        entity_set_model(entity, QuadBarrelModel_W);
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}

public QuadBarrel_UpdateClientData(id, sendweapons, cd_handle) {
    if(is_user_alive(id) && is_user_connected(id)) {
        if(get_user_weapon(id) == CSW_QUADBARREL && get_user_quadbarrel(id))
            set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001);
    }
}

public QuadBarrel_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 != quadbarrel_event)
        return FMRES_IGNORED;

    playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2);

    return FMRES_SUPERCEDE;
}

public QuadBarrel_PrecacheEvent_Post(type, const name[]) {
    if(equal("events/m3.sc", name)) {
        quadbarrel_event = get_orig_retval();
        return FMRES_HANDLED;
    }
    return FMRES_IGNORED;
}

public QuadBarrel_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 QuadBarrel = find_ent_by_owner(-1, weapon_quadbarrel, id);

        if(CurButton & IN_ATTACK) {
            if(get_user_weapon(id) == CSW_QUADBARREL && get_user_quadbarrel(id)) {
                if(cs_get_weapon_ammo(QuadBarrel) > 0 && !quadbarrel_reload[id] && NextAttack <= 0.0) {
                    emit_sound(id, CHAN_WEAPON, QuadBarrel_Sound[0], 1.0, ATTN_NORM, 0, PITCH_NORM);

                    ExecuteHamB(Ham_Weapon_PrimaryAttack, QuadBarrel);
                    set_weapon_anim(id, random_num(1, 2));
                    if(cs_get_weapon_ammo(QuadBarrel) > 0 && !quadbarrel_reload[id] && NextAttack <= 0.0)
                        set_pdata_float(id, 83, quadbarrel_shotdelay, 5);
                }
            }
        }
        if(CurButton & IN_ATTACK2) {
            if(get_user_weapon(id) == CSW_QUADBARREL && get_user_quadbarrel(id)) {
                if(cs_get_weapon_ammo(QuadBarrel) > 0 && !quadbarrel_reload[id] && NextAttack <= 0.0) {
                    static Ammo;
                    Ammo = cs_get_weapon_ammo(QuadBarrel);
                    if(Ammo >= 2)
                        Ammo = 2;
                    emit_sound(id, CHAN_WEAPON, QuadBarrel_Sound[0], 1.0, ATTN_NORM, 0, PITCH_NORM);
                    for(new i = 0; i < Ammo; i++) {
                        ExecuteHamB(Ham_Weapon_PrimaryAttack, QuadBarrel);
                    }
                    set_weapon_anim(id, random_num(1, 2));
                    if(cs_get_weapon_ammo(QuadBarrel) > 0 && !quadbarrel_reload[id] && NextAttack <= 0.0)
                        set_pdata_float(id, 83, quadbarrel_shotdelay, 5);
                }
            }
        }
    }
}

public QuadBarrel_TakeDamage(victim, inflictor, attacker, Float:damage, damagetype) {
    if(is_user_connected(attacker) && !(damagetype & DMG_HEGRENADE)) {
        if(get_user_weapon(attacker) == CSW_QUADBARREL && get_user_quadbarrel(attacker)) {
            SetHamParamFloat(4, damage * get_pcvar_float(quadbarreldamage));
        }
    }
}

public QuadBarrel_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_QUADBARREL)
        return HAM_IGNORED;
    if(!get_user_quadbarrel(attacker))
        return HAM_IGNORED;

    static Float:End[3];
    get_tr2(pentru, TR_vecEndPos, End);

    Make_Bullet(attacker, End);

    return HAM_HANDLED;
}

public QuadBarrel_AddToPlayer(Weapon, id) {
    if(is_valid_ent(Weapon) && is_user_connected(id) && entity_get_int(Weapon, EV_INT_impulse) == QUADBARREL_WEAPONKEY) {
        HaveQuadBarrel[id] = true;
        entity_set_int(Weapon, EV_INT_impulse, 0);
        WeaponList(id, QUADBARREL_WEAPONKEY)
    }
}

public QuadBarrel_Deploy_Post(entity) {
    static Owner;
    Owner = get_pdata_cbase(entity, 41, 4);
    if(get_user_quadbarrel(Owner)) {
        set_pev(Owner, pev_viewmodel2, QuadBarrelModel_V);
        set_pev(Owner, pev_weaponmodel2, QuadBarrelModel_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)
            quadbarrel_reload[Owner] = 0;
    }
}

public QuadBarrel_PrimaryAttack(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);

    if(get_user_quadbarrel(id)) {
        pev(id,pev_punchangle,cl_pushangle[id]);
        quadbarrel_clip[id] = cs_get_weapon_ammo(Weapon);
    }
}

public QuadBarrel_PrimaryAttack_Post(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);
    new ActiveItem = get_pdata_cbase(id, 373);

    if(quadbarrel_clip[id] > 0 && pev_valid(ActiveItem)) {
        if(is_user_alive(id) && get_user_quadbarrel(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(quadbarrelrecoil),Push);
            xs_vec_add(Push,cl_pushangle[id],Push);
            set_pev(id,pev_punchangle,Push);

            emit_sound(id, CHAN_WEAPON, QuadBarrel_Sound[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
            set_weapon_anim(id, random_num(1,2));
        }
    }
}

public QuadBarrel_Reload(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_quadbarrel(id))
        return HAM_IGNORED;

    quadbarrel_clip[id] = -1;

    new Ammo = cs_get_user_bpammo(id, CSW_QUADBARREL);
    if(Ammo <= 0)
        return HAM_SUPERCEDE;

    new Clip = get_pdata_int(ent, 51, 4);
    if(Clip >= 4)
        return HAM_SUPERCEDE;

    quadbarrel_clip[id] = Clip;
    quadbarrel_reload[id] = 1;

    return HAM_IGNORED;
}

public QuadBarrel_Reload_Post(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_quadbarrel(id))
        return HAM_IGNORED;

    if(quadbarrel_clip[id] == -1)
        return HAM_IGNORED;

    new Float:reload_time = get_pcvar_float(quadbarrelreloadtime);

    set_pdata_int(ent, 51, quadbarrel_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 QuadBarrel_PostFrame(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_quadbarrel(id))
        return HAM_IGNORED;

    new Float:NextAttack = get_pdata_float(id, 83, 5);
    new Ammo = cs_get_user_bpammo(id, CSW_QUADBARREL);

    new Clip = get_pdata_int(ent, 51, 4);
    new InReload = get_pdata_int(ent, 54, 4);

    if(InReload && NextAttack <= 0.0) {
        new Temp = min(4 - Clip, Ammo);

        set_pdata_int(ent, 51, Clip + Temp, 4);
        cs_set_user_bpammo(id, CSW_QUADBARREL, Ammo - Temp);
        set_pdata_int(ent, 54, 0, 4);

        InReload = 0;
        quadbarrel_reload[id] = 0;
    }

    return HAM_IGNORED;
}

public Hook_QuadBarrel(id) {
    engclient_cmd(id, weapon_quadbarrel);
}

public get_user_quadbarrel(id) {
    return HaveQuadBarrel[id];
}

public set_user_quadbarrel(id, quadbarrel) {
    if(quadbarrel) {
        if(!HaveQuadBarrel[id]) {
            drop_primary_weapons(id);
            HaveQuadBarrel[id] = true;
            quadbarrel_reload[id] = 0;
            WeaponList(id, QUADBARREL_WEAPONKEY)
            fm_give_item(id, weapon_quadbarrel);
            new clip = fm_get_user_weapon_entity(id, CSW_QUADBARREL);
            cs_set_weapon_ammo(clip, 4);
        }
    }
    else {
        if(HaveQuadBarrel[id]) {
            HaveQuadBarrel[id] = false;
        }
    }
}
#endif

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//--------------------------------------| 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[i]);
    for(new i = 0; i < sizeof(DualBarrel_Generic); i++)
        engfunc(EngFunc_PrecacheGeneric, DualBarrel_Generic[i]);
}

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[256];
    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

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//---------------------------------------| Ethereal |--------------------------------------------------------
//======================================= sDs|Aragon* =======================================================
#if defined ETHEREAL
Ethereal_Init() {
    register_clcmd("furien30_ethereal", "Hook_Ethereal");

    register_event("CurWeapon", "Ethereal_ViewModel", "be", "1=1");
    register_event("WeapPickup","Ethereal_ViewModel","b","1=19");

    register_forward(FM_SetModel, "Ethereal_WorldModel");
    register_forward(FM_UpdateClientData, "Ethereal_UpdateClientData_Post", 1);
    register_forward(FM_CmdStart, "Ethereal_CmdStart");

    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_ethereal, "Ethereal_PrimaryAttack_Post", 1);
    RegisterHam(Ham_Item_Deploy , weapon_ethereal, "Ethereal_Deploy_Post", 1);
    RegisterHam(Ham_Item_AddToPlayer, weapon_ethereal, "Ethereal_AddToPlayer");
    RegisterHam(Ham_Weapon_Reload, weapon_ethereal, "Ethereal_Reload");
    RegisterHam(Ham_Weapon_Reload, weapon_ethereal, "Ethereal_Reload_Post", 1);
    RegisterHam(Ham_Item_PostFrame, weapon_ethereal, "Ethereal_PostFrame");

    etherealdamage = register_cvar("furien30_ethereal_damage", "60");           //| Ethereal Damage |//
    etherealclip = register_cvar("furien30_ethereal_clip", "45");           //| Ethereal Clip |//
    etherealreloadtime = register_cvar("furien30_ethereal_reload_time", "3.03");    //| Ethereal Reload Time |//
    etherealknockback = register_cvar("furien30_ethereal_knockback", "3");      //| Ethereal KnockBack |//
}

Ethereal_Precache() {
    ethereal_beam = precache_model("sprites/zbeam4.spr");
    ethereal_explode = precache_model("sprites/xspark4.spr");
    precache_model(EtherealMuzzleFlash);

    precache_model(EtherealModel_V);
    precache_model(EtherealModel_P);
    precache_model(EtherealModel_W);
    for(new i = 0; i < sizeof(Ethereal_Sound); i++)
        engfunc(EngFunc_PrecacheSound, Ethereal_Sound[i]);
    for(new i = 0; i < sizeof(Ethereal_Generic); i++)
        engfunc(EngFunc_PrecacheGeneric, Ethereal_Generic[i]);
}

Ethereal_Natives() {
    register_native("get_user_ethereal", "get_user_ethereal", 1);
    register_native("set_user_ethereal", "set_user_ethereal", 1);
}

Ethereal_Menu(id, const Num[] = "1") {
    new Ethereal[256];
    if(get_user_flags(id) & VIPGOLD_LEVEL)
        formatex(Ethereal,sizeof(Ethereal)-1,"\wEthereal");
    else
        formatex(Ethereal,sizeof(Ethereal)-1,"\dEthereal - \rOnly VIP");
    menu_additem(Menu, Ethereal, Num, 0);
}

public Ethereal_ViewModel(id) {
    if(get_user_weapon(id) == CSW_ETHEREAL && get_user_ethereal(id)) {
        set_pev(id, pev_viewmodel2, EtherealModel_V);
        set_pev(id, pev_weaponmodel2, EtherealModel_P);
    }
}

public Ethereal_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 Ethereal = find_ent_by_owner(-1, weapon_ethereal, entity);

    if(get_user_ethereal(Owner) && is_valid_ent(Ethereal) && equal(model, "models/w_galil.mdl")) {
        entity_set_int(Ethereal, EV_INT_impulse, ETHEREAL_WEAPONKEY);
        HaveEthereal[Owner] = false;
        entity_set_model(entity, EtherealModel_W);
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}

public Ethereal_UpdateClientData_Post(id, sendweapons, cd_handle) {
    if(is_user_alive(id) && is_user_connected(id)) {
        if(get_user_weapon(id) == CSW_ETHEREAL && get_user_ethereal(id))
            set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001);
    }
}

public Ethereal_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);

        if(CurButton & IN_ATTACK) {
            if(get_user_weapon(id) == CSW_ETHEREAL && get_user_ethereal(id)) {
                static Ethereal;
                Ethereal = fm_find_ent_by_owner(-1, weapon_ethereal, id);

                if(cs_get_weapon_ammo(Ethereal) > 0 && !ethereal_reload[id] && NextAttack <= 0.0) {
                    set_weapon_anim(id, random_num(3,5));
                    emit_sound(id, CHAN_WEAPON,Ethereal_Sound[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);

                    Ethereal_Fire(id);

                    static Float:PunchAngles[3];

                    PunchAngles[0] = random_float(-2.0, -3.0);
                    PunchAngles[1] = 0.0;
                    PunchAngles[2] = 0.0;

                    set_pev(id, pev_punchangle, PunchAngles);
                    cs_set_weapon_ammo(Ethereal, cs_get_weapon_ammo(Ethereal) - 1);
                    if(cs_get_weapon_ammo(Ethereal) > 0 && !ethereal_reload[id] && NextAttack <= 0.0)
                        set_pdata_float(id, 83, ethereal_shotdelay, 5);
                }
                CurButton &= ~IN_ATTACK;
                set_uc(uc_handle, UC_Buttons, CurButton);
            }

        }

    }
}

public Ethereal_AddToPlayer(Weapon, id) {
    if(is_valid_ent(Weapon) && is_user_connected(id) && entity_get_int(Weapon, EV_INT_impulse) == ETHEREAL_WEAPONKEY) {
        HaveEthereal[id] = true;
        entity_set_int(Weapon, EV_INT_impulse, 0);
        WeaponList(id, ETHEREAL_WEAPONKEY)
    }
}

public Ethereal_PrimaryAttack_Post(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);

    if(get_user_ethereal(id)) {
        new Muzzle = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "env_sprite"));

        new Float:Origin[3];
        pev(id, pev_origin, Origin);

        entity_set_origin(Muzzle, Origin);

        entity_set_model(Muzzle, EtherealMuzzleFlash);

        entity_set_int(Muzzle, EV_INT_solid, SOLID_NOT);
        entity_set_int(Muzzle, EV_INT_movetype, MOVETYPE_NOCLIP);

        entity_set_string(Muzzle, EV_SZ_classname, "muzzle_et");


        entity_set_float(Muzzle, EV_FL_animtime, get_gametime());
        entity_set_float(Muzzle, EV_FL_framerate, 50.0);
        set_pev(Muzzle, pev_scale, 0.1);

        set_pev(Muzzle, pev_spawnflags, SF_SPRITE_ONCE);

        set_pev(Muzzle, pev_rendermode, kRenderTransAdd);

        set_pev(Muzzle, pev_renderamt, 255.0);

        set_pev(Muzzle, pev_skin, id);
        set_pev(Muzzle, pev_body, 1);
        set_pev(Muzzle, pev_aiment, id);

        entity_set_float(Muzzle, EV_FL_nextthink, get_gametime() + 3.0);

        DispatchSpawn(Muzzle);
    }
}

public Ethereal_Deploy_Post(entity) {
    static Owner;
    Owner = get_pdata_cbase(entity, 41, 4);
    if(get_user_ethereal(Owner)) {
        set_pev(Owner, pev_viewmodel2, EtherealModel_V);
        set_pev(Owner, pev_weaponmodel2, EtherealModel_P);
        set_pdata_float(Owner, 83, 1.36, 5);
        set_weapon_anim(Owner, 2);
        static clip;
        clip = cs_get_weapon_ammo(entity);
        if(clip > 0)
            ethereal_reload[Owner] = 0;
    }
}

public Ethereal_Reload(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_ethereal(id))
        return HAM_IGNORED;

    ethereal_clip[id] = -1;

    new Ammo = cs_get_user_bpammo(id, CSW_ETHEREAL);
    if(Ammo <= 0)
        return HAM_SUPERCEDE;

    new Clip = get_pdata_int(ent, 51, 4);
    if(Clip >= get_pcvar_num(etherealclip))
        return HAM_SUPERCEDE;

    ethereal_clip[id] = Clip;
    ethereal_reload[id] = 1;

    return HAM_IGNORED;
}

public Ethereal_Reload_Post(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_ethereal(id))
        return HAM_IGNORED;

    if(ethereal_clip[id] == -1)
        return HAM_IGNORED;

    new Float:reload_time = get_pcvar_float(etherealreloadtime);

    set_pdata_int(ent, 51, ethereal_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, 1);
    return HAM_IGNORED;
}

public Ethereal_PostFrame(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_ethereal(id))
        return HAM_IGNORED;

    new Float:NextAttack = get_pdata_float(id, 83, 5);
    new Ammo = cs_get_user_bpammo(id, CSW_ETHEREAL);

    new Clip = get_pdata_int(ent, 51, 4);
    new InReload = get_pdata_int(ent, 54, 4);

    if(InReload && NextAttack <= 0.0) {
        new Temp = min(get_pcvar_num(etherealclip) - Clip, Ammo);

        set_pdata_int(ent, 51, Clip + Temp, 4);
        cs_set_user_bpammo(id, CSW_ETHEREAL, Ammo - Temp);
        set_pdata_int(ent, 54, 0, 4);

        InReload = 0;
        ethereal_reload[id] = 0;
    }

    return HAM_IGNORED;
}

public Ethereal_Fire(id) {
    emit_sound(id, CHAN_WEAPON, Ethereal_Sound[1], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);

    static Victim, Body, EndOrigin[3], BeamOrigin[3];
    get_user_origin(id, BeamOrigin, 3) ;
    get_user_origin(id, EndOrigin, 3);
    message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
    write_byte(TE_BEAMENTPOINT);
    write_short(id | 0x1000);
    write_coord(BeamOrigin[0]); // Start X
    write_coord(BeamOrigin[1]); // Start Y
    write_coord(BeamOrigin[2]); // Start Z
    write_short(ethereal_beam); // Sprite
    write_byte(0);              // Start frame
    write_byte(1);          // Frame rate
    write_byte(1);          // Life
    write_byte(25);         // Line width
    write_byte(0);          // Noise
    write_byte(150);        // Red
    write_byte(0);          // Green
    write_byte(0);          // Blue
    write_byte(150);            // Brightness
    write_byte(0);              // Scroll speed
    message_end();

    message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
    write_byte(3);
    write_coord(EndOrigin[0]);
    write_coord(EndOrigin[1]);
    write_coord(EndOrigin[2]);
    write_short(ethereal_explode);
    write_byte(10);
    write_byte(15);
    write_byte(4);
    message_end();

    message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
    write_byte(TE_WORLDDECAL)
    engfunc(EngFunc_WriteCoord, EndOrigin[0])
    engfunc(EngFunc_WriteCoord, EndOrigin[1])
    engfunc(EngFunc_WriteCoord, EndOrigin[2])
    write_byte(random_num(46, 48))
    message_end()

    get_user_aiming(id, Victim, Body, 999999);
    if(is_user_connected(Victim) && pev_valid(Victim)) {
        if(!fm_get_user_godmode(Victim) && get_user_team(Victim) != get_user_team(id) && Victim != id) {
            new Float:Damage = float(get_damage_body(Body, get_pcvar_float(etherealdamage)));

            new Float:VictimOrigin[3];
            VictimOrigin[0] = float(EndOrigin[0]);
            VictimOrigin[1] = float(EndOrigin[1]);
            VictimOrigin[2] = float(EndOrigin[2]);

            new BloodColor = ExecuteHam(Ham_BloodColor, Victim);
            if(BloodColor != -1) {
                new Amount = floatround(Damage);

                Amount *= 2; //according to HLSDK

                message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
                write_byte(TE_BLOODSPRITE);
                write_coord(floatround(VictimOrigin[0]));
                write_coord(floatround(VictimOrigin[1]));
                write_coord(floatround(VictimOrigin[2]));
                write_short(BloodSpray);
                write_short(BloodDrop);
                write_byte(BloodColor);
                write_byte(min(max(3, Amount/10), 16));
                message_end();
            }
            make_knockback(Victim, VictimOrigin, get_pcvar_float(etherealknockback)*get_pcvar_float(etherealdamage));

            if(get_user_health(Victim) - get_pcvar_float(etherealdamage) >= 1 && is_user_alive(Victim)) {
                ExecuteHam(Ham_TakeDamage, Victim, id, id, Damage, DMG_NERVEGAS);

                message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("Damage"), _, Victim);
                write_byte(0);
                write_byte(0);
                write_long(DMG_NERVEGAS);
                write_coord(0) ;
                write_coord(0);
                write_coord(0);
                message_end();

                message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("ScreenFade"), {0,0,0}, Victim);
                write_short(1<<13);
                write_short(1<<14);
                write_short(0x0000);
                write_byte(200);
                write_byte(0);
                write_byte(0);
                write_byte(100) ;
                message_end();

                message_begin(MSG_ONE, get_user_msgid("ScreenShake"), {0,0,0}, Victim);
                write_short(0xFFFF);
                write_short(1<<13);
                write_short(0xFFFF) ;
                message_end();
            }
            else if(get_user_health(Victim) - get_pcvar_float(etherealdamage) < 1 && is_user_alive(Victim)) {
                death_message(id, Victim, "Ethereal");
            }
        }
    }
    else {
        static ClassName[32];
        pev(Victim, pev_classname, ClassName, charsmax(ClassName));
        if(equal(ClassName, "func_breakable")) {
            if(entity_get_float(Victim, EV_FL_health) <= get_pcvar_num(etherealdamage)) {
                force_use(id, Victim);
            }
        }
    }
}

public Hook_Ethereal(id) {
    engclient_cmd(id, weapon_ethereal);
}

public get_user_ethereal(id) {
    return HaveEthereal[id];
}

public set_user_ethereal(id, ethereal) {
    if(ethereal) {
        if(!HaveEthereal[id]) {
            drop_primary_weapons(id);
            HaveEthereal[id] = true;
            ethereal_reload[id] = 0;
            WeaponList(id, ETHEREAL_WEAPONKEY)
            fm_give_item(id, weapon_ethereal);
            new Clip = fm_get_user_weapon_entity(id, CSW_ETHEREAL);
            cs_set_weapon_ammo(Clip, get_pcvar_num(etherealclip));
        }
    }
    else {
        if(HaveEthereal[id]) {
            HaveEthereal[id] = false;
        }
    }
}
#endif

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------| K1ases |--------------------------------------------------------
//======================================= sDs|Aragon* =======================================================
#if defined K1ASES
K1ases_Init() {
    register_clcmd("furien30_k1ases", "Hook_K1ases");

    register_message(get_user_msgid("DeathMsg"), "K1ases_DeathMsg");

    register_event("CurWeapon", "K1ases_ViewModel", "be", "1=1");
    register_event("WeapPickup","K1ases_ViewModel","b","1=19");

    register_forward(FM_SetModel, "K1ases_WorldModel");
    register_forward(FM_UpdateClientData, "K1ases_UpdateClientData_Post", 1);
    register_forward(FM_PlaybackEvent, "K1ases_PlaybackEvent");
    register_forward(FM_CmdStart, "K1ases_CmdStart");

    RegisterHam(Ham_TakeDamage, "player", "K1ases_TakeDamage");
    RegisterHam(Ham_TraceAttack, "worldspawn", "K1ases_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "player", "K1ases_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_breakable", "K1ases_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_wall", "K1ases_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door", "K1ases_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door_rotating", "K1ases_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_plat", "K1ases_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_rotating", "K1ases_TraceAttack_Post", 1);
    RegisterHam(Ham_Item_Deploy , weapon_k1ases, "K1ases_Deploy_Post", 1);
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_k1ases, "K1ases_PrimaryAttack");
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_k1ases, "K1ases_PrimaryAttack_Post", 1);
    RegisterHam(Ham_Item_AddToPlayer, weapon_k1ases, "K1ases_AddToPlayer");
    RegisterHam(Ham_Weapon_Reload, weapon_k1ases, "K1ases_Reload");
    RegisterHam(Ham_Weapon_Reload, weapon_k1ases, "K1ases_Reload_Post", 1);
    RegisterHam(Ham_Item_PostFrame, weapon_k1ases, "K1ases_PostFrame");

    k1asesdamage = register_cvar("furien30_k1ases_damage", "45");           //| K1ases Damage |//
    k1asesclip = register_cvar("furien30_k1ases_clip", "40");               //| K1ases Clip |//
    k1asesreloadtime = register_cvar("furien30_k1ases_reload_time", "2.57");        //| K1ases Reload Time |//
    k1asesrecoil = register_cvar("furien30_k1ases_recoil", "0.8");          //| K1ases Recoil |//
    k1asesabilitydamage = register_cvar("furien30_k1ases_ability_damage", "100.0"); //| K1ases Ability Damage |//
    k1asesabilitydelay = register_cvar("furien30_k1ases_ability_delay", "5.0");     //| K1ases Ability Delay |//
    k1asesabilityradius = register_cvar("furien30_k1ases_ability_radius", "100.0"); //| K1ases Ability Radius |//
}

K1ases_Precache() {
    register_forward(FM_PrecacheEvent, "K1ases_PrecacheEvent_Post", 1);

    k1ases_explode  = precache_model("sprites/furien30_weapons/k1ases_ability.spr");

    precache_model(K1asesModel_V);
    precache_model(K1asesModel_P);
    precache_model(K1asesModel_W);
    for(new i = 0; i < sizeof(K1ases_Sound); i++)
        engfunc(EngFunc_PrecacheSound, K1ases_Sound[i]);
    for(new i = 0; i < sizeof(K1ases_Generic); i++)
        engfunc(EngFunc_PrecacheGeneric, K1ases_Generic[i]);
}

K1ases_Natives() {
    register_native("get_user_k1ases", "get_user_k1ases", 1);
    register_native("set_user_k1ases", "set_user_k1ases", 1);
}

K1ases_Menu(id, const Num[] = "1") {
    new K1ases[256];
    if(get_user_flags(id) & VIPSILVER_LEVEL)
        formatex(K1ases,sizeof(K1ases)-1,"\wK1ases");
    else
        formatex(K1ases,sizeof(K1ases)-1,"\dK1ases - \rOnly VIP");
    menu_additem(Menu, K1ases, Num, 0);
}

public K1ases_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, "mp5navy") && get_user_weapon(Attacker) == CSW_K1ASES) {
        if(get_user_k1ases(Attacker))
            set_msg_arg_string(4, "K1ases");
    }
    return PLUGIN_CONTINUE;
}

public K1ases_ViewModel(id) {
    if(get_user_weapon(id) == CSW_K1ASES && get_user_k1ases(id)) {
        set_pev(id, pev_viewmodel2, K1asesModel_V);
        set_pev(id, pev_weaponmodel2, K1asesModel_P);
    }
}

public K1ases_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 K1ases = find_ent_by_owner(-1, weapon_k1ases, entity);

    if(get_user_k1ases(Owner) && is_valid_ent(K1ases) && equal(model, "models/w_mp5.mdl")) {
        entity_set_int(K1ases, EV_INT_impulse, K1ASES_WEAPONKEY);
        HaveK1ases[Owner] = false;
        entity_set_model(entity, K1asesModel_W);
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}

public K1ases_UpdateClientData_Post(id, sendweapons, cd_handle) {
    if(is_user_alive(id) && is_user_connected(id)) {
        if(get_user_weapon(id) == CSW_K1ASES && get_user_k1ases(id))
            set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001);
    }
}

public K1ases_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 != k1ases_event)
        return FMRES_IGNORED;

    playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2);

    return FMRES_SUPERCEDE;
}

public K1ases_PrecacheEvent_Post(type, const name[]) {
    if(equal("events/mp5navy.sc", name)) {
        k1ases_event = get_orig_retval();
        return FMRES_HANDLED;
    }
    return FMRES_IGNORED;
}

public K1ases_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);

        if(CurButton & IN_ATTACK2) {
            if(get_user_weapon(id) == CSW_K1ASES && get_user_k1ases(id) && NextAttack <= 0.0) {
                K1ases_Ability(id);
                CurButton &= ~IN_ATTACK2;
                set_uc(uc_handle, UC_Buttons, CurButton);
            }
        }
    }
}

public K1ases_TakeDamage(victim, inflictor, attacker, Float:damage, damagetype) {
    if(is_user_connected(attacker) && !(damagetype & DMG_HEGRENADE)) {
        new Body, Target, Float:NewDamage;
        if(get_user_weapon(attacker) == CSW_K1ASES && get_user_k1ases(attacker)) {
            if(is_user_connected(victim)) {
                get_user_aiming(attacker, Target, Body, 999999);
                NewDamage = float(get_damage_body(Body, get_pcvar_float(k1asesdamage)));
                SetHamParamFloat(4, NewDamage);
            }
            else {
                SetHamParamFloat(4, get_pcvar_float(k1asesdamage));
            }
        }
    }
}

public K1ases_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_K1ASES)
        return HAM_IGNORED;
    if(!get_user_k1ases(attacker))
        return HAM_IGNORED;

    static Float:End[3];
    get_tr2(pentru, TR_vecEndPos, End);

    Make_Bullet(attacker, End);

    return HAM_HANDLED;
}

public K1ases_AddToPlayer(Weapon, id) {
    if(is_valid_ent(Weapon) && is_user_connected(id) && entity_get_int(Weapon, EV_INT_impulse) == K1ASES_WEAPONKEY) {
        HaveK1ases[id] = true;
        entity_set_int(Weapon, EV_INT_impulse, 0);
        WeaponList(id, K1ASES_WEAPONKEY)
    }
}

public K1ases_Deploy_Post(entity) {
    static Owner;
    Owner = get_pdata_cbase(entity, 41, 4);
    if(get_user_k1ases(Owner)) {
        set_pev(Owner, pev_viewmodel2, K1asesModel_V);
        set_pev(Owner, pev_weaponmodel2, K1asesModel_P);
        set_pdata_float(Owner, 83, 1.2, 5);
        set_weapon_anim(Owner, 2);
        static clip;
        clip = cs_get_weapon_ammo(entity);
        if(clip > 0)
            k1ases_reload[Owner] = 0;
    }
}

public K1ases_PrimaryAttack(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);

    if(get_user_k1ases(id)) {
        pev(id,pev_punchangle,cl_pushangle[id]);
        k1ases_clip[id] = cs_get_weapon_ammo(Weapon);
    }
}

public K1ases_PrimaryAttack_Post(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);
    new ActiveItem = get_pdata_cbase(id, 373) ;

    if(k1ases_clip[id] > 0 && pev_valid(ActiveItem)) {
        if(is_user_alive(id) && get_user_k1ases(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(k1asesrecoil),Push);
            xs_vec_add(Push,cl_pushangle[id],Push);
            set_pev(id,pev_punchangle,Push);

            emit_sound(id, CHAN_WEAPON, K1ases_Sound[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
            set_weapon_anim(id, random_num(3,5));
        }
    }
}

public K1ases_Reload(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_k1ases(id))
        return HAM_IGNORED;

    k1ases_clip[id] = -1;

    new Ammo = cs_get_user_bpammo(id, CSW_K1ASES);
    if(Ammo <= 0)
        return HAM_SUPERCEDE;

    new Clip = get_pdata_int(ent, 51, 4);
    if(Clip >= get_pcvar_num(k1asesclip))
        return HAM_SUPERCEDE;

    k1ases_clip[id] = Clip;
    k1ases_reload[id] = 1;

    return HAM_IGNORED;
}

public K1ases_Reload_Post(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_k1ases(id))
        return HAM_IGNORED;

    if(k1ases_clip[id] == -1)
        return HAM_IGNORED;

    new Float:reload_time = get_pcvar_float(k1asesreloadtime);

    set_pdata_int(ent, 51, k1ases_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, 1);
    return HAM_IGNORED;
}

public K1ases_PostFrame(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_k1ases(id))
        return HAM_IGNORED;

    new Float:NextAttack = get_pdata_float(id, 83, 5);
    new Ammo = cs_get_user_bpammo(id, CSW_K1ASES);

    new Clip = get_pdata_int(ent, 51, 4);
    new InReload = get_pdata_int(ent, 54, 4);

    if(InReload && NextAttack <= 0.0) {
        new Temp = min(get_pcvar_num(k1asesclip) - Clip, Ammo);

        set_pdata_int(ent, 51, Clip + Temp, 4);
        cs_set_user_bpammo(id, CSW_K1ASES, Ammo - Temp);
        set_pdata_int(ent, 54, 0, 4);

        InReload = 0;
        k1ases_reload[id] = 0;
    }

    return HAM_IGNORED;
}

public K1ases_Ability(id) {
    if(is_user_alive(id) && !K1ases_Ability_Delay[id]) {
        set_pdata_float(id, 83, 0.83, 5);
        set_weapon_anim(id, 6);

        new AimOrigin[3];
        get_user_origin(id, AimOrigin, 3);

        message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
        write_byte(TE_EXPLOSION); // TE_EXPLOSION
        write_coord(AimOrigin[0]); // origin x
        write_coord(AimOrigin[1]); // origin y
        write_coord(AimOrigin[2]); // origin z
        write_short(k1ases_explode); // sprites
        write_byte(40); // scale in 0.1's
        write_byte(30); // framerate
        write_byte(14); // flags
        message_end(); // message end


        new Float:AimOrigin2[3];

        static Victim;
        Victim = -1;

        AimOrigin2[0] = float(AimOrigin[0]);
        AimOrigin2[1] = float(AimOrigin[1]);
        AimOrigin2[2] = float(AimOrigin[2]);

        while((Victim = find_ent_in_sphere(Victim, AimOrigin2, get_pcvar_float(k1asesabilityradius))) != 0) {
            if(is_user_connected(Victim) && is_user_alive(Victim) && !fm_get_user_godmode(Victim) && get_user_team(Victim) != get_user_team(id) && Victim != id) {
                new BloodColor = ExecuteHam(Ham_BloodColor, Victim);
                if(BloodColor != -1) {
                    new Amount = floatround(get_pcvar_float(k1asesabilitydamage));

                    Amount *= 2; //according to HLSDK

                    message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
                    write_byte(TE_BLOODSPRITE);
                    write_coord(floatround(AimOrigin2[0]));
                    write_coord(floatround(AimOrigin2[1]));
                    write_coord(floatround(AimOrigin2[2]));
                    write_short(BloodSpray);
                    write_short(BloodDrop);
                    write_byte(BloodColor);
                    write_byte(min(max(3, Amount/10), 16));
                    message_end();
                }
                if(get_user_health(Victim) - get_pcvar_float(k1asesabilitydamage) >= 1) {
                    ExecuteHam(Ham_TakeDamage, Victim, id, id, get_pcvar_float(k1asesabilitydamage), DMG_BLAST);

                    message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("Damage"), _, Victim);
                    write_byte(0);
                    write_byte(0);
                    write_long(DMG_NERVEGAS);
                    write_coord(0) ;
                    write_coord(0);
                    write_coord(0);
                    message_end();

                    message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("ScreenFade"), {0,0,0}, Victim);
                    write_short(1<<13);
                    write_short(1<<14);
                    write_short(0x0000);
                    write_byte(200);
                    write_byte(100);
                    write_byte(0);
                    write_byte(100) ;
                    message_end();

                    message_begin(MSG_ONE, get_user_msgid("ScreenShake"), {0,0,0}, Victim);
                    write_short(0xFFFF);
                    write_short(1<<13);
                    write_short(0xFFFF) ;
                    message_end();
                }
                else {
                    death_message(id, Victim, "K1ases Ability");
                }
            }
        }

        K1ases_Ability_Delay[id] = get_pcvar_num(k1asesabilitydelay);
        emit_sound(id, CHAN_WEAPON, K1ases_Sound[1], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
        if(K1ases_Ability_Delay[id]) {
            new Message[256];
            formatex(Message,sizeof(Message)-1,"Puterea iti va reveni in: %d secund%s",K1ases_Ability_Delay[id], K1ases_Ability_Delay[id] == 1 ? "e" : "a");

            HudMessage(id, Message, 0, 0, 200, 0.05, 0.50, _, _, 1.0);
            set_task(1.0, "K1asesAbilityDelay", id);
        }
    }
}

public K1asesAbilityDelay(id) {
    if(!is_user_alive(id) || get_user_team(id) != 2) {
        K1ases_Ability_Delay[id] = 0;
    }
    else if(K1ases_Ability_Delay[id] > 1) {
        K1ases_Ability_Delay[id]--;
        new Message[256];
        formatex(Message,sizeof(Message)-1,"Puterea iti va reveni in: %d secund%s",K1ases_Ability_Delay[id], K1ases_Ability_Delay[id] == 1 ? "e" : "a");

        HudMessage(id, Message, 0, 0, 200, 0.05, 0.50, _, _, 1.0);
        set_task(1.0, "K1asesAbilityDelay", id);
    }
    else if(K1ases_Ability_Delay[id] <= 1) {
        new Message[256];
        formatex(Message,sizeof(Message)-1,"Ti-a revenit puterea");

        HudMessage(id, Message, 0, 0, 200, 0.05, 0.50, _, _, 1.0);
        K1ases_Ability_Delay[id] = 0;
    }
}

public Hook_K1ases(id) {
    engclient_cmd(id, weapon_k1ases);
}

public get_user_k1ases(id) {
    return HaveK1ases[id];
}

public set_user_k1ases(id, k1ases) {
    if(k1ases) {
        if(!HaveK1ases[id]) {
            drop_primary_weapons(id);
            HaveK1ases[id] = true;
            k1ases_reload[id] = 0;
            WeaponList(id, K1ASES_WEAPONKEY)
            fm_give_item(id, weapon_k1ases);
            new Clip = fm_get_user_weapon_entity(id, CSW_K1ASES);
            cs_set_weapon_ammo(Clip, get_pcvar_num(k1asesclip));
        }
    }
    else {
        if(HaveK1ases[id]) {
            HaveK1ases[id] = false;
        }
    }
}
#endif

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//-----------------------------------------| F2000 |--------------------------------------------------------
//======================================= sDs|Aragon* =======================================================
#if defined F2000
F2000_Init() {
    register_clcmd("furien30_f2000", "Hook_F2000");

    register_message(get_user_msgid("DeathMsg"), "F2000_DeathMsg");

    register_event("CurWeapon", "F2000_ViewModel", "be", "1=1");
    register_event("WeapPickup","F2000_ViewModel","b","1=19");

    register_forward(FM_SetModel, "F2000_WorldModel");
    register_forward(FM_UpdateClientData, "F2000_UpdateClientData_Post", 1);
    register_forward(FM_PlaybackEvent, "F2000_PlaybackEvent");
    register_forward(FM_CmdStart, "F2000_CmdStart");

    RegisterHam(Ham_TakeDamage, "player", "F2000_TakeDamage");
    RegisterHam(Ham_TraceAttack, "worldspawn", "F2000_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "player", "F2000_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_breakable", "F2000_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_wall", "F2000_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door", "F2000_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door_rotating", "F2000_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_plat", "F2000_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_rotating", "F2000_TraceAttack_Post", 1);
    RegisterHam(Ham_Item_Deploy , weapon_f2000, "F2000_Deploy_Post", 1);
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_f2000, "F2000_PrimaryAttack");
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_f2000, "F2000_PrimaryAttack_Post", 1);
    RegisterHam(Ham_Item_AddToPlayer, weapon_f2000, "F2000_AddToPlayer");
    RegisterHam(Ham_Weapon_Reload, weapon_f2000, "F2000_Reload");
    RegisterHam(Ham_Weapon_Reload, weapon_f2000, "F2000_Reload_Post", 1);
    RegisterHam(Ham_Item_PostFrame, weapon_f2000, "F2000_PostFrame");

    f2000damage = register_cvar("furien30_f2000_damage", "50");             //| F2000 Damage |//
    f2000clip = register_cvar("furien30_f2000_clip", "40");             //| F2000 Clip |//
    f2000reloadtime = register_cvar("furien30_f2000_reload_time", "3.3");       //| F2000 Reload Time |//
    f2000recoil = register_cvar("furien30_f2000_recoil", "0.8");            //| F2000 Recoil |//
}

F2000_Precache() {
    register_forward(FM_PrecacheEvent, "F2000_PrecacheEvent_Post", 1);

    precache_model(F2000Model_V);
    precache_model(F2000Model_P);
    precache_model(F2000Model_W);
    precache_model(F2000Model_S);
    for(new i = 0; i < sizeof(F2000_Sound); i++)
        engfunc(EngFunc_PrecacheSound, F2000_Sound[i]);
    for(new i = 0; i < sizeof(F2000_Generic); i++)
        engfunc(EngFunc_PrecacheGeneric, F2000_Generic[i]);
}

F2000_Natives() {
    register_native("get_user_f2000", "get_user_f2000", 1);
    register_native("set_user_f2000", "set_user_f2000", 1);
}

F2000_Menu(id, const Num[] = "1") {
    new _F2000[256];
    if(get_user_flags(id) & VIPSILVER_LEVEL)
        formatex(_F2000,sizeof(_F2000)-1,"\wF2000");
    else
        formatex(_F2000,sizeof(_F2000)-1,"\dF2000 \w- \rOnly VIP");
    menu_additem(Menu, _F2000, Num, 0);
}

public F2000_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, "aug") && get_user_weapon(Attacker) == CSW_F2000) {
        if(get_user_f2000(Attacker))
            set_msg_arg_string(4, "F2000");
    }
    return PLUGIN_CONTINUE;
}

public F2000_ViewModel(id) {
    if(get_user_weapon(id) == CSW_F2000 && get_user_f2000(id)) {
        if(cs_get_user_zoom(id) == CS_SET_AUGSG552_ZOOM) {
            set_pev(id, pev_viewmodel2, F2000Model_S);
        }
        else {
            set_pev(id, pev_viewmodel2, F2000Model_V);
        }
        set_pev(id, pev_weaponmodel2, F2000Model_P);
    }

}

public F2000_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 _F2000 = find_ent_by_owner(-1, weapon_f2000, entity);

    if(get_user_f2000(Owner) && is_valid_ent(_F2000) && equal(model, "models/w_aug.mdl")) {
        entity_set_int(_F2000, EV_INT_impulse, F2000_WEAPONKEY);
        HaveF2000[Owner] = false;
        entity_set_model(entity, F2000Model_W);
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}

public F2000_UpdateClientData_Post(id, sendweapons, cd_handle) {
    if(is_user_alive(id) && is_user_connected(id)) {
        if(get_user_weapon(id) == CSW_F2000 && get_user_f2000(id))
            set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001);
    }
}

public F2000_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 != f2000_event)
        return FMRES_IGNORED;

    playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2);

    return FMRES_SUPERCEDE;
}

public F2000_PrecacheEvent_Post(type, const name[]) {
    if(equal("events/aug.sc", name)) {
        f2000_event = get_orig_retval();
        return FMRES_HANDLED;
    }
    return FMRES_IGNORED;
}

public F2000_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);

        if(CurButton & IN_ATTACK2 && !(pev(id, pev_oldbuttons) & IN_ATTACK2)) {
            if(get_user_weapon(id) == CSW_F2000 && get_user_f2000(id) && NextAttack <= 0.0) {
                if(cs_get_user_zoom(id) == CS_SET_AUGSG552_ZOOM)
                    set_pev(id, pev_viewmodel2, F2000Model_S);
                else
                    set_pev(id, pev_viewmodel2, F2000Model_V);
            }
        }
    }
}

public F2000_TakeDamage(victim, inflictor, attacker, Float:damage, damagetype) {
    if(is_user_connected(attacker) && !(damagetype & DMG_HEGRENADE)) {
        new Body, Target, Float:NewDamage;
        if(get_user_weapon(attacker) == CSW_F2000 && get_user_f2000(attacker)) {
            if(is_user_connected(victim)) {
                get_user_aiming(attacker, Target, Body, 999999);
                NewDamage = float(get_damage_body(Body, get_pcvar_float(f2000damage)));
                SetHamParamFloat(4, NewDamage);
            }
            else {
                SetHamParamFloat(4, get_pcvar_float(f2000damage));
            }
        }
    }
}

public F2000_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_F2000)
        return HAM_IGNORED;
    if(!get_user_f2000(attacker))
        return HAM_IGNORED;

    static Float:End[3];
    get_tr2(pentru, TR_vecEndPos, End);

    Make_Bullet(attacker, End);

    return HAM_HANDLED;
}

public F2000_AddToPlayer(Weapon, id) {
    if(is_valid_ent(Weapon) && is_user_connected(id) && entity_get_int(Weapon, EV_INT_impulse) == F2000_WEAPONKEY) {
        HaveF2000[id] = true;
        entity_set_int(Weapon, EV_INT_impulse, 0);
        WeaponList(id, F2000_WEAPONKEY)
    }
}

public F2000_Deploy_Post(entity) {
    static Owner;
    Owner = get_pdata_cbase(entity, 41, 4);
    if(get_user_f2000(Owner)) {
        set_pev(Owner, pev_viewmodel2, F2000Model_V);
        set_pev(Owner, pev_weaponmodel2, F2000Model_P);
        set_pdata_float(Owner, 83, 1.0, 5);
        set_weapon_anim(Owner, 2);
        static clip;
        clip = cs_get_weapon_ammo(entity);
        if(clip > 0)
            f2000_reload[Owner] = 0;
    }
}

public F2000_PrimaryAttack(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);

    if(get_user_f2000(id)) {
        pev(id,pev_punchangle,cl_pushangle[id]);
        f2000_clip[id] = cs_get_weapon_ammo(Weapon);
    }
}

public F2000_PrimaryAttack_Post(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);
    new ActiveItem = get_pdata_cbase(id, 373) ;

    if(f2000_clip[id] > 0 && pev_valid(ActiveItem)) {
        if(is_user_alive(id) && get_user_f2000(id)) {
            set_pdata_int(ActiveItem, 57, Shell, 4);
            set_pdata_float(id, 111, get_gametime());

            new Float:Push[3];
            if(get_user_f2000(id) && cs_get_user_zoom(id) == CS_SET_AUGSG552_ZOOM) {
                pev(id, pev_punchangle, Push);
                xs_vec_sub(Push, cl_pushangle[id], Push);

                xs_vec_mul_scalar(Push, 0.0, Push);
                xs_vec_add(Push, cl_pushangle[id], Push);
                set_pev(id, pev_punchangle, Push);
            }
            else {
                pev(id,pev_punchangle,Push);
                xs_vec_sub(Push,cl_pushangle[id],Push);

                xs_vec_mul_scalar(Push,get_pcvar_float(f2000recoil),Push);
                xs_vec_add(Push,cl_pushangle[id],Push);
                set_pev(id,pev_punchangle,Push);
            }
            emit_sound(id, CHAN_WEAPON, F2000_Sound[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
            set_weapon_anim(id, random_num(3,5));
        }
    }
}

public F2000_Reload(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_f2000(id))
        return HAM_IGNORED;

    f2000_clip[id] = -1;

    new Ammo = cs_get_user_bpammo(id, CSW_F2000);
    if(Ammo <= 0)
        return HAM_SUPERCEDE;

    new Clip = get_pdata_int(ent, 51, 4);
    if(Clip >= get_pcvar_num(f2000clip))
        return HAM_SUPERCEDE;

    f2000_clip[id] = Clip;
    f2000_reload[id] = 1;
    set_pev(id, pev_viewmodel2, F2000Model_V);
    return HAM_IGNORED;
}

public F2000_Reload_Post(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_f2000(id))
        return HAM_IGNORED;

    if(f2000_clip[id] == -1)
        return HAM_IGNORED;

    new Float:reload_time = get_pcvar_float(f2000reloadtime);

    set_pdata_int(ent, 51, f2000_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, 1);
    return HAM_IGNORED;
}

public F2000_PostFrame(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_f2000(id))
        return HAM_IGNORED;

    new Float:NextAttack = get_pdata_float(id, 83, 5);
    new Ammo = cs_get_user_bpammo(id, CSW_F2000);

    new Clip = get_pdata_int(ent, 51, 4);
    new InReload = get_pdata_int(ent, 54, 4);

    if(InReload && NextAttack <= 0.0) {
        new Temp = min(get_pcvar_num(f2000clip) - Clip, Ammo);

        set_pdata_int(ent, 51, Clip + Temp, 4);
        cs_set_user_bpammo(id, CSW_F2000, Ammo - Temp);
        set_pdata_int(ent, 54, 0, 4);

        InReload = 0;
        f2000_reload[id] = 0;
    }

    return HAM_IGNORED;
}

public Hook_F2000(id) {
    engclient_cmd(id, weapon_f2000);
}

public get_user_f2000(id) {
    return HaveF2000[id];
}

public set_user_f2000(id, f2000) {
    if(f2000) {
        if(!HaveF2000[id]) {
            drop_primary_weapons(id);
            HaveF2000[id] = true;
            f2000_reload[id] = 0;
            WeaponList(id, F2000_WEAPONKEY)
            fm_give_item(id, weapon_f2000);
            new Clip = fm_get_user_weapon_entity(id, CSW_F2000);
            cs_set_weapon_ammo(Clip, get_pcvar_num(f2000clip));
        }
    }
    else {
        if(HaveF2000[id]) {
            HaveF2000[id] = false;
        }
    }
}
#endif

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//---------------------------------------| HK416 |--------------------------------------------------------
//======================================= sDs|Aragon* =======================================================
#if defined HK416
HK416_Init() {
    register_clcmd("furien30_hk416", "Hook_HK416");

    register_message(get_user_msgid("DeathMsg"), "HK416_DeathMsg");

    register_event("CurWeapon", "HK416_ViewModel", "be", "1=1");
    register_event("WeapPickup","HK416_ViewModel","b","1=19");

    register_forward(FM_SetModel, "HK416_WorldModel");
    register_forward(FM_UpdateClientData, "HK416_UpdateClientData_Post", 1);
    register_forward(FM_PlaybackEvent, "HK416_PlaybackEvent");

    RegisterHam(Ham_TakeDamage, "player", "HK416_TakeDamage");
    RegisterHam(Ham_TraceAttack, "worldspawn", "HK416_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "player", "HK416_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_breakable", "HK416_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_wall", "HK416_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door", "HK416_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door_rotating", "HK416_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_plat", "HK416_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_rotating", "HK416_TraceAttack_Post", 1);
    RegisterHam(Ham_Item_Deploy , weapon_hk416, "HK416_Deploy_Post", 1);
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_hk416, "HK416_PrimaryAttack");
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_hk416, "HK416_PrimaryAttack_Post", 1);
    RegisterHam(Ham_Item_AddToPlayer, weapon_hk416, "HK416_AddToPlayer");
    RegisterHam(Ham_Weapon_Reload, weapon_hk416, "HK416_Reload");
    RegisterHam(Ham_Weapon_Reload, weapon_hk416, "HK416_Reload_Post", 1);
    RegisterHam(Ham_Item_PostFrame, weapon_hk416, "HK416_PostFrame");

    hk416damage = register_cvar("furien30_hk416_damage", "50");         //| HK416 Damage |//
    hk416clip = register_cvar("furien30_hk416_clip", "35");             //| HK416 Clip |//
    hk416reloadtime = register_cvar("furien30_hk416_reload_time", "3.08");      //| HK416 Reload Time |//
    hk416recoil = register_cvar("furien30_hk416_recoil", "0.8");            //| HK416 Recoil |//
}

HK416_Precache() {
    register_forward(FM_PrecacheEvent, "HK416_PrecacheEvent_Post", 1);

    precache_model(HK416Model_V);
    precache_model(HK416Model_P);
    precache_model(HK416Model_W);
    for(new i = 0; i < sizeof(HK416_Sound); i++)
        engfunc(EngFunc_PrecacheSound, HK416_Sound[i]);
    for(new i = 0; i < sizeof(HK416_Generic); i++)
        engfunc(EngFunc_PrecacheGeneric, HK416_Generic[i]);
}

HK416_Natives() {
    register_native("get_user_hk416", "get_user_hk416", 1);
    register_native("set_user_hk416", "set_user_hk416", 1);
}

HK416_Menu(const Num[] = "1") {
    new _HK416[256];
    formatex(_HK416,sizeof(_HK416)-1,"\wHK416");
    menu_additem(Menu, _HK416, Num, 0);
}

public HK416_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, "m4a1") && get_user_weapon(Attacker) == CSW_HK416) {
        if(get_user_hk416(Attacker))
            set_msg_arg_string(4, "HK416");
    }
    return PLUGIN_CONTINUE;
}

public HK416_ViewModel(id) {
    if(get_user_weapon(id) == CSW_HK416 && get_user_hk416(id)) {
        set_pev(id, pev_viewmodel2, HK416Model_V);
        set_pev(id, pev_weaponmodel2, HK416Model_P);
    }
}

public HK416_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 _HK416 = find_ent_by_owner(-1, weapon_hk416, entity);

    if(get_user_hk416(Owner) && is_valid_ent(_HK416) && equal(model, "models/w_m4a1.mdl")) {
        entity_set_int(_HK416, EV_INT_impulse, HK416_WEAPONKEY);
        HaveHK416[Owner] = false;
        entity_set_model(entity, HK416Model_W);
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}

public HK416_UpdateClientData_Post(id, sendweapons, cd_handle) {
    if(is_user_alive(id) && is_user_connected(id)) {
        if(get_user_weapon(id) == CSW_HK416 && get_user_hk416(id))
            set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001);
    }
}

public HK416_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 != hk416_event)
        return FMRES_IGNORED;

    playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2);

    return FMRES_SUPERCEDE;
}

public HK416_PrecacheEvent_Post(type, const name[]) {
    if (equal("events/m4a1.sc", name)) {
        hk416_event = get_orig_retval();
        return FMRES_HANDLED;
    }
    return FMRES_IGNORED;
}

public HK416_TakeDamage(victim, inflictor, attacker, Float:damage, damagetype) {
    if(is_user_connected(attacker) && !(damagetype & DMG_HEGRENADE)) {
        new Body, Target, Float:NewDamage;
        if(get_user_weapon(attacker) == CSW_HK416 && get_user_hk416(attacker)) {
            if(is_user_connected(victim)) {
                get_user_aiming(attacker, Target, Body, 999999);
                NewDamage = float(get_damage_body(Body, get_pcvar_float(hk416damage)));
                SetHamParamFloat(4, NewDamage);
            }
            else {
                SetHamParamFloat(4, get_pcvar_float(hk416damage));
            }
        }
    }
}

public HK416_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_HK416)
        return HAM_IGNORED;
    if(!get_user_hk416(attacker))
        return HAM_IGNORED;

    static Float:End[3];
    get_tr2(pentru, TR_vecEndPos, End);

    Make_Bullet(attacker, End);

    return HAM_HANDLED;
}

public HK416_AddToPlayer(Weapon, id) {
    if(is_valid_ent(Weapon) && is_user_connected(id) && entity_get_int(Weapon, EV_INT_impulse) == HK416_WEAPONKEY) {
        HaveHK416[id] = true;
        entity_set_int(Weapon, EV_INT_impulse, 0);
        WeaponList(id, HK416_WEAPONKEY)
    }
}

public HK416_Deploy_Post(entity) {
    static Owner;
    Owner = get_pdata_cbase(entity, 41, 4);
    if(get_user_hk416(Owner)) {
        set_pev(Owner, pev_viewmodel2, HK416Model_V);
        set_pev(Owner, pev_weaponmodel2, HK416Model_P);
        set_pdata_float(Owner, 83, 1.2, 5);
        set_weapon_anim(Owner, cs_get_weapon_silen(entity) ? 5 : 12)
        static clip;
        clip = cs_get_weapon_ammo(entity);
        if(clip > 0)
            hk416_reload[Owner] = 0;
    }
}

public HK416_PrimaryAttack(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);

    if (get_user_hk416(id)) {
        pev(id,pev_punchangle,cl_pushangle[id]);
        hk416_clip[id] = cs_get_weapon_ammo(Weapon);
    }
}

public HK416_PrimaryAttack_Post(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);
    new ActiveItem = get_pdata_cbase(id, 373) ;

    if(hk416_clip[id] > 0 && pev_valid(ActiveItem)) {
        if(is_user_alive(id) && get_user_hk416(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(hk416recoil),Push);
            xs_vec_add(Push,cl_pushangle[id],Push);
            set_pev(id,pev_punchangle,Push);

            emit_sound(id, CHAN_WEAPON, HK416_Sound[cs_get_weapon_silen(Weapon) ? 0 : 1], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
            set_weapon_anim(id, cs_get_weapon_silen(Weapon) ? random_num(1, 3) : random_num(8, 10))
        }
    }
}

public HK416_Reload(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_hk416(id))
        return HAM_IGNORED;

    hk416_clip[id] = -1;

    new Ammo = cs_get_user_bpammo(id, CSW_HK416);
    if(Ammo <= 0)
        return HAM_SUPERCEDE;

    new Clip = get_pdata_int(ent, 51, 4);
    if(Clip >= get_pcvar_num(hk416clip))
        return HAM_SUPERCEDE;

    hk416_clip[id] = Clip;
    hk416_reload[id] = 1;

    return HAM_IGNORED;
}

public HK416_Reload_Post(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_hk416(id))
        return HAM_IGNORED;

    if(hk416_clip[id] == -1)
        return HAM_IGNORED;

    new Float:reload_time = get_pcvar_float(hk416reloadtime);

    set_pdata_int(ent, 51, hk416_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, cs_get_weapon_silen(ent) ? 4 : 11)
    return HAM_IGNORED;
}

public HK416_PostFrame(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_hk416(id))
        return HAM_IGNORED;

    new Float:NextAttack = get_pdata_float(id, 83, 5);
    new Ammo = cs_get_user_bpammo(id, CSW_HK416);

    new Clip = get_pdata_int(ent, 51, 4);
    new InReload = get_pdata_int(ent, 54, 4);

    if(InReload && NextAttack <= 0.0) {
        new Temp = min(get_pcvar_num(hk416clip) - Clip, Ammo);

        set_pdata_int(ent, 51, Clip + Temp, 4);
        cs_set_user_bpammo(id, CSW_HK416, Ammo - Temp);
        set_pdata_int(ent, 54, 0, 4);

        InReload = 0;
        hk416_reload[id] = 0;
    }

    return HAM_IGNORED;
}

public Hook_HK416(id) {
    engclient_cmd(id, weapon_hk416);
}

public get_user_hk416(id) {
    return HaveHK416[id];
}

public set_user_hk416(id, hk416) {
    if(hk416) {
        if(!HaveHK416[id]) {
            drop_primary_weapons(id);
            HaveHK416[id] = true;
            hk416_reload[id] = 0;
            WeaponList(id, HK416_WEAPONKEY)
            fm_give_item(id, weapon_hk416);
            new Clip = fm_get_user_weapon_entity(id, CSW_HK416);
            cs_set_weapon_ammo(Clip, get_pcvar_num(hk416clip));
        }
    }
    else {
        if(HaveHK416[id]) {
            HaveHK416[id] = false;
        }
    }
}
#endif

//--------------------------------------| AK47 Knife |-------------------------------------------------------
//======================================= sDs|Aragon* =======================================================
#if defined AK47KNIFE
AK47Knife_Init() {
    register_clcmd("furien30_ak47knife", "Hook_AK47Knife");

    register_message(get_user_msgid("DeathMsg"), "AK47Knife_DeathMsg");

    register_event("CurWeapon", "AK47Knife_ViewModel", "be", "1=1");
    register_event("WeapPickup","AK47Knife_ViewModel","b","1=19");

    register_forward(FM_SetModel, "AK47Knife_WorldModel");
    register_forward(FM_UpdateClientData, "AK47Knife_UpdateClientData_Post", 1);
    register_forward(FM_PlaybackEvent, "AK47Knife_PlaybackEvent");
    register_forward(FM_CmdStart, "AK47Knife_CmdStart");

    RegisterHam(Ham_TakeDamage, "player", "AK47Knife_TakeDamage");
    RegisterHam(Ham_TraceAttack, "worldspawn", "AK47Knife_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "player", "AK47Knife_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_breakable", "AK47Knife_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_wall", "AK47Knife_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door", "AK47Knife_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door_rotating", "AK47Knife_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_plat", "AK47Knife_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_rotating", "AK47Knife_TraceAttack_Post", 1);
    RegisterHam(Ham_Item_Deploy , weapon_ak47knife, "AK47Knife_Deploy_Post", 1);
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_ak47knife, "AK47Knife_PrimaryAttack");
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_ak47knife, "AK47Knife_PrimaryAttack_Post", 1);
    RegisterHam(Ham_Item_AddToPlayer, weapon_ak47knife, "AK47Knife_AddToPlayer");
    RegisterHam(Ham_Weapon_Reload, weapon_ak47knife, "AK47Knife_Reload");
    RegisterHam(Ham_Weapon_Reload, weapon_ak47knife, "AK47Knife_Reload_Post", 1);
    RegisterHam(Ham_Item_PostFrame, weapon_ak47knife, "AK47Knife_PostFrame");

    ak47knifedamage = register_cvar("furien30_ak47knife_damage", "45");             //| AK47 Knife Damage |//
    ak47knifeclip = register_cvar("furien30_ak47knife_clip", "30");             //| AK47 Knife Clip |//
    ak47knifereloadtime = register_cvar("furien30_ak47knife_reload_time", "2.45");      //| AK47 Knife Reload Time |//
    ak47kniferecoil = register_cvar("furien30_ak47knife_recoil", "0.8");            //| AK47 Knife Recoil |//
    ak47knifeabilitydamage = register_cvar("furien30_ak47knife_ability_damage", "150");     //| AK47 Knife Ability Damage |//
    ak47knifeabilityknockback = register_cvar("furien30_ak47knife_ability_knockback", "3"); //| AK47 Knife Ability KnockBack |//
}

AK47Knife_Precache() {
    register_forward(FM_PrecacheEvent, "AK47Knife_PrecacheEvent_Post", 1);

    precache_model(AK47KnifeModel_V);
    precache_model(AK47KnifeModel_P);
    precache_model(AK47KnifeModel_W);
    for(new i = 0; i < sizeof(AK47Knife_Sound); i++)
        engfunc(EngFunc_PrecacheSound, AK47Knife_Sound[i]);
    for(new i = 0; i < sizeof(AK47Knife_Generic); i++)
        engfunc(EngFunc_PrecacheGeneric, AK47Knife_Generic[i]);
}

AK47Knife_Natives() {
    register_native("get_user_ak47knife", "get_user_ak47knife", 1);
    register_native("set_user_ak47knife", "set_user_ak47knife", 1);
}

AK47Knife_Menu(const Num[] = "1") {
    new AK47Knife[256];
    formatex(AK47Knife,sizeof(AK47Knife)-1,"\wAK47Knife");
    menu_additem(Menu, AK47Knife, Num, 0);
}

public AK47Knife_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, "ak47") && get_user_weapon(Attacker) == CSW_AK47KNIFE) {
        if(get_user_ak47knife(Attacker))
            set_msg_arg_string(4, "AK47 Knife");
    }
    return PLUGIN_CONTINUE;
}

public AK47Knife_ViewModel(id) {
    if(get_user_weapon(id) == CSW_AK47KNIFE && get_user_ak47knife(id)) {
        set_pev(id, pev_viewmodel2, AK47KnifeModel_V);
        set_pev(id, pev_weaponmodel2, AK47KnifeModel_P);
    }
}

public AK47Knife_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 AK47Knife = find_ent_by_owner(-1, weapon_ak47knife, entity);

    if(get_user_ak47knife(Owner) && is_valid_ent(AK47Knife) && equal(model, "models/w_ak47.mdl")) {
        entity_set_int(AK47Knife, EV_INT_impulse, AK47KNIFE_WEAPONKEY);
        HaveAK47Knife[Owner] = false;
        entity_set_model(entity, AK47KnifeModel_W);
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}

public AK47Knife_UpdateClientData_Post(id, sendweapons, cd_handle) {
    if(is_user_alive(id) && is_user_connected(id)) {
        if(get_user_weapon(id) == CSW_AK47KNIFE && get_user_ak47knife(id))
            set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001);
    }
}

public AK47Knife_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 != ak47knife_event)
        return FMRES_IGNORED;

    playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2);

    return FMRES_SUPERCEDE;
}

public AK47Knife_PrecacheEvent_Post(type, const name[]) {
    if (equal("events/mp5navy.sc", name)) {
        ak47knife_event = get_orig_retval();
        return FMRES_HANDLED;
    }
    return FMRES_IGNORED;
}

public AK47Knife_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);

        if(CurButton & IN_ATTACK2) {
            if(get_user_weapon(id) == CSW_AK47KNIFE && get_user_ak47knife(id) && NextAttack <= 0.0) {
                AK47Knife_Ability(id);
                CurButton &= ~IN_ATTACK2;
                set_uc(uc_handle, UC_Buttons, CurButton);
            }
        }
    }
}

public AK47Knife_TakeDamage(victim, inflictor, attacker, Float:damage, damagetype) {
    if(is_user_connected(attacker) && !(damagetype & DMG_HEGRENADE)) {
        new Body, Target, Float:NewDamage;
        if(get_user_weapon(attacker) == CSW_AK47KNIFE && get_user_ak47knife(attacker)) {
            if(is_user_connected(victim)) {
                get_user_aiming(attacker, Target, Body, 999999);
                NewDamage = float(get_damage_body(Body, get_pcvar_float(ak47knifedamage)));
                SetHamParamFloat(4, NewDamage);
            }
            else {
                SetHamParamFloat(4, get_pcvar_float(ak47knifedamage));
            }
        }
    }
}

public AK47Knife_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_AK47KNIFE)
        return HAM_IGNORED;
    if(!get_user_ak47knife(attacker))
        return HAM_IGNORED;

    static Float:End[3];
    get_tr2(pentru, TR_vecEndPos, End);

    Make_Bullet(attacker, End);

    return HAM_HANDLED;
}

public AK47Knife_AddToPlayer(Weapon, id) {
    if(is_valid_ent(Weapon) && is_user_connected(id) && entity_get_int(Weapon, EV_INT_impulse) == AK47KNIFE_WEAPONKEY) {
        HaveAK47Knife[id] = true;
        entity_set_int(Weapon, EV_INT_impulse, 0);
        WeaponList(id, AK47KNIFE_WEAPONKEY)
    }
}

public AK47Knife_Deploy_Post(entity) {
    static Owner;
    Owner = get_pdata_cbase(entity, 41, 4);
    if(get_user_ak47knife(Owner)) {
        set_pev(Owner, pev_viewmodel2, AK47KnifeModel_V);
        set_pev(Owner, pev_weaponmodel2, AK47KnifeModel_P);
        set_pdata_float(Owner, 83, 1.03, 5);
        set_weapon_anim(Owner, 2);
        static clip;
        clip = cs_get_weapon_ammo(entity);
        if(clip > 0)
            ak47knife_reload[Owner] = 0;
    }
}

public AK47Knife_PrimaryAttack(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);

    if (get_user_ak47knife(id)) {
        pev(id,pev_punchangle,cl_pushangle[id]);
        ak47knife_clip[id] = cs_get_weapon_ammo(Weapon);
    }
}

public AK47Knife_PrimaryAttack_Post(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);
    new ActiveItem = get_pdata_cbase(id, 373) ;

    if(ak47knife_clip[id] > 0 && pev_valid(ActiveItem)) {
        if(is_user_alive(id) && get_user_ak47knife(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(ak47kniferecoil),Push);
            xs_vec_add(Push,cl_pushangle[id],Push);
            set_pev(id,pev_punchangle,Push);

            emit_sound(id, CHAN_WEAPON, AK47Knife_Sound[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
            set_weapon_anim(id, random_num(3,5));
        }
    }
}

public AK47Knife_Reload(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_ak47knife(id))
        return HAM_IGNORED;

    ak47knife_clip[id] = -1;

    new Ammo = cs_get_user_bpammo(id, CSW_AK47KNIFE);
    if(Ammo <= 0)
        return HAM_SUPERCEDE;

    new Clip = get_pdata_int(ent, 51, 4);
    if(Clip >= get_pcvar_num(ak47knifeclip))
        return HAM_SUPERCEDE;

    ak47knife_clip[id] = Clip;
    ak47knife_reload[id] = 1;

    return HAM_IGNORED;
}

public AK47Knife_Reload_Post(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_ak47knife(id))
        return HAM_IGNORED;

    if(ak47knife_clip[id] == -1)
        return HAM_IGNORED;

    new Float:reload_time = get_pcvar_float(ak47knifereloadtime);

    set_pdata_int(ent, 51, ak47knife_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, 1);
    return HAM_IGNORED;
}

public AK47Knife_PostFrame(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_ak47knife(id))
        return HAM_IGNORED;

    new Float:NextAttack = get_pdata_float(id, 83, 5);
    new Ammo = cs_get_user_bpammo(id, CSW_AK47KNIFE);

    new Clip = get_pdata_int(ent, 51, 4);
    new InReload = get_pdata_int(ent, 54, 4);

    if(InReload && NextAttack <= 0.0) {
        new Temp = min(get_pcvar_num(ak47knifeclip) - Clip, Ammo);

        set_pdata_int(ent, 51, Clip + Temp, 4);
        cs_set_user_bpammo(id, CSW_AK47KNIFE, Ammo - Temp);
        set_pdata_int(ent, 54, 0, 4);

        InReload = 0;
        ak47knife_reload[id] = 0;
    }

    return HAM_IGNORED;
}

public AK47Knife_Ability(id) {
    if(is_user_alive(id)) {
        set_pdata_float(id, 83, 1.33, 5);
        set_weapon_anim(id, 6);

        new Float:Origin[3],Float:VictimOrigin[3], Victim, Body ,AimOrigin[3],Float:AimOrigin2[3];
        get_user_aiming(id, Victim, Body, 999999);
        get_user_origin(id, AimOrigin, 3);

        AimOrigin2[0] = float(AimOrigin[0]);
        AimOrigin2[1] = float(AimOrigin[1]);
        AimOrigin2[2] = float(AimOrigin[2]);

        pev(id, pev_origin, Origin);
        pev(Victim, pev_origin, VictimOrigin);

        if(get_distance_f(Origin, VictimOrigin) <= 60.0) {
            if(is_user_connected(Victim) && is_user_alive(Victim) && !fm_get_user_godmode(Victim) && get_user_team(Victim) != get_user_team(id) && Victim != id) {
                new Float:Damage = float(get_damage_body(Body, get_pcvar_float(ak47knifeabilitydamage)));

                new BloodColor = ExecuteHam(Ham_BloodColor, Victim);
                if(BloodColor != -1) {
                    new Amount = floatround(Damage);

                    Amount *= 2; //according to HLSDK

                    message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
                    write_byte(TE_BLOODSPRITE);
                    write_coord(floatround(AimOrigin2[0]));
                    write_coord(floatround(AimOrigin2[1]));
                    write_coord(floatround(AimOrigin2[2]));
                    write_short(BloodSpray);
                    write_short(BloodDrop);
                    write_byte(BloodColor);
                    write_byte(min(max(3, Amount/10), 16));
                    message_end();
                }

                make_knockback(Victim, AimOrigin2, get_pcvar_float(ak47knifeabilityknockback)*Damage);

                if(get_user_health(Victim) - Damage >= 1) {
                    ExecuteHam(Ham_TakeDamage, Victim, id, id, Damage, DMG_SLASH);

                }
                else {
                    death_message(id, Victim, "AK47 Knife Ability");
                }
            }
            emit_sound(id, CHAN_WEAPON,AK47Knife_Sound[2], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
        }
        else if(get_distance_f(Origin, AimOrigin2) <= 60.0) {
            if(pev_valid(Victim) && get_user_team(id) != pev(Victim, pev_team))
                set_pev(Victim, pev_health, pev(Victim, pev_health) - get_pcvar_float(ak47knifeabilitydamage));

            emit_sound(id, CHAN_WEAPON,AK47Knife_Sound[3], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
        }
        else
            emit_sound(id, CHAN_WEAPON,AK47Knife_Sound[4], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    }
}

public Hook_AK47Knife(id) {
    engclient_cmd(id, weapon_ak47knife);
}

public get_user_ak47knife(id) {
    return HaveAK47Knife[id];
}

public set_user_ak47knife(id, ak47knife) {
    if(ak47knife) {
        if(!HaveAK47Knife[id]) {
            drop_primary_weapons(id);
            HaveAK47Knife[id] = true;
            ak47knife_reload[id] = 0;
            WeaponList(id, AK47KNIFE_WEAPONKEY)
            fm_give_item(id, weapon_ak47knife);
            new Clip = fm_get_user_weapon_entity(id, CSW_AK47KNIFE);
            cs_set_weapon_ammo(Clip, get_pcvar_num(ak47knifeclip));
        }
    }
    else {
        if(HaveAK47Knife[id]) {
            HaveAK47Knife[id] = false;
        }
    }
}
#endif

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------| Tar21 |----------------------------------------------------------
//======================================= sDs|Aragon* =======================================================
#if defined TAR21
Tar21_Init() {
    register_clcmd("furien30_tar21", "Hook_Tar21");

    register_message(get_user_msgid("DeathMsg"), "Tar21_DeathMsg");

    register_event("CurWeapon", "Tar21_ViewModel", "be", "1=1");
    register_event("WeapPickup","Tar21_ViewModel","b","1=19");

    register_forward(FM_SetModel, "Tar21_WorldModel");
    register_forward(FM_UpdateClientData, "Tar21_UpdateClientData_Post", 1);
    register_forward(FM_PlaybackEvent, "Tar21_PlaybackEvent");

    RegisterHam(Ham_TakeDamage, "player", "Tar21_TakeDamage");
    RegisterHam(Ham_TraceAttack, "worldspawn", "Tar21_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "player", "Tar21_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_breakable", "Tar21_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_wall", "Tar21_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door", "Tar21_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door_rotating", "Tar21_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_plat", "Tar21_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_rotating", "Tar21_TraceAttack_Post", 1);
    RegisterHam(Ham_Item_Deploy , weapon_tar21, "Tar21_Deploy_Post", 1);
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_tar21, "Tar21_PrimaryAttack");
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_tar21, "Tar21_PrimaryAttack_Post", 1);
    RegisterHam(Ham_Item_AddToPlayer, weapon_tar21, "Tar21_AddToPlayer");
    RegisterHam(Ham_Weapon_Reload, weapon_tar21, "Tar21_Reload");
    RegisterHam(Ham_Weapon_Reload, weapon_tar21, "Tar21_Reload_Post", 1);
    RegisterHam(Ham_Item_PostFrame, weapon_tar21, "Tar21_PostFrame");

    tar21damage = register_cvar("furien30_tar21_damage", "40");         //| Tar21 Damage |//
    tar21clip = register_cvar("furien30_tar21_clip", "35");         //| Tar21 Clip |//
    tar21reloadtime = register_cvar("furien30_tar21_reload_time", "3.13");      //| Tar21 Reload Time |//
    tar21recoil = register_cvar("furien30_tar21_recoil", "0.8");            //| Tar21 Recoil |//
}

Tar21_Precache() {
    register_forward(FM_PrecacheEvent, "Tar21_PrecacheEvent_Post", 1);

    precache_model(Tar21Model_V);
    precache_model(Tar21Model_P);
    precache_model(Tar21Model_W);
    for(new i = 0; i < sizeof(Tar21_Sound); i++)
        engfunc(EngFunc_PrecacheSound, Tar21_Sound[i]);
    for(new i = 0; i < sizeof(Tar21_Generic); i++)
        engfunc(EngFunc_PrecacheGeneric, Tar21_Generic[i]);
}

Tar21_Natives() {
    register_native("get_user_tar21", "get_user_tar21", 1);
    register_native("set_user_tar21", "set_user_tar21", 1);
}

Tar21_Menu(const Num[] = "1") {
    new Tar21[256];
    formatex(Tar21,sizeof(Tar21)-1,"\wTar21");
    menu_additem(Menu, Tar21, Num, 0);
}

public Tar21_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, "sg552") && get_user_weapon(Attacker) == CSW_TAR21) {
        if(get_user_tar21(Attacker))
            set_msg_arg_string(4, "Tar21");
    }
    return PLUGIN_CONTINUE;
}

public Tar21_ViewModel(id) {
    if(get_user_weapon(id) == CSW_TAR21 && get_user_tar21(id)) {
        set_pev(id, pev_viewmodel2, Tar21Model_V);
        set_pev(id, pev_weaponmodel2, Tar21Model_P);
    }
}

public Tar21_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 Tar21 = find_ent_by_owner(-1, weapon_tar21, entity);

    if(get_user_tar21(Owner) && is_valid_ent(Tar21) && equal(model, "models/w_sg552.mdl")) {
        entity_set_int(Tar21, EV_INT_impulse, TAR21_WEAPONKEY);
        HaveTar21[Owner] = false;
        entity_set_model(entity, Tar21Model_W);
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}

public Tar21_UpdateClientData_Post(id, sendweapons, cd_handle) {
    if(is_user_alive(id) && is_user_connected(id)) {
        if(get_user_weapon(id) == CSW_TAR21 && get_user_tar21(id))
            set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001);
    }
}

public Tar21_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 != tar21_event)
        return FMRES_IGNORED;

    playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2);

    return FMRES_SUPERCEDE;
}

public Tar21_PrecacheEvent_Post(type, const name[]) {
    if (equal("events/sg552.sc", name)) {
        tar21_event = get_orig_retval();
        return FMRES_HANDLED;
    }
    return FMRES_IGNORED;
}

public Tar21_TakeDamage(victim, inflictor, attacker, Float:damage, damagetype) {
    if(is_user_connected(attacker) && !(damagetype & DMG_HEGRENADE)) {
        new Body, Target, Float:NewDamage;
        if(get_user_weapon(attacker) == CSW_TAR21 && get_user_tar21(attacker)) {
            if(is_user_connected(victim)) {
                get_user_aiming(attacker, Target, Body, 999999);
                NewDamage = float(get_damage_body(Body, get_pcvar_float(tar21damage)));
                SetHamParamFloat(4, NewDamage);
            }
            else {
                SetHamParamFloat(4, get_pcvar_float(tar21damage));
            }
        }
    }
}

public Tar21_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_TAR21)
        return HAM_IGNORED;
    if(!get_user_tar21(attacker))
        return HAM_IGNORED;

    static Float:End[3];
    get_tr2(pentru, TR_vecEndPos, End);

    Make_Bullet(attacker, End);

    return HAM_HANDLED;
}

public Tar21_AddToPlayer(Weapon, id) {
    if(is_valid_ent(Weapon) && is_user_connected(id) && entity_get_int(Weapon, EV_INT_impulse) == TAR21_WEAPONKEY) {
        HaveTar21[id] = true;
        entity_set_int(Weapon, EV_INT_impulse, 0);
        WeaponList(id, TAR21_WEAPONKEY)
    }
}

public Tar21_Deploy_Post(entity) {
    static Owner;
    Owner = get_pdata_cbase(entity, 41, 4);
    if(get_user_tar21(Owner)) {
        set_pev(Owner, pev_viewmodel2, Tar21Model_V);
        set_pev(Owner, pev_weaponmodel2, Tar21Model_P);
        set_pdata_float(Owner, 83, 1.2, 5);
        set_weapon_anim(Owner, 2);
        static clip;
        clip = cs_get_weapon_ammo(entity);
        if(clip > 0)
            tar21_reload[Owner] = 0;
    }
}

public Tar21_PrimaryAttack(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);

    if (get_user_tar21(id)) {
        pev(id,pev_punchangle,cl_pushangle[id]);
        tar21_clip[id] = cs_get_weapon_ammo(Weapon);
    }
}

public Tar21_PrimaryAttack_Post(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);
    new ActiveItem = get_pdata_cbase(id, 373) ;

    if(tar21_clip[id] > 0 && pev_valid(ActiveItem)) {
        if(is_user_alive(id) && get_user_tar21(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(tar21recoil),Push);
            xs_vec_add(Push,cl_pushangle[id],Push);
            set_pev(id,pev_punchangle,Push);

            emit_sound(id, CHAN_WEAPON, Tar21_Sound[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
            set_weapon_anim(id, random_num(3,5));
        }
    }
}

public Tar21_Reload(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_tar21(id))
        return HAM_IGNORED;

    tar21_clip[id] = -1;

    new Ammo = cs_get_user_bpammo(id, CSW_TAR21);
    if(Ammo <= 0)
        return HAM_SUPERCEDE;

    new Clip = get_pdata_int(ent, 51, 4);
    if(Clip >= get_pcvar_num(tar21clip))
        return HAM_SUPERCEDE;

    tar21_clip[id] = Clip;
    tar21_reload[id] = 1;

    return HAM_IGNORED;
}

public Tar21_Reload_Post(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_tar21(id))
        return HAM_IGNORED;

    if(tar21_clip[id] == -1)
        return HAM_IGNORED;

    new Float:reload_time = get_pcvar_float(tar21reloadtime);

    set_pdata_int(ent, 51, tar21_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, 1);
    return HAM_IGNORED;
}

public Tar21_PostFrame(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_tar21(id))
        return HAM_IGNORED;

    new Float:NextAttack = get_pdata_float(id, 83, 5);
    new Ammo = cs_get_user_bpammo(id, CSW_TAR21);

    new Clip = get_pdata_int(ent, 51, 4);
    new InReload = get_pdata_int(ent, 54, 4);

    if(InReload && NextAttack <= 0.0) {
        new Temp = min(get_pcvar_num(tar21clip) - Clip, Ammo);

        set_pdata_int(ent, 51, Clip + Temp, 4);
        cs_set_user_bpammo(id, CSW_TAR21, Ammo - Temp);
        set_pdata_int(ent, 54, 0, 4);

        InReload = 0;
        tar21_reload[id] = 0;
    }

    return HAM_IGNORED;
}

public Hook_Tar21(id) {
    engclient_cmd(id, weapon_tar21);
}

public get_user_tar21(id) {
    return HaveTar21[id];
}

public set_user_tar21(id, tar21) {
    if(tar21) {
        if(!HaveTar21[id]) {
            drop_primary_weapons(id);
            HaveTar21[id] = true;
            tar21_reload[id] = 0;
            WeaponList(id, TAR21_WEAPONKEY)
            fm_give_item(id, weapon_tar21);
            new Clip = fm_get_user_weapon_entity(id, CSW_TAR21);
            cs_set_weapon_ammo(Clip, get_pcvar_num(tar21clip));
        }
    }
    else {
        if(HaveTar21[id]) {
            HaveTar21[id] = false;
        }
    }
}
#endif

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//-----------------------------------------| M134 |----------------------------------------------------------
//======================================= sDs|Aragon* =======================================================
#if defined M134
M134_Init() {
    register_clcmd("furien30_m134", "Hook_M134");

    register_message(get_user_msgid("DeathMsg"), "M134_DeathMsg");

    register_event("CurWeapon", "M134_ViewModel", "be", "1=1");
    register_event("WeapPickup","M134_ViewModel","b","1=19");

    register_forward(FM_SetModel, "M134_WorldModel");
    register_forward(FM_UpdateClientData, "M134_UpdateClientData_Post", 1);
    register_forward(FM_PlaybackEvent, "M134_PlaybackEvent");

    RegisterHam(Ham_TakeDamage, "player", "M134_TakeDamage");
    RegisterHam(Ham_TraceAttack, "worldspawn", "M134_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "player", "M134_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_breakable", "M134_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_wall", "M134_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door", "M134_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door_rotating", "M134_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_plat", "M134_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_rotating", "M134_TraceAttack_Post", 1);
    RegisterHam(Ham_Item_Deploy , weapon_m134, "M134_Deploy_Post", 1);
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_m134, "M134_PrimaryAttack");
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_m134, "M134_PrimaryAttack_Post", 1);
    RegisterHam(Ham_Item_AddToPlayer, weapon_m134, "M134_AddToPlayer");
    RegisterHam(Ham_Weapon_Reload, weapon_m134, "M134_Reload");
    RegisterHam(Ham_Weapon_Reload, weapon_m134, "M134_Reload_Post", 1);
    RegisterHam(Ham_Item_PostFrame, weapon_m134, "M134_PostFrame");

    m134damage = register_cvar("furien30_m134_damage", "40");           //| M134 Damage |//
    m134clip = register_cvar("furien30_m134_clip", "60");           //| M134 Clip |//
    m134reloadtime = register_cvar("furien30_m134_reload_time", "5.03");    //| M134 Reload Time |//
    m134recoil = register_cvar("furien30_m134_recoil", "0.8");          //| M134 Recoil |//
}

M134_Precache() {
    register_forward(FM_PrecacheEvent, "M134_PrecacheEvent_Post", 1);

    precache_model(M134Model_V);
    precache_model(M134Model_P);
    precache_model(M134Model_W);
    for(new i = 0; i < sizeof(M134_Sound); i++)
        engfunc(EngFunc_PrecacheSound, M134_Sound[i]);
    for(new i = 0; i < sizeof(M134_Generic); i++)
        engfunc(EngFunc_PrecacheGeneric, M134_Generic[i]);
}

M134_Natives() {
    register_native("get_user_m134", "get_user_m134", 1);
    register_native("set_user_m134", "set_user_m134", 1);
}

M134_Menu(const Num[] = "1") {
    new _M134[256];
    formatex(_M134,sizeof(_M134)-1,"\wM134");
    menu_additem(Menu, _M134, Num, 0);
}

public M134_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, "m249") && get_user_weapon(Attacker) == CSW_M134) {
        if(get_user_m134(Attacker))
            set_msg_arg_string(4, "M134");
    }
    return PLUGIN_CONTINUE;
}

public M134_ViewModel(id) {
    if(get_user_weapon(id) == CSW_M134 && get_user_m134(id)) {
        set_pev(id, pev_viewmodel2, M134Model_V);
        set_pev(id, pev_weaponmodel2, M134Model_P);
    }
}

public M134_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 _M134 = find_ent_by_owner(-1, weapon_m134, entity);

    if(get_user_m134(Owner) && is_valid_ent(_M134) && equal(model, "models/w_m249.mdl")) {
        entity_set_int(_M134, EV_INT_impulse, M134_WEAPONKEY);
        HaveM134[Owner] = false;
        entity_set_model(entity, M134Model_W);
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}

public M134_UpdateClientData_Post(id, sendweapons, cd_handle) {
    if(is_user_alive(id) && is_user_connected(id)) {
        if(get_user_weapon(id) == CSW_M134 && get_user_m134(id))
            set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001);
    }
}

public M134_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 != m134_event)
        return FMRES_IGNORED;

    playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2);

    return FMRES_SUPERCEDE;
}

public M134_PrecacheEvent_Post(type, const name[]) {
    if (equal("events/m249.sc", name)) {
        m134_event = get_orig_retval();
        return FMRES_HANDLED;
    }
    return FMRES_IGNORED;
}

public M134_TakeDamage(victim, inflictor, attacker, Float:damage, damagetype) {
    if(is_user_connected(attacker) && !(damagetype & DMG_HEGRENADE)) {
        new Body, Target, Float:NewDamage;
        if(get_user_weapon(attacker) == CSW_M134 && get_user_m134(attacker)) {
            if(is_user_connected(victim)) {
                get_user_aiming(attacker, Target, Body, 999999);
                NewDamage = float(get_damage_body(Body, get_pcvar_float(m134damage)));
                SetHamParamFloat(4, NewDamage);
            }
            else {
                SetHamParamFloat(4, get_pcvar_float(m134damage));
            }
        }
    }
}

public M134_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_M134)
        return HAM_IGNORED;
    if(!get_user_m134(attacker))
        return HAM_IGNORED;

    static Float:End[3];
    get_tr2(pentru, TR_vecEndPos, End);

    Make_Bullet(attacker, End);

    return HAM_HANDLED;
}

public M134_AddToPlayer(Weapon, id) {
    if(is_valid_ent(Weapon) && is_user_connected(id) && entity_get_int(Weapon, EV_INT_impulse) == M134_WEAPONKEY) {
        HaveM134[id] = true;
        entity_set_int(Weapon, EV_INT_impulse, 0);
        WeaponList(id, M134_WEAPONKEY)
    }
}

public M134_Deploy_Post(entity) {
    static Owner;
    Owner = get_pdata_cbase(entity, 41, 4);
    if(get_user_m134(Owner)) {
        set_pev(Owner, pev_viewmodel2, M134Model_V);
        set_pev(Owner, pev_weaponmodel2, M134Model_P);
        set_pdata_float(Owner, 83, 1.03, 5);
        set_weapon_anim(Owner, 4);
        static clip;
        clip = cs_get_weapon_ammo(entity);
        if(clip > 0)
            m134_reload[Owner] = 0;
    }
}

public M134_PrimaryAttack(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);

    if (get_user_m134(id)) {
        pev(id,pev_punchangle,cl_pushangle[id]);
        m134_clip[id] = cs_get_weapon_ammo(Weapon);
    }
}

public M134_PrimaryAttack_Post(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);
    new ActiveItem = get_pdata_cbase(id, 373) ;

    if(m134_clip[id] > 0 && pev_valid(ActiveItem)) {
        if(is_user_alive(id) && get_user_m134(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(m134recoil),Push);
            xs_vec_add(Push,cl_pushangle[id],Push);
            set_pev(id,pev_punchangle,Push);

            emit_sound(id, CHAN_WEAPON, M134_Sound[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
            set_weapon_anim(id, random_num(1,2));
        }
    }
}

public M134_Reload(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_m134(id))
        return HAM_IGNORED;

    m134_clip[id] = -1;

    new Ammo = cs_get_user_bpammo(id, CSW_M134);
    if(Ammo <= 0)
        return HAM_SUPERCEDE;

    new Clip = get_pdata_int(ent, 51, 4);
    if(Clip >= get_pcvar_num(m134clip))
        return HAM_SUPERCEDE;

    m134_clip[id] = Clip;
    m134_reload[id] = 1;

    return HAM_IGNORED;
}

public M134_Reload_Post(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_m134(id))
        return HAM_IGNORED;

    if(m134_clip[id] == -1)
        return HAM_IGNORED;

    new Float:reload_time = get_pcvar_float(m134reloadtime);

    set_pdata_int(ent, 51, m134_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 M134_PostFrame(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_m134(id))
        return HAM_IGNORED;

    new Float:NextAttack = get_pdata_float(id, 83, 5);
    new Ammo = cs_get_user_bpammo(id, CSW_M134);

    new Clip = get_pdata_int(ent, 51, 4);
    new InReload = get_pdata_int(ent, 54, 4);

    if(InReload && NextAttack <= 0.0) {
        new Temp = min(get_pcvar_num(m134clip) - Clip, Ammo);

        set_pdata_int(ent, 51, Clip + Temp, 4);
        cs_set_user_bpammo(id, CSW_M134, Ammo - Temp);
        set_pdata_int(ent, 54, 0, 4);

        InReload = 0;
        m134_reload[id] = 0;
    }

    return HAM_IGNORED;
}

public Hook_M134(id) {
    engclient_cmd(id, weapon_m134);
}

public get_user_m134(id) {
    return HaveM134[id];
}

public set_user_m134(id, m134) {
    if(m134) {
        if(!HaveM134[id]) {
            drop_primary_weapons(id);
            HaveM134[id] = true;
            m134_reload[id] = 0;
            WeaponList(id, M134_WEAPONKEY)
            fm_give_item(id, weapon_m134);
            new Clip = fm_get_user_weapon_entity(id, CSW_M134);
            cs_set_weapon_ammo(Clip, get_pcvar_num(m134clip));
        }
    }
    else {
        if(HaveM134[id]) {
            HaveM134[id] = false;
        }
    }
}
#endif

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//---------------------------------------| Thompson |--------------------------------------------------------
//======================================= sDs|Aragon* =======================================================
#if defined THOMPSON
Thompson_Init() {
    register_clcmd("furien30_thompson", "Hook_Thompson");

    register_message(get_user_msgid("DeathMsg"), "Thompson_DeathMsg");

    register_event("CurWeapon", "Thompson_ViewModel", "be", "1=1");
    register_event("WeapPickup","Thompson_ViewModel","b","1=19");

    register_forward(FM_SetModel, "Thompson_WorldModel");
    register_forward(FM_UpdateClientData, "Thompson_UpdateClientData_Post", 1);
    register_forward(FM_PlaybackEvent, "Thompson_PlaybackEvent");

    RegisterHam(Ham_TakeDamage, "player", "Thompson_TakeDamage");
    RegisterHam(Ham_TraceAttack, "worldspawn", "Thompson_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "player", "Thompson_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_breakable", "Thompson_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_wall", "Thompson_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door", "Thompson_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door_rotating", "Thompson_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_plat", "Thompson_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_rotating", "Thompson_TraceAttack_Post", 1);
    RegisterHam(Ham_Item_Deploy , weapon_thompson, "Thompson_Deploy_Post", 1);
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_thompson, "Thompson_PrimaryAttack");
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_thompson, "Thompson_PrimaryAttack_Post", 1);
    RegisterHam(Ham_Item_AddToPlayer, weapon_thompson, "Thompson_AddToPlayer");
    RegisterHam(Ham_Weapon_Reload, weapon_thompson, "Thompson_Reload");
    RegisterHam(Ham_Weapon_Reload, weapon_thompson, "Thompson_Reload_Post", 1);
    RegisterHam(Ham_Item_PostFrame, weapon_thompson, "Thompson_PostFrame");

    thompsondamage = register_cvar("furien30_thompson_damage", "35");           //| Thompson Damage |//
    thompsonclip = register_cvar("furien30_thompson_clip", "40");           //| Thompson Clip |//
    thompsonreloadtime = register_cvar("furien30_thompson_reload_time", "3.7");     //| Thompson Reload Time |//
    thompsonrecoil = register_cvar("furien30_thompson_recoil", "0.8");          //| Thompson Recoil |//
}

Thompson_Precache() {
    register_forward(FM_PrecacheEvent, "Thompson_PrecacheEvent_Post", 1);

    precache_model(ThompsonModel_V);
    precache_model(ThompsonModel_P);
    precache_model(ThompsonModel_W);
    for(new i = 0; i < sizeof(Thompson_Sound); i++)
        engfunc(EngFunc_PrecacheSound, Thompson_Sound[i]);
    for(new i = 0; i < sizeof(Thompson_Generic); i++)
        engfunc(EngFunc_PrecacheGeneric, Thompson_Generic[i]);
}

Thompson_Natives() {
    register_native("get_user_thompson", "get_user_thompson", 1);
    register_native("set_user_thompson", "set_user_thompson", 1);
}

Thompson_Menu(const Num[] = "1") {
    new Thompson[256];
    formatex(Thompson,sizeof(Thompson)-1,"\wThompson");
    menu_additem(Menu, Thompson, Num, 0);
}

public Thompson_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, "p90") && get_user_weapon(Attacker) == CSW_THOMPSON) {
        if(get_user_thompson(Attacker))
            set_msg_arg_string(4, "Thompson");
    }
    return PLUGIN_CONTINUE;
}

public Thompson_ViewModel(id) {
    if(get_user_weapon(id) == CSW_THOMPSON && get_user_thompson(id)) {
        set_pev(id, pev_viewmodel2, ThompsonModel_V);
        set_pev(id, pev_weaponmodel2, ThompsonModel_P);
    }
}

public Thompson_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 Thompson = find_ent_by_owner(-1, weapon_thompson, entity);

    if(get_user_thompson(Owner) && is_valid_ent(Thompson) && equal(model, "models/w_p90.mdl")) {
        entity_set_int(Thompson, EV_INT_impulse, THOMPSON_WEAPONKEY);
        HaveThompson[Owner] = false;
        entity_set_model(entity, ThompsonModel_W);
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}

public Thompson_UpdateClientData_Post(id, sendweapons, cd_handle) {
    if(is_user_alive(id) && is_user_connected(id)) {
        if(get_user_weapon(id) == CSW_THOMPSON && get_user_thompson(id))
            set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001);
    }
}

public Thompson_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 != thompson_event)
        return FMRES_IGNORED;

    playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2);

    return FMRES_SUPERCEDE;
}

public Thompson_PrecacheEvent_Post(type, const name[]) {
    if (equal("events/p90.sc", name)) {
        thompson_event = get_orig_retval();
        return FMRES_HANDLED;
    }
    return FMRES_IGNORED;
}

public Thompson_TakeDamage(victim, inflictor, attacker, Float:damage, damagetype) {
    if(is_user_connected(attacker) && !(damagetype & DMG_HEGRENADE)) {
        new Body, Target, Float:NewDamage;
        if(get_user_weapon(attacker) == CSW_THOMPSON && get_user_thompson(attacker)) {
            if(is_user_connected(victim)) {
                get_user_aiming(attacker, Target, Body, 999999);
                NewDamage = float(get_damage_body(Body, get_pcvar_float(thompsondamage)));
                SetHamParamFloat(4, NewDamage);
            }
            else {
                SetHamParamFloat(4, get_pcvar_float(thompsondamage));
            }
        }
    }
}

public Thompson_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_THOMPSON)
        return HAM_IGNORED;
    if(!get_user_thompson(attacker))
        return HAM_IGNORED;

    static Float:End[3];
    get_tr2(pentru, TR_vecEndPos, End);

    Make_Bullet(attacker, End);

    return HAM_HANDLED;
}

public Thompson_AddToPlayer(Weapon, id) {
    if(is_valid_ent(Weapon) && is_user_connected(id) && entity_get_int(Weapon, EV_INT_impulse) == THOMPSON_WEAPONKEY) {
        HaveThompson[id] = true;
        entity_set_int(Weapon, EV_INT_impulse, 0);
        WeaponList(id, THOMPSON_WEAPONKEY)
    }
}

public Thompson_Deploy_Post(entity) {
    static Owner;
    Owner = get_pdata_cbase(entity, 41, 4);
    if(get_user_thompson(Owner)) {
        set_pev(Owner, pev_viewmodel2, ThompsonModel_V);
        set_pev(Owner, pev_weaponmodel2, ThompsonModel_P);
        set_pdata_float(Owner, 83, 1.2, 5);
        set_weapon_anim(Owner, 2);
        static clip;
        clip = cs_get_weapon_ammo(entity);
        if(clip > 0)
            thompson_reload[Owner] = 0;
    }
}

public Thompson_PrimaryAttack(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);

    if (get_user_thompson(id)) {
        pev(id,pev_punchangle,cl_pushangle[id]);
        thompson_clip[id] = cs_get_weapon_ammo(Weapon);
    }
}

public Thompson_PrimaryAttack_Post(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);
    new ActiveItem = get_pdata_cbase(id, 373) ;

    if(thompson_clip[id] > 0 && pev_valid(ActiveItem)) {
        if(is_user_alive(id) && get_user_thompson(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(thompsonrecoil),Push);
            xs_vec_add(Push,cl_pushangle[id],Push);
            set_pev(id,pev_punchangle,Push);

            emit_sound(id, CHAN_WEAPON, Thompson_Sound[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
            set_weapon_anim(id, random_num(3,5));
        }
    }
}

public Thompson_Reload(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_thompson(id))
        return HAM_IGNORED;

    thompson_clip[id] = -1;

    new Ammo = cs_get_user_bpammo(id, CSW_THOMPSON);
    if(Ammo <= 0)
        return HAM_SUPERCEDE;

    new Clip = get_pdata_int(ent, 51, 4);
    if(Clip >= get_pcvar_num(thompsonclip))
        return HAM_SUPERCEDE;

    thompson_clip[id] = Clip;
    thompson_reload[id] = 1;

    return HAM_IGNORED;
}

public Thompson_Reload_Post(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_thompson(id))
        return HAM_IGNORED;

    if(thompson_clip[id] == -1)
        return HAM_IGNORED;

    new Float:reload_time = get_pcvar_float(thompsonreloadtime);

    set_pdata_int(ent, 51, thompson_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, 1);
    return HAM_IGNORED;
}

public Thompson_PostFrame(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_thompson(id))
        return HAM_IGNORED;

    new Float:NextAttack = get_pdata_float(id, 83, 5);
    new Ammo = cs_get_user_bpammo(id, CSW_THOMPSON);

    new Clip = get_pdata_int(ent, 51, 4);
    new InReload = get_pdata_int(ent, 54, 4);

    if(InReload && NextAttack <= 0.0) {
        new Temp = min(get_pcvar_num(thompsonclip) - Clip, Ammo);

        set_pdata_int(ent, 51, Clip + Temp, 4);
        cs_set_user_bpammo(id, CSW_THOMPSON, Ammo - Temp);
        set_pdata_int(ent, 54, 0, 4);

        InReload = 0;
        thompson_reload[id] = 0;
    }

    return HAM_IGNORED;
}

public Hook_Thompson(id) {
    engclient_cmd(id, weapon_thompson);
}

public get_user_thompson(id) {
    return HaveThompson[id];
}

public set_user_thompson(id, thompson) {
    if(thompson) {
        if(!HaveThompson[id]) {
            drop_primary_weapons(id);
            HaveThompson[id] = true;
            thompson_reload[id] = 0;
            WeaponList(id, THOMPSON_WEAPONKEY)
            fm_give_item(id, weapon_thompson);
            new Clip = fm_get_user_weapon_entity(id, CSW_THOMPSON);
            cs_set_weapon_ammo(Clip, get_pcvar_num(thompsonclip));
        }
    }
    else {
        if(HaveThompson[id]) {
            HaveThompson[id] = false;
        }
    }
}
#endif

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//--------------------------------------| Dual MP7A1 |-------------------------------------------------------
//======================================= sDs|Aragon* =======================================================
#if defined DUALMP7A1
DualMP7A1_Init() {
    register_clcmd("furien30_dualmp7a1", "Hook_DualMP7A1");

    register_message(get_user_msgid("DeathMsg"), "DualMP7A1_DeathMsg");

    register_event("CurWeapon", "DualMP7A1_ViewModel", "be", "1=1");
    register_event("WeapPickup","DualMP7A1_ViewModel","b","1=19");

    register_forward(FM_SetModel, "DualMP7A1_WorldModel");
    register_forward(FM_UpdateClientData, "DualMP7A1_UpdateClientData_Post", 1);
    register_forward(FM_PlaybackEvent, "DualMP7A1_PlaybackEvent");

    RegisterHam(Ham_TakeDamage, "player", "DualMP7A1_TakeDamage");
    RegisterHam(Ham_TraceAttack, "worldspawn", "DualMP7A1_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "player", "DualMP7A1_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_breakable", "DualMP7A1_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_wall", "DualMP7A1_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door", "DualMP7A1_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door_rotating", "DualMP7A1_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_plat", "DualMP7A1_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_rotating", "DualMP7A1_TraceAttack_Post", 1);
    RegisterHam(Ham_Item_Deploy , weapon_dualmp7a1, "DualMP7A1_Deploy_Post", 1);
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_dualmp7a1, "DualMP7A1_PrimaryAttack");
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_dualmp7a1, "DualMP7A1_PrimaryAttack_Post", 1);
    RegisterHam(Ham_Item_AddToPlayer, weapon_dualmp7a1, "DualMP7A1_AddToPlayer");
    RegisterHam(Ham_Weapon_Reload, weapon_dualmp7a1, "DualMP7A1_Reload");
    RegisterHam(Ham_Weapon_Reload, weapon_dualmp7a1, "DualMP7A1_Reload_Post", 1);
    RegisterHam(Ham_Item_PostFrame, weapon_dualmp7a1, "DualMP7A1_PostFrame");

    dualmp7a1damage = register_cvar("furien30_dualmp7a1_damage", "40");         //| DualMP7A1 Damage |//
    dualmp7a1clip = register_cvar("furien30_dualmp7a1_clip", "40");         //| DualMP7A1 Clip |//
    dualmp7a1reloadtime = register_cvar("furien30_dualmp7a1_reload_time", "2.55");  //| DualMP7A1 Reload Time |//
    dualmp7a1recoil = register_cvar("furien30_dualmp7a1_recoil", "0.8");        //| DualMP7A1 Recoil |//
}

DualMP7A1_Precache() {
    register_forward(FM_PrecacheEvent, "DualMP7A1_PrecacheEvent_Post", 1);

    precache_model(DualMP7A1Model_V);
    precache_model(DualMP7A1Model_P);
    precache_model(DualMP7A1Model_W);
    for(new i = 0; i < sizeof(DualMP7A1_Sound); i++)
        engfunc(EngFunc_PrecacheSound, DualMP7A1_Sound[i]);
    for(new i = 0; i < sizeof(DualMP7A1_Generic); i++)
        engfunc(EngFunc_PrecacheGeneric, DualMP7A1_Generic[i]);
}

DualMP7A1_Natives() {
    register_native("get_user_dualmp7a1", "get_user_dualmp7a1", 1);
    register_native("set_user_dualmp7a1", "set_user_dualmp7a1", 1);
}

DualMP7A1_Menu(id, const Num[] = "1") {
    new DualMP7A1[256];
    formatex(DualMP7A1,sizeof(DualMP7A1)-1,"\wDualMP7A1");
    if(get_user_flags(id) & VIPSILVER_LEVEL)
        formatex(DualMP7A1,sizeof(DualMP7A1)-1,"\wDualMP7A1");
    else
        formatex(DualMP7A1,sizeof(DualMP7A1)-1,"\dDualMP7A1 \w- \rOnly VIP\w");

    menu_additem(Menu, DualMP7A1, Num, 0);
}

public DualMP7A1_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, "mp5navy") && get_user_weapon(Attacker) == CSW_DUALMP7A1) {
        if(get_user_dualmp7a1(Attacker))
            set_msg_arg_string(4, "Dual MP7A1");
    }
    return PLUGIN_CONTINUE;
}

public DualMP7A1_ViewModel(id) {
    if(get_user_weapon(id) == CSW_DUALMP7A1 && get_user_dualmp7a1(id)) {
        set_pev(id, pev_viewmodel2, DualMP7A1Model_V);
        set_pev(id, pev_weaponmodel2, DualMP7A1Model_P);
    }
}

public DualMP7A1_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 DualMP7A1 = find_ent_by_owner(-1, weapon_dualmp7a1, entity);

    if(get_user_dualmp7a1(Owner) && is_valid_ent(DualMP7A1) && equal(model, "models/w_mp5.mdl")) {
        entity_set_int(DualMP7A1, EV_INT_impulse, DUALMP7A1_WEAPONKEY);
        HaveDualMP7A1[Owner] = false;
        entity_set_model(entity, DualMP7A1Model_W);
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}

public DualMP7A1_UpdateClientData_Post(id, sendweapons, cd_handle) {
    if(is_user_alive(id) && is_user_connected(id)) {
        if(get_user_weapon(id) == CSW_DUALMP7A1 && get_user_dualmp7a1(id))
            set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001);
    }
}

public DualMP7A1_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 != dualmp7a1_event)
        return FMRES_IGNORED;

    playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2);

    return FMRES_SUPERCEDE;
}

public DualMP7A1_PrecacheEvent_Post(type, const name[]) {
    if (equal("events/mp5navy.sc", name)) {
        dualmp7a1_event = get_orig_retval();
        return FMRES_HANDLED;
    }
    return FMRES_IGNORED;
}

public DualMP7A1_TakeDamage(victim, inflictor, attacker, Float:damage, damagetype) {
    if(is_user_connected(attacker) && !(damagetype & DMG_HEGRENADE)) {
        new Body, Target, Float:NewDamage;
        if(get_user_weapon(attacker) == CSW_DUALMP7A1 && get_user_dualmp7a1(attacker)) {
            if(is_user_connected(victim)) {
                get_user_aiming(attacker, Target, Body, 999999);
                NewDamage = float(get_damage_body(Body, get_pcvar_float(dualmp7a1damage)));
                SetHamParamFloat(4, NewDamage);
            }
            else {
                SetHamParamFloat(4, get_pcvar_float(dualmp7a1damage));
            }
        }
    }
}

public DualMP7A1_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_DUALMP7A1)
        return HAM_IGNORED;
    if(!get_user_dualmp7a1(attacker))
        return HAM_IGNORED;

    static Float:End[3];
    get_tr2(pentru, TR_vecEndPos, End);

    Make_Bullet(attacker, End);

    return HAM_HANDLED;
}

public DualMP7A1_AddToPlayer(Weapon, id) {
    if(is_valid_ent(Weapon) && is_user_connected(id) && entity_get_int(Weapon, EV_INT_impulse) == DUALMP7A1_WEAPONKEY) {
        HaveDualMP7A1[id] = true;
        entity_set_int(Weapon, EV_INT_impulse, 0);
        WeaponList(id, DUALMP7A1_WEAPONKEY)
    }
}

public DualMP7A1_Deploy_Post(entity) {
    static Owner;
    Owner = get_pdata_cbase(entity, 41, 4);
    if(get_user_dualmp7a1(Owner)) {
        set_pev(Owner, pev_viewmodel2, DualMP7A1Model_V);
        set_pev(Owner, pev_weaponmodel2, DualMP7A1Model_P);
        set_pdata_float(Owner, 83, 1.3, 5);
        set_weapon_anim(Owner, 2);
        static clip;
        clip = cs_get_weapon_ammo(entity);
        if(clip > 0)
            dualmp7a1_reload[Owner] = 0;
    }
}

public DualMP7A1_PrimaryAttack(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);

    if (get_user_dualmp7a1(id)) {
        pev(id,pev_punchangle,cl_pushangle[id]);
        dualmp7a1_clip[id] = cs_get_weapon_ammo(Weapon);
    }
}

public DualMP7A1_PrimaryAttack_Post(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);
    new ActiveItem = get_pdata_cbase(id, 373) ;

    if(dualmp7a1_clip[id] > 0 && pev_valid(ActiveItem)) {
        if(is_user_alive(id) && get_user_dualmp7a1(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(dualmp7a1recoil),Push);
            xs_vec_add(Push,cl_pushangle[id],Push);
            set_pev(id,pev_punchangle,Push);

            emit_sound(id, CHAN_WEAPON, DualMP7A1_Sound[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
            set_weapon_anim(id, random_num(3,4));
        }
    }
}

public DualMP7A1_Reload(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_dualmp7a1(id))
        return HAM_IGNORED;

    dualmp7a1_clip[id] = -1;

    new Ammo = cs_get_user_bpammo(id, CSW_DUALMP7A1);
    if(Ammo <= 0)
        return HAM_SUPERCEDE;

    new Clip = get_pdata_int(ent, 51, 4);
    if(Clip >= get_pcvar_num(dualmp7a1clip))
        return HAM_SUPERCEDE;

    dualmp7a1_clip[id] = Clip;
    dualmp7a1_reload[id] = 1;

    return HAM_IGNORED;
}

public DualMP7A1_Reload_Post(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_dualmp7a1(id))
        return HAM_IGNORED;

    if(dualmp7a1_clip[id] == -1)
        return HAM_IGNORED;

    new Float:reload_time = get_pcvar_float(dualmp7a1reloadtime);

    set_pdata_int(ent, 51, dualmp7a1_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, 1);
    return HAM_IGNORED;
}

public DualMP7A1_PostFrame(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_dualmp7a1(id))
        return HAM_IGNORED;

    new Float:NextAttack = get_pdata_float(id, 83, 5);
    new Ammo = cs_get_user_bpammo(id, CSW_DUALMP7A1);

    new Clip = get_pdata_int(ent, 51, 4);
    new InReload = get_pdata_int(ent, 54, 4);

    if(InReload && NextAttack <= 0.0) {
        new Temp = min(get_pcvar_num(dualmp7a1clip) - Clip, Ammo);

        set_pdata_int(ent, 51, Clip + Temp, 4);
        cs_set_user_bpammo(id, CSW_DUALMP7A1, Ammo - Temp);
        set_pdata_int(ent, 54, 0, 4);

        InReload = 0;
        dualmp7a1_reload[id] = 0;
    }

    return HAM_IGNORED;
}

public Hook_DualMP7A1(id) {
    engclient_cmd(id, weapon_dualmp7a1);
}

public get_user_dualmp7a1(id) {
    return HaveDualMP7A1[id];
}

public set_user_dualmp7a1(id, dualmp7a1) {
    if(dualmp7a1) {
        if(!HaveDualMP7A1[id]) {
            drop_primary_weapons(id);
            HaveDualMP7A1[id] = true;
            dualmp7a1_reload[id] = 0;
            WeaponList(id, DUALMP7A1_WEAPONKEY)
            fm_give_item(id, weapon_dualmp7a1);
            new clip = fm_get_user_weapon_entity(id, CSW_DUALMP7A1);
            cs_set_weapon_ammo(clip, get_pcvar_num(dualmp7a1clip));
        }
    }
    else {
        if(HaveDualMP7A1[id]) {
            HaveDualMP7A1[id] = false;
        }
    }
}
#endif

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//-----------------------------------------| M1887 |---------------------------------------------------------
//======================================= sDs|Aragon* =======================================================
#if defined M1887
M1887_Init() {
    register_clcmd("furien30_m1887", "Hook_M1887");

    register_message(get_user_msgid("DeathMsg"), "M1887_DeathMsg");

    register_event("CurWeapon", "M1887_ViewModel", "be", "1=1");
    register_event("WeapPickup","M1887_ViewModel","b","1=19");

    register_forward(FM_SetModel, "M1887_WorldModel");
    register_forward(FM_UpdateClientData, "M1887_UpdateClientData_Post", 1);
    register_forward(FM_PlaybackEvent, "M1887_PlaybackEvent");

    RegisterHam(Ham_TakeDamage, "player", "M1887_TakeDamage");
    RegisterHam(Ham_TraceAttack, "worldspawn", "M1887_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "player", "M1887_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_breakable", "M1887_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_wall", "M1887_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door", "M1887_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door_rotating", "M1887_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_plat", "M1887_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_rotating", "M1887_TraceAttack_Post", 1);
    RegisterHam(Ham_Item_Deploy , weapon_m1887, "M1887_Deploy_Post", 1);
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_m1887, "M1887_PrimaryAttack");
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_m1887, "M1887_PrimaryAttack_Post", 1);
    RegisterHam(Ham_Item_AddToPlayer, weapon_m1887, "M1887_AddToPlayer");
    /*RegisterHam(Ham_Weapon_Reload, weapon_m1887, "M1887_Reload");
    RegisterHam(Ham_Weapon_Reload, weapon_m1887, "M1887_Reload_Post", 1);
    RegisterHam(Ham_Item_PostFrame, weapon_m1887, "M1887_PostFrame");*/

    m1887damage = register_cvar("furien30_m1887_damage", "1");          //| M1887 Damage |//
    //m1887clip = register_cvar("furien30_m1887_clip", "10");               //| M1887 Clip |//
    //m1887reloadtime = register_cvar("furien30_m1887_reload_time", "3.7");     //| M1887 Reload Time |//
    m1887recoil = register_cvar("furien30_m1887_recoil", "0.8");            //| M1887 Recoil |//
}

M1887_Precache() {
    register_forward(FM_PrecacheEvent, "M1887_PrecacheEvent_Post", 1);

    precache_model(M1887Model_V);
    precache_model(M1887Model_P);
    precache_model(M1887Model_W);
    for(new i = 0; i < sizeof(M1887_Sound); i++)
        engfunc(EngFunc_PrecacheSound, M1887_Sound[i]);
    for(new i = 0; i < sizeof(M1887_Generic); i++)
        engfunc(EngFunc_PrecacheGeneric, M1887_Generic[i]);
}

M1887_Natives() {
    register_native("get_user_m1887", "get_user_m1887", 1);
    register_native("set_user_m1887", "set_user_m1887", 1);
}

M1887_Menu(const Num[] = "1") {
    new _M1887[256];
    formatex(_M1887,sizeof(_M1887)-1,"\wM1887");
    menu_additem(Menu, _M1887, Num, 0);
}

public M1887_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_M1887) {
        if(get_user_m1887(Attacker))
            set_msg_arg_string(4, "M1887");
    }
    return PLUGIN_CONTINUE;
}

public M1887_ViewModel(id) {
    if(get_user_weapon(id) == CSW_M1887 && get_user_m1887(id)) {
        set_pev(id, pev_viewmodel2, M1887Model_V);
        set_pev(id, pev_weaponmodel2, M1887Model_P);
    }
}

public M1887_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 _M1887 = find_ent_by_owner(-1, weapon_m1887, entity);

    if(get_user_m1887(Owner) && is_valid_ent(_M1887) && equal(model, "models/w_m3.mdl")) {
        entity_set_int(_M1887, EV_INT_impulse, M1887_WEAPONKEY);
        HaveM1887[Owner] = false;
        entity_set_model(entity, M1887Model_W);
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}

public M1887_UpdateClientData_Post(id, sendweapons, cd_handle) {
    if(is_user_alive(id) && is_user_connected(id)) {
        if(get_user_weapon(id) == CSW_M1887 && get_user_m1887(id))
            set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001);
    }
}

public M1887_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 != m1887_event)
        return FMRES_IGNORED;

    playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2);

    return FMRES_SUPERCEDE;
}

public M1887_PrecacheEvent_Post(type, const name[]) {
    if (equal("events/m3.sc", name)) {
        m1887_event = get_orig_retval();
        return FMRES_HANDLED;
    }
    return FMRES_IGNORED;
}

public M1887_TakeDamage(victim, inflictor, attacker, Float:damage, damagetype) {
    if(is_user_connected(attacker) && !(damagetype & DMG_HEGRENADE)) {
        if(get_user_weapon(attacker) == CSW_M1887 && get_user_m1887(attacker)) {
            SetHamParamFloat(4, damage * get_pcvar_float(m1887damage));
        }
    }
}

public M1887_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_M1887)
        return HAM_IGNORED;
    if(!get_user_m1887(attacker))
        return HAM_IGNORED;

    static Float:End[3];
    get_tr2(pentru, TR_vecEndPos, End);

    Make_Bullet(attacker, End);

    return HAM_HANDLED;
}

public M1887_AddToPlayer(Weapon, id) {
    if(is_valid_ent(Weapon) && is_user_connected(id) && entity_get_int(Weapon, EV_INT_impulse) == M1887_WEAPONKEY) {
        HaveM1887[id] = true;
        entity_set_int(Weapon, EV_INT_impulse, 0);
        WeaponList(id, M1887_WEAPONKEY)
    }
}

public M1887_Deploy_Post(entity) {
    static Owner;
    Owner = get_pdata_cbase(entity, 41, 4);
    if(get_user_m1887(Owner)) {
        set_pev(Owner, pev_viewmodel2, M1887Model_V);
        set_pev(Owner, pev_weaponmodel2, M1887Model_P);
        set_pdata_float(Owner, 83, 1.2, 5);
        set_weapon_anim(Owner, 6);
        static clip;
        clip = cs_get_weapon_ammo(entity);
        if(clip > 0)
            m1887_reload[Owner] = 0;
    }
}

public M1887_PrimaryAttack(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);

    if (get_user_m1887(id)) {
        pev(id,pev_punchangle,cl_pushangle[id]);
        m1887_clip[id] = cs_get_weapon_ammo(Weapon);
    }
}

public M1887_PrimaryAttack_Post(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);
    new ActiveItem = get_pdata_cbase(id, 373) ;

    if(m1887_clip[id] > 0 && pev_valid(ActiveItem)) {
        if(is_user_alive(id) && get_user_m1887(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(m1887recoil),Push);
            xs_vec_add(Push,cl_pushangle[id],Push);
            set_pev(id,pev_punchangle,Push);

            emit_sound(id, CHAN_WEAPON, M1887_Sound[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
            set_weapon_anim(id, random_num(1,2));
        }
    }
}
/*
public M1887_Reload(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_m1887(id))
        return HAM_IGNORED;

    m1887_clip[id] = -1;

    new Ammo = cs_get_user_bpammo(id, CSW_M1887);
    if(Ammo <= 0)
        return HAM_SUPERCEDE;

    new Clip = get_pdata_int(ent, 51, 4);
    if(Clip >= get_pcvar_num(m1887clip))
        return HAM_SUPERCEDE;

    set_weapon_anim(id, 5);
    m1887_clip[id] = Clip;
    m1887_reload[id] = 1;

    return HAM_IGNORED;
}

public M1887_Reload_Post(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_m1887(id))
        return HAM_IGNORED;

    if(m1887_clip[id] == -1)
        return HAM_IGNORED;

    new Float:reload_time = get_pcvar_float(m1887reloadtime);

    set_pdata_int(ent, 51, m1887_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 M1887_PostFrame(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_m1887(id))
        return HAM_IGNORED;

    if(pev(id, pev_weaponanim) == 3)
        set_weapon_anim(id, 7);

    new Float:NextAttack = get_pdata_float(id, 83, 5);
    new Ammo = cs_get_user_bpammo(id, CSW_M1887);

    new Clip = get_pdata_int(ent, 51, 4);
    new InReload = get_pdata_int(ent, 54, 4);

    if(InReload && NextAttack <= 0.0) {
        new Temp = min(get_pcvar_num(m1887clip), Ammo);

        set_pdata_int(ent, 51, Clip + Temp, 4);
        cs_set_user_bpammo(id, CSW_M1887, Ammo - Temp);
        set_pdata_int(ent, 54, 0, 4);

        InReload = 0
        m1887_reload[id] = 0;
    }
    return HAM_IGNORED
}
*/
public Hook_M1887(id) {
    engclient_cmd(id, weapon_m1887);
}

public get_user_m1887(id) {
    return HaveM1887[id];
}

public set_user_m1887(id, m1887) {
    if(m1887) {
        if(!HaveM1887[id]) {
            drop_primary_weapons(id);
            HaveM1887[id] = true;
            m1887_reload[id] = 0;
            WeaponList(id, M1887_WEAPONKEY)
            fm_give_item(id, weapon_m1887);
            /*new Clip = fm_get_user_weapon_entity(id, CSW_M1887);
            cs_set_weapon_ammo(Clip, get_pcvar_num(m1887clip));*/
        }
    }
    else {
        if(HaveM1887[id]) {
            HaveM1887[id] = false;
        }
    }
}
#endif

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//------------------------------------------| L85 |----------------------------------------------------------
//======================================= sDs|Aragon* =======================================================
#if defined L85
L85_Init() {
    register_clcmd("furien30_l85", "Hook_L85");

    register_message(get_user_msgid("DeathMsg"), "L85_DeathMsg");

    register_event("CurWeapon", "L85_ViewModel", "be", "1=1");
    register_event("WeapPickup","L85_ViewModel","b","1=19");

    register_forward(FM_SetModel, "L85_WorldModel");
    register_forward(FM_UpdateClientData, "L85_UpdateClientData_Post", 1);
    register_forward(FM_PlaybackEvent, "L85_PlaybackEvent");

    RegisterHam(Ham_TakeDamage, "player", "L85_TakeDamage");
    RegisterHam(Ham_TraceAttack, "worldspawn", "L85_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "player", "L85_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_breakable", "L85_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_wall", "L85_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door", "L85_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door_rotating", "L85_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_plat", "L85_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_rotating", "L85_TraceAttack_Post", 1);
    RegisterHam(Ham_Item_Deploy , weapon_l85, "L85_Deploy_Post", 1);
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_l85, "L85_PrimaryAttack");
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_l85, "L85_PrimaryAttack_Post", 1);
    RegisterHam(Ham_Item_AddToPlayer, weapon_l85, "L85_AddToPlayer");
    RegisterHam(Ham_Weapon_Reload, weapon_l85, "L85_Reload");
    RegisterHam(Ham_Weapon_Reload, weapon_l85, "L85_Reload_Post", 1);
    RegisterHam(Ham_Item_PostFrame, weapon_l85, "L85_PostFrame");

    l85damage = register_cvar("furien30_l85_damage", "35");         //| L85 Damage |//
    l85clip = register_cvar("furien30_l85_clip", "35");         //| L85 Clip |//
    l85reloadtime = register_cvar("furien30_l85_reload_time", "3.5");   //| L85 Reload Time |//
    l85recoil = register_cvar("furien30_l85_recoil", "0.8");            //| L85 Recoil |//
}

L85_Precache() {
    register_forward(FM_PrecacheEvent, "L85_PrecacheEvent_Post", 1);

    precache_model(L85Model_V);
    precache_model(L85Model_P);
    precache_model(L85Model_W);
    for(new i = 0; i < sizeof(L85_Sound); i++)
        engfunc(EngFunc_PrecacheSound, L85_Sound[i]);
    for(new i = 0; i < sizeof(L85_Generic); i++)
        engfunc(EngFunc_PrecacheGeneric, L85_Generic[i]);
}

L85_Natives() {
    register_native("get_user_l85", "get_user_l85", 1);
    register_native("set_user_l85", "set_user_l85", 1);
}

L85_Menu(const Num[] = "1") {
    new _L85[256];
    formatex(_L85,sizeof(_L85)-1,"\wL85");
    menu_additem(Menu, _L85, Num, 0);
}

public L85_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, "famas") && get_user_weapon(Attacker) == CSW_L85) {
        if(get_user_l85(Attacker))
            set_msg_arg_string(4, "L85");
    }
    return PLUGIN_CONTINUE;
}

public L85_ViewModel(id) {
    if(get_user_weapon(id) == CSW_L85 && get_user_l85(id)) {
        set_pev(id, pev_viewmodel2, L85Model_V);
        set_pev(id, pev_weaponmodel2, L85Model_P);
    }
}

public L85_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 _L85 = find_ent_by_owner(-1, weapon_l85, entity);

    if(get_user_l85(Owner) && is_valid_ent(_L85) && equal(model, "models/w_famas.mdl")) {
        entity_set_int(_L85, EV_INT_impulse, L85_WEAPONKEY);
        HaveL85[Owner] = false;
        entity_set_model(entity, L85Model_W);
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}

public L85_UpdateClientData_Post(id, sendweapons, cd_handle) {
    if(is_user_alive(id) && is_user_connected(id)) {
        if(get_user_weapon(id) == CSW_L85 && get_user_l85(id))
            set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001);
    }
}

public L85_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 != l85_event)
        return FMRES_IGNORED;

    playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2);

    return FMRES_SUPERCEDE;
}

public L85_PrecacheEvent_Post(type, const name[]) {
    if (equal("events/famas.sc", name)) {
        l85_event = get_orig_retval();
        return FMRES_HANDLED;
    }
    return FMRES_IGNORED;
}

public L85_TakeDamage(victim, inflictor, attacker, Float:damage, damagetype) {
    if(is_user_connected(attacker) && !(damagetype & DMG_HEGRENADE)) {
        new Body, Target, Float:NewDamage;
        if(get_user_weapon(attacker) == CSW_L85 && get_user_l85(attacker)) {
            if(is_user_connected(victim)) {
                get_user_aiming(attacker, Target, Body, 999999);
                NewDamage = float(get_damage_body(Body, get_pcvar_float(l85damage)));
                SetHamParamFloat(4, NewDamage);
            }
            else {
                SetHamParamFloat(4, get_pcvar_float(l85damage));
            }
        }
    }
}

public L85_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_L85)
        return HAM_IGNORED;
    if(!get_user_l85(attacker))
        return HAM_IGNORED;

    static Float:End[3];
    get_tr2(pentru, TR_vecEndPos, End);

    Make_Bullet(attacker, End);

    return HAM_HANDLED;
}

public L85_AddToPlayer(Weapon, id) {
    if(is_valid_ent(Weapon) && is_user_connected(id) && entity_get_int(Weapon, EV_INT_impulse) == L85_WEAPONKEY) {
        HaveL85[id] = true;
        entity_set_int(Weapon, EV_INT_impulse, 0);
        WeaponList(id, L85_WEAPONKEY)
    }
}

public L85_Deploy_Post(entity) {
    static Owner;
    Owner = get_pdata_cbase(entity, 41, 4);
    if(get_user_l85(Owner)) {
        set_pev(Owner, pev_viewmodel2, L85Model_V);
        set_pev(Owner, pev_weaponmodel2, L85Model_P);
        set_pdata_float(Owner, 83, 0.89, 5);
        set_weapon_anim(Owner, 2);
        static clip;
        clip = cs_get_weapon_ammo(entity);
        if(clip > 0)
            l85_reload[Owner] = 0;
    }
}

public L85_PrimaryAttack(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);

    if (get_user_l85(id)) {
        pev(id,pev_punchangle,cl_pushangle[id]);
        l85_clip[id] = cs_get_weapon_ammo(Weapon);
    }
}

public L85_PrimaryAttack_Post(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);
    new ActiveItem = get_pdata_cbase(id, 373) ;

    if(l85_clip[id] > 0 && pev_valid(ActiveItem)) {
        if(is_user_alive(id) && get_user_l85(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(l85recoil),Push);
            xs_vec_add(Push,cl_pushangle[id],Push);
            set_pev(id,pev_punchangle,Push);

            emit_sound(id, CHAN_WEAPON, L85_Sound[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
            set_weapon_anim(id, random_num(3,5));
        }
    }
}

public L85_Reload(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_l85(id))
        return HAM_IGNORED;

    l85_clip[id] = -1;

    new Ammo = cs_get_user_bpammo(id, CSW_L85);
    if(Ammo <= 0)
        return HAM_SUPERCEDE;

    new Clip = get_pdata_int(ent, 51, 4);
    if(Clip >= get_pcvar_num(l85clip))
        return HAM_SUPERCEDE;

    l85_clip[id] = Clip;
    l85_reload[id] = 1;

    return HAM_IGNORED;
}

public L85_Reload_Post(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_l85(id))
        return HAM_IGNORED;

    if(l85_clip[id] == -1)
        return HAM_IGNORED;

    new Float:reload_time = get_pcvar_float(l85reloadtime);

    set_pdata_int(ent, 51, l85_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, 1);
    return HAM_IGNORED;
}

public L85_PostFrame(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_l85(id))
        return HAM_IGNORED;

    new Float:NextAttack = get_pdata_float(id, 83, 5);
    new Ammo = cs_get_user_bpammo(id, CSW_L85);

    new Clip = get_pdata_int(ent, 51, 4);
    new InReload = get_pdata_int(ent, 54, 4);

    if(InReload && NextAttack <= 0.0) {
        new Temp = min(get_pcvar_num(l85clip) - Clip, Ammo);

        set_pdata_int(ent, 51, Clip + Temp, 4);
        cs_set_user_bpammo(id, CSW_L85, Ammo - Temp);
        set_pdata_int(ent, 54, 0, 4);

        InReload = 0;
        l85_reload[id] = 0;
    }

    return HAM_IGNORED;
}

public Hook_L85(id) {
    engclient_cmd(id, weapon_l85);
}

public get_user_l85(id) {
    return HaveL85[id];
}

public set_user_l85(id, l85) {
    if(l85) {
        if(!HaveL85[id]) {
            drop_primary_weapons(id);
            HaveL85[id] = true;
            l85_reload[id] = 0;
            WeaponList(id, L85_WEAPONKEY)
            fm_give_item(id, weapon_l85);
            new Clip = fm_get_user_weapon_entity(id, CSW_L85);
            cs_set_weapon_ammo(Clip, get_pcvar_num(l85clip));
        }
    }
    else {
        if(HaveL85[id]) {
            HaveL85[id] = false;
        }
    }
}
#endif

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//-----------------------------------------| Skull5 |--------------------------------------------------------
//======================================= sDs|Aragon* =======================================================
#if defined SKULL5
Skull5_Init() {
    register_clcmd("furien30_skull5", "Hook_Skull5");

    register_message(get_user_msgid("DeathMsg"), "Skull5_DeathMsg");

    register_event("CurWeapon", "Skull5_ViewModel", "be", "1=1");
    register_event("WeapPickup","Skull5_ViewModel","b","1=19");

    register_forward(FM_SetModel, "Skull5_WorldModel");
    register_forward(FM_UpdateClientData, "Skull5_UpdateClientData_Post", 1);
    register_forward(FM_PlaybackEvent, "Skull5_PlaybackEvent");

    RegisterHam(Ham_TakeDamage, "player", "Skull5_TakeDamage");
    RegisterHam(Ham_TraceAttack, "worldspawn", "Skull5_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "player", "Skull5_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_breakable", "Skull5_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_wall", "Skull5_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door", "Skull5_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door_rotating", "Skull5_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_plat", "Skull5_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_rotating", "Skull5_TraceAttack_Post", 1);
    RegisterHam(Ham_Item_Deploy , weapon_skull5, "Skull5_Deploy_Post", 1);
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_skull5, "Skull5_PrimaryAttack");
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_skull5, "Skull5_PrimaryAttack_Post", 1);
    RegisterHam(Ham_Item_AddToPlayer, weapon_skull5, "Skull5_AddToPlayer");
    RegisterHam(Ham_Weapon_Reload, weapon_skull5, "Skull5_Reload");
    RegisterHam(Ham_Weapon_Reload, weapon_skull5, "Skull5_Reload_Post", 1);
    RegisterHam(Ham_Item_PostFrame, weapon_skull5, "Skull5_PostFrame");

    skull5damage = register_cvar("furien30_skull5_damage", "65");           //| Skull5 Damage |//
    skull5clip = register_cvar("furien30_skull5_clip", "30");           //| Skull5 Clip |//
    skull5reloadtime = register_cvar("furien30_skull5_reload_time", "2.0");     //| Skull5 Reload Time |//
    skull5recoil = register_cvar("furien30_skull5_recoil", "0.8");          //| Skull5 Recoil |//
}

Skull5_Precache() {
    register_forward(FM_PrecacheEvent, "Skull5_PrecacheEvent_Post", 1);

    precache_model(Skull5Model_V);
    precache_model(Skull5Model_P);
    precache_model(Skull5Model_W);
    for(new i = 0; i < sizeof(Skull5_Sound); i++)
        engfunc(EngFunc_PrecacheSound, Skull5_Sound[i]);
    for(new i = 0; i < sizeof(Skull5_Generic); i++)
        engfunc(EngFunc_PrecacheGeneric, Skull5_Generic[i]);
}

Skull5_Natives() {
    register_native("get_user_skull5", "get_user_skull5", 1);
    register_native("set_user_skull5", "set_user_skull5", 1);
}

Skull5_Menu(const Num[] = "1") {
    new Skull5[256];
    formatex(Skull5,sizeof(Skull5)-1,"\wSkull5");
    menu_additem(Menu, Skull5, Num, 0);
}

public Skull5_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, "sg550") && get_user_weapon(Attacker) == CSW_SKULL5) {
        if(get_user_skull5(Attacker))
            set_msg_arg_string(4, "Skull5");
    }
    return PLUGIN_CONTINUE;
}

public Skull5_ViewModel(id) {
    if(get_user_weapon(id) == CSW_SKULL5 && get_user_skull5(id)) {
        set_pev(id, pev_viewmodel2, Skull5Model_V);
        set_pev(id, pev_weaponmodel2, Skull5Model_P);
    }
}

public Skull5_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 Skull5 = find_ent_by_owner(-1, weapon_skull5, entity);

    if(get_user_skull5(Owner) && is_valid_ent(Skull5) && equal(model, "models/w_sg550.mdl")) {
        entity_set_int(Skull5, EV_INT_impulse, SKULL5_WEAPONKEY);
        HaveSkull5[Owner] = false;
        entity_set_model(entity, Skull5Model_W);
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}

public Skull5_UpdateClientData_Post(id, sendweapons, cd_handle) {
    if(is_user_alive(id) && is_user_connected(id)) {
        if(get_user_weapon(id) == CSW_SKULL5 && get_user_skull5(id))
            set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001);
    }
}

public Skull5_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 != skull5_event)
        return FMRES_IGNORED;

    playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2);

    return FMRES_SUPERCEDE;
}

public Skull5_PrecacheEvent_Post(type, const name[]) {
    if (equal("events/sg550.sc", name)) {
        skull5_event = get_orig_retval();
        return FMRES_HANDLED;
    }
    return FMRES_IGNORED;
}

public Skull5_TakeDamage(victim, inflictor, attacker, Float:damage, damagetype) {
    if(is_user_connected(attacker) && !(damagetype & DMG_HEGRENADE)) {
        new Body, Target, Float:NewDamage;
        if(get_user_weapon(attacker) == CSW_SKULL5 && get_user_skull5(attacker)) {
            if(is_user_connected(victim)) {
                get_user_aiming(attacker, Target, Body, 999999);
                NewDamage = float(get_damage_body(Body, get_pcvar_float(skull5damage)));
                SetHamParamFloat(4, NewDamage);
            }
            else {
                SetHamParamFloat(4, get_pcvar_float(skull5damage));
            }
        }
    }
}

public Skull5_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_SKULL5)
        return HAM_IGNORED;
    if(!get_user_skull5(attacker))
        return HAM_IGNORED;

    static Float:End[3];
    get_tr2(pentru, TR_vecEndPos, End);

    Make_Bullet(attacker, End);

    return HAM_HANDLED;
}

public Skull5_AddToPlayer(Weapon, id) {
    if(is_valid_ent(Weapon) && is_user_connected(id) && entity_get_int(Weapon, EV_INT_impulse) == SKULL5_WEAPONKEY) {
        HaveSkull5[id] = true;
        entity_set_int(Weapon, EV_INT_impulse, 0);
        WeaponList(id, SKULL5_WEAPONKEY)
    }
}

public Skull5_Deploy_Post(entity) {
    static Owner;
    Owner = get_pdata_cbase(entity, 41, 4);
    if(get_user_skull5(Owner)) {
        set_pev(Owner, pev_viewmodel2, Skull5Model_V);
        set_pev(Owner, pev_weaponmodel2, Skull5Model_P);
        set_pdata_float(Owner, 83, 1.53, 5);
        set_weapon_anim(Owner, 4);
        static clip;
        clip = cs_get_weapon_ammo(entity);
        if(clip > 0)
            skull5_reload[Owner] = 0;
    }
}

public Skull5_PrimaryAttack(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);

    if (get_user_skull5(id)) {
        pev(id,pev_punchangle,cl_pushangle[id]);
        skull5_clip[id] = cs_get_weapon_ammo(Weapon);
    }
}

public Skull5_PrimaryAttack_Post(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);
    new ActiveItem = get_pdata_cbase(id, 373) ;

    if(skull5_clip[id] > 0 && pev_valid(ActiveItem)) {
        if(is_user_alive(id) && get_user_skull5(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(skull5recoil),Push);
            xs_vec_add(Push,cl_pushangle[id],Push);
            set_pev(id,pev_punchangle,Push);

            emit_sound(id, CHAN_WEAPON, Skull5_Sound[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
            set_weapon_anim(id, random_num(1,2));
        }
    }
}

public Skull5_Reload(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_skull5(id))
        return HAM_IGNORED;

    skull5_clip[id] = -1;

    new Ammo = cs_get_user_bpammo(id, CSW_SKULL5);
    if(Ammo <= 0)
        return HAM_SUPERCEDE;

    new Clip = get_pdata_int(ent, 51, 4);
    if(Clip >= get_pcvar_num(skull5clip))
        return HAM_SUPERCEDE;

    skull5_clip[id] = Clip;
    skull5_reload[id] = 1;

    return HAM_IGNORED;
}

public Skull5_Reload_Post(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_skull5(id))
        return HAM_IGNORED;

    if(skull5_clip[id] == -1)
        return HAM_IGNORED;

    new Float:reload_time = get_pcvar_float(skull5reloadtime);

    set_pdata_int(ent, 51, skull5_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 Skull5_PostFrame(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_skull5(id))
        return HAM_IGNORED;

    new Float:NextAttack = get_pdata_float(id, 83, 5);
    new Ammo = cs_get_user_bpammo(id, CSW_SKULL5);

    new Clip = get_pdata_int(ent, 51, 4);
    new InReload = get_pdata_int(ent, 54, 4);

    if(InReload && NextAttack <= 0.0) {
        new Temp = min(get_pcvar_num(skull5clip) - Clip, Ammo);

        set_pdata_int(ent, 51, Clip + Temp, 4);
        cs_set_user_bpammo(id, CSW_SKULL5, Ammo - Temp);
        set_pdata_int(ent, 54, 0, 4);

        InReload = 0;
        skull5_reload[id] = 0;
    }

    return HAM_IGNORED;
}

public Hook_Skull5(id) {
    engclient_cmd(id, weapon_skull5);
}

public get_user_skull5(id) {
    return HaveSkull5[id];
}

public set_user_skull5(id, skull5) {
    if(skull5) {
        if(!HaveSkull5[id]) {
            drop_primary_weapons(id);
            HaveSkull5[id] = true;
            skull5_reload[id] = 0;
            WeaponList(id, SKULL5_WEAPONKEY)
            fm_give_item(id, weapon_skull5);
            new Clip = fm_get_user_weapon_entity(id, CSW_SKULL5);
            cs_set_weapon_ammo(Clip, get_pcvar_num(skull5clip));
        }
    }
    else {
        if(HaveSkull5[id]) {
            HaveSkull5[id] = false;
        }
    }
}
#endif

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//------------------------------------------| SL8 |----------------------------------------------------------
//======================================= sDs|Aragon* =======================================================
#if defined SL8
SL8_Init() {
    register_clcmd("furien30_sl8", "Hook_SL8");

    register_message(get_user_msgid("DeathMsg"), "SL8_DeathMsg");

    register_event("CurWeapon", "SL8_ViewModel", "be", "1=1");
    register_event("WeapPickup","SL8_ViewModel","b","1=19");

    register_forward(FM_SetModel, "SL8_WorldModel");
    register_forward(FM_UpdateClientData, "SL8_UpdateClientData_Post", 1);
    register_forward(FM_PlaybackEvent, "SL8_PlaybackEvent");

    RegisterHam(Ham_TakeDamage, "player", "SL8_TakeDamage");
    RegisterHam(Ham_TraceAttack, "worldspawn", "SL8_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "player", "SL8_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_breakable", "SL8_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_wall", "SL8_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door", "SL8_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door_rotating", "SL8_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_plat", "SL8_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_rotating", "SL8_TraceAttack_Post", 1);
    RegisterHam(Ham_Item_Deploy , weapon_sl8, "SL8_Deploy_Post", 1);
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_sl8, "SL8_PrimaryAttack");
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_sl8, "SL8_PrimaryAttack_Post", 1);
    RegisterHam(Ham_Item_AddToPlayer, weapon_sl8, "SL8_AddToPlayer");
    RegisterHam(Ham_Weapon_Reload, weapon_sl8, "SL8_Reload");
    RegisterHam(Ham_Weapon_Reload, weapon_sl8, "SL8_Reload_Post", 1);
    RegisterHam(Ham_Item_PostFrame, weapon_sl8, "SL8_PostFrame");

    sl8damage = register_cvar("furien30_sl8_damage", "75");         //| SL8 Damage |//
    sl8clip = register_cvar("furien30_sl8_clip", "30");         //| SL8 Clip |//
    sl8reloadtime = register_cvar("furien30_sl8_reload_time", "3.43");  //| SL8 Reload Time |//
    sl8recoil = register_cvar("furien30_sl8_recoil", "0.8");            //| SL8 Recoil |//
}

SL8_Precache() {
    register_forward(FM_PrecacheEvent, "SL8_PrecacheEvent_Post", 1);

    precache_model(SL8Model_V);
    precache_model(SL8Model_P);
    precache_model(SL8Model_W);
    for(new i = 0; i < sizeof(SL8_Sound); i++)
        engfunc(EngFunc_PrecacheSound, SL8_Sound[i]);
    for(new i = 0; i < sizeof(SL8_Generic); i++)
        engfunc(EngFunc_PrecacheGeneric, SL8_Generic[i]);
}

SL8_Natives() {
    register_native("get_user_sl8", "get_user_sl8", 1);
    register_native("set_user_sl8", "set_user_sl8", 1);
}

SL8_Menu(const Num[] = "1") {
    new _SL8[256];
    formatex(_SL8,sizeof(_SL8)-1,"\wSL8");
    menu_additem(Menu, _SL8, Num, 0);
}

public SL8_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, "g3sg1") && get_user_weapon(Attacker) == CSW_SL8) {
        if(get_user_sl8(Attacker))
            set_msg_arg_string(4, "SL8");
    }
    return PLUGIN_CONTINUE;
}

public SL8_ViewModel(id) {
    if(get_user_weapon(id) == CSW_SL8 && get_user_sl8(id)) {
        set_pev(id, pev_viewmodel2, SL8Model_V);
        set_pev(id, pev_weaponmodel2, SL8Model_P);
    }
}

public SL8_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 _SL8 = find_ent_by_owner(-1, weapon_sl8, entity);

    if(get_user_sl8(Owner) && is_valid_ent(_SL8) && equal(model, "models/w_g3sg1.mdl")) {
        entity_set_int(_SL8, EV_INT_impulse, SL8_WEAPONKEY);
        HaveSL8[Owner] = false;
        entity_set_model(entity, SL8Model_W);
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}

public SL8_UpdateClientData_Post(id, sendweapons, cd_handle) {
    if(is_user_alive(id) && is_user_connected(id)) {
        if(get_user_weapon(id) == CSW_SL8 && get_user_sl8(id))
            set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001);
    }
}

public SL8_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 != sl8_event)
        return FMRES_IGNORED;

    playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2);

    return FMRES_SUPERCEDE;
}

public SL8_PrecacheEvent_Post(type, const name[]) {
    if (equal("events/g3sg1.sc", name)) {
        sl8_event = get_orig_retval();
        return FMRES_HANDLED;
    }
    return FMRES_IGNORED;
}

public SL8_TakeDamage(victim, inflictor, attacker, Float:damage, damagetype) {
    if(is_user_connected(attacker) && !(damagetype & DMG_HEGRENADE)) {
        new Body, Target, Float:NewDamage;
        if(get_user_weapon(attacker) == CSW_SL8 && get_user_sl8(attacker)) {
            if(is_user_connected(victim)) {
                get_user_aiming(attacker, Target, Body, 999999);
                NewDamage = float(get_damage_body(Body, get_pcvar_float(sl8damage)));
                SetHamParamFloat(4, NewDamage);
            }
            else {
                SetHamParamFloat(4, get_pcvar_float(sl8damage));
            }
        }
    }
}

public SL8_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_SL8)
        return HAM_IGNORED;
    if(!get_user_sl8(attacker))
        return HAM_IGNORED;

    static Float:End[3];
    get_tr2(pentru, TR_vecEndPos, End);

    Make_Bullet(attacker, End);

    return HAM_HANDLED;
}

public SL8_AddToPlayer(Weapon, id) {
    if(is_valid_ent(Weapon) && is_user_connected(id) && entity_get_int(Weapon, EV_INT_impulse) == SL8_WEAPONKEY) {
        HaveSL8[id] = true;
        entity_set_int(Weapon, EV_INT_impulse, 0);
        WeaponList(id, SL8_WEAPONKEY)
    }
}

public SL8_Deploy_Post(entity) {
    static Owner;
    Owner = get_pdata_cbase(entity, 41, 4);
    if(get_user_sl8(Owner)) {
        set_pev(Owner, pev_viewmodel2, SL8Model_V);
        set_pev(Owner, pev_weaponmodel2, SL8Model_P);
        set_pdata_float(Owner, 83, 1.0, 5);
        set_weapon_anim(Owner, 4);
        static clip;
        clip = cs_get_weapon_ammo(entity);
        if(clip > 0)
            sl8_reload[Owner] = 0;
    }
}

public SL8_PrimaryAttack(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);

    if (get_user_sl8(id)) {
        pev(id,pev_punchangle,cl_pushangle[id]);
        sl8_clip[id] = cs_get_weapon_ammo(Weapon);
    }
}

public SL8_PrimaryAttack_Post(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);
    new ActiveItem = get_pdata_cbase(id, 373) ;

    if(sl8_clip[id] > 0 && pev_valid(ActiveItem)) {
        if(is_user_alive(id) && get_user_sl8(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(sl8recoil),Push);
            xs_vec_add(Push,cl_pushangle[id],Push);
            set_pev(id,pev_punchangle,Push);

            emit_sound(id, CHAN_WEAPON, SL8_Sound[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
            set_weapon_anim(id, random_num(1,2));
        }
    }
}

public SL8_Reload(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_sl8(id))
        return HAM_IGNORED;

    sl8_clip[id] = -1;

    new Ammo = cs_get_user_bpammo(id, CSW_SL8);
    if(Ammo <= 0)
        return HAM_SUPERCEDE;

    new Clip = get_pdata_int(ent, 51, 4);
    if(Clip >= get_pcvar_num(sl8clip))
        return HAM_SUPERCEDE;

    sl8_clip[id] = Clip;
    sl8_reload[id] = 1;

    return HAM_IGNORED;
}

public SL8_Reload_Post(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_sl8(id))
        return HAM_IGNORED;

    if(sl8_clip[id] == -1)
        return HAM_IGNORED;

    new Float:reload_time = get_pcvar_float(sl8reloadtime);

    set_pdata_int(ent, 51, sl8_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, 3);
    set_weapon_anim(id, 3);
    return HAM_IGNORED;
}

public SL8_PostFrame(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_sl8(id))
        return HAM_IGNORED;

    new Float:NextAttack = get_pdata_float(id, 83, 5);
    new Ammo = cs_get_user_bpammo(id, CSW_SL8);

    new Clip = get_pdata_int(ent, 51, 4);
    new InReload = get_pdata_int(ent, 54, 4);

    if(InReload && NextAttack <= 0.0) {
        new Temp = min(get_pcvar_num(sl8clip) - Clip, Ammo);

        set_pdata_int(ent, 51, Clip + Temp, 4);
        cs_set_user_bpammo(id, CSW_SL8, Ammo - Temp);
        set_pdata_int(ent, 54, 0, 4);

        InReload = 0;
        sl8_reload[id] = 0;
    }

    return HAM_IGNORED;
}

public Hook_SL8(id) {
    engclient_cmd(id, weapon_sl8);
}

public get_user_sl8(id) {
    return HaveSL8[id];
}

public set_user_sl8(id, sl8) {
    if(sl8) {
        if(!HaveSL8[id]) {
            drop_primary_weapons(id);
            HaveSL8[id] = true;
            sl8_reload[id] = 0;
            WeaponList(id, SL8_WEAPONKEY)
            fm_give_item(id, weapon_sl8);
            new Clip = fm_get_user_weapon_entity(id, CSW_SL8);
            cs_set_weapon_ammo(Clip, get_pcvar_num(sl8clip));
        }
    }
    else {
        if(HaveSL8[id]) {
            HaveSL8[id] = false;
        }
    }
}
#endif


/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//-----------------------------------------| AW50 |----------------------------------------------------------
//======================================= sDs|Aragon* =======================================================
#if defined AW50
AW50_Init() {
    register_clcmd("furien30_aw50", "Hook_AW50");

    register_message(get_user_msgid("DeathMsg"), "AW50_DeathMsg");

    register_event("CurWeapon", "AW50_ViewModel", "be", "1=1");
    register_event("WeapPickup","AW50_ViewModel","b","1=19");

    register_forward(FM_SetModel, "AW50_WorldModel");
    register_forward(FM_UpdateClientData, "AW50_UpdateClientData_Post", 1);
    register_forward(FM_PlaybackEvent, "AW50_PlaybackEvent");

    RegisterHam(Ham_TakeDamage, "player", "AW50_TakeDamage");
    RegisterHam(Ham_TraceAttack, "worldspawn", "AW50_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "player", "AW50_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_breakable", "AW50_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_wall", "AW50_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door", "AW50_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door_rotating", "AW50_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_plat", "AW50_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_rotating", "AW50_TraceAttack_Post", 1);
    RegisterHam(Ham_Item_Deploy , weapon_aw50, "AW50_Deploy_Post", 1);
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_aw50, "AW50_PrimaryAttack");
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_aw50, "AW50_PrimaryAttack_Post", 1);
    RegisterHam(Ham_Item_AddToPlayer, weapon_aw50, "AW50_AddToPlayer");
    RegisterHam(Ham_Weapon_Reload, weapon_aw50, "AW50_Reload");
    RegisterHam(Ham_Weapon_Reload, weapon_aw50, "AW50_Reload_Post", 1);
    RegisterHam(Ham_Item_PostFrame, weapon_aw50, "AW50_PostFrame");

    aw50damage = register_cvar("furien30_aw50_damage", "150");      //| AW50 Damage |//
    aw50clip = register_cvar("furien30_aw50_clip", "15");           //| AW50 Clip |//
    aw50reloadtime = register_cvar("furien30_aw50_reload_time", "2.93");    //| AW50 Reload Time |//
    aw50recoil = register_cvar("furien30_aw50_recoil", "0.8");      //| AW50 Recoil |//
}

AW50_Precache() {
    register_forward(FM_PrecacheEvent, "AW50_PrecacheEvent_Post", 1);

    precache_model(AW50Model_V);
    precache_model(AW50Model_P);
    precache_model(AW50Model_W);
    for(new i = 0; i < sizeof(AW50_Sound); i++)
        engfunc(EngFunc_PrecacheSound, AW50_Sound[i]);
    for(new i = 0; i < sizeof(AW50_Generic); i++)
        engfunc(EngFunc_PrecacheGeneric, AW50_Generic[i]);
}

AW50_Natives() {
    register_native("get_user_aw50", "get_user_aw50", 1);
    register_native("set_user_aw50", "set_user_aw50", 1);
}

AW50_Menu(const Num[] = "1") {
    new _AW50[256];
    formatex(_AW50,sizeof(_AW50)-1,"\wAW50");
    menu_additem(Menu, _AW50, Num, 0);
}

public AW50_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, "awp") && get_user_weapon(Attacker) == CSW_AW50) {
        if(get_user_aw50(Attacker))
            set_msg_arg_string(4, "AW50");
    }
    return PLUGIN_CONTINUE;
}

public AW50_ViewModel(id) {
    if(get_user_weapon(id) == CSW_AW50 && get_user_aw50(id)) {
        set_pev(id, pev_viewmodel2, AW50Model_V);
        set_pev(id, pev_weaponmodel2, AW50Model_P);
    }
}

public AW50_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 _AW50 = find_ent_by_owner(-1, weapon_aw50, entity);

    if(get_user_aw50(Owner) && is_valid_ent(_AW50) && equal(model, "models/w_awp.mdl")) {
        entity_set_int(_AW50, EV_INT_impulse, AW50_WEAPONKEY);
        HaveAW50[Owner] = false;
        entity_set_model(entity, AW50Model_W);
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}

public AW50_UpdateClientData_Post(id, sendweapons, cd_handle) {
    if(is_user_alive(id) && is_user_connected(id)) {
        if(get_user_weapon(id) == CSW_AW50 && get_user_aw50(id))
            set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001);
    }
}

public AW50_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 != aw50_event)
        return FMRES_IGNORED;

    playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2);

    return FMRES_SUPERCEDE;
}

public AW50_PrecacheEvent_Post(type, const name[]) {
    if (equal("events/awp.sc", name)) {
        aw50_event = get_orig_retval();
        return FMRES_HANDLED;
    }
    return FMRES_IGNORED;
}

public AW50_TakeDamage(victim, inflictor, attacker, Float:damage, damagetype) {
    if(is_user_connected(attacker) && !(damagetype & DMG_HEGRENADE)) {
        new Body, Target, Float:NewDamage;
        if(get_user_weapon(attacker) == CSW_AW50 && get_user_aw50(attacker)) {
            if(is_user_connected(victim)) {
                get_user_aiming(attacker, Target, Body, 999999);
                NewDamage = float(get_damage_body(Body, get_pcvar_float(aw50damage)));
                SetHamParamFloat(4, NewDamage);
            }
            else {
                SetHamParamFloat(4, get_pcvar_float(aw50damage));
            }
        }
    }
}

public AW50_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_AW50)
        return HAM_IGNORED;
    if(!get_user_aw50(attacker))
        return HAM_IGNORED;

    static Float:End[3];
    get_tr2(pentru, TR_vecEndPos, End);

    Make_Bullet(attacker, End);

    return HAM_HANDLED;
}

public AW50_AddToPlayer(Weapon, id) {
    if(is_valid_ent(Weapon) && is_user_connected(id) && entity_get_int(Weapon, EV_INT_impulse) == AW50_WEAPONKEY) {
        HaveAW50[id] = true;
        entity_set_int(Weapon, EV_INT_impulse, 0);
        WeaponList(id, AW50_WEAPONKEY)
    }
}

public AW50_Deploy_Post(entity) {
    static Owner;
    Owner = get_pdata_cbase(entity, 41, 4);
    if(get_user_aw50(Owner)) {
        set_pev(Owner, pev_viewmodel2, AW50Model_V);
        set_pev(Owner, pev_weaponmodel2, AW50Model_P);
        set_pdata_float(Owner, 83, 1.13, 5);
        set_weapon_anim(Owner, 5);
        static clip;
        clip = cs_get_weapon_ammo(entity);
        if(clip > 0)
            aw50_reload[Owner] = 0;
    }
}

public AW50_PrimaryAttack(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);

    if (get_user_aw50(id)) {
        pev(id,pev_punchangle,cl_pushangle[id]);
        aw50_clip[id] = cs_get_weapon_ammo(Weapon);
    }
}

public AW50_PrimaryAttack_Post(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);
    new ActiveItem = get_pdata_cbase(id, 373) ;

    if(aw50_clip[id] > 0 && pev_valid(ActiveItem)) {
        if(is_user_alive(id) && get_user_aw50(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(aw50recoil),Push);
            xs_vec_add(Push,cl_pushangle[id],Push);
            set_pev(id,pev_punchangle,Push);

            emit_sound(id, CHAN_WEAPON, AW50_Sound[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
            set_weapon_anim(id, random_num(1,3));
        }
    }
}

public AW50_Reload(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_aw50(id))
        return HAM_IGNORED;

    aw50_clip[id] = -1;

    new Ammo = cs_get_user_bpammo(id, CSW_AW50);
    if(Ammo <= 0)
        return HAM_SUPERCEDE;

    new Clip = get_pdata_int(ent, 51, 4);
    if(Clip >= get_pcvar_num(aw50clip))
        return HAM_SUPERCEDE;

    aw50_clip[id] = Clip;
    aw50_reload[id] = 1;

    return HAM_IGNORED;
}

public AW50_Reload_Post(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_aw50(id))
        return HAM_IGNORED;

    if(aw50_clip[id] == -1)
        return HAM_IGNORED;

    new Float:reload_time = get_pcvar_float(aw50reloadtime);

    set_pdata_int(ent, 51, aw50_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, 3);
    set_weapon_anim(id, 4);
    return HAM_IGNORED;
}

public AW50_PostFrame(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_aw50(id))
        return HAM_IGNORED;

    new Float:NextAttack = get_pdata_float(id, 83, 5);
    new Ammo = cs_get_user_bpammo(id, CSW_AW50);

    new Clip = get_pdata_int(ent, 51, 4);
    new InReload = get_pdata_int(ent, 54, 4);

    if(InReload && NextAttack <= 0.0) {
        new Temp = min(get_pcvar_num(aw50clip) - Clip, Ammo);

        set_pdata_int(ent, 51, Clip + Temp, 4);
        cs_set_user_bpammo(id, CSW_AW50, Ammo - Temp);
        set_pdata_int(ent, 54, 0, 4);

        InReload = 0;
        aw50_reload[id] = 0;
    }

    return HAM_IGNORED;
}

public Hook_AW50(id) {
    engclient_cmd(id, weapon_aw50);
}

public get_user_aw50(id) {
    return HaveAW50[id];
}

public set_user_aw50(id, aw50) {
    if(aw50) {
        if(!HaveAW50[id]) {
            drop_primary_weapons(id);
            HaveAW50[id] = true;
            aw50_reload[id] = 0;
            WeaponList(id, AW50_WEAPONKEY)
            fm_give_item(id, weapon_aw50);
            new Clip = fm_get_user_weapon_entity(id, CSW_AW50);
            cs_set_weapon_ammo(Clip, get_pcvar_num(aw50clip));
        }
    }
    else {
        if(HaveAW50[id]) {
            HaveAW50[id] = false;
        }
    }
}
#endif

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//------------------------------------------| M79 |----------------------------------------------------------
//======================================= sDs|Aragon* =======================================================
#if defined M79
M79_Init() {
    register_clcmd("furien30_m79", "Hook_M79");

    register_event("CurWeapon", "M79_ViewModel", "be", "1=1");
    register_event("WeapPickup","M79_ViewModel","b","1=19");

    register_forward(FM_SetModel, "M79_WorldModel");
    register_forward(FM_UpdateClientData, "M79_UpdateClientData", 1);
    register_forward(FM_CmdStart, "M79_CmdStart");

    RegisterHam(Ham_Item_Deploy , weapon_m79, "M79_Deploy_Post", 1);
    RegisterHam(Ham_Item_Holster , weapon_m79, "M79_Holster");
    RegisterHam(Ham_Item_AddToPlayer, weapon_m79, "M79_AddToPlayer");
    RegisterHam(Ham_Weapon_Reload, weapon_m79, "M79_Reload");
    RegisterHam(Ham_Weapon_Reload, weapon_m79, "M79_Reload_Post", 1);
    RegisterHam(Ham_Item_PostFrame, weapon_m79, "M79_PostFrame");

    register_touch(M79_CLASS, "*", "M79_Touch");

    m79damage = register_cvar("furien30_m79_damage", "150");        //| M79 Damage |//
    m79radius = register_cvar("furien30_m79_radius", "220.0");      //| M79 Recoil |//
    m79knockback = register_cvar("furien30_m79_knockback" ,"4");    //| M79 KnockBack |//
    m79reloadtime = register_cvar("furien30_m79_reload_time", "2.83");  //| M79 Reload Time |//
}

M79_Precache() {
    m79_trail = precache_model("sprites/xbeam3.spr");
    m79_explode = precache_model("sprites/furien30_weapons/explode.spr");

    precache_model(M79Model_V);
    precache_model(M79Model_P);
    precache_model(M79Model_W);
    precache_model(M79Model_S);

    for(new i = 0; i < sizeof(M79_Sound); i++)
        engfunc(EngFunc_PrecacheSound, M79_Sound[i]);
    for(new i = 0; i < sizeof(M79_Generic); i++)
        engfunc(EngFunc_PrecacheGeneric, M79_Generic[i]);
}

M79_Natives() {
    register_native("get_user_m79", "get_user_m79", 1);
    register_native("set_user_m79", "set_user_m79", 1);
}

M79_Menu(id, const Num[] = "1") {
    new _M79[256];
    if(VIPSILVER_LEVEL || get_user_flags(id) & VIPGOLD_LEVEL)
        formatex(_M79,sizeof(_M79)-1,"\wM79");
    else
        formatex(_M79,sizeof(_M79)-1,"\dM79 \w- \rOnly VIP");
    menu_additem(Menu, _M79, Num, 0);
}

public M79_ViewModel(id) {
    if(get_user_weapon(id) == CSW_M79 && get_user_m79(id)) {
        set_pev(id, pev_viewmodel2, M79Model_V);
        set_pev(id, pev_weaponmodel2, M79Model_P);
        set_pdata_int(id, 361, get_pdata_int(id, 361) | (1<<6));
    }
}

public M79_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 _M79 = find_ent_by_owner(-1, weapon_m79, entity);

    if(get_user_m79(Owner) && is_valid_ent(_M79) && equal(model, "models/w_deagle.mdl")) {
        entity_set_int(_M79, EV_INT_impulse, M79_WEAPONKEY);
        HaveM79[Owner] = false;
        entity_set_model(entity, M79Model_W);
        set_pdata_int(Owner, 361, get_pdata_int(Owner, 361) & ~ (1<<6));
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}

public M79_UpdateClientData(id, sendweapons, cd_handle) {
    if(is_user_alive(id) && is_user_connected(id)) {
        if(get_user_weapon(id) == CSW_M79 && get_user_m79(id))
            set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001);
    }
}

public M79_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);

        if(CurButton & IN_ATTACK) {
            if(get_user_weapon(id) == CSW_M79 && get_user_m79(id)) {
                static _M79;
                _M79 = fm_find_ent_by_owner(-1, weapon_m79, id);

                if(cs_get_weapon_ammo(_M79) > 0 && !m79_reload[id] && NextAttack <= 0.0) {
                    set_weapon_anim(id, random_num(1,2));
                    emit_sound(id, CHAN_WEAPON, M79_Sound[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);

                    M79_Fire(id);
                    static Float:Punch_Angles[3];

                    Punch_Angles[0] = random_float(-7.0, -10.0);
                    Punch_Angles[1] = 0.0;
                    Punch_Angles[2] = 0.0;

                    set_pev(id, pev_punchangle, Punch_Angles);
                    cs_set_weapon_ammo(_M79, cs_get_weapon_ammo(_M79) - 1);
                    if(cs_get_weapon_ammo(_M79) > 0 && !m79_reload[id] && NextAttack <= 0.0)
                        set_pdata_float(id, 83, m79_shotdelay, 5);
                }
                CurButton &= ~IN_ATTACK;
                set_uc(uc_handle, UC_Buttons, CurButton);
            }
        }
    }
}

public M79_AddToPlayer(Weapon, id) {
    if(is_valid_ent(Weapon) && is_user_connected(id) && entity_get_int(Weapon, EV_INT_impulse) == M79_WEAPONKEY) {
        HaveM79[id] = true;
        entity_set_int(Weapon, EV_INT_impulse, 0);
        WeaponList(id, M79_WEAPONKEY)
    }
}

public M79_Deploy_Post(entity) {
    static Owner;
    Owner = get_pdata_cbase(entity, 41, 4);
    if(get_user_m79(Owner)) {
        set_pev(Owner, pev_viewmodel2, M79Model_V);
        set_pev(Owner, pev_weaponmodel2, M79Model_P);
        set_pdata_float(Owner, 83, 1.03, 5);
        set_weapon_anim(Owner, 5);
        static clip;
        clip = cs_get_weapon_ammo(entity);
        if(clip > 0)
            m79_reload[Owner] = 0;
        set_pdata_int(Owner, 361, get_pdata_int(Owner, 361) | (1<<6));
    }
}

public M79_Holster(entity) {
    static Owner;
    Owner = get_pdata_cbase(entity, 41, 4);
    if(get_user_m79(Owner)) {
        set_pdata_int(Owner, 361, get_pdata_int(Owner, 361) & ~ (1<<6));
    }
}

public M79_Reload(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_m79(id))
        return HAM_IGNORED;

    m79_clip[id] = -1;

    new Ammo = cs_get_user_bpammo(id, CSW_M79);
    if(Ammo <= 0)
        return HAM_SUPERCEDE;

    new Clip = get_pdata_int(ent, 51, 4);
    if(Clip >= 1)
        return HAM_SUPERCEDE;

    m79_clip[id] = Clip;
    m79_reload[id] = 1;

    return HAM_IGNORED;
}

public M79_Reload_Post(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_m79(id))
        return HAM_IGNORED;

    if(m79_clip[id] == -1)
        return HAM_IGNORED;

    new Float:reload_time = get_pcvar_float(m79reloadtime);

    set_pdata_int(ent, 51, m79_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, random_num(1,2));
    return HAM_IGNORED;
}

public M79_PostFrame(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_m79(id))
        return HAM_IGNORED;

    new Float:NextAttack = get_pdata_float(id, 83, 5);
    new Ammo = cs_get_user_bpammo(id, CSW_M79);

    new Clip = get_pdata_int(ent, 51, 4);
    new InReload = get_pdata_int(ent, 54, 4);

    if(InReload && NextAttack <= 0.0) {
        new Temp = min(1 - Clip, Ammo);

        set_pdata_int(ent, 51, Clip + Temp, 4);
        cs_set_user_bpammo(id, CSW_M79, Ammo - Temp);
        set_pdata_int(ent, 54, 0, 4);

        InReload = 0;
        m79_reload[id] = 0;
    }

    return HAM_IGNORED;
}

public M79_Fire(id) {
    new ent, Float:Origin[3], Float:Angles[3], Float:Velocity[3];

    ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
    engfunc(EngFunc_GetAttachment, id, 0, Origin, Angles);
    pev(id, pev_angles, Angles);

    set_pev(ent, pev_origin, Origin);
    set_pev(ent, pev_angles, Angles);
    set_pev(ent, pev_solid, SOLID_SLIDEBOX);
    set_pev(ent, pev_movetype, MOVETYPE_BOUNCE);

    set_pev(ent, pev_classname, M79_CLASS);

    set_pev(ent, pev_owner, id);
    engfunc(EngFunc_SetModel, ent, M79Model_S);

    set_pev(ent, pev_mins, {-1.0, -1.0, -1.0});
    set_pev(ent, pev_maxs, {1.0, 1.0, 1.0});

    velocity_by_aim(id, 2000, Velocity);
    set_pev(ent, pev_velocity, Velocity);

    message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
    write_byte(TE_BEAMFOLLOW); // TE id
    write_short(ent); // entity:attachment to follow
    write_short(m79_trail); // sprite index
    write_byte(10); // life in 0.1's
    write_byte(3); // line width in 0.1's
    write_byte(255); // r
    write_byte(255); // g
    write_byte(255); // b
    write_byte(200); // brightness
    message_end();

    set_pev(ent, pev_iuser4, 0);
}

public M79_Touch(grenade, touch) {
    if(pev_valid(grenade)) {
        static Float:GrenadeOrigin[3];
        pev(grenade, pev_origin, GrenadeOrigin);
        new id = pev(grenade, pev_owner);

        message_begin(MSG_BROADCAST ,SVC_TEMPENTITY);
        write_byte(TE_EXPLOSION);
        engfunc(EngFunc_WriteCoord, GrenadeOrigin[0]);
        engfunc(EngFunc_WriteCoord, GrenadeOrigin[1]);
        engfunc(EngFunc_WriteCoord, GrenadeOrigin[2]);
        write_short(m79_explode);   // sprite index
        write_byte(20);         // scale in 0.1's
        write_byte(30);         // framerate
        write_byte(0);          // flags
        message_end();

        message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
        write_byte(TE_WORLDDECAL)
        engfunc(EngFunc_WriteCoord, GrenadeOrigin[0])
        engfunc(EngFunc_WriteCoord, GrenadeOrigin[1])
        engfunc(EngFunc_WriteCoord, GrenadeOrigin[2])
        write_byte(random_num(46, 48))
        message_end()

        if(is_user_connected(touch) && is_user_alive(touch) && !fm_get_user_godmode(touch) && get_user_team(touch) != get_user_team(id) && touch != id) {
            new Float:VictimOrigin[3]
            pev(touch, pev_origin, VictimOrigin);
            new Float:Damage = get_pcvar_float(m79damage)
            new BloodColor = ExecuteHam(Ham_BloodColor, touch);
            if(BloodColor != -1) {
                new Amount = floatround(Damage);

                Amount *= 2; //according to HLSDK

                message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
                write_byte(TE_BLOODSPRITE);
                write_coord(floatround(VictimOrigin[0]));
                write_coord(floatround(VictimOrigin[1]));
                write_coord(floatround(VictimOrigin[2]));
                write_short(BloodSpray);
                write_short(BloodDrop);
                write_byte(BloodColor);
                write_byte(min(max(3, Amount/10), 16));
                message_end();
            }
            make_knockback(touch, GrenadeOrigin, get_pcvar_float(m79knockback) * Damage);

            if(get_user_health(touch) > Damage) {
                ExecuteHam(Ham_TakeDamage, touch, id, id, Damage, DMG_BLAST);

                message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("Damage"), _, touch);
                write_byte(0);
                write_byte(0);
                write_long(DMG_BLAST);
                write_coord(0) ;
                write_coord(0);
                write_coord(0);
                message_end();

                message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("ScreenFade"), {0,0,0}, touch);
                write_short(1<<13);
                write_short(1<<14);
                write_short(0x0000);
                write_byte(255);
                write_byte(255);
                write_byte(255);
                write_byte(100) ;
                message_end();

                message_begin(MSG_ONE, get_user_msgid("ScreenShake"), {0,0,0}, touch);
                write_short(0xFFFF);
                write_short(1<<13);
                write_short(0xFFFF) ;
                message_end();
            }
            else {
                death_message(id, touch, "M79");
            }
        }

        else {
            static ClassName[32];
            pev(touch, pev_classname, ClassName, charsmax(ClassName));
            if(equal(ClassName, "func_breakable")) {
                if(entity_get_float(touch, EV_FL_health) <= get_pcvar_num(m79damage)) {
                    force_use(id, touch);
                }
            }
        }

        for(new Victim = 1; Victim < get_maxplayers(); Victim++) {
            if(is_user_connected(Victim) && is_user_alive(Victim) && !fm_get_user_godmode(Victim) && get_user_team(Victim) != get_user_team(id) && Victim != id && Victim != touch) {
                new Float:VictimOrigin[3], Float:Distance_F, Distance;
                pev(Victim, pev_origin, VictimOrigin);
                Distance_F = get_distance_f(GrenadeOrigin, VictimOrigin);
                Distance = floatround(Distance_F);

                if(Distance <= get_pcvar_float(m79radius)) {
                    new Float:DistanceRatio, Float:Damage;
                    DistanceRatio = floatdiv(float(Distance), get_pcvar_float(m79radius));
                    Damage = get_pcvar_float(m79damage) - floatround(floatmul(get_pcvar_float(m79damage), DistanceRatio));

                    new BloodColor = ExecuteHam(Ham_BloodColor, Victim);
                    if(BloodColor != -1) {
                        new Amount = floatround(Damage);

                        Amount *= 2; //according to HLSDK

                        message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
                        write_byte(TE_BLOODSPRITE);
                        write_coord(floatround(VictimOrigin[0]));
                        write_coord(floatround(VictimOrigin[1]));
                        write_coord(floatround(VictimOrigin[2]));
                        write_short(BloodSpray);
                        write_short(BloodDrop);
                        write_byte(BloodColor);
                        write_byte(min(max(3, Amount/10), 16));
                        message_end();
                    }
                    make_knockback(Victim, GrenadeOrigin, get_pcvar_float(m79knockback)*Damage);

                    if(get_user_health(Victim) > Damage) {
                        ExecuteHam(Ham_TakeDamage, Victim, id, id, Damage, DMG_BLAST);

                        message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("Damage"), _, Victim);
                        write_byte(0);
                        write_byte(0);
                        write_long(DMG_BLAST);
                        write_coord(0) ;
                        write_coord(0);
                        write_coord(0);
                        message_end();

                        message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("ScreenFade"), {0,0,0}, Victim);
                        write_short(1<<13);
                        write_short(1<<14);
                        write_short(0x0000);
                        write_byte(255);
                        write_byte(255);
                        write_byte(255);
                        write_byte(100) ;
                        message_end();

                        message_begin(MSG_ONE, get_user_msgid("ScreenShake"), {0,0,0}, Victim);
                        write_short(0xFFFF);
                        write_short(1<<13);
                        write_short(0xFFFF) ;
                        message_end();
                    }
                    else {
                        death_message(id, Victim, "M79");
                    }
                }
            }
        }
        engfunc(EngFunc_RemoveEntity, grenade);
    }
}


public Hook_M79(id) {
    engclient_cmd(id, weapon_m79);
}

public get_user_m79(id) {
    return HaveM79[id];
}

public set_user_m79(id, m79) {
    if(m79) {
        if(!HaveM79[id]) {
            drop_secondary_weapons(id);
            HaveM79[id] = true;
            m79_reload[id] = 0;
            WeaponList(id, M79_WEAPONKEY)
            fm_give_item(id, weapon_m79);
            new Clip = fm_get_user_weapon_entity(id, CSW_M79);
            cs_set_weapon_ammo(Clip, 1);
        }
    }
    else {
        if(HaveM79[id]) {
            HaveM79[id] = false;
        }
    }
}
#endif

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//--------------------------------------| Dual Deagle |------------------------------------------------------
//======================================= sDs|Aragon* =======================================================
#if defined DUALDEAGLE
DualDeagle_Init() {
    register_clcmd("furien30_dualdeagle", "Hook_DualDeagle");

    register_message(get_user_msgid("DeathMsg"), "DualDeagle_DeathMsg");

    register_event("CurWeapon", "DualDeagle_ViewModel", "be", "1=1");
    register_event("WeapPickup","DualDeagle_ViewModel","b","1=19");

    register_forward(FM_SetModel, "DualDeagle_WorldModel");
    register_forward(FM_UpdateClientData, "DualDeagle_UpdateClientData", 1);
    register_forward(FM_PlaybackEvent, "DualDeagle_PlaybackEvent");

    RegisterHam(Ham_TakeDamage, "player", "DualDeagle_TakeDamage");
    RegisterHam(Ham_TraceAttack, "worldspawn", "DualDeagle_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "player", "DualDeagle_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_breakable", "DualDeagle_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_wall", "DualDeagle_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door", "DualDeagle_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door_rotating", "DualDeagle_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_plat", "DualDeagle_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_rotating", "DualDeagle_TraceAttack_Post", 1);
    RegisterHam(Ham_Item_Deploy , weapon_dualdeagle, "DualDeagle_Deploy_Post", 1);
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_dualdeagle, "DualDeagle_PrimaryAttack");
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_dualdeagle, "DualDeagle_PrimaryAttack_Post", 1);
    RegisterHam(Ham_Item_AddToPlayer, weapon_dualdeagle, "DualDeagle_AddToPlayer");
    RegisterHam(Ham_Weapon_Reload, weapon_dualdeagle, "DualDeagle_Reload");
    RegisterHam(Ham_Weapon_Reload, weapon_dualdeagle, "DualDeagle_Reload_Post", 1);
    RegisterHam(Ham_Item_PostFrame, weapon_dualdeagle, "DualDeagle_PostFrame");

    dualdeagledamage = register_cvar("furien30_dualdeagle_damage", "45");       //| DualDeagle Damage |//
    dualdeagleclip = register_cvar("furien30_dualdeagle_clip", "14");           //| DualDeagle Clip |//
    dualdeaglereloadtime = register_cvar("furien30_dualdeagle_reload_time", "4.6"); //| DualDeagle Reload Time |//
    dualdeaglerecoil = register_cvar("furien30_dualdeagle_recoil", "0.8");      //| DualDeagle Recoil |//
}

DualDeagle_Precache() {
    register_forward(FM_PrecacheEvent, "DualDeagle_PrecacheEvent_Post", 1);

    precache_model(DualDeagleModel_V);
    precache_model(DualDeagleModel_P);
    precache_model(DualDeagleModel_W);
    for(new i = 0; i < sizeof(DualDeagle_Sound); i++)
        engfunc(EngFunc_PrecacheSound, DualDeagle_Sound[i]);
    for(new i = 0; i < sizeof(DualDeagle_Generic); i++)
        engfunc(EngFunc_PrecacheGeneric, DualDeagle_Generic[i]);
}

DualDeagle_Natives() {
    register_native("get_user_dualdeagle", "get_user_dualdeagle", 1);
    register_native("set_user_dualdeagle", "set_user_dualdeagle", 1);
}

DualDeagle_Menu(const Num[] = "1") {
    new DualDeagle[256];
    formatex(DualDeagle,sizeof(DualDeagle)-1,"\wDualDeagle");
    menu_additem(Menu, DualDeagle, Num, 0);
}

public DualDeagle_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, "elite") && get_user_weapon(Attacker) == CSW_DUALDEAGLE) {
        if(get_user_dualdeagle(Attacker))
            set_msg_arg_string(4, "Dual Deagle");
    }
    return PLUGIN_CONTINUE;
}

public DualDeagle_ViewModel(id) {
    if(get_user_weapon(id) == CSW_DUALDEAGLE && get_user_dualdeagle(id)) {
        set_pev(id, pev_viewmodel2, DualDeagleModel_V);
        set_pev(id, pev_weaponmodel2, DualDeagleModel_P);
    }
}

public DualDeagle_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 DualDeagle = find_ent_by_owner(-1, weapon_dualdeagle, entity);

    if(get_user_dualdeagle(Owner) && is_valid_ent(DualDeagle) && equal(model, "models/w_elite.mdl")) {
        entity_set_int(DualDeagle, EV_INT_impulse, DUALDEAGLE_WEAPONKEY);
        HaveDualDeagle[Owner] = false;
        entity_set_model(entity, DualDeagleModel_W);
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}

public DualDeagle_UpdateClientData(id, sendweapons, cd_handle) {
    if(is_user_alive(id) && is_user_connected(id)) {
        if(get_user_weapon(id) == CSW_DUALDEAGLE && get_user_dualdeagle(id))
            set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001);
    }
}

public DualDeagle_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 != dualdeagle_event || !IsInPrimaryAttack)
        return FMRES_IGNORED;

    playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2);

    return FMRES_SUPERCEDE;
}

public DualDeagle_PrecacheEvent_Post(type, const name[]) {
    if(equal("events/elite.sc", name)) {
        dualdeagle_event = get_orig_retval();
        return FMRES_HANDLED;
    }
    return FMRES_IGNORED;
}

public DualDeagle_TakeDamage(victim, inflictor, attacker, Float:damage, damagetype) {
    if(is_user_connected(attacker) && !(damagetype & DMG_HEGRENADE)) {
        new Body, Target, Float:NewDamage;
        if(get_user_weapon(attacker) == CSW_DUALDEAGLE && get_user_dualdeagle(attacker)) {
            if(is_user_connected(victim)) {
                get_user_aiming(attacker, Target, Body, 999999);
                NewDamage = float(get_damage_body(Body, get_pcvar_float(dualdeagledamage)));
                SetHamParamFloat(4, NewDamage);
            }
            else {
                SetHamParamFloat(4, get_pcvar_float(dualdeagledamage));
            }
        }
    }
}

public DualDeagle_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_DUALDEAGLE)
        return HAM_IGNORED;
    if(!get_user_dualdeagle(attacker))
        return HAM_IGNORED;

    static Float:End[3];
    get_tr2(pentru, TR_vecEndPos, End);

    Make_Bullet(attacker, End);

    return HAM_HANDLED;
}

public DualDeagle_AddToPlayer(Weapon, id) {
    if(is_valid_ent(Weapon) && is_user_connected(id) && entity_get_int(Weapon, EV_INT_impulse) == DUALDEAGLE_WEAPONKEY) {
        HaveDualDeagle[id] = true;
        entity_set_int(Weapon, EV_INT_impulse, 0);
        WeaponList(id, DUALDEAGLE_WEAPONKEY)
    }
}

public DualDeagle_Deploy_Post(entity) {
    static Owner;
    Owner = get_pdata_cbase(entity, 41, 4);
    if(get_user_dualdeagle(Owner)) {
        set_pev(Owner, pev_viewmodel2, DualDeagleModel_V);
        set_pev(Owner, pev_weaponmodel2, DualDeagleModel_P);
        set_pdata_float(Owner, 83, 1.03, 5);
        set_weapon_anim(Owner, 15);
        static clip;
        clip = cs_get_weapon_ammo(entity);
        if(clip > 0)
            dualdeagle_reload[Owner] = 0;
    }
}

public DualDeagle_PrimaryAttack(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);

    if(get_user_dualdeagle(id)) {
        IsInPrimaryAttack = true;
        pev(id,pev_punchangle,cl_pushangle[id]);
        dualdeagle_clip[id] = cs_get_weapon_ammo(Weapon);
    }
}

public DualDeagle_PrimaryAttack_Post(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);
    new ActiveItem = get_pdata_cbase(id, 373);
    IsInPrimaryAttack = false;

    if(dualdeagle_clip[id] > cs_get_weapon_ammo(Weapon) && dualdeagle_clip[id] > 0 && pev_valid(ActiveItem)) {
        if(is_user_alive(id) && get_user_dualdeagle(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(dualdeaglerecoil),Push);
            xs_vec_add(Push,cl_pushangle[id],Push);
            set_pev(id,pev_punchangle,Push);

            emit_sound(id, CHAN_WEAPON, DualDeagle_Sound[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
            switch(random_num(0, 1)) {
                case 0: set_weapon_anim(id, random_num(2,6));

                case 1: set_weapon_anim(id, random_num(8,12));

            }
            return HAM_SUPERCEDE;
        }
        return HAM_IGNORED;
    }
    return HAM_IGNORED;
}

public DualDeagle_Reload(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_dualdeagle(id))
        return HAM_IGNORED;

    dualdeagle_clip[id] = -1;

    new Ammo = cs_get_user_bpammo(id, CSW_DUALDEAGLE);
    if(Ammo <= 0)
        return HAM_SUPERCEDE;

    new Clip = get_pdata_int(ent, 51, 4);
    if(Clip >= get_pcvar_num(dualdeagleclip))
        return HAM_SUPERCEDE;

    dualdeagle_clip[id] = Clip;
    dualdeagle_reload[id] = 1;

    return HAM_IGNORED;
}

public DualDeagle_Reload_Post(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_dualdeagle(id))
        return HAM_IGNORED;

    if(dualdeagle_clip[id] == -1)
        return HAM_IGNORED;

    new Float:reload_time = get_pcvar_float(dualdeaglereloadtime);

    set_pdata_int(ent, 51, dualdeagle_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, 14);
    return HAM_IGNORED;
}

public DualDeagle_PostFrame(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_dualdeagle(id))
        return HAM_IGNORED;

    new Float:NextAttack = get_pdata_float(id, 83, 5);
    new Ammo = cs_get_user_bpammo(id, CSW_DUALDEAGLE);

    new Clip = get_pdata_int(ent, 51, 4);
    new InReload = get_pdata_int(ent, 54, 4);

    if(InReload && NextAttack <= 0.0) {
        new Temp = min(get_pcvar_num(dualdeagleclip) - Clip, Ammo);

        set_pdata_int(ent, 51, Clip + Temp, 4);
        cs_set_user_bpammo(id, CSW_DUALDEAGLE, Ammo - Temp);
        set_pdata_int(ent, 54, 0, 4);

        InReload = 0;
        dualdeagle_reload[id] = 0;
    }

    return HAM_IGNORED;
}

public Hook_DualDeagle(id) {
    engclient_cmd(id, weapon_dualdeagle);
}

public get_user_dualdeagle(id) {
    return HaveDualDeagle[id];
}

public set_user_dualdeagle(id, dualdeagle) {
    if(dualdeagle) {
        if(!HaveDualDeagle[id]) {
            drop_secondary_weapons(id);
            HaveDualDeagle[id] = true;
            dualdeagle_reload[id] = 0;
            WeaponList(id, DUALDEAGLE_WEAPONKEY)
            fm_give_item(id, weapon_dualdeagle);
            new Clip = fm_get_user_weapon_entity(id, CSW_DUALDEAGLE);
            cs_set_weapon_ammo(Clip, get_pcvar_num(dualdeagleclip));
        }
    }
    else {
        if(HaveDualDeagle[id]) {
            HaveDualDeagle[id] = false;
        }
    }
}
#endif

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//---------------------------------------| Infinity |--------------------------------------------------------
//======================================= sDs|Aragon* =======================================================
#if defined INFINITY
Infinity_Init() {
    register_clcmd("furien30_infinity", "Hook_Infinity");

    register_message(get_user_msgid("DeathMsg"), "Infinity_DeathMsg");

    register_event("CurWeapon", "Infinity_ViewModel", "be", "1=1");
    register_event("WeapPickup","Infinity_ViewModel","b","1=19");

    register_forward(FM_SetModel, "Infinity_WorldModel");
    register_forward(FM_UpdateClientData, "Infinity_UpdateClientData_Post", 1);
    register_forward(FM_PlaybackEvent, "Infinity_PlaybackEvent");

    RegisterHam(Ham_TakeDamage, "player", "Infinity_TakeDamage");
    RegisterHam(Ham_TraceAttack, "worldspawn", "Infinity_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "player", "Infinity_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_breakable", "Infinity_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_wall", "Infinity_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door", "Infinity_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door_rotating", "Infinity_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_plat", "Infinity_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_rotating", "Infinity_TraceAttack_Post", 1);
    RegisterHam(Ham_Item_Deploy , weapon_infinity, "Infinity_Deploy_Post", 1);
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_infinity, "Infinity_PrimaryAttack");
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_infinity, "Infinity_PrimaryAttack_Post", 1);
    RegisterHam(Ham_Item_AddToPlayer, weapon_infinity, "Infinity_AddToPlayer");
    RegisterHam(Ham_Weapon_Reload, weapon_infinity, "Infinity_Reload");
    RegisterHam(Ham_Weapon_Reload, weapon_infinity, "Infinity_Reload_Post", 1);
    RegisterHam(Ham_Item_PostFrame, weapon_infinity, "Infinity_PostFrame");

    infinitydamage = register_cvar("furien30_infinity_damage", "40");           //| Infinity Damage |//
    infinityclip = register_cvar("furien30_infinity_clip", "16");           //| Infinity Clip |//
    infinityreloadtime = register_cvar("furien30_infinity_reload_time", "4.03");    //| Infinity Reload Time |//
    infinityrecoil = register_cvar("furien30_infinity_recoil", "0.8");          //| Infinity Recoil |//
}

Infinity_Precache() {
    register_forward(FM_PrecacheEvent, "Infinity_PrecacheEvent_Post", 1);

    precache_model(InfinityModel_V);
    precache_model(InfinityModel_P);
    precache_model(InfinityModel_W);
    for(new i = 0; i < sizeof(Infinity_Sound); i++)
        engfunc(EngFunc_PrecacheSound, Infinity_Sound[i]);
    for(new i = 0; i < sizeof(Infinity_Generic); i++)
        engfunc(EngFunc_PrecacheGeneric, Infinity_Generic[i]);
}

Infinity_Natives() {
    register_native("get_user_infinity", "get_user_infinity", 1);
    register_native("set_user_infinity", "set_user_infinity", 1);
}

Infinity_Menu(const Num[] = "1") {
    new Infinity[256];
    formatex(Infinity,sizeof(Infinity)-1,"\wInfinity");
    menu_additem(Menu, Infinity, Num, 0);
}

public Infinity_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, "elite") && get_user_weapon(Attacker) == CSW_INFINITY) {
        if(get_user_infinity(Attacker))
            set_msg_arg_string(4, "Infinity");
    }
    return PLUGIN_CONTINUE;
}

public Infinity_ViewModel(id) {
    if(get_user_weapon(id) == CSW_INFINITY && get_user_infinity(id)) {
        set_pev(id, pev_viewmodel2, InfinityModel_V);
        set_pev(id, pev_weaponmodel2, InfinityModel_P);
    }
}

public Infinity_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 Infinity = find_ent_by_owner(-1, weapon_infinity, entity);

    if(get_user_infinity(Owner) && is_valid_ent(Infinity) && equal(model, "models/w_elite.mdl")) {
        entity_set_int(Infinity, EV_INT_impulse, INFINITY_WEAPONKEY);
        HaveInfinity[Owner] = false;
        entity_set_model(entity, InfinityModel_W);
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}

public Infinity_UpdateClientData_Post(id, sendweapons, cd_handle) {
    if(is_user_alive(id) && is_user_connected(id)) {
        if(get_user_weapon(id) == CSW_INFINITY && get_user_infinity(id))
            set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001);
    }
}

public Infinity_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 != infinity_event || !IsInPrimaryAttack)
        return FMRES_IGNORED;

    playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2);

    return FMRES_SUPERCEDE;
}

public Infinity_PrecacheEvent_Post(type, const name[]) {
    if(equal("events/elite.sc", name)) {
        infinity_event = get_orig_retval();
        return FMRES_HANDLED;
    }
    return FMRES_IGNORED;
}

public Infinity_TakeDamage(victim, inflictor, attacker, Float:damage, damagetype) {
    if(is_user_connected(attacker) && !(damagetype & DMG_HEGRENADE)) {
        new Body, Target, Float:NewDamage;
        if(get_user_weapon(attacker) == CSW_INFINITY && get_user_infinity(attacker)) {
            if(is_user_connected(victim)) {
                get_user_aiming(attacker, Target, Body, 999999);
                NewDamage = float(get_damage_body(Body, get_pcvar_float(infinitydamage)));
                SetHamParamFloat(4, NewDamage);
            }
            else {
                SetHamParamFloat(4, get_pcvar_float(infinitydamage));
            }
        }
    }
}

public Infinity_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_INFINITY)
        return HAM_IGNORED;
    if(!get_user_infinity(attacker))
        return HAM_IGNORED;

    static Float:End[3];
    get_tr2(pentru, TR_vecEndPos, End);

    Make_Bullet(attacker, End);

    return HAM_HANDLED;
}

public Infinity_AddToPlayer(Weapon, id) {
    if(is_valid_ent(Weapon) && is_user_connected(id) && entity_get_int(Weapon, EV_INT_impulse) == INFINITY_WEAPONKEY) {
        HaveInfinity[id] = true;
        entity_set_int(Weapon, EV_INT_impulse, 0);
        WeaponList(id, INFINITY_WEAPONKEY)
    }
}

public Infinity_Deploy_Post(entity) {
    static Owner;
    Owner = get_pdata_cbase(entity, 41, 4);
    if(get_user_infinity(Owner)) {
        set_pev(Owner, pev_viewmodel2, InfinityModel_V);
        set_pev(Owner, pev_weaponmodel2, InfinityModel_P);
        set_pdata_float(Owner, 83, 1.23, 5);
        set_weapon_anim(Owner, 15);
        static clip;
        clip = cs_get_weapon_ammo(entity);
        if(clip > 0)
            infinity_reload[Owner] = 0;
    }
}

public Infinity_PrimaryAttack(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);

    if(get_user_infinity(id)) {
        IsInPrimaryAttack = true;
        pev(id,pev_punchangle,cl_pushangle[id]);
        infinity_clip[id] = cs_get_weapon_ammo(Weapon);
    }
}

public Infinity_PrimaryAttack_Post(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);
    new ActiveItem = get_pdata_cbase(id, 373);
    IsInPrimaryAttack = false;

    if(infinity_clip[id] > cs_get_weapon_ammo(Weapon) && infinity_clip[id] > 0 && pev_valid(ActiveItem)) {
        if(is_user_alive(id) && get_user_infinity(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(infinityrecoil),Push);
            xs_vec_add(Push,cl_pushangle[id],Push);
            set_pev(id,pev_punchangle,Push);

            emit_sound(id, CHAN_WEAPON, Infinity_Sound[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
            switch(random_num(0, 1)) {
                case 0: set_weapon_anim(id, random_num(2,6));

                case 1: set_weapon_anim(id, random_num(8,12));

            }
            return HAM_SUPERCEDE;
        }
        return HAM_IGNORED;
    }
    return HAM_IGNORED;
}

public Infinity_Reload(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_infinity(id))
        return HAM_IGNORED;

    infinity_clip[id] = -1;

    new Ammo = cs_get_user_bpammo(id, CSW_INFINITY);
    if(Ammo <= 0)
        return HAM_SUPERCEDE;

    new Clip = get_pdata_int(ent, 51, 4);
    if(Clip >= get_pcvar_num(infinityclip))
        return HAM_SUPERCEDE;

    infinity_clip[id] = Clip;
    infinity_reload[id] = 1;

    return HAM_IGNORED;
}

public Infinity_Reload_Post(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_infinity(id))
        return HAM_IGNORED;

    if(infinity_clip[id] == -1)
        return HAM_IGNORED;

    new Float:reload_time = get_pcvar_float(infinityreloadtime);

    set_pdata_int(ent, 51, infinity_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, 14);
    return HAM_IGNORED;
}

public Infinity_PostFrame(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_infinity(id))
        return HAM_IGNORED;

    new Float:NextAttack = get_pdata_float(id, 83, 5);
    new Ammo = cs_get_user_bpammo(id, CSW_INFINITY);

    new Clip = get_pdata_int(ent, 51, 4);
    new InReload = get_pdata_int(ent, 54, 4);

    if(InReload && NextAttack <= 0.0) {
        new Temp = min(get_pcvar_num(infinityclip) - Clip, Ammo);

        set_pdata_int(ent, 51, Clip + Temp, 4);
        cs_set_user_bpammo(id, CSW_INFINITY, Ammo - Temp);
        set_pdata_int(ent, 54, 0, 4);

        InReload = 0;
        infinity_reload[id] = 0;
    }

    return HAM_IGNORED;
}

public Hook_Infinity(id) {
    engclient_cmd(id, weapon_infinity);
}

public get_user_infinity(id) {
    return HaveInfinity[id];
}

public set_user_infinity(id, infinity) {
    if(infinity) {
        if(!HaveInfinity[id]) {
            drop_secondary_weapons(id);
            HaveInfinity[id] = true;
            infinity_reload[id] = 0;
            WeaponList(id, INFINITY_WEAPONKEY)
            fm_give_item(id, weapon_infinity);
            new Clip = fm_get_user_weapon_entity(id, CSW_INFINITY);
            cs_set_weapon_ammo(Clip, get_pcvar_num(infinityclip));
        }
    }
    else {
        if(HaveInfinity[id]) {
            HaveInfinity[id] = false;
        }
    }
}
#endif

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//--------------------------------------| DeagleGold |-------------------------------------------------------
//======================================= sDs|Aragon* =======================================================
#if defined DEAGLEGOLD
DeagleGold_Init() {
    register_clcmd("furien30_deaglegold", "Hook_DeagleGold");

    register_message(get_user_msgid("DeathMsg"), "DeagleGold_DeathMsg");

    register_event("CurWeapon", "DeagleGold_ViewModel", "be", "1=1");
    register_event("WeapPickup","DeagleGold_ViewModel","b","1=19");

    register_forward(FM_SetModel, "DeagleGold_WorldModel");
    register_forward(FM_UpdateClientData, "DeagleGold_UpdateClientData", 1);
    register_forward(FM_PlaybackEvent, "DeagleGold_PlaybackEvent");

    RegisterHam(Ham_TakeDamage, "player", "DeagleGold_TakeDamage");
    RegisterHam(Ham_TraceAttack, "worldspawn", "DeagleGold_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "player", "DeagleGold_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_breakable", "DeagleGold_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_wall", "DeagleGold_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door", "DeagleGold_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door_rotating", "DeagleGold_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_plat", "DeagleGold_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_rotating", "DeagleGold_TraceAttack_Post", 1);
    RegisterHam(Ham_Item_Deploy , weapon_deaglegold, "DeagleGold_Deploy_Post", 1);
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_deaglegold, "DeagleGold_PrimaryAttack");
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_deaglegold, "DeagleGold_PrimaryAttack_Post", 1);
    RegisterHam(Ham_Item_AddToPlayer, weapon_deaglegold, "DeagleGold_AddToPlayer");
    RegisterHam(Ham_Weapon_Reload, weapon_deaglegold, "DeagleGold_Reload");
    RegisterHam(Ham_Weapon_Reload, weapon_deaglegold, "DeagleGold_Reload_Post", 1);
    RegisterHam(Ham_Item_PostFrame, weapon_deaglegold, "DeagleGold_PostFrame");

    deaglegolddamage = register_cvar("furien30_deaglegold_damage", "50");       //| DeagleGold Damage |//
    deaglegoldclip = register_cvar("furien30_deaglegold_clip", "7");            //| DeagleGold Clip |//
    deaglegoldreloadtime = register_cvar("furien30_deaglegold_reload_time", "2.2"); //| DeagleGold Reload Time |//
    deaglegoldrecoil = register_cvar("furien30_deaglegold_recoil", "0.8");      //| DeagleGold Recoil |//
}

DeagleGold_Precache() {
    register_forward(FM_PrecacheEvent, "DeagleGold_PrecacheEvent_Post", 1);

    precache_model(DeagleGoldModel_V);
    precache_model(DeagleGoldModel_P);
    precache_model(DeagleGoldModel_W);

    for(new i = 0; i < sizeof(DeagleGold_Sound); i++)
        engfunc(EngFunc_PrecacheSound, DeagleGold_Sound[i]);
}

DeagleGold_Natives() {
    register_native("get_user_deaglegold", "get_user_deaglegold", 1);
    register_native("set_user_deaglegold", "set_user_deaglegold", 1);
}

DeagleGold_Menu(const Num[] = "1") {
    new DeagleGold[256];
    formatex(DeagleGold,sizeof(DeagleGold)-1,"\wDeagleGold");
    menu_additem(Menu, DeagleGold, Num, 0);
}

public DeagleGold_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, "deagle") && get_user_weapon(Attacker) == CSW_DEAGLEGOLD) {
        if(get_user_deaglegold(Attacker))
            set_msg_arg_string(4, "Deagle Gold");
    }
    return PLUGIN_CONTINUE;
}

public DeagleGold_ViewModel(id) {
    if(get_user_weapon(id) == CSW_DEAGLEGOLD && get_user_deaglegold(id)) {
        set_pev(id, pev_viewmodel2, DeagleGoldModel_V);
        set_pev(id, pev_weaponmodel2, DeagleGoldModel_P);
    }
}

public DeagleGold_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 DeagleGold = find_ent_by_owner(-1, weapon_deaglegold, entity);

    if(get_user_deaglegold(Owner) && is_valid_ent(DeagleGold) && equal(model, "models/w_deagle.mdl")) {
        entity_set_int(DeagleGold, EV_INT_impulse, DEAGLEGOLD_WEAPONKEY);
        HaveDeagleGold[Owner] = false;
        entity_set_model(entity, DeagleGoldModel_W);
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}

public DeagleGold_UpdateClientData(id, sendweapons, cd_handle) {
    if(is_user_alive(id) && is_user_connected(id)) {
        if(get_user_weapon(id) == CSW_DEAGLEGOLD && get_user_deaglegold(id))
            set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001);
    }
}

public DeagleGold_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 != deaglegold_event || !IsInPrimaryAttack)
        return FMRES_IGNORED;

    playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2);

    return FMRES_SUPERCEDE;
}

public DeagleGold_PrecacheEvent_Post(type, const name[]) {
    if(equal("events/deagle.sc", name)) {
        deaglegold_event = get_orig_retval();
        return FMRES_HANDLED;
    }
    return FMRES_IGNORED;
}

public DeagleGold_TakeDamage(victim, inflictor, attacker, Float:damage, damagetype) {
    if(is_user_connected(attacker) && !(damagetype & DMG_HEGRENADE)) {
        new Body, Target, Float:NewDamage;
        if(get_user_weapon(attacker) == CSW_DEAGLEGOLD && get_user_deaglegold(attacker)) {
            if(is_user_connected(victim)) {
                get_user_aiming(attacker, Target, Body, 999999);
                NewDamage = float(get_damage_body(Body, get_pcvar_float(deaglegolddamage)));
                SetHamParamFloat(4, NewDamage);
            }
            else {
                SetHamParamFloat(4, get_pcvar_float(deaglegolddamage));
            }
        }
    }
}

public DeagleGold_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_DEAGLEGOLD)
        return HAM_IGNORED;
    if(!get_user_deaglegold(attacker))
        return HAM_IGNORED;

    static Float:End[3];
    get_tr2(pentru, TR_vecEndPos, End);

    Make_Bullet(attacker, End);

    return HAM_HANDLED;
}

public DeagleGold_AddToPlayer(Weapon, id) {
    if(is_valid_ent(Weapon) && is_user_connected(id) && entity_get_int(Weapon, EV_INT_impulse) == DEAGLEGOLD_WEAPONKEY) {
        HaveDeagleGold[id] = true;
        entity_set_int(Weapon, EV_INT_impulse, 0);
        WeaponList(id, DEAGLEGOLD_WEAPONKEY)
    }
}

public DeagleGold_Deploy_Post(entity) {
    static Owner;
    Owner = get_pdata_cbase(entity, 41, 4);
    if(get_user_deaglegold(Owner)) {
        set_pev(Owner, pev_viewmodel2, DeagleGoldModel_V);
        set_pev(Owner, pev_weaponmodel2, DeagleGoldModel_P);
        set_pdata_float(Owner, 83, 1.03, 5);
        set_weapon_anim(Owner, 5);
        static clip;
        clip = cs_get_weapon_ammo(entity);
        if(clip > 0)
            deaglegold_reload[Owner] = 0;
    }
}

public DeagleGold_PrimaryAttack(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);

    if(get_user_deaglegold(id)) {
        IsInPrimaryAttack = true;
        pev(id,pev_punchangle,cl_pushangle[id]);
        deaglegold_clip[id] = cs_get_weapon_ammo(Weapon);
    }
}

public DeagleGold_PrimaryAttack_Post(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);
    new ActiveItem = get_pdata_cbase(id, 373) ;
    IsInPrimaryAttack = false;

    if(deaglegold_clip[id] > cs_get_weapon_ammo(Weapon) && deaglegold_clip[id] > 0 && pev_valid(ActiveItem)) {
        if(is_user_alive(id) && get_user_deaglegold(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(deaglegoldrecoil),Push);
            xs_vec_add(Push,cl_pushangle[id],Push);
            set_pev(id,pev_punchangle,Push);

            emit_sound(id, CHAN_WEAPON, DeagleGold_Sound[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
            set_weapon_anim(id, random_num(1,2));
            return HAM_SUPERCEDE;
        }
        return HAM_IGNORED;
    }
    return HAM_IGNORED;
}

public DeagleGold_Reload(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_deaglegold(id))
        return HAM_IGNORED;

    deaglegold_clip[id] = -1;

    new Ammo = cs_get_user_bpammo(id, CSW_DEAGLEGOLD);
    if(Ammo <= 0)
        return HAM_SUPERCEDE;

    new Clip = get_pdata_int(ent, 51, 4);
    if(Clip >= get_pcvar_num(deaglegoldclip))
        return HAM_SUPERCEDE;

    deaglegold_clip[id] = Clip;
    deaglegold_reload[id] = 1;

    return HAM_IGNORED;
}

public DeagleGold_Reload_Post(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_deaglegold(id))
        return HAM_IGNORED;

    if(deaglegold_clip[id] == -1)
        return HAM_IGNORED;

    new Float:reload_time = get_pcvar_float(deaglegoldreloadtime);

    set_pdata_int(ent, 51, deaglegold_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, 4);
    return HAM_IGNORED;
}

public DeagleGold_PostFrame(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_deaglegold(id))
        return HAM_IGNORED;

    new Float:NextAttack = get_pdata_float(id, 83, 5);
    new Ammo = cs_get_user_bpammo(id, CSW_DEAGLEGOLD);

    new Clip = get_pdata_int(ent, 51, 4);
    new InReload = get_pdata_int(ent, 54, 4);

    if(InReload && NextAttack <= 0.0) {
        new Temp = min(get_pcvar_num(deaglegoldclip) - Clip, Ammo);

        set_pdata_int(ent, 51, Clip + Temp, 4);
        cs_set_user_bpammo(id, CSW_DEAGLEGOLD, Ammo - Temp);
        set_pdata_int(ent, 54, 0, 4);

        InReload = 0;
        deaglegold_reload[id] = 0;
    }

    return HAM_IGNORED;
}

public Hook_DeagleGold(id) {
    engclient_cmd(id, weapon_deaglegold);
}

public get_user_deaglegold(id) {
    return HaveDeagleGold[id];
}

public set_user_deaglegold(id, deaglegold) {
    if(deaglegold) {
        if(!HaveDeagleGold[id]) {
            drop_secondary_weapons(id);
            HaveDeagleGold[id] = true;
            deaglegold_reload[id] = 0;
            WeaponList(id, DEAGLEGOLD_WEAPONKEY)
            fm_give_item(id, weapon_deaglegold);
            new Clip = fm_get_user_weapon_entity(id, CSW_DEAGLEGOLD);
            cs_set_weapon_ammo(Clip, get_pcvar_num(deaglegoldclip));
        }
    }
    else {
        if(HaveDeagleGold[id]) {
            HaveDeagleGold[id] = false;
        }
    }
}
#endif

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//-----------------------------------------| K5 |----------------------------------------------------------
//======================================= sDs|Aragon* =======================================================
#if defined K5
K5_Init() {
    register_clcmd("furien30_k5", "Hook_K5");

    register_message(get_user_msgid("DeathMsg"), "K5_DeathMsg");

    register_event("CurWeapon", "K5_ViewModel", "be", "1=1");
    register_event("WeapPickup","K5_ViewModel","b","1=19");

    register_forward(FM_SetModel, "K5_WorldModel");
    register_forward(FM_UpdateClientData, "K5_UpdateClientData_Post", 1);
    register_forward(FM_PlaybackEvent, "K5_PlaybackEvent");

    RegisterHam(Ham_TakeDamage, "player", "K5_TakeDamage");
    RegisterHam(Ham_TraceAttack, "worldspawn", "K5_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "player", "K5_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_breakable", "K5_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_wall", "K5_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door", "K5_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door_rotating", "K5_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_plat", "K5_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_rotating", "K5_TraceAttack_Post", 1);
    RegisterHam(Ham_Item_Deploy , weapon_k5, "K5_Deploy_Post", 1);
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_k5, "K5_PrimaryAttack");
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_k5, "K5_PrimaryAttack_Post", 1);
    RegisterHam(Ham_Item_AddToPlayer, weapon_k5, "K5_AddToPlayer");
    RegisterHam(Ham_Weapon_Reload, weapon_k5, "K5_Reload");
    RegisterHam(Ham_Weapon_Reload, weapon_k5, "K5_Reload_Post", 1);
    RegisterHam(Ham_Item_PostFrame, weapon_k5, "K5_PostFrame");

    k5damage = register_cvar("furien30_k5_damage", "45");       //| K5 Damage |//
    k5clip = register_cvar("furien30_k5_clip", "12");           //| K5 Clip |//
    k5reloadtime = register_cvar("furien30_k5_reload_time", "2.32");    //| K5 Reload Time |//
    k5recoil = register_cvar("furien30_k5_recoil", "0.8");      //| K5 Recoil |//
}

K5_Precache() {
    register_forward(FM_PrecacheEvent, "K5_PrecacheEvent_Post", 1);

    precache_model(K5Model_V);
    precache_model(K5Model_P);
    precache_model(K5Model_W);
    for(new i = 0; i < sizeof(K5_Sound); i++)
        engfunc(EngFunc_PrecacheSound, K5_Sound[i]);
}

K5_Natives() {
    register_native("get_user_k5", "get_user_k5", 1);
    register_native("set_user_k5", "set_user_k5", 1);
}

K5_Menu(const Num[] = "1") {
    new _K5[256];
    formatex(_K5,sizeof(_K5)-1,"\wK5");
    menu_additem(Menu, _K5, Num, 0);
}

public K5_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, "p228") && get_user_weapon(Attacker) == CSW_K5) {
        if(get_user_k5(Attacker))
            set_msg_arg_string(4, "K5");
    }
    return PLUGIN_CONTINUE;
}

public K5_ViewModel(id) {
    if(get_user_weapon(id) == CSW_K5 && get_user_k5(id)) {
        set_pev(id, pev_viewmodel2, K5Model_V);
        set_pev(id, pev_weaponmodel2, K5Model_P);
    }
}

public K5_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 _K5 = find_ent_by_owner(-1, weapon_k5, entity);

    if(get_user_k5(Owner) && is_valid_ent(_K5) && equal(model, "models/w_p228.mdl")) {
        entity_set_int(_K5, EV_INT_impulse, K5_WEAPONKEY);
        HaveK5[Owner] = false;
        entity_set_model(entity, K5Model_W);
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}

public K5_UpdateClientData_Post(id, sendweapons, cd_handle) {
    if(is_user_alive(id) && is_user_connected(id)) {
        if(get_user_weapon(id) == CSW_K5 && get_user_k5(id))
            set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001);
    }
}

public K5_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 != k5_event || !IsInPrimaryAttack)
        return FMRES_IGNORED;

    playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2);

    return FMRES_SUPERCEDE;
}

public K5_PrecacheEvent_Post(type, const name[]) {
    if(equal("events/p228.sc", name)) {
        k5_event = get_orig_retval();
        return FMRES_HANDLED;
    }
    return FMRES_IGNORED;
}

public K5_TakeDamage(victim, inflictor, attacker, Float:damage, damagetype) {
    if(is_user_connected(attacker) && !(damagetype & DMG_HEGRENADE)) {
        new Body, Target, Float:NewDamage;
        if(get_user_weapon(attacker) == CSW_K5 && get_user_k5(attacker)) {
            if(is_user_connected(victim)) {
                get_user_aiming(attacker, Target, Body, 999999);
                NewDamage = float(get_damage_body(Body, get_pcvar_float(k5damage)));
                SetHamParamFloat(4, NewDamage);
            }
            else {
                SetHamParamFloat(4, get_pcvar_float(k5damage));
            }
        }
    }
}

public K5_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_K5)
        return HAM_IGNORED;
    if(!get_user_k5(attacker))
        return HAM_IGNORED;

    static Float:End[3];
    get_tr2(pentru, TR_vecEndPos, End);

    Make_Bullet(attacker, End);

    return HAM_HANDLED;
}

public K5_AddToPlayer(Weapon, id) {
    if(is_valid_ent(Weapon) && is_user_connected(id) && entity_get_int(Weapon, EV_INT_impulse) == K5_WEAPONKEY) {
        HaveK5[id] = true;
        entity_set_int(Weapon, EV_INT_impulse, 0);
        WeaponList(id, K5_WEAPONKEY)
    }
}

public K5_Deploy_Post(entity) {
    static Owner;
    Owner = get_pdata_cbase(entity, 41, 4);
    if(get_user_k5(Owner)) {
        set_pev(Owner, pev_viewmodel2, K5Model_V);
        set_pev(Owner, pev_weaponmodel2, K5Model_P);
        set_pdata_float(Owner, 83, 1.32, 5);
        set_weapon_anim(Owner, 6);
        static clip;
        clip = cs_get_weapon_ammo(entity);
        if(clip > 0)
            k5_reload[Owner] = 0;
    }
}

public K5_PrimaryAttack(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);

    if(get_user_k5(id)) {
        IsInPrimaryAttack = true;
        pev(id,pev_punchangle,cl_pushangle[id]);
        k5_clip[id] = cs_get_weapon_ammo(Weapon);
    }
}

public K5_PrimaryAttack_Post(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);
    new ActiveItem = get_pdata_cbase(id, 373) ;
    IsInPrimaryAttack = false;

    if(k5_clip[id] > cs_get_weapon_ammo(Weapon) && k5_clip[id] > 0 && pev_valid(ActiveItem)) {
        if(is_user_alive(id) && get_user_k5(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(k5recoil),Push);
            xs_vec_add(Push,cl_pushangle[id],Push);
            set_pev(id,pev_punchangle,Push);

            emit_sound(id, CHAN_WEAPON, K5_Sound[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
            set_weapon_anim(id, random_num(1,2));
            return HAM_SUPERCEDE;
        }
        return HAM_IGNORED;
    }
    return HAM_IGNORED;
}

public K5_Reload(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_k5(id))
        return HAM_IGNORED;

    k5_clip[id] = -1;

    new Ammo = cs_get_user_bpammo(id, CSW_K5);
    if(Ammo <= 0)
        return HAM_SUPERCEDE;

    new Clip = get_pdata_int(ent, 51, 4);
    if(Clip >= get_pcvar_num(k5clip))
        return HAM_SUPERCEDE;

    k5_clip[id] = Clip;
    k5_reload[id] = 1;

    return HAM_IGNORED;
}

public K5_Reload_Post(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_k5(id))
        return HAM_IGNORED;

    if(k5_clip[id] == -1)
        return HAM_IGNORED;

    new Float:reload_time = get_pcvar_float(k5reloadtime);

    set_pdata_int(ent, 51, k5_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, 5);
    return HAM_IGNORED;
}

public K5_PostFrame(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_k5(id))
        return HAM_IGNORED;

    new Float:NextAttack = get_pdata_float(id, 83, 5);
    new Ammo = cs_get_user_bpammo(id, CSW_K5);

    new Clip = get_pdata_int(ent, 51, 4);
    new InReload = get_pdata_int(ent, 54, 4);

    if(InReload && NextAttack <= 0.0) {
        new Temp = min(get_pcvar_num(k5clip) - Clip, Ammo);

        set_pdata_int(ent, 51, Clip + Temp, 4);
        cs_set_user_bpammo(id, CSW_K5, Ammo - Temp);
        set_pdata_int(ent, 54, 0, 4);

        InReload = 0;
        k5_reload[id] = 0;
    }

    return HAM_IGNORED;
}

public Hook_K5(id) {
    engclient_cmd(id, weapon_k5);
}

public get_user_k5(id) {
    return HaveK5[id];
}

public set_user_k5(id, k5) {
    if(k5) {
        if(!HaveK5[id]) {
            drop_secondary_weapons(id);
            HaveK5[id] = true;
            k5_reload[id] = 0;
            WeaponList(id, K5_WEAPONKEY)
            fm_give_item(id, weapon_k5);
            new Clip = fm_get_user_weapon_entity(id, CSW_K5);
            cs_set_weapon_ammo(Clip, get_pcvar_num(k5clip));
        }
    }
    else {
        if(HaveK5[id]) {
            HaveK5[id] = false;
        }
    }
}
#endif

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//-----------------------------------------| Skull1 |----------------------------------------------------------
//======================================= sDs|Aragon* =======================================================
#if defined SKULL1
Skull1_Init() {
    register_clcmd("furien30_skull1", "Hook_Skull1");

    register_message(get_user_msgid("DeathMsg"), "Skull1_DeathMsg");

    register_event("CurWeapon", "Skull1_ViewModel", "be", "1=1");
    register_event("WeapPickup","Skull1_ViewModel","b","1=19");

    register_forward(FM_SetModel, "Skull1_WorldModel");
    register_forward(FM_UpdateClientData, "Skull1_UpdateClientData_Post", 1);
    register_forward(FM_PlaybackEvent, "Skull1_PlaybackEvent");

    RegisterHam(Ham_TakeDamage, "player", "Skull1_TakeDamage");
    RegisterHam(Ham_TraceAttack, "worldspawn", "Skull1_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "player", "Skull1_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_breakable", "Skull1_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_wall", "Skull1_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door", "Skull1_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door_rotating", "Skull1_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_plat", "Skull1_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_rotating", "Skull1_TraceAttack_Post", 1);
    RegisterHam(Ham_Item_Deploy , weapon_skull1, "Skull1_Deploy_Post", 1);
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_skull1, "Skull1_PrimaryAttack");
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_skull1, "Skull1_PrimaryAttack_Post", 1);
    RegisterHam(Ham_Item_AddToPlayer, weapon_skull1, "Skull1_AddToPlayer");
    RegisterHam(Ham_Weapon_Reload, weapon_skull1, "Skull1_Reload");
    RegisterHam(Ham_Weapon_Reload, weapon_skull1, "Skull1_Reload_Post", 1);
    RegisterHam(Ham_Item_PostFrame, weapon_skull1, "Skull1_PostFrame");

    skull1damage = register_cvar("furien30_skull1_damage", "55");           //| Skull1 Damage |//
    skull1clip = register_cvar("furien30_skull1_clip", "7");                //| Skull1 Clip |//
    skull1reloadtime = register_cvar("furien30_skull1_reload_time", "2.53");        //| Skull1 Reload Time |//
    skull1recoil = register_cvar("furien30_skull1_recoil", "0.8");          //| Skull1 Recoil |//
}

Skull1_Precache() {
    register_forward(FM_PrecacheEvent, "Skull1_PrecacheEvent_Post", 1);

    precache_model(Skull1Model_V);
    precache_model(Skull1Model_P);
    precache_model(Skull1Model_W);
    for(new i = 0; i < sizeof(Skull1_Sound); i++)
        engfunc(EngFunc_PrecacheSound, Skull1_Sound[i]);
    for(new i = 0; i < sizeof(Skull1_Generic); i++)
        engfunc(EngFunc_PrecacheGeneric, Skull1_Generic[i]);
}

Skull1_Natives() {
    register_native("get_user_skull1", "get_user_skull1", 1);
    register_native("set_user_skull1", "set_user_skull1", 1);
}

Skull1_Menu(const Num[] = "1") {
    new Skull1[256];
    formatex(Skull1,sizeof(Skull1)-1,"\wSkull1");
    menu_additem(Menu, Skull1, Num, 0);
}

public Skull1_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, "deagle") && get_user_weapon(Attacker) == CSW_SKULL1) {
        if(get_user_skull1(Attacker))
            set_msg_arg_string(4, "Skull1");
    }
    return PLUGIN_CONTINUE;
}

public Skull1_ViewModel(id) {
    if(get_user_weapon(id) == CSW_SKULL1 && get_user_skull1(id)) {
        set_pev(id, pev_viewmodel2, Skull1Model_V);
        set_pev(id, pev_weaponmodel2, Skull1Model_P);
    }
}

public Skull1_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 Skull1 = find_ent_by_owner(-1, weapon_skull1, entity);

    if(get_user_skull1(Owner) && is_valid_ent(Skull1) && equal(model, "models/w_deagle.mdl")) {
        entity_set_int(Skull1, EV_INT_impulse, SKULL1_WEAPONKEY);
        HaveSkull1[Owner] = false;
        entity_set_model(entity, Skull1Model_W);
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}

public Skull1_UpdateClientData_Post(id, sendweapons, cd_handle) {
    if(is_user_alive(id) && is_user_connected(id)) {
        if(get_user_weapon(id) == CSW_SKULL1 && get_user_skull1(id))
            set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001);
    }
}

public Skull1_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 != skull1_event || !IsInPrimaryAttack)
        return FMRES_IGNORED;

    playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2);

    return FMRES_SUPERCEDE;
}

public Skull1_PrecacheEvent_Post(type, const name[]) {
    if(equal("events/deagle.sc", name)) {
        skull1_event = get_orig_retval();
        return FMRES_HANDLED;
    }
    return FMRES_IGNORED;
}

public Skull1_TakeDamage(victim, inflictor, attacker, Float:damage, damagetype) {
    if(is_user_connected(attacker) && !(damagetype & DMG_HEGRENADE)) {
        new Body, Target, Float:NewDamage;
        if(get_user_weapon(attacker) == CSW_SKULL1 && get_user_skull1(attacker)) {
            if(is_user_connected(victim)) {
                get_user_aiming(attacker, Target, Body, 999999);
                NewDamage = float(get_damage_body(Body, get_pcvar_float(skull1damage)));
                SetHamParamFloat(4, NewDamage);
            }
            else {
                SetHamParamFloat(4, get_pcvar_float(skull1damage));
            }
        }
    }
}

public Skull1_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_SKULL1)
        return HAM_IGNORED;
    if(!get_user_skull1(attacker))
        return HAM_IGNORED;

    static Float:End[3];
    get_tr2(pentru, TR_vecEndPos, End);

    Make_Bullet(attacker, End);

    return HAM_HANDLED;
}

public Skull1_AddToPlayer(Weapon, id) {
    if(is_valid_ent(Weapon) && is_user_connected(id) && entity_get_int(Weapon, EV_INT_impulse) == SKULL1_WEAPONKEY) {
        HaveSkull1[id] = true;
        entity_set_int(Weapon, EV_INT_impulse, 0);
        WeaponList(id, SKULL1_WEAPONKEY)
    }
}

public Skull1_Deploy_Post(entity) {
    static Owner;
    Owner = get_pdata_cbase(entity, 41, 4);
    if(get_user_skull1(Owner)) {
        set_pev(Owner, pev_viewmodel2, Skull1Model_V);
        set_pev(Owner, pev_weaponmodel2, Skull1Model_P);
        set_pdata_float(Owner, 83, 1.01, 5);
        set_weapon_anim(Owner, 7);
        static clip;
        clip = cs_get_weapon_ammo(entity);
        if(clip > 0)
            skull1_reload[Owner] = 0;
    }
}

public Skull1_PrimaryAttack(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);

    if(get_user_skull1(id)) {
        IsInPrimaryAttack = true;
        pev(id,pev_punchangle,cl_pushangle[id]);
        skull1_clip[id] = cs_get_weapon_ammo(Weapon);
    }
}

public Skull1_PrimaryAttack_Post(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);
    new ActiveItem = get_pdata_cbase(id, 373);
    IsInPrimaryAttack = false;

    if(skull1_clip[id] > cs_get_weapon_ammo(Weapon) && skull1_clip[id] > 0 && pev_valid(ActiveItem)) {
        if(is_user_alive(id) && get_user_skull1(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(skull1recoil),Push);
            xs_vec_add(Push,cl_pushangle[id],Push);
            set_pev(id,pev_punchangle,Push);

            emit_sound(id, CHAN_WEAPON, Skull1_Sound[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
            set_weapon_anim(id, random_num(2,3));
            return HAM_SUPERCEDE;
        }
        return HAM_IGNORED;
    }
    return HAM_IGNORED;
}

public Skull1_Reload(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_skull1(id))
        return HAM_IGNORED;

    skull1_clip[id] = -1;

    new Ammo = cs_get_user_bpammo(id, CSW_SKULL1);
    if(Ammo <= 0)
        return HAM_SUPERCEDE;

    new Clip = get_pdata_int(ent, 51, 4);
    if(Clip >= get_pcvar_num(skull1clip))
        return HAM_SUPERCEDE;

    skull1_clip[id] = Clip;
    skull1_reload[id] = 1;

    return HAM_IGNORED;
}

public Skull1_Reload_Post(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_skull1(id))
        return HAM_IGNORED;

    if(skull1_clip[id] == -1)
        return HAM_IGNORED;

    new Float:reload_time = get_pcvar_float(skull1reloadtime);

    set_pdata_int(ent, 51, skull1_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, 6);
    return HAM_IGNORED;
}

public Skull1_PostFrame(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_skull1(id))
        return HAM_IGNORED;

    new Float:NextAttack = get_pdata_float(id, 83, 5);
    new Ammo = cs_get_user_bpammo(id, CSW_SKULL1);

    new Clip = get_pdata_int(ent, 51, 4);
    new InReload = get_pdata_int(ent, 54, 4);

    if(InReload && NextAttack <= 0.0) {
        new Temp = min(get_pcvar_num(skull1clip) - Clip, Ammo);

        set_pdata_int(ent, 51, Clip + Temp, 4);
        cs_set_user_bpammo(id, CSW_SKULL1, Ammo - Temp);
        set_pdata_int(ent, 54, 0, 4);

        InReload = 0;
        skull1_reload[id] = 0;
    }

    return HAM_IGNORED;
}

public Hook_Skull1(id) {
    engclient_cmd(id, weapon_skull1);
}

public get_user_skull1(id) {
    return HaveSkull1[id];
}

public set_user_skull1(id, skull1) {
    if(skull1) {
        if(!HaveSkull1[id]) {
            drop_secondary_weapons(id);
            HaveSkull1[id] = true;
            skull1_reload[id] = 0;
            WeaponList(id, SKULL1_WEAPONKEY)
            fm_give_item(id, weapon_skull1);
            new Clip = fm_get_user_weapon_entity(id, CSW_SKULL1);
            cs_set_weapon_ammo(Clip, get_pcvar_num(skull1clip));
        }
    }
    else {
        if(HaveSkull1[id]) {
            HaveSkull1[id] = false;
        }
    }
}
#endif

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//---------------------------------------| Anaconda |--------------------------------------------------------
//======================================= sDs|Aragon* =======================================================
#if defined ANACONDA
Anaconda_Init() {
    register_clcmd("furien30_anaconda", "Hook_Anaconda");

    register_message(get_user_msgid("DeathMsg"), "Anaconda_DeathMsg");

    register_event("CurWeapon", "Anaconda_ViewModel", "be", "1=1");
    register_event("WeapPickup","Anaconda_ViewModel","b","1=19");

    register_forward(FM_SetModel, "Anaconda_WorldModel");
    register_forward(FM_UpdateClientData, "Anaconda_UpdateClientData_Post", 1);
    register_forward(FM_PlaybackEvent, "Anaconda_PlaybackEvent");

    RegisterHam(Ham_TakeDamage, "player", "Anaconda_TakeDamage");
    RegisterHam(Ham_TraceAttack, "worldspawn", "Anaconda_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "player", "Anaconda_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_breakable", "Anaconda_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_wall", "Anaconda_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door", "Anaconda_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door_rotating", "Anaconda_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_plat", "Anaconda_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_rotating", "Anaconda_TraceAttack_Post", 1);
    RegisterHam(Ham_Item_Deploy , weapon_anaconda, "Anaconda_Deploy_Post", 1);
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_anaconda, "Anaconda_PrimaryAttack");
    RegisterHam(Ham_Weapon_PrimaryAttack, weapon_anaconda, "Anaconda_PrimaryAttack_Post", 1);
    RegisterHam(Ham_Item_AddToPlayer, weapon_anaconda, "Anaconda_AddToPlayer");
    RegisterHam(Ham_Weapon_Reload, weapon_anaconda, "Anaconda_Reload");
    RegisterHam(Ham_Weapon_Reload, weapon_anaconda, "Anaconda_Reload_Post", 1);
    RegisterHam(Ham_Item_PostFrame, weapon_anaconda, "Anaconda_PostFrame");

    anacondadamage = register_cvar("furien30_anaconda_damage", "50");           //| Anaconda Damage |//
    anacondaclip = register_cvar("furien30_anaconda_clip", "7");            //| Anaconda Clip |//
    anacondareloadtime = register_cvar("furien30_anaconda_reload_time", "2.33");    //| Anaconda Reload Time |//
    anacondarecoil = register_cvar("furien30_anaconda_recoil", "0.8");          //| Anaconda Recoil |//
}

Anaconda_Precache() {
    register_forward(FM_PrecacheEvent, "Anaconda_PrecacheEvent_Post", 1);

    precache_model(AnacondaModel_V);
    precache_model(AnacondaModel_P);
    precache_model(AnacondaModel_W);
    for(new i = 0; i < sizeof(Anaconda_Sound); i++)
        engfunc(EngFunc_PrecacheSound, Anaconda_Sound[i]);
    for(new i = 0; i < sizeof(Anaconda_Generic); i++)
        engfunc(EngFunc_PrecacheGeneric, Anaconda_Generic[i]);
}

Anaconda_Natives() {
    register_native("get_user_anaconda", "get_user_anaconda", 1);
    register_native("set_user_anaconda", "set_user_anaconda", 1);
}

Anaconda_Menu(const Num[] = "1") {
    new Anaconda[256];
    formatex(Anaconda,sizeof(Anaconda)-1,"\wAnaconda");
    menu_additem(Menu, Anaconda, Num, 0);
}

public Anaconda_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, "deagle") && get_user_weapon(Attacker) == CSW_ANACONDA) {
        if(get_user_anaconda(Attacker))
            set_msg_arg_string(4, "Anaconda");
    }
    return PLUGIN_CONTINUE;
}

public Anaconda_ViewModel(id) {
    if(get_user_weapon(id) == CSW_ANACONDA && get_user_anaconda(id)) {
        set_pev(id, pev_viewmodel2, AnacondaModel_V);
        set_pev(id, pev_weaponmodel2, AnacondaModel_P);
    }
}

public Anaconda_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 Anaconda = find_ent_by_owner(-1, weapon_anaconda, entity);

    if(get_user_anaconda(Owner) && is_valid_ent(Anaconda) && equal(model, "models/w_deagle.mdl")) {
        entity_set_int(Anaconda, EV_INT_impulse, ANACONDA_WEAPONKEY);
        HaveAnaconda[Owner] = false;
        entity_set_model(entity, AnacondaModel_W);
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}

public Anaconda_UpdateClientData_Post(id, sendweapons, cd_handle) {
    if(is_user_alive(id) && is_user_connected(id)) {
        if(get_user_weapon(id) == CSW_ANACONDA && get_user_anaconda(id))
            set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001);
    }
}

public Anaconda_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 != anaconda_event || !IsInPrimaryAttack)
        return FMRES_IGNORED;

    playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2);

    return FMRES_SUPERCEDE;
}

public Anaconda_PrecacheEvent_Post(type, const name[]) {
    if(equal("events/deagle.sc", name)) {
        anaconda_event = get_orig_retval();
        return FMRES_HANDLED;
    }
    return FMRES_IGNORED;
}

public Anaconda_TakeDamage(victim, inflictor, attacker, Float:damage, damagetype) {
    if(is_user_connected(attacker) && !(damagetype & DMG_HEGRENADE)) {
        new Body, Target, Float:NewDamage;
        if(get_user_weapon(attacker) == CSW_ANACONDA && get_user_anaconda(attacker)) {
            if(is_user_connected(victim)) {
                get_user_aiming(attacker, Target, Body, 999999);
                NewDamage = float(get_damage_body(Body, get_pcvar_float(anacondadamage)));
                SetHamParamFloat(4, NewDamage);
            }
            else {
                SetHamParamFloat(4, get_pcvar_float(anacondadamage));
            }
        }
    }
}

public Anaconda_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_ANACONDA)
        return HAM_IGNORED;
    if(!get_user_anaconda(attacker))
        return HAM_IGNORED;

    static Float:End[3];
    get_tr2(pentru, TR_vecEndPos, End);

    Make_Bullet(attacker, End);

    return HAM_HANDLED;
}

public Anaconda_AddToPlayer(Weapon, id) {
    if(is_valid_ent(Weapon) && is_user_connected(id) && entity_get_int(Weapon, EV_INT_impulse) == ANACONDA_WEAPONKEY) {
        HaveAnaconda[id] = true;
        entity_set_int(Weapon, EV_INT_impulse, 0);
        WeaponList(id, ANACONDA_WEAPONKEY)
    }
}

public Anaconda_Deploy_Post(entity) {
    static Owner;
    Owner = get_pdata_cbase(entity, 41, 4);
    if(get_user_anaconda(Owner)) {
        set_pev(Owner, pev_viewmodel2, AnacondaModel_V);
        set_pev(Owner, pev_weaponmodel2, AnacondaModel_P);
        set_pdata_float(Owner, 83, 1.03, 5);
        set_weapon_anim(Owner, 5);
        static clip;
        clip = cs_get_weapon_ammo(entity);
        if(clip > 0)
            anaconda_reload[Owner] = 0;
    }
}

public Anaconda_PrimaryAttack(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);

    if(get_user_anaconda(id)) {
        IsInPrimaryAttack = true;
        pev(id,pev_punchangle,cl_pushangle[id]);
        anaconda_clip[id] = cs_get_weapon_ammo(Weapon);
    }
}

public Anaconda_PrimaryAttack_Post(Weapon) {
    new id = get_pdata_cbase(Weapon, 41, 4);
    new ActiveItem = get_pdata_cbase(id, 373);
    IsInPrimaryAttack = false;

    if(anaconda_clip[id] > cs_get_weapon_ammo(Weapon) && anaconda_clip[id] > 0 && pev_valid(ActiveItem)) {
        if(is_user_alive(id) && get_user_anaconda(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(anacondarecoil),Push);
            xs_vec_add(Push,cl_pushangle[id],Push);
            set_pev(id,pev_punchangle,Push);

            emit_sound(id, CHAN_WEAPON, Anaconda_Sound[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
            set_weapon_anim(id, random_num(1,2));
            return HAM_SUPERCEDE;
        }
        return HAM_IGNORED;
    }
    return HAM_IGNORED;
}

public Anaconda_Reload(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_anaconda(id))
        return HAM_IGNORED;

    anaconda_clip[id] = -1;

    new Ammo = cs_get_user_bpammo(id, CSW_ANACONDA);
    if(Ammo <= 0)
        return HAM_SUPERCEDE;

    new Clip = get_pdata_int(ent, 51, 4);
    if(Clip >= get_pcvar_num(anacondaclip))
        return HAM_SUPERCEDE;

    anaconda_clip[id] = Clip;
    anaconda_reload[id] = 1;

    return HAM_IGNORED;
}

public Anaconda_Reload_Post(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_anaconda(id))
        return HAM_IGNORED;

    if(anaconda_clip[id] == -1)
        return HAM_IGNORED;

    new Float:reload_time = get_pcvar_float(anacondareloadtime);

    set_pdata_int(ent, 51, anaconda_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, 4);
    return HAM_IGNORED;
}

public Anaconda_PostFrame(ent) {
    if(!pev_valid(ent))
        return HAM_IGNORED;

    new id;
    id = pev(ent, pev_owner);

    if(!is_user_alive(id) || !get_user_anaconda(id))
        return HAM_IGNORED;

    new Float:NextAttack = get_pdata_float(id, 83, 5);
    new Ammo = cs_get_user_bpammo(id, CSW_ANACONDA);

    new Clip = get_pdata_int(ent, 51, 4);
    new InReload = get_pdata_int(ent, 54, 4);

    if(InReload && NextAttack <= 0.0) {
        new Temp = min(get_pcvar_num(anacondaclip) - Clip, Ammo);

        set_pdata_int(ent, 51, Clip + Temp, 4);
        cs_set_user_bpammo(id, CSW_ANACONDA, Ammo - Temp);
        set_pdata_int(ent, 54, 0, 4);

        InReload = 0;
        anaconda_reload[id] = 0;
    }

    return HAM_IGNORED;
}

public Hook_Anaconda(id) {
    engclient_cmd(id, weapon_anaconda);
}

public get_user_anaconda(id) {
    return HaveAnaconda[id];
}

public set_user_anaconda(id, anaconda) {
    if(anaconda) {
        if(!HaveAnaconda[id]) {
            drop_secondary_weapons(id);
            HaveAnaconda[id] = true;
            anaconda_reload[id] = 0;
            WeaponList(id, ANACONDA_WEAPONKEY)
            fm_give_item(id, weapon_anaconda);
            new Clip = fm_get_user_weapon_entity(id, CSW_ANACONDA);
            cs_set_weapon_ammo(Clip, get_pcvar_num(anacondaclip));
        }
    }
    else {
        if(HaveAnaconda[id]) {
            HaveAnaconda[id] = false;
        }
    }
}
#endif

////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Stock's |
//==========================================================================================================
public WeaponList(id, WEAPONKEY) {
    new Message_WeaponList = get_user_msgid("WeaponList")

    switch(WEAPONKEY) {
        #if defined CROSSBOW
        case CROSSBOW_WEAPONKEY: {
            message_begin(MSG_ONE, Message_WeaponList, _, id);
            write_string(HaveCrossBow[id] ? "furien30_crossbow" : "weapon_scout");      // WeaponName
            write_byte(2);              // PrimaryAmmoID
            write_byte(90);             // PrimaryAmmoMaxAmount
            write_byte(-1);             // SecondaryAmmoID
            write_byte(-1);             // SecondaryAmmoMaxAmount
            write_byte(0);              // SlotID (0...N)
            write_byte(9);              // NumberInSlot (1...N)
            write_byte(CSW_CROSSBOW);       // WeaponID
            write_byte(0);              // Flags
            message_end();
        }
        #endif

        #if defined ETHEREAL
        case ETHEREAL_WEAPONKEY: {
            message_begin(MSG_ONE, Message_WeaponList, _, id);
            write_string(HaveEthereal[id] ? "furien30_ethereal" : "weapon_galil");      // WeaponName
            write_byte(4);              // PrimaryAmmoID
            write_byte(90);             // PrimaryAmmoMaxAmount
            write_byte(-1);             // SecondaryAmmoID
            write_byte(-1);             // SecondaryAmmoMaxAmount
            write_byte(0);              // SlotID (0...N)
            write_byte(17);             // NumberInSlot (1...N)
            write_byte(CSW_ETHEREAL);       // WeaponID
            write_byte(0);              // Flags
            message_end();
        }
        #endif

        #if defined DUALMP7A1
        case DUALMP7A1_WEAPONKEY: {
            message_begin(MSG_ONE, Message_WeaponList, _, id);
            write_string(HaveDualMP7A1[id] ? "furien30_dualmp7a1" : "weapon_mp5navy");      // WeaponName
            write_byte(10);             // PrimaryAmmoID
            write_byte(120);            // PrimaryAmmoMaxAmount
            write_byte(-1);             // SecondaryAmmoID
            write_byte(-1);             // SecondaryAmmoMaxAmount
            write_byte(0);              // SlotID (0...N)
            write_byte(7);              // NumberInSlot (1...N)
            write_byte(CSW_DUALMP7A1);      // WeaponID
            write_byte(0);              // Flags
            message_end();
        }
        #endif

        #if defined K1ASES
        case K1ASES_WEAPONKEY: {
            message_begin(MSG_ONE, Message_WeaponList, _, id);
            write_string(HaveK1ases[id] ? "furien30_k1ases" : "weapon_mp5navy");        // WeaponName
            write_byte(10);             // PrimaryAmmoID
            write_byte(120);            // PrimaryAmmoMaxAmount
            write_byte(-1);             // SecondaryAmmoID
            write_byte(-1);             // SecondaryAmmoMaxAmount
            write_byte(0);              // SlotID (0...N)
            write_byte(7);              // NumberInSlot (1...N)
            write_byte(CSW_K1ASES);         // WeaponID
            write_byte(0);              // Flags
            message_end();
        }
        #endif

        #if defined F2000
        case F2000_WEAPONKEY: {
            message_begin(MSG_ONE, Message_WeaponList, _, id);
            write_string(HaveF2000[id] ? "furien30_f2000" : "weapon_aug");      // WeaponName
            write_byte(4);              // PrimaryAmmoID
            write_byte(90);             // PrimaryAmmoMaxAmount
            write_byte(-1);             // SecondaryAmmoID
            write_byte(-1);             // SecondaryAmmoMaxAmount
            write_byte(0);              // SlotID (0...N)
            write_byte(14);             // NumberInSlot (1...N)
            write_byte(CSW_F2000);          // WeaponID
            write_byte(0);              // Flags
            message_end();
        }
        #endif

        #if defined HK416
        case HK416_WEAPONKEY: {
            message_begin(MSG_ONE, Message_WeaponList, _, id);
            write_string(HaveHK416[id] ? "furien30_hk416" : "weapon_m4a1");     // WeaponName
            write_byte(4);              // PrimaryAmmoID
            write_byte(90);             // PrimaryAmmoMaxAmount
            write_byte(-1);             // SecondaryAmmoID
            write_byte(-1);             // SecondaryAmmoMaxAmount
            write_byte(0);              // SlotID (0...N)
            write_byte(6);              // NumberInSlot (1...N)
            write_byte(CSW_HK416);          // WeaponID
            write_byte(0);              // Flags
            message_end();
        }
        #endif

        #if defined OICW
        case OICW_WEAPONKEY: {
            message_begin(MSG_ONE, Message_WeaponList, _, id);
            write_string(HaveOICW[id] ? "furien30_oicw" : "weapon_galil");      // WeaponName
            write_byte(4);              // PrimaryAmmoID
            write_byte(90);             // PrimaryAmmoMaxAmount
            write_byte(-1);             // SecondaryAmmoID
            write_byte(-1);             // SecondaryAmmoMaxAmount
            write_byte(0);              // SlotID (0...N)
            write_byte(17);             // NumberInSlot (1...N)
            write_byte(CSW_OICW);           // WeaponID
            write_byte(0);              // Flags
            message_end();
        }
        #endif

        #if defined AK47KNIFE
        case AK47KNIFE_WEAPONKEY: {
            message_begin(MSG_ONE, Message_WeaponList, _, id);
            write_string(HaveAK47Knife[id] ? "furien30_ak47knife" : "weapon_ak47");     // WeaponName
            write_byte(2);              // PrimaryAmmoID
            write_byte(90);             // PrimaryAmmoMaxAmount
            write_byte(-1);             // SecondaryAmmoID
            write_byte(-1);             // SecondaryAmmoMaxAmount
            write_byte(0);              // SlotID (0...N)
            write_byte(1);              // NumberInSlot (1...N)
            write_byte(CSW_AK47KNIFE);      // WeaponID
            write_byte(0);              // Flags
            message_end();
        }
        #endif

        #if defined TAR21
        case TAR21_WEAPONKEY: {
            message_begin(MSG_ONE, Message_WeaponList, _, id);
            write_string(HaveTar21[id] ? "furien30_tar21" : "furien30_sg552");      // WeaponName
            write_byte(4);              // PrimaryAmmoID
            write_byte(90);             // PrimaryAmmoMaxAmount
            write_byte(-1);             // SecondaryAmmoID
            write_byte(-1);             // SecondaryAmmoMaxAmount
            write_byte(0);              // SlotID (0...N)
            write_byte(10);             // NumberInSlot (1...N)
            write_byte(CSW_TAR21);          // WeaponID
            write_byte(0);              // Flags
            message_end();
        }
        #endif

        #if defined AT4
        case AT4_WEAPONKEY: {
            message_begin(MSG_ONE, Message_WeaponList, _, id);
            write_string(HaveAT4[id] ? "furien30_at4" : "weapon_m249");         // WeaponName
            write_byte(3);              // PrimaryAmmoID
            write_byte(200);            // PrimaryAmmoMaxAmount
            write_byte(-1);             // SecondaryAmmoID
            write_byte(-1);             // SecondaryAmmoMaxAmount
            write_byte(0);              // SlotID (0...N)
            write_byte(4);              // NumberInSlot (1...N)
            write_byte(CSW_AT4);            // WeaponID
            write_byte(0);              // Flags
            message_end();
        }
        #endif

        #if defined SALAMANDER
        case SALAMANDER_WEAPONKEY: {
            message_begin(MSG_ONE, Message_WeaponList, _, id);
            write_string(HaveSalamander[id] ? "furien30_salamander" : "weapon_m249");       // WeaponName
            write_byte(3);              // PrimaryAmmoID
            write_byte(200);            // PrimaryAmmoMaxAmount
            write_byte(-1);             // SecondaryAmmoID
            write_byte(-1);             // SecondaryAmmoMaxAmount
            write_byte(0);              // SlotID (0...N)
            write_byte(4);              // NumberInSlot (1...N)
            write_byte(CSW_SALAMANDER);     // WeaponID
            write_byte(0);              // Flags
            message_end();
        }
        #endif

        #if defined M134
        case M134_WEAPONKEY: {
            message_begin(MSG_ONE, Message_WeaponList, _, id);
            write_string(HaveM134[id] ? "furien30_m134" : "weapon_m249");       // WeaponName
            write_byte(3);              // PrimaryAmmoID
            write_byte(200);            // PrimaryAmmoMaxAmount
            write_byte(-1);             // SecondaryAmmoID
            write_byte(-1);             // SecondaryAmmoMaxAmount
            write_byte(0);              // SlotID (0...N)
            write_byte(4);              // NumberInSlot (1...N)
            write_byte(CSW_M134);           // WeaponID
            write_byte(0);              // Flags
            message_end();
        }
        #endif

        #if defined THOMPSON
        case THOMPSON_WEAPONKEY: {
            message_begin(MSG_ONE, Message_WeaponList, _, id);
            write_string(HaveThompson[id] ? "furien30_thompson" : "weapon_p90");        // WeaponName
            write_byte(7);              // PrimaryAmmoID
            write_byte(100);            // PrimaryAmmoMaxAmount
            write_byte(-1);             // SecondaryAmmoID
            write_byte(-1);             // SecondaryAmmoMaxAmount
            write_byte(0);              // SlotID (0...N)
            write_byte(8);              // NumberInSlot (1...N)
            write_byte(CSW_THOMPSON);       // WeaponID
            write_byte(0);              // Flags
            message_end();
        }
        #endif

        #if defined QUADBARREL
        case QUADBARREL_WEAPONKEY: {
            message_begin(MSG_ONE, Message_WeaponList, _, id);
            write_string(HaveQuadBarrel[id] ? "furien30_quadbarrel" : "weapon_m3");     // WeaponName
            write_byte(5);              // PrimaryAmmoID
            write_byte(32);             // PrimaryAmmoMaxAmount
            write_byte(-1);             // SecondaryAmmoID
            write_byte(-1);             // SecondaryAmmoMaxAmount
            write_byte(0);              // SlotID (0...N)
            write_byte(5);              // NumberInSlot (1...N)
            write_byte(CSW_QUADBARREL);     // WeaponID
            write_byte(0);              // Flags
            message_end();
        }
        #endif

        #if defined DUALBARREL
        case DUALBARREL_WEAPONKEY: {
            message_begin(MSG_ONE, Message_WeaponList, _, id);
            write_string(HaveDualBarrel[id] ? "furien30_dualbarrel" : "weapon_m3");     // WeaponName
            write_byte(5);              // PrimaryAmmoID
            write_byte(32);             // PrimaryAmmoMaxAmount
            write_byte(-1);             // SecondaryAmmoID
            write_byte(-1);             // SecondaryAmmoMaxAmount
            write_byte(0);              // SlotID (0...N)
            write_byte(5);              // NumberInSlot (1...N)
            write_byte(CSW_DUALBARREL);     // WeaponID
            write_byte(0);              // Flags
            message_end();
        }
        #endif

        #if defined M1887
        case M1887_WEAPONKEY: {
            message_begin(MSG_ONE, Message_WeaponList, _, id);
            write_string(HaveM1887[id] ? "furien30_m1887" : "weapon_xm1014");       // WeaponName
            write_byte(5);              // PrimaryAmmoID
            write_byte(32);             // PrimaryAmmoMaxAmount
            write_byte(-1);             // SecondaryAmmoID
            write_byte(-1);             // SecondaryAmmoMaxAmount
            write_byte(0);              // SlotID (0...N)
            write_byte(12);             // NumberInSlot (1...N)
            write_byte(CSW_M1887);          // WeaponID
            write_byte(0);              // Flags
            message_end();
        }
        #endif

        #if defined L85
        case L85_WEAPONKEY: {
            message_begin(MSG_ONE, Message_WeaponList, _, id);
            write_string(HaveL85[id] ? "furien30_l85" : "weapon_famas");        // WeaponName
            write_byte(4);              // PrimaryAmmoID
            write_byte(90);             // PrimaryAmmoMaxAmount
            write_byte(-1);             // SecondaryAmmoID
            write_byte(-1);             // SecondaryAmmoMaxAmount
            write_byte(0);              // SlotID (0...N)
            write_byte(18);             // NumberInSlot (1...N)
            write_byte(CSW_L85);            // WeaponID
            write_byte(0);              // Flags
            message_end();
        }
        #endif

        #if defined SKULL5
        case SKULL5_WEAPONKEY: {
            message_begin(MSG_ONE, Message_WeaponList, _, id);
            write_string(HaveSkull5[id] ? "furien30_skull5" : "weapon_sg550");  // WeaponName
            write_byte(4);              // PrimaryAmmoID
            write_byte(90);             // PrimaryAmmoMaxAmount
            write_byte(-1);             // SecondaryAmmoID
            write_byte(-1);             // SecondaryAmmoMaxAmount
            write_byte(0);              // SlotID (0...N)
            write_byte(10);             // NumberInSlot (1...N)
            write_byte(CSW_SKULL5);         // WeaponID
            write_byte(0);              // Flags
            message_end();
        }
        #endif

        #if defined SL8
        case SL8_WEAPONKEY: {
            message_begin(MSG_ONE, Message_WeaponList, _, id);
            write_string(HaveSL8[id] ? "furien30_sl8" : "weapon_g3sg1");        // WeaponName
            write_byte(2);              // PrimaryAmmoID
            write_byte(90);             // PrimaryAmmoMaxAmount
            write_byte(-1);             // SecondaryAmmoID
            write_byte(-1);             // SecondaryAmmoMaxAmount
            write_byte(0);              // SlotID (0...N)
            write_byte(3);              // NumberInSlot (1...N)
            write_byte(CSW_SL8);            // WeaponID
            write_byte(0);              // Flags
            message_end();
        }
        #endif

        #if defined AW50
        case AW50_WEAPONKEY: {
            message_begin(MSG_ONE, Message_WeaponList, _, id);
            write_string(HaveAW50[id] ? "furien30_aw50" : "weapon_awp");        // WeaponName
            write_byte(1);              // PrimaryAmmoID
            write_byte(30);             // PrimaryAmmoMaxAmount
            write_byte(-1);             // SecondaryAmmoID
            write_byte(-1);             // SecondaryAmmoMaxAmount
            write_byte(0);              // SlotID (0...N)
            write_byte(2);              // NumberInSlot (1...N)
            write_byte(CSW_AW50);           // WeaponID
            write_byte(0);              // Flags
            message_end();
        }
        #endif

        #if defined M79
        case M79_WEAPONKEY: {
            message_begin(MSG_ONE, Message_WeaponList, _, id);
            write_string(HaveM79[id] ? "furien30_m79" : "weapon_deagle");       // WeaponName
            write_byte(8);              // PrimaryAmmoID
            write_byte(35);             // PrimaryAmmoMaxAmount
            write_byte(-1);             // SecondaryAmmoID
            write_byte(-1);             // SecondaryAmmoMaxAmount
            write_byte(1);              // SlotID (0...N)
            write_byte(1);              // NumberInSlot (1...N)
            write_byte(CSW_M79);            // WeaponID
            write_byte(0);              // Flags
            message_end();
        }
        #endif

        #if defined SKULL1
        case SKULL1_WEAPONKEY: {
            message_begin(MSG_ONE, Message_WeaponList, _, id);
            write_string(HaveSkull1[id] ? "furien30_skull1" : "weapon_deagle");     // WeaponName
            write_byte(8);              // PrimaryAmmoID
            write_byte(35);             // PrimaryAmmoMaxAmount
            write_byte(-1);             // SecondaryAmmoID
            write_byte(-1);             // SecondaryAmmoMaxAmount
            write_byte(1);              // SlotID (0...N)
            write_byte(1);              // NumberInSlot (1...N)
            write_byte(CSW_SKULL1);         // WeaponID
            write_byte(0);              // Flags
            message_end();
        }
        #endif

        #if defined ANACONDA
        case ANACONDA_WEAPONKEY: {
            message_begin(MSG_ONE, Message_WeaponList, _, id);
            write_string(HaveAnaconda[id] ? "furien30_anaconda" : "weapon_deagle");     // WeaponName
            write_byte(8);              // PrimaryAmmoID
            write_byte(35);             // PrimaryAmmoMaxAmount
            write_byte(-1);             // SecondaryAmmoID
            write_byte(-1);             // SecondaryAmmoMaxAmount
            write_byte(1);              // SlotID (0...N)
            write_byte(1);              // NumberInSlot (1...N)
            write_byte(CSW_ANACONDA);       // WeaponID
            write_byte(0);              // Flags
            message_end();
        }
        #endif

        #if defined DUALDEAGLE
        case DUALDEAGLE_WEAPONKEY: {
            message_begin(MSG_ONE, Message_WeaponList, _, id);
            write_string(HaveDualDeagle[id] ? "furien30_dualdeagle" : "weapon_elite");      // WeaponName
            write_byte(10);             // PrimaryAmmoID
            write_byte(120);            // PrimaryAmmoMaxAmount
            write_byte(-1);             // SecondaryAmmoID
            write_byte(-1);             // SecondaryAmmoMaxAmount
            write_byte(1);              // SlotID (0...N)
            write_byte(5);              // NumberInSlot (1...N)
            write_byte(CSW_DUALDEAGLE);     // WeaponID
            write_byte(0);              // Flags
            message_end();
        }
        #endif

        #if defined INFINITY
        case INFINITY_WEAPONKEY: {
            message_begin(MSG_ONE, Message_WeaponList, _, id);
            write_string(HaveInfinity[id] ? "furien30_infinity" : "weapon_elite");      // WeaponName
            write_byte(10);             // PrimaryAmmoID
            write_byte(120);            // PrimaryAmmoMaxAmount
            write_byte(-1);             // SecondaryAmmoID
            write_byte(-1);             // SecondaryAmmoMaxAmount
            write_byte(1);              // SlotID (0...N)
            write_byte(5);              // NumberInSlot (1...N)
            write_byte(CSW_INFINITY);       // WeaponID
            write_byte(0);              // Flags
            message_end();
        }
        #endif
    }
}

stock death_message(Killer, Victim, const Weapon[]) {
    set_msg_block(get_user_msgid("DeathMsg"), BLOCK_SET);
    ExecuteHamB(Ham_Killed, Victim, Killer, 2);
    set_msg_block(get_user_msgid("DeathMsg"), BLOCK_NOT);

    make_deathmsg(Killer, Victim, 0, Weapon);
    cs_set_user_money(Killer, cs_get_user_money(Killer) + 300);

    message_begin(MSG_BROADCAST, get_user_msgid("ScoreInfo"));
    write_byte(Killer); // id
    write_short(pev(Killer, pev_frags)); // frags
    write_short(cs_get_user_deaths(Killer)); // deaths
    write_short(0); // class?
    write_short(get_user_team(Killer)); // team
    message_end();

    message_begin(MSG_BROADCAST, get_user_msgid("ScoreInfo"));
    write_byte(Victim); // id
    write_short(pev(Victim, pev_frags)); // frags
    write_short(cs_get_user_deaths(Victim)); // deaths
    write_short(0); // class?
    write_short(get_user_team(Victim)); // team
    message_end();
}

public make_knockback(Victim, Float:origin[3], Float:maxspeed) {
    new Float:fVelocity[3];
    kickback(Victim, origin, maxspeed, fVelocity);
    entity_set_vector(Victim, EV_VEC_velocity, fVelocity);

    return(1);
}

stock kickback(ent, Float:fOrigin[3], Float:fSpeed, Float:fVelocity[3]) {
    new Float:fEntOrigin[3];
    entity_get_vector(ent, EV_VEC_origin, fEntOrigin);

    new Float:fDistance[3];
    fDistance[0] = fEntOrigin[0] - fOrigin[0];
    fDistance[1] = fEntOrigin[1] - fOrigin[1];
    fDistance[2] = fEntOrigin[2] - fOrigin[2];
    new Float:fTime = (vector_distance(fEntOrigin,fOrigin) / fSpeed);
    fVelocity[0] = fDistance[0] / fTime;
    fVelocity[1] = fDistance[1] / fTime;
    fVelocity[2] = fDistance[2] / fTime;

    return(fVelocity[0] && fVelocity[1] && fVelocity[2]);
}

stock Make_Bullet(id, Float:Origin[3]) {
    // Find target
    new target, body;
    get_user_aiming(id, target, body, 999999);

    if(target > 0 && target <= get_maxplayers()) {
        new Float:fStart[3], Float:fEnd[3], Float:fRes[3], Float:fVel[3];
        pev(id, pev_origin, fStart);

        velocity_by_aim(id, 64, fVel);

        fStart[0] = Origin[0];
        fStart[1] = Origin[1];
        fStart[2] = Origin[2];
        fEnd[0] = fStart[0]+fVel[0];
        fEnd[1] = fStart[1]+fVel[1];
        fEnd[2] = fStart[2]+fVel[2];

        new res;
        engfunc(EngFunc_TraceLine, fStart, fEnd, 0, target, res);
        get_tr2(res, TR_vecEndPos, fRes);

        message_begin(MSG_BROADCAST, SVC_TEMPENTITY) ;
        write_byte(TE_BLOODSPRITE);
        write_coord(floatround(fStart[0]));
        write_coord(floatround(fStart[1]));
        write_coord(floatround(fStart[2]));
        write_short(BloodSpray);
        write_short(BloodDrop);
        write_byte(70);
        write_byte(random_num(1,2));
        message_end();


    }
    else {
        new decal = 41;

        if(target) {
            message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
            write_byte(TE_DECAL);
            write_coord(floatround(Origin[0]));
            write_coord(floatround(Origin[1]));
            write_coord(floatround(Origin[2]));
            write_byte(decal);
            write_short(target);
            message_end();
        }
        else {
            message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
            write_byte(TE_WORLDDECAL);
            write_coord(floatround(Origin[0]));
            write_coord(floatround(Origin[1]));
            write_coord(floatround(Origin[2]));
            write_byte(decal);
            message_end();
        }

        message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
        write_byte(TE_GUNSHOTDECAL);
        write_coord(floatround(Origin[0]));
        write_coord(floatround(Origin[1]));
        write_coord(floatround(Origin[2]));
        write_short(id);
        write_byte(decal);
        message_end();
    }
}

stock set_weapon_anim(id, anim) {
    set_pev(id, pev_weaponanim, anim);
    if(is_user_connected(id)) {
        message_begin(MSG_ONE, SVC_WEAPONANIM, _, id);
        write_byte(anim);
        write_byte(pev(id, pev_body));
        message_end();
    }
}

stock get_damage_body(body, Float:damage) {
    switch(body) {
        case HIT_HEAD:
            damage *= 1.3;
        case HIT_STOMACH:
            damage *= 1.0;
        case HIT_CHEST:
            damage *= 1.1;
        case HIT_LEFTARM:
            damage *= 0.7;
        case HIT_RIGHTARM:
            damage *= 0.7;
        case HIT_LEFTLEG:
            damage *= 0.75;
        case HIT_RIGHTLEG:
            damage *= 0.75;
        default:
            damage *= 1.0;
    }

    return floatround(damage);
}

stock drop_primary_weapons(Player) {
    static weapons[32], num, i, weaponid;
    num = 0;
    get_user_weapons(Player, weapons, num);

    for(i = 0; i < num; i++) {
        weaponid = weapons [i];

        if(((1<<weaponid) & PRIMARY_WEAPONS_BITSUM)) {
            static wname[32];
            get_weaponname(weaponid, wname, charsmax(wname));

            engclient_cmd(Player, "drop", wname);
        }
    }
}

stock drop_secondary_weapons(Player) {
    // Get user weapons
    static weapons [32], num, i, weaponid;
    num = 0; // reset passed weapons count(bugfix)
    get_user_weapons(Player, weapons, num);

    // Loop through them and drop primaries
    for(i = 0; i < num; i++) {
        // Prevent re-indexing the array
        weaponid = weapons [i];

        // We definetely are holding primary gun
        if(((1<<weaponid) & SECONDARY_WEAPONS_BITSUM)) {
            // Get weapon entity
            static wname[32];
            get_weaponname(weaponid, wname, charsmax(wname));

            // Player drops the weapon and looses his bpammo
            engclient_cmd(Player, "drop", wname);
        }
    }
}

stock fm_get_user_bpammo(index, weapon) {
    static offset
    switch(weapon) {
        case CSW_AWP: offset = 377
            case CSW_SCOUT, CSW_AK47, CSW_G3SG1: offset = 378
            case CSW_M249: offset = 379
            case CSW_FAMAS, CSW_M4A1, CSW_AUG,
            CSW_SG550, CSW_GALI, CSW_SG552: offset = 380
        case CSW_M3, CSW_XM1014: offset = 381
            case CSW_USP, CSW_UMP45, CSW_MAC10: offset = 382
            case CSW_FIVESEVEN, CSW_P90: offset = 383
            case CSW_DEAGLE: offset = 384
            case CSW_P228: offset = 385
            case CSW_GLOCK18, CSW_TMP, CSW_ELITE,
            CSW_MP5NAVY: offset = 386
        default: offset = 0
    }
    return offset ? get_pdata_int(index, offset) : 0
}

stock fm_set_user_bpammo(index, weapon, amount) {
    static offset
    switch(weapon) {
        case CSW_AWP: offset = 377
            case CSW_SCOUT, CSW_AK47, CSW_G3SG1: offset = 378
            case CSW_M249: offset = 379
            case CSW_FAMAS, CSW_M4A1, CSW_AUG,
            CSW_SG550, CSW_GALI, CSW_SG552: offset = 380
        case CSW_M3, CSW_XM1014: offset = 381
            case CSW_USP, CSW_UMP45, CSW_MAC10: offset = 382
            case CSW_FIVESEVEN, CSW_P90: offset = 383
            case CSW_DEAGLE: offset = 384
            case CSW_P228: offset = 385
            case CSW_GLOCK18, CSW_TMP, CSW_ELITE,
            CSW_MP5NAVY: offset = 386
        default: offset = 0
    }

    if(offset)
        set_pdata_int(index, offset, amount)

    return 1
}

#define clamp_byte(%1)       ( clamp( %1, 0, 255 ) )
#define pack_color(%1,%2,%3) ( %3 + ( %2 << 8 ) + ( %1 << 16 ) )

stock HudMessage(const id, const message[], red = 0, green = 160, blue = 0, Float:x = -1.0, Float:y = 0.65, effects = 2, Float:fxtime = 0.01, Float:holdtime = 3.0, Float:fadeintime = 0.01, Float:fadeouttime = 0.01) {
    new count = 1, players[32];

    if(id) players[0] = id;
    else get_players(players, count, "ch"); {
        for(new i = 0; i < count; i++) {
            if(is_user_connected(players[i])) {
                new color = pack_color(clamp_byte(red), clamp_byte(green), clamp_byte(blue))

                message_begin(MSG_ONE_UNRELIABLE, SVC_DIRECTOR, _, players[i]);
                write_byte(strlen(message) + 31);
                write_byte(DRC_CMD_MESSAGE);
                write_byte(effects);
                write_long(color);
                write_long(_:x);
                write_long(_:y);
                write_long(_:fadeintime);
                write_long(_:fadeouttime);
                write_long(_:holdtime);
                write_long(_:fxtime);
                write_string(message);
                message_end();
            }
        }
    }
}

stock ColorChat(const id, const input[], any:...) {
    new count = 1, players[32];
    static msg[191];
    vformat(msg, 190, input, 3);

    replace_all(msg, 190, "!g", "^4");
    replace_all(msg, 190, "!y", "^1");
    replace_all(msg, 190, "!t", "^3");

    if(id) players[0] = id;
    else get_players(players, count, "ch"); {
        for(new i = 0; i < count; i++) {
            if(is_user_connected(players[i])) {
                message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i]);
                write_byte(players[i]);
                write_string(msg);
                message_end();
            }
        }
    }
}

/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1033\\ f0\\ fs16 \n\\ par }
*/



Este un plugin cu meniu de arme la ct pentru furien , si vad ca si playerii pot deschide meniul de vip si pot lua arme
Post Reply

Return to “Scripting”

  • Information
  • Who is online

    Users browsing this forum: No registered users and 6 guests