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/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 151ea2ae9..2ecd60fd4 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); @@ -103,5 +115,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/GameModes/KingOfTheHill/KOTHHud.cs b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/KingOfTheHill/KOTHHud.cs index 2a899b44c..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 @@ -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,6 @@ public void Update() public void MatchEnded(IMyFaction winner) { - Log.Info("KOTHHud.cs:133 MatchEnded (" + winner?.Name + ")"); _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 b237979cb..e863fb505 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 { @@ -102,7 +105,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; @@ -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 * ")}"); + MyAPIGateway.Utilities.ShowMessage($"{gamemode} ({gamemodeObject.ReadableName})", $"\n- {gamemodeObject.ArgumentParser.HelpText.Replace("\n", "\n- ")}"); } - - return availableGamemodes.ToString(); } #region Base Methods @@ -238,4 +238,4 @@ protected override void UnloadData() #endregion } -} \ No newline at end of file +}