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
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
17 void CopyBody(float keepvelocity)
20 if (self.effects & EF_NODRAW)
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.norespawn = TRUE;
37 self.skin = oldself.skin;
38 self.solid = oldself.solid;
39 self.takedamage = oldself.takedamage;
40 self.think = oldself.think;
41 if (keepvelocity == 1)
42 self.velocity = oldself.velocity;
43 //self.weapon = oldself.weapon;
44 setorigin(self, oldself.origin);
45 setsize(self, '-16 -16 -24', '16 16 5');
49 void player_anim (void)
51 if (self.deadflag != DEAD_NO)
53 if (time > self.dead_time)
54 self.frame = self.dead_frame;
56 self.frame = self.die_frame;
63 if (self.movement_x * self.movement_x + self.movement_y * self.movement_y > 20)
64 self.frame = $duckwalk;
66 self.frame = $duckidle;
68 else if ((self.movement_x * self.movement_x + self.movement_y * self.movement_y) > 20)
70 if (self.movement_x > 0 && self.movement_y == 0)
72 else if (self.movement_x < 0 && self.movement_y == 0)
73 self.frame = $runbackwards;
74 else if (self.movement_x == 0 && self.movement_y > 0)
75 self.frame = $straferight;
76 else if (self.movement_x == 0 && self.movement_y < 0)
77 self.frame = $strafeleft;
78 else if (self.movement_x > 0 && self.movement_y > 0)
79 self.frame = $forwardright;
80 else if (self.movement_x > 0 && self.movement_y < 0)
81 self.frame = $forwardleft;
82 else if (self.movement_x < 0 && self.movement_y > 0)
83 self.frame = $backright;
84 else if (self.movement_x < 0 && self.movement_y < 0)
85 self.frame = $backleft;
89 else if (self.pain_finished > time)
90 self.frame = self.pain_frame;
91 else if (self.attack_finished > time)
96 if (!(self.flags & FL_ONGROUND))
99 //End change by Supajoe on 11:44 PM EST 11/16/03 (Subject: Player animations)
101 void SpawnThrownWeapon (vector org, float w)
103 local entity oldself;
105 if ((cvar("g_instagib") == 1) | (cvar("g_rocketarena") == 1))
113 setorigin(self, org);
114 self.velocity = randomvec() * 100 + '0 0 200';
116 //SUB_SetFade(self, time + 20);
120 else if (w == WEP_SHOTGUN)
122 else if (w == WEP_GRENADE_LAUNCHER)
123 weapon_grenadelauncher ();
124 else if (w == WEP_ELECTRO)
126 else if (w == WEP_CRYLINK)
128 else if (w == WEP_NEX)
130 else if (w == WEP_HAGAR)
132 else if (w == WEP_ROCKET_LAUNCHER)
133 weapon_rocketlauncher ();
138 void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
140 local float take, save;
141 te_blood (hitloc, force, damage);
142 // damage resistance (ignore most of the damage from a bullet or similar)
143 damage = max(damage - 5, 1);
144 save = bound(0, damage * 0.6, self.armorvalue);
145 take = bound(0, damage - save, damage);
146 self.armorvalue = self.armorvalue - save;
147 self.health = self.health - take;
148 self.dmg_save = self.dmg_save + save;
149 self.dmg_take = self.dmg_take + take;
150 self.dmg_inflictor = inflictor;
151 if (self.health <= -50)
153 // don't use any animations as a gib
157 // view just above the floor
158 self.view_ofs = '0 0 4';
161 te_bloodshower (self.origin + self.mins, self.origin + self.maxs, 800, 1000);
162 te_bloodshower (self.origin + self.mins, self.origin + self.maxs, 400, 1000);
165 TossGib (self, "models/gibs/eye.md3", self.origin, self.velocity,0);
166 TossGib (world, "models/gibs/bloodyskull.md3", self.origin, '0 0 600',0);
168 TossGib (world, "models/gibs/gib1.md3", self.origin, self.velocity,0);
169 TossGib (world, "models/gibs/gib2.md3", self.origin, self.velocity,0);
170 TossGib (world, "models/gibs/gib3.md3", self.origin, self.velocity,0);
171 TossGib (world, "models/gibs/gib4.md3", self.origin, self.velocity,0);
173 // these destory on impact
174 TossGib (world, "models/gibs/gib5.md3", self.origin, '-500 0 450',1);
175 TossGib (world, "models/gibs/gib6.md3", self.origin, '0 500 450',1);
176 TossGib (world, "models/gibs/chunk.mdl", self.origin, '0 -500 450',1);
177 TossGib (world, "models/gibs/chunk.mdl", self.origin, '500 0 450',1);
178 TossGib (world, "models/gibs/chunk.mdl", self.origin, self.velocity,1);
179 TossGib (world, "models/gibs/chunk.mdl", self.origin, '0 0 450',1);
181 sound (trace_ent, CHAN_VOICE, "misc/gib.wav", 1, ATTN_NORM);
185 void PlayerDamage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
187 local float take, save;
189 te_blood (hitloc, force, damage);
190 if (self.pain_finished < time) //Don't switch pain sequences like crazy
193 self.pain_frame = $pain1;
195 self.pain_frame = $pain2;
196 self.pain_finished = time + 0.5; //Supajoe
199 save = bound(0, damage * 0.6, self.armorvalue);
200 take = bound(0, damage - save, damage);
201 self.armorvalue = self.armorvalue - save;
204 sound (self, CHAN_BODY, "misc/armorimpact.wav", 1, ATTN_NORM);
206 sound (self, CHAN_BODY, "misc/bodyimpact1.wav", 1, ATTN_NORM);
208 sound (self, CHAN_BODY, "misc/bodyimpact2.wav", 1, ATTN_NORM);
211 TossGib (world, "models/gibs/chunk.mdl", hitloc, force * -0.1,1);
213 TossGib (world, "models/gibs/chunk.mdl", hitloc, force * -0.1,1);
215 self.health = self.health - take;
216 self.dmg_save = self.dmg_save + save * 0.25;
217 self.dmg_take = self.dmg_take + take * 0.25;
218 self.dmg_inflictor = inflictor;
219 if (self.health <= 0)
222 SpawnThrownWeapon (self.origin + (self.mins + self.maxs) * 0.5, self.weapon);
223 // print an obituary message
224 Obituary (attacker, self, deathtype);
225 // make the corpse upright (not tilted)
229 self.avelocity = '0 0 0';
230 // no weapon when dead
231 self.weaponmodel = "";
233 // view from the floor
234 self.view_ofs = '0 0 -8';
236 self.movetype = MOVETYPE_TOSS;
238 self.solid = SOLID_CORPSE;
239 // don't stick to the floor
240 self.flags = self.flags - (self.flags & FL_ONGROUND);
242 self.deadflag = DEAD_DYING;
243 // when to allow respawn
244 self.death_time = time + 0.5;
245 // when to switch to the dead_frame
246 self.dead_time = time + 1.5;
249 self.die_frame = $die1;
250 self.dead_frame = $dead1;
254 self.die_frame = $die2;
255 self.dead_frame = $dead2;
257 // start the animation
259 // set damage function to corpse damage
260 self.event_damage = PlayerCorpseDamage;
261 // call the corpse damage function just in case it wants to gib
262 self.event_damage(inflictor, attacker, 0, deathtype, hitloc, force);
263 // set up to fade out later
264 SUB_SetFade (self, time + 12 + random () * 4);