From ad90fce411cf1ba9cd925475bd41b472bb7300c4 Mon Sep 17 00:00:00 2001 From: Blaubeeree Date: Fri, 19 Feb 2021 18:21:08 +0100 Subject: [PATCH 1/4] made it possible to change gamesettings in the f1-menu on dedicated servers --- src/gamemodes/amongus/gamemode/cl_net.moon | 21 ++++++++++ src/gamemodes/amongus/gamemode/shared.moon | 42 +++++++++++++++---- src/gamemodes/amongus/gamemode/sv_net.moon | 33 +++++++++++++++ .../amongus/gamemode/vgui/vgui_showhelp.moon | 11 ++++- 4 files changed, 96 insertions(+), 11 deletions(-) diff --git a/src/gamemodes/amongus/gamemode/cl_net.moon b/src/gamemodes/amongus/gamemode/cl_net.moon index 37868df..1ff3523 100644 --- a/src/gamemodes/amongus/gamemode/cl_net.moon +++ b/src/gamemodes/amongus/gamemode/cl_net.moon @@ -498,3 +498,24 @@ net.Receive "NMW AU Flow", -> switch net.ReadUInt GAMEMODE.FlowSize when GAMEMODE.FlowTypes.GameChatNotification chat.AddText Color(220, 32, 32), "[Among Us] ", Color(255, 255, 0), tostring TRANSLATE "chat.noTalkingDuringGame" + +skipSync = {} +for _, cvar in ipairs GAMEMODE.replicatedWritableCvars + cvars.AddChangeCallback GAMEMODE.ConVars[cvar]\GetName!, ((cvar, oldValue, newValue) -> + if skipSync[cvar] + skipSync[cvar] = false + elseif CAMI.PlayerHasAccess LocalPlayer!, GAMEMODE.PRIV_CHANGE_SETTINGS + net.Start "AU ChangeCvar" + net.WriteString cvar + net.WriteString newValue + net.SendToServer! + else + print "Only admins can change ConVar #{cvar}" + skipSync[cvar] = true + RunConsoleCommand cvar, oldValue + ), "SendToServer" + +net.Receive "AU ChangeCvar", (len, ply) -> + cvar = net.ReadString! + skipSync[cvar] = true + RunConsoleCommand cvar, net.ReadString! \ No newline at end of file diff --git a/src/gamemodes/amongus/gamemode/shared.moon b/src/gamemodes/amongus/gamemode/shared.moon index ae49bf3..b3aab9e 100644 --- a/src/gamemodes/amongus/gamemode/shared.moon +++ b/src/gamemodes/amongus/gamemode/shared.moon @@ -17,7 +17,8 @@ GM.WorkshopID = "{{CI_WORKSHOP_ID}}" GM.Version = "manual-build" if GM.Version == "{{" .. "CI_GAMEMODE_VERSION}}" GM.WorkshopID = nil if GM.WorkshopID == "{{" .. "CI_WORKSHOP_ID}}" -flags = bit.bor FCVAR_ARCHIVE, FCVAR_REPLICATED +flags = FCVAR_ARCHIVE +flagsRep = bit.bor FCVAR_ARCHIVE, FCVAR_REPLICATED --- Table of all ConVars the game mode is using. -- These are tracked and cannot be changed during the round. @@ -45,7 +46,7 @@ flags = bit.bor FCVAR_ARCHIVE, FCVAR_REPLICATED -- @field ForceAutoWarmup (Bool) Should the automated round management be forced? GM.ConVars = ImposterCount: CreateConVar "au_max_imposters" , 1 , flags, "", 1, 10 - MinPlayers: CreateConVar "au_min_players" , 3 , flags, "", 3, 128 + MinPlayers: CreateConVar "au_min_players" , 3 , flagsRep, "", 3, 128 KillCooldown: CreateConVar "au_kill_cooldown" , 20, flags, "", 1, 60 KillDistanceMod: CreateConVar "au_killdistance_mod", 1 , flags, "", 1, 3 ConfirmEjects: CreateConVar "au_confirm_ejects" , 1 , flags, "", 0, 1 @@ -65,19 +66,42 @@ GM.ConVars = TasksCommon: CreateConVar "au_tasks_common" , 1, flags, "", 0, 5 TasksVisual: CreateConVar "au_tasks_enable_visual", 0, flags, "", 0, 1 - DistributeTasksToBots: CreateConVar "au_debug_bot_tasks" , 0, flags, "", 0, 1 - MeetingBotVote: CreateConVar "au_debug_bot_vote" , 0, flags, "", 0, 1 + DistributeTasksToBots: CreateConVar "au_debug_bot_tasks" , 0, flagsRep, "", 0, 1 + MeetingBotVote: CreateConVar "au_debug_bot_vote" , 0, flagsRep, "", 0, 1 TimeLimit: CreateConVar "au_time_limit", 600, flags, "", 0, 1200 - Countdown: CreateConVar "au_countdown" , 5 , flags, "", 1, 10 + Countdown: CreateConVar "au_countdown" , 5 , flagsRep, "", 1, 10 - WarmupTime: CreateConVar "au_warmup_time" , 60, flags, "", 0, 120 - ForceAutoWarmup: CreateConVar "au_warmup_force_auto", 0 , flags, "", 0, 1 + WarmupTime: CreateConVar "au_warmup_time" , 60, flagsRep, "", 0, 120 + ForceAutoWarmup: CreateConVar "au_warmup_force_auto", 0 , flagsRep, "", 0, 1 PlayerModel: CreateConVar "au_player_model", "models/amongus/player/player.mdl", - flags, "" + flagsRep, "" CorpseModel: CreateConVar "au_corpse_model", "models/amongus/player/corpse.mdl", - flags, "" + flagsRep, "" + +GM.replicatedWritableCvars = { + "ImposterCount" + "KillCooldown" + "TimeLimit" + "KillDistanceMod" + "AllTalk" + "TaskbarUpdates" + "PlayerSpeedMod" + + "MeetingsPerPlayer" + "MeetingCooldown" + "VoteTime" + "VotePreTime" + "VotePostTime" + "ConfirmEjects" + "VoteAnonymous" + + "TasksShort" + "TasksLong" + "TasksCommon" + "TasksVisual" +} --- Enum of all colors players can get. -- @table GM.Colors diff --git a/src/gamemodes/amongus/gamemode/sv_net.moon b/src/gamemodes/amongus/gamemode/sv_net.moon index e8bea95..178ac28 100644 --- a/src/gamemodes/amongus/gamemode/sv_net.moon +++ b/src/gamemodes/amongus/gamemode/sv_net.moon @@ -3,6 +3,7 @@ -- @module sv_net util.AddNetworkString "NMW AU Flow" +util.AddNetworkString "AU ChangeCvar" --- Sends the game state update. -- @param ply Player entity. @@ -422,6 +423,7 @@ net.Receive "NMW AU Flow", (len, ply) -> ply\SetPlayerColor GAMEMODE.Colors[preferred]\ToVector! GAMEMODE\Net_UpdateGameState ply + GAMEMODE\Net_SyncGameSettings ply -- -- Player has closed the task window. @@ -532,3 +534,34 @@ GM.SetOnAutoPilot = (newState) => -- @return You guessed it again. GM.SetFullyInitializedPlayerCount = (newCount) => SetGlobalInt "NMW AU FullyInitializedPlayers", newCount + +GM.Net_SyncGameSettings = (ply) => + for _, cvar in ipairs GAMEMODE.replicatedWritableCvars + net.Start "AU ChangeCvar" + net.WriteString GAMEMODE.ConVars[cvar]\GetName! + net.WriteString GAMEMODE.ConVars[cvar]\GetString! + net.Send ply + +skipSync = {} +for _, cvar in ipairs GAMEMODE.replicatedWritableCvars + cvars.AddChangeCallback GAMEMODE.ConVars[cvar]\GetName!, ((cvar, oldValue, newValue) -> + if skipSync[cvar] + skipSync[cvar] = false + else + net.Start "AU ChangeCvar" + net.WriteString cvar + net.WriteString newValue + net.Broadcast! + ), "SendToClient" + +net.Receive "AU ChangeCvar", (len, ply) -> + isWritableCvar = (cvarName) -> + for _, cvar in ipairs GAMEMODE.replicatedWritableCvars + if GAMEMODE.ConVars[cvar]\GetName! == cvarName + return true + return false + + cvar = net.ReadString! + if CAMI.PlayerHasAccess(ply, GAMEMODE.PRIV_CHANGE_SETTINGS) and isWritableCvar(cvar) + skipSync[cvar] = true + RunConsoleCommand cvar, net.ReadString! \ No newline at end of file diff --git a/src/gamemodes/amongus/gamemode/vgui/vgui_showhelp.moon b/src/gamemodes/amongus/gamemode/vgui/vgui_showhelp.moon index 3f128c6..e38b4a9 100644 --- a/src/gamemodes/amongus/gamemode/vgui/vgui_showhelp.moon +++ b/src/gamemodes/amongus/gamemode/vgui/vgui_showhelp.moon @@ -340,7 +340,7 @@ return vgui.RegisterTable { .Paint = (_, w, h) -> draw.RoundedBox cornerRadiusBase * 1.5, 0, 0, w, h, entryColor - element = if (CAMI.PlayerHasAccess LocalPlayer!, GAMEMODE.PRIV_CHANGE_SETTINGS) and LocalPlayer!\GetNWBool "NMW AU Host" + element = if CAMI.PlayerHasAccess LocalPlayer!, GAMEMODE.PRIV_CHANGE_SETTINGS -- Show the admin stuffs to admins. switch type when "Int", "Time", "Mod" @@ -360,7 +360,14 @@ return vgui.RegisterTable { depressed = false .OnDepressed = -> depressed = true - .OnReleased = -> depressed = false + .OnReleased = -> + depressed = false + if conVarName == "sv_alltalk" + -- sending value here to server because sv_alltalk doesn't callback on client (https://github.com/Facepunch/garrysmod-issues/issues/3503) + net.Start "AU ChangeCvar" + net.WriteString conVarName + net.WriteString \GetChecked() and "0" or "1" + net.SendToServer! .Paint = (_, w, h) -> depressedPadding = w * 0.025 From ab637360e1700ddb47538b6cc34ffd50e108cc66 Mon Sep 17 00:00:00 2001 From: Blaubeeree Date: Thu, 25 Mar 2021 16:39:44 +0100 Subject: [PATCH 2/4] added PreGameStart hook --- src/gamemodes/amongus/gamemode/sv_game.moon | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gamemodes/amongus/gamemode/sv_game.moon b/src/gamemodes/amongus/gamemode/sv_game.moon index a709102..9d7e474 100644 --- a/src/gamemodes/amongus/gamemode/sv_game.moon +++ b/src/gamemodes/amongus/gamemode/sv_game.moon @@ -121,6 +121,8 @@ GM.Game_Start = => -- TO-DO: print chat message. return if #initializedPlayers < @ConVars.MinPlayers\GetInt! + hook.Call "GMAU PreGameStart" + -- Create the time limit timer if the cvar is set. -- That's quite an interesting sentence. timelimit = @ConVarSnapshots.TimeLimit\GetInt! From 60366ab117b0ac0dda79acd5b395b0ed995b69ea Mon Sep 17 00:00:00 2001 From: Blaubeeree Date: Mon, 29 Mar 2021 22:45:08 +0200 Subject: [PATCH 3/4] clearing dead players when broadcasting new --- src/gamemodes/amongus/gamemode/cl_net.moon | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gamemodes/amongus/gamemode/cl_net.moon b/src/gamemodes/amongus/gamemode/cl_net.moon index 1ff3523..03e5394 100644 --- a/src/gamemodes/amongus/gamemode/cl_net.moon +++ b/src/gamemodes/amongus/gamemode/cl_net.moon @@ -149,6 +149,7 @@ net.Receive "NMW AU Flow", -> switch net.ReadUInt GAMEMODE.FlowSize -- when GAMEMODE.FlowTypes.BroadcastDead if GAMEMODE.GameData.Lookup_PlayerByID + GAMEMODE.GameData.DeadPlayers = {} count = net.ReadUInt 8 for i = 1, count id = net.ReadUInt 8 From e0e26e2c175cdc92f0bd909cb1971da20bfddad1 Mon Sep 17 00:00:00 2001 From: Blaubeeree Date: Wed, 31 Mar 2021 20:36:58 +0200 Subject: [PATCH 4/4] added system to manipulate imposter selection --- src/gamemodes/amongus/gamemode/sv_game.moon | 22 ++++++++++++++++--- src/gamemodes/amongus/gamemode/sv_player.moon | 22 +++++++++++++++++++ 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/gamemodes/amongus/gamemode/sv_game.moon b/src/gamemodes/amongus/gamemode/sv_game.moon index 9d7e474..cc4883f 100644 --- a/src/gamemodes/amongus/gamemode/sv_game.moon +++ b/src/gamemodes/amongus/gamemode/sv_game.moon @@ -172,11 +172,27 @@ GM.Game_Start = => -- memo[a] = 1 -- if not b.entity\IsBot! -- memo[b] = 1 - - memo[a] = memo[a] or math.random! - memo[b] = memo[b] or math.random! + if not memo[a] + if @PlayersMarkedForImposter[a.entity] + memo[a] = math.random! + 1 + elseif @PlayersMarkedForCrew[a.entity] + memo[a] = math.random! - 1 + else + memo[a] = math.random! + + if not memo[b] + if @PlayersMarkedForImposter[b.entity] + memo[b] = math.random! + 1 + elseif @PlayersMarkedForCrew[b.entity] + memo[b] = math.random! - 1 + else + memo[b] = math.random! + memo[a] > memo[b] + @PlayersMarkedForCrew = {} + @PlayersMarkedForImposter = {} + imposterCount = math.min GAMEMODE.ConVarSnapshots.ImposterCount\GetInt!, @GetImposterCount #initializedPlayers for index, ply in ipairs @GameData.PlayerTables -- Make the first N players imposters. diff --git a/src/gamemodes/amongus/gamemode/sv_player.moon b/src/gamemodes/amongus/gamemode/sv_player.moon index 2caf67f..5fcad05 100644 --- a/src/gamemodes/amongus/gamemode/sv_player.moon +++ b/src/gamemodes/amongus/gamemode/sv_player.moon @@ -384,6 +384,28 @@ GM.GetFullyInitializedPlayers = => return for ply in *player.GetAll! else continue +GM.PlayersMarkedForCrew or= {} +GM.PlayersMarkedForImposter or= {} +--- Marks a player to become crewmate next round. +-- This function doesn't overwrite the imposter count and therefor will be ignored if too many players are marked. +-- @param ply Player entity. +GM.Player_MarkCrew = (ply) => + @PlayersMarkedForCrew[ply] = true + @PlayersMarkedForImposter[ply] = false + +--- Marks a player to become crewmate next round. +-- This function doesn't overwrite the imposter count and therefor will be ignored if too many players are marked. +-- @param ply Player entity. +GM.Player_MarkImposter = (ply) => + @PlayersMarkedForCrew[ply] = false + @PlayersMarkedForImposter[ply] = true + +--- Unmarks a player +-- @param ply Player entity. +GM.Player_UnMark = (ply) => + @PlayersMarkedForCrew[ply] = false + @PlayersMarkedForImposter[ply] = false + hook.Add "PlayerInitialSpawn", "NMW AU AutoPilot", (ply) -> with GAMEMODE oldAutoPilot = \IsOnAutoPilot!