--Willo's Tail by Frostiikin
freeslot(
"MT_WILLOTAIL",
"S_WILLOTAIL_STAND",
"S_WILLOTAIL_SPRING",
"S_WILLOTAIL_FALL",
"S_WILLOTAIL_RUN",
"S_WILLOTAIL_INVIS"
)
mobjinfo[MT_WILLOTAIL] = {
	doomednum = -1,
	spawnstate = S_NULL,
	flags = MF_NOCLIPHEIGHT,
	dispoffset = 2,
	radius = 5*FRACUNIT,
	height = 5*FRACUNIT
}
--Fuck followmobjs btw, they are dumb and bad
local standframe = {
  [S_PLAY_STND] = true,
  [S_PLAY_WALK] = true,
  [S_PLAY_WAIT] = true,
  [S_PLAY_SKID] = true,
  [S_PLAY_EDGE] = true,
  [S_PLAY_RIDE] = true,
}
local fallframe = {
  [S_PLAY_FALL] = true
}
local springframe = {
  [S_PLAY_SPRING] = true,
  [S_PLAY_GASP] = true
}
addHook("FollowMobj", function(p, mobj)
	if not (p.mo and p.mo.valid and p.mo.health and p.mo.skin == "willo") return end
	mobj.skin = "willo"
	if p.mo.eflags & MFE_VERTICALFLIP
		mobj.flags2 = $ | MF2_OBJECTFLIP
		--print("a")
	else
		mobj.flags2 = $ & ~ MF2_OBJECTFLIP
		--print("b")
	end
	
	local fuckunit = mobj.scale
	local dist = 4*fuckunit
	if not (p.mo.eflags & MFE_VERTICALFLIP)
		P_TeleportMove(mobj, p.mo.x+P_ReturnThrustX(mobj, p.drawangle+FixedAngle(180*FRACUNIT), dist), p.mo.y+P_ReturnThrustY(mobj, p.drawangle+FixedAngle(180*FRACUNIT), dist), p.mo.z)
	else
		P_TeleportMove(mobj, p.mo.x+P_ReturnThrustX(mobj, p.drawangle+FixedAngle(180*FRACUNIT), dist), p.mo.y+P_ReturnThrustY(mobj, p.drawangle+FixedAngle(180*FRACUNIT), dist), p.mo.z + p.mo.height - mobj.height)
		--p.mo.z + p.mo.height - tail.height
	end
	
	local sprite2 = p.mo.sprite2&~FF_SPR2SUPER&~FF_SPR2ENDSTATE&~FF_SPR2MIDSTART
	if sprite2 == SPR2_WALK
		local frame = p.mo.frame & FF_FRAMEMASK
		if frame == A or frame == E
			mobj.z = $ + fuckunit * P_MobjFlip(mobj)
		elseif frame == C or frame == G
			mobj.z = $ + 4*fuckunit * P_MobjFlip(mobj)
		else
			mobj.z = $ + 3*fuckunit * P_MobjFlip(mobj)
		end
	elseif sprite2 == SPR2_WAIT
		mobj.z = $ + 2*fuckunit * P_MobjFlip(mobj)
	elseif sprite2 == SPR2_EDGE
		mobj.z = $ + 6*fuckunit * P_MobjFlip(mobj)
	elseif sprite2 == SPR2_EDGE or sprite2 == SPR2_RIDE
		mobj.z = $ + 3*fuckunit * P_MobjFlip(mobj)
	elseif sprite2 == SPR2_SKID
		mobj.z = $ - 2*fuckunit * P_MobjFlip(mobj)
	end
	
	if standframe[p.mo.state]
		if mobj.state != S_WILLOTAIL_STAND
			mobj.state = S_WILLOTAIL_STAND
		end
	elseif fallframe[p.mo.state] 
		if mobj.state != S_WILLOTAIL_FALL
			mobj.state = S_WILLOTAIL_FALL
		end
	elseif springframe[p.mo.state] 
		if mobj.state != S_WILLOTAIL_SPRING
			mobj.state = S_WILLOTAIL_SPRING
		end
	elseif mobj.state != S_WILLOTAIL_INVIS
		mobj.state = S_WILLOTAIL_INVIS
	end
		
	--mobj.anim_duration = p.mo.anim_duration
	if mobj.sprite2 == SPR2_STND --mobj.state == S_PLAY_STND or mobj.state == S_PLAY_WAIT
		if p.mo.state == S_PLAY_JUMP or p.mo.state == twirl
			if mobj.anim_duration > 1
				mobj.anim_duration = 1
			end
		else
			if mobj.anim_duration > 4
				mobj.anim_duration = 4
			end
		end
	end
	
	mobj.spritexscale = p.mo.spritexscale
	mobj.spriteyscale = p.mo.spriteyscale
	mobj.rollangle = p.mo.rollangle
	mobj.color = p.mo.color
	--mobj.height = p.mo.height
	--mobj.radius = p.mo.radius
	mobj.scale = p.mo.scale
	mobj.angle = R_PointToAngle2(mobj.x, mobj.y, p.mo.x, p.mo.y)
	--mobj.angle = p.drawangle
	--mobj.color = SKINCOLOR_RED
	return true
end, MT_WILLOTAIL)