1 //Camping rifle Primary mode: manually operated bolt*, Secondary: full automatic** --MikeeUSA--
2 //* Manually operating the bolt means that all the power of the gas is used to propell the bullet. In this mode the bolt is prevented from moving backwards in response to the firing of the bullet.
3 //** In fully automatic mode some of the gas is used to extract and reload the next cartrige, thus there is less power and range.
5 .float campingrifle_bulletcounter;
7 void W_Campingrifle_Reload()
9 if (self.campingrifle_bulletcounter <= 0)
12 sound (self, CHAN_WEAPON2, "weapons/campingrifle_reload.wav", VOL_BASE, ATTN_NORM);
13 ATTACK_FINISHED(self) = time + cvar("g_balance_campingrifle_reloadtime");
14 self.campingrifle_bulletcounter = 0;
17 void W_Campingrifle_CheckReload()
19 if (self.campingrifle_bulletcounter >= cvar("g_balance_campingrifle_magazinecapacity"))
20 W_Campingrifle_Reload();
23 void W_CampingRifle_FireBullet(float pSpread, float pDamage, float pHeadshotAddedDamage, float pForce, float pSpeed, float pLifetime, float pAmmo, float deathtype, float pBulletConstant)
25 if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
26 self.ammo_nails -= pAmmo;
28 W_SetupShot (self, '25 8 -8', FALSE, 2, "weapons/campingrifle_fire.wav");
29 pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 2000, 1);
31 fireBallisticBullet(w_shotorg, v_forward /* no TrueAim, so shooting through solid is easier */, pSpread, pSpeed, pLifetime, pDamage, pHeadshotAddedDamage / pDamage, pForce, deathtype, EF_RED, 1, pBulletConstant);
33 if (cvar("g_casings") >= 2)
34 SpawnCasing (w_shotorg + v_forward * 10, ((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3);
36 self.campingrifle_bulletcounter = self.campingrifle_bulletcounter + 1;
37 W_Campingrifle_CheckReload();
40 void W_Campingrifle_Attack()
42 W_CampingRifle_FireBullet(cvar("g_balance_campingrifle_primary_spread"), cvar("g_balance_campingrifle_primary_damage"), cvar("g_balance_campingrifle_primary_headshotaddeddamage"), cvar("g_balance_campingrifle_primary_force"), cvar("g_balance_campingrifle_primary_speed"), cvar("g_balance_campingrifle_primary_lifetime"), cvar("g_balance_campingrifle_primary_ammo"), WEP_CAMPINGRIFLE, cvar("g_balance_campingrifle_primary_bulletconstant"));
45 void W_Campingrifle_Attack2()
47 W_CampingRifle_FireBullet(cvar("g_balance_campingrifle_secondary_spread"), cvar("g_balance_campingrifle_secondary_damage"), cvar("g_balance_campingrifle_secondary_headshotaddeddamage"), cvar("g_balance_campingrifle_secondary_force"), cvar("g_balance_campingrifle_secondary_speed"), cvar("g_balance_campingrifle_secondary_lifetime"), cvar("g_balance_campingrifle_secondary_ammo"), WEP_CAMPINGRIFLE | HITTYPE_SECONDARY, cvar("g_balance_campingrifle_secondary_bulletconstant"));
50 void spawnfunc_weapon_campingrifle (void)
52 weapon_defaultspawnfunc(WEP_CAMPINGRIFLE);
55 .float bot_secondary_campingriflemooth;
56 float w_campingrifle(float req)
60 self.BUTTON_ATCK=FALSE;
61 self.BUTTON_ATCK2=FALSE;
62 if(vlen(self.origin-self.enemy.origin) > 1000)
63 self.bot_secondary_campingriflemooth = 0;
64 if(self.bot_secondary_campingriflemooth == 0)
66 if(bot_aim(cvar("g_balance_campingrifle_primary_speed"), 0, cvar("g_balance_campingrifle_primary_lifetime"), TRUE))
68 self.BUTTON_ATCK = TRUE;
69 if(random() < 0.01) self.bot_secondary_campingriflemooth = 1;
74 if(bot_aim(cvar("g_balance_campingrifle_secondary_speed"), 0, cvar("g_balance_campingrifle_secondary_lifetime"), TRUE))
76 self.BUTTON_ATCK2 = TRUE;
77 if(random() < 0.03) self.bot_secondary_campingriflemooth = 0;
81 else if (req == WR_THINK)
84 if (weapon_prepareattack(0, cvar("g_balance_campingrifle_primary_refire")))
86 W_Campingrifle_Attack();
87 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_campingrifle_primary_animtime"), w_ready);
89 if (self.BUTTON_ATCK2)
90 if (weapon_prepareattack(1, cvar("g_balance_campingrifle_secondary_refire")))
92 W_Campingrifle_Attack2();
93 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_campingrifle_secondary_animtime"), w_ready);
96 else if (req == WR_PRECACHE)
98 precache_model ("models/tracer.mdl");
99 precache_model ("models/weapons/g_campingrifle.md3");
100 precache_model ("models/weapons/v_campingrifle.md3");
101 precache_model ("models/weapons/w_campingrifle.zym");
102 precache_sound ("weapons/campingrifle_reload.wav");
103 precache_sound ("weapons/ric1.wav");
104 precache_sound ("weapons/ric2.wav");
105 precache_sound ("weapons/ric3.wav");
106 precache_sound ("weapons/campingrifle_fire.wav");
107 if (cvar("g_casings") >= 2)
109 precache_sound ("weapons/brass1.wav");
110 precache_sound ("weapons/brass2.wav");
111 precache_sound ("weapons/brass3.wav");
112 precache_model ("models/casing_bronze.mdl");
115 else if (req == WR_SETUP)
117 weapon_setup(WEP_CAMPINGRIFLE);
118 W_Campingrifle_Reload();
120 else if (req == WR_CHECKAMMO1)
121 return self.ammo_nails >= cvar("g_balance_campingrifle_primary_ammo");
122 else if (req == WR_CHECKAMMO2)
123 return self.ammo_nails >= cvar("g_balance_campingrifle_secondary_ammo");
124 else if (req == WR_SUICIDEMESSAGE)
126 if(w_deathtype & HITTYPE_SECONDARY)
127 w_deathtypestring = "shot himself automatically";
129 w_deathtypestring = "sniped himself somehow";
131 else if (req == WR_KILLMESSAGE)
133 if(w_deathtype & HITTYPE_SECONDARY)
135 if(w_deathtype & HITTYPE_BOUNCE)
136 w_deathtypestring = "failed to hide from #'s bullet hail";
138 w_deathtypestring = "died in #'s bullet hail";
142 if(w_deathtype & HITTYPE_BOUNCE)
144 // TODO special headshot message here too?
145 w_deathtypestring = "failed to hide from #'s rifle";
149 if(w_deathtype & HITTYPE_HEADSHOT)
150 w_deathtypestring = "got hit in the head by #";
152 w_deathtypestring = "was sniped by #";