1 void info_player_start (void)
3 self.classname = "info_player_deathmatch";
6 void info_player_deathmatch (void)
14 Finds a point to respawn
17 entity SelectSpawnPoint (void)
19 local entity spot, thing;
22 spot = find (world, classname, "testplayerstart");
29 spot = find(spot, classname, "info_player_deathmatch");
32 if (spot == lastspawn)
35 thing = findradius(spot.origin, 70);
38 if (thing.classname == "player")
50 spot = find (world, classname, "info_player_start");
52 error ("PutClientInServer: no info_player_start on level");
62 Called when a client spawns in the server
65 void PutClientInServer (void)
70 spot = SelectSpawnPoint ();
72 self.classname = "player";
73 self.movetype = MOVETYPE_WALK;
74 self.solid = SOLID_SLIDEBOX;
75 self.flags = FL_CLIENT;
76 self.takedamage = DAMAGE_YES;
78 self.health = cvar("g_balance_health");
79 self.damageforcescale = 2;
88 self.pain_finished = 0;
89 self.strength_finished = 0;
90 self.invincible_finished = 0;
91 self.speed_finished = 0;
92 self.slowmo_finished = 0;
93 // players have no think function
94 self.think = nullfunction;
97 self.deadflag = DEAD_NO;
99 self.view_ofs = PL_VIEW_OFS;
100 self.angles = spot.angles;
101 self.fixangle = TRUE; // turn this way immediately
102 self.velocity = '0 0 0';
103 self.avelocity = '0 0 0';
104 self.punchangle = '0 0 0';
105 self.punchvector = '0 0 0';
109 setmodel (self, self.playermodel);
110 self.skin = stof(self.playerskin);
111 setsize (self, PL_MIN, PL_MAX);
112 setorigin (self, spot.origin + '0 0 1' * (1 - self.mins_z - 24));
113 // don't reset back to last position, even if new position is stuck in solid
114 self.oldorigin = self.origin;
116 // self.items = IT_LASER | IT_UZI| IT_SHOTGUN | IT_GRENADE_LAUNCHER | IT_ELECTRO | IT_CRYLINK | IT_NEX | IT_HAGAR | IT_ROCKET_LAUNCHER;
117 // self.weapon = IT_UZI;
119 if (cvar("g_instagib") == 1)
122 self.switchweapon = WEP_NEX;
123 self.ammo_shells = 0;
125 self.ammo_rockets = 0;
126 self.ammo_cells = 999;
128 else if (cvar("g_rocketarena") == 1)
130 self.items = IT_ROCKET_LAUNCHER;
131 self.switchweapon = WEP_ROCKET_LAUNCHER;
132 self.ammo_shells = 0;
134 self.ammo_rockets = 999;
139 self.items = IT_LASER | IT_SHOTGUN;
140 self.switchweapon = WEP_SHOTGUN;
141 self.ammo_shells = 35;
143 self.ammo_rockets = 0;
147 if (cvar("g_fullbrightplayers") == 1)
148 self.effects = EF_FULLBRIGHT;
150 self.event_damage = PlayerDamage;
152 self.statdraintime = time + 5;
153 self.button0 = self.button1 = self.button2 = self.button3 = 0;
159 CL_SpawnWeaponentity();
161 //stuffcmd(self, "chase_active 0");
169 void SetNewParms (void)
179 void SetChangeParms (void)
188 Called when a client types 'kill' in the console
191 void ClientKill (void)
193 Damage(self, self, self, 100000, DEATH_KILL, self.origin, '0 0 0');
200 Called when a client connects to the server
203 void ClientConnect (void)
206 bprint ("^3",self.netname);
207 bprint (" connected\n");
208 stuffcmd(self, "exec maps/");
209 stuffcmd(self, mapname);
210 stuffcmd(self, ".cfg\n");
217 Called when a client disconnects from the server
220 void ClientDisconnect (void)
222 ClientDisconnected();
223 bprint ("^3",self.netname);
224 bprint (" disconnected\n");
231 When you press the jump key
234 void PlayerJump (void)
236 if (self.waterlevel >= 2)
238 if (self.watertype == CONTENT_WATER)
239 self.velocity_z = 200;
240 else if (self.watertype == CONTENT_SLIME)
241 self.velocity_z = 80;
243 self.velocity_z = 50;
249 if (!(self.flags & FL_ONGROUND))
252 if (!(self.flags & FL_JUMPRELEASED))
255 if (self.items & IT_SPEED)
256 self.velocity_z = self.velocity_z + POWERUP_SPEED_JUMPVELOCITY;
258 self.velocity_z = self.velocity_z + cvar("g_balance_jumpheight");
260 self.flags = self.flags - FL_ONGROUND;
261 self.flags = self.flags - FL_JUMPRELEASED;
266 if (self.movetype == MOVETYPE_NOCLIP)
271 if (self.waterlevel != 3)
273 self.air_finished = time + 12;
276 else if (self.air_finished < time)
278 if (self.pain_finished < time)
280 Damage (self, world, world, 5, DEATH_DROWN, '0 0 0', '0 0 0');
281 self.pain_finished = time + 0.5;
285 if (!self.waterlevel)
287 if (self.flags & FL_INWATER)
289 // play leave water sound
290 sound (self, CHAN_BODY, "misc/outwater.wav", 1, ATTN_NORM);
291 self.flags = self.flags - FL_INWATER;
296 if (self.watertype == CONTENT_LAVA)
298 if (self.dmgtime < time)
300 self.dmgtime = time + 0.1;
301 Damage (self, world, world, 3 * self.waterlevel, DEATH_LAVA, '0 0 0', '0 0 0');
304 else if (self.watertype == CONTENT_SLIME)
306 if (self.dmgtime < time)
308 self.dmgtime = time + 0.1;
309 Damage (self, world, world, 1 * self.waterlevel, DEATH_SLIME, '0 0 0', '0 0 0');
313 if ( !(self.flags & FL_INWATER) )
316 //if (self.watertype == CONTENT_LAVA)
317 // sound (self, CHAN_BODY, "player/inlava.wav", 1, ATTN_NORM);
318 //if (self.watertype == CONTENT_WATER)
319 // sound (self, CHAN_BODY, "player/inh2o.wav", 1, ATTN_NORM);
320 //if (self.watertype == CONTENT_SLIME)
321 // sound (self, CHAN_BODY, "player/slimbrn2.wav", 1, ATTN_NORM);
323 self.flags = self.flags + FL_INWATER;
328 void() CheckWaterJump =
330 local vector start, end;
332 // check for a jump-out-of-water
333 makevectors (self.angles);
335 start_z = start_z + 8;
337 normalize(v_forward);
338 end = start + v_forward*24;
339 traceline (start, end, TRUE, self);
340 if (trace_fraction < 1)
342 start_z = start_z + self.maxs_z - 8;
343 end = start + v_forward*24;
344 self.movedir = trace_plane_normal * -50;
345 traceline (start, end, TRUE, self);
346 if (trace_fraction == 1)
347 { // open at eye level
348 self.flags = self.flags | FL_WATERJUMP;
349 self.velocity_z = 225;
350 self.flags = self.flags - (self.flags & FL_JUMPRELEASED);
351 self.teleport_time = time + 2; // safety net
364 void player_powerups (void)
366 if (self.items & IT_STRENGTH)
368 self.effects = self.effects | EF_BLUE;
369 if (time > self.strength_finished)
371 self.items = self.items - (self.items & IT_STRENGTH);
372 sprint(self, "Strength has worn off\n");
377 self.effects = self.effects - (self.effects & EF_BLUE);
378 if (time < self.strength_finished)
380 self.items = self.items | IT_STRENGTH;
381 sprint(self, "Strength infuses your weapons with devestating power\n");
384 if (self.items & IT_INVINCIBLE)
386 self.effects = self.effects | EF_RED;
387 if (time > self.invincible_finished)
389 self.items = self.items - (self.items & IT_INVINCIBLE);
390 sprint(self, "Invincible has worn off\n");
395 self.effects = self.effects - (self.effects & EF_RED);
396 if (time < self.invincible_finished)
398 self.items = self.items | IT_INVINCIBLE;
399 sprint(self, "Invincible shielding surrounds you\n");
402 if (self.items & IT_SPEED)
404 self.effects = self.effects | EF_DIMLIGHT;
405 if (time > self.speed_finished)
407 self.items = self.items - (self.items & IT_SPEED);
408 sprint(self, "Speed has worn off\n");
413 self.effects = self.effects - (self.effects & EF_DIMLIGHT);
414 if (time < self.speed_finished)
416 self.items = self.items | IT_SPEED;
417 sprint(self, "Speed makes you run faster than ever before\n");
420 if (self.items & IT_SLOWMO)
422 self.effects = self.effects | EF_DIMLIGHT;
424 if (time > self.slowmo_finished)
426 self.items = self.items - (self.items & IT_SLOWMO);
427 sprint(self, "Slow Motion has worn off\n");
432 self.effects = self.effects - (self.effects & EF_DIMLIGHT);
433 if (time < self.slowmo_finished)
435 self.items = self.items | IT_SLOWMO;
436 sprint(self, "Slow Motion slows time around you\n");
440 self.items = self.items - (self.items & (IT_STRENGTH + IT_INVINCIBLE + IT_SLOWMO + IT_SPEED));
441 if (time < self.strength_finished)
442 self.items = self.items | IT_STRENGTH;
443 if (time < self.invincible_finished)
444 self.items = self.items | IT_INVINCIBLE;
445 if (time < self.slowmo_finished)
446 self.items = self.items | IT_SLOWMO;
447 if (time < self.speed_finished)
448 self.items = self.items | IT_SPEED;
452 void player_regen (void)
454 if (self.health >= 100 || time > self.pain_finished)
455 self.health = bound(0, self.health + (100 - self.health) * cvar("g_balance_healthregen") * frametime, 1000);
456 if (self.armorvalue > 100)
457 self.armorvalue = bound(100, self.armorvalue + (100 - self.armorvalue) * cvar("g_balance_armorrott") * frametime, 1000);
464 Called every frame for each client before the physics are run
467 .float attack_finished;
468 void PlayerPreThink (void)
475 if (intermission_running)
477 IntermissionThink (); // otherwise a button could be missed between
478 return; // the think tics
483 if (self.deadflag != DEAD_NO)
487 if (self.deadflag == DEAD_DYING)
489 if (time > self.dead_time)
490 self.deadflag = DEAD_DEAD;
492 else if (self.deadflag == DEAD_DEAD)
494 if (!self.button0 && !self.button2 && !self.button3)
495 self.deadflag = DEAD_RESPAWNABLE;
497 else if (self.deadflag == DEAD_RESPAWNABLE)
499 if (self.button0 || self.button2 || self.button3 || self.button4)
505 if (self.playermodel != self.model)
509 setmodel (self, self.playermodel);
510 setsize (self, m1, m2);
513 if (self.skin != stof(self.playerskin))
514 self.skin = stof(self.playerskin);
520 if (self.viewzoom > 0.4)
521 self.viewzoom = max (0.4, self.viewzoom - frametime * 2);
523 else if (self.viewzoom < 1.0)
524 self.viewzoom = min (1.0, self.viewzoom + frametime);
530 self.flags = self.flags | FL_JUMPRELEASED;
537 self.angles_y=self.v_angle_y + 90; // temp
540 if (self.waterlevel == 2)
543 //if (TetrisPreFrame()) return;
550 Called every frame for each client after the physics are run
553 void PlayerPostThink (void)
561 if (intermission_running)
562 return; // intermission or finale
564 // VorteX: landing on floor, landing damage etc.
565 // LordHavoc: removed 'big fall' death code that VorteX added
566 if (self.flags & FL_ONGROUND)
568 if (self.jump_flag < -100 && !self.watertype == CONTENT_WATER) // HitGround
570 soundrandom = random() * 4;
572 sound (self, CHAN_BODY, "misc/hitground1.wav", 1, ATTN_NORM);
573 else if (soundrandom < 2)
574 sound (self, CHAN_BODY, "misc/hitground2.wav", 1, ATTN_NORM);
575 else if (soundrandom < 3)
576 sound (self, CHAN_BODY, "misc/hitground3.wav", 1, ATTN_NORM);
577 else if (soundrandom < 4)
578 sound (self, CHAN_BODY, "misc/hitground4.wav", 1, ATTN_NORM);
579 if (self.jump_flag < -650) // landing damage
582 dm = bound(0, 0.1*(fabs(self.jump_flag) - 600), 5);
583 Damage (self, world, world, dm, DEATH_FALL, '0 0 0', '0 0 0');
589 self.jump_flag = self.velocity_z;
591 //if (TetrisPostFrame()) return;