X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fcl_player.qc;h=07dc0788b341ebf88d0750271f4e0214fcc92c70;hb=87d4a81433ca7dbd761782f9b4b235976c7cdae5;hp=8ff9fe7b2a17a0e726dd8a2fede7e5b7040f0fec;hpb=60c3f5e778bdfd84ee199e4a357fae567c6aaeb2;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/cl_player.qc b/qcsrc/server/cl_player.qc index 8ff9fe7b2..07dc0788b 100644 --- a/qcsrc/server/cl_player.qc +++ b/qcsrc/server/cl_player.qc @@ -124,6 +124,22 @@ void WeaponStats_LogKill(float awep, float abot, float vwep, float vbot) .entity pusher; .float pushltime; +.float CopyBody_nextthink; +.void(void) CopyBody_think; +void CopyBody_Think(void) +{ + if(self.CopyBody_nextthink && time > self.CopyBody_nextthink) + { + self.CopyBody_think(); + if(wasfreed(self)) + return; + self.CopyBody_nextthink = self.nextthink; + self.CopyBody_think = self.think; + self.think = CopyBody_Think; + } + CSQCMODEL_AUTOUPDATE(); + self.nextthink = time; +} void CopyBody(float keepvelocity) { entity oldself; @@ -150,8 +166,9 @@ void CopyBody(float keepvelocity) self.animstate_endtime = oldself.animstate_endtime; self.animstate_override = oldself.animstate_override; self.animstate_looping = oldself.animstate_looping; + self.dphitcontentsmask = oldself.dphitcontentsmask; + self.death_time = oldself.death_time; self.frame = oldself.frame; - self.dead_frame = oldself.dead_frame; self.pain_finished = oldself.pain_finished; self.health = oldself.health; self.armorvalue = oldself.armorvalue; @@ -161,17 +178,16 @@ void CopyBody(float keepvelocity) self.skin = oldself.skin; self.species = oldself.species; self.movetype = oldself.movetype; - self.nextthink = oldself.nextthink; self.solid = oldself.solid; self.ballistics_density = oldself.ballistics_density; self.takedamage = oldself.takedamage; - self.think = oldself.think; self.customizeentityforclient = oldself.customizeentityforclient; self.uncustomizeentityforclient = oldself.uncustomizeentityforclient; self.uncustomizeentityforclient_set = oldself.uncustomizeentityforclient_set; if (keepvelocity == 1) self.velocity = oldself.velocity; self.oldvelocity = self.velocity; + self.alpha = oldself.alpha; self.fade_time = oldself.fade_time; self.fade_rate = oldself.fade_rate; //self.weapon = oldself.weapon; @@ -183,7 +199,13 @@ void CopyBody(float keepvelocity) Drag_MoveDrag(oldself, self); if(self.colormap <= maxclients && self.colormap > 0) - self.colormap = 1024 + self.clientcolors; + self.colormap = 1024 + oldself.clientcolors; + + CSQCMODEL_AUTOINIT(); + self.CopyBody_nextthink = oldself.nextthink; + self.CopyBody_think = oldself.think; + self.nextthink = time; + self.think = CopyBody_Think; self = oldself; } @@ -219,8 +241,8 @@ void player_setupanimsformodel() self.anim_runbackwards = animfixfps(self, '14 1 1'); self.anim_strafeleft = animfixfps(self, '15 1 1'); self.anim_straferight = animfixfps(self, '16 1 1'); - self.anim_dead1 = animfixfps(self, '17 1 1'); - self.anim_dead2 = animfixfps(self, '18 1 1'); + //self.anim_dead1 = animfixfps(self, '17 1 1'); + //self.anim_dead2 = animfixfps(self, '18 1 1'); self.anim_forwardright = animfixfps(self, '19 1 1'); self.anim_forwardleft = animfixfps(self, '20 1 1'); self.anim_backright = animfixfps(self, '21 1 1'); @@ -245,18 +267,7 @@ void player_anim (void) updateanim(self.weaponentity); if (self.deadflag != DEAD_NO) - { - if (time > self.animstate_endtime) - { - if (self.maxs_z > 5) - { - self.maxs_z = 5; - setsize(self, self.mins, self.maxs); - } - self.frame = self.dead_frame; - } return; - } if (!self.animstate_override) { @@ -400,17 +411,17 @@ void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float self.dmg_take = self.dmg_take + take;//max(take - 10, 0); self.dmg_inflictor = inflictor; - if (self.health <= -autocvar_sv_gibhealth && self.modelindex != 0) + if (self.health <= -autocvar_sv_gibhealth && self.alpha >= 0) { // don't use any animations as a gib self.frame = 0; - self.dead_frame = 0; // view just above the floor self.view_ofs = '0 0 4'; Violence_GibSplash(self, 1, 1, attacker); - self.modelindex = 0; // restore later + self.alpha = -1; self.solid = SOLID_NOT; // restore later + self.takedamage = DAMAGE_NO; // restore later } } @@ -424,7 +435,7 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht float valid_damage_for_weaponstats; float excess; - if((g_arena && numspawned < 2) || (g_ca && !ca_teams_ok) && !inWarmupStage) + if((g_arena && numspawned < 2) || (g_ca && allowed_to_spawn) && !inWarmupStage) return; dh = max(self.health, 0); @@ -649,7 +660,7 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht if(!g_freezetag) { // become fully visible - self.alpha = 1; + self.alpha = default_player_alpha; // throw a weapon SpawnThrownWeapon (self.origin + (self.mins + self.maxs) * 0.5, self.switchweapon); } @@ -663,8 +674,7 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht float w; w = DEATH_WEAPONOF(deathtype); if(WEP_VALID(w)) - if(self.classname == "player") - if(self != attacker) + if(accuracy_isgooddamage(attacker, self)) attacker.accuracy.(accuracy_frags[w-1]) += 1; if(deathtype == DEATH_HURTTRIGGER && g_freezetag) @@ -751,22 +761,22 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht if(!waves) waves = autocvar_g_respawn_waves; if(waves) - self.death_time = ceil((time + sdelay) / waves) * waves; + self.respawn_time = ceil((time + sdelay) / waves) * waves; else - self.death_time = time + sdelay; - if((sdelay + waves >= 5.0) && (self.death_time - time > 1.75)) + self.respawn_time = time + sdelay; + if((sdelay + waves >= 5.0) && (self.respawn_time - time > 1.75)) self.respawn_countdown = 10; // first number to count down from is 10 else self.respawn_countdown = -1; // do not count down + self.death_time = time; if (random() < 0.5) - { setanim(self, self.anim_die1, FALSE, TRUE, TRUE); - self.dead_frame = self.anim_dead1_x; - } else - { setanim(self, self.anim_die2, FALSE, TRUE, TRUE); - self.dead_frame = self.anim_dead2_x; + if (self.maxs_z > 5) + { + self.maxs_z = 5; + setsize(self, self.mins, self.maxs); } // set damage function to corpse damage self.event_damage = PlayerCorpseDamage; @@ -943,7 +953,7 @@ float Say(entity source, float teamsay, entity privatesay, string msgin, float f flood = 1; } - if (timeoutStatus == 2) //when game is paused, no flood protection + if (timeout_status == TIMEOUT_ACTIVE) // when game is paused, no flood protection source.flood_field = flood = 0; } @@ -970,8 +980,9 @@ float Say(entity source, float teamsay, entity privatesay, string msgin, float f if(!privatesay) if(source.classname != "player") { - if(teamsay || (autocvar_g_chat_nospectators == 1) || (autocvar_g_chat_nospectators == 2 && !inWarmupStage)) - teamsay = -1; // spectators + if not(intermission_running) + if(teamsay || (autocvar_g_chat_nospectators == 1) || (autocvar_g_chat_nospectators == 2 && !inWarmupStage)) + teamsay = -1; // spectators } if(flood) @@ -1003,22 +1014,23 @@ float Say(entity source, float teamsay, entity privatesay, string msgin, float f if(sourcemsgstr != "" && ret != 0) { - if(ret < 0) // fake + if(ret < 0) // faked message, because the player is muted { sprint(source, sourcemsgstr); if(sourcecmsgstr != "" && !privatesay) centerprint(source, sourcecmsgstr); } - else if(privatesay) + else if(privatesay) // private message, between 2 people only, not sent to server console { sprint(source, sourcemsgstr); sprint(privatesay, msgstr); if(cmsgstr != "") centerprint(privatesay, cmsgstr); } - else if(teamsay > 0) + else if(teamsay > 0) // team message, only sent to team mates { sprint(source, sourcemsgstr); + //print(msgstr); // send to server console too if(sourcecmsgstr != "") centerprint(source, sourcecmsgstr); FOR_EACH_REALPLAYER(head) if(head.team == source.team) @@ -1029,22 +1041,24 @@ float Say(entity source, float teamsay, entity privatesay, string msgin, float f centerprint(head, cmsgstr); } } - else if(teamsay < 0) + else if(teamsay < 0) // spectator message, only sent to spectators { sprint(source, sourcemsgstr); + //print(msgstr); // send to server console too FOR_EACH_REALCLIENT(head) if(head.classname != "player") if(head != source) sprint(head, msgstr); } - else if(sourcemsgstr != msgstr) + else if(sourcemsgstr != msgstr) // trimmed/server fixed message, sent to all players { sprint(source, sourcemsgstr); + //print(msgstr); // send to server console too FOR_EACH_REALCLIENT(head) if(head != source) sprint(head, msgstr); } else - bprint(msgstr); + bprint(msgstr); // entirely normal message, sent to all players -- bprint sends to server console too. } return ret;