Files
2025-07-20 10:01:29 +08:00

172 lines
10 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEditorInternal;
namespace EmeraldAI.Utility
{
[CustomEditor(typeof(EmeraldEvents))]
[CanEditMultipleObjects]
public class EmeraldEventsEditor : Editor
{
GUIStyle FoldoutStyle;
Texture EventsEditorIcon;
//Bools
SerializedProperty HideSettingsFoldout, GeneralEventsFoldout, CombatEventsFoldout;
//Events
SerializedProperty OnDeathEventProp, OnTakeDamageEventProp, OnTakeCritDamageEventProp, OnReachedDestinationEventProp, OnReachedWaypointEventProp, OnGeneratedWaypointEventProp, OnStartEventProp, OnAttackStartEventProp, OnFleeEventProp, OnStartCombatEventProp, OnEndCombatEventProp,
OnEnabledEventProp, OnPlayerDetectedEventProp, OnKilledTargetEventProp, OnDoDamageEventProp, OnDoCritDamageEventProp, OnAttackEndEventProp, OnEnemyTargetDetectedEventProp;
void OnEnable()
{
if (EventsEditorIcon == null) EventsEditorIcon = Resources.Load("Editor Icons/EmeraldEvents") as Texture;
InitializeProperties();
}
void InitializeProperties()
{
//Bools
HideSettingsFoldout = serializedObject.FindProperty("HideSettingsFoldout");
GeneralEventsFoldout = serializedObject.FindProperty("GeneralEventsFoldout");
CombatEventsFoldout = serializedObject.FindProperty("CombatEventsFoldout");
//Events
OnDeathEventProp = serializedObject.FindProperty("OnDeathEvent");
OnTakeDamageEventProp = serializedObject.FindProperty("OnTakeDamageEvent");
OnTakeCritDamageEventProp = serializedObject.FindProperty("OnTakeCritDamageEvent");
OnDoDamageEventProp = serializedObject.FindProperty("OnDoDamageEvent");
OnReachedDestinationEventProp = serializedObject.FindProperty("OnReachedDestinationEvent");
OnReachedWaypointEventProp = serializedObject.FindProperty("OnReachedWaypointEvent");
OnGeneratedWaypointEventProp = serializedObject.FindProperty("OnGeneratedWaypointEvent");
OnStartEventProp = serializedObject.FindProperty("OnStartEvent");
OnPlayerDetectedEventProp = serializedObject.FindProperty("OnPlayerDetectedEvent");
OnEnemyTargetDetectedEventProp = serializedObject.FindProperty("OnEnemyTargetDetectedEvent");
OnEnabledEventProp = serializedObject.FindProperty("OnEnabledEvent");
OnAttackStartEventProp = serializedObject.FindProperty("OnAttackStartEvent");
OnAttackEndEventProp = serializedObject.FindProperty("OnAttackEndEvent");
OnFleeEventProp = serializedObject.FindProperty("OnFleeEvent");
OnStartCombatEventProp = serializedObject.FindProperty("OnStartCombatEvent");
OnEndCombatEventProp = serializedObject.FindProperty("OnEndCombatEvent");
OnKilledTargetEventProp = serializedObject.FindProperty("OnKilledTargetEvent");
OnDoCritDamageEventProp = serializedObject.FindProperty("OnDoCritDamageEvent");
}
public override void OnInspectorGUI()
{
FoldoutStyle = CustomEditorProperties.UpdateEditorStyles();
EmeraldEvents self = (EmeraldEvents)target;
serializedObject.Update();
CustomEditorProperties.BeginScriptHeaderNew("Events", EventsEditorIcon, new GUIContent(), HideSettingsFoldout);
if (!HideSettingsFoldout.boolValue)
{
EditorGUILayout.Space();
GeneralEvents(self);
EditorGUILayout.Space();
CombatEvents(self);
EditorGUILayout.Space();
}
CustomEditorProperties.EndScriptHeader();
serializedObject.ApplyModifiedProperties();
}
void GeneralEvents(EmeraldEvents self)
{
GeneralEventsFoldout.boolValue = EditorGUILayout.Foldout(GeneralEventsFoldout.boolValue, "General Events", true, FoldoutStyle);
if (GeneralEventsFoldout.boolValue)
{
CustomEditorProperties.BeginFoldoutWindowBox();
CustomEditorProperties.TextTitleWithDescription("General Events", "Holds all general related events.", true);
CustomEditorProperties.CustomHelpLabelField("Triggers an event when this AI is enabled. This can be useful for events that need to be called when an AI is being respawned.", false);
EditorGUILayout.PropertyField(OnEnabledEventProp);
CustomEditorProperties.CustomHelpLabelField("Triggers an event on Start. This can be useful for initializing custom mechanics and quests as well as spawning animations.", false);
EditorGUILayout.PropertyField(OnStartEventProp);
EditorGUILayout.Space();
CustomEditorProperties.CustomHelpLabelField("Triggers an event when this AI reaches their destination when using the Destination Wander Type.", false);
EditorGUILayout.PropertyField(OnReachedDestinationEventProp, new GUIContent("On Reached Destination Event"));
CustomEditorProperties.CustomHelpLabelField("Triggers an event each time this AI arrives at a waypoint (for both Dynamic and Waypoint Wander Types).", false);
EditorGUILayout.PropertyField(OnReachedWaypointEventProp, new GUIContent("On Reached Waypoint Event"));
CustomEditorProperties.CustomHelpLabelField("Triggers an event each time this AI generates a waypoint (for both Dynamic and Waypoint Wander Types).", false);
EditorGUILayout.PropertyField(OnGeneratedWaypointEventProp, new GUIContent("On Generated Waypoint Event"));
EditorGUILayout.Space();
CustomEditorProperties.CustomHelpLabelField("Triggers an event when this AI detects the player when not in combat mode. This can be useful for quests, initializing dialogue, or greetings. " +
"This event is dependent on the AI's Detection Radius and is triggered when the player enters it.", false);
EditorGUILayout.PropertyField(OnPlayerDetectedEventProp);
CustomEditorProperties.EndFoldoutWindowBox();
}
}
void CombatEvents(EmeraldEvents self)
{
CombatEventsFoldout.boolValue = EditorGUILayout.Foldout(CombatEventsFoldout.boolValue, "Combat Events", true, FoldoutStyle);
if (CombatEventsFoldout.boolValue)
{
CustomEditorProperties.BeginFoldoutWindowBox();
CustomEditorProperties.TextTitleWithDescription("Combat Events", "Holds all combat related events.", true);
CustomEditorProperties.CustomHelpLabelField("Triggers an event when the AI first starts combat and will not be called again until the AI re-enters combat.", false);
EditorGUILayout.PropertyField(OnStartCombatEventProp);
CustomEditorProperties.CustomHelpLabelField("Triggers an event when the AI ends combat and there are no detectable enemy targets nearby.", false);
EditorGUILayout.PropertyField(OnEndCombatEventProp);
EditorGUILayout.Space();
CustomEditorProperties.CustomHelpLabelField("Triggers an event each time the AI successfully detects a target when while in combat.", false);
EditorGUILayout.PropertyField(OnEnemyTargetDetectedEventProp, new GUIContent("On Detect Target Event"));
EditorGUILayout.Space();
CustomEditorProperties.CustomHelpLabelField("Triggers an event when the AI's attack starts. Note: This event will trigger even if the AI misses its target.", false);
EditorGUILayout.PropertyField(OnAttackStartEventProp, new GUIContent("On Attack Start Event"));
EditorGUILayout.Space();
CustomEditorProperties.CustomHelpLabelField("Triggers an event when the AI's attack ends. Note: This event will trigger even if the AI misses its target.", false);
EditorGUILayout.PropertyField(OnAttackEndEventProp);
EditorGUILayout.Space();
CustomEditorProperties.CustomHelpLabelField("Triggers an event when the AI is damaged.", false);
EditorGUILayout.PropertyField(OnTakeDamageEventProp, new GUIContent("On Take Damage Event"));
EditorGUILayout.Space();
CustomEditorProperties.CustomHelpLabelField("Triggers an event when the AI is damaged and takes a critical hit.", false);
EditorGUILayout.PropertyField(OnTakeCritDamageEventProp, new GUIContent("On Take Crit Damage Event"));
EditorGUILayout.Space();
CustomEditorProperties.CustomHelpLabelField("Triggers an event when the AI successfully deals any kind of damage.", false);
EditorGUILayout.PropertyField(OnDoDamageEventProp);
EditorGUILayout.Space();
CustomEditorProperties.CustomHelpLabelField("Triggers an event when the AI deals damage and it's a critical hit.", false);
EditorGUILayout.PropertyField(OnDoCritDamageEventProp);
EditorGUILayout.Space();
CustomEditorProperties.CustomHelpLabelField("Triggers an event when the AI flees. This can be useful for fleeing sounds or other added functionality.", false);
EditorGUILayout.PropertyField(OnFleeEventProp);
EditorGUILayout.Space();
CustomEditorProperties.CustomHelpLabelField("Triggers an event when the AI kills a target.", false);
EditorGUILayout.PropertyField(OnKilledTargetEventProp);
EditorGUILayout.Space();
CustomEditorProperties.CustomHelpLabelField("Triggers an event when the AI dies. This can be useful for triggering loot generation, quest mechanics, or other death related events.", false);
EditorGUILayout.PropertyField(OnDeathEventProp, new GUIContent("On Death Event"));
CustomEditorProperties.EndFoldoutWindowBox();
}
}
}
}