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, TRUE, 2, "weapons/campingrifle_fire2.wav");
57 W_SetupShot (self, TRUE, 2, "weapons/campingrifle_fire.wav");
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);
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(self.campingrifle_bulletcounter != 0)
153 self.campingrifle_bulletcounter = -1;
155 else if (req == WR_CHECKAMMO1)
156 return self.ammo_nails >= cvar("g_balance_campingrifle_primary_ammo");
157 else if (req == WR_CHECKAMMO2)
158 return self.ammo_nails >= cvar("g_balance_campingrifle_secondary_ammo");
159 else if (req == WR_SUICIDEMESSAGE)
161 if(w_deathtype & HITTYPE_SECONDARY)
162 w_deathtypestring = "shot himself automatically";
164 w_deathtypestring = "sniped himself somehow";
166 else if (req == WR_KILLMESSAGE)
168 if(w_deathtype & HITTYPE_SECONDARY)
170 if(w_deathtype & HITTYPE_BOUNCE)
171 w_deathtypestring = "failed to hide from #'s bullet hail";
173 w_deathtypestring = "died in #'s bullet hail";
177 if(w_deathtype & HITTYPE_BOUNCE)
179 // TODO special headshot message here too?
180 w_deathtypestring = "failed to hide from #'s rifle";
184 if(w_deathtype & HITTYPE_HEADSHOT)
185 w_deathtypestring = "got hit in the head by #";
187 w_deathtypestring = "was sniped by #";
191 else if (req == WR_RELOAD)
193 W_Campingrifle_Reload();