/// ---------------------------------------------
// ...
// after the existing private globals, add vars for the string & sprite
private string m_String;
private Sprite m_Sprite;
// unregister/register the new event handler
/// <summary>
/// Attaches the monitor to the specified character.
/// </summary>
/// <param name="character">The character to attach the monitor to.</param>
protected override void OnAttachCharacter(GameObject character)
{
if (m_Character != null)
{
EventHandler.UnregisterEvent<Ability, bool>(m_Character, "OnAbilityMessageCanStart", OnAbilityCanStart);
EventHandler.UnregisterEvent<ObjectPickup>(m_Character, "OnObjectPickedUp", OnObjectPickedUp);
EventHandler.UnregisterEvent<string, Sprite>(m_Character, "OnDisplayMessage", OnDisplayMessage);
}
base.OnAttachCharacter(character);
if (m_Character == null)
{
return;
}
EventHandler.RegisterEvent<Ability, bool>(m_Character, "OnAbilityMessageCanStart", OnAbilityCanStart);
EventHandler.RegisterEvent<ObjectPickup>(m_Character, "OnObjectPickedUp", OnObjectPickedUp);
EventHandler.RegisterEvent<string, Sprite>(m_Character, "OnDisplayMessage", OnDisplayMessage);
}
// the new arbitrary message handler
/// <summary>
/// Display an arbitrary message.
/// </summary>
/// <param name="displayString">String to display</param>
/// <param name="sprite">Icon to display</param>
private void OnDisplayMessage(string displayString, Sprite sprite)
{
m_String = displayString;
m_Sprite = sprite;
m_ShouldFade = true;
m_ObjectAlphaColor = 1;
if (m_ShouldFade)
{
Scheduler.Cancel(m_ScheduledFade);
}
UpdateMessage();
}
// original handlers go here; omitted for clarity
// modified UpdateMessage function
/// <summary>
/// Updates the text and icon UI.
/// </summary>
private void UpdateMessage()
{
if (m_Text != null)
{
if (m_String != null) // use the arbitrary string if it exists
{
m_Text.text = m_String;
}
else // use the original logic (abilities have priority)
{
m_Text.text = m_Ability != null ? m_Ability.AbilityMessageText : (m_ObjectPickup != null ? m_ObjectPickup.PickupMessageText : string.Empty);
}
m_Text.enabled = !string.IsNullOrEmpty(m_Text.text);
}
if (m_Icon != null)
{
if (m_Sprite != null) // use the abitrary icon if it exists
{
m_Icon.sprite = m_Sprite;
}
else
{
m_Icon.sprite = m_Ability != null ? m_Ability.AbilityMessageIcon : (m_ObjectPickup != null ? m_ObjectPickup.PickupMessageIcon : null);
}
m_Icon.enabled = m_Icon.sprite != null;
}
// The message will fade if an object is picked up.
var messageVisible = m_Ability != null || m_ObjectPickup != null || m_String != null || m_Sprite != null; // check for arbitrary items as well
if (messageVisible)
{
if (m_Text != null)
{
var color = m_Text.color;
color.a = 1;
m_Text.color = color;
}
if (m_Icon != null)
{
var color = m_Icon.color;
color.a = 1;
m_Icon.color = color;
}
if (m_ShouldFade)
{
m_ScheduledFade = Scheduler.Schedule(m_ObjectVisiblityDuration, FadeMessage);
}
m_String = null; // reset the abitrary string & sprite
m_Sprite = null;
}
m_GameObject.SetActive(m_ShowUI && (messageVisible || m_ShouldFade));
}
// ... rest of code
}