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.frame == 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 W_SetupShot (self, '32 8 -8', FALSE, 2, "weapons/campingrifle_fire.wav");
55 pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 2000, 1);
57 if(self.BUTTON_ZOOM) // if zoomed, shoot from the eye
59 w_shotdir = v_forward;
60 w_shotorg = self.origin + self.view_ofs + ((w_shotorg - self.origin - self.view_ofs) * v_forward) * v_forward;
63 fireBallisticBullet(w_shotorg, w_shotdir, pSpread, pSpeed, pLifetime, pDamage, pHeadshotAddedDamage / pDamage, pForce, deathtype, EF_RED, 1, pBulletConstant);
65 if (cvar("g_casings") >= 2)
66 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);
68 self.campingrifle_bulletcounter = self.campingrifle_bulletcounter + 1;
71 void W_Campingrifle_Attack()
73 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"));
76 void W_Campingrifle_Attack2()
78 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"));
81 void spawnfunc_weapon_campingrifle (void)
83 weapon_defaultspawnfunc(WEP_CAMPINGRIFLE);
86 .float bot_secondary_campingriflemooth;
87 float w_campingrifle(float req)
91 self.BUTTON_ATCK=FALSE;
92 self.BUTTON_ATCK2=FALSE;
93 if(vlen(self.origin-self.enemy.origin) > 1000)
94 self.bot_secondary_campingriflemooth = 0;
95 if(self.bot_secondary_campingriflemooth == 0)
97 if(bot_aim(cvar("g_balance_campingrifle_primary_speed"), 0, cvar("g_balance_campingrifle_primary_lifetime"), TRUE))
99 self.BUTTON_ATCK = TRUE;
100 if(random() < 0.01) self.bot_secondary_campingriflemooth = 1;
105 if(bot_aim(cvar("g_balance_campingrifle_secondary_speed"), 0, cvar("g_balance_campingrifle_secondary_lifetime"), TRUE))
107 self.BUTTON_ATCK2 = TRUE;
108 if(random() < 0.03) self.bot_secondary_campingriflemooth = 0;
112 else if (req == WR_THINK)
114 if(self.campingrifle_bulletcounter < 0)
116 if(self.switchweapon == self.weapon)
117 if(self.weaponentity.state == WS_READY)
118 W_Campingrifle_Reload();
122 if (self.BUTTON_ATCK)
123 if (weapon_prepareattack(0, cvar("g_balance_campingrifle_primary_refire")))
125 W_Campingrifle_Attack();
126 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_campingrifle_primary_animtime"), W_Campingrifle_CheckReloadAndReady);
128 if (self.BUTTON_ATCK2)
129 if (weapon_prepareattack(1, cvar("g_balance_campingrifle_secondary_refire")))
131 W_Campingrifle_Attack2();
132 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_campingrifle_secondary_animtime"), W_Campingrifle_CheckReloadAndReady);
136 else if (req == WR_PRECACHE)
138 precache_model ("models/tracer.mdl");
139 precache_model ("models/weapons/g_campingrifle.md3");
140 precache_model ("models/weapons/v_campingrifle.md3");
141 precache_model ("models/weapons/w_campingrifle.zym");
142 precache_sound ("weapons/campingrifle_reload.wav");
143 precache_sound ("weapons/ric1.wav");
144 precache_sound ("weapons/ric2.wav");
145 precache_sound ("weapons/ric3.wav");
146 precache_sound ("weapons/campingrifle_fire.wav");
147 if (cvar("g_casings") >= 2)
149 precache_sound ("weapons/brass1.wav");
150 precache_sound ("weapons/brass2.wav");
151 precache_sound ("weapons/brass3.wav");
152 precache_model ("models/casing_bronze.mdl");
155 else if (req == WR_SETUP)
157 weapon_setup(WEP_CAMPINGRIFLE);
158 if(self.campingrifle_bulletcounter != 0)
159 self.campingrifle_bulletcounter = -1;
161 else if (req == WR_CHECKAMMO1)
162 return self.ammo_nails >= cvar("g_balance_campingrifle_primary_ammo");
163 else if (req == WR_CHECKAMMO2)
164 return self.ammo_nails >= cvar("g_balance_campingrifle_secondary_ammo");
165 else if (req == WR_SUICIDEMESSAGE)
167 if(w_deathtype & HITTYPE_SECONDARY)
168 w_deathtypestring = "shot himself automatically";
170 w_deathtypestring = "sniped himself somehow";
172 else if (req == WR_KILLMESSAGE)
174 if(w_deathtype & HITTYPE_SECONDARY)
176 if(w_deathtype & HITTYPE_BOUNCE)
177 w_deathtypestring = "failed to hide from #'s bullet hail";
179 w_deathtypestring = "died in #'s bullet hail";
183 if(w_deathtype & HITTYPE_BOUNCE)
185 // TODO special headshot message here too?
186 w_deathtypestring = "failed to hide from #'s rifle";
190 if(w_deathtype & HITTYPE_HEADSHOT)
191 w_deathtypestring = "got hit in the head by #";
193 w_deathtypestring = "was sniped by #";
197 else if (req == WR_RELOAD)
199 W_Campingrifle_Reload();