]> icculus.org git repositories - divverent/nexuiz.git/blob - qcsrc/gamec/cl_client.c
jumpjet test code (disabled)
[divverent/nexuiz.git] / qcsrc / gamec / cl_client.c
1
2 void info_player_start (void)
3 {
4         self.classname = "info_player_deathmatch";
5 }
6
7 void info_player_deathmatch (void)
8 {
9 }
10
11 /*
12 =============
13 SelectSpawnPoint
14
15 Finds a point to respawn
16 =============
17 */
18 entity SelectSpawnPoint (void)
19 {
20         local entity spot, thing;
21         local float pcount;
22
23         spot = find (world, classname, "testplayerstart");
24         if (spot)
25                 return spot;
26
27         spot = lastspawn;
28         while (1)
29         {
30                 spot = find(spot, classname, "info_player_deathmatch");
31                 if (spot != world)
32                 {
33                         if (spot == lastspawn)
34                                 return lastspawn;
35                         pcount = 0;
36                         thing = findradius(spot.origin, 70);
37                         while(thing)
38                         {
39                                 if (thing.classname == "player")
40                                         pcount = pcount + 1;
41                                 thing = thing.chain;
42                         }
43                         if (pcount == 0)
44                         {
45                                 lastspawn = spot;
46                                 return spot;
47                         }
48                 }
49         }
50
51         spot = find (world, classname, "info_player_start");
52         if (!spot)
53                 error ("PutClientInServer: no info_player_start on level");
54
55         return spot;
56 }
57
58
59 /*
60 =============
61 PutClientInServer
62
63 Called when a client spawns in the server
64 =============
65 */
66 void PutClientInServer (void)
67 {
68         entity  spot;
69         float mdlrandom;
70
71         spot = SelectSpawnPoint ();
72
73         self.classname = "player";
74         self.movetype = MOVETYPE_WALK;
75         self.solid = SOLID_SLIDEBOX;
76         self.flags = FL_CLIENT;
77         self.takedamage = DAMAGE_YES;
78         self.effects = 0;
79         self.health = 150;
80         self.damageforcescale = 2;
81         self.death_time = 0;
82         self.dead_time = 0;
83         self.dead_frame = 0;
84         self.die_frame = 0;
85         self.alpha = 0;
86         self.scale = 0;
87         self.fade_time = 0;
88         self.pain_frame = 0;
89         self.pain_finished = 0;
90         self.strength_finished = 0;
91         self.invincible_finished = 0;
92         self.speed_finished = 0;
93         self.slowmo_finished = 0;
94         // players have no think function
95         self.think = nullfunction;
96         self.nextthink = 0;
97
98         self.deadflag = DEAD_NO;
99
100         self.view_ofs = PL_VIEW_OFS;
101         self.angles = spot.angles;
102         self.velocity = '0 0 0';
103         self.avelocity = '0 0 0';
104
105         self.viewzoom = 0.6;
106
107         setmodel (self, self.playermodel);
108         setsize (self, PL_MIN, PL_MAX);
109         setorigin (self, spot.origin + '0 0 1' * (1 - self.mins_z - 24));
110         // don't reset back to last position, even if new position is stuck in solid
111         self.oldorigin = self.origin;
112
113 //      self.items = IT_LASER | IT_UZI| IT_SHOTGUN | IT_GRENADE_LAUNCHER | IT_ELECTRO | IT_CRYLINK | IT_NEX | IT_HAGAR | IT_ROCKET_LAUNCHER;
114 //      self.weapon = IT_UZI;
115
116         if (game & GAME_INSTAGIB)
117         {
118                 self.items = IT_NEX;
119                 self.switchweapon = WEP_NEX;
120                 self.ammo_shells = 0;
121                 self.ammo_nails = 0;
122                 self.ammo_rockets = 0;
123                 self.ammo_cells = 999;
124         }
125         else if (game & GAME_ROCKET_ARENA)
126         {
127                 self.items = IT_ROCKET_LAUNCHER;
128                 self.switchweapon = WEP_ROCKET_LAUNCHER;
129                 self.ammo_shells = 0;
130                 self.ammo_nails = 0;
131                 self.ammo_rockets = 999;
132                 self.ammo_cells = 0;
133         }
134         else
135         {
136                 self.items = IT_LASER | IT_SHOTGUN;
137                 self.switchweapon = WEP_SHOTGUN;
138                 self.ammo_shells = 25;
139                 self.ammo_nails = 0;
140                 self.ammo_rockets = 0;
141                 self.ammo_cells = 0;
142         }
143
144         if (game & GAME_FULLBRIGHT_PLAYERS)
145                 self.effects = EF_FULLBRIGHT;
146
147         self.event_damage = PlayerDamage;
148
149         self.statdraintime = time + 5;
150         self.button0 = self.button1 = self.button2 = self.button3 = 0;
151
152         /*
153         W_UpdateWeapon();
154         W_UpdateAmmo();
155         */
156         CL_SpawnWeaponentity();
157
158         //stuffcmd(self, "chase_active 0");
159 }
160
161 /*
162 =============
163 SetNewParms
164 =============
165 */
166 void SetNewParms (void)
167 {
168
169 }
170
171 /*
172 =============
173 SetChangeParms
174 =============
175 */
176 void SetChangeParms (void)
177 {
178
179 }
180
181 /*
182 =============
183 ClientKill
184
185 Called when a client types 'kill' in the console
186 =============
187 */
188 void ClientKill (void)
189 {
190
191 }
192
193 /*
194 =============
195 ClientConnect
196
197 Called when a client connects to the server
198 =============
199 */
200 void ClientConnect (void)
201 {
202         //ClientInRankings();
203         bprint (self.netname);
204         bprint (" connected\n");
205 }
206
207 /*
208 =============
209 ClientDisconnect
210
211 Called when a client disconnects from the server
212 =============
213 */
214 void ClientDisconnect (void)
215 {
216         //ClientDisconnected();
217         bprint (self.netname);
218         bprint (" disconnected\n");
219 }
220
221 /*
222 =============
223 PlayerJump
224
225 When you press the jump key
226 =============
227 */
228 void PlayerJump (void)
229 {
230         if (!(self.flags & FL_JUMPRELEASED))
231                 return;
232         if (!(self.flags & FL_ONGROUND))
233         {
234                 // jumpjet test
235                 //self.velocity_z = self.velocity_z + frametime * 1500;
236                 return;
237         }
238
239         if (self.items & IT_SPEED)
240                 self.velocity_z = self.velocity_z + POWERUP_SPEED_JUMPVELOCITY;
241         else
242                 self.velocity_z = self.velocity_z + JUMP_VELOCITY;
243
244         self.flags = self.flags - FL_ONGROUND;
245         self.flags = self.flags - FL_JUMPRELEASED;
246 }
247
248 void respawn(void)
249 {
250         CopyBody();
251         PutClientInServer();
252 }
253
254 void player_powerups (void)
255 {
256         if (self.items & IT_STRENGTH)
257         {
258                 if (time > self.strength_finished)
259                 {
260                         self.items = self.items - (self.items & IT_STRENGTH);
261                         sprint(self, "Strength has worn off\n");
262                 }
263         }
264         else
265         {
266                 if (time < self.strength_finished)
267                 {
268                         self.items = self.items | IT_STRENGTH;
269                         sprint(self, "Strength infuses your weapons with devestating power\n");
270                 }
271         }
272         if (self.items & IT_INVINCIBLE)
273         {
274                 if (time > self.invincible_finished)
275                 {
276                         self.items = self.items - (self.items & IT_INVINCIBLE);
277                         sprint(self, "Invincible has worn off\n");
278                 }
279         }
280         else
281         {
282                 if (time < self.invincible_finished)
283                 {
284                         self.items = self.items | IT_INVINCIBLE;
285                         sprint(self, "Invincible shielding surrounds you\n");
286                 }
287         }
288         if (self.items & IT_SPEED)
289         {
290                 if (time > self.speed_finished)
291                 {
292                         self.items = self.items - (self.items & IT_SPEED);
293                         sprint(self, "Speed has worn off\n");
294                 }
295         }
296         else
297         {
298                 if (time < self.speed_finished)
299                 {
300                         self.items = self.items | IT_SPEED;
301                         sprint(self, "Speed makes you run faster than ever before\n");
302                 }
303         }
304         if (self.items & IT_SLOWMO)
305         {
306                 if (time > self.slowmo_finished)
307                 {
308                         self.items = self.items - (self.items & IT_SLOWMO);
309                         sprint(self, "Slow Motion has worn off\n");
310                 }
311         }
312         else
313         {
314                 if (time < self.slowmo_finished)
315                 {
316                         self.items = self.items | IT_SLOWMO;
317                         sprint(self, "Slow Motion slows time around you\n");
318                 }
319         }
320         /*
321         self.items = self.items - (self.items & (IT_STRENGTH + IT_INVINCIBLE + IT_SLOWMO + IT_SPEED));
322         if (time < self.strength_finished)
323                 self.items = self.items | IT_STRENGTH;
324         if (time < self.invincible_finished)
325                 self.items = self.items | IT_INVINCIBLE;
326         if (time < self.slowmo_finished)
327                 self.items = self.items | IT_SLOWMO;
328         if (time < self.speed_finished)
329                 self.items = self.items | IT_SPEED;
330         */
331 }
332
333 void player_regen (void)
334 {
335         // GAME_REGENERATION does fast health regeneration up to 200. Note that your armour doesn't rot anymore either.
336         if (game & GAME_REGENERATION)
337         {
338                 self.health = self.health + (200 - self.health) * 0.2 * frametime;
339                 self.armorvalue = bound(0, self.armorvalue, 1000);
340         }
341         else
342         {
343                 self.health = bound(0, self.health + (100 - self.health) * 0.05 * frametime, 1000);
344                 if (self.armorvalue > 100)
345                         self.armorvalue = bound(100, self.armorvalue + (100 - self.armorvalue) * 0.1 * frametime, 1000);
346         }
347 }
348
349 /*
350 =============
351 PlayerPreThink
352
353 Called every frame for each client before the physics are run
354 =============
355 */
356 .float attack_finished;
357 void PlayerPreThink (void)
358 {
359         //if (BotPreFrame())
360         //      return;
361         if (!self.hasaliases)
362             DoAliases();
363
364         if (self.deadflag != DEAD_NO)
365         {
366                 player_anim();
367                 weapon_freeze();
368                 if (self.deadflag == DEAD_DYING)
369                 {
370                         if (time > self.dead_time)
371                                 self.deadflag = DEAD_DEAD;
372                 }
373                 else if (self.deadflag == DEAD_DEAD)
374                 {
375                         if (!self.button0 && !self.button2 && !self.button3)
376                                 self.deadflag = DEAD_RESPAWNABLE;
377                 }
378                 else if (self.deadflag == DEAD_RESPAWNABLE)
379                 {
380                         if (self.button0 || self.button2 || self.button3  || self.button4)
381                                 respawn();
382                 }
383                 return;
384         }
385
386         W_WeaponFrame();
387
388         if (self.button4)
389         {
390                 if (self.viewzoom > 0.4)
391                         self.viewzoom = max (0.4, self.viewzoom - frametime * 2);
392         }
393         else if (self.viewzoom < 1.0)
394                 self.viewzoom = min (1.0, self.viewzoom + frametime);
395
396
397         if (self.button2)
398                 PlayerJump ();
399         else
400                 self.flags = self.flags | FL_JUMPRELEASED;
401
402
403         player_powerups();
404         player_regen();
405         player_anim();
406
407         self.angles_y=self.v_angle_y + 90;   // temp
408
409         //if (TetrisPreFrame()) return;
410 }
411
412 /*
413 =============
414 PlayerPostThink
415
416 Called every frame for each client after the physics are run
417 =============
418 */
419 void PlayerPostThink (void)
420 {
421         float soundrandom;
422         //if (BotPostFrame())
423         //      return;
424         if (self.health > 0)
425         if (self.impulse)
426                 ImpulseCommands ();
427
428         // VorteX: landing on floor, landing damage etc.
429         if (self.flags & FL_ONGROUND)
430         {
431                 if (fabs(self.jump_flag) > 100)
432                 {
433                         if (self.jump_flag < -100 && !self.watertype == CONTENT_WATER) // HitGround
434                         {
435                                 soundrandom = random() * 3;
436                                 if (soundrandom < 1)
437                                         sound (self, CHAN_BODY, "misc/hitground1.wav", 1, ATTN_NORM);
438                                 if (soundrandom < 2)
439                                         sound (self, CHAN_BODY, "misc/hitground2.wav", 1, ATTN_NORM);
440                                 if (soundrandom < 3)
441                                         sound (self, CHAN_BODY, "misc/hitground3.wav", 1, ATTN_NORM);
442                                 if (soundrandom < 4)
443                                         sound (self, CHAN_BODY, "misc/hitground4.wav", 1, ATTN_NORM);
444                                 if (self.jump_flag < -650) // landing damage
445                                 {
446                                         local float dm;
447                                         dm = bound(0, 0.1*(fabs(self.jump_flag) - 600), 5);
448                                         Damage (self, world, world, dm, DEATH_FALL, '0 0 0', '0 0 0');
449                                 }
450                                 self.jump_flag = 0;
451                         }
452                 }
453         }
454         else
455         {
456                 if (self.jump_flag != -10000) // not in falling death
457                 {
458                         self.jump_flag = self.velocity_z;
459                         // check for falling into the void
460                         if (self.jump_flag < -700)
461                         {
462                                 tracebox(self.origin, self.mins, self.maxs, self.origin + '0 0 -1'*2048, MOVE_NORMAL, self);
463                                 if (trace_fraction == 1)
464                                 {// VorteX: add player falling sound here
465                                         self.jump_flag = -10000;
466                                         self.lip = time + 1;
467                                 }
468                         }
469                 }
470                 else
471                 {
472                         if (time < self.lip)
473                         {// prevent all inventory drop
474                                 self.weapon = 0;
475                                 Damage (self, world, world, 40000, DEATH_BIGFALL, '0 0 0', '0 0 0');
476                         }
477                 }
478         }
479
480         //if (TetrisPostFrame()) return;
481 }