freeslot(
	"MT_SMOKEGLIDERSPAWN",
	"S_SMOKEGLIDERSPAWN",
	
	"MT_SMOKEGLIDER",
	--"S_SMOKEGLIDER_INIT",
	"S_SMOKEGLIDER_GLIDE",
	
	"SPR_SMKG")

mobjinfo[MT_SMOKEGLIDERSPAWN] = {
//#$Category Radiant Caverns
//#$Name Smoke Glider
//#$Sprite SMKGA0
	doomednum = 1695,
	spawnstate = S_SMOKEGLIDERSPAWN,
	radius = 24*FRACUNIT,
	height = 24*FRACUNIT,
	flags = MF_NOGRAVITY|MF_SPECIAL
}

states[S_SMOKEGLIDERSPAWN] = {SPR_SMKG,0}

addHook("TouchSpecial", function(special, toucher)
	if not toucher.player then return true end
	if toucher.player.powers[pw_carry] then return true end
	
	local glider = P_SpawnMobj(special.x, special.y, special.z, MT_SMOKEGLIDER)
	glider.angle = special.angle
	glider.target = toucher
	glider.tracer = toucher
	toucher.tracer = glider
	toucher.player.powers[pw_carry] = CR_GENERIC
	toucher.angle = special.angle
	glider.momx = toucher.momx
	glider.momy = toucher.momy
	glider.momz = toucher.momz
	toucher.player.pflags = $1&~PF_JUMPED
	
	return true
end, MT_SMOKEGLIDERSPAWN)

mobjinfo[MT_SMOKEGLIDER] = {
	spawnhealth = 1,
	spawnstate = S_SMOKEGLIDER_GLIDE,
	radius = 24*FRACUNIT,
	height = 24*FRACUNIT,
	flags = MF_RUNSPAWNFUNC|MF_SPECIAL|MF_MISSILE|MF_BOUNCE|MF_SLIDEME
}

-- A_SmokeGlider, var1 = maximum falling speed
function A_SmokeGlider(mo, var1)
	--print("test")
	mo.momz = $1+(mo.scale*P_MobjFlip(mo)/4)
	if mo.momz < -var1 then
		mo.momz = $1+(mo.scale*P_MobjFlip(mo))
	end
	
	-- Find a wind sector tagged with 8000, and blow up if found (currently does not support wind in FOFs)
	if (mo.subsector.sector.special & (15<<8)) == 512 then
		local line = P_FindSpecialLineFromTag(8000, mo.subsector.sector.tag, -1)
		if line ~= -1 then
			line = lines[line]
			mo.momz = $1+(P_AproxDistance(line.dx, line.dy)/256)
		end
	end
	
	if mo.target and mo.target.valid and mo.target.player then
		-- Get player input and shift momentum accordingly (analog is unsupported kthxbye)
		mo.angle = mo.target.angle
		
		local forward, side
		local cmd = mo.target.player.cmd
		local factor = 600
		forward = cmd.forwardmove*factor
		side = cmd.sidemove*factor
		P_Thrust(mo, mo.angle, forward)
		P_Thrust(mo, mo.angle-ANGLE_90, side)
		
		if mo.target.player.powers[pw_underwater] <= 12*TICRATE + 1
			mo.target.player.powers[pw_underwater] = underwatertics + 1
			P_RestoreMusic(mo.target.player)
		end
		
		if P_AproxDistance(mo.momx, mo.momy) > mo.target.player.normalspeed then
			mo.momx = 9*$1/10
			mo.momy = 9*$1/10
		end
		if (mo.eflags & MFE_UNDERWATER) then
			mo.momz = $1/2
		end
		
		if cmd.buttons & BT_USE then
				mo.target.momz = $1+mo.momz
			mo.target.player.pflags = $|PF_JUMPED
			mo.target.player.powers[pw_carry] = 0
		end
		mo.target.player.powers[pw_underwater] = 30*TICRATE
		if not mo.target.player.powers[pw_carry] then
			mo.target = nil
		end
	end
	
	if mo.z <= mo.floorz then
		if mo.target and mo.target.player then
			mo.target.player.powers[pw_carry] = 0
			if mo.target.z < mo.target.floorz then
				mo.target.z = mo.target.floorz
			end
			
			if mo.target.player.powers[pw_carry] ~= CR_GENERIC then
				mo.target = nil
			end
		end
		P_KillMobj(mo)
		return
	end
end

-- Look for new players if nobody's riding already
addHook("TouchSpecial", function(glider, toucher)
	if glider.target and glider.target.valid then return true end
	if toucher.momz > 0 then return true end
	if toucher.player.cmd.buttons & BT_USE then return true end
	if toucher.player.powers[pw_carry] then return true end
	
	glider.target = toucher
	toucher.tracer = glider
	toucher.player.powers[pw_carry] = CR_GENERIC
	toucher.angle = glider.angle
	glider.momx = toucher.momx
	glider.momy = toucher.momy
	glider.momz = toucher.momz
	toucher.player.pflags = $1&~PF_JUMPED
	
	return true
end, MT_SMOKEGLIDER)

states[S_SMOKEGLIDER_GLIDE] = {SPR_SMKG, 0, 1, A_SmokeGlider, -2*FRACUNIT, 0, S_SMOKEGLIDER_GLIDE}

addHook("ShouldDamage", function(target, inflictor, source, damage)
    if not inflictor
        return nil
    end
    if inflictor and inflictor.valid 
        if inflictor.type == MT_SMOKEGLIDER or inflictor.type == MT_SMOKEGLIDERSPAWN
            return false
        end
    end
end, MT_PLAYER)

addHook("MobjRemoved", function(mo)
	if mo.tracer
	mo.tracer.player.powers[pw_carry] = 0
	mo.tracer.tracer = nil
	end
end, MT_SMOKEGLIDER)