From: terencehill Date: Tue, 14 Aug 2018 17:39:57 +0000 (+0200) Subject: Move ClientKill code into its own file X-Git-Tag: xonotic-v0.8.5~1907^2~2 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=03a5b5158f37b12a04ade2f4c1f482c90e53f7a0;p=xonotic%2Fxonotic-data.pk3dir.git Move ClientKill code into its own file --- diff --git a/qcsrc/server/_mod.inc b/qcsrc/server/_mod.inc index a4cb8bd5e..429117ad0 100644 --- a/qcsrc/server/_mod.inc +++ b/qcsrc/server/_mod.inc @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include diff --git a/qcsrc/server/_mod.qh b/qcsrc/server/_mod.qh index 0a00d6807..2bbfb7204 100644 --- a/qcsrc/server/_mod.qh +++ b/qcsrc/server/_mod.qh @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include diff --git a/qcsrc/server/cheats.qc b/qcsrc/server/cheats.qc index 04172b5eb..978b3fcb7 100644 --- a/qcsrc/server/cheats.qc +++ b/qcsrc/server/cheats.qc @@ -6,6 +6,7 @@ #include #include "g_damage.qh" +#include "clientkill.qh" #include "player.qh" #include "race.qh" #include "../common/mapobjects/teleporters.qh" diff --git a/qcsrc/server/client.qc b/qcsrc/server/client.qc index 909e89768..85514bdf9 100644 --- a/qcsrc/server/client.qc +++ b/qcsrc/server/client.qc @@ -17,6 +17,7 @@ #include "g_hook.qh" #include "command/common.qh" #include "command/vote.qh" +#include "clientkill.qh" #include "cheats.qh" #include "g_world.qh" #include "race.qh" @@ -900,204 +901,6 @@ void DecodeLevelParms(entity this) MUTATOR_CALLHOOK(DecodeLevelParms); } -/* -============= -ClientKill - -Called when a client types 'kill' in the console -============= -*/ - -.float clientkill_nexttime; -void ClientKill_Now_TeamChange(entity this) -{ - if(this.killindicator_teamchange == -1) - { - TeamBalance_JoinBestTeam(this); - } - else if(this.killindicator_teamchange == -2) - { - if(blockSpectators) - Send_Notification(NOTIF_ONE_ONLY, this, MSG_INFO, INFO_SPECTATE_WARNING, autocvar_g_maxplayers_spectator_blocktime); - PutObserverInServer(this); - } - else - SV_ChangeTeam(this, this.killindicator_teamchange - 1); - this.killindicator_teamchange = 0; -} - -void ClientKill_Now(entity this) -{ - if(this.vehicle) - { - vehicles_exit(this.vehicle, VHEF_RELEASE); - if(!this.killindicator_teamchange) - { - this.vehicle_health = -1; - Damage(this, this, this, 1 , DEATH_KILL.m_id, DMG_NOWEP, this.origin, '0 0 0'); - } - } - - if(this.killindicator && !wasfreed(this.killindicator)) - delete(this.killindicator); - - this.killindicator = NULL; - - if(this.killindicator_teamchange) - ClientKill_Now_TeamChange(this); - - if (!IS_SPEC(this) && !IS_OBSERVER(this) && MUTATOR_CALLHOOK(ClientKill_Now, this) == false) - { - Damage(this, this, this, 100000, DEATH_KILL.m_id, DMG_NOWEP, this.origin, '0 0 0'); - } - - // now I am sure the player IS dead -} -void KillIndicator_Think(entity this) -{ - if (game_stopped) - { - this.owner.killindicator = NULL; - delete(this); - return; - } - - if (this.owner.alpha < 0 && !this.owner.vehicle) - { - this.owner.killindicator = NULL; - delete(this); - return; - } - - if(this.cnt <= 0) - { - ClientKill_Now(this.owner); - return; - } - else if(this.count == 1) // count == 1 means that it's silent - { - this.nextthink = time + 1; - this.cnt -= 1; - } - else - { - if(this.cnt <= 10) - setmodel(this, MDL_NUM(this.cnt)); - if(IS_REAL_CLIENT(this.owner)) - { - if(this.cnt <= 10) - { Send_Notification(NOTIF_ONE, this.owner, MSG_ANNCE, Announcer_PickNumber(CNT_KILL, this.cnt)); } - } - this.nextthink = time + 1; - this.cnt -= 1; - } -} - -float clientkilltime; -void ClientKill_TeamChange (entity this, float targetteam) // 0 = don't change, -1 = auto, -2 = spec -{ - float killtime; - float starttime; - - if (game_stopped) - return; - - killtime = autocvar_g_balance_kill_delay; - - if(MUTATOR_CALLHOOK(ClientKill, this, killtime)) - return; - killtime = M_ARGV(1, float); - - this.killindicator_teamchange = targetteam; - - if(!this.killindicator) - { - if(!IS_DEAD(this)) - { - killtime = max(killtime, this.clientkill_nexttime - time); - this.clientkill_nexttime = time + killtime + autocvar_g_balance_kill_antispam; - } - - if(killtime <= 0 || !IS_PLAYER(this) || IS_DEAD(this)) - { - ClientKill_Now(this); - } - else - { - starttime = max(time, clientkilltime); - - this.killindicator = spawn(); - this.killindicator.owner = this; - this.killindicator.scale = 0.5; - setattachment(this.killindicator, this, ""); - setorigin(this.killindicator, '0 0 52'); - setthink(this.killindicator, KillIndicator_Think); - this.killindicator.nextthink = starttime + (this.lip) * 0.05; - clientkilltime = max(clientkilltime, this.killindicator.nextthink + 0.05); - this.killindicator.cnt = ceil(killtime); - this.killindicator.count = bound(0, ceil(killtime), 10); - //sprint(this, strcat("^1You'll be dead in ", ftos(this.killindicator.cnt), " seconds\n")); - - IL_EACH(g_clones, it.enemy == this && !(it.effects & CSQCMODEL_EF_RESPAWNGHOST), - { - it.killindicator = spawn(); - it.killindicator.owner = it; - it.killindicator.scale = 0.5; - setattachment(it.killindicator, it, ""); - setorigin(it.killindicator, '0 0 52'); - setthink(it.killindicator, KillIndicator_Think); - it.killindicator.nextthink = starttime + (it.lip) * 0.05; - //clientkilltime = max(clientkilltime, it.killindicator.nextthink + 0.05); - it.killindicator.cnt = ceil(killtime); - }); - this.lip = 0; - } - } - if(this.killindicator) - { - if(targetteam == 0) // just die - { - this.killindicator.colormod = '0 0 0'; - if(IS_REAL_CLIENT(this)) - if(this.killindicator.cnt > 0) - Send_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CENTER_TEAMCHANGE_SUICIDE, this.killindicator.cnt); - } - else if(targetteam == -1) // auto - { - this.killindicator.colormod = '0 1 0'; - if(IS_REAL_CLIENT(this)) - if(this.killindicator.cnt > 0) - Send_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CENTER_TEAMCHANGE_AUTO, this.killindicator.cnt); - } - else if(targetteam == -2) // spectate - { - this.killindicator.colormod = '0.5 0.5 0.5'; - if(IS_REAL_CLIENT(this)) - if(this.killindicator.cnt > 0) - Send_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CENTER_TEAMCHANGE_SPECTATE, this.killindicator.cnt); - } - else - { - this.killindicator.colormod = Team_ColorRGB(targetteam); - if(IS_REAL_CLIENT(this)) - if(this.killindicator.cnt > 0) - Send_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, APP_TEAM_NUM(targetteam, CENTER_TEAMCHANGE), this.killindicator.cnt); - } - } - -} - -void ClientKill (entity this) -{ - // TODO: once .health is removed, will need to check it here for the "already dead" message! - - if(game_stopped) return; - if(this.player_blocked) return; - if(STAT(FROZEN, this)) return; - - ClientKill_TeamChange(this, 0); -} - void FixClientCvars(entity e) { // send prediction settings to the client diff --git a/qcsrc/server/client.qh b/qcsrc/server/client.qh index 2d3a099b3..efb61a436 100644 --- a/qcsrc/server/client.qh +++ b/qcsrc/server/client.qh @@ -274,8 +274,6 @@ void FixPlayermodel(entity player); void ClientInit_misc(entity this); -void ClientKill_TeamChange(entity this, float targetteam); // 0 = don't change, -1 = auto, -2 = spec - bool joinAllowed(entity this); void Join(entity this); diff --git a/qcsrc/server/clientkill.qc b/qcsrc/server/clientkill.qc new file mode 100644 index 000000000..aec5387c3 --- /dev/null +++ b/qcsrc/server/clientkill.qc @@ -0,0 +1,198 @@ +#include "clientkill.qh" + +#include + +#include "g_damage.qh" +#include "teamplay.qh" + +#include +#include +#include + +void ClientKill_Now_TeamChange(entity this) +{ + if (this.killindicator_teamchange == -1) + { + TeamBalance_JoinBestTeam(this); + } + else if (this.killindicator_teamchange == -2) + { + if (blockSpectators) + Send_Notification(NOTIF_ONE_ONLY, this, MSG_INFO, INFO_SPECTATE_WARNING, autocvar_g_maxplayers_spectator_blocktime); + PutObserverInServer(this); + } + else + SV_ChangeTeam(this, this.killindicator_teamchange - 1); + this.killindicator_teamchange = 0; +} + +void ClientKill_Now(entity this) +{ + if (this.vehicle) + { + vehicles_exit(this.vehicle, VHEF_RELEASE); + if (!this.killindicator_teamchange) + { + this.vehicle_health = -1; + Damage(this, this, this, 1 , DEATH_KILL.m_id, DMG_NOWEP, this.origin, '0 0 0'); + } + } + + if (this.killindicator && !wasfreed(this.killindicator)) + delete(this.killindicator); + + this.killindicator = NULL; + + if (this.killindicator_teamchange) + ClientKill_Now_TeamChange(this); + + if (!IS_SPEC(this) && !IS_OBSERVER(this) && MUTATOR_CALLHOOK(ClientKill_Now, this) == false) + { + Damage(this, this, this, 100000, DEATH_KILL.m_id, DMG_NOWEP, this.origin, '0 0 0'); + } + + // now I am sure the player IS dead +} +void KillIndicator_Think(entity this) +{ + if (game_stopped) + { + this.owner.killindicator = NULL; + delete(this); + return; + } + + if (this.owner.alpha < 0 && !this.owner.vehicle) + { + this.owner.killindicator = NULL; + delete(this); + return; + } + + if (this.cnt <= 0) + { + ClientKill_Now(this.owner); + return; + } + else if (this.count == 1) // count == 1 means that it's silent + { + this.nextthink = time + 1; + this.cnt -= 1; + } + else + { + if (this.cnt <= 10) + setmodel(this, MDL_NUM(this.cnt)); + if (IS_REAL_CLIENT(this.owner)) + { + if (this.cnt <= 10) + Send_Notification(NOTIF_ONE, this.owner, MSG_ANNCE, Announcer_PickNumber(CNT_KILL, this.cnt)); + } + this.nextthink = time + 1; + this.cnt -= 1; + } +} + +.float lip; +float clientkilltime; +.float clientkill_nexttime; +void ClientKill_TeamChange(entity this, float targetteam) // 0 = don't change, -1 = auto, -2 = spec +{ + if (game_stopped) + return; + + float killtime = autocvar_g_balance_kill_delay; + + if (MUTATOR_CALLHOOK(ClientKill, this, killtime)) + return; + killtime = M_ARGV(1, float); + + this.killindicator_teamchange = targetteam; + + if (!this.killindicator) + { + if (!IS_DEAD(this)) + { + killtime = max(killtime, this.clientkill_nexttime - time); + this.clientkill_nexttime = time + killtime + autocvar_g_balance_kill_antispam; + } + + if (killtime <= 0 || !IS_PLAYER(this) || IS_DEAD(this)) + { + ClientKill_Now(this); + } + else + { + float starttime = max(time, clientkilltime); + + this.killindicator = spawn(); + this.killindicator.owner = this; + this.killindicator.scale = 0.5; + setattachment(this.killindicator, this, ""); + setorigin(this.killindicator, '0 0 52'); + setthink(this.killindicator, KillIndicator_Think); + this.killindicator.nextthink = starttime + (this.lip) * 0.05; + clientkilltime = max(clientkilltime, this.killindicator.nextthink + 0.05); + this.killindicator.cnt = ceil(killtime); + this.killindicator.count = bound(0, ceil(killtime), 10); + //sprint(this, strcat("^1You'll be dead in ", ftos(this.killindicator.cnt), " seconds\n")); + + IL_EACH(g_clones, it.enemy == this && !(it.effects & CSQCMODEL_EF_RESPAWNGHOST), + { + it.killindicator = spawn(); + it.killindicator.owner = it; + it.killindicator.scale = 0.5; + setattachment(it.killindicator, it, ""); + setorigin(it.killindicator, '0 0 52'); + setthink(it.killindicator, KillIndicator_Think); + it.killindicator.nextthink = starttime + (it.lip) * 0.05; + //clientkilltime = max(clientkilltime, it.killindicator.nextthink + 0.05); + it.killindicator.cnt = ceil(killtime); + }); + this.lip = 0; + } + } + if (this.killindicator) + { + if (targetteam == 0) // just die + { + this.killindicator.colormod = '0 0 0'; + if(IS_REAL_CLIENT(this)) + if(this.killindicator.cnt > 0) + Send_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CENTER_TEAMCHANGE_SUICIDE, this.killindicator.cnt); + } + else if (targetteam == -1) // auto + { + this.killindicator.colormod = '0 1 0'; + if(IS_REAL_CLIENT(this)) + if(this.killindicator.cnt > 0) + Send_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CENTER_TEAMCHANGE_AUTO, this.killindicator.cnt); + } + else if (targetteam == -2) // spectate + { + this.killindicator.colormod = '0.5 0.5 0.5'; + if(IS_REAL_CLIENT(this)) + if(this.killindicator.cnt > 0) + Send_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CENTER_TEAMCHANGE_SPECTATE, this.killindicator.cnt); + } + else + { + this.killindicator.colormod = Team_ColorRGB(targetteam); + if(IS_REAL_CLIENT(this)) + if(this.killindicator.cnt > 0) + Send_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, APP_TEAM_NUM(targetteam, CENTER_TEAMCHANGE), this.killindicator.cnt); + } + } + +} + +// Called when a client types 'kill' in the console +void ClientKill(entity this) +{ + // TODO: once .health is removed, will need to check it here for the "already dead" message! + + if (game_stopped || this.player_blocked || STAT(FROZEN, this)) + return; + + ClientKill_TeamChange(this, 0); +} diff --git a/qcsrc/server/clientkill.qh b/qcsrc/server/clientkill.qh new file mode 100644 index 000000000..33c4adb5a --- /dev/null +++ b/qcsrc/server/clientkill.qh @@ -0,0 +1,10 @@ + +// set when showing a kill countdown +.entity killindicator; +.int killindicator_teamchange; + +void ClientKill_Now_TeamChange(entity this); +void ClientKill_Now(entity this); +void KillIndicator_Think(entity this); +void ClientKill_TeamChange(entity this, float targetteam); // 0 = don't change, -1 = auto, -2 = spec +void ClientKill(entity this); diff --git a/qcsrc/server/command/cmd.qc b/qcsrc/server/command/cmd.qc index 04fb79d38..9743dc5c4 100644 --- a/qcsrc/server/command/cmd.qc +++ b/qcsrc/server/command/cmd.qc @@ -11,6 +11,7 @@ #include "../campaign.qh" #include "../cheats.qh" #include "../client.qh" +#include "../clientkill.qh" #include "../player.qh" #include "../ipban.qh" #include "../mapvoting.qh" diff --git a/qcsrc/server/defs.qh b/qcsrc/server/defs.qh index d2a695aeb..5114ae2f4 100644 --- a/qcsrc/server/defs.qh +++ b/qcsrc/server/defs.qh @@ -219,9 +219,6 @@ bool some_spawn_has_been_used; int have_team_spawns; // 0 = no team spawns requested, -1 = team spawns requested but none found, 1 = team spawns requested and found int have_team_spawns_forteams; // if Xth bit is 1 then team X has spawns else it has no spawns; team 0 is the "no-team" -// set when showing a kill countdown -.entity killindicator; - .bool canteamdamage; void Damage (entity targ, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force); @@ -367,8 +364,6 @@ const float ACTIVE_TOGGLE = 3; .entity muzzle_flash; .float misc_bulletcounter; // replaces uzi & hlac bullet counter. -.int killindicator_teamchange; - void PlayerUseKey(entity this); USING(spawn_evalfunc_t, vector(entity this, entity player, entity spot, vector current)); diff --git a/qcsrc/server/impulse.qc b/qcsrc/server/impulse.qc index 5010d2837..5d71b95af 100644 --- a/qcsrc/server/impulse.qc +++ b/qcsrc/server/impulse.qc @@ -6,6 +6,7 @@ #include "weapons/throwing.qh" #include "command/common.qh" #include "cheats.qh" +#include "clientkill.qh" #include "weapons/selection.qh" #include "weapons/tracing.qh" #include "weapons/weaponsystem.qh" diff --git a/qcsrc/server/player.qc b/qcsrc/server/player.qc index 3755da963..5d69c0aa1 100644 --- a/qcsrc/server/player.qc +++ b/qcsrc/server/player.qc @@ -3,6 +3,7 @@ #include #include "bot/api.qh" #include "cheats.qh" +#include "clientkill.qh" #include "g_damage.qh" #include "handicap.qh" #include "miscfunctions.qh" diff --git a/qcsrc/server/player.qh b/qcsrc/server/player.qh index 1c38a9fbe..c386473d9 100644 --- a/qcsrc/server/player.qh +++ b/qcsrc/server/player.qh @@ -28,8 +28,6 @@ void PlayerCorpseDamage(entity this, entity inflictor, entity attacker, float da void calculate_player_respawn_time(entity this); -void ClientKill_Now_TeamChange(entity this); - void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force); bool PlayerHeal(entity targ, entity inflictor, float amount, float limit);