added destionation targets, illusionary wall WIP, fixes to triggers

This commit is contained in:
2025-10-28 20:11:48 +01:00
parent 4d0231ed09
commit b33a490d67
6 changed files with 2370 additions and 991 deletions

View File

@@ -9,189 +9,185 @@ using Sirenix.OdinInspector;
using PixelCrushers.QuestMachine;
using PixelCrushers.DialogueSystem;
using TMPro;
namespace Beyond
{
[vClassHeader("bTrigger Generic Action", false, iconName = "triggerIcon")]
public class bTriggerGenericAction : vTriggerGenericAction
[vClassHeader("bTrigger Generic Action", false, iconName = "triggerIcon")]
public class bTriggerGenericAction : vTriggerGenericAction
{
[vEditorToolbar("Conditions", order = 0)] [SerializeField]
private Condition m_questCondition;
public bool m_itemChecking;
public int m_itemToCheckId;
[vHelpBox("Disable Selected HUD OnValidate, and enable OnInvalidate. Script ActionTriggerEvent.cs")]
public bool disableHUD = true;
[vHelpBox("Changes interaction image")]
//public bool isDialogueTrigger = false;
public TriggerDescriptor.TriggerType triggerType = TriggerDescriptor.TriggerType.Generic;
public UnityEvent OnPlayerMatchTargetPosition;
[vEditorToolbar("Animation", order = 2)] [SerializeField]
public bool useFadeOnMatchingToTarget;
[SerializeField] private AnimationCurve m_fadeInCurve;
[SerializeField] private AnimationCurve m_fadeOutCurve;
[SerializeField] private float m_fadeSpeed = 2f;
[vEditorToolbar("Interaction", order = 4)] [SerializeField]
private bool m_enableInteractionLegality;
public Quest m_guilt;
private bool m_faded;
public bool Faded => m_faded;
public float animationDelay = 0f;
private TriggerDescriptor m_triggerDescriptor;
private void OnEnable()
{
[vEditorToolbar("Conditions", order = 0)] [SerializeField]
private Condition m_questCondition;
public bool m_itemChecking;
public int m_itemToCheckId;
[vHelpBox("Disable Selected HUD OnValidate, and enable OnInvalidate. Script ActionTriggerEvent.cs")]
public bool disableHUD = true;
[vHelpBox("Changes interaction image")]
public TriggerDescriptor.TriggerType triggerType = TriggerDescriptor.TriggerType.Generic;
public UnityEvent OnPlayerMatchTargetPosition;
[vEditorToolbar("Animation", order = 2)] [SerializeField]
public bool useFadeOnMatchingToTarget;
[SerializeField] private AnimationCurve m_fadeInCurve;
[SerializeField] private AnimationCurve m_fadeOutCurve;
[SerializeField] private float m_fadeSpeed = 2f;
[vEditorToolbar("Interaction", order = 4)] [SerializeField]
private bool m_enableInteractionLegality;
public Quest m_guilt;
private bool m_faded;
public bool Faded => m_faded;
public float animationDelay = 0f;
private TriggerDescriptor m_triggerDescriptor;
private void OnEnable()
if (useFadeOnMatchingToTarget)
{
if (useFadeOnMatchingToTarget)
OnPressActionInput.AddListener(ToggleFade);
OnPlayerMatchTargetPosition.AddListener(ToggleFade);
if (FadeCanvasGroup.Instance)
{
OnPressActionInput.AddListener(ToggleFade);
OnPlayerMatchTargetPosition.AddListener(ToggleFade);
if (FadeCanvasGroup.Instance)
{
FadeCanvasGroup.Instance.OnFadeInEnd.AddListener(OnFadeInEnd);
FadeCanvasGroup.Instance.OnFadeOutEnd.AddListener(OnFadeOutEnd);
}
FadeCanvasGroup.Instance.OnFadeInEnd.AddListener(OnFadeInEnd);
FadeCanvasGroup.Instance.OnFadeOutEnd.AddListener(OnFadeOutEnd);
}
}
private void OnDisable()
{
if (useFadeOnMatchingToTarget)
{
OnPressActionInput.RemoveListener(ToggleFade);
OnPlayerMatchTargetPosition.RemoveListener(ToggleFade);
if (FadeCanvasGroup.Instance)
{
FadeCanvasGroup.Instance.OnFadeInEnd.RemoveListener(OnFadeInEnd);
FadeCanvasGroup.Instance.OnFadeOutEnd.RemoveListener(OnFadeOutEnd);
}
}
}
public override IEnumerator OnPressActionDelay(GameObject obj)
{
if (!m_itemChecking)
{
yield return base.OnPressActionDelay(obj);
}
if (m_itemChecking && Player.Instance.ItemManager.ContainItem(m_itemToCheckId))
{
yield return base.OnPressActionDelay(obj);
}
if (!Player.Instance.ItemManager.ContainItem(m_itemToCheckId))
{
var item = Player.Instance.ItemManager.itemListData.items.Find(item => item.id == m_itemToCheckId);
DialogueManager.BarkString($"{item.name} Required", Player.Instance.transform);
}
}
private void OnActionTriggerEnter(GameObject gameObject)
{
if (!m_questCondition.IsTrue(null))
{
return;
}
if (disableHUD)
{
ActionTriggerEvent.ActionTriggerEnter?.Invoke(m_triggerDescriptor);
}
if (triggerType == TriggerDescriptor.TriggerType.Dialogue)
{
Player.Instance.SetDialogueIntaractableButtonImage();
}
}
private void OnActionTriggerExit(GameObject gameObject)
{
if (disableHUD)
{
ActionTriggerEvent.ActionTriggerExit?.Invoke(m_triggerDescriptor);
}
if (triggerType == TriggerDescriptor.TriggerType.Dialogue)
{
Player.Instance.ResetIntaractableButtonImage();
}
}
private void OnActionEndAnimation(GameObject gameObject)
{
// THIS SECTION WAS THE PRIMARY CAUSE OF THE DOUBLE-EXIT CALL.
// The logic below was removed because the trigger exit should only happen
// when the player physically leaves the collider, which is already
// handled by the OnInvalidate event that calls OnActionTriggerExit.
/*
if (disableHUD)
{
ActionTriggerEvent.ActionTriggerExit?.Invoke(m_triggerDescriptor);
}
if (triggerType == TriggerDescriptor.TriggerType.Dialogue)
{
Player.Instance.ResetIntaractableButtonImage();
}
*/
if (!m_enableInteractionLegality)
{
return;
}
if (m_guilt == null)
{
Debug.LogError("There is no quilt assigned to interactable game object: " + gameObject.name);
return;
}
Player.Instance.PlayerConfessionController.AddGuilt(m_guilt);
}
private void ToggleFade()
{
if (FadeCanvasGroup.Instance == null)
{
return;
}
if (!m_faded)
{
m_faded = true;
FadeCanvasGroup.Instance.FadeOut(1f / m_fadeSpeed);
return;
}
FadeCanvasGroup.Instance.FadeIn(1f / m_fadeSpeed);
}
private void OnFadeInEnd()
{
m_faded = false;
}
private void OnFadeOutEnd()
{
m_faded = true;
}
protected override void Start()
{
base.Start();
m_triggerDescriptor = new TriggerDescriptor(gameObject, triggerType);
OnValidate.AddListener(OnActionTriggerEnter);
OnInvalidate.AddListener(OnActionTriggerExit);
OnEndAnimation.AddListener(() => OnActionEndAnimation(gameObject));
}
}
}
private void OnDisable()
{
if (useFadeOnMatchingToTarget)
{
OnPressActionInput.RemoveListener(ToggleFade);
OnPlayerMatchTargetPosition.RemoveListener(ToggleFade);
if (FadeCanvasGroup.Instance)
{
FadeCanvasGroup.Instance.OnFadeInEnd.RemoveListener(OnFadeInEnd);
FadeCanvasGroup.Instance.OnFadeOutEnd.RemoveListener(OnFadeOutEnd);
}
}
}
public override IEnumerator OnPressActionDelay(GameObject obj)
{
if (!m_itemChecking)
{
yield return base.OnPressActionDelay(obj);
}
if (m_itemChecking && Player.Instance.ItemManager.ContainItem(m_itemToCheckId))
{
yield return base.OnPressActionDelay(obj);
}
if (!Player.Instance.ItemManager.ContainItem(m_itemToCheckId))
{
var item = Player.Instance.ItemManager.itemListData.items.Find(item => item.id == m_itemToCheckId);
DialogueManager.BarkString($"{item.name} Required", Player.Instance.transform);
}
}
private void OnActionTriggerEnter(GameObject gameObject)
{
if (!m_questCondition.IsTrue(null))
{
return;
}
if (disableHUD)
{
ActionTriggerEvent.ActionTriggerEnter?.Invoke(m_triggerDescriptor);
}
if (triggerType == TriggerDescriptor.TriggerType.Dialogue)
{
Player.Instance.SetDialogueIntaractableButtonImage();
}
}
private void OnActionTriggerExit(GameObject gameObject)
{
if (disableHUD)
{
ActionTriggerEvent.ActionTriggerExit?.Invoke(m_triggerDescriptor);
}
if (triggerType == TriggerDescriptor.TriggerType.Dialogue)
{
Player.Instance.ResetIntaractableButtonImage();
}
}
private void OnActionEndAnimation(GameObject gameObject)
{
if (disableHUD)
{
ActionTriggerEvent.ActionTriggerExit?.Invoke(m_triggerDescriptor);
}
if (triggerType == TriggerDescriptor.TriggerType.Dialogue)
{
Player.Instance.ResetIntaractableButtonImage();
}
if (!m_enableInteractionLegality)
{
return;
}
if (m_guilt == null)
{
Debug.LogError("There is no quilt assigned to interactable game object: " + gameObject.name);
return;
}
Player.Instance.PlayerConfessionController.AddGuilt(m_guilt);
}
private void ToggleFade()
{
if (FadeCanvasGroup.Instance == null)
{
return;
}
if (!m_faded)
{
m_faded = true;
FadeCanvasGroup.Instance.FadeOut(1f / m_fadeSpeed);
//.InvokeFade(m_fadeInCurve, m_fadeSpeed);
return;
}
FadeCanvasGroup.Instance.FadeIn(1f / m_fadeSpeed);
//FadeCanvasGroup.InvokeFade(m_fadeOutCurve, m_fadeSpeed);
}
private void OnFadeInEnd()
{
m_faded = false;
}
private void OnFadeOutEnd()
{
m_faded = true;
}
protected override void Start()
{
base.Start();
m_triggerDescriptor = new TriggerDescriptor(gameObject, triggerType);
OnValidate.AddListener(OnActionTriggerEnter);
OnInvalidate.AddListener(OnActionTriggerExit);
OnEndAnimation.AddListener(() => OnActionEndAnimation(gameObject));
}
}
}