X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;ds=inline;f=qcsrc%2Fserver%2Fplayer.qc;h=2ee4960654c2e99a641751b2b06812c152ef1f10;hb=44cfff453ab1bc20889f009755b1490fe8db590d;hp=067ed02e938064cdd78d354372d4d3873515680f;hpb=df01ffb2ceeacdcffc7ed259ffb65fd53d455ed4;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/player.qc b/qcsrc/server/player.qc index 067ed02e9..2ee496065 100644 --- a/qcsrc/server/player.qc +++ b/qcsrc/server/player.qc @@ -253,7 +253,7 @@ void calculate_player_respawn_time(entity this) )); if (sdelay_small_count == 0) { - if (g_cts) + if (IS_INDEPENDENT_PLAYER(this)) { // Players play independently. No point in requiring enemies. sdelay_small_count = 1; @@ -266,7 +266,7 @@ void calculate_player_respawn_time(entity this) } if (sdelay_large_count == 0) { - if (g_cts) + if (IS_INDEPENDENT_PLAYER(this)) { // Players play independently. No point in requiring enemies. sdelay_large_count = 1; @@ -311,7 +311,6 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, { float take, save, dh, da; vector v; - float valid_damage_for_weaponstats; float excess; dh = max(this.health, 0); @@ -484,7 +483,7 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, bool abot = (IS_BOT_CLIENT(attacker)); bool vbot = (IS_BOT_CLIENT(this)); - valid_damage_for_weaponstats = 0; + bool valid_damage_for_weaponstats = false; Weapon awep = WEP_Null; .entity weaponentity = weaponentities[0]; // TODO: unhardcode @@ -497,7 +496,7 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, awep = attacker.(weaponentity).m_weapon; else awep = DEATH_WEAPONOF(deathtype); - valid_damage_for_weaponstats = 1; + valid_damage_for_weaponstats = true; } dh = dh - max(this.health, 0); @@ -506,10 +505,8 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, { WeaponStats_LogDamage(awep.m_id, abot, this.(weaponentity).m_weapon.m_id, vbot, dh + da); } - if (damage) - { - MUTATOR_CALLHOOK(PlayerDamaged, attacker, this, dh, da, hitloc, deathtype, damage); - } + + MUTATOR_CALLHOOK(PlayerDamaged, attacker, this, dh, da, hitloc, deathtype, damage); if (this.health < 1) { @@ -539,7 +536,7 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, { delete(this.killindicator); this.killindicator = NULL; - if(this.killindicator_teamchange) + if(CS(this).killindicator_teamchange) defer_ClientKill_Now_TeamChange = true; if(this.classname == "body") @@ -560,12 +557,16 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, attacker.accuracy.(accuracy_frags[w.m_id-1]) += 1; MUTATOR_CALLHOOK(PlayerDies, inflictor, attacker, this, deathtype, damage); - excess = M_ARGV(4, float); + damage = M_ARGV(4, float); + excess = max(0, damage - take - save); - Weapon wep = this.(weaponentity).m_weapon; + //Weapon wep = this.(weaponentity).m_weapon; for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) { .entity went = weaponentities[slot]; + if(!this.(weaponentity)) + continue; // TODO: clones have no weapon, but we don't want to have to check this all the time + Weapon wep = this.(weaponentity).m_weapon; wep.wr_playerdeath(wep, this, went); } @@ -651,13 +652,18 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, } // reset fields the weapons may use just in case - FOREACH(Weapons, it != WEP_Null, LAMBDA( - it.wr_resetplayer(it, this); - for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) + if(this.classname != "body") + { + FOREACH(Weapons, it != WEP_Null, { - ATTACK_FINISHED_FOR(this, it.m_id, slot) = 0; - } - )); + it.wr_resetplayer(it, this); + for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) + { + ATTACK_FINISHED_FOR(this, it.m_id, slot) = 0; + } + }); + } + MUTATOR_CALLHOOK(PlayerDied, this); } } @@ -678,6 +684,54 @@ void dedicated_print(string input) if (server_is_dedicated) print(input); } +void PrintToChat(entity player, string text) +{ + text = strcat("\{1}^7", text, "\n"); + sprint(player, text); +} + +void DebugPrintToChat(entity player, string text) +{ + if (autocvar_developer) + { + PrintToChat(player, text); + } +} + +void PrintToChatAll(string text) +{ + text = strcat("\{1}^7", text, "\n"); + bprint(text); +} + +void DebugPrintToChatAll(string text) +{ + if (autocvar_developer) + { + PrintToChatAll(text); + } +} + +void PrintToChatTeam(int teamnum, string text) +{ + text = strcat("\{1}^7", text, "\n"); + FOREACH_CLIENT(IS_REAL_CLIENT(it), + { + if (it.team == teamnum) + { + sprint(it, text); + } + }); +} + +void DebugPrintToChatTeam(int teamnum, string text) +{ + if (autocvar_developer) + { + PrintToChatTeam(teamnum, text); + } +} + /** * message "": do not say, just test flood control * return value: @@ -690,7 +744,8 @@ int Say(entity source, int teamsay, entity privatesay, string msgin, bool floodc if (!teamsay && !privatesay && substring(msgin, 0, 1) == " ") msgin = substring(msgin, 1, -1); // work around DP say bug (say_team does not have this!) - msgin = formatmessage(source, msgin); + if(source) + msgin = formatmessage(source, msgin); string colorstr; if (!IS_PLAYER(source)) @@ -783,7 +838,7 @@ int Say(entity source, int teamsay, entity privatesay, string msgin, bool floodc // FLOOD CONTROL int flood = 0; var .float flood_field = floodcontrol_chat; - if(floodcontrol) + if(floodcontrol && source) { float flood_spl; float flood_burst; @@ -890,7 +945,7 @@ int Say(entity source, int teamsay, entity privatesay, string msgin, bool floodc sourcemsgstr = strcat(privatemsgprefix, substring(sourcemsgstr, privatemsgprefixlen, -1)); int ret; - if(source.muted) + if(source && CS(source).muted) { // always fake the message ret = -1;