Messaging System: Difference between revisions

From Ardenfall Wiki
Jump to navigation Jump to search
Created page with "One of the most useful ways to hook into the game is by use of the MessagingSystem. Ardenfall has a host of messages that are sent when stuff happens. "CharacterDeathMessage", "CharacterKillMessage", "EffectAddMessage"... there are over 100 messages that you can subscribe (or send). You can also define your own messages, for yourself or other mods. TODO: Examples TODO: Common Messages TODO: Add tool to easily view messages"
 
No edit summary
 
(2 intermediate revisions by the same user not shown)
Line 2: Line 2:


Ardenfall has a host of messages that are sent when stuff happens. "CharacterDeathMessage", "CharacterKillMessage", "EffectAddMessage"... there are over 100 messages that you can subscribe (or send).
Ardenfall has a host of messages that are sent when stuff happens. "CharacterDeathMessage", "CharacterKillMessage", "EffectAddMessage"... there are over 100 messages that you can subscribe (or send).


You can also define your own messages, for yourself or other mods.
You can also define your own messages, for yourself or other mods.


TODO: Examples


TODO: Common Messages
Example of a mod that begins listening to <u>CharacterDeathMessage</u> on initialize, and stops listening on uninitialize.
 
'''Important:''' Be sure to clean up your listeners!<syntaxhighlight lang="c#">
using Ardenfall;
using UnityEngine;
using System;
 
namespace ExampleMod
{
public class ExampleMod : ModRoot
{
public override void Initialize(string id)
{
base.Initialize(id);
 
//Begin listening to death messages
MessagingSystem.AddListener(typeof(CharacterDeathMessage), (Action<CharacterBase, DamageContext>)OnDeath);
}
       
public override void Uninitialize()
{
base.Uninitialize();
 
//Stoplistening to death messages
MessagingSystem.RemoveListener(typeof(CharacterDeathMessage), (Action<CharacterBase, DamageContext>)OnDeath);
}
 
//Triggered when any character dies
private void OnDeath(CharacterBase character, DamageContext context)
{
if(character is PlayerCharacter)
Debug.Log($"Player has died!");
else
Debug.Log($"Character {character.GetVisualName()} has died!");
}
}
}
</syntaxhighlight>
 
=== Useful Messages ===
<u>CharacterDeathMessage(CharacterBase target, DamageContext context)</u>
 
Triggered when a character dies.
 
<u>CharacterDamageMessage(CharacterBase target, DamageContext context)</u>
 
Triggered when character is damaged.
 
<u>CharacterKillMessage(CharacterBase killer, DamageContext context)</u>
 
Triggered when a character kills another. You can access context.victim to read who died.
 
<u>EffectAddMessage(StatusEffectInstance effect)</u>
 
Triggered whenever an Effect is added to an IEffectable. Can access effect.Target to read who the target is.
 
<u>EffectRemoveMessage(StatusEffectInstance effect)</u>
 
Triggered whenever an Effect is removed from an IEffectable. Can access effect.Target to read who the target is.
 
<u>InventoryChangeMessage(Inventory inventory, ItemData item, int count, bool isAdded)</u>
 
Triggered whenever an item stack in an Inventory is modified (items added or removed). Can access inventory.OwnerChar (can be null) to see what character owns it, if any. Inventories are also used with containers.
 
<u>EquipChangeMessage(CharacterBase character, BaseItem item, bool isEquipped)</u>
 
Triggered whenever a character unequips or equips an item
 
=== Tooling ===
Planned: Add tool to easily view all messages available


TODO: Add tool to easily view messages
Under Consideration: Add tool to detect + display messages being triggered

Latest revision as of 21:58, 21 May 2026

One of the most useful ways to hook into the game is by use of the MessagingSystem.

Ardenfall has a host of messages that are sent when stuff happens. "CharacterDeathMessage", "CharacterKillMessage", "EffectAddMessage"... there are over 100 messages that you can subscribe (or send).


You can also define your own messages, for yourself or other mods.


Example of a mod that begins listening to CharacterDeathMessage on initialize, and stops listening on uninitialize.

Important: Be sure to clean up your listeners!

using Ardenfall;
using UnityEngine;
using System;

namespace ExampleMod 
{	
	public class ExampleMod : ModRoot
	{
		public override void Initialize(string id)
		{
			base.Initialize(id);

			//Begin listening to death messages
			MessagingSystem.AddListener(typeof(CharacterDeathMessage), (Action<CharacterBase, DamageContext>)OnDeath);
		}
        
		public override void Uninitialize()
		{
			base.Uninitialize();

			//Stoplistening to death messages
			MessagingSystem.RemoveListener(typeof(CharacterDeathMessage), (Action<CharacterBase, DamageContext>)OnDeath);
		}

		//Triggered when any character dies
		private void OnDeath(CharacterBase character, DamageContext context) 
		{
			if(character is PlayerCharacter)
				Debug.Log($"Player has died!"); 
			else
				Debug.Log($"Character {character.GetVisualName()} has died!"); 
		}
	}
}

Useful Messages

CharacterDeathMessage(CharacterBase target, DamageContext context)

Triggered when a character dies.

CharacterDamageMessage(CharacterBase target, DamageContext context)

Triggered when character is damaged.

CharacterKillMessage(CharacterBase killer, DamageContext context)

Triggered when a character kills another. You can access context.victim to read who died.

EffectAddMessage(StatusEffectInstance effect)

Triggered whenever an Effect is added to an IEffectable. Can access effect.Target to read who the target is.

EffectRemoveMessage(StatusEffectInstance effect)

Triggered whenever an Effect is removed from an IEffectable. Can access effect.Target to read who the target is.

InventoryChangeMessage(Inventory inventory, ItemData item, int count, bool isAdded)

Triggered whenever an item stack in an Inventory is modified (items added or removed). Can access inventory.OwnerChar (can be null) to see what character owns it, if any. Inventories are also used with containers.

EquipChangeMessage(CharacterBase character, BaseItem item, bool isEquipped)

Triggered whenever a character unequips or equips an item

Tooling

Planned: Add tool to easily view all messages available

Under Consideration: Add tool to detect + display messages being triggered