From 55c19e57538b8309b80e536bec1e5e0e7953b616 Mon Sep 17 00:00:00 2001 From: Mario Date: Tue, 9 May 2023 09:12:52 +0000 Subject: [PATCH] Add Survival, a gamemode where randomly selected hunters must frag all the survivors without being caught --- .gitlab-ci.yml | 2 +- gamemodes-client.cfg | 1 + gamemodes-server.cfg | 20 + gfx/menu/luma/gametype_sv.tga | Bin 0 -> 65580 bytes gfx/menu/luminos/gametype_sv.tga | Bin 0 -> 65580 bytes gfx/menu/wickedx/gametype_sv.tga | Bin 0 -> 65580 bytes gfx/menu/xaw/gametype_sv.tga | Bin 0 -> 65580 bytes notifications.cfg | 6 + qcsrc/common/ent_cs.qc | 5 + qcsrc/common/gamemodes/gamemode/_mod.inc | 1 + qcsrc/common/gamemodes/gamemode/_mod.qh | 1 + .../gamemodes/gamemode/survival/_mod.inc | 8 + .../gamemodes/gamemode/survival/_mod.qh | 8 + .../gamemode/survival/cl_survival.qc | 59 +++ .../gamemode/survival/cl_survival.qh | 3 + .../gamemodes/gamemode/survival/survival.qc | 1 + .../gamemodes/gamemode/survival/survival.qh | 43 ++ .../gamemode/survival/sv_survival.qc | 431 ++++++++++++++++++ .../gamemode/survival/sv_survival.qh | 17 + qcsrc/common/notifications/all.inc | 8 + qcsrc/common/notifications/all.qh | 1 + qcsrc/common/scores.qh | 3 + qcsrc/menu/xonotic/util.qc | 1 + 23 files changed, 618 insertions(+), 1 deletion(-) create mode 100644 gfx/menu/luma/gametype_sv.tga create mode 100644 gfx/menu/luminos/gametype_sv.tga create mode 100644 gfx/menu/wickedx/gametype_sv.tga create mode 100644 gfx/menu/xaw/gametype_sv.tga create mode 100644 qcsrc/common/gamemodes/gamemode/survival/_mod.inc create mode 100644 qcsrc/common/gamemodes/gamemode/survival/_mod.qh create mode 100644 qcsrc/common/gamemodes/gamemode/survival/cl_survival.qc create mode 100644 qcsrc/common/gamemodes/gamemode/survival/cl_survival.qh create mode 100644 qcsrc/common/gamemodes/gamemode/survival/survival.qc create mode 100644 qcsrc/common/gamemodes/gamemode/survival/survival.qh create mode 100644 qcsrc/common/gamemodes/gamemode/survival/sv_survival.qc create mode 100644 qcsrc/common/gamemodes/gamemode/survival/sv_survival.qh diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8ba5c1806..edb153ac4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -75,7 +75,7 @@ test_sv_game: - wget -nv -O data/maps/stormkeep.waypoints https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/stormkeep.waypoints - wget -nv -O data/maps/stormkeep.waypoints.cache https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/stormkeep.waypoints.cache - - EXPECT=fe5dec36cb304c55acee73afd1e09c0a + - EXPECT=2e2290a8780a78ea6238a7b3d1386e39 - HASH=$(${ENGINE} +timestamps 1 +exec serverbench.cfg | tee /dev/stderr | sed -e 's,^\[[^]]*\] ,,' diff --git a/gamemodes-client.cfg b/gamemodes-client.cfg index 259c2c31d..c0562cfb8 100644 --- a/gamemodes-client.cfg +++ b/gamemodes-client.cfg @@ -34,6 +34,7 @@ alias cl_hook_gamestart_inv alias cl_hook_gamestart_duel alias cl_hook_gamestart_mayhem alias cl_hook_gamestart_tmayhem +alias cl_hook_gamestart_surv alias cl_hook_gameend alias cl_hook_shutdown alias cl_hook_activeweapon diff --git a/gamemodes-server.cfg b/gamemodes-server.cfg index eb0dcdcdc..23c97924e 100644 --- a/gamemodes-server.cfg +++ b/gamemodes-server.cfg @@ -31,6 +31,7 @@ alias sv_hook_gamestart_inv alias sv_hook_gamestart_duel alias sv_hook_gamestart_mayhem alias sv_hook_gamestart_tmayhem +alias sv_hook_gamestart_surv // 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 @@ -62,6 +63,7 @@ alias sv_vote_gametype_hook_tdm alias sv_vote_gametype_hook_duel alias sv_vote_gametype_hook_mayhem alias sv_vote_gametype_hook_tmayhem +alias sv_vote_gametype_hook_surv // Example preset to allow 1v1ctf to be used for the gametype voting screen. // Aliases can have max 31 chars so the gametype can have max 9 chars. @@ -226,6 +228,13 @@ set g_tmayhem_respawn_delay_large_count 0 set g_tmayhem_respawn_delay_max 0 set g_tmayhem_respawn_waves 0 set g_tmayhem_weapon_stay 0 +set g_surv_respawn_delay_small 0 +set g_surv_respawn_delay_small_count 0 +set g_surv_respawn_delay_large 0 +set g_surv_respawn_delay_large_count 0 +set g_surv_respawn_delay_max 0 +set g_surv_respawn_waves 0 +set g_surv_weapon_stay 0 // ========= @@ -636,3 +645,14 @@ set g_tmayhem_rot 0 "health and/or armor rotting, according to g_balance_health_ set g_tmayhem_teams 2 "how many teams are in team mayhem (set by mapinfo)" set g_tmayhem_team_spawns 0 "when 1, players spawn from the team spawnpoints of the map, if any" set g_tmayhem_teams_override 0 "how many teams are in team mayhem" + +// ========== +// 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 120 "round time limit in seconds" diff --git a/gfx/menu/luma/gametype_sv.tga b/gfx/menu/luma/gametype_sv.tga new file mode 100644 index 0000000000000000000000000000000000000000..050fb7b06f8ddde547df87a9ae79b490ebf6aaf3 GIT binary patch literal 65580 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

l->>;U-t28Q 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 literal 0 HcmV?d00001 diff --git a/gfx/menu/luminos/gametype_sv.tga b/gfx/menu/luminos/gametype_sv.tga new file mode 100644 index 0000000000000000000000000000000000000000..c5486651c799ca3727fc9637dd5c1b4ebfbb2b41 GIT binary patch literal 65580 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 literal 0 HcmV?d00001 diff --git a/gfx/menu/wickedx/gametype_sv.tga b/gfx/menu/wickedx/gametype_sv.tga new file mode 100644 index 0000000000000000000000000000000000000000..c5486651c799ca3727fc9637dd5c1b4ebfbb2b41 GIT binary patch literal 65580 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 literal 0 HcmV?d00001 diff --git a/gfx/menu/xaw/gametype_sv.tga b/gfx/menu/xaw/gametype_sv.tga new file mode 100644 index 0000000000000000000000000000000000000000..debbce06f8e5c812b51316d4e124538941e36ff1 GIT binary patch literal 65580 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 Y9XH!)!uAuk-fHz-HlHwYvo+@UA8$lJj{pDw literal 0 HcmV?d00001 diff --git a/notifications.cfg b/notifications.cfg index 8eff36f2e..c2225f26e 100644 --- a/notifications.cfg +++ b/notifications.cfg @@ -276,6 +276,8 @@ seta notification_INFO_SCORES "1" "0 = off, 1 = print to console, 2 = print to c seta notification_INFO_SPECTATE_WARNING "1" "0 = off, 1 = print to console, 2 = print to console and chatbox (if notification_allow_chatboxprint is enabled)" 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)" +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_SURVIVOR_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)" @@ -533,6 +535,10 @@ seta notification_CENTER_SEQUENCE_COUNTER_FEWMORE "1" "0 = off, 1 = centerprint" 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" +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" seta notification_CENTER_TEAMCHANGE_SPECTATE "1" "0 = off, 1 = centerprint" diff --git a/qcsrc/common/ent_cs.qc b/qcsrc/common/ent_cs.qc index 85119de08..b84a98ca6 100644 --- a/qcsrc/common/ent_cs.qc +++ b/qcsrc/common/ent_cs.qc @@ -157,6 +157,11 @@ ENTCS_PROP(SOLID, true, sv_solid, solid, ENTCS_SET_NORMAL, { WriteByte(chan, ent.sv_solid); }, { ent.sv_solid = ReadByte(); }) +// 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 int ENTCS_PUBLICMASK = 0, ENTCS_PRIVATEMASK = 0; diff --git a/qcsrc/common/gamemodes/gamemode/_mod.inc b/qcsrc/common/gamemodes/gamemode/_mod.inc index 1ca6b1d94..12a5510c3 100644 --- a/qcsrc/common/gamemodes/gamemode/_mod.inc +++ b/qcsrc/common/gamemodes/gamemode/_mod.inc @@ -16,5 +16,6 @@ #include #include #include +#include #include #include diff --git a/qcsrc/common/gamemodes/gamemode/_mod.qh b/qcsrc/common/gamemodes/gamemode/_mod.qh index ca2cffe8b..a3208d4a6 100644 --- a/qcsrc/common/gamemodes/gamemode/_mod.qh +++ b/qcsrc/common/gamemodes/gamemode/_mod.qh @@ -16,5 +16,6 @@ #include #include #include +#include #include #include diff --git a/qcsrc/common/gamemodes/gamemode/survival/_mod.inc b/qcsrc/common/gamemodes/gamemode/survival/_mod.inc new file mode 100644 index 000000000..7121d392e --- /dev/null +++ b/qcsrc/common/gamemodes/gamemode/survival/_mod.inc @@ -0,0 +1,8 @@ +// generated file; do not modify +#include +#ifdef CSQC + #include +#endif +#ifdef SVQC + #include +#endif diff --git a/qcsrc/common/gamemodes/gamemode/survival/_mod.qh b/qcsrc/common/gamemodes/gamemode/survival/_mod.qh new file mode 100644 index 000000000..875e4d247 --- /dev/null +++ b/qcsrc/common/gamemodes/gamemode/survival/_mod.qh @@ -0,0 +1,8 @@ +// generated file; do not modify +#include +#ifdef CSQC + #include +#endif +#ifdef SVQC + #include +#endif diff --git a/qcsrc/common/gamemodes/gamemode/survival/cl_survival.qc b/qcsrc/common/gamemodes/gamemode/survival/cl_survival.qc new file mode 100644 index 000000000..02d0907ab --- /dev/null +++ b/qcsrc/common/gamemodes/gamemode/survival/cl_survival.qc @@ -0,0 +1,59 @@ +#include "cl_survival.qh" + +#include +#include + +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 == SURV_STATUS_HUNTER) + { + player_text = _("Hunter"); + player_color = '1 0 0'; + //player_icon = "player_red"; + } + else if(mystatus == SURV_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; + } + + drawstring_aspect(pos, player_text, vec2(mySize.x, mySize.y), player_color, panel_fg_alpha, DRAWFLAG_NORMAL); +} + +REGISTER_MUTATOR(cl_surv, true); + +MUTATOR_HOOKFUNCTION(cl_surv, 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 = SURV_COLOR_PREY; // default to survivor + if((mystatus == SURV_STATUS_HUNTER || intermission || STAT(GAME_STOPPED)) && surv_status == SURV_STATUS_HUNTER) + plcolor = SURV_COLOR_HUNTER; + + player.colormap = 1024 + plcolor; + return true; +} + +MUTATOR_HOOKFUNCTION(cl_surv, DrawScoreboard_Force) +{ + // show the scoreboard when the round ends, so players can see who the hunter was + return STAT(GAME_STOPPED); +} diff --git a/qcsrc/common/gamemodes/gamemode/survival/cl_survival.qh b/qcsrc/common/gamemodes/gamemode/survival/cl_survival.qh new file mode 100644 index 000000000..057120a1f --- /dev/null +++ b/qcsrc/common/gamemodes/gamemode/survival/cl_survival.qh @@ -0,0 +1,3 @@ +#pragma once + +void HUD_Mod_Survival(vector pos, vector mySize); diff --git a/qcsrc/common/gamemodes/gamemode/survival/survival.qc b/qcsrc/common/gamemodes/gamemode/survival/survival.qc new file mode 100644 index 000000000..1f2d14402 --- /dev/null +++ b/qcsrc/common/gamemodes/gamemode/survival/survival.qc @@ -0,0 +1 @@ +#include "survival.qh" diff --git a/qcsrc/common/gamemodes/gamemode/survival/survival.qh b/qcsrc/common/gamemodes/gamemode/survival/survival.qh new file mode 100644 index 000000000..baddfb5c2 --- /dev/null +++ b/qcsrc/common/gamemodes/gamemode/survival/survival.qh @@ -0,0 +1,43 @@ +#pragma once + +#include +#include + +#ifdef CSQC +void HUD_Mod_Survival(vector pos, vector mySize); +#endif +CLASS(Survival, Gametype) + INIT(Survival) + { + this.gametype_init(this, _("Survival"), "surv", "g_survival", GAMETYPE_FLAG_USEPOINTS, "", "timelimit=20 pointlimit=12", _("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 SURV_STATUS_PREY = 1; +const int SURV_STATUS_HUNTER = 2; + +// hardcoded player colors for survival +const int SURV_COLOR_PREY = 51; // green +const int SURV_COLOR_HUNTER = 68; // red +#endif diff --git a/qcsrc/common/gamemodes/gamemode/survival/sv_survival.qc b/qcsrc/common/gamemodes/gamemode/survival/sv_survival.qc new file mode 100644 index 000000000..6414686e0 --- /dev/null +++ b/qcsrc/common/gamemodes/gamemode/survival/sv_survival.qc @@ -0,0 +1,431 @@ +#include "sv_survival.qh" + +float autocvar_g_survival_hunter_count = 0.25; +float autocvar_g_survival_round_timelimit = 120; +float autocvar_g_survival_warmup = 10; +bool autocvar_g_survival_punish_teamkill = true; +bool autocvar_g_survival_reward_survival = true; + +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 == SURV_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 == SURV_STATUS_PREY) + GameRules_scoring_add(it, SURV_SURVIVALS, 1); + else if(it.survival_status == SURV_STATUS_HUNTER) + GameRules_scoring_add(it, SURV_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_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 == SURV_STATUS_PREY) + survivor_count++; + else if(it.survival_status == SURV_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); + }); + + 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 = SURV_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 = SURV_STATUS_HUNTER; + }); + + FOREACH_CLIENT(IS_PLAYER(it) && !IS_DEAD(it), + { + if(it.survival_status == SURV_STATUS_PREY) + Send_Notification(NOTIF_ONE_ONLY, it, MSG_CENTER, CENTER_SURVIVAL_SURVIVOR); + else if(it.survival_status == SURV_STATUS_HUNTER) + Send_Notification(NOTIF_ONE_ONLY, it, MSG_CENTER, CENTER_SURVIVAL_HUNTER); + }); +} + +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(INGAME_JOINED(e) && (IS_DEAD(e) || e.frags == FRAGS_PLAYER_OUT_OF_GAME)) + return true; + if(INGAME_JOINING(e)) + 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_SURV_SURVIVALS, "survivals", 0); + field(SP_SURV_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(surv, 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); + } + + if(frag_attacker.survival_status == SURV_STATUS_HUNTER) + M_ARGV(5, bool) = true; // anonymous attacker +} + +MUTATOR_HOOKFUNCTION(surv, PlayerPreThink) +{ + entity player = M_ARGV(0, entity); + + if(IS_PLAYER(player) || INGAME_JOINED(player)) + { + // 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 = SURV_COLOR_PREY; + if(player.survival_status == SURV_STATUS_HUNTER && game_stopped) + plcolor = SURV_COLOR_HUNTER; + setcolor(player, plcolor); + } +} + +MUTATOR_HOOKFUNCTION(surv, PlayerSpawn) +{ + entity player = M_ARGV(0, entity); + + player.survival_status = 0; + player.survival_validkills = 0; + INGAME_STATUS_SET(player, INGAME_STATUS_JOINED); + if (!warmup_stage) + eliminatedPlayers.SendFlags |= 1; +} + +MUTATOR_HOOKFUNCTION(surv, 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 && INGAME(player)) + return true; + return false; +} + +MUTATOR_HOOKFUNCTION(surv, 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 && !INGAME(player)) // not when connecting + { + INGAME_STATUS_SET(player, INGAME_STATUS_JOINING); + Send_Notification(NOTIF_ONE_ONLY, player, MSG_INFO, INFO_CA_JOIN_LATE); + } + } +} + +MUTATOR_HOOKFUNCTION(surv, reset_map_players) +{ + FOREACH_CLIENT(true, { + CS(it).killcount = 0; + it.survival_status = 0; + if (INGAME(it) || IS_BOT_CLIENT(it)) + { + TRANSMUTE(Player, it); + INGAME_STATUS_SET(it, INGAME_STATUS_JOINED); + PutClientInServer(it); + } + }); + bot_relinkplayerlist(); + return true; +} + +MUTATOR_HOOKFUNCTION(surv, 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(surv, 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_clearqueue(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(surv, ClientDisconnect) +{ + entity player = M_ARGV(0, entity); + + if (IS_PLAYER(player) && !IS_DEAD(player)) + surv_LastPlayerForTeam_Notify(player); + return true; +} + +MUTATOR_HOOKFUNCTION(surv, MakePlayerObserver) +{ + entity player = M_ARGV(0, entity); + bool is_forced = M_ARGV(1, bool); + if (is_forced && INGAME(player)) + INGAME_STATUS_CLEAR(player); + + if (IS_PLAYER(player) && !IS_DEAD(player)) + surv_LastPlayerForTeam_Notify(player); + if (player.killindicator_teamchange == -2) // player wants to spectate + INGAME_STATUS_CLEAR(player); + if (INGAME(player)) + player.frags = FRAGS_PLAYER_OUT_OF_GAME; + if (!warmup_stage) + eliminatedPlayers.SendFlags |= 1; + if (!INGAME(player)) + { + player.survival_validkills = 0; + player.survival_status = 0; + return false; // allow team reset + } + return true; // prevent team reset +} + +MUTATOR_HOOKFUNCTION(surv, Scores_CountFragsRemaining) +{ + // announce remaining frags? + return true; +} + +MUTATOR_HOOKFUNCTION(surv, 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(surv, 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(surv, CalculateRespawnTime) +{ + // no respawn calculations needed, player is forced to spectate anyway + return true; +} + +MUTATOR_HOOKFUNCTION(surv, Bot_FixCount, CBC_ORDER_EXCLUSIVE) +{ + FOREACH_CLIENT(IS_REAL_CLIENT(it), { + if (IS_PLAYER(it) || INGAME_JOINED(it)) + ++M_ARGV(0, int); + ++M_ARGV(1, int); + }); + return true; +} + +MUTATOR_HOOKFUNCTION(surv, ClientCommand_Spectate) +{ + entity player = M_ARGV(0, entity); + + if (INGAME(player)) + { + // 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(surv, BotShouldAttack) +{ + entity bot = M_ARGV(0, entity); + entity targ = M_ARGV(1, entity); + + if(targ.survival_status == bot.survival_status) + return true; +} diff --git a/qcsrc/common/gamemodes/gamemode/survival/sv_survival.qh b/qcsrc/common/gamemodes/gamemode/survival/sv_survival.qh new file mode 100644 index 000000000..129410a5a --- /dev/null +++ b/qcsrc/common/gamemodes/gamemode/survival/sv_survival.qh @@ -0,0 +1,17 @@ +#pragma once + +#include +#include +void surv_Initialize(); + +REGISTER_MUTATOR(surv, 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) diff --git a/qcsrc/common/notifications/all.inc b/qcsrc/common/notifications/all.inc index ffb3f9f4b..51db0c100 100644 --- a/qcsrc/common/notifications/all.inc +++ b/qcsrc/common/notifications/all.inc @@ -443,6 +443,9 @@ string multiteam_info_sprintf(string input, string teamname) { return ((input != MSG_INFO_NOTIF(SUPERWEAPON_PICKUP, N_CONSOLE, 1, 0, "s1", "s1", "superweapons", _("^BG%s^K1 picked up a Superweapon"), "") + 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"), "") @@ -776,6 +779,11 @@ string multiteam_info_sprintf(string input, string teamname) { return ((input != 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"), "") + 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"), "") diff --git a/qcsrc/common/notifications/all.qh b/qcsrc/common/notifications/all.qh index 9d39c2199..00bd94bb7 100644 --- a/qcsrc/common/notifications/all.qh +++ b/qcsrc/common/notifications/all.qh @@ -68,6 +68,7 @@ ENUMCLASS(CPID) CASE(CPID, OVERTIME) CASE(CPID, POWERUP) CASE(CPID, RACE_FINISHLAP) + CASE(CPID, SURVIVAL) CASE(CPID, TEAMCHANGE) CASE(CPID, TIMEOUT) CASE(CPID, TIMEIN) diff --git a/qcsrc/common/scores.qh b/qcsrc/common/scores.qh index 3449f2b53..18a74c1bf 100644 --- a/qcsrc/common/scores.qh +++ b/qcsrc/common/scores.qh @@ -60,6 +60,9 @@ REGISTER_SP(NEXBALL_FAULTS); REGISTER_SP(ONS_CAPS); REGISTER_SP(ONS_TAKES); +REGISTER_SP(SURV_SURVIVALS); +REGISTER_SP(SURV_HUNTS); + REGISTER_SP(SCORE); REGISTER_SP(KILLS); REGISTER_SP(DEATHS); diff --git a/qcsrc/menu/xonotic/util.qc b/qcsrc/menu/xonotic/util.qc index 86b0f5e87..233ce1414 100644 --- a/qcsrc/menu/xonotic/util.qc +++ b/qcsrc/menu/xonotic/util.qc @@ -662,6 +662,7 @@ float updateCompression() GAMETYPE(MAPINFO_TYPE_NEXBALL) \ GAMETYPE(MAPINFO_TYPE_ONSLAUGHT) \ GAMETYPE(MAPINFO_TYPE_ASSAULT) \ + GAMETYPE(MAPINFO_TYPE_SURVIVAL) \ /* GAMETYPE(MAPINFO_TYPE_DUEL) */ \ /**/ -- 2.39.2