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_ReloadedAndReady()
10 self.campingrifle_bulletcounter = 0;
11 t = ATTACK_FINISHED(self) - cvar("g_balance_campingrifle_reloadtime") - 1;
12 ATTACK_FINISHED(self) = t;
16 void W_Campingrifle_Reload()
20 if (self.campingrifle_bulletcounter == 0)
23 if (self.weaponentity)
25 if (self.weaponentity.wframe == WFRAME_RELOAD)
28 // allow to switch away while reloading, but this will cause a new reload!
29 self.weaponentity.state = WS_READY;
32 sound (self, CHAN_WEAPON2, "weapons/campingrifle_reload.wav", VOL_BASE, ATTN_NORM);
34 t = max(time, ATTACK_FINISHED(self)) + cvar("g_balance_campingrifle_reloadtime") + 1;
35 ATTACK_FINISHED(self) = t;
37 weapon_thinkf(WFRAME_RELOAD, cvar("g_balance_campingrifle_reloadtime"), W_Campingrifle_ReloadedAndReady);
40 void W_Campingrifle_CheckReloadAndReady()
43 if (self.campingrifle_bulletcounter >= cvar("g_balance_campingrifle_magazinecapacity"))
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)
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);
152 if(cvar("g_balance_campingrifle_auto_reload_after_changing_weapons"))
153 if(self.campingrifle_bulletcounter != 0)
154 self.campingrifle_bulletcounter = -1;
156 else if (req == WR_CHECKAMMO1)
157 return self.ammo_nails >= cvar("g_balance_campingrifle_primary_ammo");
158 else if (req == WR_CHECKAMMO2)
159 return self.ammo_nails >= cvar("g_balance_campingrifle_secondary_ammo");
160 else if (req == WR_SUICIDEMESSAGE)
162 if(w_deathtype & HITTYPE_SECONDARY)
163 w_deathtypestring = "shot himself automatically";
165 w_deathtypestring = "sniped himself somehow";
167 else if (req == WR_KILLMESSAGE)
169 if(w_deathtype & HITTYPE_SECONDARY)
171 if(w_deathtype & HITTYPE_BOUNCE)
172 w_deathtypestring = "failed to hide from #'s bullet hail";
174 w_deathtypestring = "died in #'s bullet hail";
178 if(w_deathtype & HITTYPE_BOUNCE)
180 // TODO special headshot message here too?
181 w_deathtypestring = "failed to hide from #'s rifle";
185 if(w_deathtype & HITTYPE_HEADSHOT)
186 w_deathtypestring = "got hit in the head by #";
188 w_deathtypestring = "was sniped by #";
192 else if (req == WR_RELOAD)
194 W_Campingrifle_Reload();