From b71762d6e18adb376fab466add5ad6865b21db15 Mon Sep 17 00:00:00 2001 From: Aristeas <94058548+ari-steas@users.noreply.github.com> Date: Thu, 6 Mar 2025 18:09:24 -0600 Subject: [PATCH 1/3] KOTH faction death handling --- .../GameModes/KingOfTheHill/KOTHGamemode.cs | 61 ++++++++++++++++++- .../Scripts/SUGMA/SUGMA_SessionComponent.cs | 2 +- 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/KingOfTheHill/KOTHGamemode.cs b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/KingOfTheHill/KOTHGamemode.cs index 151ea2ae9..69da86da4 100644 --- a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/KingOfTheHill/KOTHGamemode.cs +++ b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/KingOfTheHill/KOTHGamemode.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using Sandbox.ModAPI; using SC.SUGMA.GameModes.Elimination; using SC.SUGMA.GameState; @@ -49,6 +50,16 @@ public override void StartRound(string[] arguments = null) if (TrackedFactions.Count <= 1) return; + foreach (var faction in TrackedFactions.Keys.ToArray()) + TrackedFactions[faction] = 0; + + foreach (var grid in ShareTrackApi.GetTrackedGrids()) + { + var faction = grid.GetFaction(); + if (TrackedFactions.ContainsKey(faction)) + TrackedFactions[faction]++; + } + ActivationTimeCounter = ActivationTime; ControlPoint = null; @@ -58,7 +69,8 @@ public override void StartRound(string[] arguments = null) public override void StopRound() { - _winningFaction = ControlPoint?._zoneOwner; + if (ControlPoint != null) + _winningFaction = ControlPoint._zoneOwner; base.StopRound(); SUGMA_SessionComponent.I.GetComponent("KOTHHud")?.MatchEnded(_winningFaction); @@ -81,6 +93,9 @@ internal override void DisplayWinMessage() public override void UpdateActive() { + foreach (var faction in TrackedFactions) + MyAPIGateway.Utilities.ShowNotification($"{faction.Key.Tag}: {faction.Value}", 1000/60); + if (ActivationTimeCounter > 0) { if (_matchTimer.Ticks % 60 == 0) @@ -103,5 +118,49 @@ public override void UpdateActive() StopRound(); } } + + internal override void OnGridTrackChanged(IMyCubeGrid grid, bool isTracked) + { + if (!isTracked) + OnAliveChanged(grid, false); + } + + internal override void OnAliveChanged(IMyCubeGrid grid, bool isAlive) + { + var gridFaction = PlayerTracker.I.GetGridFaction(grid); + if (gridFaction == null || !TrackedFactions.ContainsKey(gridFaction)) + return; + if (!isAlive) + { + TrackedFactions[gridFaction]--; + if (TrackedFactions[gridFaction] <= 0) + { + IMyFaction winningFaction = null; + foreach (var factionKvp in TrackedFactions) + { + if (factionKvp.Value <= 0) + continue; + if (winningFaction != null) + { + winningFaction = null; + break; + } + winningFaction = factionKvp.Key; + } + + if (winningFaction != null) + { + if (ControlPoint != null) + ControlPoint._zoneOwner = winningFaction; + _winningFaction = winningFaction; + StopRound(); + } + } + } + else + { + TrackedFactions[gridFaction]++; + } + } } } \ No newline at end of file diff --git a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/SUGMA_SessionComponent.cs b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/SUGMA_SessionComponent.cs index b237979cb..3190f452a 100644 --- a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/SUGMA_SessionComponent.cs +++ b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/SUGMA_SessionComponent.cs @@ -102,7 +102,7 @@ public bool StartGamemode(string id, string[] arguments, bool notifyNetwork = fa CurrentGamemode = (GamemodeBase)_components[id]; CurrentGamemode.StartRound(arguments); - if (!CurrentGamemode.IsStarted) + if (!(CurrentGamemode?.IsStarted ?? false)) { CurrentGamemode = null; return false; From c6078728bd2937998483de7ab5248e3a42b8f23d Mon Sep 17 00:00:00 2001 From: Aristeas <94058548+ari-steas@users.noreply.github.com> Date: Thu, 6 Mar 2025 18:20:48 -0600 Subject: [PATCH 2/3] Fix improper KOTH winner notification --- .../Scripts/SUGMA/GameModes/Domination/DominationHud.cs | 2 +- .../SUGMA/GameModes/Elimination/EliminationGamemode.cs | 2 +- .../Scripts/SUGMA/GameModes/Elimination/EliminationHud.cs | 8 ++++---- .../Scripts/SUGMA/GameModes/KingOfTheHill/KOTHGamemode.cs | 2 ++ .../Data/Scripts/SUGMA/GameModes/KingOfTheHill/KOTHHud.cs | 4 ++-- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/Domination/DominationHud.cs b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/Domination/DominationHud.cs index 59a825ac7..c8b530e24 100644 --- a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/Domination/DominationHud.cs +++ b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/Domination/DominationHud.cs @@ -66,7 +66,7 @@ internal class DominationHud_Window : WindowBase private readonly TexturedBox[] _captureIndicators; private readonly DominationGamemode _gamemode; - private readonly elmHud_Window _windowBase; + private readonly ElmHud_Window _windowBase; public DominationHud_Window(HudParentBase parent, DominationGamemode gamemode) : base(parent) { diff --git a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/Elimination/EliminationGamemode.cs b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/Elimination/EliminationGamemode.cs index c7034ba57..6c108cca5 100644 --- a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/Elimination/EliminationGamemode.cs +++ b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/Elimination/EliminationGamemode.cs @@ -122,6 +122,7 @@ private void RemoveBlockers(float maxDistanceFromCenter) public override void StartRound(string[] arguments = null) { + _winningFaction = null; PointTracker = new PointTracker(3, 0); SUGMA_SessionComponent.I.UnregisterComponent("ELMPointTracker"); if (!MyAPIGateway.Utilities.IsDedicated) @@ -222,7 +223,6 @@ public override void StopRound() ShareTrackApi.UnregisterOnTrack(OnGridTrackChanged); base.StopRound(); - _winningFaction = null; TrackedFactions.Clear(); PointTracker = null; } diff --git a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/Elimination/EliminationHud.cs b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/Elimination/EliminationHud.cs index ecbbeccfa..0f2ebb842 100644 --- a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/Elimination/EliminationHud.cs +++ b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/Elimination/EliminationHud.cs @@ -14,7 +14,7 @@ internal class EliminationHud : ComponentBase private int _closeTime = -1; private readonly EliminationGamemode _gamemode; - public elmHud_Window Window; + public ElmHud_Window Window; public EliminationHud(EliminationGamemode gamemode) { @@ -28,7 +28,7 @@ public override void Init(string id) if (!RichHudClient.Registered) throw new Exception("RichHudAPI was not initialized in time!"); - Window = new elmHud_Window(HudMain.HighDpiRoot, _gamemode); + Window = new ElmHud_Window(HudMain.HighDpiRoot, _gamemode); } public override void Close() @@ -52,7 +52,7 @@ public void MatchEnded(IMyFaction winner) } } - internal class elmHud_Window : HudElementBase + internal class ElmHud_Window : HudElementBase { private readonly EliminationGamemode _gamemode; @@ -63,7 +63,7 @@ internal class elmHud_Window : HudElementBase internal LabelBox _winnerLabel; public EliminationHud_TeamBanner[] Banners; - public elmHud_Window(HudParentBase parent, EliminationGamemode gamemode) : base(parent) + public ElmHud_Window(HudParentBase parent, EliminationGamemode gamemode) : base(parent) { _gamemode = gamemode; _timer = gamemode._matchTimer; diff --git a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/KingOfTheHill/KOTHGamemode.cs b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/KingOfTheHill/KOTHGamemode.cs index 69da86da4..b814bb959 100644 --- a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/KingOfTheHill/KOTHGamemode.cs +++ b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/KingOfTheHill/KOTHGamemode.cs @@ -71,8 +71,10 @@ public override void StopRound() { if (ControlPoint != null) _winningFaction = ControlPoint._zoneOwner; + Log.Info($"KOTHGamemode.cs::74 Invoke StopRound, winner = {_winningFaction?.Name ?? "NULL"}"); base.StopRound(); + Log.Info($"KOTHGamemode.cs::77 Invoke KOTHHud.MatchEnded, winner = {_winningFaction?.Name ?? "NULL"}"); SUGMA_SessionComponent.I.GetComponent("KOTHHud")?.MatchEnded(_winningFaction); SUGMA_SessionComponent.I.UnregisterComponent("KOTHHud"); diff --git a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/KingOfTheHill/KOTHHud.cs b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/KingOfTheHill/KOTHHud.cs index 2a899b44c..87c860d55 100644 --- a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/KingOfTheHill/KOTHHud.cs +++ b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/KingOfTheHill/KOTHHud.cs @@ -57,7 +57,7 @@ internal class KOTHHud_Window : WindowBase new Material(MyStringId.GetOrCompute("SugmaCircle"), new Vector2(32, 32)); private readonly KOTHGamemode _gamemode; - private readonly elmHud_Window _windowBase; + private readonly ElmHud_Window _windowBase; private TexturedBox _captureIndicator; @@ -130,7 +130,7 @@ public void Update() public void MatchEnded(IMyFaction winner) { - Log.Info("KOTHHud.cs:133 MatchEnded (" + winner?.Name + ")"); + Log.Info("KOTHHud.cs:133 MatchEnded (" + (winner?.Name ?? "NULL") + ")"); _captureIndicator.Visible = false; _captureLabel.Visible = false; From eda81712637fd9446b6fb208e92d54f02e883ee7 Mon Sep 17 00:00:00 2001 From: Aristeas <94058548+ari-steas@users.noreply.github.com> Date: Thu, 6 Mar 2025 18:38:42 -0600 Subject: [PATCH 3/3] Clean up gamemode help --- .../Data/Scripts/SUGMA/Commands/CommandMethods.cs | 6 ++++-- .../SUGMA/GameModes/KingOfTheHill/KOTHGamemode.cs | 2 -- .../Scripts/SUGMA/GameModes/KingOfTheHill/KOTHHud.cs | 1 - .../Data/Scripts/SUGMA/SUGMA_SessionComponent.cs | 10 +++++----- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/Commands/CommandMethods.cs b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/Commands/CommandMethods.cs index 6d8ffb9d7..c7758501d 100644 --- a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/Commands/CommandMethods.cs +++ b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/Commands/CommandMethods.cs @@ -17,7 +17,8 @@ public static void Start(string[] args) if (args.Length < 2) { MyAPIGateway.Utilities.ShowMessage("SUGMA", - $"Unrecognized gamemode \"null\". Available gamemodes:{SUGMA_SessionComponent.ListGamemodes()}"); + $"Unrecognized gamemode \"null\". Available gamemodes:"); + SUGMA_SessionComponent.ListGamemodes(); return; } @@ -33,7 +34,8 @@ public static void Start(string[] args) if (!SUGMA_SessionComponent.I.StartGamemode(args[1].ToLower(), startArgs, true)) { MyAPIGateway.Utilities.ShowMessage("SUGMA", - $"Unrecognized gamemode \"{args[1].ToLower()}\". Available gamemodes:{SUGMA_SessionComponent.ListGamemodes()}"); + $"Unrecognized gamemode \"{args[1].ToLower()}\". Available gamemodes:"); + SUGMA_SessionComponent.ListGamemodes(); return; } diff --git a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/KingOfTheHill/KOTHGamemode.cs b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/KingOfTheHill/KOTHGamemode.cs index b814bb959..69da86da4 100644 --- a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/KingOfTheHill/KOTHGamemode.cs +++ b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/KingOfTheHill/KOTHGamemode.cs @@ -71,10 +71,8 @@ public override void StopRound() { if (ControlPoint != null) _winningFaction = ControlPoint._zoneOwner; - Log.Info($"KOTHGamemode.cs::74 Invoke StopRound, winner = {_winningFaction?.Name ?? "NULL"}"); base.StopRound(); - Log.Info($"KOTHGamemode.cs::77 Invoke KOTHHud.MatchEnded, winner = {_winningFaction?.Name ?? "NULL"}"); SUGMA_SessionComponent.I.GetComponent("KOTHHud")?.MatchEnded(_winningFaction); SUGMA_SessionComponent.I.UnregisterComponent("KOTHHud"); diff --git a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/KingOfTheHill/KOTHHud.cs b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/KingOfTheHill/KOTHHud.cs index 87c860d55..3e4fb2b2f 100644 --- a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/KingOfTheHill/KOTHHud.cs +++ b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/KingOfTheHill/KOTHHud.cs @@ -130,7 +130,6 @@ public void Update() public void MatchEnded(IMyFaction winner) { - Log.Info("KOTHHud.cs:133 MatchEnded (" + (winner?.Name ?? "NULL") + ")"); _captureIndicator.Visible = false; _captureLabel.Visible = false; diff --git a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/SUGMA_SessionComponent.cs b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/SUGMA_SessionComponent.cs index 3190f452a..3c1774295 100644 --- a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/SUGMA_SessionComponent.cs +++ b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/SUGMA_SessionComponent.cs @@ -16,6 +16,9 @@ using SC.SUGMA.HeartNetworking.Custom; using SC.SUGMA.Utilities; using VRage.Game.Components; +using VRage.Scripting; +using Sandbox.Game; +using VRageMath; namespace SC.SUGMA { @@ -134,18 +137,15 @@ public bool StopGamemode(bool notifyNetwork = false) return true; } - public static string ListGamemodes() + public static void ListGamemodes() { var availableGamemodes = new StringBuilder(); foreach (var gamemode in I.GetGamemodes()) { var gamemodeObject = I.GetComponent(gamemode); - availableGamemodes.Append( - $"\n- {gamemode} ({gamemodeObject.ReadableName})\n * {gamemodeObject.ArgumentParser.HelpText.Replace("\n", "\n * ")}"); + MyVisualScriptLogicProvider.SendChatMessageColored($"\n- {gamemodeObject.ArgumentParser.HelpText.Replace("\n", "\n- ")}", Color.Green, $"{gamemode} ({gamemodeObject.ReadableName})"); } - - return availableGamemodes.ToString(); } #region Base Methods