1 void () info_player_start;
\r
2 void (entity targ, entity attacker) ClientObituary;
\r
3 void (entity Goal, entity AP, float addb) DoResults;
\r
4 float (entity Goal, entity AP) Activated;
\r
5 float (entity targ, entity attacker, float damage) TeamEqualiseDamage; // TBA Add function for this
\r
8 float deathmsg; // Gonna have to make this work with NexTF's
\r
10 //compiler-satisfying vars (Add these to defs)
\r
11 .void() th_die; // The function that gets executed when something "dies"
\r
12 .void(entity attacker, float damage) th_pain; // Function that's executed when an entity gets hit(?)
\r
13 float skill; // Skill level. Moot in NexTF (no SP, and bots use some other var)
\r
14 .float super_damage_finished; //quad damage over <- convert this to work with nex!
\r
15 entity damage_attacker;
\r
16 .float immune_to_check; // as it says
\r
17 float rj; // not sure, really..
\r
20 float is_ally (entity targ, entity attacker) {
\r
21 if(targ.team_no == attacker.team_no)
\r
25 //if(targ.class == CLASS_CIVILIAN)
\r
33 void () monster_death_use =
\r
35 if ((self.flags & 1))
\r
37 self.flags = (self.flags - 1);
\r
39 if ((self.flags & 2))
\r
41 self.flags = (self.flags - 2);
\r
47 activator = self.enemy;
\r
51 float (entity targ, entity inflictor) CanDamage =
\r
53 if ((targ.movetype == 7))
\r
55 traceline (inflictor.origin, (0.5 * (targ.absmin + targ.absmax)), 1, self);
\r
56 if ((trace_fraction == 1))
\r
60 if ((trace_ent == targ))
\r
66 traceline (inflictor.origin, targ.origin, 1, self);
\r
67 if ((trace_fraction == 1))
\r
71 traceline (inflictor.origin, (targ.origin + '15 15 0'), 1, self);
\r
72 if ((trace_fraction == 1))
\r
76 traceline (inflictor.origin, (targ.origin + '-15 -15 0'), 1, self);
\r
77 if ((trace_fraction == 1))
\r
81 traceline (inflictor.origin, (targ.origin + '-15 15 0'), 1, self);
\r
82 if ((trace_fraction == 1))
\r
86 traceline (inflictor.origin, (targ.origin + '15 -15 0'), 1, self);
\r
87 if ((trace_fraction == 1))
\r
94 void (entity targ, entity attacker) Killed =
\r
100 if ((self.health < -99))
\r
104 if (((self.movetype == 7) || (self.movetype == 0)))
\r
110 if (self.classname == "building_tesla")
\r
116 if (self.th_die && self.classname != "player") // so objects and buildings use their proper death functions
\r
122 self.enemy = attacker;
\r
123 if ((self.flags & 32))
\r
125 killed_monsters = (killed_monsters + 1);
\r
128 // ClientObituary (self, attacker); // causing crash :/
\r
129 // Obituary (attacker, targ, deathmsg);
\r
130 self.takedamage = 0;
\r
131 self.touch = SUB_Null;
\r
132 monster_death_use ();
\r
134 // (float unnatural_death, entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force
\r
135 PlayerKilled (0, targ, attacker, 0, deathmsg);
\r
139 void (entity targ, entity inflictor, entity attacker, float damage) T_Damage =
\r
142 local entity oldself;
\r
147 local float damagearmor;
\r
149 if (targ.team_no < 1 && targ.classname != "func_button" && targ.classname != "door" && targ.classname != "building_tesla" && targ.netname != "proxi") // TEMP
\r
154 /*if (targ.classname == "building_tesla")
\r
156 targ.health = (targ.health - take);
\r
157 if ((targ.health <= 0))
\r
159 Killed (targ, attacker);
\r
163 if (targ.pain_finished < time) //Don't switch pain sequences like crazy
\r
165 if (random() > 0.5)
\r
166 targ.pain_frame = $pain1;
\r
168 targ.pain_frame = $pain2;
\r
169 targ.pain_finished = time + 0.5; //Supajoe
\r
171 if(targ.class == CLASS_MEDIC)
\r
173 if(deathmsg == DEATH_BURNING)
\r
174 damage = 0; // being on fire or near burning targets does nothing to medics
\r
175 // the flame thrower, flame rockets, and hotbombs also do minimal damage
\r
176 else if(deathmsg == WEP_FLAMER ||
\r
177 deathmsg == WEP_ROCKET_INCENDIARY ||
\r
178 deathmsg == WEP_HOTBOMBS)
\r
179 damage = damage * cvar("g_balance_class_medic_flame_takedamage");
\r
183 if (!targ.takedamage)
\r
187 if ((attacker.classname == "player"))
\r
189 damage = (damage * 0.9);
\r
191 if ((attacker.classname == "player"))
\r
193 if ((attacker.strength_finished > time))
\r
195 damage = (damage * 4);
\r
197 if (((targ.classname != "player") && (targ.classname != "bot") && (targ.classname != "building_tesla")))
\r
199 if (!Activated (targ, attacker))
\r
201 if ((targ.else_goal != 0))
\r
203 te = Findgoal (targ.else_goal);
\r
206 AttemptToActivate (te, attacker, targ);
\r
213 damage_attacker = attacker;
\r
214 if ((teamplay & (64 | 32)))
\r
216 damage = TeamEqualiseDamage (targ, attacker, damage);
\r
218 save = ceil ((targ.armortype * damage));
\r
219 if ((save >= targ.armorvalue))
\r
221 save = targ.armorvalue;
\r
222 targ.armortype = 0;
\r
223 targ.armorclass = 0;
\r
224 targ.items = (targ.items - (targ.items & ((8192 | 16384) | 32768)));
\r
227 targ.armorvalue = (targ.armorvalue - save);
\r
228 take = ceil ((damage - save));
\r
229 if ((targ.flags & 8))
\r
231 targ.dmg_take = (targ.dmg_take + take);
\r
232 targ.dmg_save = (targ.dmg_save + save);
\r
233 targ.dmg_inflictor = inflictor;
\r
235 if (((inflictor != world) && (targ.movetype == 3)))
\r
237 targ.immune_to_check = (time + (damage / 20));
\r
238 dir = (targ.origin - ((inflictor.absmin + inflictor.absmax) * 0.5));
\r
239 dir = normalize (dir);
\r
240 if ((((damage < 60) & ((attacker.classname == "player") & (targ.classname == "player"))) & (attacker.netname != targ.netname)))
\r
242 targ.velocity = (targ.velocity + ((dir * damage) * 11));
\r
246 targ.velocity = (targ.velocity + ((dir * damage) * 8));
\r
248 if ((((rj > 1) & ((attacker.classname == "player") & (targ.classname == "player"))) & (attacker.netname == targ.netname)))
\r
250 targ.velocity = (targ.velocity + ((dir * damage) * rj));
\r
253 if ((targ.flags & 64))
\r
257 if ((targ.invincible_finished >= time))
\r
259 if ((self.invincible_sound < time))
\r
261 sound (targ, 3, "items/protect3.wav", 1, 1);
\r
262 self.invincible_sound = (time + 2);
\r
266 if (((attacker.classname == "player") && ((targ.classname == "player") || (targ.classname == "building_sentrygun"))))
\r
268 if ((((targ.team_no > 0) && (targ.team_no == attacker.team_no)) && (targ != attacker)))
\r
270 if ((teamplay & 16))
\r
276 if ((teamplay & 8))
\r
284 // MOVED HERE FROM PlayerDamage -- need to port the rest
\r
285 // how much damage to deal to armor
\r
286 damagearmor = bound(0, damage * 0.2 * (targ.armorvalue / 50) * cvar("g_balance_armor_takedamage"), targ.armorvalue);
\r
287 // how much damage armor blocks
\r
288 save = bound(0, damage * (targ.armorvalue / 100) * cvar("g_balance_armor_effectiveness"), damage);
\r
289 // how much damage to deal to player
\r
290 take = bound(0, damage - save, damage);
\r
291 targ.armorvalue = targ.armorvalue - damagearmor;
\r
292 DelayArmorRegen(targ);
\r
294 // if being telefragged or killed by a death trigger etc, don't block that
\r
295 /* if(PlayerShouldDie(inflictor, attacker, damage, deathtype))
\r
298 take = damage; // deal full damage
\r
302 // keep the damage the armor allowed through, and further reduce it if the player is using the shield
\r
303 if(targ.class == CLASS_SCOUT)
\r
304 take = SpecialShieldProtect(take);
\r
307 if (((take < 1) && (take != 0)))
\r
312 if (((attacker.classname == "player") && (((((((targ.classname == "player") || (targ.classname == "building_sentrygun")) || (targ.classname == "building_tesla")) || (targ.classname == "building_teleporter")) || (targ.classname == "building_camera")) || (targ.classname == "monster_helo")) || (targ.classname == "laser_drone"))))
\r
314 if ((((targ.team_no > 0) && (targ.team_no == attacker.team_no)) && (targ != attacker)))
\r
316 if ((teamplay & 16))
\r
322 if ((teamplay & 8))
\r
330 targ.health = (targ.health - take);
\r
331 if ((targ.armorvalue < 1))
\r
333 targ.armorclass = 0;
\r
334 targ.armorvalue = 0;
\r
336 if ((targ.health <= 0))
\r
338 Killed (targ, attacker);
\r
345 self.th_pain (attacker, take);
\r
348 self.pain_finished = (time + 5);
\r
354 void (entity targ, entity inflictor, entity attacker, float damage, float T_flags, float T_AttackType) TF_T_Damage =
\r
357 local entity oldself;
\r
361 local float olddmsg;
\r
362 local float no_damage;
\r
363 local float moment;
\r
365 if (targ.team_no < 1 && targ.classname != "func_button" && targ.classname != "door" && targ.classname != "building_tesla" && targ.netname != "proxi") // TEMP
\r
369 if ((targ.takedamage == 0))
\r
373 if ((T_AttackType & 256))
\r
375 targ.health = damage;
\r
378 /*if (cease_fire) // this aint needed
\r
383 if ((attacker.classname == "player"))
\r
385 damage = (damage * 0.9);
\r
386 if ((attacker.strength_finished > time))
\r
388 damage = (damage * 4);
\r
390 if ((((((((((((targ.classname != "player") && (targ.classname != "bot")) && (targ.classname != "building_tesla")) && (targ.classname != "building_sentrygun")) && (targ.classname != "building_dispenser")) && (targ.classname != "trip_bomb")) && (targ.classname != "building_teleporter")) && (targ.classname != "building_camera")) && (targ.classname != "probe")) && (targ.classname != "monster_helo")) && (targ.classname != "laser_drone")))
\r
392 if (!Activated (targ, attacker))
\r
394 if ((targ.else_goal != 0))
\r
396 te = Findgoal (targ.else_goal);
\r
399 AttemptToActivate (te, attacker, targ);
\r
406 damage_attacker = attacker;
\r
407 if ((teamplay & (64 | 32)))
\r
409 damage = TeamEqualiseDamage (targ, attacker, damage);
\r
411 if (((targ.armorclass != 0) && (T_AttackType != 0)))
\r
413 if (((targ.armorclass & 1) && (T_AttackType & 1)))
\r
415 damage = floor ((damage * 0.5));
\r
417 if (((targ.armorclass & 2) && (T_AttackType & 2)))
\r
419 damage = floor ((damage * 0.5));
\r
421 if (((targ.armorclass & 4) && (T_AttackType & 4)))
\r
423 damage = floor ((damage * 0.5));
\r
425 if (((targ.armorclass & 8) && (T_AttackType & 8)))
\r
427 damage = floor ((damage * 0.5));
\r
429 if (((targ.armorclass & 16) && (T_AttackType & 16)))
\r
431 damage = floor ((damage * 0.5));
\r
441 save = ceil ((targ.armortype * damage));
\r
442 if ((((((attacker.classname == "player") && (targ.team_no > 0)) && (targ.team_no == attacker.team_no)) && (targ != attacker)) && (T_flags & 2)))
\r
444 if ((T_AttackType & 4))
\r
446 if ((teamplay & 1024))
\r
452 if ((teamplay & 512))
\r
460 if ((teamplay & 256))
\r
466 if ((teamplay & 128))
\r
473 if ((save >= targ.armorvalue))
\r
475 save = targ.armorvalue;
\r
476 targ.armortype = 0;
\r
477 targ.armorclass = 0;
\r
478 targ.items = (targ.items - (targ.items & ((8192 | 16384) | 32768)));
\r
480 targ.armorvalue = (targ.armorvalue - save);
\r
481 take = ceil ((damage - save));
\r
483 if ((targ.flags & 8))
\r
485 targ.dmg_take = (targ.dmg_take + take);
\r
486 targ.dmg_save = (targ.dmg_save + save);
\r
487 targ.dmg_inflictor = inflictor;
\r
489 if ((((inflictor != world) && (targ.movetype == 3)) && !(targ.tfstate & 65536)))
\r
491 if ((deathmsg != 9))
\r
493 targ.immune_to_check = (time + (damage / 20));
\r
494 dir = (targ.origin - ((inflictor.absmin + inflictor.absmax) * 0.5));
\r
495 dir = normalize (dir);
\r
496 /*if ((targ.class == 6)) // moot function -- NexTF doesnt have an HWGuy
\r
498 moment = (damage / 4);
\r
499 if ((damage <= 50))
\r
508 if ((((moment < 60) && ((attacker.classname == "player") && (targ.classname == "player"))) && (attacker.netname != targ.netname)))
\r
510 targ.velocity = (targ.velocity + ((dir * moment) * 11));
\r
514 targ.velocity = (targ.velocity + ((dir * moment) * 8));
\r
516 if ((((rj > 1) && ((attacker.classname == "player") && (targ.classname == "player"))) && (attacker.netname == targ.netname)))
\r
518 targ.velocity = (targ.velocity + ((dir * moment) * rj));
\r
522 if ((targ.flags & 64))
\r
526 if ((targ.invincible_finished >= time))
\r
528 if ((self.invincible_sound < time))
\r
530 sound (targ, 3, "items/protect3.wav", 1, 1);
\r
531 self.invincible_sound = (time + 2);
\r
535 // if (((attacker.classname == "player") && (((((targ.classname == "player") || (targ.classname == "building_sentrygun")) || (targ.classname == "building_dispenser")) || (targ.classname == "building_teleporter_entrance")) || (targ.classname == "building_teleporter_exit"))))
\r
536 if (((attacker.classname == "player") && ((((((targ.classname == "player") || (targ.classname == "building_sentrygun")) || (targ.classname == "building_tesla")) || (targ.classname == "building_teleporter")) || (targ.classname == "building_camera")) || (targ.classname == "laser_drone"))))
\r
538 if (((((targ.team_no > 0) && (targ.team_no == attacker.team_no)) && (targ != attacker)) && (T_flags & 2)))
\r
540 if ((T_AttackType & 4))
\r
542 if ((teamplay & 16))
\r
548 if ((teamplay & 8))
\r
556 if ((teamplay & 4))
\r
562 if ((teamplay & 2))
\r
572 if ((targ == attacker))
\r
578 local float damagearmor;
\r
579 // MOVED HERE FROM PlayerDamage -- need to port the rest
\r
580 // how much damage to deal to armor
\r
581 damagearmor = bound(0, damage * 0.2 * (targ.armorvalue / 50) * cvar("g_balance_armor_takedamage"), targ.armorvalue);
\r
582 // how much damage armor blocks
\r
583 save = bound(0, damage * (targ.armorvalue / 100) * cvar("g_balance_armor_effectiveness"), damage);
\r
584 // how much damage to deal to player
\r
585 take = bound(0, damage - save, damage);
\r
586 targ.armorvalue = targ.armorvalue - damagearmor;
\r
587 DelayArmorRegen(targ);
\r
593 take = rint (take);
\r
594 if ((no_damage == 0))
\r
596 targ.health = (targ.health - take);
\r
598 if (((attacker.classname == "player") && (((((targ.classname == "player") || (targ.classname == "building_sentrygun")) || (targ.classname == "building_dispenser")) || (targ.classname == "building_teleporter_entrance")) || (targ.classname == "building_teleporter_exit"))))
\r
600 if (((((targ.team_no > 0) && (targ.team_no == attacker.team_no)) && (targ != attacker)) && (T_flags & 2)))
\r
602 olddmsg = deathmsg;
\r
603 if ((T_AttackType & 4))
\r
606 if ((teamplay & 16384))
\r
608 TF_T_Damage (attacker, world, world, take, 1, 0);
\r
612 if ((teamplay & 8192))
\r
614 TF_T_Damage (attacker, world, world, (take / 2), 1, 0);
\r
621 if ((teamplay & 4096))
\r
623 TF_T_Damage (attacker, world, world, take, 1, 0);
\r
627 if ((teamplay & 2048))
\r
629 TF_T_Damage (attacker, world, world, (take / 2), 1, 0);
\r
633 deathmsg = olddmsg;
\r
636 if ((no_damage == 1))
\r
640 if ((targ.armorvalue < 1))
\r
642 targ.armorclass = 0;
\r
643 targ.armorvalue = 0;
\r
645 if ((targ.health <= 0))
\r
647 if ((((inflictor.classname == "detpack") && (inflictor.weaponmode == 1)) && (inflictor.enemy == targ)))
\r
651 Killed (targ, attacker);
\r
658 self.th_pain (attacker, take);
\r
661 self.pain_finished = (time + 5);
\r
667 void (entity inflictor, entity attacker, float damage, entity ignore) T_RadiusDamage =
\r
669 local float points;
\r
671 local vector org; ////
\r
673 head = findradius (inflictor.origin, (damage + 40));
\r
676 if ((head != ignore))
\r
678 if (head.takedamage)
\r
680 org = (head.origin + ((head.mins + head.maxs) * 0.5));
\r
681 points = (0.5 * vlen ((inflictor.origin - org)));
\r
686 points = (damage - points);
\r
687 if ((head == attacker))
\r
689 points = (points * 0.75);
\r
693 if (CanDamage (head, inflictor))
\r
695 if ((head.classname == "monster_shambler"))
\r
697 T_Damage (head, inflictor, attacker, (points * 0.5));
\r
701 TF_T_Damage (head, inflictor, attacker, points, 2, 4);
\r