[ComponentEditorProps(category: "GameScripted/Character", description: "Erlaubt automatisches Laufen/Rennen")] class SCR_AutorunComponentClass: ScriptComponentClass { } class SCR_AutorunComponent: ScriptComponent { protected bool m_bIsAutorunEnabled = false; protected SCR_CharacterControllerComponent m_CharacterController; protected InputManager m_InputManager; protected void OnAutorunPressed() { m_bIsAutorunEnabled = !m_bIsAutorunEnabled; } protected void OnLifeStateChangedCallback() { m_bIsAutorunEnabled = false; } protected void OnControlledByPlayerCallback(IEntity owner, bool controlled) { m_bIsAutorunEnabled = false; } protected void OnPrepareControlsCallback(IEntity owner, ActionManager am, float dt, bool player) { if (!m_bIsAutorunEnabled) return; // Autorun abbrechen, wenn: Kontext inaktiv, Karte offen oder Spieler bewegt sich manuell (W/S/A/D) if (!m_InputManager.IsContextActive("CharacterMovementContext") || am.GetActionTriggered("GadgetMap") || Math.AbsFloat(m_InputManager.GetActionValue("CharacterForward")) >= 0.75 || Math.AbsFloat(m_InputManager.GetActionValue("CharacterRight")) >= 0.75) { m_bIsAutorunEnabled = false; return; } // Bewegungswerte zwingen (Laufen + Rennen) m_InputManager.SetActionValue("CharacterForward", 1.0); m_InputManager.SetActionValue("CharacterSprint", 1.0); } override void OnPostInit(IEntity owner) { m_CharacterController = SCR_CharacterControllerComponent.Cast(owner.FindComponent(SCR_CharacterControllerComponent)); if (!m_CharacterController) { Print("[SCR_Autorun] Kein SCR_CharacterControllerComponent gefunden! Mod funktioniert nicht.", LogLevel.WARNING); return; } m_InputManager = GetGame().GetInputManager(); // Events abonnieren m_CharacterController.m_OnPrepareControls.Insert(OnPrepareControlsCallback); // Action Listener (Der Name "SCR_Autorun" muss mit der Input-Config übereinstimmen!) m_InputManager.AddActionListener("SCR_Autorun", EActionTrigger.DOWN, OnAutorunPressed); } }