From 858a0cff91368eb2827195abb3d0104fc23aca6b Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 13 Mar 2026 13:27:47 +0100 Subject: [PATCH] V 0.5.9 --- Prefabs/Characters/Core/Character_Base.et | 5 + .../Core/DefaultPlayerController.et | 2 +- resourceDatabase.rdb | Bin 1846 -> 1846 bytes scripts/Game/VON/SCR_VoiceRangeController.c | 127 +++++++++--------- scripts/Game/VON/SCR_VoiceRangeDisplay.c | 77 +++++++---- 5 files changed, 119 insertions(+), 92 deletions(-) diff --git a/Prefabs/Characters/Core/Character_Base.et b/Prefabs/Characters/Core/Character_Base.et index fb66c46..57c8714 100644 --- a/Prefabs/Characters/Core/Character_Base.et +++ b/Prefabs/Characters/Core/Character_Base.et @@ -8,10 +8,15 @@ SCR_ChimeraCharacter { } } SCR_VoNLoud "{68D6FBB9294FC854}" { + Filename "{B4C3941EC8B2AD20}Sounds/VON/von.acp" } SCR_VoNNormal "{68D6FBB92B468B18}" { + Filename "{B4C3941EC8B2AD20}Sounds/VON/von.acp" } SCR_VoNWhispering "{68D6FBB92DA4FA57}" { + Filename "{B4C3941EC8B2AD20}Sounds/VON/von.acp" + } + SCR_VoiceRangeController "{68DAC15F00FE077A}" { } } } \ No newline at end of file diff --git a/Prefabs/Characters/Core/DefaultPlayerController.et b/Prefabs/Characters/Core/DefaultPlayerController.et index b6ee312..657d471 100644 --- a/Prefabs/Characters/Core/DefaultPlayerController.et +++ b/Prefabs/Characters/Core/DefaultPlayerController.et @@ -3,7 +3,7 @@ SCR_PlayerController { components { SCR_HUDManagerComponent "{2FDC275D9EBCDB8B}" { InfoDisplays { - SCR_VoiceRangeDisplay "{68D6FBB914C425E5}" { + SCR_VoiceRangeDisplay "{68DAC15CFD8822E9}" { } } } diff --git a/resourceDatabase.rdb b/resourceDatabase.rdb index 9ccfea127e26fc924caf7db708a63f6ac6e26bc7..46fa16d94f73f4ee212a3c74d8948034488e1941 100644 GIT binary patch delta 69 zcmV-L0J{IS4z>=EGXr74+Oal60|hUf+GyXCeglUCSHaqo2n2BhB)r;_d<4k_8^GFV bNRvthJ_U)s+GxPDjRh0|15?4;lcWZc-NYP} delta 69 zcmdnSw~cRtG4nZtn;XrXnOWtfZf3Ymu48UzZZo(!nS-T}`60{o$u%q|SsnFmX8fJ( Z#cIc@p?x!>e{(OZ2qSYNP|*^$NdS4e8K3|F diff --git a/scripts/Game/VON/SCR_VoiceRangeController.c b/scripts/Game/VON/SCR_VoiceRangeController.c index 21f19ef..98fbec8 100644 --- a/scripts/Game/VON/SCR_VoiceRangeController.c +++ b/scripts/Game/VON/SCR_VoiceRangeController.c @@ -15,10 +15,7 @@ class SCR_VoiceRangeController: ScriptComponent { [Attribute("1", UIWidgets.Slider, "Schrittgroesse (Meter pro Tastendruck)", "1 50 1")] protected int m_iStepSize; - // Speichert das echte Ring-Objekt (Decal) in der Spielwelt protected IEntity m_RangeRingEntity; - - // Timer für den Cooldown (verhindert das +1 / -1 Springen bei analogen Tasten) protected int m_iLastInputTime = 0; static SCR_VoiceRangeController GetInstance() { @@ -32,127 +29,131 @@ class SCR_VoiceRangeController: ScriptComponent { } protected override void EOnInit(IEntity owner) { - if (!GetGame().GetInputManager()) return; + // Wir warten 1 Sekunde (1000ms), bevor wir die Tasten registrieren, + // damit der PlayerController garantiert vollständig geladen ist. + GetGame().GetCallqueue().CallLater(RegisterInputs, 1000, false, owner); + } + + void RegisterInputs(IEntity owner) { + PlayerController pc = PlayerController.Cast(owner); + if (!pc) return; + + // Sind wir der lokale Spieler an diesem PC? + if (pc != GetGame().GetPlayerController()) { + return; + } + + InputManager inputManager = GetGame().GetInputManager(); + if (!inputManager) { + Print("GTG Voice: FEHLER - Kein InputManager gefunden!", LogLevel.ERROR); + return; + } - // HIER STEHEN DIE NAMEN DER ACTIONS - GetGame().GetInputManager().AddActionListener("GTG_RangeUp", EActionTrigger.DOWN, IncreaseRange); - GetGame().GetInputManager().AddActionListener("GTG_RangeDown", EActionTrigger.DOWN, DecreaseRange); + // Tasten registrieren + inputManager.AddActionListener("GTG_RangeUp", EActionTrigger.DOWN, IncreaseRange); + inputManager.AddActionListener("GTG_RangeDown", EActionTrigger.DOWN, DecreaseRange); + + Print("GTG Voice: ERFOLG - Tasten registriert und bereit!", LogLevel.WARNING); } void IncreaseRange() { - // Blockiert den Input, wenn seit dem letzten Druck nicht mind. 250ms vergangen sind if (System.GetTickCount() < m_iLastInputTime + 250) return; - m_iLastInputTime = System.GetTickCount(); // Speichert die aktuelle Zeit - - Print("GTG Voice: PLUS gedrueckt!", LogLevel.WARNING); + m_iLastInputTime = System.GetTickCount(); ChangeRange(1); } void DecreaseRange() { - // Blockiert den Input auch hier für 250ms if (System.GetTickCount() < m_iLastInputTime + 250) return; m_iLastInputTime = System.GetTickCount(); - - Print("GTG Voice: MINUS gedrueckt!", LogLevel.WARNING); ChangeRange(-1); } void ChangeRange(int direction) { int newRange = Math.ClampInt(m_iCurrentRange + (direction * m_iStepSize), m_iMinRange, m_iMaxRange); - if (m_iCurrentRange == newRange) return; + + // Wir loggen immer, damit du siehst, ob das Skript arbeitet + Print("GTG Voice: Taste erkannt. Neue Reichweite: " + newRange.ToString(), LogLevel.WARNING); m_iCurrentRange = newRange; - Print("GTG Voice: Neue Reichweite ist " + m_iCurrentRange.ToString(), LogLevel.WARNING); - + ApplyRangeToVON(); UpdateUI(); DrawRangeCircle(); } protected void ApplyRangeToVON() { - IEntity player = GetGame().GetPlayerController().GetControlledEntity(); + PlayerController pc = PlayerController.Cast(GetOwner()); + if (!pc) return; + IEntity player = pc.GetControlledEntity(); if (!player) return; SCR_VONController vonContr = SCR_VONController.Cast(GetOwner().FindComponent(SCR_VONController)); if (!vonContr) return; - // --- HYBRID LÖSUNG --- - typename compType = SCR_VoNNormal; // Standard - - if (m_iCurrentRange <= 15) { - compType = SCR_VoNWhispering; - } else if (m_iCurrentRange >= 50) { - compType = SCR_VoNLoud; - } + typename compType = SCR_VoNNormal; + if (m_iCurrentRange <= 15) compType = SCR_VoNWhispering; + else if (m_iCurrentRange >= 50) compType = SCR_VoNLoud; SCR_VoNComponent newVonComp = SCR_VoNComponent.Cast(player.FindComponent(compType)); if (newVonComp) { vonContr.SetVONComponent(newVonComp); + vonContr.SetVONProximityToggle(false); + vonContr.SetVONProximityToggle(true); } } void UpdateUI() { - Print("GTG Voice: Suche HUD Manager...", LogLevel.WARNING); SCR_HUDManagerComponent hud = SCR_HUDManagerComponent.Cast(GetOwner().FindComponent(SCR_HUDManagerComponent)); - if (!hud) { - Print("GTG Voice: FEHLER - HUD Manager nicht auf dem PlayerController gefunden!", LogLevel.ERROR); - return; - } + if (!hud) return; - Print("GTG Voice: Suche VoiceRangeDisplay...", LogLevel.WARNING); SCR_VoiceRangeDisplay display = SCR_VoiceRangeDisplay.Cast(hud.FindInfoDisplay(SCR_VoiceRangeDisplay)); - if (!display) { - Print("GTG Voice: FEHLER - SCR_VoiceRangeDisplay fehlt in den Info Displays des HUD Managers!", LogLevel.ERROR); - return; - } - - Print("GTG Voice: Display gefunden! Sende Text an UI...", LogLevel.WARNING); - display.UpdateRangeText(m_iCurrentRange); + if (display) display.UpdateRangeText(m_iCurrentRange); } - void DrawRangeCircle() { - IEntity player = GetGame().GetPlayerController().GetControlledEntity(); - if (!player) { - Print("GTG Voice: FEHLER - Kein spielbarer Charakter (Koerper) fuer den Kreis gefunden!", LogLevel.ERROR); - return; - } + void DrawRangeCircle() + { + PlayerController pc = PlayerController.Cast(GetOwner()); + // Sicherheitscheck: Nur beim lokalen Spieler zeichnen + if (!pc || pc != GetGame().GetPlayerController()) return; - // Wenn schon ein Ring existiert, sofort löschen - if (m_RangeRingEntity) { + IEntity player = pc.GetControlledEntity(); + if (!player) return; + + if (m_RangeRingEntity) + { SCR_EntityHelper.DeleteEntityAndChildren(m_RangeRingEntity); m_RangeRingEntity = null; } - // 1. Hole absolute Welt-Position der Füße vector playerPos = player.GetOrigin(); + playerPos[1] = playerPos[1] + 0.1; - // 2. Erstelle Spawn-Parameter - EntitySpawnParams spawnParams = EntitySpawnParams(); - spawnParams.TransformMode = ETransformMode.WORLD; - spawnParams.Transform[3] = playerPos; + EntitySpawnParams params = new EntitySpawnParams(); + params.TransformMode = ETransformMode.WORLD; + params.Transform[3] = playerPos; - // 3. Spawne das Decal-Prefab - ResourceName ringPrefab = "{E6268D7D980F8A5D}Prefabs/Props/Military/Compositions/US/Decals/Decal_Helipad_US.et"; + ResourceName ringPrefab = "{E95CB8F4C4B2C210}Prefabs/Decals/Markings/Runway/Decal_Helipad_01.et"; Resource res = Resource.Load(ringPrefab); - if (res && res.IsValid()) { - m_RangeRingEntity = GetGame().SpawnEntityPrefab(res, GetGame().GetWorld(), spawnParams); + if (res && res.IsValid()) + { + m_RangeRingEntity = GetGame().SpawnEntityPrefab(res, GetGame().GetWorld(), params); - if (m_RangeRingEntity) { - // Skaliere das Objekt passend zu der Meter-Reichweite - float scale = m_iCurrentRange * 1.0; - m_RangeRingEntity.SetScale(scale); + if (m_RangeRingEntity) + { + float baseSize = 5.0; + float finalScale = m_iCurrentRange / baseSize; + m_RangeRingEntity.SetScale(finalScale); + Print(string.Format("GTG Voice: Meter %1 -> Scale gesetzt auf %2", m_iCurrentRange, finalScale), LogLevel.WARNING); } - } else { - Print("GTG Voice: Ring Prefab konnte nicht geladen werden!", LogLevel.ERROR); } - // Nach 2 Sekunden restlos aus der Welt löschen GetGame().GetCallqueue().Remove(HideRangeCircle); GetGame().GetCallqueue().CallLater(HideRangeCircle, 2000, false); } + // DIESE FUNKTION HAT GEFEHLT: void HideRangeCircle() { if (m_RangeRingEntity) { SCR_EntityHelper.DeleteEntityAndChildren(m_RangeRingEntity); diff --git a/scripts/Game/VON/SCR_VoiceRangeDisplay.c b/scripts/Game/VON/SCR_VoiceRangeDisplay.c index 0c92a9f..2490c7a 100644 --- a/scripts/Game/VON/SCR_VoiceRangeDisplay.c +++ b/scripts/Game/VON/SCR_VoiceRangeDisplay.c @@ -1,35 +1,56 @@ -class SCR_VoiceRangeDisplay: SCR_InfoDisplay { - protected TextWidget m_wRangeText; - protected SCR_FadeUIComponent m_FadeComponent; +class SCR_VoiceRangeDisplay: SCR_InfoDisplay{ + protected TextWidget m_wRangeText; + protected SCR_FadeUIComponent m_FadeComponent; - protected override event void OnStartDraw(IEntity owner) { - super.OnStartDraw(owner); + protected override event void OnStartDraw(IEntity owner) + { + super.OnStartDraw(owner); - if (!m_wRoot) { - m_wRoot = GetGame().GetWorkspace().CreateWidgets("{52CB3045C167E6D8}UI/layouts/VoiceRange/VoiceRangeDynamicNumber.layout"); - if (!m_wRoot) return; - } + if (!m_wRoot) + { + m_wRoot = GetGame().GetWorkspace().CreateWidgets("{52CB3045C167E6D8}UI/layouts/VoiceRange/VoiceRangeDynamicNumber.layout"); + if (!m_wRoot){ + return; + } + } - m_wRangeText = TextWidget.Cast(m_wRoot.FindAnyWidget("RangeText")); - if (!m_wRangeText) return; + m_wRangeText = TextWidget.Cast(m_wRoot.FindAnyWidget("RangeText")); + if (!m_wRangeText){ + return; + } - m_FadeComponent = SCR_FadeUIComponent.Cast(m_wRangeText.FindHandler(SCR_FadeUIComponent)); - - m_wRangeText.SetVisible(false); - } - - void UpdateRangeText(int range) { - if (!m_wRangeText) { - Print("GTG Voice: FEHLER - TextWidget 'RangeText' nicht gefunden! Layout-Pfad falsch?", LogLevel.ERROR); - return; - } + m_FadeComponent = SCR_FadeUIComponent.Cast(m_wRangeText.FindHandler(SCR_FadeUIComponent)); + + m_wRangeText.SetVisible(false); } - protected void StartFadeOut() { - if (m_FadeComponent) { - m_FadeComponent.FadeOut(false); - } else if (m_wRangeText) { - m_wRangeText.SetVisible(false); - } - } + void UpdateRangeText(int range) + { + if (!m_wRangeText){ + return; + } + + m_wRangeText.SetText(range.ToString() + "m"); + m_wRangeText.SetVisible(true); + + if (m_FadeComponent) + { + m_FadeComponent.FadeIn(true); + } + + GetGame().GetCallqueue().Remove(StartFadeOut); + GetGame().GetCallqueue().CallLater(StartFadeOut, 3000, false); + } + + protected void StartFadeOut() + { + if (m_FadeComponent) + { + m_FadeComponent.FadeOut(false); + } + else if (m_wRangeText) + { + m_wRangeText.SetVisible(false); + } + } } \ No newline at end of file