alias cl_hook_gamestart_ft
alias cl_hook_gamestart_inv
alias cl_hook_gamestart_duel
-alias cl_hook_gamestart_sv //LegendGuard adds survival client hook from Mario/survival 15-02-2021
alias cl_hook_gamestart_tka //LegendGuard adds team keepaway client hook from Mario/team_keepaway 15-02-2021
alias cl_hook_gameend "rpn /cl_matchcount dup load 1 + =" // increase match count every time a game ends
alias cl_hook_shutdown
alias sv_hook_gamestart_ft
alias sv_hook_gamestart_inv
alias sv_hook_gamestart_duel
-alias sv_hook_gamestart_sv //LegendGuard adds survival hook from Mario/survival 15-02-2021
// there is currently no hook for when the match is restarted
// see sv_hook_readyrestart for previous uses of this hook
//alias sv_hook_gamerestart
alias sv_vote_gametype_hook_rc
alias sv_vote_gametype_hook_tdm
alias sv_vote_gametype_hook_duel
-alias sv_vote_gametype_hook_sv //LegendGuard adds survival hook from Mario/survival 15-02-2021
alias sv_hook_gamestart_tka //LegendGuard adds team keepaway hook from Mario/team_keepaway 15-02-2021
// Example preset to allow 1v1ctf to be used for the gametype voting screen.
set g_duel_respawn_delay_max 0
set g_duel_respawn_waves 0
set g_duel_weapon_stay 0
-set g_sv_respawn_delay_small 0 //LegendGuard adds survival cvars from Mario/survival 15-02-2021
-set g_sv_respawn_delay_small_count 0
-set g_sv_respawn_delay_large 0
-set g_sv_respawn_delay_large_count 0
-set g_sv_respawn_delay_max 0
-set g_sv_respawn_waves 0
-set g_sv_weapon_stay 0
set g_tka_respawn_delay_small 0 //LegendGuard adds team keepaway cvars from Mario/team_keepaway 15-02-2021
set g_tka_respawn_delay_small_count 0
set g_tka_respawn_delay_large 0
set g_duel_with_powerups 0 "Enable powerups to spawn in the duel gamemode"
set g_duel_not_dm_maps 0 "when this is set, DM maps will NOT be listed in duel"
-//LegendGuard adds survival cvars from Mario/survival 15-02-2021
-// ==========
-// survival
-// ==========
-set g_survival 0 "Survival: identify and eliminate all the hunters before all your allies are gone"
-set g_survival_not_lms_maps 0 "when this is set, LMS maps will NOT be listed in survival"
-set g_survival_hunter_count 0.25 "number of players who will become hunters, set between 0 and 0.9 to use a multiplier of the current players, or 1 and above to specify an exact number of players"
-set g_survival_punish_teamkill 1 "kill the player when they kill an ally"
-set g_survival_reward_survival 1 "give a point to all surviving players if the round timelimit is reached, in addition to the points given for kills"
-set g_survival_warmup 10 "how long the players will have time to run around the map before the round starts"
-set g_survival_round_timelimit 180 "round time limit in seconds"
-
//LegendGuard adds tema keepaway cvars from Mario/team_keepaway 15-02-2021
// ===============
// team keepaway
seta notification_INFO_SUPERSPEC_MISSING_UID "2" "0 = off, 1 = print to console, 2 = print to console and chatbox (if notification_allow_chatboxprint is enabled)"
seta notification_INFO_SUPERWEAPON_PICKUP "1" "0 = off, 1 = print to console, 2 = print to console and chatbox (if notification_allow_chatboxprint is enabled)"
-//LegendGuard adds survival notifications from Mario/survival 15-02-2021
-seta notification_INFO_SURVIVAL_HUNTER_WIN "1" "0 = off, 1 = print to console, 2 = print to console and chatbox (if notification_allow_chatboxprint is enabled)"
-seta notification_INFO_SURVIVAL_SUVIVOR_WIN "1" "0 = off, 1 = print to console, 2 = print to console and chatbox (if notification_allow_chatboxprint is enabled)"
-
seta notification_INFO_TEAMCHANGE_LARGERTEAM "1" "0 = off, 1 = print to console, 2 = print to console and chatbox (if notification_allow_chatboxprint is enabled)"
seta notification_INFO_TEAMCHANGE_NOTALLOWED "1" "0 = off, 1 = print to console, 2 = print to console and chatbox (if notification_allow_chatboxprint is enabled)"
seta notification_INFO_VERSION_BETA "1" "0 = off, 1 = print to console, 2 = print to console and chatbox (if notification_allow_chatboxprint is enabled)"
seta notification_CENTER_SUPERWEAPON_BROKEN "1" "0 = off, 1 = centerprint"
seta notification_CENTER_SUPERWEAPON_LOST "1" "0 = off, 1 = centerprint"
seta notification_CENTER_SUPERWEAPON_PICKUP "1" "0 = off, 1 = centerprint"
-//LegendGuard adds survival notification from Mario/survival 15-02-2021
-seta notification_CENTER_SURVIVAL_HUNTER "1" "0 = off, 1 = centerprint"
-seta notification_CENTER_SURVIVAL_HUNTER_WIN "1" "0 = off, 1 = centerprint"
-seta notification_CENTER_SURVIVAL_SURVIVOR "1" "0 = off, 1 = centerprint"
-seta notification_CENTER_SURVIVAL_SURVIVOR_WIN "1" "0 = off, 1 = centerprint"
seta notification_CENTER_TEAMCHANGE_AUTO "1" "0 = off, 1 = centerprint"
seta notification_CENTER_TEAMCHANGE "1" "0 = off, 1 = centerprint"
{ WriteByte(chan, ent.activewepid); },
{ ent.activewepid = ReadByte(); })
-//LegendGuard adds ENTCS_PROP from Mario/survival 15-02-2021
-// gamemode specific player survival status (independent of score and frags)
-ENTCS_PROP(SURVIVAL_STATUS, true, survival_status, survival_status, ENTCS_SET_NORMAL,
- { WriteShort(chan, ent.survival_status); },
- { ent.survival_status = ReadShort(); })
-
#ifdef SVQC
#include <common/gamemodes/gamemode/nexball/_mod.inc>
#include <common/gamemodes/gamemode/onslaught/_mod.inc>
#include <common/gamemodes/gamemode/race/_mod.inc>
-#include <common/gamemodes/gamemode/survival/_mod.inc> //LegendGuard adds _mod.inc from Mario/survival 15-02-2021
#include <common/gamemodes/gamemode/tdm/_mod.inc>
#include <common/gamemodes/gamemode/tka/_mod.inc> //LegendGuard adds _mod.inc from Mario/team_keepaway 15-02-2021
\ No newline at end of file
#include <common/gamemodes/gamemode/nexball/_mod.qh>
#include <common/gamemodes/gamemode/onslaught/_mod.qh>
#include <common/gamemodes/gamemode/race/_mod.qh>
-#include <common/gamemodes/gamemode/survival/_mod.qh> //LegendGuard adds _mod.qh from Mario/survival 15-02-2021
#include <common/gamemodes/gamemode/tdm/_mod.qh>
-#include <common/gamemodes/gamemode/tka/_mod.qh> //LegendGuard adds _mod.qh from Mario/team_keepaway 15-02-2021
\ No newline at end of file
+#include <common/gamemodes/gamemode/tka/_mod.qh> //LegendGuard adds _mod.qh from Mario/team_keepaway 15-02-2021
for (int i = 1; i <= NUM_TEAMS; ++i)
{
Team_SetNumberOfAlivePlayers(Team_GetTeamFromIndex(i), 0);
- Team_SetNumberOfPlayers(Team_GetTeamFromIndex(i), 0);
}
- FOREACH_CLIENT(Entity_HasValidTeam(it),
+ FOREACH_CLIENT(IS_PLAYER(it) && Entity_HasValidTeam(it),
{
++total_players;
- entity team_ = Entity_GetTeam(it);
-
- int num_total = Team_GetNumberOfPlayers(team_);
- ++num_total;
- Team_SetNumberOfPlayers(team_, num_total);
-
- if (IS_DEAD(it) || !IS_PLAYER(it))
+ if (IS_DEAD(it))
{
continue;
}
-
+ entity team_ = Entity_GetTeam(it);
int num_alive = Team_GetNumberOfAlivePlayers(team_);
++num_alive;
Team_SetNumberOfAlivePlayers(team_, num_alive);
void nades_Clear(entity player);
+//z411
entity ca_LastPlayer(float tm)
{
entity last_pl = NULL;
return last_pl;
}
-
float CA_CheckWinner()
{
if(round_handler_GetEndTime() > 0 && round_handler_GetEndTime() - time <= 0)
{
Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_ROUND_OVER);
Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_ROUND_OVER);
- Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_ROUND_OVER);
FOREACH_CLIENT(IS_PLAYER(it), { nades_Clear(it); });
allowed_to_spawn = false;
- if(autocvar_g_ca_round_stop)
- game_stopped = true;
+ game_stopped = true;
round_handler_Init(5, autocvar_g_ca_warmup, autocvar_g_ca_round_timelimit);
return 1;
}
}
int winner_team = CA_GetWinnerTeam();
- bool perfect = false;
+ bool perfect = false; //z411
if(winner_team > 0)
{
- entity tm = Team_GetTeam(winner_team);
+ //z411
+ entity tm = Team_GetTeam(winner_team);
entity last_pl = ca_LastPlayer(winner_team);
if(last_pl && Team_GetNumberOfPlayers(tm) >= 3) {
Give_Medal(last_pl, DEFENSE);
}
-
+ // ----
+
Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, APP_TEAM_NUM(winner_team, CENTER_ROUND_TEAM_WIN));
Send_Notification(NOTIF_ALL, NULL, MSG_INFO, APP_TEAM_NUM(winner_team, INFO_ROUND_TEAM_WIN));
- if(fragsleft > 1) Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, APP_TEAM_NUM(winner_team, ANNCE_ROUND_TEAM_WIN));
TeamScore_AddToTeam(winner_team, ST_CA_ROUNDS, +1);
-
- if (Team_GetNumberOfPlayers(tm) >= 3 &&
- Team_GetNumberOfAlivePlayers(tm) == Team_GetNumberOfPlayers(tm))
- perfect = true;
}
else if(winner_team == -1)
{
Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_ROUND_TIED);
Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_ROUND_TIED);
- Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_ROUND_TIED);
}
allowed_to_spawn = false;
- if(autocvar_g_ca_round_stop)
- game_stopped = true;
+ game_stopped = true;
round_handler_Init(5, autocvar_g_ca_warmup, autocvar_g_ca_round_timelimit);
FOREACH_CLIENT(IS_PLAYER(it), {
nades_Clear(it);
+ //z411
// Give perfect medal if everyone in the winner team is alive
if(perfect && it.team == winner_team) {
Give_Medal(it, PERFECT);
return true;
}
-MUTATOR_HOOKFUNCTION(ca, Scores_CountFragsRemaining)
-{
- // announce remaining frags
- return true;
-}
-
MUTATOR_HOOKFUNCTION(ca, ClientConnect)
{
entity player = M_ARGV(0, entity);
if (!warmup_stage && round_handler_IsActive() && round_handler_IsRoundStarted())
{
entity pl = ca_LastPlayerForTeam(this);
- if (pl) {
+ if (pl)
Send_Notification(NOTIF_ONE, pl, MSG_CENTER, CENTER_ALONE);
- Send_Notification(NOTIF_ONE, pl, MSG_ANNCE, ANNCE_ALONE);
- }
}
}
return true;
}
+MUTATOR_HOOKFUNCTION(ca, Scores_CountFragsRemaining)
+{
+ // announce remaining frags
+ return true;
+}
+
MUTATOR_HOOKFUNCTION(ca, SpectateSet)
{
entity client = M_ARGV(0, entity);
int autocvar_g_ca_point_limit;
int autocvar_g_ca_point_leadlimit;
float autocvar_g_ca_round_timelimit;
-bool autocvar_g_ca_round_stop;
bool autocvar_g_ca_team_spawns;
//int autocvar_g_ca_teams;
int autocvar_g_ca_teams_override;
void nades_Clear(entity);
void nades_GiveBonus(entity player, float score);
+//z411
entity freezetag_LastPlayer(float tm)
{
entity last_pl = NULL;
{
Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_ROUND_OVER);
Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_ROUND_OVER);
- Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_ROUND_OVER);
-
FOREACH_CLIENT(IS_PLAYER(it), {
it.freezetag_frozen_timeout = 0;
it.freezetag_revive_time = 0;
nades_Clear(it);
});
- if(autocvar_g_freezetag_round_stop)
- game_stopped = true;
+ game_stopped = true;
round_handler_Init(5, autocvar_g_freezetag_warmup, autocvar_g_freezetag_round_timelimit);
return true;
}
int winner_team = freezetag_getWinnerTeam();
if(winner_team > 0)
{
- entity last_pl = freezetag_LastPlayer(winner_team);
+ //z411
+ entity last_pl = freezetag_LastPlayer(winner_team);
if(last_pl) {
Give_Medal(last_pl, DEFENSE);
}
-
- Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, APP_TEAM_NUM(winner_team, CENTER_ROUND_TEAM_SCORES));
- Send_Notification(NOTIF_ALL, NULL, MSG_INFO, APP_TEAM_NUM(winner_team, INFO_ROUND_TEAM_SCORES));
+ // ----
+
+ Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, APP_TEAM_NUM(winner_team, CENTER_ROUND_TEAM_WIN));
+ Send_Notification(NOTIF_ALL, NULL, MSG_INFO, APP_TEAM_NUM(winner_team, INFO_ROUND_TEAM_WIN));
TeamScore_AddToTeam(winner_team, ST_FT_ROUNDS, +1);
- if(fragsleft > 1) AnnounceScores(winner_team);
}
else if(winner_team == -1)
{
Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_ROUND_TIED);
Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_ROUND_TIED);
- Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_ROUND_TIED);
}
FOREACH_CLIENT(IS_PLAYER(it), {
nades_Clear(it);
});
- if(autocvar_g_freezetag_round_stop)
- game_stopped = true;
+ game_stopped = true;
round_handler_Init(5, autocvar_g_freezetag_warmup, autocvar_g_freezetag_round_timelimit);
return true;
}
if(round_handler_IsRoundStarted())
{
entity pl = freezetag_LastPlayerForTeam(this);
- if(pl) {
+ if(pl)
Send_Notification(NOTIF_ONE, pl, MSG_CENTER, CENTER_ALONE);
- Send_Notification(NOTIF_ONE, pl, MSG_ANNCE, ANNCE_ALONE);
- }
}
}
{
FOREACH_CLIENT(IS_PLAYER(it), {
CS(it).killcount = 0;
-
- if(autocvar_g_freezetag_round_respawn) {
- it.freezetag_frozen_timeout = -1;
- PutClientInServer(it);
- } else {
- ResetPlayerResources(it);
- }
-
+ it.freezetag_revive_time = 0;
+ it.freezetag_frozen_timeout = -1;
+ PutClientInServer(it);
it.freezetag_frozen_timeout = 0;
});
freezetag_count_alive_players();
{
entity targ = M_ARGV(0, entity);
targ.freezetag_frozen_time = 0;
-
- if(autocvar_g_freezetag_revive_respawn) {
- targ.freezetag_frozen_timeout = -1;
- PutClientInServer(targ);
- }
-
targ.freezetag_frozen_timeout = 0;
}
Send_Notification(NOTIF_ONE, revivers_first, MSG_CENTER, CENTER_FREEZETAG_REVIVE, player.netname);
Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_FREEZETAG_REVIVED, player.netname, revivers_first.netname);
Give_Medal(revivers_first, ASSIST);
- if(autocvar_sv_eventlog)
+ if(autocvar_sv_eventlog)
{
string revivers = "";
for(entity it = revivers_first; it; it = it.chain)
bool autocvar_g_freezetag_team_spawns;
string autocvar_g_freezetag_weaponarena = "most_available";
-bool autocvar_g_freezetag_round_respawn;
-bool autocvar_g_freezetag_round_stop;
-
const int ST_FT_ROUNDS = 1;
void freezetag_Initialize();
float autocvar_g_freezetag_revive_time_to_score = 1.5;
bool autocvar_g_freezetag_revive_nade;
float autocvar_g_freezetag_revive_nade_health;
-bool autocvar_g_freezetag_revive_respawn;
+++ /dev/null
-// generated file; do not modify
-#include <common/gamemodes/gamemode/survival/survival.qc>
-#ifdef CSQC
- #include <common/gamemodes/gamemode/survival/cl_survival.qc>
-#endif
-#ifdef SVQC
- #include <common/gamemodes/gamemode/survival/sv_survival.qc>
-#endif
+++ /dev/null
-// generated file; do not modify
-#include <common/gamemodes/gamemode/survival/survival.qh>
-#ifdef CSQC
- #include <common/gamemodes/gamemode/survival/cl_survival.qh>
-#endif
-#ifdef SVQC
- #include <common/gamemodes/gamemode/survival/sv_survival.qh>
-#endif
+++ /dev/null
-#include "cl_survival.qh"
-
-#include <client/draw.qh>
-#include <client/hud/panel/modicons.qh>
-
-void HUD_Mod_Survival(vector pos, vector mySize)
-{
- mod_active = 1; // survival should always show the mod HUD
-
- int mystatus = entcs_receiver(player_localnum).survival_status;
- string player_text = "";
- vector player_color = '1 1 1';
- //string player_icon = "";
- if(mystatus == SV_STATUS_HUNTER)
- {
- player_text = _("Hunter");
- player_color = '1 0 0';
- //player_icon = "player_red";
- }
- else if(mystatus == SV_STATUS_PREY)
- {
- player_text = _("Survivor");
- player_color = '0 1 0';
- //player_icon = "player_neutral";
- }
- else
- {
- // if the player has no valid status, don't draw anything
- return;
- }
-
- string time_text = string_null;
- vector timer_color = '1 1 1';
- if(!STAT(GAME_STOPPED) && !warmup_stage && STAT(SURVIVAL_ROUNDTIMER) > 0)
- {
- float timeleft = max(0, STAT(SURVIVAL_ROUNDTIMER) - time);
- timeleft = ceil(timeleft);
- float minutesLeft = floor(timeleft / 60);
- time_text = seconds_tostring(timeleft);
- if(intermission_time || minutesLeft >= 5 || warmup_stage || STAT(SURVIVAL_ROUNDTIMER) == 0)
- timer_color = '1 1 1'; //white
- else if(minutesLeft >= 1)
- timer_color = '1 1 0'; //yellow
- else
- timer_color = '1 0 0'; //red
- }
-
- //drawpic_aspect_skin(pos, player_icon, vec2(0.5 * mySize.x, mySize.y), '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
- if(!time_text)
- drawstring_aspect(pos, player_text, vec2(mySize.x, mySize.y), player_color, panel_fg_alpha, DRAWFLAG_NORMAL);
- else
- {
- drawstring_aspect(pos, player_text, vec2(0.5 * mySize.x, mySize.y), player_color, panel_fg_alpha, DRAWFLAG_NORMAL);
- drawstring_aspect(pos + eX * (0.5 * mySize.x), time_text, vec2(0.5 * mySize.x, mySize.y), timer_color, panel_fg_alpha, DRAWFLAG_NORMAL);
- }
-}
-
-REGISTER_MUTATOR(cl_sv, true);
-
-MUTATOR_HOOKFUNCTION(cl_sv, ForcePlayercolors_Skip, CBC_ORDER_LAST)
-{
- if(!ISGAMETYPE(SURVIVAL))
- return false;
-
- entity player = M_ARGV(0, entity);
- entity e = entcs_receiver(player.entnum - 1);
- int surv_status = ((e) ? e.survival_status : 0);
- int mystatus = entcs_receiver(player_localnum).survival_status;
-
- int plcolor = SV_COLOR_PREY; // default to survivor
- if((mystatus == SV_STATUS_HUNTER || intermission || STAT(GAME_STOPPED)) && surv_status == SV_STATUS_HUNTER)
- plcolor = SV_COLOR_HUNTER;
-
- player.colormap = 1024 + plcolor;
- return true;
-}
-
-MUTATOR_HOOKFUNCTION(cl_sv, DrawScoreboard_Force)
-{
- // show the scoreboard when the round ends, so players can see who the hunter was
- return STAT(GAME_STOPPED);
-}
+++ /dev/null
-#pragma once
-
-void HUD_Mod_Survival(vector pos, vector mySize);
+++ /dev/null
-#include "survival.qh"
+++ /dev/null
-#pragma once
-
-#include <common/gamemodes/gamemode/lms/lms.qh>
-#include <common/mapinfo.qh>
-
-#ifdef CSQC
-void HUD_Mod_Survival(vector pos, vector mySize);
-#endif
-CLASS(Survival, Gametype)
- INIT(Survival)
- {
- this.gametype_init(this, _("Survival"),"sv","g_survival",GAMETYPE_FLAG_USEPOINTS,"","timelimit=30 pointlimit=20",_("Identify and eliminate all the hunters before all your allies are gone"));
- }
- METHOD(Survival, m_isAlwaysSupported, bool(Gametype this, int spawnpoints, float diameter))
- {
- return true;
- }
- METHOD(Survival, m_isForcedSupported, bool(Gametype this))
- {
- if(!cvar("g_survival_not_lms_maps"))
- {
- // if this is unset, all LMS maps support Survival too
- if(!(MapInfo_Map_supportedGametypes & this.m_flags) && (MapInfo_Map_supportedGametypes & MAPINFO_TYPE_LMS.m_flags))
- return true; // TODO: references another gametype (alternatively, we could check which gamemodes are always enabled and append this if any are supported)
- }
- return false;
- }
-#ifdef CSQC
- ATTRIB(Survival, m_modicons, void(vector pos, vector mySize), HUD_Mod_Survival);
-#endif
-ENDCLASS(Survival)
-REGISTER_GAMETYPE(SURVIVAL, NEW(Survival));
-
-#ifdef GAMEQC
-// shared state signalling the player's survival status
-.int survival_status;
-const int SV_STATUS_PREY = 1;
-const int SV_STATUS_HUNTER = 2;
-
-// hardcoded player colors for survival
-const int SV_COLOR_PREY = 51; // green
-const int SV_COLOR_HUNTER = 68; // red
-#endif
+++ /dev/null
-#include "sv_survival.qh"
-
-float autocvar_g_survival_hunter_count = 0.25;
-float autocvar_g_survival_round_timelimit = 180;
-float autocvar_g_survival_warmup = 10;
-bool autocvar_g_survival_punish_teamkill = true;
-bool autocvar_g_survival_reward_survival = true;
-
-void surv_FakeTimeLimit(entity e, float t)
-{
- if(!IS_REAL_CLIENT(e))
- return;
-#if 0
- msg_entity = e;
- WriteByte(MSG_ONE, 3); // svc_updatestat
- WriteByte(MSG_ONE, 236); // STAT_TIMELIMIT
- if(t < 0)
- WriteCoord(MSG_ONE, autocvar_timelimit);
- else
- WriteCoord(MSG_ONE, (t + 1) / 60);
-#else
- STAT(SURVIVAL_ROUNDTIMER, e) = t;
-#endif
-}
-
-void nades_Clear(entity player);
-
-void Surv_UpdateScores(bool timed_out)
-{
- // give players their hard-earned kills now that the round is over
- FOREACH_CLIENT(true,
- {
- it.totalfrags += it.survival_validkills;
- if(it.survival_validkills)
- GameRules_scoring_add(it, SCORE, it.survival_validkills);
- it.survival_validkills = 0;
- // player survived the round
- if(IS_PLAYER(it) && !IS_DEAD(it))
- {
- if(autocvar_g_survival_reward_survival && timed_out && it.survival_status == SV_STATUS_PREY)
- GameRules_scoring_add(it, SCORE, 1); // reward survivors who make it to the end of the round time limit
- if(it.survival_status == SV_STATUS_PREY)
- GameRules_scoring_add(it, SV_SURVIVALS, 1);
- else if(it.survival_status == SV_STATUS_HUNTER)
- GameRules_scoring_add(it, SV_HUNTS, 1);
- }
- });
-}
-
-float Surv_CheckWinner()
-{
- if(round_handler_GetEndTime() > 0 && round_handler_GetEndTime() - time <= 0)
- {
- // if the match times out, survivors win too!
- Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_SURVIVAL_SURVIVOR_WIN);
- Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_SURVIVAL_SURVIVOR_WIN);
- FOREACH_CLIENT(true,
- {
- if(IS_PLAYER(it))
- nades_Clear(it);
- surv_FakeTimeLimit(it, -1);
- });
-
- Surv_UpdateScores(true);
-
- allowed_to_spawn = false;
- game_stopped = true;
- round_handler_Init(5, autocvar_g_survival_warmup, autocvar_g_survival_round_timelimit);
- return 1;
- }
-
- int survivor_count = 0, hunter_count = 0;
- FOREACH_CLIENT(IS_PLAYER(it) && !IS_DEAD(it),
- {
- if(it.survival_status == SV_STATUS_PREY)
- survivor_count++;
- else if(it.survival_status == SV_STATUS_HUNTER)
- hunter_count++;
- });
- if(survivor_count > 0 && hunter_count > 0)
- {
- return 0;
- }
-
- if(hunter_count > 0) // hunters win
- {
- Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_SURVIVAL_HUNTER_WIN);
- Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_SURVIVAL_HUNTER_WIN);
- }
- else if(survivor_count > 0) // survivors win
- {
- Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_SURVIVAL_SURVIVOR_WIN);
- Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_SURVIVAL_SURVIVOR_WIN);
- }
- else
- {
- Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_ROUND_TIED);
- Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_ROUND_TIED);
- }
-
- Surv_UpdateScores(false);
-
- allowed_to_spawn = false;
- game_stopped = true;
- round_handler_Init(5, autocvar_g_survival_warmup, autocvar_g_survival_round_timelimit);
-
- FOREACH_CLIENT(true,
- {
- if(IS_PLAYER(it))
- nades_Clear(it);
- surv_FakeTimeLimit(it, -1);
- });
-
- return 1;
-}
-
-void Surv_RoundStart()
-{
- allowed_to_spawn = boolean(warmup_stage);
- int playercount = 0;
- FOREACH_CLIENT(true,
- {
- if(IS_PLAYER(it) && !IS_DEAD(it))
- {
- ++playercount;
- it.survival_status = SV_STATUS_PREY;
- }
- else
- it.survival_status = 0; // this is mostly a safety check; if a client manages to somehow maintain a survival status, clear it before the round starts!
- it.survival_validkills = 0;
- });
- int hunter_count = bound(1, ((autocvar_g_survival_hunter_count >= 1) ? autocvar_g_survival_hunter_count : floor(playercount * autocvar_g_survival_hunter_count)), playercount - 1); // 20%, but ensure at least 1 and less than total
- int total_hunters = 0;
- FOREACH_CLIENT_RANDOM(IS_PLAYER(it) && !IS_DEAD(it),
- {
- if(total_hunters >= hunter_count)
- break;
- total_hunters++;
- it.survival_status = SV_STATUS_HUNTER;
- });
-
- FOREACH_CLIENT(IS_PLAYER(it) && !IS_DEAD(it),
- {
- if(it.survival_status == SV_STATUS_PREY)
- Send_Notification(NOTIF_ONE_ONLY, it, MSG_CENTER, CENTER_SURVIVAL_SURVIVOR);
- else if(it.survival_status == SV_STATUS_HUNTER)
- Send_Notification(NOTIF_ONE_ONLY, it, MSG_CENTER, CENTER_SURVIVAL_HUNTER);
-
- surv_FakeTimeLimit(it, round_handler_GetEndTime());
- });
-}
-
-bool Surv_CheckPlayers()
-{
- static int prev_missing_players;
- allowed_to_spawn = true;
- int playercount = 0;
- FOREACH_CLIENT(IS_PLAYER(it) && !IS_DEAD(it),
- {
- ++playercount;
- });
- if (playercount >= 2)
- {
- if(prev_missing_players > 0)
- Kill_Notification(NOTIF_ALL, NULL, MSG_CENTER, CPID_MISSING_PLAYERS);
- prev_missing_players = -1;
- return true;
- }
- if(playercount == 0)
- {
- if(prev_missing_players > 0)
- Kill_Notification(NOTIF_ALL, NULL, MSG_CENTER, CPID_MISSING_PLAYERS);
- prev_missing_players = -1;
- return false;
- }
- // if we get here, only 1 player is missing
- if(prev_missing_players != 1)
- {
- Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_MISSING_PLAYERS, 1);
- prev_missing_players = 1;
- }
- return false;
-}
-
-bool surv_isEliminated(entity e)
-{
- if(e.caplayer == 1 && (IS_DEAD(e) || e.frags == FRAGS_PLAYER_OUT_OF_GAME))
- return true;
- if(e.caplayer == 0.5)
- return true;
- return false;
-}
-
-void surv_Initialize() // run at the start of a match, initiates game mode
-{
- GameRules_scoring(0, SFL_SORT_PRIO_PRIMARY, 0, {
- field(SP_SV_SURVIVALS, "survivals", 0);
- field(SP_SV_HUNTS, "hunts", SFL_SORT_PRIO_SECONDARY);
- });
-
- allowed_to_spawn = true;
- round_handler_Spawn(Surv_CheckPlayers, Surv_CheckWinner, Surv_RoundStart);
- round_handler_Init(5, autocvar_g_survival_warmup, autocvar_g_survival_round_timelimit);
- EliminatedPlayers_Init(surv_isEliminated);
-}
-
-
-// ==============
-// Hook Functions
-// ==============
-
-MUTATOR_HOOKFUNCTION(sv, ClientObituary)
-{
- // in survival, announcing a frag would tell everyone who the hunter is
- entity frag_attacker = M_ARGV(1, entity);
- entity frag_target = M_ARGV(2, entity);
- if(IS_PLAYER(frag_attacker) && frag_attacker != frag_target)
- {
- float frag_deathtype = M_ARGV(3, float);
- entity wep_ent = M_ARGV(4, entity);
- // "team" kill, a point is awarded to the player by default so we must take it away plus an extra one
- // unless the player is going to be punished for suicide, in which case just remove one
- if(frag_attacker.survival_status == frag_target.survival_status)
- GiveFrags(frag_attacker, frag_target, ((autocvar_g_survival_punish_teamkill) ? -1 : -2), frag_deathtype, wep_ent.weaponentity_fld);
- }
-
- M_ARGV(5, bool) = true; // anonymous attacker
-}
-
-MUTATOR_HOOKFUNCTION(sv, PlayerPreThink)
-{
- entity player = M_ARGV(0, entity);
-
- if(IS_PLAYER(player) || player.caplayer)
- {
- // update the scoreboard colour display to out the real killer at the end of the round
- // running this every frame to avoid cheats
- int plcolor = SV_COLOR_PREY;
- if(player.survival_status == SV_STATUS_HUNTER && game_stopped)
- plcolor = SV_COLOR_HUNTER;
- setcolor(player, plcolor);
- }
-}
-
-MUTATOR_HOOKFUNCTION(sv, PlayerSpawn)
-{
- entity player = M_ARGV(0, entity);
-
- player.survival_status = 0;
- player.survival_validkills = 0;
- player.caplayer = 1;
- if (!warmup_stage)
- eliminatedPlayers.SendFlags |= 1;
-}
-
-MUTATOR_HOOKFUNCTION(sv, ForbidSpawn)
-{
- entity player = M_ARGV(0, entity);
-
- // spectators / observers that weren't playing can join; they are
- // immediately forced to observe in the PutClientInServer hook
- // this way they are put in a team and can play in the next round
- if (!allowed_to_spawn && player.caplayer)
- return true;
- return false;
-}
-
-MUTATOR_HOOKFUNCTION(sv, PutClientInServer)
-{
- entity player = M_ARGV(0, entity);
-
- if (!allowed_to_spawn && IS_PLAYER(player)) // this is true even when player is trying to join
- {
- TRANSMUTE(Observer, player);
- if (CS(player).jointime != time && !player.caplayer) // not when connecting
- {
- player.caplayer = 0.5;
- Send_Notification(NOTIF_ONE_ONLY, player, MSG_INFO, INFO_CA_JOIN_LATE);
- }
- }
-}
-
-MUTATOR_HOOKFUNCTION(sv, reset_map_players)
-{
- FOREACH_CLIENT(true, {
- CS(it).killcount = 0;
- it.survival_status = 0;
- surv_FakeTimeLimit(it, -1); // restore original timelimit
- if (!it.caplayer && IS_BOT_CLIENT(it))
- it.caplayer = 1;
- if (it.caplayer)
- {
- TRANSMUTE(Player, it);
- it.caplayer = 1;
- PutClientInServer(it);
- }
- });
- bot_relinkplayerlist();
- return true;
-}
-
-MUTATOR_HOOKFUNCTION(sv, reset_map_global)
-{
- allowed_to_spawn = true;
- return true;
-}
-
-entity surv_LastPlayerForTeam(entity this)
-{
- entity last_pl = NULL;
- FOREACH_CLIENT(IS_PLAYER(it) && it != this, {
- if (!IS_DEAD(it) && this.survival_status == it.survival_status)
- {
- if (!last_pl)
- last_pl = it;
- else
- return NULL;
- }
- });
- return last_pl;
-}
-
-void surv_LastPlayerForTeam_Notify(entity this)
-{
- if (!warmup_stage && round_handler_IsActive() && round_handler_IsRoundStarted())
- {
- entity pl = surv_LastPlayerForTeam(this);
- if (pl)
- Send_Notification(NOTIF_ONE_ONLY, pl, MSG_CENTER, CENTER_ALONE);
- }
-}
-
-MUTATOR_HOOKFUNCTION(sv, PlayerDies)
-{
- entity frag_attacker = M_ARGV(1, entity);
- entity frag_target = M_ARGV(2, entity);
- float frag_deathtype = M_ARGV(3, float);
-
- surv_LastPlayerForTeam_Notify(frag_target);
- if (!allowed_to_spawn)
- {
- frag_target.respawn_flags = RESPAWN_SILENT;
- // prevent unwanted sudden rejoin as spectator and movement of spectator camera
- frag_target.respawn_time = time + 2;
- }
- frag_target.respawn_flags |= RESPAWN_FORCE;
- if (!warmup_stage)
- {
- eliminatedPlayers.SendFlags |= 1;
- if (IS_BOT_CLIENT(frag_target))
- bot_clear(frag_target);
- }
-
- // killed an ally! punishment is death
- if(autocvar_g_survival_punish_teamkill && frag_attacker != frag_target && IS_PLAYER(frag_attacker) && IS_PLAYER(frag_target) && frag_attacker.survival_status == frag_target.survival_status && !ITEM_DAMAGE_NEEDKILL(frag_deathtype))
- if(!warmup_stage && round_handler_IsActive() && round_handler_IsRoundStarted()) // don't autokill if the round hasn't
- Damage(frag_attacker, frag_attacker, frag_attacker, 100000, DEATH_MIRRORDAMAGE.m_id, DMG_NOWEP, frag_attacker.origin, '0 0 0');
- return true;
-}
-
-MUTATOR_HOOKFUNCTION(sv, ClientDisconnect)
-{
- entity player = M_ARGV(0, entity);
-
- if (IS_PLAYER(player) && !IS_DEAD(player))
- surv_LastPlayerForTeam_Notify(player);
- return true;
-}
-
-MUTATOR_HOOKFUNCTION(sv, MakePlayerObserver)
-{
- entity player = M_ARGV(0, entity);
-
- if (IS_PLAYER(player) && !IS_DEAD(player))
- surv_LastPlayerForTeam_Notify(player);
- if (player.killindicator_teamchange == -2) // player wants to spectate
- player.caplayer = 0;
- if (player.caplayer)
- player.frags = FRAGS_PLAYER_OUT_OF_GAME;
- if (!warmup_stage)
- eliminatedPlayers.SendFlags |= 1;
- if (!player.caplayer)
- {
- player.survival_validkills = 0;
- player.survival_status = 0;
- surv_FakeTimeLimit(player, -1); // restore original timelimit
- return false; // allow team reset
- }
- return true; // prevent team reset
-}
-
-MUTATOR_HOOKFUNCTION(sv, Scores_CountFragsRemaining)
-{
- // announce remaining frags?
- return true;
-}
-
-MUTATOR_HOOKFUNCTION(sv, GiveFragsForKill, CBC_ORDER_FIRST)
-{
- entity frag_attacker = M_ARGV(0, entity);
- if(!warmup_stage && round_handler_IsActive() && round_handler_IsRoundStarted())
- frag_attacker.survival_validkills += M_ARGV(2, float);
- M_ARGV(2, float) = 0; // score will be given to the winner when the round ends
- return true;
-}
-
-MUTATOR_HOOKFUNCTION(sv, AddPlayerScore)
-{
- entity scorefield = M_ARGV(0, entity);
- if(scorefield == SP_KILLS || scorefield == SP_DEATHS || scorefield == SP_SUICIDES || scorefield == SP_DMG || scorefield == SP_DMGTAKEN)
- M_ARGV(1, float) = 0; // don't report that the player has killed or been killed, that would out them as a hunter!
-}
-
-MUTATOR_HOOKFUNCTION(sv, CalculateRespawnTime)
-{
- // no respawn calculations needed, player is forced to spectate anyway
- return true;
-}
-
-MUTATOR_HOOKFUNCTION(sv, Bot_FixCount, CBC_ORDER_EXCLUSIVE)
-{
- FOREACH_CLIENT(IS_REAL_CLIENT(it), {
- if (IS_PLAYER(it) || it.caplayer == 1)
- ++M_ARGV(0, int);
- ++M_ARGV(1, int);
- });
- return true;
-}
-
-MUTATOR_HOOKFUNCTION(sv, ClientCommand_Spectate)
-{
- entity player = M_ARGV(0, entity);
-
- if (player.caplayer)
- {
- // they're going to spec, we can do other checks
- if (autocvar_sv_spectate && (IS_SPEC(player) || IS_OBSERVER(player)))
- Send_Notification(NOTIF_ONE_ONLY, player, MSG_INFO, INFO_CA_LEAVE);
- return MUT_SPECCMD_FORCE;
- }
-
- return MUT_SPECCMD_CONTINUE;
-}
-
-MUTATOR_HOOKFUNCTION(sv, GetPlayerStatus)
-{
- entity player = M_ARGV(0, entity);
-
- return player.caplayer == 1;
-}
-
-MUTATOR_HOOKFUNCTION(sv, BotShouldAttack)
-{
- entity bot = M_ARGV(0, entity);
- entity targ = M_ARGV(1, entity);
-
- if(targ.survival_status == bot.survival_status)
- return true;
-}
+++ /dev/null
-#pragma once
-
-#include <common/mutators/base.qh>
-#include <common/scores.qh>
-void surv_Initialize();
-
-REGISTER_MUTATOR(sv, false)
-{
- MUTATOR_STATIC();
- MUTATOR_ONADD
- {
- surv_Initialize();
- }
- return false;
-}
-
-.int survival_validkills; // store the player's valid kills to be given at the end of the match (avoid exposing their score until then)
MSG_INFO_NOTIF(SPECTATE_WARNING, N_CONSOLE, 0, 1, "f1secs", "", "", _("^F2You have to become a player within the next %s, otherwise you will be kicked, because spectating isn't allowed at this time!"), "")
MSG_INFO_NOTIF(SUPERWEAPON_PICKUP, N_CONSOLE, 1, 0, "s1", "s1", "superweapons", _("^BG%s^K1 picked up a Superweapon"), "")
-//LegendGuard adds MSG_INFO_NOTIF from Mario/survival 15-02-2021
- MSG_INFO_NOTIF(SURVIVAL_HUNTER_WIN, N_CONSOLE, 0, 0, "", "", "", _("^K1Hunters^BG win the round"), "")
- MSG_INFO_NOTIF(SURVIVAL_SURVIVOR_WIN, N_CONSOLE, 0, 0, "", "", "", _("^F1Survivors^BG win the round"), "")
-
MSG_INFO_NOTIF(TEAMCHANGE_LARGERTEAM, N_CONSOLE, 0, 0, "", "", "", _("^BGYou cannot change to a larger team"), "")
MSG_INFO_NOTIF(TEAMCHANGE_NOTALLOWED, N_CONSOLE, 0, 0, "", "", "", _("^BGYou are not allowed to change teams"), "")
MSG_CENTER_NOTIF(SUPERWEAPON_BROKEN, N_ENABLE, 0, 0, "", CPID_POWERUP, "0 0", _("^F2Superweapons have broken down"), "")
MSG_CENTER_NOTIF(SUPERWEAPON_LOST, N_ENABLE, 0, 0, "", CPID_POWERUP, "0 0", _("^F2Superweapons have been lost"), "")
MSG_CENTER_NOTIF(SUPERWEAPON_PICKUP, N_ENABLE, 0, 0, "", CPID_POWERUP, "0 0", _("^F2You now have a superweapon"), "")
-//LegendGuard adds MSG_CENTER_NOTIF from Mario/survival 15-02-2021
- MSG_CENTER_NOTIF(SURVIVAL_HUNTER, N_ENABLE, 0, 0, "", CPID_SURVIVAL, "5 0", strcat(BOLD_OPERATOR, _("^BGYou are a ^K1hunter^BG! Eliminate the survivor(s) without raising suspicion!")), "")
- MSG_CENTER_NOTIF(SURVIVAL_HUNTER_WIN, N_ENABLE, 0, 0, "", CPID_ROUND, "0 0", _("^K1Hunters^BG win the round"), "")
- MSG_CENTER_NOTIF(SURVIVAL_SURVIVOR, N_ENABLE, 0, 0, "", CPID_SURVIVAL, "5 0", strcat(BOLD_OPERATOR, _("^BGYou are a ^F1survivor^BG! Identify and eliminate the hunter(s)!")), "")
- MSG_CENTER_NOTIF(SURVIVAL_SURVIVOR_WIN, N_ENABLE, 0, 0, "", CPID_ROUND, "0 0", _("^F1Survivors^BG win the round"), "")
-
MULTITEAM_CENTER(TEAMCHANGE, N_ENABLE, 0, 1, "", CPID_TEAMCHANGE, "1 f1", _("^K1Changing to ^TC^TT^K1 in ^COUNT"), "", NAME)
MSG_CENTER_NOTIF(TEAMCHANGE_AUTO, N_ENABLE, 0, 1, "", CPID_TEAMCHANGE, "1 f1", _("^K1Changing team in ^COUNT"), "")
MSG_CENTER_NOTIF(TEAMCHANGE_SPECTATE, N_ENABLE, 0, 1, "", CPID_TEAMCHANGE, "1 f1", _("^K1Spectating in ^COUNT"), "")
LOG_WARNF("Get_Notif_TypeName(%d): Improper net type!", ORDINAL(net_type));
return "";
}
-//LegendGuard adds CASE(CPID, SURVIVAL) after RACE_FINISHLAP from Mario/survival 15-02-2021
+
ENUMCLASS(CPID)
CASE(CPID, ASSAULT_ROLE)
CASE(CPID, ROUND)
CASE(CPID, OVERTIME)
CASE(CPID, POWERUP)
CASE(CPID, RACE_FINISHLAP)
- CASE(CPID, SURVIVAL)
CASE(CPID, TEAMCHANGE)
CASE(CPID, TIMEOUT)
CASE(CPID, TIMEIN)
float game_starttime; //point in time when the countdown to game start is over
float round_starttime; //point in time when the countdown to round start is over
-float overtime_starttime; // z411 point in time where first overtime started
-
float checkrules_overtimesadded; // z411 add
float timeout_last;
float timeout_total_time;
#ifdef SVQC
SPECTATE_COPYFIELD(_STAT(GUNALIGN))
#endif
-
-REGISTER_STAT(SURVIVAL_ROUNDTIMER, float) //LegendGuard adds SURVIVAL_ROUNDTIMER from Mario/survival 15-02-2021
GAMETYPE(MAPINFO_TYPE_ASSAULT) \
/* GAMETYPE(MAPINFO_TYPE_DUEL) */ \
/* GAMETYPE(MAPINFO_TYPE_INVASION) */ \
- GAMETYPE(MAPINFO_TYPE_SURVIVAL) \
- //LegendGuard adds GAMETYPE for menu from Mario/survival 15-02-2021
//LegendGuard adds GAMETYPE for menu from Mario/team_keepaway 15-02-2021
/**/
this.cnt = 0;
this.round_endtime = (this.round_timelimit) ? time + this.round_timelimit : 0;
this.nextthink = time;
- FOREACH_CLIENT(IS_PLAYER(it), { roundaccuracy_clear(it); });
if (this.roundStart) this.roundStart();
return;
}
// update accuracy stats
void accuracy_add(entity e, Weapon w, float fired, float hit);
-void roundaccuracy_clear(entity this);
// helper
bool accuracy_isgooddamage(entity attacker, entity targ);