X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fcl_player.qc;h=64329f23eeab2234b5c244479a3c27d53c8adb7d;hb=dc550ef55f6f2d079741662577a75578bd1097b5;hp=108ddedbae2f2bd70fcc355a91140894cab74bcc;hpb=21403f1e9510d608415d14bf4348880b9ff42204;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/cl_player.qc b/qcsrc/server/cl_player.qc index 108ddedba..64329f23e 100644 --- a/qcsrc/server/cl_player.qc +++ b/qcsrc/server/cl_player.qc @@ -123,6 +123,7 @@ void WeaponStats_LogKill(float awep, float abot, float vwep, float vbot) .entity pusher; .float pushltime; +.float istypefrag; .float CopyBody_nextthink; .void(void) CopyBody_think; @@ -151,6 +152,7 @@ void CopyBody(float keepvelocity) self.lip = oldself.lip; self.colormap = oldself.colormap; self.iscreature = oldself.iscreature; + self.teleportable = oldself.teleportable; self.damagedbycontents = oldself.damagedbycontents; self.angles = oldself.angles; self.avelocity = oldself.avelocity; @@ -166,6 +168,8 @@ 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.pain_finished = oldself.pain_finished; self.health = oldself.health; @@ -196,8 +200,6 @@ void CopyBody(float keepvelocity) Drag_MoveDrag(oldself, self); - self.owner = oldself; - if(self.colormap <= maxclients && self.colormap > 0) self.colormap = 1024 + oldself.clientcolors; @@ -271,7 +273,9 @@ void player_anim (void) if (!self.animstate_override) { - if (!(self.flags & FL_ONGROUND) || self.BUTTON_JUMP) + if (self.freezetag_frozen) + setanim(self, self.anim_idle, TRUE, FALSE, FALSE); + else if (!(self.flags & FL_ONGROUND) || self.BUTTON_JUMP) { if (self.crouch) { @@ -360,7 +364,7 @@ void SpawnThrownWeapon (vector org, float w) float j; for(j = WEP_FIRST; j <= WEP_LAST; ++j) { - if(self.weapons & W_WeaponBit(j)) + if(WEPSET_CONTAINS_EW(self, j)) if(W_IsWeaponThrowable(j)) W_ThrowNewWeapon(self, j, FALSE, org, randomvec() * 175 + '0 0 325'); } @@ -422,11 +426,11 @@ 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; } } void ClientKill_Now_TeamChange(); -void freezetag_CheckWinner(); void PlayerDamage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) { @@ -435,7 +439,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); @@ -580,11 +584,13 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht // don't reset pushltime for self damage as it may be an attempt to // escape a lava pit or similar //self.pushltime = 0; + self.istypefrag = 0; } else if(attacker.classname == "player") { self.pusher = attacker; self.pushltime = time + autocvar_g_maxpushtime; + self.istypefrag = self.BUTTON_CHAT; } else if(time < self.pushltime) { @@ -592,13 +598,18 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht self.pushltime = max(self.pushltime, time + 0.6); } else + { self.pushltime = 0; + self.istypefrag = 0; + } float abot, vbot, awep; abot = (clienttype(attacker) == CLIENTTYPE_BOT); vbot = (clienttype(self) == CLIENTTYPE_BOT); valid_damage_for_weaponstats = 0; + awep = 0; + if(vbot || clienttype(self) == CLIENTTYPE_REAL) if(abot || clienttype(attacker) == CLIENTTYPE_REAL) if(attacker && self != attacker) @@ -677,33 +688,17 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht if(accuracy_isgooddamage(attacker, self)) attacker.accuracy.(accuracy_frags[w-1]) += 1; - if(deathtype == DEATH_HURTTRIGGER && g_freezetag) - { - PutClientInServer(); - count_alive_players(); // re-count players - freezetag_CheckWinner(); - return; - } - frag_attacker = attacker; frag_inflictor = inflictor; frag_target = self; - MUTATOR_CALLHOOK(PlayerDies); + frag_deathtype = deathtype; + if (MUTATOR_CALLHOOK(PlayerDies)) + return; + weapon_action(self.weapon, WR_PLAYERDEATH); RemoveGrapplingHook(self); - if(self.flagcarried) - { - if(attacker.classname != "player") - DropFlag(self.flagcarried, self, attacker); // penalty for flag loss by suicide - else if(attacker.team == self.team) - DropFlag(self.flagcarried, attacker, attacker); // penalty for flag loss by suicide/teamkill - else - DropFlag(self.flagcarried, world, attacker); - } - if(self.ballcarried && g_nexball) - DropBall(self.ballcarried, self.origin, self.velocity); Portal_ClearAllLater(self); if(clienttype(self) == CLIENTTYPE_REAL) @@ -761,13 +756,14 @@ 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); else @@ -806,14 +802,12 @@ float Say(entity source, float teamsay, entity privatesay, string msgin, float f // 0 = reject // -1 = fake accept { - string msgstr, colorstr, cmsgstr, namestr, fullmsgstr, sourcemsgstr, fullcmsgstr, sourcecmsgstr, privatemsgprefix; - float flood, privatemsgprefixlen; + string msgstr, colorstr, cmsgstr, namestr, fullmsgstr, sourcemsgstr, fullcmsgstr, sourcecmsgstr; + float flood; var .float flood_field; entity head; float ret; - - if(Ban_MaybeEnforceBan(source)) - return 0; + string privatemsgprefix = string_null; float privatemsgprefixlen = 0; if(!teamsay && !privatesay) if(substring(msgin, 0, 1) == " ") @@ -826,7 +820,10 @@ float Say(entity source, float teamsay, entity privatesay, string msgin, float f else if(teamplay) colorstr = Team_ColorCode(source.team); else + { + colorstr = ""; teamsay = FALSE; + } if(intermission_running) teamsay = FALSE; @@ -885,6 +882,7 @@ float Say(entity source, float teamsay, entity privatesay, string msgin, float f // FLOOD CONTROL flood = 0; + flood_field = floodcontrol_chat; if(floodcontrol) { float flood_spl; @@ -979,8 +977,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 || gameover))) + teamsay = -1; // spectators } if(flood) @@ -1012,22 +1011,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) @@ -1038,22 +1038,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;