]> icculus.org git repositories - divverent/nexuiz.git/blob - qcsrc/gamec/cl_player.c
disabled the 'has taken the lead' till it works
[divverent/nexuiz.git] / qcsrc / gamec / cl_player.c
1 $frame die1 die2 draw duck duckwalk duckjump duckidle idle
2 $frame jump pain1 pain2 shoot taunt run runbackwards
3 $frame strafeleft straferight dead1 dead2 forwardright
4 $frame forwardleft backright backleft
5
6 // changes by LordHavoc on 03/29/04 and 03/30/04 at Vermeulen's request
7 // merged player_run and player_stand to player_anim
8 // added death animations to player_anim
9 // can now spawn thrown weapons from anywhere, not just from players
10 // thrown weapons now fade out after 20 seconds
11 // created PlayerGib function
12 // PlayerDie no longer uses hitloc or damage
13 // PlayerDie now supports dying animations as well as gibbing
14 // cleaned up PlayerDie a lot
15 // added CopyBody
16
17 void CopyBody(float keepvelocity)
18 {
19         local entity oldself;
20         if (self.effects & EF_NODRAW)
21                 return;
22         oldself = self;
23         self = spawn();
24         self.angles = oldself.angles;
25         self.avelocity = oldself.avelocity;
26         self.classname = "body";
27         self.damageforcescale = oldself.damageforcescale;
28         self.effects = oldself.effects;
29         self.event_damage = oldself.event_damage;
30         self.frame = oldself.frame;
31         self.health = oldself.health;
32         self.model = oldself.model;
33         self.modelindex = oldself.modelindex;
34         self.movetype = oldself.movetype;
35         self.nextthink = oldself.nextthink;
36         self.skin = oldself.skin;
37         self.solid = oldself.solid;
38         self.takedamage = oldself.takedamage;
39         self.think = oldself.think;
40         if (keepvelocity == 1)
41                 self.velocity = oldself.velocity;
42         self.fade_time = oldself.fade_time;
43         self.fade_rate = oldself.fade_rate;
44         //self.weapon = oldself.weapon;
45         setorigin(self, oldself.origin);
46         setsize(self, '-16 -16 -24',  '16 16 5');
47         self = oldself;
48 }
49
50 void player_anim (void)
51 {
52         if (self.deadflag != DEAD_NO)
53         {
54                 if (time > self.dead_time)
55                         self.frame = self.dead_frame;
56                 else
57                         self.frame = self.die_frame;
58                 return;
59         }
60
61
62         if (self.crouch)
63         {
64                 if (self.movement_x * self.movement_x + self.movement_y * self.movement_y > 20)
65                         self.frame = $duckwalk;
66                 else
67                         self.frame = $duckidle;
68         }
69         else if ((self.movement_x * self.movement_x + self.movement_y * self.movement_y) > 20)
70         {
71                 if (self.movement_x > 0 && self.movement_y == 0)
72                         self.frame = $run;
73                 else if (self.movement_x < 0 && self.movement_y == 0)
74                         self.frame = $runbackwards;
75                 else if (self.movement_x == 0 && self.movement_y > 0)
76                         self.frame = $straferight;
77                 else if (self.movement_x == 0 && self.movement_y < 0)
78                         self.frame = $strafeleft;
79                 else if (self.movement_x > 0 && self.movement_y > 0)
80                         self.frame = $forwardright;
81                 else if (self.movement_x > 0 && self.movement_y < 0)
82                         self.frame = $forwardleft;
83                 else if (self.movement_x < 0 && self.movement_y > 0)
84                         self.frame = $backright;
85                 else if (self.movement_x < 0 && self.movement_y < 0)
86                         self.frame = $backleft;
87                 else
88                         self.frame = $run;
89         }
90         else if (self.pain_finished > time)
91                 self.frame = self.pain_frame;
92         else if (self.attack_finished > time)
93                 self.frame = $shoot;
94         else
95                 self.frame = $idle;
96
97         if (!(self.flags & FL_ONGROUND))
98                 self.frame = $jump;
99 }
100 //End change by Supajoe on 11:44 PM EST 11/16/03 (Subject: Player animations)
101
102 void SpawnThrownWeapon (vector org, float w)
103 {
104         local entity oldself;
105
106         if ((cvar("g_instagib") == 1) | (cvar("g_rocketarena") == 1))
107                 return;
108         if (w == IT_LASER)
109                 return;
110
111         oldself = self;
112         self = spawn();
113         // this will cause it to be removed later
114         self.classname = "droppedweapon";
115
116         setorigin(self, org);
117         self.velocity = randomvec() * 100 + '0 0 200';
118         SUB_SetFade(self, time + 20, 1);
119
120         if (w == WEP_UZI)
121                 weapon_uzi ();
122         else if (w == WEP_SHOTGUN)
123                 weapon_shotgun ();
124         else if (w == WEP_GRENADE_LAUNCHER)
125                 weapon_grenadelauncher ();
126         else if (w == WEP_ELECTRO)
127                 weapon_electro ();
128         else if (w == WEP_CRYLINK)
129                 weapon_crylink ();
130         else if (w == WEP_NEX)
131                 weapon_nex ();
132         else if (w == WEP_HAGAR)
133                 weapon_hagar ();
134         else if (w == WEP_ROCKET_LAUNCHER)
135                 weapon_rocketlauncher ();
136
137         self = oldself;
138 }
139
140 void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
141 {
142         local float take, save;
143         te_blood (hitloc, force, damage);
144         // damage resistance (ignore most of the damage from a bullet or similar)
145         damage = max(damage - 5, 1);
146         save = bound(0, damage * 0.6, self.armorvalue);
147         take = bound(0, damage - save, damage);
148         self.armorvalue = self.armorvalue - save;
149         self.health = self.health - take;
150         self.dmg_save = self.dmg_save + save;
151         self.dmg_take = self.dmg_take + take;
152         self.dmg_inflictor = inflictor;
153         if (self.health <= -50)
154         {
155                 // don't use any animations as a gib
156                 self.frame = 0;
157                 self.dead_frame = 0;
158                 self.die_frame = 0;
159                 // view just above the floor
160                 self.view_ofs = '0 0 4';
161
162                 // make a juicy mess
163                 te_bloodshower (self.origin + self.mins, self.origin + self.maxs, 800, 1000);
164                 te_bloodshower (self.origin + self.mins, self.origin + self.maxs, 400, 1000);
165
166                 // make a meaty mess
167                 TossGib (self, "models/gibs/eye.md3", self.origin, self.velocity,0);
168                 TossGib (world, "models/gibs/bloodyskull.md3", self.origin, '0 0 600',0);
169
170                 TossGib (world, "models/gibs/gib1.md3", self.origin, self.velocity,0);
171                 TossGib (world, "models/gibs/gib2.md3", self.origin, self.velocity,0);
172                 TossGib (world, "models/gibs/gib3.md3", self.origin, self.velocity,0);
173                 TossGib (world, "models/gibs/gib4.md3", self.origin, self.velocity,0);
174
175                 // these destory on impact
176                 TossGib (world, "models/gibs/gib5.md3", self.origin, '-500 0 450',1);
177                 TossGib (world, "models/gibs/gib6.md3", self.origin, '0 500 450',1);
178                 TossGib (world, "models/gibs/chunk.mdl", self.origin, '0 -500 450',1);
179                 TossGib (world, "models/gibs/chunk.mdl", self.origin, '500 0 450',1);
180                 TossGib (world, "models/gibs/chunk.mdl", self.origin, self.velocity,1);
181                 TossGib (world, "models/gibs/chunk.mdl", self.origin, '0 0 450',1);
182
183                 sound (trace_ent, CHAN_VOICE, "misc/gib.wav", 1, ATTN_NORM);
184         }
185 }
186
187 void PlayerDamage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
188 {
189         local float take, save;
190
191          te_blood (hitloc, force, damage);
192         if (self.pain_finished < time)          //Don't switch pain sequences like crazy
193         {
194                 if (random() > 0.5)
195                         self.pain_frame = $pain1;
196                 else
197                         self.pain_frame = $pain2;
198                 self.pain_finished = time + 0.5;        //Supajoe
199         }
200
201         save = bound(0, damage * 0.6, self.armorvalue);
202         take = bound(0, damage - save, damage);
203
204         if (save > 10)
205                 sound (self, CHAN_BODY, "misc/armorimpact.wav", 1, ATTN_NORM);
206         if (take > 10)
207                 sound (self, CHAN_BODY, "misc/bodyimpact1.wav", 1, ATTN_NORM);
208         if (take > 30)
209                 sound (self, CHAN_BODY, "misc/bodyimpact2.wav", 1, ATTN_NORM);
210
211         if (take > 50)
212                 TossGib (world, "models/gibs/chunk.mdl", hitloc, force * -0.1,1);
213         if (take > 100)
214                 TossGib (world, "models/gibs/chunk.mdl", hitloc, force * -0.1,1);
215
216         if (!(self.flags & FL_GODMODE))
217         {
218                 self.armorvalue = self.armorvalue - save;
219                 self.health = self.health - take;
220         }
221         self.dmg_save = self.dmg_save + max(save - 10, 0);
222         self.dmg_take = self.dmg_take + max(take - 10, 0);
223         self.dmg_inflictor = inflictor;
224         if (self.health <= 2)
225         {
226                 // throw a weapon
227                 SpawnThrownWeapon (self.origin + (self.mins + self.maxs) * 0.5, self.weapon);
228                 // print an obituary message
229                 Obituary (attacker, self, deathtype);
230                 // make the corpse upright (not tilted)
231                 self.angles_x = 0;
232                 self.angles_z = 0;
233                 // don't spin
234                 self.avelocity = '0 0 0';
235                 // no weapon when dead
236                 self.weaponmodel = "";
237                 w_clear();
238                 // view from the floor
239                 self.view_ofs = '0 0 -8';
240                 // toss the corpse
241                 self.movetype = MOVETYPE_TOSS;
242                 // shootable corpse
243                 self.solid = SOLID_CORPSE;
244                 // don't stick to the floor
245                 self.flags = self.flags - (self.flags & FL_ONGROUND);
246                 // dying animation
247                 self.deadflag = DEAD_DYING;
248                 // when to allow respawn
249                 self.death_time = time + 0.5;
250                 // when to switch to the dead_frame
251                 self.dead_time = time + 2;
252                 if (random() < 0.5)
253                 {
254                         self.die_frame = $die1;
255                         self.dead_frame = $dead1;
256                 }
257                 else
258                 {
259                         self.die_frame = $die2;
260                         self.dead_frame = $dead2;
261                 }
262                 // start the animation
263                 player_anim();
264                 // set damage function to corpse damage
265                 self.event_damage = PlayerCorpseDamage;
266                 // call the corpse damage function just in case it wants to gib
267                 self.event_damage(inflictor, attacker, 0, deathtype, hitloc, force);
268                 // set up to fade out later
269                 SUB_SetFade (self, time + 12 + random () * 4, 1);
270         }
271 }
272