
class ZMissile : Actor
{
	override int SpecialMissileHit(Actor victim)
	{
		if(victim && (victim.species=="HeadshotTarget" || victim.species=="MetalShield"))
		{
			if(victim.master && self.target && victim.master==self.target) return 1;

			if(victim.master && victim.master.tracer && self.target && self.target.health>0 && victim.master.tracer==self.target) {
				let inv = self.target.FindInventory("MonsterPossessed");
				if (inv!=null && inv.Amount>0) {
					let t = ZBaseActor(self.target);
					if(t.possessor && t.possessor==victim.master) {
						return 1;
					}
				}
			}
		}

		if(self.damagetype=="MicrowaveBlastHit" && victim && victim is "DeadDukeNukem")
		{
			return 1;
		}

		return super.SpecialMissileHit(victim);
	}
}

class ZMissileP : ZMissile
{
	override void PostBeginPlay()
	{
		self.ChangeTid(4500);

		Super.PostBeginPlay();
	}
}

class ZMissileGibs : ZMissile
{
	bool plasmadeath;
	int pcount;
	bool pfloor;

	GlobalLevelHandler Event;

	override void PostBeginPlay()
	{
		int plimit = d3d_perfgorelimit;
		if(plimit>0) {
			Event = GlobalLevelHandler(EventHandler.Find("GlobalLevelHandler"));
			if(Event) Event.QueueListActor(Event.gibslist,self,plimit,16);
		}

		if (Color(self.fillcolor & 0xffffff)==Color("00 00 FF")) {
			pcount = 0;
			plasmadeath = true;
		}

		Super.PostBeginPlay();
	}

	override int SpecialMissileHit(Actor victim)
	{
		if(victim && victim is "DeadDukeNukem")
		{
			return 1;
		}

		if(victim && victim is "Inventory")
		{
			return 1;
		}

		return super.SpecialMissileHit(victim);
	}

	override void Tick()
	{
        	Super.Tick();

	       	if (plasmadeath) {
			if ((abs(pos.z - GetZAt()) <= 1) && (GetZAt() == floorz)) {
				if(pfloor==false) pcount = 0;
				pfloor=true;
				if (pcount<=5) {
					self.A_SpawnItemEx("PlasmaSparkSmall",frandom[RIDFX](-self.default.radius-1,self.default.radius-1),frandom[RIDFX](-self.default.radius-1,self.default.radius-1),frandom[RIDFX](1,self.default.height-1),0,0,0,0,32, 230);
				}
				else if (pcount<=10) {
					self.A_SpawnItemEx("PlasmaSparkSmall",frandom[RIDFX](-self.default.radius-1,self.default.radius-1),frandom[RIDFX](-self.default.radius-1,self.default.radius-1),frandom[RIDFX](1,self.default.height-1),0,0,0,0,32, 250);
				}
				else if (pcount<=15) {
					self.A_SpawnItemEx("PlasmaSparkSmall",frandom[RIDFX](-self.default.radius-1,self.default.radius-1),frandom[RIDFX](-self.default.radius-1,self.default.radius-1),frandom[RIDFX](1,self.default.height-1),0,0,0,0,32, 255);
				}
				else if (pcount<=20) {
					self.A_SpawnItemEx("PlasmaSparkSmall",frandom[RIDFX](-self.default.radius-1,self.default.radius-1),frandom[RIDFX](-self.default.radius-1,self.default.radius-1),frandom[RIDFX](1,self.default.height-1),0,0,0,0,32, 220);
				}
				else {
					plasmadeath = false;
					pcount = 0;
				}
			}
			else {
				pfloor = false;
				if (pcount<=80) {
					self.A_SpawnItemEx("PlasmaSparkSmall",frandom[RIDFX](-self.default.radius-1,self.default.radius-1),frandom[RIDFX](-self.default.radius-1,self.default.radius-1),frandom[RIDFX](1,self.default.height-1),0,0,0,0,32, 255);
				}
				else {
					plasmadeath = false;
					pcount = 0;
				}
			}
			pcount++;
		} else {
			plasmadeath = false;
			pcount = 0;
		}
	}
}

class ZMissileMetal : Actor
{
	GlobalLevelHandler Event;

	override void PostBeginPlay()
	{
		int plimit = d3d_perfmetallimit;
		if(plimit>0) {
			Event = GlobalLevelHandler(EventHandler.Find("GlobalLevelHandler"));
			if(Event) {
				if(self.GetClass() is "DukeMetalPart")
					Event.QueueListActor(Event.metallist,self,plimit,16);
				else
					Event.QueueListActor(Event.metallist,self,plimit);
			}
		}

		Super.PostBeginPlay();
	}

	override int SpecialMissileHit(Actor victim)
	{
		if(victim && victim is "DeadDukeNukem")
		{
			return 1;
		}

		if(victim && victim is "Inventory")
		{
			return 1;
		}

		return super.SpecialMissileHit(victim);
	}
}

class ZMissileMorph : MorphProjectile
{
	override int SpecialMissileHit(Actor victim)
	{
		if(victim && (victim.species=="HeadshotTarget" || victim.species=="MetalShield"))
		{
			if(victim.master && self.target && victim.master==self.target) return 1;

			if(victim.master && victim.master.tracer && self.target && self.target.health>0 && victim.master.tracer==self.target) {
				let inv = self.target.FindInventory("MonsterPossessed");
				if (inv!=null && inv.Amount>0) {
					let t = ZBaseActor(self.target);
					if(t.possessor && t.possessor==victim.master) {
						return 1;
					}
				}
			}
		}
		return super.SpecialMissileHit(victim);
	}
}

class ZMissileFast : FastProjectile
{
	override int SpecialMissileHit(Actor victim)
	{
		if(victim && (victim.species=="HeadshotTarget" || victim.species=="MetalShield"))
		{
			if(victim.master && self.target && victim.master==self.target) return 1;

			if(victim.master && victim.master.tracer && self.target && self.target.health>0 && victim.master.tracer==self.target) {
				let inv = self.target.FindInventory("MonsterPossessed");
				if (inv!=null && inv.Amount>0) {
					let t = ZBaseActor(self.target);
					if(t.possessor && t.possessor==victim.master) {
						return 1;
					}
				}
			}
		}
		return super.SpecialMissileHit(victim);
	}
}

class ZMissileLightning : SpectralLightningH3
{
	override int SpecialMissileHit(Actor victim)
	{
		if(victim && (victim.species=="HeadshotTarget" || victim.species=="MetalShield"))
		{
			if(victim.master && self.target && victim.master==self.target) return 1;

			if(victim.master && victim.master.tracer && self.target && self.target.health>0 && victim.master.tracer==self.target) {
				let inv = self.target.FindInventory("MonsterPossessed");
				if (inv!=null && inv.Amount>0) {
					let t = ZBaseActor(self.target);
					if(t.possessor && t.possessor==victim.master) {
						return 1;
					}
				}
			}
		}
		return super.SpecialMissileHit(victim);
	}
}

class ZMissileLightningBall : SpectralLightningBigBall2
{
	override int SpecialMissileHit(Actor victim)
	{
		if(victim && (victim.species=="HeadshotTarget" || victim.species=="MetalShield"))
		{
			if(victim.master && self.target && victim.master==self.target) return 1;

			if(victim.master && victim.master.tracer && self.target && self.target.health>0 && victim.master.tracer==self.target) {
				let inv = self.target.FindInventory("MonsterPossessed");
				if (inv!=null && inv.Amount>0) {
					let t = ZBaseActor(self.target);
					if(t.possessor && t.possessor==victim.master) {
						return 1;
					}
				}
			}
		}
		return super.SpecialMissileHit(victim);
	}
}