Chris Posted April 7 Posted April 7 We've released the 7.18.7 hotfix patch onto the main branches for everyone. The consolidated patch notes for the three Experimental builds can be found below. Changes: If the game crashes for a user who has a mod installed or has unzipped templates (from the .zip introduced in the last update) then the game will display a popup after the crash warning the player that the crash might be caused by modding, as we're getting a lot of crashes reported that are caused by mods! Steam Cloud saves will now also track the backup save folder, as some players (e.g. those on Windows 11) were finding that their saves were not syncing. We're working on a proper fix for the same issue on GOG and Epic, but unfortunately those services don't seem to support multiple cloud folders so it's not as straightforward as it is with Steam. If an aircraft has the afterburners enabled, their weapons will display their fire arc outlines but the green fill will be removed. Also the afterburner button "on" state has been made a bit brighter. This is intended to avoid the situation where users have accidentally left the afterburners enabled and been confused about why the interceptor weapons are not firing. Bugfixes: Fixed a crash related to tooltips for certain modded assets. Fixed a bug in the modding lifecyle. Fixed some path lookup issues when trying to use Steam Workshop mods. Fixed various other issues to do with mod loading. Quote
odizzido Posted April 9 Posted April 9 (edited) Hey, congrats on the full release I've been quite enjoying the game....I am almost finished my first play through. I left you guys a positive steam review as well. Just a small thing that I noticed, in the UOO bridge assault science screen you missed a "we" or something in the last sentence. Also while I am at it, I just researched singularity cores and one thing I would just like to mention is that taking mass from a sun would almost certainly extend the life of their star. Smaller stars last longer than larger stars despite having less "fuel" because the reaction rate decreases faster than the loss in mass. In the game you said that it decreases the life span of their star and that's why it's a desperate move...but you could instead say each core will cool their planet making it a frozen wasteland instead. Both are desperate moves so it still works story wise. Also also, as I play I wonder what the melee animations would look like if they were simply sped up from the point from where they start to swing towards the enemy. Here is the steam review I left: Quote TLDR, I am really enjoying this quite a lot. No crashing, no terrible controls, great tool tips, and I feel like I have everything I need to play the game to the best of my ability. It's great. Now for the long part without spoilers. The first few mins with the tutorial are....bad. I understand why, it's showing people who don't know how to play how the game works. I skipped it...but it turned out that skipping it also skips a small part of the story so I ended up reloaded and finishing it. It would be nice if you could skip the tutorial and then actually complete the mission so you could see what happens but honestly it's a very short part and probably not worth the effort. Still, as a first impression it's just not great. Thankfully it's over quickly and almost everything after is a massive improvement over the first Xenonauts game. I did enjoy the first one too, I completed it multiple times, but my goodness I was not expecting to enjoy this as much as I have. There are a variety of tactical missions and they play great, the geoscape has a variety of things going on and it's great, the story is much more interesting, and base management even has a little going on too which is a nice touch. There are multiple improvements to reduce grind as well(if you want them, it's optional). I don't want to say them all because this is spoilers free, but I really enjoy them. It really feels like all of the game mechanics have been polished to a shine. There are also many custom options when starting a game to tailor it more towards what you would like to play. The one problem I had with the original game that persists in X2 is the aiming funk. Just like the first game you can hit things you don't expect such as objects or other soldiers off to the side or behind walls. They are more edge cases but they've happened a few times so far for me in X2. I was really hoping with the move to a 3d engine that this would be a naturally solved issue but sadly it is not. Still, with all the other improvements to the game I have a very positive opinion of it. It has well exceeded any expectations I had of it. Everyone who worked on this should be proud, you guys did an excellent job. Edited April 10 by odizzido Quote
Belrick Posted April 11 Posted April 11 hello devs. My name is Belrick Author of the TerraCommand total conversion mod (in progress) I thought it would be helpful for you if i provided the list of core code that has caused crashes with my mod. ## 1. TriggerStateMachineEffect.Apply — NRE on captured aliens **Trigger:** Marking a regular (non-VIP) alien as `Unconscious` after auto-resolve. **Root cause:** The game's prisoner state-machine pathway dereferences the originating mission entity, which is null because no real GC session existed. **Fix:** Non-VIP captured aliens are marked `Dead` instead of `Unconscious`. Only VIP aliens are marked `Unconscious` (they follow a separate, safe code path). **Patch:** `MissionResultBuilder.BuildAlienTemplate` --- ## 2. TriggerStateMachineEffect.Apply — NRE on rescue mission results **Trigger:** Accepting the result screen of a Soldier Extraction mission. **Root cause:** `ActivityStateMachineComponent` and `SpawnStatusComponent` on rescue-target templates trigger state transitions that reference entities never created during auto-resolve. **Fix:** Strip `ActivityStateMachineComponent` and `SpawnStatusComponent` from templates before the game applies them. **Patch:** `MissionResultBuilder.BuildRescueTargetPassthrough`, `BuildSoldierTemplate`, `BuildAlienTemplate` --- ## 3. InventorySlotSelector.Apply — "No inventory slot found" **Trigger:** Post-battle loadout restoration on a rescued soldier entity. **Root cause:** The game tries to re-equip a soldier whose combat inventory slots (`CombatantSlots:Secondary`, etc.) were never created because the GC battle was skipped. **Fix:** `HarmonyFinalizer` suppresses the "No inventory slot found" exception. The soldier simply isn't re-equipped with that slot's items — non-fatal. **Patch:** `InventorySlotGuardPatch` in `TriggerStateMachineNullGuardPatch.cs` --- ## 4. ADelegateEffect.Apply — NRE in delegate effect chains **Trigger:** Post-battle entity-effect processing pipeline. **Root cause:** The wrapper that chains entity effects propagates inner exceptions (inventory/slot failures) and kills the entire Resolve Results chain. **Fix:** `HarmonyFinalizer` suppresses NullReferenceExceptions and "No inventory slot found" errors, letting the chain continue. **Patch:** `DelegateEffectGuardPatch` in `TriggerStateMachineNullGuardPatch.cs` --- ## 5. TimeControlCommand.Resume — game stuck paused after mission **Trigger:** Completing a multi-phase auto-resolved mission and accepting the briefing screen. **Root cause:** The game's internal pause counter is not decremented correctly when ground combat is skipped, leaving the geoscape permanently paused. **Fix:** `HarmonyPostfix` on `TryMoveToNextMissionOrEnd` and `TryProcessPostAllCombatMissionEffects` that unconditionally calls `TimeControlCommand.Resume(forceResume: true)`. **Patch:** `MultiPhaseMissionClockPatch.cs` --- ## 6. ApplyCampaignModifications — NRE on orphaned air combat entity **Trigger:** Post-battle campaign modifications when the owning aircraft entity has already been removed. **Root cause:** The game assumes the aircraft entity still exists when applying campaign-level side effects after combat. **Fix:** Safety wrapper catches and suppresses the NullReferenceException. **Patch:** `ResolveResultsDiagPatch.cs` (ApplyCampaignModifications finalizer) --- ## 7. ArmoryInventoryController.Compare — NRE during equipment sorting **Trigger:** Clicking on soldiers in the Armory after a battle has been auto-resolved. **Root cause:** `InventorySystem.OffHandRuleTest` throws a NullReferenceException when sorting equipment items for a soldier whose entity state was modified by auto-resolve (missing off-hand slot references). **Fix:** `HarmonyFinalizer` on `ArmoryInventoryController.Compare` returns `0` (equal) instead of crashing, so items stay in their current order. **Patch:** `ArmoryCompareGuardPatch` in `TriggerStateMachineNullGuardPatch.cs` 1 Quote
Chris Posted April 11 Author Posted April 11 52 minutes ago, Belrick said: hello devs. My name is Belrick Author of the TerraCommand total conversion mod (in progress) I thought it would be helpful for you if i provided the list of core code that has caused crashes with my mod. ## 1. TriggerStateMachineEffect.Apply — NRE on captured aliens **Trigger:** Marking a regular (non-VIP) alien as `Unconscious` after auto-resolve. **Root cause:** The game's prisoner state-machine pathway dereferences the originating mission entity, which is null because no real GC session existed. **Fix:** Non-VIP captured aliens are marked `Dead` instead of `Unconscious`. Only VIP aliens are marked `Unconscious` (they follow a separate, safe code path). **Patch:** `MissionResultBuilder.BuildAlienTemplate` --- ## 2. TriggerStateMachineEffect.Apply — NRE on rescue mission results **Trigger:** Accepting the result screen of a Soldier Extraction mission. **Root cause:** `ActivityStateMachineComponent` and `SpawnStatusComponent` on rescue-target templates trigger state transitions that reference entities never created during auto-resolve. **Fix:** Strip `ActivityStateMachineComponent` and `SpawnStatusComponent` from templates before the game applies them. **Patch:** `MissionResultBuilder.BuildRescueTargetPassthrough`, `BuildSoldierTemplate`, `BuildAlienTemplate` --- ## 3. InventorySlotSelector.Apply — "No inventory slot found" **Trigger:** Post-battle loadout restoration on a rescued soldier entity. **Root cause:** The game tries to re-equip a soldier whose combat inventory slots (`CombatantSlots:Secondary`, etc.) were never created because the GC battle was skipped. **Fix:** `HarmonyFinalizer` suppresses the "No inventory slot found" exception. The soldier simply isn't re-equipped with that slot's items — non-fatal. **Patch:** `InventorySlotGuardPatch` in `TriggerStateMachineNullGuardPatch.cs` --- ## 4. ADelegateEffect.Apply — NRE in delegate effect chains **Trigger:** Post-battle entity-effect processing pipeline. **Root cause:** The wrapper that chains entity effects propagates inner exceptions (inventory/slot failures) and kills the entire Resolve Results chain. **Fix:** `HarmonyFinalizer` suppresses NullReferenceExceptions and "No inventory slot found" errors, letting the chain continue. **Patch:** `DelegateEffectGuardPatch` in `TriggerStateMachineNullGuardPatch.cs` --- ## 5. TimeControlCommand.Resume — game stuck paused after mission **Trigger:** Completing a multi-phase auto-resolved mission and accepting the briefing screen. **Root cause:** The game's internal pause counter is not decremented correctly when ground combat is skipped, leaving the geoscape permanently paused. **Fix:** `HarmonyPostfix` on `TryMoveToNextMissionOrEnd` and `TryProcessPostAllCombatMissionEffects` that unconditionally calls `TimeControlCommand.Resume(forceResume: true)`. **Patch:** `MultiPhaseMissionClockPatch.cs` --- ## 6. ApplyCampaignModifications — NRE on orphaned air combat entity **Trigger:** Post-battle campaign modifications when the owning aircraft entity has already been removed. **Root cause:** The game assumes the aircraft entity still exists when applying campaign-level side effects after combat. **Fix:** Safety wrapper catches and suppresses the NullReferenceException. **Patch:** `ResolveResultsDiagPatch.cs` (ApplyCampaignModifications finalizer) --- ## 7. ArmoryInventoryController.Compare — NRE during equipment sorting **Trigger:** Clicking on soldiers in the Armory after a battle has been auto-resolved. **Root cause:** `InventorySystem.OffHandRuleTest` throws a NullReferenceException when sorting equipment items for a soldier whose entity state was modified by auto-resolve (missing off-hand slot references). **Fix:** `HarmonyFinalizer` on `ArmoryInventoryController.Compare` returns `0` (equal) instead of crashing, so items stay in their current order. **Patch:** `ArmoryCompareGuardPatch` in `TriggerStateMachineNullGuardPatch.cs` Thanks. I'll link our tech director to your post. Quote
Gijs-Jan Posted April 13 Posted April 13 On 4/11/2026 at 11:40 PM, Belrick said: hello devs. My name is Belrick Author of the TerraCommand total conversion mod (in progress) I thought it would be helpful for you if i provided the list of core code that has caused crashes with my mod. ## 1. TriggerStateMachineEffect.Apply — NRE on captured aliens **Trigger:** Marking a regular (non-VIP) alien as `Unconscious` after auto-resolve. **Root cause:** The game's prisoner state-machine pathway dereferences the originating mission entity, which is null because no real GC session existed. **Fix:** Non-VIP captured aliens are marked `Dead` instead of `Unconscious`. Only VIP aliens are marked `Unconscious` (they follow a separate, safe code path). **Patch:** `MissionResultBuilder.BuildAlienTemplate` --- ## 2. TriggerStateMachineEffect.Apply — NRE on rescue mission results **Trigger:** Accepting the result screen of a Soldier Extraction mission. **Root cause:** `ActivityStateMachineComponent` and `SpawnStatusComponent` on rescue-target templates trigger state transitions that reference entities never created during auto-resolve. **Fix:** Strip `ActivityStateMachineComponent` and `SpawnStatusComponent` from templates before the game applies them. **Patch:** `MissionResultBuilder.BuildRescueTargetPassthrough`, `BuildSoldierTemplate`, `BuildAlienTemplate` --- ## 3. InventorySlotSelector.Apply — "No inventory slot found" **Trigger:** Post-battle loadout restoration on a rescued soldier entity. **Root cause:** The game tries to re-equip a soldier whose combat inventory slots (`CombatantSlots:Secondary`, etc.) were never created because the GC battle was skipped. **Fix:** `HarmonyFinalizer` suppresses the "No inventory slot found" exception. The soldier simply isn't re-equipped with that slot's items — non-fatal. **Patch:** `InventorySlotGuardPatch` in `TriggerStateMachineNullGuardPatch.cs` --- ## 4. ADelegateEffect.Apply — NRE in delegate effect chains **Trigger:** Post-battle entity-effect processing pipeline. **Root cause:** The wrapper that chains entity effects propagates inner exceptions (inventory/slot failures) and kills the entire Resolve Results chain. **Fix:** `HarmonyFinalizer` suppresses NullReferenceExceptions and "No inventory slot found" errors, letting the chain continue. **Patch:** `DelegateEffectGuardPatch` in `TriggerStateMachineNullGuardPatch.cs` --- ## 5. TimeControlCommand.Resume — game stuck paused after mission **Trigger:** Completing a multi-phase auto-resolved mission and accepting the briefing screen. **Root cause:** The game's internal pause counter is not decremented correctly when ground combat is skipped, leaving the geoscape permanently paused. **Fix:** `HarmonyPostfix` on `TryMoveToNextMissionOrEnd` and `TryProcessPostAllCombatMissionEffects` that unconditionally calls `TimeControlCommand.Resume(forceResume: true)`. **Patch:** `MultiPhaseMissionClockPatch.cs` --- ## 6. ApplyCampaignModifications — NRE on orphaned air combat entity **Trigger:** Post-battle campaign modifications when the owning aircraft entity has already been removed. **Root cause:** The game assumes the aircraft entity still exists when applying campaign-level side effects after combat. **Fix:** Safety wrapper catches and suppresses the NullReferenceException. **Patch:** `ResolveResultsDiagPatch.cs` (ApplyCampaignModifications finalizer) --- ## 7. ArmoryInventoryController.Compare — NRE during equipment sorting **Trigger:** Clicking on soldiers in the Armory after a battle has been auto-resolved. **Root cause:** `InventorySystem.OffHandRuleTest` throws a NullReferenceException when sorting equipment items for a soldier whose entity state was modified by auto-resolve (missing off-hand slot references). **Fix:** `HarmonyFinalizer` on `ArmoryInventoryController.Compare` returns `0` (equal) instead of crashing, so items stay in their current order. **Patch:** `ArmoryCompareGuardPatch` in `TriggerStateMachineNullGuardPatch.cs` Hey, looking through this seems to be mostly LLM analysis on stacktraces. Very interesting to see where things are going wrong (I might update the github wiki https://github.com/GoldhawkInteractive/X2-Modding/wiki) . Are there specific things you think that would help you? Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.