]> icculus.org git repositories - divverent/nexuiz.git/blob - qcsrc/player.qc
Added a makefile
[divverent/nexuiz.git] / qcsrc / player.qc
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()
18 {
19         local entity oldself;
20         oldself = self;
21         self = spawn();
22         self.angles = oldself.angles;
23         self.avelocity = oldself.avelocity;
24         self.classname = "body";
25         self.damageforcescale = oldself.damageforcescale;
26         self.effects = oldself.effects;
27         self.event_damage = oldself.event_damage;
28         self.frame = oldself.frame;
29         self.health = oldself.health;
30         self.model = oldself.model;
31         self.modelindex = oldself.modelindex;
32         self.movetype = oldself.movetype;
33         self.nextthink = oldself.nextthink;
34         self.norespawn = TRUE;
35         self.skin = oldself.skin;
36         self.solid = oldself.solid;
37         self.takedamage = oldself.takedamage;
38         self.think = oldself.think;
39         self.velocity = oldself.velocity;
40         self.weapon = oldself.weapon;
41         setorigin(self, oldself.origin);
42         setsize(self, '-16 -16 -24',  '16 16 5');
43         self = oldself;
44 }
45
46 //Begin change by Supajoe on 11:44 PM EST 11/16/03 (Subject: Player animations)
47 // LordHavoc: lots of changes
48 void player_anim (void)
49 {
50         if (self.deadflag != DEAD_NO)
51         {
52                 if (time > self.dead_time)
53                         self.frame = self.dead_frame;
54                 else
55                         self.frame = self.die_frame;
56                 SUB_SetFade (self, time + 12 + random () * 4);
57                 return;
58         }
59         /* LordHavoc: crouching was canceled
60         if (self.crouch)
61         {
62                 // duck
63                 if (self.movement_x * self.movement_x + self.movement_y * self.movement_y > 20)
64                         self.frame = $duckwalk;
65                 else
66                         self.frame = $duckidle;
67         }
68         else
69         */
70         if ((self.movement_x * self.movement_x + self.movement_y * self.movement_y) > 20)
71         {
72                 if (self.movement_x > 0 && self.movement_y == 0)
73                         self.frame = $run;
74                 else if (self.movement_x < 0 && self.movement_y == 0)
75                         self.frame = $runbackwards;
76                 else if (self.movement_x == 0 && self.movement_y > 0)
77                         self.frame = $straferight;
78                 else if (self.movement_x == 0 && self.movement_y < 0)
79                         self.frame = $strafeleft;
80                 else if (self.movement_x > 0 && self.movement_y > 0)
81                         self.frame = $forwardright;
82                 else if (self.movement_x > 0 && self.movement_y < 0)
83                         self.frame = $forwardleft;
84                 else if (self.movement_x < 0 && self.movement_y > 0)
85                         self.frame = $backright;
86                 else if (self.movement_x < 0 && self.movement_y < 0)
87                         self.frame = $backleft;
88                 else
89                         self.frame = $run;
90         }
91         else if (self.pain_finished > time)
92                 self.frame = self.pain_frame;
93         else if (self.attack_finished > time)
94                 self.frame = $shoot;
95         else
96                 self.frame = $idle;
97 }
98 //End change by Supajoe on 11:44 PM EST 11/16/03 (Subject: Player animations)
99
100 void SpawnThrownWeapon (vector org, float w)
101 {
102         local entity oldself;
103
104         if (w == IT_LASER)
105                 return;
106
107         oldself = self;
108         self = spawn();
109
110         setorigin(self, org);
111         self.velocity = randomvec() * 100 + '0 0 200';
112         self.norespawn = 1;
113         SUB_SetFade(self, time + 20);
114
115         if (w == IT_UZI)
116                 weapon_uzi ();
117         else if (w == IT_SHOTGUN)
118                 weapon_shotgun ();
119         else if (w == IT_GRENADE_LAUNCHER)
120                 weapon_grenadelauncher ();
121         else if (w == IT_ELECTRO)
122                 weapon_electro ();
123         else if (w == IT_CRYLINK)
124                 weapon_crylink ();
125         else if (w == IT_NEX)
126                 weapon_nex ();
127         else if (w == IT_HAGAR)
128                 weapon_hagar ();
129         else //if (w == IT_ROCKET_LAUNCHER)
130                 weapon_rocketlauncher ();
131
132         self = oldself;
133 }
134
135 void PlayerCorpseDamage (vector hitloc, float damage, entity inflictor, entity attacker, float deathtype)
136 {
137         te_blood (hitloc, '0 0 20', damage);
138         // damage resistance (ignore most of the damage from a bullet or similar)
139         damage = max(damage - 5, 1);
140         self.health = self.health - damage;
141         self.dmg_take = self.dmg_take + damage;
142         self.dmg_inflictor = inflictor;
143         if (self.health <= -70)
144         {
145                 // don't use any animations as a gib
146                 self.frame = 0;
147                 self.dead_frame = 0;
148                 self.die_frame = 0;
149                 // view just above the floor
150                 self.view_ofs = '0 0 4';
151                 // make a juicy mess
152                 te_bloodshower (self.origin + self.mins, self.origin + self.maxs, 600, 500);
153                 // make a meaty mess
154                 TossGib (world, "models/gibs/gib1.mdl", self.origin, self.velocity);
155                 TossGib (world, "models/gibs/gib2.mdl", self.origin, self.velocity);
156                 TossGib (world, "models/gibs/gib3.mdl", self.origin, self.velocity);
157                 TossGib (world, "models/gibs/gib4.mdl", self.origin, self.velocity);
158                 TossGib (world, "models/gibs/bloodyskull.md3", self.origin, self.velocity);
159                 TossGib (self, "models/gibs/eye.md3", self.origin, self.velocity);
160         }
161 }
162
163 void PlayerDamage (vector hitloc, float damage, entity inflictor, entity attacker, float deathtype)
164 {
165         te_blood (hitloc, '0 0 20', damage);
166         if (self.pain_finished < time)          //Don't switch pain sequences like crazy
167         {
168                 if (random() > 0.5)
169                         self.pain_frame = $pain1;
170                 else
171                         self.pain_frame = $pain2;
172                 self.pain_finished = time + 0.5;        //Supajoe
173         }
174         self.health = self.health - damage;
175         self.dmg_take = self.dmg_take + damage;
176         self.dmg_inflictor = inflictor;
177         if (self.health <= 0)
178         {
179                 // print an obituary message
180                 Obituary (attacker, self, deathtype);
181                 // make the corpse upright (not tilted)
182                 self.angles_x = 0;
183                 self.angles_z = 0;
184                 // don't spin
185                 self.avelocity = '0 0 0';
186                 // no weapon when dead
187                 self.weaponmodel = "";
188                 // view from the floor
189                 self.view_ofs = '0 0 -8';
190                 // toss the corpse
191                 self.movetype = MOVETYPE_TOSS;
192                 // shootable corpse
193                 self.solid = SOLID_CORPSE;
194                 // don't stick to the floor
195                 self.flags = self.flags - (self.flags & FL_ONGROUND);
196                 // dying animation
197                 self.deadflag = DEAD_DYING;
198                 // when to allow respawn
199                 self.death_time = time + 2;
200                 // when to switch to the dead_frame
201                 self.dead_time = time + 2;
202                 if (random() < 0.5)
203                 {
204                         self.die_frame = $die1;
205                         self.dead_frame = $dead1;
206                 }
207                 else
208                 {
209                         self.die_frame = $die2;
210                         self.dead_frame = $dead2;
211                 }
212                 // start the animation
213                 player_anim();
214                 // throw a weapon
215                 SpawnThrownWeapon (self.origin + (self.mins + self.maxs) * 0.5, self.weapon);
216                 // set damage function to corpse damage
217                 self.event_damage = PlayerCorpseDamage;
218                 // call the corpse damage function just in case it wants to gib
219                 self.event_damage(hitloc, 0, inflictor, attacker, deathtype);
220         }
221 }
222