
addHook("PlayerThink",function(p)
	if p.homattack == nil
		p.homattack = false
		p.canhome = false
		p.weakthok = false
	end
	if P_IsObjectOnGround(p.mo)
		p.homattack = false
		p.canhome = false
		p.weakthok = false
	end
	if p.mo.eflags & MFE_SPRUNG
		p.homattack = false
		p.canhome = false
		p.weakthok = false
	end
	if p.mo.eflags & MFE_JUSTHITFLOOR
		p.homattack = false
		p.canhome = false
		p.weakthok = false
	end
	if P_PlayerInPain(p)
		p.homattack = false
	end
	
	if p.mo.skin == "neostreak"
		if p.mo.eflags & MFE_JUSTHITFLOOR
		and p.homattack
			p.pflags = $|PF_SPINNING
			p.mo.state = S_PLAY_ROLL
		end
	end
end)

local function homingattack(p) //allow the player to constantly pursue their target after a jump press
	local mo = p.mo
	
	if p.mo.skin == "neostreak"
	and mo.hometarget and mo.hometarget.valid and mo.hometarget.health //make sure we have a target
		if p.homattack //need PF_THOKKED to start zero-ing in
			local zdist = (P_MobjFlip(mo) == 1) and (mo.hometarget.z + mo.hometarget.height) - (mo.z + mo.height) or (mo.hometarget.z - mo.z) //variables for distance and stuff!
			local dist = P_AproxDistance(P_AproxDistance(mo.hometarget.x - mo.x, mo.hometarget.y - mo.y), zdist)
			local angle = R_PointToAngle2(mo.x, mo.y, mo.hometarget.x, mo.hometarget.y)
			local zangle = R_PointToAngle2(0, mo.z, P_AproxDistance(mo.x - mo.hometarget.x, mo.y - mo.hometarget.y), mo.hometarget.z)
			local maxspeed = ((p.powers[pw_super] or p.powers[pw_sneakers] or MODID == 14) and 2 or 1)*FixedMul(p.normalspeed, mo.scale)
			local x = FixedMul(maxspeed, FixedMul(cos(angle), cos(zangle)))
			local y = FixedMul(maxspeed, FixedMul(sin(angle), cos(zangle)))
			local z = FixedMul(maxspeed, sin(zangle))
			
			//listen buddy i like special effects in my sonic the hedgehog videogame
			local thokfx = P_SpawnGhostMobj(p.mo,0,0,0,MT_GHOST)
			thokfx.color = p.mo.color
			thokfx.fuse = 8
			thokfx.destscale = 0
			thokfx.blendmode = AST_ADD
			
			//lol i remember i didn't have this one here and i hit a target while in the falling state as super sonic lolllll
			p.mo.state = S_PLAY_JUMP
			
			p.drawangle = R_PointToAngle2(mo.x, mo.y, mo.hometarget.x, mo.hometarget.y)
			p.mo.angle = R_PointToAngle2(mo.x, mo.y, mo.hometarget.x, mo.hometarget.y)
			
			if not p.powers[pw_super]
				mo.momx = FixedMul(FixedDiv(mo.hometarget.x-mo.x, dist), 55*FRACUNIT)
				mo.momy = FixedMul(FixedDiv(mo.hometarget.y-mo.y, dist), 55*FRACUNIT)
				mo.momz = FixedMul(FixedDiv(zdist, dist), 55*FRACUNIT)
			end
			
			//momentum now works the same when you're super sonic lol
			if p.powers[pw_super]
				mo.momx = FixedMul(FixedDiv(mo.hometarget.x-mo.x, dist), 100*FRACUNIT)
				mo.momy = FixedMul(FixedDiv(mo.hometarget.y-mo.y, dist), 100*FRACUNIT)
				mo.momz = FixedMul(FixedDiv(zdist, dist), 100*FRACUNIT)
			end
			
			if p.powers[pw_pushing]
				p.homattack = false
				p.playerline = lines[p.lastlinehit]
				
				if p.playerline
					p.bounceside = P_PointOnLineSide(p.mo.x, p.mo.y, p.playerline)
					P_InstaThrust(p.mo,p.bounceside + ANGLE_180, 5*FRACUNIT)
				end
			end
		end
	end
end
addHook("PlayerThink",homingattack) //needs to be active for every frame, but only starts when we hit jump while we have a target in range.

addHook("AbilitySpecial",function(p)
	local mo = p.mo
	local angle = mo.angle

	local momangle = R_PointToAngle2(0,0,p.rmomx,p.rmomy)
	if mo and mo.skin == "neostreak"
			if mo.hometarget
				p.homattack = true
				S_StartSound(mo,sfx_thok)
				homingattack(p) //execute your homing attack
			else
				if p.weakthok == false
					local weakthokeffect = P_SpawnGhostMobj(p.mo,0,0,0,MT_GHOST)
					weakthokeffect.scale = FRACUNIT
					weakthokeffect.destscale = FRACUNIT*6
					weakthokeffect.colorized = false
					weakthokeffect.blendmode = AST_ADD
					S_StartSound(mo,sfx_thok)
					p.weakthok = true
					if not p.powers[pw_super]
						if p.speed < 50*FRACUNIT
							P_InstaThrust(mo,angle,50*FRACUNIT)
							p.mo.state = S_PLAY_FALL
						else
							P_InstaThrust(mo,angle,p.speed)
							p.mo.state = S_PLAY_FALL
						end
					else
						P_InstaThrust(mo,angle,90*FRACUNIT)
						p.mo.state = S_PLAY_FALL
					end
				end
			end
		
		return true
	end
end)

addHook("PlayerThink",function(p)
	if p.mo.skin == "neostreak"
		if not p.mo.hometarget
		and p.pflags & PF_JUMPED
			p.mo.hometarget = P_LookForEnemies(p,true,true)
		end
	end

	local mom = FixedDiv(FixedHypot(p.rmomx,p.rmomy),p.mo.scale)
	local friction = FixedDiv(p.mo.friction,p.mo.movefactor)
	local momangle = R_PointToAngle2(0,0,p.rmomx,p.rmomy)

	if p.powers[pw_justlaunched]
		P_SetObjectMomZ(p.mo,p.mo.momz/5,true)
	end

	local mo = p.mo
	mo.hometarget = P_LookForEnemies(p,true,true)
	
	//target availability check for the reticle arrow
	if mo.hometarget and mo.hometarget.valid and mo.hometarget.health
	and mo.skin == "neostreak"
	and p.pflags & PF_JUMPED
		if not p.powers[pw_shield] == SH_ATTRACT
			P_SpawnLockOn(p,mo.hometarget,S_LOCKON2) //the fact that this isn't highlighted makes me nervous that i'm getting one of the arguments wrong lol
		else
			P_SpawnLockOn(p,mo.hometarget,S_LOCKON1)
		end
	end
end)

//rebound after a homing attack
local function hatkrebound(mo,mobj)
	if mobj.flags & (MF_MONITOR|MF_ENEMY|MF_BOSS)
	and mo.skin == "neostreak"
	and mo.player.homattack
	and not P_PlayerInPain(mo.player)
		if (mo.z + mo.height < mobj.z) 
		or (mo.z > mobj.z + mobj.height)
			return false
		else
			if mo.player.cmd.buttons & BT_TOSSFLAG
				P_SetObjectMomZ(mo,1000*FRACUNIT,true)
				mo.momx = $/5
				mo.momy = $/2
				mo.player.homattack = false
			end
			if mo.player.cmd.buttons & BT_JUMP
				P_SetObjectMomZ(mo,12*FRACUNIT,false)
				mo.momx = $/2
				mo.momy = $/2
				mo.player.homattack = false
			else
				mo.player.homattack = false
				P_SetObjectMomZ(mo,5*FRACUNIT,false)
			end
		end
	end
end
addHook("MobjMoveCollide",hatkrebound)