2 REGISTER_WEAPON(RIFLE, w_rifle, IT_NAILS, 7, WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_NORMAL | WEP_FLAG_RELOADABLE | WEP_TYPE_HITSCAN, BOT_PICKUP_RATING_MID, "campingrifle", "rifle", _("Rifle"))
6 .float rifle_accumulator;
8 void W_Rifle_FireBullet(float pSpread, float pDamage, float pHeadshotAddedDamage, float pForce, float pSpeed, float pLifetime, float pAmmo, float deathtype, float pBulletConstant, float pTracer, float pShots, string pSound)
12 W_DecreaseAmmo(ammo_nails, pAmmo, autocvar_g_balance_rifle_reload_ammo);
14 W_SetupShot (self, autocvar_g_antilag_bullets && pSpeed >= autocvar_g_antilag_bullets, 2, pSound, CH_WEAPON_A, (pDamage + pHeadshotAddedDamage) * pShots);
16 pointparticles(particleeffectnum("rifle_muzzleflash"), w_shotorg, w_shotdir * 2000, 1);
18 if(self.BUTTON_ZOOM | self.BUTTON_ZOOMSCRIPT) // if zoomed, shoot from the eye
20 w_shotdir = v_forward;
21 w_shotorg = self.origin + self.view_ofs + ((w_shotorg - self.origin - self.view_ofs) * v_forward) * v_forward;
24 for(i = 0; i < pShots; ++i)
25 fireBallisticBullet(w_shotorg, w_shotdir, pSpread, pSpeed, pLifetime, pDamage, pHeadshotAddedDamage / pDamage, pForce, deathtype, (pTracer ? EF_RED : EF_BLUE), 1, pBulletConstant);
26 endFireBallisticBullet();
28 if (autocvar_g_casings >= 2)
29 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);
34 W_Rifle_FireBullet(autocvar_g_balance_rifle_primary_spread, autocvar_g_balance_rifle_primary_damage, autocvar_g_balance_rifle_primary_headshotaddeddamage, autocvar_g_balance_rifle_primary_force, autocvar_g_balance_rifle_primary_speed, autocvar_g_balance_rifle_primary_lifetime, autocvar_g_balance_rifle_primary_ammo, WEP_RIFLE, autocvar_g_balance_rifle_primary_bulletconstant, autocvar_g_balance_rifle_primary_tracer, autocvar_g_balance_rifle_primary_shots, "weapons/campingrifle_fire.wav");
37 void W_Rifle_Attack2()
39 W_Rifle_FireBullet(autocvar_g_balance_rifle_secondary_spread, autocvar_g_balance_rifle_secondary_damage, autocvar_g_balance_rifle_secondary_headshotaddeddamage, autocvar_g_balance_rifle_secondary_force, autocvar_g_balance_rifle_secondary_speed, autocvar_g_balance_rifle_secondary_lifetime, autocvar_g_balance_rifle_secondary_ammo, WEP_RIFLE | HITTYPE_SECONDARY, autocvar_g_balance_rifle_secondary_bulletconstant, autocvar_g_balance_rifle_secondary_tracer, autocvar_g_balance_rifle_secondary_shots, "weapons/campingrifle_fire2.wav");
43 void spawnfunc_weapon_rifle (void)
45 weapon_defaultspawnfunc(WEP_RIFLE);
48 // compatibility alias
49 void spawnfunc_weapon_campingrifle (void)
51 spawnfunc_weapon_rifle();
53 void spawnfunc_weapon_sniperrifle (void)
55 spawnfunc_weapon_rifle();
59 .void(void) rifle_bullethail_attackfunc;
60 .float rifle_bullethail_frame;
61 .float rifle_bullethail_animtime;
62 .float rifle_bullethail_refire;
63 void W_Rifle_BulletHail_Continue()
67 sw = self.switchweapon; // make it not detect weapon changes as reason to abort firing
68 af = ATTACK_FINISHED(self);
69 self.switchweapon = self.weapon;
70 ATTACK_FINISHED(self) = time;
71 print(ftos(self.ammo_nails), "\n");
72 r = weapon_prepareattack(self.rifle_bullethail_frame == WFRAME_FIRE2, self.rifle_bullethail_refire);
73 if(self.switchweapon == self.weapon)
74 self.switchweapon = sw;
77 self.rifle_bullethail_attackfunc();
78 weapon_thinkf(self.rifle_bullethail_frame, self.rifle_bullethail_animtime, W_Rifle_BulletHail_Continue);
79 print("thinkf set\n");
83 ATTACK_FINISHED(self) = af; // reset attack_finished if we didn't fire, so the last shot enforces the refire time
84 print("out of ammo... ", ftos(self.weaponentity.state), "\n");
88 void W_Rifle_BulletHail(float mode, void(void) AttackFunc, float fr, float animtime, float refire)
90 // if we get here, we have at least one bullet to fire
95 self.rifle_bullethail_attackfunc = AttackFunc;
96 self.rifle_bullethail_frame = fr;
97 self.rifle_bullethail_animtime = animtime;
98 self.rifle_bullethail_refire = refire;
99 weapon_thinkf(fr, animtime, W_Rifle_BulletHail_Continue);
104 weapon_thinkf(fr, animtime, w_ready);
108 .float bot_secondary_riflemooth;
109 float w_rifle(float req)
115 self.BUTTON_ATCK=FALSE;
116 self.BUTTON_ATCK2=FALSE;
117 if(vlen(self.origin-self.enemy.origin) > 1000)
118 self.bot_secondary_riflemooth = 0;
119 if(self.bot_secondary_riflemooth == 0)
121 if(bot_aim(autocvar_g_balance_rifle_primary_speed, 0, autocvar_g_balance_rifle_primary_lifetime, FALSE))
123 self.BUTTON_ATCK = TRUE;
124 if(random() < 0.01) self.bot_secondary_riflemooth = 1;
129 if(bot_aim(autocvar_g_balance_rifle_secondary_speed, 0, autocvar_g_balance_rifle_secondary_lifetime, FALSE))
131 self.BUTTON_ATCK2 = TRUE;
132 if(random() < 0.03) self.bot_secondary_riflemooth = 0;
136 else if (req == WR_THINK)
138 if(autocvar_g_balance_rifle_reload_ammo && self.clip_load < min(autocvar_g_balance_rifle_primary_ammo, autocvar_g_balance_rifle_secondary_ammo)) // forced reload
139 weapon_action(self.weapon, WR_RELOAD);
142 self.rifle_accumulator = bound(time - autocvar_g_balance_rifle_bursttime, self.rifle_accumulator, time);
143 if (self.BUTTON_ATCK)
144 if (weapon_prepareattack_check(0, autocvar_g_balance_rifle_primary_refire))
145 if (time >= self.rifle_accumulator + autocvar_g_balance_rifle_primary_burstcost)
147 weapon_prepareattack_do(0, autocvar_g_balance_rifle_primary_refire);
148 W_Rifle_BulletHail(autocvar_g_balance_rifle_primary_bullethail, W_Rifle_Attack, WFRAME_FIRE1, autocvar_g_balance_rifle_primary_animtime, autocvar_g_balance_rifle_primary_refire);
149 self.rifle_accumulator += autocvar_g_balance_rifle_primary_burstcost;
151 if (self.BUTTON_ATCK2)
153 if (autocvar_g_balance_rifle_secondary)
155 if(autocvar_g_balance_rifle_secondary_reload)
156 weapon_action(self.weapon, WR_RELOAD);
159 if (weapon_prepareattack_check(1, autocvar_g_balance_rifle_secondary_refire))
160 if (time >= self.rifle_accumulator + autocvar_g_balance_rifle_secondary_burstcost)
162 weapon_prepareattack_do(1, autocvar_g_balance_rifle_secondary_refire);
163 W_Rifle_BulletHail(autocvar_g_balance_rifle_secondary_bullethail, W_Rifle_Attack2, WFRAME_FIRE2, autocvar_g_balance_rifle_secondary_animtime, autocvar_g_balance_rifle_primary_refire);
164 self.rifle_accumulator += autocvar_g_balance_rifle_secondary_burstcost;
171 else if (req == WR_PRECACHE)
173 precache_model ("models/weapons/g_campingrifle.md3");
174 precache_model ("models/weapons/v_campingrifle.md3");
175 precache_model ("models/weapons/h_campingrifle.iqm");
176 precache_sound ("weapons/campingrifle_fire.wav");
177 precache_sound ("weapons/campingrifle_fire2.wav");
178 //precache_sound ("weapons/reload.wav"); // until weapons have individual reload sounds, precache the reload sound somewhere else
180 else if (req == WR_SETUP)
182 weapon_setup(WEP_RIFLE);
183 self.current_ammo = ammo_nails;
185 else if (req == WR_CHECKAMMO1)
187 ammo_amount = self.ammo_nails >= autocvar_g_balance_rifle_primary_ammo;
188 ammo_amount += self.(weapon_load[WEP_RIFLE]) >= autocvar_g_balance_rifle_primary_ammo;
191 else if (req == WR_CHECKAMMO2)
193 ammo_amount = self.ammo_nails >= autocvar_g_balance_rifle_secondary_ammo;
194 ammo_amount += self.(weapon_load[WEP_RIFLE]) >= autocvar_g_balance_rifle_secondary_ammo;
197 else if (req == WR_RESETPLAYER)
199 self.rifle_accumulator = time - autocvar_g_balance_rifle_bursttime;
201 else if (req == WR_RELOAD)
203 W_Reload(min(autocvar_g_balance_rifle_primary_ammo, autocvar_g_balance_rifle_secondary_ammo), autocvar_g_balance_rifle_reload_ammo, autocvar_g_balance_rifle_reload_time, "weapons/reload.wav");
209 float w_rifle(float req)
211 if(req == WR_IMPACTEFFECT)
214 org2 = w_org + w_backoff * 2;
215 pointparticles(particleeffectnum("machinegun_impact"), org2, w_backoff * 1000, 1);
219 sound(self, CH_SHOTS, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
220 else if(w_random < 0.4)
221 sound(self, CH_SHOTS, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
222 else if(w_random < 0.5)
223 sound(self, CH_SHOTS, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
226 else if(req == WR_PRECACHE)
228 precache_sound("weapons/ric1.wav");
229 precache_sound("weapons/ric2.wav");
230 precache_sound("weapons/ric3.wav");
232 else if (req == WR_SUICIDEMESSAGE)
234 w_deathtypestring = _("%s is now thinking with portals");
236 else if (req == WR_KILLMESSAGE)
238 if(w_deathtype & HITTYPE_SECONDARY)
240 if(w_deathtype & HITTYPE_BOUNCE)
241 w_deathtypestring = _("%s failed to hide from %s's rifle bullet hail");
243 w_deathtypestring = _("%s died in %s's rifle bullet hail");
247 if(w_deathtype & HITTYPE_BOUNCE)
249 // TODO special headshot message here too?
250 w_deathtypestring = _("%s failed to hide from %s's rifle");
254 if(w_deathtype & HITTYPE_HEADSHOT)
255 w_deathtypestring = _("%s got shot in the head with a rifle by %s");
257 w_deathtypestring = _("%s was sniped with a rifle by %s");