From 25cc288bd998f4b05b4ba227911011067e6bc08f Mon Sep 17 00:00:00 2001 From: Aristeas <94058548+ari-steas@users.noreply.github.com> Date: Fri, 1 Aug 2025 14:24:24 -0500 Subject: [PATCH 1/2] PreTT0 SUGMA, Fusion, and housekeeping --- .github/CODEOWNERS | 1 + .../Elimination/EliminationGamemode.cs | 3 +- .../RocketCore/RocketCoreGamemode.cs | 9 +- .../TeamDeathMatch/TeamDeathmatchGamemode.cs | 3 +- .../Scripts/SUGMA/SUGMA_SessionComponent.cs | 2 + .../Data/Scripts/SUGMA/Utilities/SUtils.cs | 2 +- .../Data/BlockCategories.sbc | 31 ++-- .../FusionParts/FusionPart.cs | 77 +++++---- .../FusionReactor/FusionReactorLogic.cs | 48 +----- .../FusionThruster/FusionThrusterLogic.cs | 51 ++---- .../FusionParts/S_FusionSystem.cs | 13 +- .../HudHelpers/DebugDrawManager.cs | 148 +++++++++++------- .../UpgradableReactors/modinfo_main.sbmi | 4 +- Weapon Mods/NorseHeavyIndustries/forceupload | 1 - 14 files changed, 186 insertions(+), 207 deletions(-) create mode 100644 .github/CODEOWNERS delete mode 100644 Weapon Mods/NorseHeavyIndustries/forceupload diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 000000000..26d557091 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +/.github/workflows/ @StarCoreSE/workflow-access 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 6c108cca5..7ea0ad6df 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 @@ -48,7 +48,8 @@ public EliminationGamemode() public override void Close() { - StopRound(); + if (IsStarted) + StopRound(); } public override void UpdateActive() diff --git a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/RocketCore/RocketCoreGamemode.cs b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/RocketCore/RocketCoreGamemode.cs index 9b32138bf..043aac69f 100644 --- a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/RocketCore/RocketCoreGamemode.cs +++ b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/RocketCore/RocketCoreGamemode.cs @@ -11,6 +11,7 @@ using Sandbox.Game; using VRageMath; using VRage.ModAPI; +using static SC.SUGMA.GameModes.Domination.DominationGamemode; namespace SC.SUGMA.GameModes.RocketCore { @@ -51,7 +52,8 @@ public RocketCoreGamemode() public override void Close() { - StopRound(); + if (IsStarted) + StopRound(); } public override void UpdateActive() @@ -72,7 +74,6 @@ public override void UpdateActive() continue; // Goal was made PointTracker.AddFactionPoints(zoneSet.Key, -1); - SUGMA_SessionComponent.I.GetComponent("rocHud")?.GoalScored(zoneSet.Key); if (_winningFaction != null) break; @@ -159,6 +160,10 @@ public override void StartRound(string[] arguments = null) if (!MyAPIGateway.Utilities.IsDedicated) SUGMA_SessionComponent.I.RegisterComponent("rocHud", new RocketCoreHud(this)); + PointTracker.OnPointsUpdated += (faction, points) => + { + SUGMA_SessionComponent.I.GetComponent("rocHud")?.GoalScored(faction); + }; SpawnBall(); Log.Info("Started a ROC match." + diff --git a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/TeamDeathMatch/TeamDeathmatchGamemode.cs b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/TeamDeathMatch/TeamDeathmatchGamemode.cs index 8ab8ffdbc..bc04385a2 100644 --- a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/TeamDeathMatch/TeamDeathmatchGamemode.cs +++ b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/TeamDeathMatch/TeamDeathmatchGamemode.cs @@ -52,7 +52,8 @@ public TeamDeathmatchGamemode() public override void Close() { - StopRound(); + if (IsStarted) + StopRound(); } public override void UpdateActive() 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 24e477159..ab06f80d3 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 @@ -46,6 +46,7 @@ internal class SUGMA_SessionComponent : MySessionComponentBase public GamemodeBase CurrentGamemode; public bool HasInited; + public bool IsClosing { get; private set; } = false; public ShareTrackApi ShareTrackApi = new ShareTrackApi(); public ShieldApi ShieldApi = new ShieldApi(); @@ -209,6 +210,7 @@ public override void UpdateAfterSimulation() protected override void UnloadData() { + IsClosing = true; try { foreach (var component in _components.Values.ToArray()) diff --git a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/Utilities/SUtils.cs b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/Utilities/SUtils.cs index b19f1603b..a5d32dc9d 100644 --- a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/Utilities/SUtils.cs +++ b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/Utilities/SUtils.cs @@ -43,7 +43,7 @@ public static void SetDamageEnabled(bool value) public static void SetWorldPermissionsForMatch(bool matchActive) { - if (MyAPIGateway.Session == null) + if (SUGMA_SessionComponent.I.IsClosing) return; MyAPIGateway.Utilities.ShowMessage("SUGMA", diff --git a/Utility Mods/MoA Fusion Systems/Data/BlockCategories.sbc b/Utility Mods/MoA Fusion Systems/Data/BlockCategories.sbc index caa2b293a..2da99a219 100644 --- a/Utility Mods/MoA Fusion Systems/Data/BlockCategories.sbc +++ b/Utility Mods/MoA Fusion Systems/Data/BlockCategories.sbc @@ -9,22 +9,21 @@ Fusion Systems Fusion Systems - Caster_Accelerator_0 - Caster_Accelerator_90 - Caster_Feeder - Caster_CentralPipe_0 - Caster_CentralPipe_90 - Caster_CentralPipe_T - Caster_FocusLens - Caster_Reactor - Heat_Heatsink - Heat_FlatRadiator - Caster_ConveyorCap - RadiatorPanel - ExtendableRadiatorBase - Heat_FlatRadiator - ActiveRadiator - ActiveRadiatorFake + CubeBlock/Caster_Accelerator_0 + CubeBlock/Caster_Accelerator_90 + CubeBlock/Caster_Feeder + CubeBlock/Caster_CentralPipe_0 + CubeBlock/Caster_CentralPipe_90 + CubeBlock/Caster_CentralPipe_T + Thrust/Caster_FocusLens + Reactor/Caster_Reactor + CubeBlock/Heat_Heatsink + CubeBlock/Heat_FlatRadiator + OxygenTank/Caster_ConveyorCap + CubeBlock/RadiatorPanel + TerminalBlock/ExtendableRadiatorBase + TerminalBlock/ActiveRadiator + TerminalBlock/ActiveRadiatorFake diff --git a/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/FusionParts/FusionPart.cs b/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/FusionParts/FusionPart.cs index 209b879a1..251788c1d 100644 --- a/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/FusionParts/FusionPart.cs +++ b/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/FusionParts/FusionPart.cs @@ -45,21 +45,24 @@ public abstract class FusionPart : MyGameLogicComponent, IMyEventProxy public float PowerConsumption; public MySync PowerUsageSync; - internal FusionPartSettings Settings; - internal static ModularDefinitionApi ModularApi => Epstein_Fusion_DS.ModularDefinition.ModularApi; + private FusionPartSettings Settings; + protected static ModularDefinitionApi ModularApi => Epstein_Fusion_DS.ModularDefinition.ModularApi; /// /// Block subtypes allowed. /// - internal abstract string[] BlockSubtypes { get; } + protected abstract string[] BlockSubtypes { get; } /// /// Human-readable name for this part type. /// - internal abstract string ReadableName { get; } + protected abstract string ReadableName { get; } - internal virtual Func MinOverrideLimit { get; } = b => 0.01f; - internal virtual Func MaxOverrideLimit { get; } = b => 4; + protected virtual Func MinOverrideLimit { get; } = b => 0.01f; + protected virtual Func MaxOverrideLimit { get; } = b => 4; + protected abstract float ProductionPerFusionPower { get; } + + protected int bufferBlockCount = 1; #region Controls @@ -182,7 +185,7 @@ private void AppendingCustomInfo(IMyTerminalBlock block, StringBuilder stringBui stringBuilder.Insert(0, InfoText.ToString()); } - public abstract void UpdatePower(float powerGeneration, float outputPerFusionPower, int numberParts); + public abstract void UpdatePower(float powerGeneration, int numberParts); #endregion @@ -191,7 +194,8 @@ private void AppendingCustomInfo(IMyTerminalBlock block, StringBuilder stringBui public override void Init(MyObjectBuilder_EntityBase objectBuilder) { base.Init(objectBuilder); - NeedsUpdate = MyEntityUpdateEnum.BEFORE_NEXT_FRAME; + Block = (T)Entity; + NeedsUpdate |= MyEntityUpdateEnum.BEFORE_NEXT_FRAME; } public override void UpdateOnceBeforeFrame() @@ -204,13 +208,29 @@ public override void UpdateOnceBeforeFrame() LoadSettings(); PowerUsageSync.Value = Settings.PowerUsage; + OverridePowerUsageSync.Value = Settings.OverridePowerUsage; + SaveSettings(); + + // Trigger power update is only needed when OverrideEnabled is false PowerUsageSync.ValueChanged += value => + { Settings.PowerUsage = value.Value; + if (!OverrideEnabled.Value) + UpdatePower(BufferPowerGeneration, bufferBlockCount); + SaveSettings(); + }; - OverridePowerUsageSync.Value = Settings.OverridePowerUsage; + // Trigger power update is only needed when OverrideEnabled is true OverridePowerUsageSync.ValueChanged += value => + { Settings.OverridePowerUsage = value.Value; - SaveSettings(); + if (OverrideEnabled.Value) + UpdatePower(BufferPowerGeneration, bufferBlockCount); + SaveSettings(); + }; + + // Trigger power update if boostEnabled is changed + OverrideEnabled.ValueChanged += value => UpdatePower(BufferPowerGeneration, bufferBlockCount); if (!HaveControlsInited.Contains(ReadableName)) CreateControls(); @@ -243,6 +263,15 @@ public override void UpdateAfterSimulation() } } + protected void SetPowerBoost(bool value) + { + if (OverrideEnabled.Value == value) + return; + + OverrideEnabled.Value = value; + UpdatePower(BufferPowerGeneration, bufferBlockCount); + } + #endregion #region Settings @@ -250,7 +279,10 @@ public override void UpdateAfterSimulation() internal void SaveSettings() { if (Block == null || Settings == null) + { + ModularApi.Log($"save block null or settings null for {typeof(T).Name}"); return; // called too soon or after it was already closed, ignore + } if (MyAPIGateway.Utilities == null) throw new NullReferenceException( @@ -270,9 +302,6 @@ internal virtual void LoadDefaultSettings() Settings.PowerUsage = 1.0f; Settings.OverridePowerUsage = 1.5f; - - PowerUsageSync.Value = Settings.PowerUsage; - OverridePowerUsageSync.Value = Settings.OverridePowerUsage; } internal virtual bool LoadSettings() @@ -303,9 +332,6 @@ internal virtual bool LoadSettings() Settings.PowerUsage = loadedSettings.PowerUsage; Settings.OverridePowerUsage = loadedSettings.OverridePowerUsage; - PowerUsageSync.Value = loadedSettings.PowerUsage; - OverridePowerUsageSync.Value = loadedSettings.OverridePowerUsage; - return true; } } @@ -313,29 +339,12 @@ internal virtual bool LoadSettings() { MyLog.Default.WriteLineAndConsole("Exception in loading FusionPart settings: " + e); MyAPIGateway.Utilities.ShowMessage("Fusion Systems", "Exception in loading FusionPart settings: " + e); + ModularApi.Log("Exception in loading FusionPart settings: " + e); } return false; } - public override bool IsSerialized() - { - if (Block.CubeGrid?.Physics == null) - return base.IsSerialized(); - - try - { - SaveSettings(); - } - catch (Exception e) - { - MyLog.Default.WriteLineAndConsole("Exception in loading FusionPart settings: " + e); - MyAPIGateway.Utilities.ShowMessage("Fusion Systems", "Exception in loading FusionPart settings: " + e); - } - - return base.IsSerialized(); - } - #endregion } diff --git a/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/FusionParts/FusionReactor/FusionReactorLogic.cs b/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/FusionParts/FusionReactor/FusionReactorLogic.cs index a29983433..32c16f1a4 100644 --- a/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/FusionParts/FusionReactor/FusionReactorLogic.cs +++ b/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/FusionParts/FusionReactor/FusionReactorLogic.cs @@ -10,18 +10,18 @@ namespace Epstein_Fusion_DS.FusionParts.FusionReactor [MyEntityComponentDescriptor(typeof(MyObjectBuilder_Reactor), false, "Caster_Reactor")] public class FusionReactorLogic : FusionPart { - private int _bufferBlockCount = 1; private float _bufferReactorOutput; - internal override string[] BlockSubtypes => new[] { "Caster_Reactor" }; - internal override string ReadableName => "Reactor"; + protected override string[] BlockSubtypes => new[] { "Caster_Reactor" }; + protected override string ReadableName => "Reactor"; + protected override float ProductionPerFusionPower => SFusionSystem.MegawattsPerFusionPower; - public override void UpdatePower(float powerGeneration, float megawattsPerFusionPower, int numberReactors) + public override void UpdatePower(float powerGeneration, int numberReactors) { BufferPowerGeneration = powerGeneration; - _bufferBlockCount = numberReactors; + bufferBlockCount = numberReactors; var reactorConsumptionMultiplier = OverrideEnabled.Value @@ -35,14 +35,14 @@ public override void UpdatePower(float powerGeneration, float megawattsPerFusion var reactorEfficiencyMultiplier = 1 / (0.489f + reactorConsumptionMultiplier); // Power generated (per second) - var reactorOutput = reactorEfficiencyMultiplier * powerConsumption * megawattsPerFusionPower; + var reactorOutput = reactorEfficiencyMultiplier * powerConsumption * ProductionPerFusionPower; _bufferReactorOutput = reactorOutput; MaxPowerConsumption = powerConsumption / 60; InfoText.Clear(); InfoText.AppendLine( - $"\nOutput: {Math.Round(reactorOutput, 1)}/{Math.Round(powerGeneration * 60 * megawattsPerFusionPower, 1)}"); + $"\nOutput: {Math.Round(reactorOutput, 1)}/{Math.Round(powerGeneration * 60 * ProductionPerFusionPower, 1)}"); InfoText.AppendLine($"Input: {Math.Round(powerConsumption, 1)}/{Math.Round(powerGeneration * 60, 1)}"); InfoText.AppendLine($"Efficiency: {Math.Round(reactorEfficiencyMultiplier * 100)}%"); @@ -50,42 +50,8 @@ public override void UpdatePower(float powerGeneration, float megawattsPerFusion SyncMultipliers.ReactorOutput(Block, _bufferReactorOutput); } - public void SetPowerBoost(bool value) - { - if (OverrideEnabled.Value == value) - return; - - OverrideEnabled.Value = value; - UpdatePower(BufferPowerGeneration, SFusionSystem.MegawattsPerFusionPower, _bufferBlockCount); - } - #region Base Methods - public override void Init(MyObjectBuilder_EntityBase definition) - { - base.Init(definition); - Block = (IMyReactor)Entity; - NeedsUpdate |= MyEntityUpdateEnum.BEFORE_NEXT_FRAME; - - // Trigger power update is only needed when OverrideEnabled is false - PowerUsageSync.ValueChanged += value => - { - if (!OverrideEnabled.Value) - UpdatePower(BufferPowerGeneration, SFusionSystem.MegawattsPerFusionPower, _bufferBlockCount); - }; - - // Trigger power update is only needed when OverrideEnabled is true - OverridePowerUsageSync.ValueChanged += value => - { - if (OverrideEnabled.Value) - UpdatePower(BufferPowerGeneration, SFusionSystem.MegawattsPerFusionPower, _bufferBlockCount); - }; - - // Trigger power update if boostEnabled is changed - OverrideEnabled.ValueChanged += value => - UpdatePower(BufferPowerGeneration, SFusionSystem.MegawattsPerFusionPower, _bufferBlockCount); - } - public override void UpdateAfterSimulation() { base.UpdateAfterSimulation(); diff --git a/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/FusionParts/FusionThruster/FusionThrusterLogic.cs b/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/FusionParts/FusionThruster/FusionThrusterLogic.cs index 9bc48d2c4..c6f1ee6e6 100644 --- a/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/FusionParts/FusionThruster/FusionThrusterLogic.cs +++ b/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/FusionParts/FusionThruster/FusionThrusterLogic.cs @@ -13,20 +13,21 @@ namespace Epstein_Fusion_DS.FusionParts.FusionThruster )] public class FusionThrusterLogic : FusionPart { - private int _bufferBlockCount = 1; private float _bufferThrustOutput; - internal override string[] BlockSubtypes => new[] + protected override string[] BlockSubtypes => new[] { "Caster_FocusLens", }; - internal override string ReadableName => "Thruster"; + protected override string ReadableName => "Thruster"; + protected override float ProductionPerFusionPower => SFusionSystem.NewtonsPerFusionPower; - internal override Func MinOverrideLimit => + protected override Func MinOverrideLimit => b => 1; - internal override Func MaxOverrideLimit => + + protected override Func MaxOverrideLimit => b => DriveSettings[b.BlockDefinition.SubtypeId].MaxOverclock; internal static readonly Dictionary DriveSettings = new Dictionary @@ -34,10 +35,10 @@ public class FusionThrusterLogic : FusionPart ["Caster_FocusLens"] = new DriveSetting(1.00f, 1.5f, 144000000), }; - public override void UpdatePower(float powerGeneration, float newtonsPerFusionPower, int numberThrusters) + public override void UpdatePower(float powerGeneration, int numberThrusters) { BufferPowerGeneration = powerGeneration; - _bufferBlockCount = numberThrusters; + bufferBlockCount = numberThrusters; var overrideModifier = (OverrideEnabled ? OverridePowerUsageSync : PowerUsageSync).Value; @@ -49,7 +50,7 @@ public override void UpdatePower(float powerGeneration, float newtonsPerFusionPo (2 - 1/(DriveSettings[Block.BlockDefinition.SubtypeId].BaseThrust/maxThrustOutput)); // Power generation consumed (per second) - var powerConsumption = thrustOutput / newtonsPerFusionPower / efficiencyMultiplier; + var powerConsumption = thrustOutput / ProductionPerFusionPower / efficiencyMultiplier; // Power generated (per second) //var thrustOutput = efficiencyMultiplier * powerConsumption * newtonsPerFusionPower; @@ -67,42 +68,8 @@ public override void UpdatePower(float powerGeneration, float newtonsPerFusionPo SyncMultipliers.ThrusterOutput(Block, _bufferThrustOutput); } - public void SetPowerBoost(bool value) - { - if (OverrideEnabled.Value == value) - return; - - OverrideEnabled.Value = value; - UpdatePower(BufferPowerGeneration, SFusionSystem.NewtonsPerFusionPower, _bufferBlockCount); - } - #region Base Methods - public override void Init(MyObjectBuilder_EntityBase definition) - { - base.Init(definition); - Block = (IMyThrust)Entity; - NeedsUpdate |= MyEntityUpdateEnum.BEFORE_NEXT_FRAME; - - // Trigger power update is only needed when OverrideEnabled is false - PowerUsageSync.ValueChanged += value => - { - if (!OverrideEnabled.Value) - UpdatePower(BufferPowerGeneration, SFusionSystem.NewtonsPerFusionPower, _bufferBlockCount); - }; - - // Trigger power update is only needed when OverrideEnabled is true - OverridePowerUsageSync.ValueChanged += value => - { - if (OverrideEnabled.Value) - UpdatePower(BufferPowerGeneration, SFusionSystem.NewtonsPerFusionPower, _bufferBlockCount); - }; - - // Trigger power update if boostEnabled is changed - OverrideEnabled.ValueChanged += value => - UpdatePower(BufferPowerGeneration, SFusionSystem.NewtonsPerFusionPower, _bufferBlockCount); - } - public override void UpdateAfterSimulation() { base.UpdateAfterSimulation(); diff --git a/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/FusionParts/S_FusionSystem.cs b/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/FusionParts/S_FusionSystem.cs index f949a9a41..a6ea4d3c3 100644 --- a/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/FusionParts/S_FusionSystem.cs +++ b/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/FusionParts/S_FusionSystem.cs @@ -122,7 +122,7 @@ public void AddPart(IMyCubeBlock newPart) { Thrusters.Add(logic); logic.MemberSystem = this; - logic.UpdatePower(PowerGeneration, NewtonsPerFusionPower, Thrusters.Count); + logic.UpdatePower(PowerGeneration, Thrusters.Count); } } @@ -133,7 +133,7 @@ public void AddPart(IMyCubeBlock newPart) { Reactors.Add(logic); logic.MemberSystem = this; - logic.UpdatePower(PowerGeneration, MegawattsPerFusionPower, Reactors.Count); + logic.UpdatePower(PowerGeneration, Reactors.Count); } } @@ -157,7 +157,7 @@ public void RemovePart(IMyCubeBlock part) var logic = part.GameLogic.GetAs(); logic.MemberSystem = null; Thrusters.Remove(logic); - logic.UpdatePower(PowerGeneration, NewtonsPerFusionPower, Thrusters.Count); + logic.UpdatePower(PowerGeneration, Thrusters.Count); } if (part is IMyReactor) @@ -165,7 +165,7 @@ public void RemovePart(IMyCubeBlock part) var logic = part.GameLogic.GetAs(); logic.MemberSystem = null; Reactors.Remove(logic); - logic.UpdatePower(PowerGeneration, NewtonsPerFusionPower, Thrusters.Count); + logic.UpdatePower(PowerGeneration, Reactors.Count); } if (part is IMyGasTank) @@ -188,7 +188,6 @@ public void RemovePart(IMyCubeBlock part) private void UpdatePower(bool updateReactors = false) { - var generationModifier = 1; var powerGeneration = float.Epsilon; var powerCapacity = float.Epsilon; var totalPowerUsage = 0f; @@ -205,7 +204,7 @@ private void UpdatePower(bool updateReactors = false) totalPowerUsage += reactor?.PowerConsumption ?? 0; if (updateReactors) - reactor?.UpdatePower(powerGeneration, MegawattsPerFusionPower * generationModifier, Reactors.Count); + reactor?.UpdatePower(powerGeneration, Reactors.Count); } foreach (var thruster in Thrusters) @@ -213,7 +212,7 @@ private void UpdatePower(bool updateReactors = false) totalPowerUsage += thruster?.PowerConsumption ?? 0; if (updateReactors) - thruster?.UpdatePower(powerGeneration, NewtonsPerFusionPower * generationModifier, Thrusters.Count); + thruster?.UpdatePower(powerGeneration, Thrusters.Count); } // Subtract power usage afterwards so that all reactors have the same stats. diff --git a/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/HudHelpers/DebugDrawManager.cs b/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/HudHelpers/DebugDrawManager.cs index 2a38074db..61e870182 100644 --- a/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/HudHelpers/DebugDrawManager.cs +++ b/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/HudHelpers/DebugDrawManager.cs @@ -20,43 +20,62 @@ public class DebugDraw : MySessionComponentBase private const float DepthRatioF = 0.01f; // i'm gonna kiss digi on the - private static DebugDraw _instance; - protected static readonly MyStringId MaterialDot = MyStringId.GetOrCompute("WhiteDot"); - protected static readonly MyStringId MaterialSquare = MyStringId.GetOrCompute("Square"); + public static DebugDraw I; + public static readonly MyStringId MaterialDot = MyStringId.GetOrCompute("WhiteDot"); + public static readonly MyStringId MaterialSquare = MyStringId.GetOrCompute("Square"); - private readonly Dictionary> _queuedGridPoints = - new Dictionary>(); + private readonly List _queuedGridPoints = new List(); + private readonly List _queuedLinePoints = new List(); + private readonly List _queuedPoints = new List(); - private readonly Dictionary, MyTuple> _queuedLinePoints = - new Dictionary, MyTuple>(); + private struct GridDrawPoint + { + public Vector3I Position; + public long EndOfLife; + public Color Color; + public IMyCubeGrid Grid; + } + + private struct LineDrawPoint + { + public Vector3D Start; + public Vector3D End; + public long EndOfLife; + public Color Color; + } - private readonly Dictionary> _queuedPoints = - new Dictionary>(); + private struct DrawPoint + { + public Vector3D Position; + public long EndOfLife; + public Color Color; + } public override void LoadData() { if (!MyAPIGateway.Utilities.IsDedicated) - _instance = this; + I = this; } protected override void UnloadData() { - _instance = null; + I = null; } public static void AddPoint(Vector3D globalPos, Color color, float duration) { - if (_instance == null) + if (I == null) return; - - if (_instance._queuedPoints.ContainsKey(globalPos)) - _instance._queuedPoints[globalPos] = - new MyTuple(DateTime.UtcNow.Ticks + (long)(duration * TimeSpan.TicksPerSecond), color); - else - _instance._queuedPoints.Add(globalPos, - new MyTuple(DateTime.UtcNow.Ticks + (long)(duration * TimeSpan.TicksPerSecond), - color)); + lock (I._queuedGridPoints) + { + I._queuedPoints.Add(new DrawPoint + { + Position = globalPos, + Color = color, + EndOfLife = DateTime.UtcNow.Ticks + (long)(duration * TimeSpan.TicksPerSecond) + }); + } } public static void AddGps(string name, Vector3D position, float duration) @@ -74,66 +93,77 @@ public static void AddGridGps(string name, Vector3I gridPosition, IMyCubeGrid gr public static void AddGridPoint(Vector3I blockPos, IMyCubeGrid grid, Color color, float duration) { - if (_instance == null) + if (I == null) return; - if (_instance._queuedGridPoints.ContainsKey(blockPos)) - _instance._queuedGridPoints[blockPos] = - new MyTuple( - DateTime.UtcNow.Ticks + (long)(duration * TimeSpan.TicksPerSecond), color, grid); - else - _instance._queuedGridPoints.Add(blockPos, - new MyTuple( - DateTime.UtcNow.Ticks + (long)(duration * TimeSpan.TicksPerSecond), color, grid)); + lock (I._queuedGridPoints) + { + I._queuedGridPoints.Add(new GridDrawPoint + { + Position = blockPos, + EndOfLife = DateTime.UtcNow.Ticks + (long)(duration * TimeSpan.TicksPerSecond), + Color = color, + Grid = grid + }); + } } public static void AddLine(Vector3D origin, Vector3D destination, Color color, float duration) { - if (_instance == null) + if (I == null) return; - - var key = new MyTuple(origin, destination); - if (_instance._queuedLinePoints.ContainsKey(key)) - _instance._queuedLinePoints[key] = - new MyTuple(DateTime.UtcNow.Ticks + (long)(duration * TimeSpan.TicksPerSecond), color); - else - _instance._queuedLinePoints.Add(key, - new MyTuple(DateTime.UtcNow.Ticks + (long)(duration * TimeSpan.TicksPerSecond), - color)); + lock (I._queuedLinePoints) + { + I._queuedLinePoints.Add(new LineDrawPoint + { + Start = origin, + End = destination, + EndOfLife = DateTime.UtcNow.Ticks + (long)(duration * TimeSpan.TicksPerSecond), + Color = color, + }); + } } public override void Draw() { - try + long nowTicks = DateTime.UtcNow.Ticks; + + lock (_queuedPoints) { - foreach (var key in _queuedPoints.Keys.ToList()) + for (var i = _queuedPoints.Count - 1; i >= 0; i--) { - DrawPoint0(key, _queuedPoints[key].Item2); + var point = _queuedPoints[i]; + DrawPoint0(point.Position, point.Color); - if (DateTime.UtcNow.Ticks > _queuedPoints[key].Item1) - _queuedPoints.Remove(key); + if (nowTicks > point.EndOfLife) + _queuedPoints.RemoveAt(i); } + } - foreach (var key in _queuedGridPoints.Keys.ToList()) + lock (_queuedGridPoints) + { + for (var i = _queuedGridPoints.Count - 1; i >= 0; i--) { - DrawGridPoint0(key, _queuedGridPoints[key].Item3, _queuedGridPoints[key].Item2); + var gridPoint = _queuedGridPoints[i]; + DrawGridPoint0(gridPoint.Position, gridPoint.Grid, gridPoint.Color); - if (DateTime.UtcNow.Ticks > _queuedGridPoints[key].Item1) - _queuedGridPoints.Remove(key); + if (nowTicks > gridPoint.EndOfLife) + _queuedGridPoints.RemoveAt(i); } + } - foreach (var key in _queuedLinePoints.Keys.ToList()) + lock (_queuedLinePoints) + { + for (var i = _queuedLinePoints.Count - 1; i >= 0; i--) { - DrawLine0(key.Item1, key.Item2, _queuedLinePoints[key].Item2); + var linePoint = _queuedLinePoints[i]; + DrawLine0(linePoint.Start, linePoint.End, linePoint.Color); - if (DateTime.UtcNow.Ticks > _queuedLinePoints[key].Item1) - _queuedLinePoints.Remove(key); + if (nowTicks > linePoint.EndOfLife) + _queuedLinePoints.RemoveAt(i); } } - catch - { - } // Icky no error logging } private void DrawPoint0(Vector3D globalPos, Color color) @@ -155,21 +185,21 @@ private void DrawLine0(Vector3D origin, Vector3D destination, Color color) var length = (float)(destination - origin).Length(); var direction = (destination - origin) / length; - MyTransparentGeometry.AddLineBillboard(MaterialSquare, color, origin, direction, length, 0.35f); + MyTransparentGeometry.AddLineBillboard(MaterialSquare, color, origin, direction, length, 0.15f); var depthScale = ToAlwaysOnTop(ref origin); direction *= depthScale; MyTransparentGeometry.AddLineBillboard(MaterialSquare, color * OnTopColorMul, origin, direction, length, - 0.5f * depthScale); + 0.15f * depthScale); } - public static Vector3D GridToGlobal(Vector3I position, IMyCubeGrid grid) + private static Vector3D GridToGlobal(Vector3I position, IMyCubeGrid grid) { return Vector3D.Rotate((Vector3D)position * 2.5f, grid.WorldMatrix) + grid.GetPosition(); } - protected static float ToAlwaysOnTop(ref Vector3D position) + private static float ToAlwaysOnTop(ref Vector3D position) { var camMatrix = MyAPIGateway.Session.Camera.WorldMatrix; position = camMatrix.Translation + (position - camMatrix.Translation) * DepthRatioF; diff --git a/Utility Mods/UpgradableReactors/modinfo_main.sbmi b/Utility Mods/UpgradableReactors/modinfo_main.sbmi index 31639c429..cb6a9078d 100644 --- a/Utility Mods/UpgradableReactors/modinfo_main.sbmi +++ b/Utility Mods/UpgradableReactors/modinfo_main.sbmi @@ -4,8 +4,8 @@ 0 - 2791770628 + 2961585236 Steam - \ No newline at end of file + diff --git a/Weapon Mods/NorseHeavyIndustries/forceupload b/Weapon Mods/NorseHeavyIndustries/forceupload deleted file mode 100644 index 8b1378917..000000000 --- a/Weapon Mods/NorseHeavyIndustries/forceupload +++ /dev/null @@ -1 +0,0 @@ - From 63e3c349d7d794edf46ec29183c9f9a06e412884 Mon Sep 17 00:00:00 2001 From: Aristeas <94058548+ari-steas@users.noreply.github.com> Date: Fri, 1 Aug 2025 14:26:43 -0500 Subject: [PATCH 2/2] PreTT0 Nyx Fix --- .../Heavy-Assault-Systems/Data/Scripts/CoreParts/Nyx_ammo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Weapon Mods/Heavy-Assault-Systems/Data/Scripts/CoreParts/Nyx_ammo.cs b/Weapon Mods/Heavy-Assault-Systems/Data/Scripts/CoreParts/Nyx_ammo.cs index 4ecc41acc..344a0f2b8 100644 --- a/Weapon Mods/Heavy-Assault-Systems/Data/Scripts/CoreParts/Nyx_ammo.cs +++ b/Weapon Mods/Heavy-Assault-Systems/Data/Scripts/CoreParts/Nyx_ammo.cs @@ -37,7 +37,7 @@ partial class Parts AmmoRound = "Nyx Beam", // Name of ammo in terminal, should be different for each ammo type used by the same weapon. Is used by Shrapnel. HybridRound = true, // Use both a physical ammo magazine and energy per shot. EnergyCost = 0.0125f, //100MW Scaler for energy per shot (EnergyCost * BaseDamage * (RateOfFire / 3600) * BarrelsPerShot * TrajectilesPerBarrel). Uses EffectStrength instead of BaseDamage if EWAR. - BaseDamage = 16000f, // Direct damage; one steel plate is worth 100. + BaseDamage = 1600f, // Direct damage; one steel plate is worth 100. Mass = 0f, // In kilograms; how much force the impact will apply to the target. Health = 0, // How much damage the projectile can take from other projectiles (base of 1 per hit) before dying; 0 disables this and makes the projectile untargetable. BackKickForce = 0f, // Recoil. This is applied to the Parent Grid. @@ -89,7 +89,7 @@ partial class Parts Patterns = new[] { // If enabled, set of multiple ammos to fire in order instead of the main ammo. "Nyx Beam Fake", "Nyx Beam Fake", "Nyx Beam Fake", "Nyx Beam Fake", "Nyx Beam Fake", "Nyx Beam Fake", "Nyx Beam Fake", "Nyx Beam Fake", "Nyx Beam Fake", }, - Mode = Never, // Select when to activate this pattern, options: Never, Weapon, Fragment, Both + Mode = Weapon, // Select when to activate this pattern, options: Never, Weapon, Fragment, Both TriggerChance = 1f, // This is % Random = false, // This randomizes the number spawned at once, NOT the list order. RandomMin = 1,