V 0.5.9
This commit is contained in:
@@ -8,10 +8,15 @@ SCR_ChimeraCharacter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
SCR_VoNLoud "{68D6FBB9294FC854}" {
|
SCR_VoNLoud "{68D6FBB9294FC854}" {
|
||||||
|
Filename "{B4C3941EC8B2AD20}Sounds/VON/von.acp"
|
||||||
}
|
}
|
||||||
SCR_VoNNormal "{68D6FBB92B468B18}" {
|
SCR_VoNNormal "{68D6FBB92B468B18}" {
|
||||||
|
Filename "{B4C3941EC8B2AD20}Sounds/VON/von.acp"
|
||||||
}
|
}
|
||||||
SCR_VoNWhispering "{68D6FBB92DA4FA57}" {
|
SCR_VoNWhispering "{68D6FBB92DA4FA57}" {
|
||||||
|
Filename "{B4C3941EC8B2AD20}Sounds/VON/von.acp"
|
||||||
|
}
|
||||||
|
SCR_VoiceRangeController "{68DAC15F00FE077A}" {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3,7 +3,7 @@ SCR_PlayerController {
|
|||||||
components {
|
components {
|
||||||
SCR_HUDManagerComponent "{2FDC275D9EBCDB8B}" {
|
SCR_HUDManagerComponent "{2FDC275D9EBCDB8B}" {
|
||||||
InfoDisplays {
|
InfoDisplays {
|
||||||
SCR_VoiceRangeDisplay "{68D6FBB914C425E5}" {
|
SCR_VoiceRangeDisplay "{68DAC15CFD8822E9}" {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
@@ -15,10 +15,7 @@ class SCR_VoiceRangeController: ScriptComponent {
|
|||||||
[Attribute("1", UIWidgets.Slider, "Schrittgroesse (Meter pro Tastendruck)", "1 50 1")]
|
[Attribute("1", UIWidgets.Slider, "Schrittgroesse (Meter pro Tastendruck)", "1 50 1")]
|
||||||
protected int m_iStepSize;
|
protected int m_iStepSize;
|
||||||
|
|
||||||
// Speichert das echte Ring-Objekt (Decal) in der Spielwelt
|
|
||||||
protected IEntity m_RangeRingEntity;
|
protected IEntity m_RangeRingEntity;
|
||||||
|
|
||||||
// Timer für den Cooldown (verhindert das +1 / -1 Springen bei analogen Tasten)
|
|
||||||
protected int m_iLastInputTime = 0;
|
protected int m_iLastInputTime = 0;
|
||||||
|
|
||||||
static SCR_VoiceRangeController GetInstance() {
|
static SCR_VoiceRangeController GetInstance() {
|
||||||
@@ -32,38 +29,53 @@ class SCR_VoiceRangeController: ScriptComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected override void EOnInit(IEntity owner) {
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
// HIER STEHEN DIE NAMEN DER ACTIONS
|
void RegisterInputs(IEntity owner) {
|
||||||
GetGame().GetInputManager().AddActionListener("GTG_RangeUp", EActionTrigger.DOWN, IncreaseRange);
|
PlayerController pc = PlayerController.Cast(owner);
|
||||||
GetGame().GetInputManager().AddActionListener("GTG_RangeDown", EActionTrigger.DOWN, DecreaseRange);
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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() {
|
void IncreaseRange() {
|
||||||
// Blockiert den Input, wenn seit dem letzten Druck nicht mind. 250ms vergangen sind
|
|
||||||
if (System.GetTickCount() < m_iLastInputTime + 250) return;
|
if (System.GetTickCount() < m_iLastInputTime + 250) return;
|
||||||
m_iLastInputTime = System.GetTickCount(); // Speichert die aktuelle Zeit
|
m_iLastInputTime = System.GetTickCount();
|
||||||
|
|
||||||
Print("GTG Voice: PLUS gedrueckt!", LogLevel.WARNING);
|
|
||||||
ChangeRange(1);
|
ChangeRange(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DecreaseRange() {
|
void DecreaseRange() {
|
||||||
// Blockiert den Input auch hier für 250ms
|
|
||||||
if (System.GetTickCount() < m_iLastInputTime + 250) return;
|
if (System.GetTickCount() < m_iLastInputTime + 250) return;
|
||||||
m_iLastInputTime = System.GetTickCount();
|
m_iLastInputTime = System.GetTickCount();
|
||||||
|
|
||||||
Print("GTG Voice: MINUS gedrueckt!", LogLevel.WARNING);
|
|
||||||
ChangeRange(-1);
|
ChangeRange(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ChangeRange(int direction) {
|
void ChangeRange(int direction) {
|
||||||
int newRange = Math.ClampInt(m_iCurrentRange + (direction * m_iStepSize), m_iMinRange, m_iMaxRange);
|
int newRange = Math.ClampInt(m_iCurrentRange + (direction * m_iStepSize), m_iMinRange, m_iMaxRange);
|
||||||
|
|
||||||
if (m_iCurrentRange == newRange) return;
|
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;
|
m_iCurrentRange = newRange;
|
||||||
Print("GTG Voice: Neue Reichweite ist " + m_iCurrentRange.ToString(), LogLevel.WARNING);
|
|
||||||
|
|
||||||
ApplyRangeToVON();
|
ApplyRangeToVON();
|
||||||
UpdateUI();
|
UpdateUI();
|
||||||
@@ -71,88 +83,77 @@ class SCR_VoiceRangeController: ScriptComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void ApplyRangeToVON() {
|
protected void ApplyRangeToVON() {
|
||||||
IEntity player = GetGame().GetPlayerController().GetControlledEntity();
|
PlayerController pc = PlayerController.Cast(GetOwner());
|
||||||
|
if (!pc) return;
|
||||||
|
IEntity player = pc.GetControlledEntity();
|
||||||
if (!player) return;
|
if (!player) return;
|
||||||
|
|
||||||
SCR_VONController vonContr = SCR_VONController.Cast(GetOwner().FindComponent(SCR_VONController));
|
SCR_VONController vonContr = SCR_VONController.Cast(GetOwner().FindComponent(SCR_VONController));
|
||||||
if (!vonContr) return;
|
if (!vonContr) return;
|
||||||
|
|
||||||
// --- HYBRID LÖSUNG ---
|
typename compType = SCR_VoNNormal;
|
||||||
typename compType = SCR_VoNNormal; // Standard
|
if (m_iCurrentRange <= 15) compType = SCR_VoNWhispering;
|
||||||
|
else if (m_iCurrentRange >= 50) compType = SCR_VoNLoud;
|
||||||
if (m_iCurrentRange <= 15) {
|
|
||||||
compType = SCR_VoNWhispering;
|
|
||||||
} else if (m_iCurrentRange >= 50) {
|
|
||||||
compType = SCR_VoNLoud;
|
|
||||||
}
|
|
||||||
|
|
||||||
SCR_VoNComponent newVonComp = SCR_VoNComponent.Cast(player.FindComponent(compType));
|
SCR_VoNComponent newVonComp = SCR_VoNComponent.Cast(player.FindComponent(compType));
|
||||||
if (newVonComp) {
|
if (newVonComp) {
|
||||||
vonContr.SetVONComponent(newVonComp);
|
vonContr.SetVONComponent(newVonComp);
|
||||||
|
vonContr.SetVONProximityToggle(false);
|
||||||
|
vonContr.SetVONProximityToggle(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdateUI() {
|
void UpdateUI() {
|
||||||
Print("GTG Voice: Suche HUD Manager...", LogLevel.WARNING);
|
|
||||||
SCR_HUDManagerComponent hud = SCR_HUDManagerComponent.Cast(GetOwner().FindComponent(SCR_HUDManagerComponent));
|
SCR_HUDManagerComponent hud = SCR_HUDManagerComponent.Cast(GetOwner().FindComponent(SCR_HUDManagerComponent));
|
||||||
if (!hud) {
|
if (!hud) return;
|
||||||
Print("GTG Voice: FEHLER - HUD Manager nicht auf dem PlayerController gefunden!", LogLevel.ERROR);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Print("GTG Voice: Suche VoiceRangeDisplay...", LogLevel.WARNING);
|
|
||||||
SCR_VoiceRangeDisplay display = SCR_VoiceRangeDisplay.Cast(hud.FindInfoDisplay(SCR_VoiceRangeDisplay));
|
SCR_VoiceRangeDisplay display = SCR_VoiceRangeDisplay.Cast(hud.FindInfoDisplay(SCR_VoiceRangeDisplay));
|
||||||
if (!display) {
|
if (display) display.UpdateRangeText(m_iCurrentRange);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawRangeCircle() {
|
void DrawRangeCircle()
|
||||||
IEntity player = GetGame().GetPlayerController().GetControlledEntity();
|
{
|
||||||
if (!player) {
|
PlayerController pc = PlayerController.Cast(GetOwner());
|
||||||
Print("GTG Voice: FEHLER - Kein spielbarer Charakter (Koerper) fuer den Kreis gefunden!", LogLevel.ERROR);
|
// Sicherheitscheck: Nur beim lokalen Spieler zeichnen
|
||||||
return;
|
if (!pc || pc != GetGame().GetPlayerController()) return;
|
||||||
}
|
|
||||||
|
|
||||||
// Wenn schon ein Ring existiert, sofort löschen
|
IEntity player = pc.GetControlledEntity();
|
||||||
if (m_RangeRingEntity) {
|
if (!player) return;
|
||||||
|
|
||||||
|
if (m_RangeRingEntity)
|
||||||
|
{
|
||||||
SCR_EntityHelper.DeleteEntityAndChildren(m_RangeRingEntity);
|
SCR_EntityHelper.DeleteEntityAndChildren(m_RangeRingEntity);
|
||||||
m_RangeRingEntity = null;
|
m_RangeRingEntity = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 1. Hole absolute Welt-Position der Füße
|
|
||||||
vector playerPos = player.GetOrigin();
|
vector playerPos = player.GetOrigin();
|
||||||
|
playerPos[1] = playerPos[1] + 0.1;
|
||||||
|
|
||||||
// 2. Erstelle Spawn-Parameter
|
EntitySpawnParams params = new EntitySpawnParams();
|
||||||
EntitySpawnParams spawnParams = EntitySpawnParams();
|
params.TransformMode = ETransformMode.WORLD;
|
||||||
spawnParams.TransformMode = ETransformMode.WORLD;
|
params.Transform[3] = playerPos;
|
||||||
spawnParams.Transform[3] = playerPos;
|
|
||||||
|
|
||||||
// 3. Spawne das Decal-Prefab
|
ResourceName ringPrefab = "{E95CB8F4C4B2C210}Prefabs/Decals/Markings/Runway/Decal_Helipad_01.et";
|
||||||
ResourceName ringPrefab = "{E6268D7D980F8A5D}Prefabs/Props/Military/Compositions/US/Decals/Decal_Helipad_US.et";
|
|
||||||
Resource res = Resource.Load(ringPrefab);
|
Resource res = Resource.Load(ringPrefab);
|
||||||
|
|
||||||
if (res && res.IsValid()) {
|
if (res && res.IsValid())
|
||||||
m_RangeRingEntity = GetGame().SpawnEntityPrefab(res, GetGame().GetWorld(), spawnParams);
|
{
|
||||||
|
m_RangeRingEntity = GetGame().SpawnEntityPrefab(res, GetGame().GetWorld(), params);
|
||||||
|
|
||||||
if (m_RangeRingEntity) {
|
if (m_RangeRingEntity)
|
||||||
// Skaliere das Objekt passend zu der Meter-Reichweite
|
{
|
||||||
float scale = m_iCurrentRange * 1.0;
|
float baseSize = 5.0;
|
||||||
m_RangeRingEntity.SetScale(scale);
|
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().Remove(HideRangeCircle);
|
||||||
GetGame().GetCallqueue().CallLater(HideRangeCircle, 2000, false);
|
GetGame().GetCallqueue().CallLater(HideRangeCircle, 2000, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DIESE FUNKTION HAT GEFEHLT:
|
||||||
void HideRangeCircle() {
|
void HideRangeCircle() {
|
||||||
if (m_RangeRingEntity) {
|
if (m_RangeRingEntity) {
|
||||||
SCR_EntityHelper.DeleteEntityAndChildren(m_RangeRingEntity);
|
SCR_EntityHelper.DeleteEntityAndChildren(m_RangeRingEntity);
|
||||||
|
|||||||
@@ -1,35 +1,56 @@
|
|||||||
class SCR_VoiceRangeDisplay: SCR_InfoDisplay {
|
class SCR_VoiceRangeDisplay: SCR_InfoDisplay{
|
||||||
protected TextWidget m_wRangeText;
|
protected TextWidget m_wRangeText;
|
||||||
protected SCR_FadeUIComponent m_FadeComponent;
|
protected SCR_FadeUIComponent m_FadeComponent;
|
||||||
|
|
||||||
protected override event void OnStartDraw(IEntity owner) {
|
protected override event void OnStartDraw(IEntity owner)
|
||||||
super.OnStartDraw(owner);
|
{
|
||||||
|
super.OnStartDraw(owner);
|
||||||
|
|
||||||
if (!m_wRoot) {
|
if (!m_wRoot)
|
||||||
m_wRoot = GetGame().GetWorkspace().CreateWidgets("{52CB3045C167E6D8}UI/layouts/VoiceRange/VoiceRangeDynamicNumber.layout");
|
{
|
||||||
if (!m_wRoot) return;
|
m_wRoot = GetGame().GetWorkspace().CreateWidgets("{52CB3045C167E6D8}UI/layouts/VoiceRange/VoiceRangeDynamicNumber.layout");
|
||||||
}
|
if (!m_wRoot){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
m_wRangeText = TextWidget.Cast(m_wRoot.FindAnyWidget("RangeText"));
|
m_wRangeText = TextWidget.Cast(m_wRoot.FindAnyWidget("RangeText"));
|
||||||
if (!m_wRangeText) return;
|
if (!m_wRangeText){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
m_FadeComponent = SCR_FadeUIComponent.Cast(m_wRangeText.FindHandler(SCR_FadeUIComponent));
|
m_FadeComponent = SCR_FadeUIComponent.Cast(m_wRangeText.FindHandler(SCR_FadeUIComponent));
|
||||||
|
|
||||||
m_wRangeText.SetVisible(false);
|
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void StartFadeOut() {
|
void UpdateRangeText(int range)
|
||||||
if (m_FadeComponent) {
|
{
|
||||||
m_FadeComponent.FadeOut(false);
|
if (!m_wRangeText){
|
||||||
} else if (m_wRangeText) {
|
return;
|
||||||
m_wRangeText.SetVisible(false);
|
}
|
||||||
}
|
|
||||||
}
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user