DIFF

AreaDamageTrigger.c

// DEPRECATED: Left for backwards compatibility with mods
// This file is NOT AN EXAMPLE of how to use triggers
// As overriding UpdateInsiders should ideally no longer be done
// Look at "AreaDamageTriggerBase.c" instead and use that as base
class AreaDamageTrigger extends AreaDamageTriggerBase
{
	protected ref AreaDamageBase	m_AreaDamageType;
	
	protected vector				m_ExtentMin;
	protected vector				m_ExtentMax;	
	protected float					m_InnerDistance;
	
	protected int					m_TriggerUpdateMs;
	
	void AreaDamageTrigger()
	{
		// Backwards compat, revert the flags back to what they used to be
		ClearEventMask(EntityEvent.ENTER | EntityEvent.LEAVE);
		SetEventMask(EntityEvent.TOUCH);
		
		m_AreaDamageType = null;
		
		m_ExtentMin = vector.Zero;
		m_ExtentMax = vector.Zero;	
		m_InnerDistance = 0;
		
		m_TriggerUpdateMs = 100;
	}
	
	// Backwards compat
	override void EOnTouch(IEntity other, int extra)
	{
		Object obj;
		if (Class.CastTo(obj, other))
			AddInsider(obj);
	}
	
	override void SetExtents( vector mins, vector maxs )
	{
		m_ExtentMax = maxs;
		m_ExtentMin = mins;
		
		m_InnerDistance = (GetRadius(m_ExtentMin, m_ExtentMax) * 0.5) + 0.2;

		super.SetExtents(mins, maxs);
	}
	
	override void SetAreaDamageManager( AreaDamageManager adType )
	{
		super.SetAreaDamageManager( adType );
		
		m_AreaDamageType = AreaDamageBase.Cast(adType);
	}
		
	void SetAreaDamageType( AreaDamageBase adType )
	{
		super.SetAreaDamageManager( adType );
		
		m_AreaDamageType = adType;
	}
	
	override void OnEnter( Object obj )
	{
		super.OnEnter( obj );
		
		if ( g_Game.IsServer() && m_AreaDamageType )
			 m_AreaDamageType.OnEnter( obj );
	}
	
	override void OnLeave( Object obj )
	{
		super.OnLeave( obj );
		
		if ( g_Game.IsServer() && m_AreaDamageType )
			 m_AreaDamageType.OnLeave( obj );
	}
	
	override protected void UpdateInsiders(int timeout)
	{
		if ( g_Game.IsServer() )
		{
			for (int n = 0; n < m_insiders.Count(); )
			{
				TriggerInsider ins = m_insiders.Get(n);
				if ( ins.GetObject() == null )
				{
					//object has been deleted. Remove it
					m_insiders.Remove(n);
					continue;
				}
	
				Object insObj = ins.GetObject();
				if ( insObj && ( !insObj.IsAlive() || vector.DistanceSq(insObj.GetPosition(), GetPosition()) > (m_InnerDistance * m_InnerDistance) ) )
				{
					int timeDiff = g_Game.GetTime() - ins.timeStamp;
					if (timeDiff > 500)
					{
						//object left. Remove it
						OnLeave(ins.GetObject());
						m_insiders.Remove(n);
						
						continue;
					}
					else
					{
						//Print("" + this + " :: " + insObj + " :: " + timeDiff);
					}
				}
				
				++n;
			}
			
			//!DEBUG
			#ifdef DEVELOPER
			DebugSendDmgTrigger();
			#endif
		}
	}
}