]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/cl_player.qc
#include this
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / cl_player.qc
index 17569147fb091d9e08f9ee4ea7e877287c69f34d..32cd5f8db8cba3e64133861d2834a1d10ada5dce 100644 (file)
@@ -1,3 +1,29 @@
+#if defined(CSQC)
+#elif defined(MENUQC)
+#elif defined(SVQC)
+       #include "../dpdefs/progsdefs.qc"
+    #include "../dpdefs/dpextensions.qc"
+    #include "sys-post.qh"
+    #include "../common/constants.qh"
+    #include "../common/teams.qh"
+    #include "../common/util.qh"
+    #include "../common/animdecide.qh"
+    #include "../common/weapons/weapons.qh"
+    #include "weapons/accuracy.qh"
+    #include "t_items.qh"
+    #include "autocvars.qh"
+    #include "constants.qh"
+    #include "defs.qh"
+    #include "../common/deathtypes.qh"
+    #include "mutators/mutators_include.qh"
+    #include "../common/mapinfo.qh"
+    #include "command/common.qh"
+    #include "../csqcmodellib/sv_model.qh"
+    #include "cheats.qh"
+    #include "../common/playerstats.qh"
+    #include "portals.qh"
+#endif
+
 .entity pusher;
 .float pushltime;
 .float istypefrag;
@@ -91,7 +117,8 @@ void CopyBody(float keepvelocity)
        self.nextthink = time;
        self.think = CopyBody_Think;
        // "bake" the current animation frame for clones (they don't get clientside animation)
-       animdecide_setframes(self, FALSE, frame, frame1time, frame2, frame2time);
+       animdecide_load_if_needed(self);
+       animdecide_setframes(self, false, frame, frame1time, frame2, frame2time);
 
        self = oldself;
 }
@@ -110,8 +137,8 @@ float player_getspecies()
 void player_setupanimsformodel()
 {
        // load animation info
-       animdecide_init(self);
-       animdecide_setstate(self, 0, FALSE);
+       animdecide_load_if_needed(self);
+       animdecide_setstate(self, 0, false);
 }
 
 void player_anim (void)
@@ -134,14 +161,14 @@ void player_anim (void)
                animbits |= ANIMSTATE_FROZEN;
        if(self.crouch)
                animbits |= ANIMSTATE_DUCK;
-       animdecide_setstate(self, animbits, FALSE);
+       animdecide_setstate(self, animbits, false);
        animdecide_setimplicitstate(self, (self.flags & FL_ONGROUND));
 
        if (self.weaponentity)
        {
                updateanim(self.weaponentity);
                if (!self.weaponentity.animstate_override)
-                       setanim(self.weaponentity, self.weaponentity.anim_idle, TRUE, FALSE, FALSE);
+                       setanim(self.weaponentity, self.weaponentity.anim_idle, true, false, false);
        }
 }
 
@@ -155,8 +182,8 @@ void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float
        damage = max(damage - 5, 1);
 
        v = healtharmor_applydamage(self.armorvalue, autocvar_g_balance_armor_blockpercent, deathtype, damage);
-       take = v_x;
-       save = v_y;
+       take = v.x;
+       save = v.y;
 
        if(sound_allowed(MSG_BROADCAST, attacker))
        {
@@ -173,13 +200,11 @@ void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float
        if (take > 100)
                Violence_GibSplash_At(hitloc, force * -0.2, 3, 1, self, attacker);
 
-       if (!(self.flags & FL_GODMODE))
-       {
-               self.armorvalue = self.armorvalue - save;
-               self.health = self.health - take;
-               // pause regeneration for 5 seconds
-               self.pauseregen_finished = max(self.pauseregen_finished, time + autocvar_g_balance_pause_health_regen);
-       }
+       self.armorvalue = self.armorvalue - save;
+       self.health = self.health - take;
+       // pause regeneration for 5 seconds
+       self.pauseregen_finished = max(self.pauseregen_finished, time + autocvar_g_balance_pause_health_regen);
+
        self.dmg_save = self.dmg_save + save;//max(save - 10, 0);
        self.dmg_take = self.dmg_take + take;//max(take - 10, 0);
        self.dmg_inflictor = inflictor;
@@ -195,7 +220,7 @@ void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float
                self.alpha = -1;
                self.solid = SOLID_NOT; // restore later
                self.takedamage = DAMAGE_NO; // restore later
-               self.damagedbycontents = FALSE;
+               self.damagedbycontents = false;
        }
 }
 
@@ -324,7 +349,7 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
                vector d;
                float f;
                ear1 = self.origin;
-               ear1_z += 0.125 * self.view_ofs_z + 0.875 * self.maxs_z; // 7/8
+               ear1_z += 0.125 * self.view_ofs.z + 0.875 * self.maxs.z; // 7/8
                ear2 = ear1;
                makevectors(self.angles);
                ear1 += v_right * -10;
@@ -353,8 +378,8 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
 
 
        v = healtharmor_applydamage(self.armorvalue, autocvar_g_balance_armor_blockpercent, deathtype, damage);
-       take = v_x;
-       save = v_y;
+       take = v.x;
+       save = v.y;
 
        if(attacker == self)
        {
@@ -427,9 +452,9 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
                                                if (!self.animstate_override)
                                                {
                                                        if (random() > 0.5)
-                                                               animdecide_setaction(self, ANIMACTION_PAIN1, TRUE);
+                                                               animdecide_setaction(self, ANIMACTION_PAIN1, true);
                                                        else
-                                                               animdecide_setaction(self, ANIMACTION_PAIN2, TRUE);
+                                                               animdecide_setaction(self, ANIMACTION_PAIN2, true);
                                                }
                                        }
 
@@ -457,9 +482,9 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
                        if(IS_BOT_CLIENT(self) && self.health >= 1)
                        {
                                shake = damage * 5 / (bound(0,skill,100) + 1);
-                               self.v_angle_x = self.v_angle_x + (random() * 2 - 1) * shake;
-                               self.v_angle_y = self.v_angle_y + (random() * 2 - 1) * shake;
-                               self.v_angle_x = bound(-90, self.v_angle_x, 90);
+                               self.v_angle_x = self.v_angle.x + (random() * 2 - 1) * shake;
+                               self.v_angle_y = self.v_angle.y + (random() * 2 - 1) * shake;
+                               self.v_angle_x = bound(-90, self.v_angle.x, 90);
                        }
                }
                else
@@ -498,7 +523,7 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
        if (self.health < 1)
        {
                float defer_ClientKill_Now_TeamChange;
-               defer_ClientKill_Now_TeamChange = FALSE;
+               defer_ClientKill_Now_TeamChange = false;
 
                if(self.alivetime)
                {
@@ -524,7 +549,7 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
                        remove(self.killindicator);
                        self.killindicator = world;
                        if(self.killindicator_teamchange)
-                               defer_ClientKill_Now_TeamChange = TRUE;
+                               defer_ClientKill_Now_TeamChange = true;
 
                        if(self.classname == "body")
                        if(deathtype == DEATH_KILL)
@@ -535,7 +560,8 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
                }
 
                // print an obituary message
-               Obituary (attacker, inflictor, self, deathtype);
+               if(self.classname != "body")
+                       Obituary (attacker, inflictor, self, deathtype);
 
         // increment frag counter for used weapon type
         float w;
@@ -556,14 +582,14 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
 
                Portal_ClearAllLater(self);
 
-               self.fixangle = TRUE;
+               self.fixangle = true;
 
                if(defer_ClientKill_Now_TeamChange)
                        ClientKill_Now_TeamChange(); // can turn player into spectator
 
                // player could have been miraculously resuscitated ;)
                // e.g. players in freezetag get frozen, they don't really die
-               if(self.health >= 1 || !IS_PLAYER(self))
+               if(self.health >= 1 || !(IS_PLAYER(self) || self.classname == "body"))
                        return;
 
                // when we get here, player actually dies
@@ -600,10 +626,10 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
 
                self.death_time = time;
                if (random() < 0.5)
-                       animdecide_setstate(self, self.anim_state | ANIMSTATE_DEAD1, TRUE);
+                       animdecide_setstate(self, self.anim_state | ANIMSTATE_DEAD1, true);
                else
-                       animdecide_setstate(self, self.anim_state | ANIMSTATE_DEAD2, TRUE);
-               if (self.maxs_z > 5)
+                       animdecide_setstate(self, self.anim_state | ANIMSTATE_DEAD2, true);
+               if (self.maxs.z > 5)
                {
                        self.maxs_z = 5;
                        setsize(self, self.mins, self.maxs);
@@ -612,11 +638,20 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
                self.event_damage = PlayerCorpseDamage;
                // call the corpse damage function just in case it wants to gib
                self.event_damage(inflictor, attacker, excess, deathtype, hitloc, force);
+
                // set up to fade out later
                SUB_SetFade (self, time + 6 + random (), 1);
+               // reset body think wrapper broken by SUB_SetFade
+               if(self.classname == "body" && self.think != CopyBody_Think) {
+                       self.CopyBody_think = self.think;
+                       self.CopyBody_nextthink = self.nextthink;
+                       self.think = CopyBody_Think;
+                       self.nextthink = time;
+               }
 
-               if(autocvar_sv_gentle > 0 || autocvar_ekg) {
+               if(autocvar_sv_gentle > 0 || autocvar_ekg || self.classname == "body") {
                        // remove corpse
+                       // clones don't run any animation code any more, so we must gib them when they die :(
                        PlayerCorpseDamage (inflictor, attacker, autocvar_sv_gibhealth+1.0, deathtype, hitloc, force);
                }
 
@@ -657,11 +692,11 @@ float Say(entity source, float teamsay, entity privatesay, string msgin, float f
        else
        {
                colorstr = "";
-               teamsay = FALSE;
+               teamsay = false;
        }
 
        if(intermission_running)
-               teamsay = FALSE;
+               teamsay = false;
 
        if(msgin != "")
                msgin = trigger_magicear_processmessage_forallears(source, teamsay, privatesay, msgin);
@@ -1087,7 +1122,7 @@ void FakeGlobalSound(string sample, float chan, float voicetype)
                case VOICETYPE_TAUNT:
                        if(IS_PLAYER(self))
                                if(self.deadflag == DEAD_NO)
-                                       animdecide_setaction(self, ANIMACTION_TAUNT, TRUE);
+                                       animdecide_setaction(self, ANIMACTION_TAUNT, true);
                        if(!sv_taunt)
                                break;
                        if(autocvar_sv_gentle)
@@ -1184,7 +1219,7 @@ void GlobalSound(string sample, float chan, float voicetype)
                case VOICETYPE_TAUNT:
                        if(IS_PLAYER(self))
                                if(self.deadflag == DEAD_NO)
-                                       animdecide_setaction(self, ANIMACTION_TAUNT, TRUE);
+                                       animdecide_setaction(self, ANIMACTION_TAUNT, true);
                        if(!sv_taunt)
                                break;
                        if(autocvar_sv_gentle)