]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/w_campingrifle.qc
camping rifle: DO use trueaim. Better for head shots. MUCH better.
[divverent/nexuiz.git] / data / qcsrc / server / w_campingrifle.qc
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.
4
5 .float campingrifle_bulletcounter;
6
7 void W_Campingrifle_Reload()
8 {
9         if (self.campingrifle_bulletcounter <= 0)
10                 return;
11         
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;
15 }
16
17 void W_Campingrifle_CheckReload()
18 {
19         if (self.campingrifle_bulletcounter >= cvar("g_balance_campingrifle_magazinecapacity"))
20                 W_Campingrifle_Reload();
21 }
22
23 void W_CampingRifle_FireBullet(float pSpread, float pDamage, float pHeadshotAddedDamage, float pForce, float pSpeed, float pLifetime, float pAmmo, float deathtype, float pBulletConstant)
24 {
25         if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
26                 self.ammo_nails -= pAmmo;
27
28         W_SetupShot (self, '25 8 -8', FALSE, 2, "weapons/campingrifle_fire.wav");
29         pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 2000, 1);
30
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...
34
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);
37         
38         self.campingrifle_bulletcounter = self.campingrifle_bulletcounter + 1;
39         W_Campingrifle_CheckReload();
40 }
41
42 void W_Campingrifle_Attack()
43 {
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"));
45 }
46
47 void W_Campingrifle_Attack2()
48 {
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"));
50 }
51
52 void spawnfunc_weapon_campingrifle (void)
53 {
54         weapon_defaultspawnfunc(WEP_CAMPINGRIFLE);
55 }
56
57 .float bot_secondary_campingriflemooth;
58 float w_campingrifle(float req)
59 {
60         if (req == WR_AIM)
61         {
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)
67                 {
68                         if(bot_aim(cvar("g_balance_campingrifle_primary_speed"), 0, cvar("g_balance_campingrifle_primary_lifetime"), TRUE))
69                         {
70                                 self.BUTTON_ATCK = TRUE;
71                                 if(random() < 0.01) self.bot_secondary_campingriflemooth = 1;
72                         }
73                 }
74                 else
75                 {
76                         if(bot_aim(cvar("g_balance_campingrifle_secondary_speed"), 0, cvar("g_balance_campingrifle_secondary_lifetime"), TRUE))
77                         {
78                                 self.BUTTON_ATCK2 = TRUE;
79                                 if(random() < 0.03) self.bot_secondary_campingriflemooth = 0;
80                         }
81                 }
82         }
83         else if (req == WR_THINK)
84         {
85                 if (self.BUTTON_ATCK)
86                 if (weapon_prepareattack(0, cvar("g_balance_campingrifle_primary_refire")))
87                 {
88                         W_Campingrifle_Attack();
89                         weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_campingrifle_primary_animtime"), w_ready);
90                 }
91                 if (self.BUTTON_ATCK2)
92                 if (weapon_prepareattack(1, cvar("g_balance_campingrifle_secondary_refire")))
93                 {
94                         W_Campingrifle_Attack2();
95                         weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_campingrifle_secondary_animtime"), w_ready);
96                 }
97         }
98         else if (req == WR_PRECACHE)
99         {               
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)
110                 {
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");
115                 }
116         }
117         else if (req == WR_SETUP)
118         {
119                 weapon_setup(WEP_CAMPINGRIFLE);
120                 W_Campingrifle_Reload();
121         }
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)
127         {
128                 if(w_deathtype & HITTYPE_SECONDARY)
129                         w_deathtypestring = "shot himself automatically";
130                 else
131                         w_deathtypestring = "sniped himself somehow";
132         }
133         else if (req == WR_KILLMESSAGE)
134         {
135                 if(w_deathtype & HITTYPE_SECONDARY)
136                 {
137                         if(w_deathtype & HITTYPE_BOUNCE)
138                                 w_deathtypestring = "failed to hide from #'s bullet hail";
139                         else
140                                 w_deathtypestring = "died in #'s bullet hail";
141                 }
142                 else
143                 {
144                         if(w_deathtype & HITTYPE_BOUNCE)
145                         {
146                                 // TODO special headshot message here too?
147                                 w_deathtypestring = "failed to hide from #'s rifle";
148                         }
149                         else
150                         {
151                                 if(w_deathtype & HITTYPE_HEADSHOT)
152                                         w_deathtypestring = "got hit in the head by #";
153                                 else
154                                         w_deathtypestring = "was sniped by #";
155                         }
156                 }
157         }
158         return TRUE;
159 };