//(2) Health -32768..32767 (ActorID To Spawn)
//(7) Params 1 -128..127 (Min Spawn Time in seconds)
//(6) Params 2 -128..127 (Max Spawn Time in seconds)
//(3) Max Regenerations -32768..32767 (Flags bit 1 = spawn on start)

// Health_Small 400
// Health_Medium 401
// Health_Large 402
// Health_Full 403
// Health_Ultra 404
// Health_MortalWound 405

array<BP_SpawnerMP@> spawnersMP;

enum BPSpawnerMPFlags
{
	SMPF_STARTSPAWN = (1 << 0)
}

class BP_SpawnerMP : ScriptObject
{
    kActor @self;
    float respawnTime;
	float respawnTargetTime;
	int flags;
    
	//------------------------------------------------------------------------------------------------------------------------
    BP_SpawnerMP(kActor @actor)
    {
        @self = actor;
		flags = 0;
        respawnTime = 0.0f;
		respawnTargetTime = 60.0f;
        self.Flags() |= AF_ALWAYSACTIVE;
		spawnersMP.insertLast(@this);
    }
	//------------------------------------------------------------------------------------------------------------------------
    void OnBeginLevel()
    {
		flags = self.SpawnParams(3);
		SetRespawnTargetTime();
		if ((flags & SMPF_STARTSPAWN) != 0)
		{
			respawnTime = respawnTargetTime;
		}
	}
	//------------------------------------------------------------------------------------------------------------------------
	void SetRespawnTargetTime()
	{
		respawnTargetTime = Math::RandRange(float(self.SpawnParams(7)), float(self.SpawnParams(6)));
	}
	//------------------------------------------------------------------------------------------------------------------------
	int GetItemType()
	{
		return self.Health();
	}
	//------------------------------------------------------------------------------------------------------------------------
	// Returns true if spawn item type is health and item has been spawned
	//------------------------------------------------------------------------------------------------------------------------
	bool HasHealth()
	{
		switch (GetItemType())
		{
			case 400: //Health_Small
			case 401: //Health_Medium
			case 402: //Health_Large
			case 403: //Health_Full
			case 404: //Health_Ultra
			case 405: //Health_MortalWound
				return ActorExists(self.GetTarget());
		}
		
		return false;
	}
	//------------------------------------------------------------------------------------------------------------------------
    void OnTick(void)
    {
        if (self.GetTarget() !is null)
        {
            if (!self.GetTarget().IsStale())
            {
                self.GetTarget().SpawnFx("fx/generic_230.kfx", kVec3(0, 0, GAME_SCALE));
                return;
            }
            
            self.SetTarget(null);
            respawnTime = 0.0f;
            return;
        }
        
        respawnTime += GAME_DELTA_TIME;
        
        if (respawnTime >= respawnTargetTime)
        {
            respawnTime = 0.0f;
			SetRespawnTargetTime();
			
			//Spawn Item
			//z = self.FloorHeight();
			kActor @item = ActorFactory.Spawn(GetItemType(), self.Origin().x, self.Origin().y, self.Origin().z, 0, self.SectorIndex());
			if (@item != null)
			{
				item.Scale() = kVec3(0.35f, 0.35f, 0.35f);
				self.SetTarget(item);
				
				if (item.ScriptObject() !is null && item.ScriptObject().obj !is null)
				{
					BP_PickupHealth@ healthPickup = cast<BP_PickupHealth@>(item.ScriptObject().obj);
					if (@healthPickup != null)
					{
						healthPickup.SetSpawnedMP();
					}
				}
			}
			
			//don't do spawn effects/sound if spawn at start
			if (self.GameTicks() != 0)
			{
				kVec3 org = self.Origin();
				//org.z = self.FloorHeight() + (3*GAME_SCALE);
				self.PlaySound("sounds/shaders/generic_3_energy_pickup.ksnd");
				Game.SpawnFx("fx/generic_260.kfx", org, self.SectorIndex());
			}
        }
    }
	//------------------------------------------------------------------------------------------------------------------------
    void OnSpawn() {}
	//------------------------------------------------------------------------------------------------------------------------
};
