Add typed field-flight prototype and preserve native qualification failures
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user