freeslot("SPR_SJET", "MT_SAMJETSTREAM", "MT_SAMJETSTREAM_TELEPORT",
	"S_SAMJETSTREAM_SPAWN",
	"S_SAMJETSTREAM_ATTACK", "S_SAMJETSTREAM_ATTACK1", "S_SAMJETSTREAM_ATTACK2", "S_SAMJETSTREAM_ATTACK3", "S_SAMJETSTREAM_ATTACK4", "S_SAMJETSTREAM_ATTACK5", "S_SAMJETSTREAM_ATTACK6", "S_SAMJETSTREAM_ATTACK7", "S_SAMJETSTREAM_ATTACK8", "S_SAMJETSTREAM_ATTACK9", "S_SAMJETSTREAM_ATTACK10", "S_SAMJETSTREAM_ATTACK11",
	"SFX_JETSA1", "SFX_JETSA2", "SFX_JETSA3", "SFX_JBASED")

local tp_points = {}

local function tp_sam(mo, target)
	local a = true
	local b = 35
	local i = nil
	if not tp_points[1] then return end
	if target
		while a do
			i = P_RandomRange(1, #tp_points)
			if tp_points[i] and tp_points[i].valid
				b = $ - 1
				if b < 0
					a = false
					b = 35
				end
				local target_distance = R_PointToDist2(tp_points[i].x, tp_points[i].y, target.x, target.y)
				if target_distance <= 3072*FRACUNIT and target_distance >= 768*FRACUNIT
					P_TeleportMove(mo, tp_points[i].x, tp_points[i].y, tp_points[i].z)
					mo.tpcd = 10*TICRATE
					a = false
				end
			end
		end
	end
end

addHook("MapLoad", function()
	for m in mobjs.iterate() do
		if m.type == MT_SAMJETSTREAM_TELEPORT
			table.insert(tp_points, m)
		end
	end
end)

local jetstreamvictim = {}

local function JetStreamVictims(var)
	jetstreamvictim = {}
	local yayliveplayer = #players-1
		for i = 0, yayliveplayer do
			if players[i]
			and players[i].valid
				if not players[i].spectator
				and players[i].mo
				and players[i].mo.valid
				and players[i].nblive
				table.insert(jetstreamvictim, players[i].mo)
			end
		end
	end
end

addHook("ThinkFrame", function(mo)
	JetStreamVictims()
end)

addHook("PlayerThink", function(player)
	if player.mo
	and player.mo.valid
		if player.playerstate == PST_LIVE
			if player.mo.nbpst != 1
				player.mo.nbpst = 1
				player.nblive = true
				player.nbdead = nil
			end
		else
			if player.mo.nbpst != 0
				player.mo.nbpst = 0
				player.nblive = nil
				player.nbdead = true
			end
		end
	end
end)

addHook("MobjThinker", function(mo)
	local jsstrust = 32*FRACUNIT
	if not mo.jetat
		mo.jetat = 0
	end
	if mo.tpcd == nil
		mo.tpcd = 25*TICRATE
	end
	if mo
	and mo.valid
	and mo.health
		mo.shadowscale = 0
		mo.scale = FRACUNIT/2
		if mo.delayattack == nil
			mo.delayattack = 0
		end
		if not S_IdPlaying(sfx_jbased)
			S_StartSound(mo, sfx_jbased)
		end
		if (mo.state == S_SAMJETSTREAM_SPAWN)
			if mo.target == nil
				if mo.delayattack != 0
					mo.delayattack = $ - 1
				else
					local prandom = P_RandomRange(1, #jetstreamvictim)
					if jetstreamvictim[prandom]
					and jetstreamvictim[prandom].valid
						mo.target = jetstreamvictim[prandom].player.mo
						if not S_IdPlaying(sfx_jetsa3)
							S_StartSound(nil, sfx_jetsa3, target)
						end
						mo.state = S_SAMJETSTREAM_ATTACK
					end
				end
			end
		end
		if (mo.state != S_SAMJETSTREAM_SPAWN)
			if (mo.state == S_SAMJETSTREAM_ATTACK10)
				if mo.jetat < 20
					mo.jetat = mo.jetat + 1
					mo.state = S_SAMJETSTREAM_ATTACK
				else
					//mo.state = S_SAMJETSTREAM_ATTACK11
					P_SetObjectMomZ(mo, 8*FRACUNIT)
					mo.jetat = 0
				end
			end
			if (mo.state == S_SAMJETSTREAM_ATTACK11)
				jsstrust = P_RandomRange(26,30)*FRACUNIT
				P_InstaThrust(mo, R_PointToAngle2(mo.x, mo.y, mo.target.x, mo.target.y), jsstrust)
			end
			//P_SpawnGhostMobj(mo)
			if mo.target == nil or mo.target.nbpst == 0
				S_StartSound(mo, sfx_jetsa2)
				S_StartSound(mo, sfx_jetsa1)
				mo.delayattack = 60
				mo.momx = 0
				mo.momy = 0
				mo.momz = 0
				mo.target = nil
				mo.state = S_SAMJETSTREAM_SPAWN
			end
			if mo.target
				local target_distance = R_PointToDist2(mo.x, mo.y, mo.target.x, mo.target.y)
				if target_distance >= 2048*FRACUNIT
					mo.tpcd = $ - 1
					if mo.tpcd < 0
						tp_sam(mo, mo.target)
					end
				elseif target_distance <= 2048*FRACUNIT
					mo.tpcd = 10*TICRATE
				elseif target_distance >= 4096*FRACUNIT
					tp_sam(mo, mo.target)
				end
				for player in players.iterate do
					local sam_distance_xy = R_PointToDist2(mo.x, mo.y, player.mo.x, player.mo.y) 
					local sam_distance_z = P_AproxDistance(0, player.mo.z-mo.z)
					if sam_distance_xy <= 1280*FRACUNIT
					and sam_distance_z <= 1280*FRACUNIT
						mo.target = player.mo
					end
				end
			end
		end
	end
end, MT_SAMJETSTREAM)