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_Reload()
9 if (self.campingrifle_bulletcounter <= 0)
12 sound (self, CHAN_WEAPON2, "weapons/campingrifle_reload.wav", VOL_BASE, ATTN_NORM);
13 ATTACK_FINISHED(self) = time + cvar("g_balance_campingrifle_reloadtime");
14 self.campingrifle_bulletcounter = 0;
17 void W_Campingrifle_CheckReload()
19 if (self.campingrifle_bulletcounter >= cvar("g_balance_campingrifle_magazinecapacity"))
20 W_Campingrifle_Reload();
23 void W_CampingRifle_FireBullet(float pSpread, float pDamage, float pHeadshotAddedDamage, float pForce, float pSpeed, float pLifetime, float pAmmo, float deathtype, float pBulletConstant)
25 if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
26 self.ammo_nails -= pAmmo;
28 W_SetupShot (self, '25 8 -8', FALSE, 2, "weapons/campingrifle_fire.wav");
29 pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 2000, 1);
31 fireBallisticBullet(w_shotorg, w_shotdir, pSpread, pSpeed, pLifetime, pDamage, pHeadshotAddedDamage / pDamage, pForce, deathtype, EF_RED, 1, pBulletConstant);
32 // TODO decide whether to not use TrueAim (w_shotdir or v_forward)? this really is hard. Maybe shoot
33 // from eye when zoomed, use TrueAim when not? So difficult...
35 if (cvar("g_casings") >= 2)
36 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);
38 self.campingrifle_bulletcounter = self.campingrifle_bulletcounter + 1;
39 W_Campingrifle_CheckReload();
42 void W_Campingrifle_Attack()
44 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"));
47 void W_Campingrifle_Attack2()
49 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"));
52 void spawnfunc_weapon_campingrifle (void)
54 weapon_defaultspawnfunc(WEP_CAMPINGRIFLE);
57 .float bot_secondary_campingriflemooth;
58 float w_campingrifle(float req)
62 self.BUTTON_ATCK=FALSE;
63 self.BUTTON_ATCK2=FALSE;
64 if(vlen(self.origin-self.enemy.origin) > 1000)
65 self.bot_secondary_campingriflemooth = 0;
66 if(self.bot_secondary_campingriflemooth == 0)
68 if(bot_aim(cvar("g_balance_campingrifle_primary_speed"), 0, cvar("g_balance_campingrifle_primary_lifetime"), TRUE))
70 self.BUTTON_ATCK = TRUE;
71 if(random() < 0.01) self.bot_secondary_campingriflemooth = 1;
76 if(bot_aim(cvar("g_balance_campingrifle_secondary_speed"), 0, cvar("g_balance_campingrifle_secondary_lifetime"), TRUE))
78 self.BUTTON_ATCK2 = TRUE;
79 if(random() < 0.03) self.bot_secondary_campingriflemooth = 0;
83 else if (req == WR_THINK)
86 if (weapon_prepareattack(0, cvar("g_balance_campingrifle_primary_refire")))
88 W_Campingrifle_Attack();
89 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_campingrifle_primary_animtime"), w_ready);
91 if (self.BUTTON_ATCK2)
92 if (weapon_prepareattack(1, cvar("g_balance_campingrifle_secondary_refire")))
94 W_Campingrifle_Attack2();
95 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_campingrifle_secondary_animtime"), w_ready);
98 else if (req == WR_PRECACHE)
100 precache_model ("models/tracer.mdl");
101 precache_model ("models/weapons/g_campingrifle.md3");
102 precache_model ("models/weapons/v_campingrifle.md3");
103 precache_model ("models/weapons/w_campingrifle.zym");
104 precache_sound ("weapons/campingrifle_reload.wav");
105 precache_sound ("weapons/ric1.wav");
106 precache_sound ("weapons/ric2.wav");
107 precache_sound ("weapons/ric3.wav");
108 precache_sound ("weapons/campingrifle_fire.wav");
109 if (cvar("g_casings") >= 2)
111 precache_sound ("weapons/brass1.wav");
112 precache_sound ("weapons/brass2.wav");
113 precache_sound ("weapons/brass3.wav");
114 precache_model ("models/casing_bronze.mdl");
117 else if (req == WR_SETUP)
119 weapon_setup(WEP_CAMPINGRIFLE);
120 W_Campingrifle_Reload();
122 else if (req == WR_CHECKAMMO1)
123 return self.ammo_nails >= cvar("g_balance_campingrifle_primary_ammo");
124 else if (req == WR_CHECKAMMO2)
125 return self.ammo_nails >= cvar("g_balance_campingrifle_secondary_ammo");
126 else if (req == WR_SUICIDEMESSAGE)
128 if(w_deathtype & HITTYPE_SECONDARY)
129 w_deathtypestring = "shot himself automatically";
131 w_deathtypestring = "sniped himself somehow";
133 else if (req == WR_KILLMESSAGE)
135 if(w_deathtype & HITTYPE_SECONDARY)
137 if(w_deathtype & HITTYPE_BOUNCE)
138 w_deathtypestring = "failed to hide from #'s bullet hail";
140 w_deathtypestring = "died in #'s bullet hail";
144 if(w_deathtype & HITTYPE_BOUNCE)
146 // TODO special headshot message here too?
147 w_deathtypestring = "failed to hide from #'s rifle";
151 if(w_deathtype & HITTYPE_HEADSHOT)
152 w_deathtypestring = "got hit in the head by #";
154 w_deathtypestring = "was sniped by #";