addHook("PlayerThink", function(p)
	if p.mo and p.mo.valid and p.mo.skin == "kamek"
		if ((p.cmd.buttons & BT_SPIN) and (p.cmd.buttons & BT_JUMP))
		and (p.panim != PA_ABILITY)
		and not (p.weapondelay)
		and not (P_IsObjectOnGround(p.mo))
		and not (p.powers[pw_carry] == CR_ROLLOUT)
		and not (p.mo.state == S_KTIR)
		and (p.mo.scale == FRACUNIT*1)
		and (p.gotflag == 0)
		and not (gametyperules & GTR_TAG)
			p.mo.state = S_KMTP1
			p.pflags = $ & ~(PF_SHIELDABILITY)
		end
		if (p.mo.state == S_KMTP5)
		and (p.gotflag == 0)
			P_InstaThrust(p.mo, p.mo.angle, 27*FRACUNIT)
			P_DoJumpShield(p)
			p.pflags = $ |(PF_JUMPED)
			p.pflags = $ & ~(PF_THOKKED)
			p.pflags = $ & ~(PF_SHIELDABILITY)
			p.pflags = $ | (PF_NOJUMPDAMAGE)
			p.mo.state = S_KMTP6
			S_StartSound(p.mo, sfx_kmks)
			S_StartSound(p.mo, sfx_kjij)
			P_SpawnPlayerMissile (p.mo, MT_MAGICSHAPES3)
			P_SpawnPlayerMissile (p.mo, MT_SPARK)
			P_SpawnPlayerMissile (p.mo, MT_KMAGICDUST)
			P_SpawnPlayerMissile (p.mo, MT_SPINDUST)
			p.weapondelay = TICRATE*4
		end
//Fix shields conflicting with Kamek teleport and the rebroom
		if (p.cmd.buttons & BT_JUMP)
		or (p.panim == PA_ETC)
		or (p.panim == PA_ABILITY)
		or ((p.mo.state == S_PLAY_FALL) and not (p.pflags & PF_JUMPED))
		or not (p.pflags & PF_APPLYAUTOBRAKE)
			p.charflags = $|SF_NOSHIELDABILITY
		else
			p.charflags = $ & ~SF_NOSHIELDABILITY
		end
		if (p.pflags & PF_SHIELDABILITY)
		and (p.panim != PA_ETC)
			p.mo.state = S_PLAY_FALL
			p.weapondelay = TICRATE*0
		end
		if (p.mo.state == S_PLAY_FALL)
			p.pflags = $ & ~(PF_THOKKED)
		end
	end
end)