From fc5d28a31291dfe9833137f448582687b3386672 Mon Sep 17 00:00:00 2001 From: terencehill Date: Thu, 20 Nov 2014 20:12:24 +0100 Subject: [PATCH] Make available networking mechanism for reporting eliminated players to other gamemodes too --- qcsrc/server/miscfunctions.qc | 38 ++++++++++++++++++++++++++++ qcsrc/server/mutators/gamemode_ca.qc | 34 +++++-------------------- qcsrc/server/mutators/gamemode_ca.qh | 1 - 3 files changed, 45 insertions(+), 28 deletions(-) diff --git a/qcsrc/server/miscfunctions.qc b/qcsrc/server/miscfunctions.qc index 55e01b245..7d3a37672 100644 --- a/qcsrc/server/miscfunctions.qc +++ b/qcsrc/server/miscfunctions.qc @@ -1590,6 +1590,44 @@ void Net_LinkEntity(entity e, float docull, float dt, float(entity, float) sendf } } + +entity eliminatedPlayers; +.float(entity) isEliminated; +float EliminatedPlayers_SendEntity(entity to, float sendflags) +{ + float i, f, b; + entity e; + WriteByte(MSG_ENTITY, ENT_CLIENT_ELIMINATEDPLAYERS); + WriteByte(MSG_ENTITY, sendflags); + + if(sendflags & 1) + { + for(i = 1; i <= maxclients; i += 8) + { + for(f = 0, e = edict_num(i), b = 1; b < 256; b *= 2, e = nextent(e)) + { + if(eliminatedPlayers.isEliminated(e)) + f |= b; + } + WriteByte(MSG_ENTITY, f); + } + } + + return TRUE; +} + +void EliminatedPlayers_Init(float(entity) isEliminated_func) +{ + if(eliminatedPlayers) + { + backtrace("Can't spawn eliminatedPlayers again!"); + return; + } + Net_LinkEntity(eliminatedPlayers = spawn(), FALSE, 0, EliminatedPlayers_SendEntity); + eliminatedPlayers.isEliminated = isEliminated_func; +} + + void adaptor_think2touch() { entity o; diff --git a/qcsrc/server/mutators/gamemode_ca.qc b/qcsrc/server/mutators/gamemode_ca.qc index f8efe47a8..e3c07f59e 100644 --- a/qcsrc/server/mutators/gamemode_ca.qc +++ b/qcsrc/server/mutators/gamemode_ca.qc @@ -143,35 +143,15 @@ float CA_CheckTeams() return 0; } -float EliminatedPlayers_SendEntity(entity to, float sendflags) +float ca_isEliminated(entity e) { - float i, f, b; - entity e; - WriteByte(MSG_ENTITY, ENT_CLIENT_ELIMINATEDPLAYERS); - WriteByte(MSG_ENTITY, sendflags); - - if(sendflags & 1) - { - for(i = 1; i <= maxclients; i += 8) - { - for(f = 0, e = edict_num(i), b = 1; b < 256; b *= 2, e = nextent(e)) - { - if(e.caplayer == 0.5 || (e.caplayer == 1 && (e.deadflag != DEAD_NO || e.frags == FRAGS_LMS_LOSER))) - f |= b; - } - WriteByte(MSG_ENTITY, f); - } - } - - return TRUE; -} - -void EliminatedPlayers_Init() -{ - Net_LinkEntity(eliminatedPlayers = spawn(), FALSE, 0, EliminatedPlayers_SendEntity); + if(e.caplayer == 1 && (e.deadflag != DEAD_NO || e.frags == FRAGS_LMS_LOSER)) + return TRUE; + if(e.caplayer == 0.5) + return TRUE; + return FALSE; } - MUTATOR_HOOKFUNCTION(ca_PlayerSpawn) { self.caplayer = 1; @@ -381,7 +361,7 @@ void ca_Initialize() addstat(STAT_YELLOWALIVE, AS_INT, yellowalive_stat); addstat(STAT_PINKALIVE, AS_INT, pinkalive_stat); - EliminatedPlayers_Init(); + EliminatedPlayers_Init(ca_isEliminated); } MUTATOR_DEFINITION(gamemode_ca) diff --git a/qcsrc/server/mutators/gamemode_ca.qh b/qcsrc/server/mutators/gamemode_ca.qh index 43b403242..a7c1edfc5 100644 --- a/qcsrc/server/mutators/gamemode_ca.qh +++ b/qcsrc/server/mutators/gamemode_ca.qh @@ -1,3 +1,2 @@ // should be removed in the future, as other code should not have to care .float caplayer; // 0.5 if scheduled to join the next round -entity eliminatedPlayers; -- 2.39.2