

//flightbursts by TGTLS
//bugfixing by LuigiBudd

local function E(p)
	if p.mo and p.mo.valid
		local ring = P_SpawnMobjFromMobj(p.mo, 0, 0, 0, MT_THOK)
		ring.angle = p.drawangle+ANGLE_90
		ring.scale = p.mo.scale
		ring.colorized = true
		ring.color = p.mo.color
		ring.state = S_FACESTABBERSPEAR
		ring.destscale = ring.scale+4*FRACUNIT
		ring.renderflags = $|RF_FLOORSPRITE
		ring.fuse = 8
		ring.frame = TR_TRANS10
		if (p.mo.eflags & MFE_VERTICALFLIP or p.powers[pw_gravityboots])
			ring.flags2 = $|MF2_OBJECTFLIP
			ring.eflags = $|MFE_VERTICALFLIP
		end
	end
end

freeslot("sfx_airdsh")
sfxinfo[sfx_airdsh].caption = "Burst"
freeslot("sfx_noppe")
sfxinfo[sfx_airdsh].caption = "NOPE"

addHook("AbilitySpecial", function(player)
	if player.mo.skin == "talez"
	and player.powers[pw_tailsfly] > 0
	and player.mo.burstdeez > 0
		E(player)
		S_StartSound(player.mo, sfx_airdsh)
		P_SetObjectMomZ(player.mo, 13*FRACUNIT)
		local sparkletrail = P_SpawnGhostMobj(player.mo)
		sparkletrail.fuse = 19
		sparkletrail.blendmode = AST_ADD
		sparkletrail.color = player.mo.color
		sparkletrail.colorized = true
		player.mo.burstdeez = $-1
	end
end)

addHook("PlayerThink", function(player)
	if player.mo.burstdeez == nil
		player.mo.burstdeez = 3
	end
end)

addHook("PlayerThink", function(p)
	local mo = p.mo
	if (mo.eflags & MFE_JUSTHITFLOOR or P_IsObjectOnGround(mo))
	and not (p.cmd.buttons & BT_JUMP) then
		if p.powers[pw_super] then
			mo.burstdeez = 10
		else
			mo.burstdeez = 3
		end
	end
end)

--Sonic Heroes-style jumping animation by Zarosguth,
--Reusable, please give proper credit.

--Whitelist of skins that get the Heroes-style jumping animation:
/*local whitelist = {"sonic","tails","knuckles","amy","fang","metalsonic"}

local function onWhiteList(player, list)
	for _, skin in pairs(list) do
		if player.mo.skin == skin return true end
	end
	return false
end*/

addHook("PlayerThink", function(p)
	local mo = p.mo
	if not (p and p.valid) return end --Check whether Player exists
	if p.mo.state == S_PLAY_FLY or p.mo.state == S_PLAY_FLY_TIRED return end
	//if not onWhiteList(p, whitelist) return end --Check whether Player's skin is on the whitelist
	//if skins[mo.skin].flags & SF_NOJUMPSPIN return end --Check whether Player spins while jumping by default
if p.mo.skin ~= "talez" return end
	p.charflags = $|SF_NOJUMPSPIN --Disable vanilla jumpspin

	if p.pflags & PF_JUMPED
	and p.panim ~= PA_ABILITY
	and not p.taunting
	and not (mo.state >= S_PLAY_SUPER_TRANS1 and mo.state <= S_PLAY_SUPER_TRANS6)
	and not (p.pflags & PF_THOKKED)
	and not (p.charability == CA_THOK and p.cmd.buttons & BT_SPIN and p.powers[pw_super])
		local apex = FixedMul(4*mo.scale, min(skins[mo.skin].jumpfactor, FRACUNIT)) --Determine jump apex,
		if mo.eflags & MFE_UNDERWATER --Correct for being underwater,
			apex = 117*$/200
		end

		if mo.momz > -apex and mo.momz < apex --while at apex of jump,
			if mo.state ~= S_PLAY_ROLL
				mo.state = S_PLAY_ROLL --Spinning animation
			end
		else

			if not (mo.eflags & MFE_VERTICALFLIP) and mo.momz > 0 --when going up,
			or mo.eflags & MFE_VERTICALFLIP and mo.momz < 0 --or down in reverse gravity,
				if mo.state ~= S_PLAY_JUMP
				and mo.state ~= S_PLAY_SPRING
					mo.state = S_PLAY_JUMP --Jumping animation
				end
			end

			if not (mo.eflags & MFE_VERTICALFLIP) and mo.momz < 0 --when going down,
			or mo.eflags & MFE_VERTICALFLIP and mo.momz > 0 --or up in reverse gravity,
				if mo.state ~= S_PLAY_FALL
					mo.state = S_PLAY_FALL --Falling animation
				end
			end
		end

		--Give smooth trail while being able to deal damage, based on smooth trail script by ffoxD
		if not (p.pflags & PF_NOJUMPDAMAGE)
			if not mo.prevz or not mo.prevleveltime or mo.prevleveltime ~= leveltime - 1
				mo.prevz = mo.z
			end
			local rmomz = mo.z - mo.prevz

			mo.prevz = mo.z
			mo.prevleveltime = leveltime

			local mospeed = R_PointToDist2(0, 0, R_PointToDist2(0, 0, mo.momx, mo.momy), rmomz)
			local dist = max(mospeed / (4*FRACUNIT), 1)

			for i = dist, 1, -1
				local trail = P_SpawnMobjFromMobj(mo, mo.momx/dist*i, mo.momy/dist*i, rmomz/dist*i, MT_THOK)
				trail.fuse = 3
				trail.scale = 21*mo.scale/20
				trail.color = mo.color
				trail.frame = FF_TRANS90|FF_ADD
			end
		end

	elseif p.pflags & PF_THOKKED --Set rolling animation when using a thok ability
	and not (p.prevpflags & PF_THOKKED)
	and p.panim ~= PA_ROLL
		if p.charability == CA_THOK
		or p.charability == CA_JUMPTHOK
		or p.charability == CA_HOMINGTHOK and p.homing
			mo.state = S_PLAY_ROLL
		end
	end
	p.prevpflags = p.pflags
end)

//fly drop custom2
//by Sonic 12
//https://mb.srb2.org/addons/s3-a-i-r-tails-fly-drop.3545/

addHook("ThinkFrame", do
    for player in players.iterate
	   if (player.mo and player.mo.skin == "talez")

	   if not (player.mo.usedown) then
	   player.mo.usedown = 0
	   end
	   
	   if not (player.mo.flydrop) then
	   player.mo.flydrop = 0
	   end
	  
	   if (player.cmd.buttons & BT_USE)
	   and (player.mo.state == S_PLAY_FLY or player.mo.state == S_PLAY_FLY_TIRED)
	   and (player.mo.usedown == 0)
	   and not P_IsObjectOnGround(player.mo)
	   player.mo.usedown = 1
	   player.mo.flydrop = 1
	   player.mo.state = S_PLAY_JUMP
	   player.pflags = $1|PF_JUMPED
	   end
	   
	   if not (player.cmd.buttons & BT_USE)
	   and (player.mo.usedown == 1)
	   player.mo.usedown = 0
	   end
	   
	    end
	end
end)

addHook("PlayerCanDamage", function(player, mobj)
	if player.mo and player.mo.skin == "talez"
	and player.mo.state == S_PLAY_ROLL
	and (mobj.flags&MF_ENEMY or mobj.flags&MF_BOSS or mobj.flags&MF_MONITOR) return true end
end, MT_PLAYER)

//Speedway Chars spin by TGTLS, who gave permission for it to be used

addHook("PlayerThink", function(player)
	if player.mo.skin == "talez"
	and (player.cmd.buttons & BT_CUSTOM1)
	and P_IsObjectOnGround(player.mo)
	and not (player.pflags & PF_SLIDING)
	and not (player.exiting)
		player.mo.state = S_TALEZ_ATK
		player.tailswipe = true
		if (player.pflags & PF_SPINNING)
			player.pflags = $ & ~PF_SPINNING
			if leveltime%4 == 0
			local ryx = P_RandomRange(-5, 5)
			local mo = player.mo
				local dust = P_SpawnMobjFromMobj(mo, mo.momx+ryx*FRACUNIT, mo.momy+ryx*FRACUNIT, mo.momz, MT_DUST)
				dust.scale = player.mo.scale
				dust.destscale = player.mo.scale*1/2
				dust.frame = TR_TRANS10
			end
		end
	end
	if player.redraw == nil
		player.redraw = 0
	end
	if player.mo.skin == "talez"
	and player.tailswipe
	and not (player.cmd.buttons & BT_CUSTOM1)
		player.mo.state = S_PLAY_WALK
		player.charflags = skins[player.mo.skin].flags
		player.tailswipe = false
	end
	if player.tailswipe
	and not P_IsObjectOnGround(player.mo)
		player.tailswipe = false
	end
	if leveltime%7 == 0
	and player.tailswipe
		S_StartSound(player.mo, sfx_s3k42, player)
	end
	if player.tailswipe
		player.charflags = $|SF_CANBUSTWALLS
		local ghost = P_SpawnGhostMobj(player.mo)
		ghost.fuse = 4
		ghost.colorized = true
		if ghost.tracer
			ghost.tracer.fuse = 4
			ghost.tracer.colorized = true
		end
	end
end)

addHook("SpinSpecial", function(player)
	if player.tailswipe then
		return true
	end
end)

addHook("PlayerCanDamage", function(player)
    if player.tailswipe then
        return true
    end
end)

addHook("MobjMoveCollide", function(mo, spike) -- Spike breaking by ARJr.
    if mo.valid
    and (mo.type == MT_PLAYER)
	and mo.player.tailswipe
    and spike.type == MT_SPIKE
		if (spike.z >= (mo.z - 16*FRACUNIT)) and (spike.z <= (mo.z + mo.height + 16*FRACUNIT))
			P_KillMobj(spike, mo, mo)
		elseif (spike.flags2 & MF2_OBJECTFLIP)
		and (spike.z <= (mo.z - 16*FRACUNIT)) and (spike.z >= (mo.z + mo.height+ 16*FRACUNIT))
			P_KillMobj(spike, mo, mo)
        end
    end
end)

addHook("PlayerSpawn", function(player)
	player.dropdown = false
end)

freeslot("S_TALEZ_ATK","SPR2_ATKG")

states[S_TALEZ_ATK] = {
	sprite = SPR_PLAY,
	frame = SPR2_ATKG,
	tics = 7,
	nextstate = S_TALEZ_ATK,
}

//Knuckles Dig by TGTLS

local pos = hudinfo[HUD_LIVES].y +5
local po = hudinfo[HUD_LIVES].y 
local pox = hudinfo[HUD_LIVES].y //Dig
//some parts of the code are from impostor
//credits to buggiethebug
freeslot(
	"S_TALEZ_DIGDOWN1",
	"S_TALEZ_DIGDOWN2",
	"S_TALEZ_DIGDOWN3",
	"S_TALEZ_DIGDOWN4",
	"S_TALEZ_DIGUP1",
	"S_TALEZ_DIGUP2",
	"S_TALEZ_DIGUP3",
	"S_TALEZ_DIGUP4",
	"SPR_TJUM",
	"SPR_TDIG",
	"MT_ROCKBLAST"
)

states[S_TALEZ_DIGDOWN1] = {
	sprite = SPR_TDIG,
	frame = A,
	tics = 1,
	nextstate = S_TALEZ_DIGDOWN2
}

states[S_TALEZ_DIGDOWN2] = {
	sprite = SPR_TDIG,
	frame = A,
	tics = 1,
	nextstate = S_TALEZ_DIGDOWN3
}

states[S_TALEZ_DIGDOWN3] = {
	sprite = SPR_TDIG,
	frame = A,
	tics = 1,
	nextstate = S_TALEZ_DIGDOWN4
}

states[S_TALEZ_DIGDOWN4] = {
	sprite = SPR_TDIG,
	frame = A,
	tics = 1,
	nextstate = S_TALEZ_DIGDOWN1
}

states[S_TALEZ_DIGUP1] = {
	sprite = SPR_TJUM,
	frame = A,
	tics = 1,
	nextstate = S_TALEZ_DIGUP2
}

states[S_TALEZ_DIGUP2] = {
	sprite = SPR_TJUM,
	frame = A,
	tics = 1,
	nextstate = S_TALEZ_DIGUP3
}

states[S_TALEZ_DIGUP3] = {
	sprite = SPR_TJUM,
	frame = A,
	tics = 1,
	nextstate = S_TALEZ_DIGUP4
}

states[S_TALEZ_DIGUP4] = {
	sprite = SPR_TJUM,
	frame = A,
	tics = 1,
	nextstate = S_TALEZ_DIGUP1
}

mobjinfo[MT_ROCKBLAST] = {
	spawnstate = S_ROCKCRUMBLEA,
	spawnhealth = 1000,
	radius = 8*FRACUNIT,
	height = 16*FRACUNIT,
	mass = 0,
	damage = 0,
	flags = MF_MISSILE|MF_BOUNCE|MF_GRENADEBOUNCE
}

local function kncuklesresetdig(p)
	p.height = skins[p.mo.skin].height
	p.charflags = skins[p.mo.skin].flags
	p.pflags = $ & ~(PF_INVIS|PF_THOKKED)
	p.mo.flags2 = $ & ~MF2_DONTDRAW
	p.shieldscale = skins[p.mo.skin].shieldscale
	p.charability2 = skins[p.mo.skin].ability2
	p.digging = false
	p.drilled = false
	p.charflags = $ & ~SF_NOSKID
	p.mo.flags = $ & ~MF_NOCLIPTHING
	if not p.hyperform
		p.pflags = $ & ~PF_GODMODE
	end
end

addHook("PlayerThink", function(player)
	if player.digtime == nil
		player.digtime = 0
	end
	if player.drilled == nil
		player.drilled = false
	end
	if player.digging == nil
		player.digging = false
	end
	if player.knuxexiting == nil
		player.knuxexiting = false
	end
end)

local function rockblast(player)
	for i = 1, 17
		local rock = P_SpawnPlayerMissile(player.mo, MT_ROCKBLAST, MF2_SCATTER)
		rock.tics = 100
		rock.frame = A
		P_InstaThrust(rock, i*ANGLE_22h, 5*player.mo.scale)
		rock.momz = 16*P_MobjFlip(player.mo)*player.mo.scale
		rock.eflags = player.mo.eflags & MFE_VERTICALFLIP
	end
end

//taken from the pins of the srb2 offical server scipting channel thanks tasurtu
local function CheckAndCrumble(mo, sec)
  for fof in sec.ffloors()
    if not (fof.flags & FF_EXISTS) continue end -- Does it exist?
    if not (fof.flags & FF_BUSTUP) continue end -- Is it bustable?
    
    if mo.z + mo.height < fof.bottomheight continue end -- Are we too low?
    if mo.z > fof.topheight continue end -- Are we too high?

    -- Check for whatever else you may want to    

    EV_CrumbleChain(fof) -- Crumble
  end
end

addHook("PlayerThink", function(player)
	local mo = player.mo
	local me = player
	
	if mo.skin ~= "talez" return end
	
	if mo and mo.valid
	and player.playerstate == PST_LIVE
	and (player.cmd.buttons & BT_CUSTOM1)
	and not player.powers[pw_carry]
	and not (player.pflags & PF_SLIDING)
	and not player.knuxexiting
	and not me.drilled
	and not (me.exiting)
	and not P_IsObjectOnGround(mo)
	and not (player.prevc1)
	and mo.state ~= S_PLAY_CLING 
	and mo.state ~= S_PLAY_CLIMB
	and not P_PlayerInPain(player)
		player.drilled = true
		mo.state = S_TALEZ_DIGDOWN1
		S_StartSound(mo, sfx_zoom)
	end
	if player.drilled
	and (mo.eflags & MFE_GOOWATER)
	or player.drilled
	and player.powers[pw_carry]
	or player.drilled
	and player.playerstate == PST_DEAD
	or player.drilled
	and P_PlayerInPain(player)
		player.drilled = false
		//PRINT("AUGHHHHHHHHHH")
	end
	if player.drilled
	and not (mo.eflags & MFE_SPRUNG)
		P_SpawnGhostMobj(mo)
		player.pflags = $|PF_THOKKED
		player.pflags = $ & ~PF_GLIDING
		player.doublejumped = true
		player.momentumthokus = true
	end
	if player.drilled
	and not (mo.eflags & MFE_GOOWATER)
	and not (mo.eflags & MFE_SPRUNG)
		P_SetObjectMomZ(mo, -35*FRACUNIT)
	end
	if player.drilled
	and (mo.eflags & MFE_JUSTHITFLOOR or P_IsObjectOnGround(mo))
	and not (player.cmd.buttons & BT_JUMP)
		player.drilled = false
		player.digging = true
		S_StartSound(mo, sfx_s3k4c)
	end 
	if player.drilled
	and (mo.eflags & MFE_JUSTHITFLOOR or P_IsObjectOnGround(mo))
	and (player.cmd.buttons & BT_JUMP)
		player.drilled = false
		P_SetObjectMomZ(mo, 6*FRACUNIT)
		mo.state = S_PLAY_SPRING
		P_StartQuake(11, 11)
		S_StartSound(mo, sfx_s3k5f)
		CheckAndCrumble(mo, mo.subsector.sector)
		player.pflags = $ & ~PF_THOKKED
	end
	if player.digtime == 0
		P_SetObjectMomZ(mo, 7*FRACUNIT)
		mo.state = S_PLAY_FALL
		kncuklesresetdig(player)
		S_StartSound(mo, sfx_s3k51)
	end
	if player.digging
	and player.speed >= 6*FRACUNIT
	and leveltime%4 == 0
		local rxy = P_RandomRange(-10, 10)*FRACUNIT
		local ground = P_SpawnMobj(mo.x+rxy, mo.y+rxy, mo.z, MT_MINUSDIRT)
		if not S_SoundPlaying(mo, sfx_s3kd3l)
			S_StartSound(mo, sfx_s3kd3l)
		end	
		if mo.eflags & MFE_VERTICALFLIP
			ground.eflags = $|MFE_VERTICALFLIP
			ground.flags2 = $|MF2_OBJECTFLIP
		else
			ground.eflags = $ & ~MFE_VERTICALFLIP
			ground.flags2 = $ & ~MF2_OBJECTFLIP
		end
	end
	if player.digging
	and (player.cmd.buttons & BT_CUSTOM1)
	and not (player.prevc1)
		P_SetObjectMomZ(mo, 22*FRACUNIT)
		S_StartSound(mo, sfx_crumbl)
		mo.state = S_TALEZ_DIGUP1
		kncuklesresetdig(player)
		player.pflags = $|PF_JUMPED
		player.pflags = $ & ~PF_THOKKED
		player.doublejumped = false
		player.momentumthokus = false
		player.knuxexiting = true
	end
	if mo.state >= S_TALEZ_DIGUP1
	and mo.momz <= 0
	and not (mo.eflags & MFE_VERTICALFLIP)
		player.knuxexiting = false
		mo.state = S_PLAY_FALL
	end
	if mo.state >= S_TALEZ_DIGUP1
	and mo.momz >= 0
	and (mo.eflags & MFE_VERTICALFLIP)
		player.knuxexiting = false
		mo.state = S_PLAY_FALL
	end
	if mo.sprite ~= SPR_KDRB
		player.knuxexiting = false
	end
end)

//the other checks
addHook("PlayerThink", function(player)
	if player.digging
		player.digtime = $1-1
		player.height = P_GetPlayerSpinHeight(player)
		player.pflags = $|PF_INVIS
		player.pflags = $|PF_THOKKED
		player.pflags = $|PF_GODMODE
		player.pflags = $ & ~PF_SPINNING
		player.charability2 = CA2_NONE
		player.charflags = $|SF_NOSKID
		player.mo.flags2 = $|MF2_DONTDRAW
		player.mo.flags = $|MF_NOCLIPTHING
		player.shieldscale = 0
	end
	if player.digging
	and not P_IsObjectOnGround(player.mo)
		player.digging = false
		player.mo.state = S_PLAY_FALL
		kncuklesresetdig(player)
		player.pflags = $|PF_JUMPED
		S_StartSound(player.mo, sfx_s3k51)
		if S_SoundPlaying(player.mo, sfx_jump)
			S_StopSoundByID(player.mo, sfx_jump)
		end
	end
	if player.digging
	and P_PlayerInPain(player)
		player.digging = false
	end
	if (player.drilled or player.mo.state >= S_TALEZ_DIGUP1)
	and (player.mo.eflags & MFE_SPRUNG)
		player.drilled = false
		S_StartSound(player.mo, sfx_sprong)
		player.mo.momz = $*5/4
		player.pflags = $ & ~PF_THOKKED
	end
	if S_SoundPlaying(player.mo, sfx_s3kd3l)
	and not player.digging 
	or S_SoundPlaying(player.mo, sfx_s3kd3l) 
	and player.speed < 6*FRACUNIT
		S_StopSoundByID(player.mo, sfx_s3kd3l)
	end
	if player.drilled
	and player.mo.sprite ~= SPR_KDRA
		player.mo.state = S_TALEZ_DIGDOWN1
	end
	if not player.digging
		player.digtime = $1+1
	end
	if player.digtime > 162
		player.digtime = 162
	end
end)

addHook("PlayerCanDamage", function(player)
	local mo = player.mo
	if mo.state >= S_TALEZ_DIGUP1
		return true
	end
end)

addHook("PlayerSpawn", function(player)
	if player.mo.skin == "talez"
		kncuklesresetdig(player)
		player.digtime = 162
		player.digging = false
	end
end)

addHook("PlayerThink", function(player)
	local me = player
	local mo = player.mo
	
	if not mo and mo.valid return end
	if mo.skin ~= "talez" return end
	
	if (me.exiting)
	and me.digging
		me.diging = false
		S_StartSound(mo, sfx_jump)
		P_SetObjectMomZ(mo, 7*FRACUNIT)
		knucklesresetdig(player)
		mo.state = S_PLAY_SPRING
	end
end)


//button checks I made
local function buttonchecks(player)
	player.prevspin = player.cmd.buttons & BT_SPIN
	player.prevuse = player.cmd.buttons & BT_USE
	player.prevjump = player.cmd.buttons & BT_JUMP
	player.prevc1 = player.cmd.buttons & BT_CUSTOM1
	player.prevc2 = player.cmd.buttons & BT_CUSTOM2
	player.prevc3 = player.cmd.buttons & BT_CUSTOM3
	player.prevtf = player.cmd.buttons & BT_TOSSFLAG
end

addHook("PlayerThink", buttonchecks)

local function dighud(v, player)
if displayplayer.mo.skin ~= "talez" then return end
	if player.mo.valid
	and player.dashspeed == 0
	and player.powers[pw_tailsfly] == 0
		v.drawFill(150,pos - 1, 164, 12, 31)
		 v.drawFill(151,pos, player.digtime, 10, skincolors[player.skincolor].ramp[5]) 
		 v.drawString(220,pos +1,player.digtime,YELLOWMAP,"left")
		v.drawString(185,pos +1,"DIG TIME:",YELLOWMAP,"center")
		end
	end
	
hud.add(dighud, "game")

local function talezthicc(p)
if p.mo.skin == "talez"
	if p.jt == nil then
		p.jt = 0
		p.jp = false
		p.sp = false
		p.tk = false
		p.tr = false
	end
	if p.jt > 0 then
		p.jt = p.jt - 1
	end
	if p.jt < 0 then
		p.jt = p.jt + 1
	end
	if p.mo.momz < 1 then
		p.jp = false
	end
	if p.mo.state != S_PLAY_CLIMB and p.mo.eflags != p.mo.eflags | MFE_GOOWATER then
		if p.mo.momz > 0 and p.jp == false and p.mo.state != S_PLAY_FLY and p.mo.state != S_PLAY_SWIM and p.mo.state != S_PLAY_FLY_TIRED and p.mo.state != S_PLAY_WALK and p.mo.state != S_PLAY_RUN and p.mo.state != S_PLAY_WALK and p.mo.state != S_PLAY_BOUNCE_LANDING then
			p.jp = true
			p.jt = 5
		end
		if p.mo.momz > 0 and p.jt < 0 and p.mo.state != S_PLAY_FLY and p.mo.state != S_PLAY_SWIM and p.mo.state != S_PLAY_FLY_TIRED and p.mo.state != S_PLAY_WALK and p.mo.state != S_PLAY_RUN and p.mo.state != S_PLAY_WALK and p.mo.state != S_PLAY_BOUNCE_LANDING then
			p.jp = true
			p.jt = 5
		end
	elseif p.mo.eflags == p.mo.eflags | MFE_GOOWATER
		p.jp = true
	end
	if p.mo.state == S_PLAY_BOUNCE_LANDING then
		p.jt = -5
	end
	/*
	if p.pflags != p.pflags | PF_SPINNING or p.pflags == p.pflags | PF_JUMPED then
		p.sp = false
	end
	if p.pflags == p.pflags | PF_SPINNING and p.pflags != p.pflags | PF_JUMPED and p.sp == false and p.jt < 1 then
		p.sp = true
		p.jt = -5
	end
	*/
	if p.pflags != p.pflags | PF_THOKKED then
		p.tk = false
	end
	if p.pflags == p.pflags | PF_THOKKED and p.tk == false then
		p.tk = true
		p.jt = 5
	end
	if p.mo.state != S_PLAY_FLY_TIRED then
		p.tr = false
	end
	if p.mo.state == S_PLAY_FLY_TIRED and p.tr == false then
		p.tr = true
		p.jt = 5
	end
	p.maths = p.jt*FRACUNIT
	p.maths = p.maths / 10
	p.mo.spriteyscale = p.maths + FRACUNIT
	
	p.maths = p.jt*p.spinheight
	if p.mo.state != S_PLAY_ROLL then
		p.maths = p.jt*p.height
	end
	p.maths = p.maths / 20
	p.mo.spriteyoffset = -1*p.maths
	
	p.maths = p.jt*FRACUNIT
	p.maths = p.maths / 10
	p.maths = p.maths*-1
	p.mo.spritexscale = p.maths + FRACUNIT
end
end
addHook("PlayerThink", talezthicc)