From: z411 Date: Tue, 11 Oct 2022 06:48:12 +0000 (-0300) Subject: Add option to disable freecam in Clan Arena X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=21f7e2cc52aedd9630dadac7ca657ba2a75b65ad;p=xonotic%2Fxonotic-data.pk3dir.git Add option to disable freecam in Clan Arena --- diff --git a/gamemodes-server.cfg b/gamemodes-server.cfg index a57c8f135..89d3ab957 100644 --- a/gamemodes-server.cfg +++ b/gamemodes-server.cfg @@ -222,7 +222,7 @@ set g_assault 0 "Assault: attack the enemy base as fast as you can, then defend set g_ca 0 "Clan Arena: Played in rounds, once you're dead you're out! The team with survivors wins the round" set g_ca_point_limit -1 "Clan Arena point limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)" set g_ca_point_leadlimit -1 "Clan Arena point lead limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)" -set g_ca_spectate_enemies 0 "allow eliminated players to spectate enemy players during Clan Arena games" +set g_ca_spectate_enemies 0 "allow eliminated players to spectate enemy players during Clan Arena games. -1 blocks freeroam camera" set g_ca_warmup 10 "time players get to run around before the round starts" set g_ca_damage2score 100 "every this amount of damage done give players 1 point" set g_ca_round_timelimit 180 "round time limit in seconds" diff --git a/qcsrc/client/hud/panel/infomessages.qc b/qcsrc/client/hud/panel/infomessages.qc index 0f0325eeb..438fb4de6 100644 --- a/qcsrc/client/hud/panel/infomessages.qc +++ b/qcsrc/client/hud/panel/infomessages.qc @@ -109,8 +109,10 @@ void HUD_InfoMessages() case 1: if(spectatee_status == -1) s = sprintf(_("^1Use ^3%s^1 or ^3%s^1 to change the speed"), getcommandkey(_("next weapon"), "weapnext"), getcommandkey(_("previous weapon"), "weapprev")); - else + else if(!observe_blocked) s = sprintf(_("^1Press ^3%s^1 to observe, ^3%s^1 to change camera mode"), getcommandkey(_("secondary fire"), "+fire2"), getcommandkey(_("drop weapon"), "dropweapon")); + else + s = sprintf(_("^1Press ^3%s^1 to change camera mode"), getcommandkey(_("drop weapon"), "dropweapon")); break; case 2: s = sprintf(_("^1Press ^3%s^1 for gamemode info"), getcommandkey(_("server info"), "+show_info")); diff --git a/qcsrc/client/main.qc b/qcsrc/client/main.qc index ff51fb54c..1d9d07801 100644 --- a/qcsrc/client/main.qc +++ b/qcsrc/client/main.qc @@ -653,6 +653,7 @@ NET_HANDLE(ENT_CLIENT_CLIENTDATA, bool isnew) newspectatee_status = 0; spectatorbutton_zoom = (f & BIT(2)); + observe_blocked = (f & BIT(3)); if(f & BIT(4)) { diff --git a/qcsrc/client/main.qh b/qcsrc/client/main.qh index 1f1c29002..00dd14963 100644 --- a/qcsrc/client/main.qh +++ b/qcsrc/client/main.qh @@ -97,6 +97,7 @@ vector view_origin, view_forward, view_right, view_up; bool button_zoom; bool spectatorbutton_zoom; +bool observe_blocked; bool button_attack2; float current_viewzoom; diff --git a/qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qc b/qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qc index 7803108c6..383a281d5 100644 --- a/qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qc +++ b/qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qc @@ -1,7 +1,6 @@ #include "sv_clanarena.qh" float autocvar_g_ca_damage2score = 100; -bool autocvar_g_ca_spectate_enemies; float autocvar_g_ca_start_health = 200; float autocvar_g_ca_start_armor = 200; @@ -287,6 +286,8 @@ MUTATOR_HOOKFUNCTION(ca, MakePlayerObserver) player.frags = FRAGS_PLAYER_OUT_OF_GAME; if (!warmup_stage) eliminatedPlayers.SendFlags |= 1; + if (autocvar_g_ca_spectate_enemies == -1) + player.would_spectate = true; // force to spectate only if (!INGAME(player)) return false; // allow team reset return true; // prevent team reset @@ -425,7 +426,7 @@ MUTATOR_HOOKFUNCTION(ca, SpectateSet) entity client = M_ARGV(0, entity); entity targ = M_ARGV(1, entity); - if (!autocvar_g_ca_spectate_enemies && INGAME(client)) + if (autocvar_g_ca_spectate_enemies != 0 && INGAME(client)) if (DIFF_TEAM(targ, client)) return true; } @@ -434,7 +435,7 @@ MUTATOR_HOOKFUNCTION(ca, SpectateNext) { entity client = M_ARGV(0, entity); - if (!autocvar_g_ca_spectate_enemies && INGAME(client) + if (autocvar_g_ca_spectate_enemies != 0 && INGAME(client) && Team_GetNumberOfAlivePlayers(Entity_GetTeam(client))) { entity targ = M_ARGV(1, entity); @@ -449,7 +450,7 @@ MUTATOR_HOOKFUNCTION(ca, SpectatePrev) entity targ = M_ARGV(1, entity); entity first = M_ARGV(2, entity); - if (!autocvar_g_ca_spectate_enemies && INGAME(client) + if (autocvar_g_ca_spectate_enemies != 0 && INGAME(client) && Team_GetNumberOfAlivePlayers(Entity_GetTeam(client))) { do { targ = targ.chain; } diff --git a/qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qh b/qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qh index c7e147a21..c6a4ebe99 100644 --- a/qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qh +++ b/qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qh @@ -5,6 +5,7 @@ #include #include +int autocvar_g_ca_spectate_enemies; int autocvar_g_ca_point_limit; int autocvar_g_ca_point_leadlimit; float autocvar_g_ca_round_timelimit; diff --git a/qcsrc/server/client.qc b/qcsrc/server/client.qc index eb2ba1dcf..ba3428c5c 100644 --- a/qcsrc/server/client.qc +++ b/qcsrc/server/client.qc @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -138,6 +139,7 @@ bool ClientData_Send(entity this, entity to, int sf) if (CS(e).race_completed) sf |= BIT(0); // forced scoreboard if (CS(to).spectatee_status) sf |= BIT(1); // spectator ent number follows if (CS(e).zoomstate) sf |= BIT(2); // zoomed + if (observe_blocked) sf |= BIT(3); // observing blocked if (autocvar_sv_showspectators == 1 || (autocvar_sv_showspectators && IS_SPEC(to))) sf |= BIT(4); // show spectators @@ -2253,10 +2255,12 @@ void ObserverOrSpectatorThink(entity this) } CS(this).impulse = 0; } else if(PHYS_INPUT_BUTTON_ATCK2(this)) { - this.would_spectate = false; - this.flags &= ~FL_JUMPRELEASED; - TRANSMUTE(Observer, this); - PutClientInServer(this); + if(!observe_blocked) { + this.would_spectate = false; + this.flags &= ~FL_JUMPRELEASED; + TRANSMUTE(Observer, this); + PutClientInServer(this); + } } else if(!SpectateUpdate(this) && !SpectateNext(this)) { PutObserverInServer(this, false, true); this.would_spectate = true; diff --git a/qcsrc/server/world.qc b/qcsrc/server/world.qc index 7f651fa77..119341cd2 100644 --- a/qcsrc/server/world.qc +++ b/qcsrc/server/world.qc @@ -706,6 +706,9 @@ void InitGameplayMode() cache_mutatormsg = strzone(""); cache_lastmutatormsg = strzone(""); + if (g_ca && autocvar_g_ca_spectate_enemies == -1) + observe_blocked = true; + InitializeEntity(NULL, GameplayMode_DelayedInit, INITPRIO_GAMETYPE_FALLBACK); } diff --git a/qcsrc/server/world.qh b/qcsrc/server/world.qh index d82469c11..fe43e3881 100644 --- a/qcsrc/server/world.qh +++ b/qcsrc/server/world.qh @@ -159,3 +159,5 @@ void droptofloor(entity this); IntrusiveList g_moveables; STATIC_INIT(g_moveables) { g_moveables = IL_NEW(); } + +bool observe_blocked = false;