Add typed field-flight prototype and preserve native qualification failures

This commit is contained in:
2026-09-19 21:01:20 +02:00
parent 83ea247e62
commit 61e165ef5b
91 changed files with 40570 additions and 85 deletions
@@ -37,6 +37,8 @@ class ERR_OrdinaryGateObserver
protected int m_Previous;
protected int m_Index;
protected bool m_Stopped;
protected bool m_HeldAction;
protected int m_ObservedPhase = -1;
protected static bool Enabled(string nonce)
{
@@ -64,6 +66,8 @@ class ERR_OrdinaryGateObserver
s_Request.m_Nonce = nonce; s_Request.m_Start = started; s_Request.m_Previous = started;
if (mode && mode.Players()) s_Request.m_Life = mode.Players().CurrentActor(actor);
if (s_Request.m_Life) s_Request.m_Account = s_Request.m_Life.AccountId;
if (!ERR_OrdinaryInputObserverRules.HeldScope(nonce, s_Request.m_HeldAction))
{ s_Request.Cancel(index, now, "held-option-binding-lost"); return; }
if (!s_Request.BindGate()) { s_Request.Cancel(index, now, "original-prison-lock-unavailable"); return; }
}
s_Request.Observe(mode, world, controller, actor, nonce, started, index, now);
@@ -95,7 +99,7 @@ class ERR_OrdinaryGateObserver
protected bool Context()
{
if (!GetGame() || !m_Mode || !m_World || !m_Controller || !m_Actor || !m_Life || !m_Gate || !m_Manager || !m_Lock || !m_Context || !m_Door || !m_Handler) return false;
if (m_Mode != ERR_GameMode.Get() || !m_Mode.Active() || (m_Mode.Phase() != ERR_Phase.PRISON && m_Mode.Phase() != ERR_Phase.RADIO_SEARCH)) return false;
if (m_Mode != ERR_GameMode.Get() || !m_Mode.Active()) return false;
if (GetGame().GetWorld() != m_World || m_Mode.GetWorld() != m_World || m_Actor.GetWorld() != m_World || m_Gate.GetWorld() != m_World) return false;
if (GetGame().GetPlayerController() != m_Controller || m_Controller.GetControlledEntity() != m_Actor || m_Handler.GetControlledEntity() != m_Actor) return false;
PlayerManager players = GetGame().GetPlayerManager();
@@ -106,6 +110,11 @@ class ERR_OrdinaryGateObserver
if (m_Gate.FindComponent(BaseActionsManagerComponent) != m_Manager || m_Gate.FindComponent(BaseDoorComponent) != m_Door || m_Controller.FindComponent(SCR_InteractionHandlerComponent) != m_Handler) return false;
if (m_Manager.GetContext("SCR_DoorUserAction") != m_Context || m_Manager.FindAction(m_Lock.GetActionID()) != m_Lock || m_Lock.GetOwner() != m_Gate || m_Lock.GetActionDuration() != 4) return false;
if (!GetGame().GetInputManager() || !GetGame().GetMenuManager() || GetGame().GetMenuManager().GetTopMenu()) return false;
bool held;
if (!ERR_OrdinaryInputObserverRules.HeldScope(m_Nonce, held) || held != m_HeldAction) return false;
int phase = m_Mode.Phase();
if (!ERR_OrdinaryInputObserverRules.PhaseAllowed(phase, m_ObservedPhase, held, true)) return false;
m_ObservedPhase = phase;
return true;
}
@@ -24,6 +24,26 @@ class ERR_OrdinaryInputObserverRules
for (int i = 0; i < nonce.Length(); i++) if (!allowed.Contains(nonce[i])) return false;
return true;
}
// A held-action observer is only a same-run phase extension, never input.
static bool HeldScope(string nonce, out bool held)
{
held = false;
string requested, input, look, gate;
if (!System.GetCLIParam("errOrdinaryHeldAction", requested)) return true;
if (System.IsConsoleApp() || !Replication.IsServer() || RplSession.Mode() != RplMode.None || requested != nonce || !Nonce(nonce)
|| !System.GetCLIParam("errOrdinaryInputObserve", input) || input != nonce
|| !System.GetCLIParam("errOrdinaryLookObserve", look) || look != nonce
|| !System.GetCLIParam("errOrdinaryGateObserve", gate) || gate != nonce) return false;
held = true;
return true;
}
static bool PhaseAllowed(int phase, int previous, bool held, bool legacyGate = false)
{
if (previous < 0) return phase == ERR_Phase.PRISON;
if (!held) return phase == ERR_Phase.PRISON || (legacyGate && phase == ERR_Phase.RADIO_SEARCH);
if (previous == ERR_Phase.PRISON) return phase == ERR_Phase.PRISON || phase == ERR_Phase.RADIO_SEARCH;
return previous == ERR_Phase.RADIO_SEARCH && phase == ERR_Phase.RADIO_SEARCH;
}
static bool Within(int start, int previous, int now, int samples)
{
return now >= start && now >= previous && now - start < 45000 && samples < 450;
@@ -46,6 +66,8 @@ class ERR_OrdinaryInputObserver : Managed
protected UUID m_Account;
protected int m_PlayerId;
protected string m_Nonce;
protected bool m_HeldAction;
protected int m_ObservedPhase = -1;
protected bool m_Screenshots;
protected bool m_Finished;
protected bool m_Ready;
@@ -88,6 +110,10 @@ class ERR_OrdinaryInputObserver : Managed
request.m_Character = CharacterControllerComponent.Cast(actor.FindComponent(CharacterControllerComponent));
request.m_Life = life; request.m_Account = life.AccountId;
request.m_PlayerId = controller.GetPlayerId(); request.m_Nonce = nonce;
if (!ERR_OrdinaryInputObserverRules.HeldScope(nonce, request.m_HeldAction)) return;
// Once a held run has an admitted life, invalid initial context is terminal.
// A later PRISON phase or replacement admission cannot restart its evidence.
if (request.m_HeldAction) s_Attempted = true;
if (!request.Valid()) return;
string screenshots;
request.m_Screenshots = System.GetCLIParam("errOrdinaryInputScreenshots", screenshots) && screenshots == "1";
@@ -102,14 +128,21 @@ class ERR_OrdinaryInputObserver : Managed
{
string nonce;
if (!Enabled(nonce) || nonce != m_Nonce || !GetGame() || !m_Mode || m_Mode != ERR_GameMode.Get()) return false;
if (!m_World || GetGame().GetWorld() != m_World || m_Mode.GetWorld() != m_World || !m_Mode.Active() || m_Mode.Phase() != ERR_Phase.PRISON) return false;
if (!m_World || GetGame().GetWorld() != m_World || m_Mode.GetWorld() != m_World || !m_Mode.Active()) return false;
if (!m_Controller || m_Controller != GetGame().GetPlayerController() || m_Controller.GetPlayerId() != m_PlayerId || m_PlayerId <= 0) return false;
PlayerManager manager = GetGame().GetPlayerManager();
if (!manager || manager.GetPlayerController(m_PlayerId) != m_Controller || manager.GetPlayerControlledEntity(m_PlayerId) != m_Actor || m_Controller.GetControlledEntity() != m_Actor) return false;
if (!ERR_Actors.CanFight(m_Actor) || m_Actor.GetWorld() != m_World || !m_Mode.Players()) return false;
if (!m_Character || m_Actor.FindComponent(CharacterControllerComponent) != m_Character || m_Character.IsUnconscious()) return false;
ERR_PlayerLife current = m_Mode.Players().CurrentActor(m_Actor);
return current && current == m_Life && current.AccountId == m_Account;
if (!current || current != m_Life || current.AccountId != m_Account) return false;
bool held;
if (!ERR_OrdinaryInputObserverRules.HeldScope(m_Nonce, held) || held != m_HeldAction) return false;
if (held && (CompartmentAccessComponent.GetVehicleIn(m_Actor) || !GetGame().GetMenuManager() || GetGame().GetMenuManager().GetTopMenu())) return false;
int phase = m_Mode.Phase();
if (!ERR_OrdinaryInputObserverRules.PhaseAllowed(phase, m_ObservedPhase, held)) return false;
m_ObservedPhase = phase;
return true;
}
protected void Record(string detail)
{
@@ -17,6 +17,8 @@ class ERR_OrdinaryLookObserver
protected int m_Previous;
protected int m_Index;
protected bool m_Stopped;
protected bool m_HeldAction;
protected int m_ObservedPhase = -1;
protected static bool Enabled(string nonce)
{
@@ -45,6 +47,8 @@ class ERR_OrdinaryLookObserver
if (controller) s_Request.m_Camera = controller.GetPlayerCamera();
if (mode && mode.Players()) s_Request.m_Life = mode.Players().CurrentActor(actor);
if (s_Request.m_Life) s_Request.m_Account = s_Request.m_Life.AccountId;
if (!ERR_OrdinaryInputObserverRules.HeldScope(nonce, s_Request.m_HeldAction))
{ s_Request.Cancel(index, now, "held-option-binding-lost"); return; }
}
s_Request.Observe(mode, world, controller, actor, nonce, started, index, now);
}
@@ -60,7 +64,7 @@ class ERR_OrdinaryLookObserver
protected bool Context()
{
if (!GetGame() || !m_Mode || !m_World || !m_Controller || !m_Actor || !m_Camera || !m_Life) return false;
if (m_Mode != ERR_GameMode.Get() || !m_Mode.Active() || m_Mode.Phase() != ERR_Phase.PRISON) return false;
if (m_Mode != ERR_GameMode.Get() || !m_Mode.Active()) return false;
if (GetGame().GetWorld() != m_World || m_Mode.GetWorld() != m_World || m_Actor.GetWorld() != m_World || m_Camera.GetWorld() != m_World) return false;
if (GetGame().GetPlayerController() != m_Controller || m_Controller.GetControlledEntity() != m_Actor || m_Controller.GetPlayerCamera() != m_Camera) return false;
PlayerManager manager = GetGame().GetPlayerManager();
@@ -70,6 +74,12 @@ class ERR_OrdinaryLookObserver
CameraManager cameras = GetGame().GetCameraManager();
if (!cameras || cameras.CurrentCamera() != m_Camera) return false;
if (!GetGame().GetInputManager() || !GetGame().GetMenuManager() || GetGame().GetMenuManager().GetTopMenu()) return false;
bool held;
if (!ERR_OrdinaryInputObserverRules.HeldScope(m_Nonce, held) || held != m_HeldAction) return false;
if (held && CompartmentAccessComponent.GetVehicleIn(m_Actor)) return false;
int phase = m_Mode.Phase();
if (!ERR_OrdinaryInputObserverRules.PhaseAllowed(phase, m_ObservedPhase, held)) return false;
m_ObservedPhase = phase;
return true;
}