]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/w_campingrifle.qc
tetris: no longer switch fonts
[divverent/nexuiz.git] / data / qcsrc / server / w_campingrifle.qc
1 //Camping rifle Primary mode: manually operated bolt*, Secondary: full automatic**
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 W_CampingRifle_CheckMaxBullets()
6 {
7         float maxbulls;
8         maxbulls = cvar("g_balance_campingrifle_magazinecapacity");
9         if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
10                 maxbulls = min(maxbulls, floor(self.ammo_nails / min(cvar("g_balance_campingrifle_primary_ammo"), cvar("g_balance_campingrifle_secondary_ammo"))));
11         if(self.campingrifle_bulletcounter > maxbulls)
12                 self.campingrifle_bulletcounter = maxbulls;
13         return (self.campingrifle_bulletcounter == maxbulls);
14 }
15
16 void W_Campingrifle_ReloadedAndReady()
17 {
18         float t;
19         self.campingrifle_bulletcounter = cvar("g_balance_campingrifle_magazinecapacity");
20         W_CampingRifle_CheckMaxBullets();
21         t = ATTACK_FINISHED(self) - cvar("g_balance_campingrifle_reloadtime") - 1;
22         ATTACK_FINISHED(self) = t;
23         w_ready();
24 }
25
26 void W_Campingrifle_Reload()
27 {
28         float t;
29
30         if (self.campingrifle_bulletcounter >= cvar("g_balance_campingrifle_magazinecapacity"))
31                 return;
32
33         if(self.ammo_nails < min(cvar("g_balance_campingrifle_primary_ammo"), cvar("g_balance_campingrifle_secondary_ammo")))
34         {
35                 self.campingrifle_bulletcounter = -1; // reload later
36                 return;
37         }
38         
39         if (self.weaponentity)
40         {
41                 if (self.weaponentity.wframe == WFRAME_RELOAD)
42                         return;
43
44                 // allow to switch away while reloading, but this will cause a new reload!
45                 self.weaponentity.state = WS_READY;
46         }
47
48         sound (self, CHAN_WEAPON2, "weapons/campingrifle_reload.wav", VOL_BASE, ATTN_NORM);
49
50         t = max(time, ATTACK_FINISHED(self)) + cvar("g_balance_campingrifle_reloadtime") + 1;
51         ATTACK_FINISHED(self) = t;
52
53         weapon_thinkf(WFRAME_RELOAD, cvar("g_balance_campingrifle_reloadtime"), W_Campingrifle_ReloadedAndReady);
54
55         self.campingrifle_bulletcounter = -1;
56 }
57
58 void W_Campingrifle_CheckReloadAndReady()
59 {
60         w_ready();
61         if (self.campingrifle_bulletcounter <= 0)
62                 W_Campingrifle_Reload();
63         else
64                 w_ready();
65 }
66
67 void W_CampingRifle_FireBullet(float pSpread, float pDamage, float pHeadshotAddedDamage, float pForce, float pSpeed, float pLifetime, float pAmmo, float deathtype, float pBulletConstant)
68 {
69         if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
70                 self.ammo_nails -= pAmmo;
71
72         if(deathtype & HITTYPE_SECONDARY)
73                 W_SetupShot (self, cvar("g_antilag_bullets") && pSpeed >= cvar("g_antilag_bullets"), 2, "weapons/campingrifle_fire2.wav", cvar("g_balance_campingrifle_secondary_damage"));
74         else
75                 W_SetupShot (self, cvar("g_antilag_bullets") && pSpeed >= cvar("g_antilag_bullets"), 2, "weapons/campingrifle_fire.wav", cvar("g_balance_campingrifle_primary_damage"));
76
77         pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 2000, 1);
78
79         if(self.BUTTON_ZOOM) // if zoomed, shoot from the eye
80         {
81                 w_shotdir = v_forward;
82                 w_shotorg = self.origin + self.view_ofs + ((w_shotorg - self.origin - self.view_ofs) * v_forward) * v_forward;
83         }
84
85         fireBallisticBullet(w_shotorg, w_shotdir, pSpread, pSpeed, pLifetime, pDamage, pHeadshotAddedDamage / pDamage, pForce, deathtype, EF_RED, 1, pBulletConstant);
86
87         if (cvar("g_casings") >= 2)
88                 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);
89         
90         self.campingrifle_bulletcounter = self.campingrifle_bulletcounter - 1;
91 }
92
93 void W_Campingrifle_Attack()
94 {
95         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"));
96 }
97
98 void W_Campingrifle_Attack2()
99 {
100         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"));
101 }
102
103 void spawnfunc_weapon_campingrifle (void)
104 {
105         weapon_defaultspawnfunc(WEP_CAMPINGRIFLE);
106 }
107
108 .float bot_secondary_campingriflemooth;
109 float w_campingrifle(float req)
110 {
111         float full;
112         if (req == WR_AIM)
113         {
114                 self.BUTTON_ATCK=FALSE;
115                 self.BUTTON_ATCK2=FALSE;
116                 if(vlen(self.origin-self.enemy.origin) > 1000)
117                         self.bot_secondary_campingriflemooth = 0;
118                 if(self.bot_secondary_campingriflemooth == 0)
119                 {
120                         if(bot_aim(cvar("g_balance_campingrifle_primary_speed"), 0, cvar("g_balance_campingrifle_primary_lifetime"), TRUE))
121                         {
122                                 self.BUTTON_ATCK = TRUE;
123                                 if(random() < 0.01) self.bot_secondary_campingriflemooth = 1;
124                         }
125                 }
126                 else
127                 {
128                         if(bot_aim(cvar("g_balance_campingrifle_secondary_speed"), 0, cvar("g_balance_campingrifle_secondary_lifetime"), TRUE))
129                         {
130                                 self.BUTTON_ATCK2 = TRUE;
131                                 if(random() < 0.03) self.bot_secondary_campingriflemooth = 0;
132                         }
133                 }
134         }
135         else if (req == WR_THINK)
136         {
137                 if(self.campingrifle_bulletcounter < 0) // forced reload (e.g. because interrupted)
138                 {
139                         if(self.switchweapon == self.weapon)
140                         if(self.weaponentity.state == WS_READY)
141                                 W_Campingrifle_Reload();
142                 }
143                 else
144                 {
145                         if (self.BUTTON_ATCK)
146                         if (weapon_prepareattack(0, cvar("g_balance_campingrifle_primary_refire")))
147                         {
148                                 W_Campingrifle_Attack();
149                                 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_campingrifle_primary_animtime"), W_Campingrifle_CheckReloadAndReady);
150                         }
151                         if (self.BUTTON_ATCK2)
152                         if (weapon_prepareattack(1, cvar("g_balance_campingrifle_secondary_refire")))
153                         {
154                                 W_Campingrifle_Attack2();
155                                 weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_campingrifle_secondary_animtime"), W_Campingrifle_CheckReloadAndReady);
156                         }
157                 }
158         }
159         else if (req == WR_PRECACHE)
160         {               
161                 precache_model ("models/weapons/g_campingrifle.md3");
162                 precache_model ("models/weapons/v_campingrifle.md3");
163                 precache_model ("models/weapons/h_campingrifle.dpm");
164                 precache_sound ("weapons/campingrifle_reload.wav");
165                 precache_sound ("weapons/campingrifle_fire.wav");
166                 precache_sound ("weapons/campingrifle_fire2.wav");
167         }
168         else if (req == WR_SETUP)
169         {
170                 weapon_setup(WEP_CAMPINGRIFLE);
171
172                 full = W_CampingRifle_CheckMaxBullets();
173                 if(cvar("g_balance_campingrifle_auto_reload_after_changing_weapons"))
174                         if(!full)
175                                 self.campingrifle_bulletcounter = -1;
176         }
177         else if (req == WR_CHECKAMMO1)
178                 return self.ammo_nails >= cvar("g_balance_campingrifle_primary_ammo");
179         else if (req == WR_CHECKAMMO2)
180                 return self.ammo_nails >= cvar("g_balance_campingrifle_secondary_ammo");
181         else if (req == WR_SUICIDEMESSAGE)
182         {
183                 if(w_deathtype & HITTYPE_SECONDARY)
184                         w_deathtypestring = "shot himself automatically";
185                 else
186                         w_deathtypestring = "sniped himself somehow";
187         }
188         else if (req == WR_KILLMESSAGE)
189         {
190                 if(w_deathtype & HITTYPE_SECONDARY)
191                 {
192                         if(w_deathtype & HITTYPE_BOUNCE)
193                                 w_deathtypestring = "failed to hide from #'s bullet hail";
194                         else
195                                 w_deathtypestring = "died in #'s bullet hail";
196                 }
197                 else
198                 {
199                         if(w_deathtype & HITTYPE_BOUNCE)
200                         {
201                                 // TODO special headshot message here too?
202                                 w_deathtypestring = "failed to hide from #'s rifle";
203                         }
204                         else
205                         {
206                                 if(w_deathtype & HITTYPE_HEADSHOT)
207                                         w_deathtypestring = "got hit in the head by #";
208                                 else
209                                         w_deathtypestring = "was sniped by #";
210                         }
211                 }
212         }
213         else if (req == WR_RELOAD)
214         {
215                 W_Campingrifle_Reload();
216         }
217         return TRUE;
218 };