namespace BP
{
	namespace Events
	{
		funcdef void DamageInfoCallback(kDamageInfo& in dmgInfo);
		
		class DamageInfo
		{
			array<DamageInfoCallback@> callbacks;
			//------------------------------------------------------------------------------------------------------------------------
			DamageInfo() {}
			//------------------------------------------------------------------------------------------------------------------------
			DamageInfo@ opAssign(DamageInfo &in other)
			{
				callbacks.resize(0);
				int length = int(other.callbacks.length());
				for (int i = 0; i < length; i++)
				{
					callbacks.insertLast(@other.callbacks[i]);
				}
				return this;
			}
			//------------------------------------------------------------------------------------------------------------------------
			void Add(DamageInfoCallback@ callback)
			{
				callbacks.insertLast(@callback);
			}
			//------------------------------------------------------------------------------------------------------------------------
			void Remove(DamageInfoCallback@ callback)
			{
				int index = callbacks.findByRef(@callback);
				if (index >= 0)
				{
					callbacks.removeAt(index);
				}
			}
			//------------------------------------------------------------------------------------------------------------------------
			void Invoke(kDamageInfo& in dmgInfo)
			{
				int length = int(callbacks.length());
				for (int i = length - 1; i >= 0; i--)
				{
					if (callbacks[i] !is null)
					{
						callbacks[i](dmgInfo);
					}
				}
			}
			//------------------------------------------------------------------------------------------------------------------------
			void Clear()
			{
				callbacks.resize(0);
			}
			//------------------------------------------------------------------------------------------------------------------------
		};
	}
}
