diff --git a/Aetheria.State.Verify/Program.cs b/Aetheria.State.Verify/Program.cs index 356c35b33..a0465c886 100644 --- a/Aetheria.State.Verify/Program.cs +++ b/Aetheria.State.Verify/Program.cs @@ -7782,6 +7782,7 @@ static void RequireMainMenuContinueRunState(string root) "RestoreDroppedPickupsFromDaemonZoneState", "TryGetDaemonEntitySnapshot(", "TryGetDaemonParentSnapshot(", + "TryResolveDaemonDockingBay(", "IsCurrentEntityObservedUndocked(", "parentSnapshot.DockingBayAssignments", "dockedEntitySnapshot.ChildEntityIndices", @@ -7837,7 +7838,10 @@ static void RequireMainMenuContinueRunState(string root) "entity.EntityHostility[target]", "entity.VisibleEntities.Add(target)", "entity.VisibleEnemies.Add(target)", - "entity.VisibleFriendlies.Add(target)" + "entity.VisibleFriendlies.Add(target)", + "currentEntity.Parent.DockingBays", + "currentEntity.Parent is OrbitalEntity", + "DoDock(currentEntity.Parent, dockingBay)" }; var forbiddenGameplayHits = forbiddenGameplaySymbols diff --git a/Assets/Scripts/Gameplay/ActionGameManager.cs b/Assets/Scripts/Gameplay/ActionGameManager.cs index 75f11f5fc..3482bf4e3 100644 --- a/Assets/Scripts/Gameplay/ActionGameManager.cs +++ b/Assets/Scripts/Gameplay/ActionGameManager.cs @@ -2842,16 +2842,12 @@ public class ActionGameManager : MonoBehaviour Entity currentEntity, IReadOnlyList actionBarBindings) { - if (currentEntity.Parent != null) + if (TryResolveDaemonDockingBay(currentEntity, out var dockParent, out var dockingBay)) { - var dockingBay = currentEntity.Parent.DockingBays.FirstOrDefault(bay => bay.DockedShip == currentEntity); - if (dockingBay != null && currentEntity.Parent is OrbitalEntity) - { - CurrentEntity = currentEntity; - RestoreActionBarBindingsFromTypedRun(actionBarBindings); - DoDock(currentEntity.Parent, dockingBay); - return; - } + CurrentEntity = currentEntity; + RestoreActionBarBindingsFromTypedRun(actionBarBindings); + DoDock(dockParent, dockingBay); + return; } BindToEntity( @@ -3154,6 +3150,34 @@ public class ActionGameManager : MonoBehaviour !TryGetDaemonParentSnapshot(CurrentEntity, out _, out _); } + private bool TryResolveDaemonDockingBay( + Entity child, + out Entity dockParent, + out EquippedDockingBay dockingBay) + { + dockParent = null; + dockingBay = null; + if (!TryGetDaemonParentSnapshot(child, out var parentSnapshot, out var parent) || + !(parent is OrbitalEntity) || + parent.DockingBays == null) + { + return false; + } + + var assignments = parentSnapshot.DockingBayAssignments ?? Array.Empty(); + for (var bayIndex = 0; bayIndex < assignments.Count && bayIndex < parent.DockingBays.Count; bayIndex++) + { + if (assignments[bayIndex] != child.DaemonEntityIndex) + continue; + + dockParent = parent; + dockingBay = parent.DockingBays[bayIndex]; + return dockingBay != null; + } + + return false; + } + private bool TryQueryDaemonEntityContact( Entity observer, Entity target,