addHook("ThinkFrame", function()
	for player in players.iterate do
		if player.mo.skin ~= "m.jimmyharold" then
			continue
		end
		
		if not (player.cmd.buttons & BT_JUMP) then
			player.jumptapready = true
			player.jumptapping = false
		elseif player.jumptapready then
			player.jumptapping = true
			player.jumptapready = false
		else
			player.jumptapping = false
		end
		
		if not (player.cmd.buttons & BT_SPIN) then
			player.spintapready = true
			player.spintapping = false
		elseif player.spintapready then
			player.spintapping = true
			player.spintapready = false
		else
			player.spintapping = false
		end
		
		if not P_IsObjectOnGround(player.mo) then
			player.gtapready = true
			player.gtapping = false
		elseif player.gtapready then
			player.gtapping = true
			player.gtapready = false
		else
			player.gtapping = false
		end
		
		if not (player.pflags & PF_JUMPED) then
			player.jutapready = true
			player.jutapping = false
		elseif player.jutapready then
			player.jutapping = true
			player.jutapready = false
		else
			player.jutapping = false
		end
		
		if not (player.cmd.buttons & BT_CUSTOM2) then
			player.c2tapready = true
			player.c2tapping = false
		elseif player.c2tapready then
			player.c2tapping = true
			player.c2tapready = false
		else
			player.c2tapping = false
		end
		
		if player.jumptapping
		and player.mo.state != S_PLAY_SUPER_TRANS1
		and player.mo.state != S_PLAY_SUPER_TRANS2
		and player.mo.state != S_PLAY_SUPER_TRANS3
		and player.mo.state != S_PLAY_SUPER_TRANS4
		and player.mo.state != S_PLAY_SUPER_TRANS5
		and player.mo.state != S_PLAY_SUPER_TRANS6
		and not player.exiting then
			if P_IsObjectOnGround(player.mo) == false and player.smakuse == false and player.mo.state == S_PLAY_TWINSPIN then
				player.mo.state = S_PLAY_STND
				player.pflags = $ & ~PF_JUMPED
				if not(player.pflags & PF_JUMPED)
					P_DoJump(player, true)
					P_SpawnSpinMobj(player, MT_JIMDUST)
					player.smakuse = true
				player.mo.state = S_PLAY_TWINSPIN
				end
			end
		elseif P_IsObjectOnGround(player.mo) == true then
			player.smakuse = false
			COM_BufInsertText(player, "cam_speed 0.3")
		elseif (player.cmd.buttons & BT_SPIN) and player.smakuse then
			player.jimtarget = P_LookForEnemies(player, false, true)
			player.jimtarget2 = P_LookForEnemies(player, true, true)
			if player.jimtarget != nil then
				P_HomingAttack(player.mo, player.jimtarget)
				P_SpawnGhostMobj(player.mo)
				COM_BufInsertText(player, "cam_speed 0")
			elseif player.jimtarget2 != nil then
				P_HomingAttack(player.mo, player.jimtarget2)
				P_SpawnGhostMobj(player.mo)
				COM_BufInsertText(player, "cam_speed 0")
			else
				COM_BufInsertText(player, "cam_speed 0.3")
			end
		else
			COM_BufInsertText(player, "cam_speed 0.3")
		end
	end
end)

addHook("PlayerThink", function(player)
	if (player.mo and player.mo.valid and player.mo.skin == "m.jimmyharold") then
		if player.mo.state == S_PLAY_JUMP
		and not (player.cmd.buttons & BT_JUMP) then
			player.mo.state = S_PLAY_FALL
		end
	end
end)

addHook("PlayerThink", function(player)
	if player.mo and player.mo.valid and player.homing and player.mo.skin != "m.jimmyharold" then
		COM_BufInsertText(player, "cam_speed 0")
	elseif player.mo.skin != "m.jimmyharold" then
		COM_BufInsertText(player, "cam_speed 0.3")
	end
end)

// thok thingy
addHook("PlayerThink", function(player)
	if (player.mo and player.mo.valid and player.mo.skin == "m.jimmyharold") then
		if player.spintapping and not P_IsObjectOnGround(player.mo)
		and not player.smakuse and not player.jiminitdown
		and not player.jimdown and player.powers[pw_carry] == CA_NONE then
			player.jiminitdown = true
		end
	end
end)

addHook("PlayerThink", function(player)
	if (player.mo and player.mo.valid and player.mo.skin == "m.jimmyharold")
	and player.mo.state != S_PLAY_SUPER_TRANS1
	and player.mo.state != S_PLAY_SUPER_TRANS2
	and player.mo.state != S_PLAY_SUPER_TRANS3
	and player.mo.state != S_PLAY_SUPER_TRANS4
	and player.mo.state != S_PLAY_SUPER_TRANS5
	and player.mo.state != S_PLAY_SUPER_TRANS6
	and not player.exiting then
		player.jimtimdown = $ or 0
		if player.jiminitdown and not P_IsObjectOnGround(player.mo)
			player.jimtimdown = $ + 1
			if player.jimtimdown <= 1*TICRATE/4 then
				player.mo.state = S_PLAY_ROLL
				player.mo.momz = 0
				player.mo.momx = 0
				player.mo.momy = 0
				S_StartSound(player.mo, sfx_spndsh)
			else
				P_InstaThrust(player.mo ,player.drawangle, (40*FRACUNIT))
				S_StartSound(player.mo, sfx_zoom)
				player.smakuse = true
				player.mo.state = S_PLAY_ROLL
				player.pflags = $ |PF_SPINNING
				player.jimtimdown = 0
				player.jiminitdown = false
			end
		end
	end
end)



addHook("PlayerThink", function(player)
	if player.mo and player.mo.valid and player.mo.skin == "m.jimmyharold" then
		player.jimstretch = 0 or nil
		if player.jutapping and player.jimstay != 1 then
			player.jimstretch = 1
			P_SpawnSpinMobj(player, MT_JIMDUST)
		elseif player.gtapping and player.jimstay != 2 then
			player.jimstretch = 2
		end
	end
end)
		
// and player.mo.skin == "m.jimmyharold")
//

addHook("PlayerThink", function(player)
	if player.mo and player.mo.valid and player.mo.skin == "m.jimmyharold" then
		if player.jimtaget != nil then
			P_SpawnLockOn(player, player.jimtarget, S_NBOB)
		elseif player.jimtaget2 != nil then
			P_SpawnLockOn(player, player.jimtarget2, S_NBOB)
		end
	end
end)
addHook("PlayerThink", function(player)
	if player.mo and player.mo.valid and player.mo.skin == "m.jimmyharold" then
		if player.jimstretch == 1 or player.jimstay == 1 then
			player.jstretchtim = $ + 1
			player.jimstay = 1
			if player.jstretchtim == 3 then
				player.mo.spriteyscale = FRACUNIT + (FRACUNIT/2)
				player.mo.spritexscale = FRACUNIT - (FRACUNIT/2)
			elseif player.jstretchtim == 6 then
				player.mo.spriteyscale = FRACUNIT + (FRACUNIT/3)
				player.mo.spritexscale = FRACUNIT - (FRACUNIT/3)
			elseif player.jstretchtim == 9 then
				player.mo.spriteyscale = FRACUNIT + (FRACUNIT/4)
				player.mo.spritexscale = FRACUNIT - (FRACUNIT/4)
			elseif player.jstretchtim == 12 then
				player.mo.spriteyscale = FRACUNIT + (FRACUNIT/5)
				player.mo.spritexscale = FRACUNIT - (FRACUNIT/5)
			elseif player.jstretchtim == 15 then
				player.mo.spriteyscale = FRACUNIT + (FRACUNIT/6)
				player.mo.spritexscale = FRACUNIT - (FRACUNIT/6)
			elseif player.jstretchtim == 16 then
				player.mo.spriteyscale = FRACUNIT
				player.mo.spritexscale = FRACUNIT
				player.jimstay = 0
				player.jstretchtim = 0
				player.jimstay = 0
			end
		elseif player.jimstretch == 2 or player.jimstay == 2 then
			player.jstretchtim = $ + 1
			player.jimstay = 2
			if player.jstretchtim == 3 then
				player.mo.spriteyscale = FRACUNIT - (FRACUNIT/3)
				player.mo.spritexscale = FRACUNIT + (FRACUNIT/3)
			elseif player.jstretchtim == 6 then
				player.mo.spriteyscale = FRACUNIT - (FRACUNIT/3)
				player.mo.spritexscale = FRACUNIT + (FRACUNIT/3)
			elseif player.jstretchtim == 9 then
				player.mo.spriteyscale = FRACUNIT - (FRACUNIT/4)
				player.mo.spritexscale = FRACUNIT + (FRACUNIT/4)
			elseif player.jstretchtim == 12 then
				player.mo.spriteyscale = FRACUNIT - (FRACUNIT/5)
				player.mo.spritexscale = FRACUNIT + (FRACUNIT/5)
			elseif player.jstretchtim == 15 then
				player.mo.spriteyscale = FRACUNIT - (FRACUNIT/6)
				player.mo.spritexscale = FRACUNIT + (FRACUNIT/6)
			elseif player.jstretchtim == 16 then
				player.mo.spriteyscale = FRACUNIT
				player.mo.spritexscale = FRACUNIT
				player.jimstay = 0
				player.jstretchtim = 0
				player.jimstay = 0
			end
		else
			player.jstretchtim = 0
		end
	end
end)

--[[
addHook("PlayerThink", function(player)
	player.jimfall = $ or 0
	if (player.mo and player.mo.valid and player.mo.skin == "m.jimmyharold")
		if player.mo.momz <= 0 - 1 then
			player.jimfall = $ + 1
		end
	end
end)


addHook("PlayerThink", function(player)
	player.jimfall = $ or 0
	if (player.mo and player.mo.valid and player.mo.skin == "m.jimmyharold")
		if player.gtapping and player.jimfall >= 3*TICRATE then
			player.mo.state = S_PLAY_JIMOUCH
			player.jimfall = 0
		elseif player.jimfall == 15 - (3*TICRATE) then
			player.mo.state = S_PLAY_ROLL
		elseif player.jimfall >= 3*TICRATE then
			player.mo.state = S_PLAY_JIMDIVE
		elseif player.gtapping then
			player.jimfall = 0
		end
	end
end)

addHook("PlayerThink", function(player)
	if player.mo and player.mo.valid and player.mo.skin == "m.jimmyharold" then
		if player.sit and player.jumptapping then
			player.jimspindsh = true
			player.mo.state = S_PLAY_SPINDASH
			player.pflags = $ |PF_STARTDASH
			player.sit = false
			player.jimspindsh = true
		elseif player.mo.state != S_PLAY_SPINDASH then
			player.jimspindsh = false
		end
	end
end)

addHook("PlayerThink", function(player)
	if player.mo and player.mo.valid and player.mo.skin == "m.jimmyharold" then
		if player.jimspindsh
		or player.mo.state == S_PLAY_SPINDASH then
			player.pflags = $ |PF_STARTDASH
			player.pflags = $ |PF_SPINNING
			player.mo.state = S_PLAY_SPINDASH
			if player.jimdashspd <= 50 then
				player.jimdashspd = $ + 1/4
			end
			player.jimspindsh = true
		end
	end
end)]]


-- Smooth Trail script by ffoxD.
-- i crediting them because they are way past cool!
local function SmoothTrail(mo, trailmo, freq)
    -- Real Z momentum thingy plus leveltime checks.
    -- You can replace all this with mo.momz+mo.pmomz but that stays at 0 when on slopes and on ground.
    if not mo.prevz or not mo.prevleveltime or (mo.prevleveltime ~= leveltime - 1) then
       mo.prevz = mo.z
    end
    local rmomz = mo.z - mo.prevz
    mo.prevz = mo.z
    mo.prevleveltime = leveltime
    -- Handy local variables.
    local mospeed = R_PointToDist2(0, 0, R_PointToDist2(0, 0, mo.momx, mo.momy), rmomz)
    local dist = (mospeed/freq)
    -- The loop, repeats until it spawns all the thok objects.
    for i = dist, 1, -1 do
        local spawnedmo = P_SpawnMobjFromMobj(mo, (mo.momx/dist)*i, (mo.momy/dist)*i, (rmomz/dist)*i, trailmo)
        spawnedmo.color = mo.color
        spawnedmo.blendmode = AST_ADD -- blend
    end
end

addHook("PlayerThink", function(player)
	if (player.mo and player.mo.valid and player.mo.skin == "m.jimmyharold") then
		if player.mo.state == S_PLAY_ROLL or player.mo.state == S_PLAY_JIMORBT
		or player.mo.state == S_PLAY_JUMP then
			SmoothTrail(player.mo, MT_JIMBALL, 4*FRACUNIT)
			P_SpawnSpinMobj(player, MT_JIMBALL)
		end
	end
end)