class AnniversaryFireworksLauncherClientEvent: FireworksLauncherClientEvent
{
	override protected int GetExplParticleFromSequence()
	{
		switch (m_Color)
		{
			case "1":
				return ParticleList.FIREWORKS_EXPLOSION_THANKS1;
			case "2":
				return ParticleList.FIREWORKS_EXPLOSION_THANKS2;
			case "3":
				return ParticleList.FIREWORKS_EXPLOSION_THANKS3;
			case "4":
				return ParticleList.FIREWORKS_EXPLOSION_THANKS4;
			case "5":
				return ParticleList.FIREWORKS_EXPLOSION_THANKS5;
			default:
				ErrorEx("Incorrect explosion particle color in the sequence");
		}
		return ParticleList.FIREWORKS_EXPLOSION_RED;
	}
	
	override protected void SetupLight(PointLightBase light)
	{
		switch (m_Color)
		{
			case "1":
				light.SetDiffuseColor(255,51,51);
				light.SetAmbientColor(255,51,51);
				
				break;
			case "2":
				light.SetDiffuseColor(0,255,128);
				light.SetAmbientColor(0,255,128);
				break;
			case "3":
				light.SetDiffuseColor(51,153,255);
				light.SetAmbientColor(51,153,255);
				break;
			case "4":
				light.SetDiffuseColor(255,255,51);
				light.SetAmbientColor(255,255,51);
				break;
			case "5":
				light.SetDiffuseColor(255,102,255);
				light.SetAmbientColor(255,102,255);
				break;
			default:
				ErrorEx("Incorrect explosion particle color in the sequence");
		}
	}
	
	override protected void SpawnSecondaryExplosion()
	{
		AnniversaryFireworksLauncherClientEventSecondary evnt = new AnniversaryFireworksLauncherClientEventSecondary(m_Item,m_Index);
		evnt.Init(GetExplosionPosition());
		evnt.OnExplode();
		m_Events.Insert(evnt);
		RequestSecondaryExplosion();
	}
}
//--------------------------------------------------------------------------------------
class AnniversaryFireworksLauncherClientEventSecondary : AnniversaryFireworksLauncherClientEvent
{
	protected vector m_ShotPos;
	
	override protected vector GetExplosionPosition()
	{
		return GetShotPos() + m_ShotDir * GetExplosionDistance();
	}
	
	void Init(vector pos)
	{
		m_ShotPos = pos;
		m_ShotDir[0] = Math.RandomFloatInclusive(-1,1);
		m_ShotDir[1] = Math.RandomFloatInclusive(-1,1);
		m_ShotDir[2] = Math.RandomFloatInclusive(-1,1);
		m_ShotDir.Normalize();
	}
	override protected vector GetShotPos()
	{
		return m_ShotPos;
	}
	
	override protected float GetExplosionDistance()
	{
		return Math.RandomFloatInclusive(10,15);
	}
	
	override void OnExplode()
	{
		GetGame().GetCallQueue( CALL_CATEGORY_SYSTEM ).CallLater( PlayExplosionSound, GetSoundDelay(), false);
		GetGame().GetCallQueue( CALL_CATEGORY_SYSTEM ).CallLater( SpawnLight, GetLightDelay(), false);
		m_ParticleExplosion = ParticleManager.GetInstance().PlayInWorld(GetExplParticleFromSequence(), GetExplosionPosition());
	}
}
//--------------------------------------------------------------------------------------
class Anniversary_FireworksLauncher: FireworksLauncher
{
	int sequence = 0;
	
	override protected void SetupColorSequences()
	{
		m_ColorSequence.Insert("1234512345123451234512345");
	}
	
	override protected FireworksLauncherClientEventBase SpawnEvent()
	{
		FireworksLauncherClientEventBase evnt = new AnniversaryFireworksLauncherClientEvent(this,m_Index);
		evnt.OnFired();
		return evnt;
	}
	
	override bool IsTakeable()
	{
		return false;
	}
	
	override bool CanSwapEntities(EntityAI otherItem, InventoryLocation otherDestination, InventoryLocation destination)
	{
		return false;
	}
	
	override bool DisableVicinityIcon()
	{
		return true;
	}
	
	override protected int GetMaxShots()
	{
		return 25;
	}
	
	override protected float GetFuseDelay()
	{
		return 1;
	}
	
		//!Called periodically but only after the entity gets ignited
	override protected void OnEventServer(int type)
	{
		m_Index++;
		DamageSystem.ExplosionDamage(this, NULL, GetAmmoType(), GetPosition(), GetDamageType());
		
		if(m_Index > 16)
		{
			sequence++;
			m_Index = 1;
		}
		
		SetSynchDirty();
		if (m_Index + (sequence*16)> GetMaxShots())
		{
			m_Index = GetMaxShots();
			m_TimerEvent = null;
			SetState(EFireworksState.FINISHED);
		}
		else
		{
			RestartEventTimer();
		}
	}
	
}