DIFF

HotSpringTrigger.c

//! Hot spring area trigger
class HotSpringTrigger : EffectTrigger
{	
	static HotSpringTrigger m_SourceDamageInstance; // this is used only server side for logging damage source in admin log
	static const float HEAT_DAMAGE_MULTIPLIER = 5;
	static const float HEAT_DAMAGE_TICK_TIME = 2;
	
	protected ParticleSource m_VaporParticle; 
		
	override void EEInit()
	{
		if (g_Game.IsServer() && !m_SourceDamageInstance)
			m_SourceDamageInstance = this;
		
		super.EEInit();
				
		#ifndef SERVER
		SpawnVaporEffect();
		#endif
	}
	
	override string GetDisplayName()
	{
		return "#STR_hotspring";
	}
	
	override void EEDelete( EntityAI parent )
	{
		if (m_VaporParticle)
			m_VaporParticle.Stop();
		
		super.EEDelete(parent);
	}
		
	override void OnEnterServerEvent( TriggerInsider insider )
	{
		super.OnEnterServerEvent(insider);
				
		if (insider)
		{
			PlayerBase playerInsider = PlayerBase.Cast(insider.GetObject());
			if (playerInsider)
				playerInsider.SetInEffectAreaTypeFlag(EEffectAreaType.HOT_SPRING);
		}
	}
	
	override void OnLeaveServerEvent( TriggerInsider insider )
	{
		super.OnLeaveServerEvent(insider);
				
		if (insider)
		{
			PlayerBase playerInsider = PlayerBase.Cast(insider.GetObject());
			if (playerInsider)
				playerInsider.UnsetInEffectAreaTypeFlag(EEffectAreaType.HOT_SPRING);
		}
	}
	
	override void OnEnterClientEvent( TriggerInsider insider )
	{
		super.OnEnterClientEvent(insider);
		
		if (insider)
		{
			PlayerBase playerInsider = PlayerBase.Cast(insider.GetObject());
			if (playerInsider)
				playerInsider.SetInEffectAreaTypeFlag(EEffectAreaType.HOT_SPRING);
		}
	}
	
	override void OnLeaveClientEvent( TriggerInsider insider )
	{
		super.OnLeaveClientEvent(insider);
		
		if (insider)
		{
			PlayerBase playerInsider = PlayerBase.Cast(insider.GetObject());
			if (playerInsider)
				playerInsider.UnsetInEffectAreaTypeFlag(EEffectAreaType.HOT_SPRING);
		}
	}
			
	protected void SpawnVaporEffect()
	{
		vector pos = GetPosition();
		pos[1] = g_Game.SurfaceRoadY(pos[0], pos[2], RoadSurfaceDetection.UNDER); 	// Snap to water volume surface or terrain

		m_VaporParticle = ParticleManager.GetInstance().PlayInWorld(ParticleList.HOTPSRING_WATERVAPOR, pos);
		
		int randSize = Math.RandomIntInclusive(-1,2);
		int randRate = Math.RandomIntInclusive(-1,2);

		m_VaporParticle.IncrementParticleParam(EmitorParam.SIZE, randSize);
		m_VaporParticle.IncrementParticleParam(EmitorParam.BIRTH_RATE, randRate);
	}
	
	static void ApplyEffects(PlayerBase player)
	{
		float waterLevel = player.GetCurrentWaterLevel();
		if (waterLevel > 0.5)
			player.ProcessDirectDamage(DamageType.CUSTOM, m_SourceDamageInstance, "", "HeatDamage", "0 0 0", HEAT_DAMAGE_MULTIPLIER * waterLevel);
	}
}