1 //Camping rifle Primary mode: manually operated bolt*, Secondary: full automatic**
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 void W_Campingrifle_ReloadedAndReady()
8 self.campingrifle_bulletcounter = cvar("g_balance_campingrifle_magazinecapacity");
9 t = ATTACK_FINISHED(self) - cvar("g_balance_campingrifle_reloadtime") - 1;
10 ATTACK_FINISHED(self) = t;
14 void W_Campingrifle_Reload()
18 if (self.campingrifle_bulletcounter >= cvar("g_balance_campingrifle_magazinecapacity"))
21 if (self.weaponentity)
23 if (self.weaponentity.wframe == WFRAME_RELOAD)
26 // allow to switch away while reloading, but this will cause a new reload!
27 self.weaponentity.state = WS_READY;
30 sound (self, CHAN_WEAPON2, "weapons/campingrifle_reload.wav", VOL_BASE, ATTN_NORM);
32 t = max(time, ATTACK_FINISHED(self)) + cvar("g_balance_campingrifle_reloadtime") + 1;
33 ATTACK_FINISHED(self) = t;
35 weapon_thinkf(WFRAME_RELOAD, cvar("g_balance_campingrifle_reloadtime"), W_Campingrifle_ReloadedAndReady);
37 self.campingrifle_bulletcounter = -1;
40 void W_Campingrifle_CheckReloadAndReady()
43 if (self.campingrifle_bulletcounter <= 0)
44 W_Campingrifle_Reload();
49 void W_CampingRifle_FireBullet(float pSpread, float pDamage, float pHeadshotAddedDamage, float pForce, float pSpeed, float pLifetime, float pAmmo, float deathtype, float pBulletConstant)
51 if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
52 self.ammo_nails -= pAmmo;
54 if(deathtype & HITTYPE_SECONDARY)
55 W_SetupShot (self, cvar("g_antilag_bullets") && pSpeed >= cvar("g_antilag_bullets"), 2, "weapons/campingrifle_fire2.wav", cvar("g_balance_campingrifle_secondary_damage"));
57 W_SetupShot (self, cvar("g_antilag_bullets") && pSpeed >= cvar("g_antilag_bullets"), 2, "weapons/campingrifle_fire.wav", cvar("g_balance_campingrifle_primary_damage"));
59 pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 2000, 1);
61 if(self.BUTTON_ZOOM) // if zoomed, shoot from the eye
63 w_shotdir = v_forward;
64 w_shotorg = self.origin + self.view_ofs + ((w_shotorg - self.origin - self.view_ofs) * v_forward) * v_forward;
67 fireBallisticBullet(w_shotorg, w_shotdir, pSpread, pSpeed, pLifetime, pDamage, pHeadshotAddedDamage / pDamage, pForce, deathtype, EF_RED, 1, pBulletConstant);
69 if (cvar("g_casings") >= 2)
70 SpawnCasing (((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3, self);
72 self.campingrifle_bulletcounter = self.campingrifle_bulletcounter - 1;
75 void W_Campingrifle_Attack()
77 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"));
80 void W_Campingrifle_Attack2()
82 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"));
85 void spawnfunc_weapon_campingrifle (void)
87 weapon_defaultspawnfunc(WEP_CAMPINGRIFLE);
90 .float bot_secondary_campingriflemooth;
91 float w_campingrifle(float req)
95 self.BUTTON_ATCK=FALSE;
96 self.BUTTON_ATCK2=FALSE;
97 if(vlen(self.origin-self.enemy.origin) > 1000)
98 self.bot_secondary_campingriflemooth = 0;
99 if(self.bot_secondary_campingriflemooth == 0)
101 if(bot_aim(cvar("g_balance_campingrifle_primary_speed"), 0, cvar("g_balance_campingrifle_primary_lifetime"), TRUE))
103 self.BUTTON_ATCK = TRUE;
104 if(random() < 0.01) self.bot_secondary_campingriflemooth = 1;
109 if(bot_aim(cvar("g_balance_campingrifle_secondary_speed"), 0, cvar("g_balance_campingrifle_secondary_lifetime"), TRUE))
111 self.BUTTON_ATCK2 = TRUE;
112 if(random() < 0.03) self.bot_secondary_campingriflemooth = 0;
116 else if (req == WR_THINK)
118 if(self.campingrifle_bulletcounter < 0) // forced reload (e.g. because interrupted)
120 if(self.switchweapon == self.weapon)
121 if(self.weaponentity.state == WS_READY)
122 W_Campingrifle_Reload();
126 if (self.BUTTON_ATCK)
127 if (weapon_prepareattack(0, cvar("g_balance_campingrifle_primary_refire")))
129 W_Campingrifle_Attack();
130 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_campingrifle_primary_animtime"), W_Campingrifle_CheckReloadAndReady);
132 if (self.BUTTON_ATCK2)
133 if (weapon_prepareattack(1, cvar("g_balance_campingrifle_secondary_refire")))
135 W_Campingrifle_Attack2();
136 weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_campingrifle_secondary_animtime"), W_Campingrifle_CheckReloadAndReady);
140 else if (req == WR_PRECACHE)
142 precache_model ("models/weapons/g_campingrifle.md3");
143 precache_model ("models/weapons/v_campingrifle.md3");
144 precache_model ("models/weapons/h_campingrifle.dpm");
145 precache_sound ("weapons/campingrifle_reload.wav");
146 precache_sound ("weapons/campingrifle_fire.wav");
147 precache_sound ("weapons/campingrifle_fire2.wav");
149 else if (req == WR_SETUP)
151 weapon_setup(WEP_CAMPINGRIFLE);
153 if(cvar("g_balance_campingrifle_auto_reload_after_changing_weapons"))
155 if(self.campingrifle_bulletcounter < cvar("g_balance_campingrifle_magazinecapacity"))
156 self.campingrifle_bulletcounter = -1;
159 else if (req == WR_CHECKAMMO1)
160 return self.ammo_nails >= cvar("g_balance_campingrifle_primary_ammo");
161 else if (req == WR_CHECKAMMO2)
162 return self.ammo_nails >= cvar("g_balance_campingrifle_secondary_ammo");
163 else if (req == WR_SUICIDEMESSAGE)
165 if(w_deathtype & HITTYPE_SECONDARY)
166 w_deathtypestring = "shot himself automatically";
168 w_deathtypestring = "sniped himself somehow";
170 else if (req == WR_KILLMESSAGE)
172 if(w_deathtype & HITTYPE_SECONDARY)
174 if(w_deathtype & HITTYPE_BOUNCE)
175 w_deathtypestring = "failed to hide from #'s bullet hail";
177 w_deathtypestring = "died in #'s bullet hail";
181 if(w_deathtype & HITTYPE_BOUNCE)
183 // TODO special headshot message here too?
184 w_deathtypestring = "failed to hide from #'s rifle";
188 if(w_deathtype & HITTYPE_HEADSHOT)
189 w_deathtypestring = "got hit in the head by #";
191 w_deathtypestring = "was sniped by #";
195 else if (req == WR_RELOAD)
197 W_Campingrifle_Reload();