addHook("ThinkFrame", do for player in players.iterate
	if player.mo and player.mo.skin != "taz" then return end
	if player.panim != PA_PAIN
	and player.playerstate != PST_DEAD
	and player.tazquished != true then
//Wall Bounce
		if player.wallbounce == true then
			player.mo.momx = player.wallmomx
			player.mo.momy = player.wallmomy
			player.mo.state = S_TRIPLETSPIN
			P_BounceMove(player.mo)
			S_StartSound(player.mo, sfx_s3k7b)
			player.wallbounce = false
			player.weapondelay = TICRATE/2
		end
//"Dash Mode"
		if player.tashnado == true then
			if P_IsObjectOnGround(player.mo) then
				if player.tazhold == 1 then
					if not (player.pflags & PF_SPINDOWN) 
					and player.speed < FRACUNIT*41 then
						if player.mo.state == S_TASH
						or player.mo.state == S_TAZ1 then
							player.mo.state = S_TAZ0
						end
					end
				end
				if player.cmd.forwardmove == 0
				and player.cmd.sidemove == 0
				and not (player.powers[pw_carry]) then
					player.normalspeed = FRACUNIT*36
					if player.speed == 0 then
						if player.mo.state == S_TASH 
						or player.mo.state == S_TAZ1 then
							player.mo.state = S_TAZ0
							player.tashnado = false
						end
					end
				end
				if player.mo.state == S_PLAY_SKID
				or player.mo.state == S_PLAY_WALK
				or player.mo.state == S_PLAY_RUN
				or player.mo.state == S_PLAY_STND then
					if player.powers[pw_carry] != CR_MINECART
					and player.powers[pw_carry] != CR_ROLLOUT then
						if player.mo.eflags & MFE_JUSTHITFLOOR then
							if ((player.cmd.forwardmove == 0
							and player.cmd.sidemove == 0)
							or (player.tazhold == 1
							and not (player.pflags & PF_SPINDOWN))) then
								player.mo.state = S_PLAY_WALK
								player.tashnado = false
							elseif player.mo.state != S_TAZ1 then 
								S_StartSound(player.mo, sfx_tnado)
								if player.farted == true 
								and player.zok != true then
									player.mo.state = S_TAZ1
								else
									player.mo.state = S_TASH
								end
							end
						else
							if not (player.tazhold == 1 
							and not (player.pflags & PF_SPINDOWN)) then
								player.mo.state = S_TAZ1
								S_StartSound(player.mo, sfx_tnado)
							end
						end
					end
				end
			else
				if player.pflags & PF_SPINNING then
					player.pflags = $&~PF_SPINNING
					player.mo.state = S_TASH
				end
			end
			if (P_IsObjectOnGround(player.mo) or player.cmd.buttons & BT_JUMP)
			and player.panim != PA_IDLE
			and player.mo.state != S_PLAY_WALK
			and player.mo.state != S_PLAY_SKID
			and player.mo.state != S_PLAY_RIDE
			and player.speed >= FRACUNIT*30
			and player.tazwall != true
			and not (player.pflags & PF_SPINNING) 
				player.charability = CA_JUMPBOOST
				if player.powers[pw_super] then
					player.jumpfactor = FRACUNIT*2/5
				else
					player.jumpfactor = FRACUNIT*19/40
				end
			else 
				player.charability = CA_TWINSPIN
				player.jumpfactor = FRACUNIT
			end
		elseif player.normalspeed != FRACUNIT*30 then
			player.charability = CA_TWINSPIN
			player.jumpfactor = FRACUNIT
			if player.mo.state != S_TAZ0 then
				player.normalspeed = FRACUNIT*30
			end
		end
//Misc
		if player.tazlide != 0 then
			if player.tazlide == 2 then
				if player.mo.state != S_TAZGAP then
					player.mo.state = S_TAZGAP
				end
			elseif player.mo.state != S_TAZSKATE then
				player.mo.state = S_TAZSKATE
			end
		elseif player.powers[pw_carry] == CR_PTERABYTE then
			if player.mo.state != S_PLAY_WAIT then
				player.mo.state = S_PLAY_WAIT
				if player.tashnado == true then
					player.tashnado = false
				end
			end
		elseif player.powers[pw_carry] == CR_MINECART then
			if player.cmd.sidemove == 0 
			and player.mo.state != S_TAZMINECART then
				player.mo.state = S_TAZMINECART
			elseif player.cmd.sidemove > 0 then
				player.mo.state = S_TAZMINECARTR
			elseif player.cmd.sidemove < 0 then
				player.mo.state = S_TAZMINECARTL
			end
		end
//Shields
		if player.powers[pw_shield] == SH_NONE then return end
//Fire Shield
		if player.powers[pw_shield] == SH_FLAMEAURA then
			if player.tazfire != true then
				player.tazfire = true
			end
			if P_IsObjectOnGround(player.mo) then
				if player.shieldscale != 0 then
					player.shieldscale = 0
				elseif player.mo.state == S_TAZFIRESHIELD then
					local tsmk = P_SpawnMobj(player.mo.x, player.mo.y, player.mo.z+30*FRACUNIT, MT_TAZSMOKE)
					tsmk.momx = P_RandomRange(-4, 4)*FRACUNIT
					tsmk.momy = P_RandomRange(-4, 4)*FRACUNIT
					tsmk.momz = P_RandomRange(-4, 4)*FRACUNIT
					if player.cmd.forwardmove != 0
					or player.cmd.sidemove != 0 then
						player.mo.state = S_PLAY_WALK
					end
				elseif player.cmd.forwardmove == 0
				and player.cmd.sidemove == 0
				and player.speed == 0 
				and not (player.pflags & PF_STARTDASH)then
					player.mo.state = S_TAZFIRESHIELD
				end
			elseif not player.tossdelay then
				player.tossdelay = TICRATE/10
				local tsmk = P_SpawnMobj(player.mo.x, player.mo.y, player.mo.z+30*FRACUNIT, MT_TAZSMOKE)
				tsmk.momx = P_RandomRange(-4, 4)*FRACUNIT
				tsmk.momy = P_RandomRange(-4, 4)*FRACUNIT
				tsmk.momz = P_RandomRange(-4, 4)*FRACUNIT
				if not (player.mo.eflags & MFE_UNDERWATER) then
					player.tossdelay = TICRATE/10
				end
			elseif player.mo.eflags & MFE_UNDERWATER then
				P_FlashPal(player, PAL_NUKE, TICRATE/10)
				P_RemoveShield(player)
				player.tazfire = false
				S_StartSound(player.mo, sfx_splash)
				S_StartSound(player.mo, sfx_s3k4b)
			end
		elseif (player.powers[pw_shield] & SH_STACK) then
			P_RemoveShield(player)
			player.powers[pw_shield] = SH_FLAMEAURA
			player.tazfire = true
			player.mo.color = player.skincolor
		end
	end
end
end)

addHook("PlayerThink", function(p)
	if not(p.mo and p.mo.valid) then return end
//Bubblegum Powerup
	if p.powers[pw_shield] == SH_TGUM then
		if p.gumw != true then
			if p.gum != true then
				p.tossdelay = TICRATE*3
			elseif P_IsObjectOnGround(p.mo) then
				if p.gum != false
				or p.gump != false then
					p.gum = false		
					p.gump = false
				end
			end
		end
	end
//Tashnado
	if p.mo.skin != "taz" then return end
	if p.tashnado == true then
		if p.normalspeed < FRACUNIT*40 then
			if p.pflags & PF_SPINNING 
			or p.powers[pw_super]
			or p.powers[pw_sneakers] then
				p.normalspeed = FRACUNIT*36
			elseif p.normalspeed < FRACUNIT*36 then
				p.normalspeed = p.normalspeed + FRACUNIT/2
			elseif p.mo.state != S_TAZ1 then
				p.normalspeed = p.normalspeed + FRACUNIT/2
			end
		end
		if p.powers[pw_carry] then
			if p.zok != false then
				p.zok = false
			end
		end
	end
//States misc stuff
	if p.mo.state == S_TASH 
	or p.mo.state == S_TAZ1
	or p.mo.state == S_TAZ0
	or p.mo.state == S_TAZTHOK
	or p.mo.state == S_TAZFLOAT
	or p.mo.state == S_SPINTWIN
	or p.mo.state == S_TRIPLETSPIN
	or p.mo.state == S_PLAY_TWINSPIN then
		if p.tazwanted != true then
			p.tazwanted = true
			p.height = FRACUNIT*55
		end
	elseif p.tazwanted != false then
		p.tazwanted = false
		p.height = FRACUNIT*48
	elseif p.tazlide != 0 then
		p.height = FRACUNIT*32
		p.pflags = $|PF_FULLSTASIS
		if p.tazlide == 1 then
			p.mo.friction = FRACUNIT/45*44
		end
		if p.tazquished != true
		and ((p.speed <= FRACUNIT*8
		and P_IsObjectOnGround(p.mo))
		or p.powers[pw_carry]) then
			p.tashnado = false
			p.mo.state = S_PLAY_STND
			p.tazlide = 0
			p.height = FRACUNIT*48
		end
	elseif p.mo.state == S_TAZSPIT then 
		p.drawangle = p.mo.angle
	elseif p.mo.state == S_TAZCRUSHED then
		p.height = FRACUNIT*32
	elseif p.panim == PA_PAIN then 
		if P_IsObjectOnGround(p.mo) then
			if p.spinheight != FRACUNIT*32 then
				p.tashnado = false
				p.spinheight = FRACUNIT*32
			end
		elseif p.spinheight != FRACUNIT*55 then
			p.spinheight = FRACUNIT*55
		end
	elseif p.mo.state == S_TAZDROWN then
		p.pflags = $|PF_FULLSTASIS
		if not p.tossdelay 
		and not p.weapondelay then
			local tzbb = P_SpawnMobj(p.mo.x, p.mo.y, p.mo.z, MT_TMQUIL)
			tzbb.momx = P_RandomRange(-4, 4)*FRACUNIT
			tzbb.momy = P_RandomRange(-4, 4)*FRACUNIT
			tzbb.momz = P_RandomRange(5, 8)*FRACUNIT
			tzbb.state = S_DRIPB1
			tzbb.fuse = TICRATE
			p.tossdelay = TICRATE/4
		end
		if p.cmd.forwardmove != 0
		or p.cmd.sidemove != 0 
		or p.mo.eflags & MFE_UNDERWATER then
			p.mo.state = S_PLAY_STND
		end
	elseif p.mo.state == S_TAZDROWN2 then
		p.drowned = false
		if p.mo.speed != 0 then
			p.mo.state = S_PLAY_WALK
		end
	end
//Spin/Dash
	if (p.speed <= 1
	or p.mo.standingslope)
	and p.mo.state != S_PLAY_WALK 
	and p.mo.state != S_PLAY_RUN
	and p.mo.state != S_PLAY_SKID then
		if p.charability2 != CA2_SPINDASH
		and p.tazlide == 0
		and p.tazquished != true then
			p.charability2 = CA2_SPINDASH
		end
	elseif p.charability2 != CA2_NONE then
		p.charability2 = CA2_NONE
	end
//C1: Bite and spit
	if p.cmd.buttons & BT_CUSTOM1 then
		if p.thatwasall == true then return end
		if not p.hungry then
			p.hungry = true
		end
		if p.playerstate != PST_DEAD
		and p.panim != PA_PAIN 
		and not p.powers[pw_flashing]
		and not p.powers[pw_carry] 
		and p.tazlide == 0
		and p.mo.state != S_PLAY_GASP
		and p.holdin1 != true then
			if P_IsObjectOnGround(p.mo) 
			and not p.weapondelay then
				P_SetObjectMomZ(p.mo, FRACUNIT/2*5, false) 
			end
			if p.powers[pw_shield] == SH_FLAMEAURA
			or ((p.powers[pw_shield] & SH_FORCE)
			and (p.powers[pw_shield] & SH_FORCEHP)) then
				p.holdin1 = true
				p.pflags = $&~PF_SPINNING
				if not p.weapondelay then
					p.drawangle = p.mo.angle
					p.mo.state = S_TAZSPIT
					p.hungry = true
					p.weapondelay = TICRATE
					S_StartSound(p.mo, sfx_tspt)
					S_StopSoundByID(p.mo, sfx_tasty)
					S_StopSoundByID(p.mo, sfx_taste)
					S_StopSoundByID(p.mo, sfx_tast2)
					if p.powers[pw_shield] == SH_FLAMEAURA then
						local spit = P_SPMAngle(p.mo, MT_TAZROCK, p.mo.angle, 0)
						spit.type = MT_FIREBALL
						spit.state = spit.info.spawnstate
						spit.type = MT_TAZROCK
						spit.fuse = TICRATE*7
						S_StartSound(p.mo, sfx_chili)
					elseif (p.powers[pw_shield] & SH_FORCEHP) then
						local spit = P_SPMAngle(p.mo, MT_TAZROCK, p.mo.angle, 0)
						spit.fuse = TICRATE*7
					end
				end
			elseif p.hungry == true then
				p.holdin1 = true
				S_StartSound(p.mo, sfx_tzbt)
				if P_IsObjectOnGround(p.mo) then
					p.pflags = $&~PF_SPINNING
					p.mo.state = S_TAZBITEG
				elseif p.mo.state != S_TAZFLOAT 
				and p.mo.state != S_PLAY_TWINSPIN 
				and p.mo.state != S_SPINTWIN 
				and p.mo.state != S_TAZBITEG then
					p.mo.state = S_TAZBITE
				end
			elseif not p.weapondelay then
				S_StartSound(p.mo, sfx_tspt)
				S_StopSoundByID(p.mo, sfx_tasty)
				S_StopSoundByID(p.mo, sfx_taste)
				S_StopSoundByID(p.mo, sfx_tast2)
				p.holdin1 = true
				p.pflags = $&~PF_SPINNING
				p.mo.state = S_TAZSPIT
				if p.hungry == 1 then
					local spit = P_SPMAngle(p.mo, MT_TAZSPITTLE, p.mo.angle, 0)
					spit.fuse = TICRATE*7
					p.hungry = true
				elseif p.hungry == 2 then
					local spit = P_SPMAngle(p.mo, MT_TAZSPITTLE2, p.mo.angle, 0)
					spit.fuse = TICRATE*7
					p.hungry = true
				elseif p.hungry == 3 then
					P_SPMAngle(p.mo, MT_SHELL, p.mo.angle, 0)
					p.hungry = true
				elseif p.hungry == 4 then
					local spit = P_SPMAngle(p.mo, MT_TAZSPITTLE2, p.mo.angle, 0)
					spit.type = p.food
					spit.state = spit.info.spawnstate
					spit.type = MT_TAZSPITTLE2
					spit.fuse = TICRATE*7
					p.hungry = true
				elseif p.hungry == 5 then
					local spit = P_SPMAngle(p.mo, MT_TAZSPITTLE2, p.mo.angle, 0)
					spit.state = S_TWDB
					spit.fuse = TICRATE*7
					p.hungry = true
				elseif p.hungry == 6 then
					local spit = P_SPMAngle(p.mo, MT_TAZSPITTLE2, p.mo.angle, 0)
					spit.colorized = true
					spit.fuse = TICRATE*7
					spit.state = S_TWDB
					spit.color = SKINCOLOR_PLUM
					p.hungry = true
				elseif p.hungry == 7 then
					local spit = P_SPMAngle(p.mo, MT_TAZSPITTLE2, p.mo.angle, 0)
					spit.fuse = TICRATE*7
					spit.state = S_TWDB2
					p.hungry = true
				elseif p.hungry == 8 then
					local spit = P_SPMAngle(p.mo, MT_TAZSPITTLE, p.mo.angle, 0)
					spit.type = p.food
					spit.state = spit.info.spawnstate
					spit.fuse = TICRATE*7
					p.hungry = true
				elseif p.hungry == 9 then
					local spit = P_SPMAngle(p.mo, MT_TAZSPITTLE, p.mo.angle, 0)
					spit.type = p.food
					spit.state = spit.info.spawnstate
					spit.fuse = TICRATE*7
					spit.spritexscale = FRACUNIT*2
					spit.spriteyscale = FRACUNIT*2
					spit.color = SKINCOLOR_RED
					p.hungry = true
				elseif p.hungry == 10 then
					local spit = P_SPMAngle(p.mo, MT_TAZSPITTLE, p.mo.angle, 0)
					spit.type = p.food
					spit.state = spit.info.spawnstate
					spit.fuse = TICRATE*7
					spit.spritexscale = FRACUNIT*2
					spit.spriteyscale = FRACUNIT*2
					spit.color = SKINCOLOR_BLUE
					p.hungry = true
				elseif p.hungry == 11 then
					local spit = P_SPMAngle(p.mo, MT_TAZROCK, p.mo.angle, 0)
					spit.type = p.food
					spit.state = spit.info.spawnstate
					spit.type = MT_TAZROCK
					spit.fuse = TICRATE*7
					spit.spritexscale = FRACUNIT*2
					spit.spriteyscale = FRACUNIT*2
					p.hungry = true
				elseif p.hungry == 12 then
					local spit = P_SPMAngle(p.mo, MT_TAZROCK, p.mo.angle, 0)
					spit.type = p.food
					spit.state = spit.info.spawnstate
					spit.type = MT_TAZROCK
					spit.fuse = TICRATE*7
					p.hungry = true
				end
			end
		end
	elseif p.holdin1 == true then
		p.holdin1 = false
//C2: Skate/Tackle/Gum Spawn
	elseif p.cmd.buttons & BT_CUSTOM2 
	or (p.cmd.buttons & BT_ATTACK and p.tazbt == 1)
	or (p.cmd.buttons & BT_FIRENORMAL and p.tazbt == 2) then
		if p.tazlide == 0 
		and p.mo.state != S_PLAY_GASP
		and p.mo.state != S_TAZTHOK
		and p.panim != PA_PAIN 
		and not p.powers[pw_carry] 
		and p.holdin2 != true then
			if P_IsObjectOnGround(p.mo) then
				p.holdin2 = true
				if p.tashnado != true 
				and p.speed > FRACUNIT then
					p.mo.z = p.mo.z+FRACUNIT
					P_SetObjectMomZ(p.mo, FRACUNIT*2, false)
					p.mo.momx = p.mo.momx/4*5
					p.mo.momy = p.mo.momy/4*5
					S_StartSound(p.mo, sfx_skate)
					p.mo.state = S_TAZSKATE
					p.tazlide = 1
					p.tashnado = false
				elseif p.speed > FRACUNIT*8 then
					S_StartSound(p.mo, sfx_skate)
					p.mo.state = S_TAZSKATE
					p.tazlide = 1
					p.tashnado = false
				elseif p.speed < FRACUNIT then
					if p.rings >= 50 then
						if (p.mo.state == S_PLAY_STND
						or p.mo.state == S_PLAY_WAIT)
						and not p.weapondelay then
							P_SPMAngle(p.mo, MT_GUMSPAWN, p.mo.angle, 0)
							p.rings = $-10
							p.weapondelay = TICRATE
						end
					end
				end
			elseif p.speed > FRACUNIT then
				p.mo.state = S_TAZGAP
				p.tashnado = false
				p.tazlide = 2
				p.holdin2 = true
			end
		end
	elseif p.holdin2 == true then
		p.holdin2 = false
	end
//Squish
	if p.tazquished == true then
		if not p.tazquishing then
			p.tazquishing = 0
		end
		p.pflags = $|PF_FULLSTASIS
		p.pflags = $&~PF_SPINNING
		p.tazquishing = p.tazquishing + FRACUNIT
		if p.crashed == true then
			if not P_IsObjectOnGround(p.mo) then
				p.mo.state = S_TAZCRASHED
				p.weapondelay = TICRATE
			elseif p.mo.state != S_TAZCRUSHED 
			and p.weapondelay then
				p.mo.state = S_TAZCRUSHED
			end
		end
		if p.mo.state != S_TAZCRUSHED
		and p.mo.state != S_TAZCRASHED
		and not p.weapondelay then
			if p.crashed != true then
				p.powers[pw_flashing] = TICRATE
				p.crashed = false
				p.mo.state = S_PLAY_STND
				p.tazquished = false
				p.tazquishing = FRACUNIT
				p.mo.flags = $&~MF_NOCLIPTHING
				p.pflags = $&~PF_SPINNING
				p.height = FRACUNIT*48
			else
				p.crashed = false
				p.mo.state = S_PLAY_STND
				p.tazquished = false
				p.tazquishing = FRACUNIT
				p.mo.flags = $&~MF_NOCLIPTHING
				p.pflags = $&~PF_SPINNING
				p.height = FRACUNIT*48
			end
		end
	end
//Bust Walls
	if p.tazwanted == true
	or p.mo.state == S_PLAY_SPINDASH
	or p.mo.state == S_PLAY_ROLL 
	or p.tazlide != 0 then
		p.charflags = $|SF_CANBUSTWALLS
	else
		p.charflags = $&~SF_CANBUSTWALLS
	end
//Run Dust by KirbTheKorb, TY Kirb!
	if (p.mo.state == S_TASH
	or p.mo.state == S_TAZ1
	or p.mo.state == S_TAZ0
	or p.mo.state == S_TAZTHOK
	or p.pflags & PF_SPINNING) then
		if not (p.pflags & PF_STARTDASH) then
			local g = P_SpawnGhostMobj(p.mo)
			g.fuse = TICRATE/11
		end
		if p.mo.state != S_TAZTHOK then
			if p.mo.eflags & MFE_TOUCHLAVA then
				local pabloo = P_SpawnMobjFromMobj(p.realmo, P_RandomRange(-10, 10)*FRACUNIT, P_RandomRange(-10, 10)*FRACUNIT, 0, MT_LAVASPLISH)
				pabloo.momx = P_RandomRange(-4, 4)*FRACUNIT
				pabloo.momy = P_RandomRange(-4, 4)*FRACUNIT
				pabloo.momz = P_RandomRange(0, 1)*FRACUNIT
			elseif p.mo.eflags & MFE_UNDERWATER
			or p.mo.eflags & MFE_TOUCHWATER then
				local pabloo = P_SpawnMobjFromMobj(p.realmo, P_RandomRange(-10, 10)*FRACUNIT, P_RandomRange(-10, 10)*FRACUNIT, 0, MT_SMALLBUBBLE)
				pabloo.momx = P_RandomRange(-4, 4)*FRACUNIT
				pabloo.momy = P_RandomRange(-4, 4)*FRACUNIT
				pabloo.momz = P_RandomRange(0, 4)*FRACUNIT
				pabloo.scale = FRACUNIT/2*3
				pabloo.destscale = FRACUNIT*2
			else
				local pabloo = P_SpawnMobjFromMobj(p.realmo, P_RandomRange(-10, 10)*FRACUNIT, P_RandomRange(-10, 10)*FRACUNIT, 0, MT_DUST)
				pabloo.momx = P_RandomRange(-4, 4)*FRACUNIT
				pabloo.momy = P_RandomRange(-4, 4)*FRACUNIT
				pabloo.momz = P_RandomRange(0, 4)*FRACUNIT
				pabloo.destscale = FRACUNIT*4
			end
		end
	end
//Resets
	if P_IsObjectOnGround(p.mo) then
		if p.farted != false 
		or p.tazwall != false then
			p.farted = false
			p.wallbounces = 0
			p.laztwall = nil
			p.tazwall = false
			p.zok = false
			p.coyotet = true
			p.floated = false
			p.shieldused = false
		end
		if p.charflags & SF_STOMPDAMAGE then
			p.charflags = $&~SF_STOMPDAMAGE
		end
		if p.mo.eflags & MFE_SPRUNG then
			if p.tazlide != 0 then
				p.tazlide = 0
				p.mo.state = S_PLAY_WALK
				p.height = FRACUNIT*48
			end
		end
//Spin Control by Tempest97, TY Krimps!
		if p.pflags & PF_SPINNING
		and not (p.pflags & PF_STARTDASH)
		and not (p.mo.flags2 & MF2_TWOD) then
			if p.cmd.forwardmove ~= 0
			or p.cmd.sidemove ~= 0
			or p.camangle == nil
			or p.mo.eflags & MFE_SPRUNG then
				p.camangle = p.cmd.angleturn<<16 + R_PointToAngle2(0, 0, p.cmd.forwardmove*FRACUNIT, -p.cmd.sidemove<<16)
			end
			if p.ghostnado == true then
				P_SpawnGhostMobj(p.mo)
				p.ghostnado = false
			end
			p.movespd = R_PointToDist2(p.mo.x, p.mo.y, p.mo.x + p.mo.momx, p.mo.y + p.mo.momy)
			P_InstaThrust(p.mo,R_PointToAngle2(p.mo.x - p.mo.momx,p.mo.y - p.mo.momy,p.mo.x + P_ReturnThrustX(p.mo,p.camangle,p.movespd),p.mo.y + P_ReturnThrustY(p.mo,p.camangle,p.movespd)),p.movespd)
		else
			p.camangle = nil
		end	
	else
//No Ground
		if p.mo.eflags & MFE_SPRUNG then
			p.charflags = $|SF_STOMPDAMAGE
			p.farted = true
			p.coyotet = false
			p.tazlide = 0
			p.mo.state = S_PLAY_SPRING
			p.height = FRACUNIT*48
		elseif p.pflags & PF_SPINNING then
			p.pflags = $&~PF_SPINNING
			p.mo.state = S_TASH
		elseif p.mo.state == S_TRIPLETSPIN then
			P_SpawnGhostMobj(p.mo)
		elseif p.mo.state == S_TAZFLOAT then
			if p.weapondelay 
			and p.floated == true then
				P_SetObjectMomZ(p.mo, FRACUNIT, false)
			end
		elseif S_SoundPlaying(p.mo, sfx_tnado) then
			S_StopSoundByID(p.mo, sfx_tnado)
		elseif (p.mo.state == S_PLAY_WALK or p.mo.state == S_PLAY_RUN)
		and not (p.powers[pw_carry]) 
		and not (p.mo.eflags & MFE_JUSTSTEPPEDDOWN) then
			p.mo.state = S_PLAY_FALL
		elseif p.mo.state == S_PLAY_WAIT 
		and not p.powers[pw_carry] then
			p.mo.state = S_PLAY_FALL
		end
	end
//Misc
	if p.powers[pw_carry] == CR_ZOOMTUBE then
		p.mo.state = S_TAZGAP
		if p.tashnado == true then
			p.tashnado = false
			S_StartSound(p.mo, sfx_fart)
			p.mo.state = S_TAZGAP
		end
	end
//Shields
	if p.powers[pw_shield] == SH_NONE then return end
//Armageddon
	if p.powers[pw_shield] == SH_ARMAGEDDON then
		local tzbb = P_SpawnMobj(p.mo.x, p.mo.y, p.mo.z+30, MT_TAZBUBBLES)
		tzbb.momx = P_RandomRange(-4, 4)*FRACUNIT
		tzbb.momy = P_RandomRange(-4, 4)*FRACUNIT
		tzbb.momz = P_RandomRange(0, 4)*FRACUNIT
		tzbb.destscale = FRACUNIT/2*3
		if not S_SoundPlaying(p.mo, sfx_brpb) then
			S_StartSound(p.mo, sfx_brpb)
		end
		if S_SoundPlaying(p.mo, sfx_armasg) then
			S_StopSoundByID(p.mo, sfx_armasg)
			S_StartSound(p.mo, sfx_burpc)
		end
//Attract shield
	elseif p.powers[pw_shield] == SH_ATTRACT then
		if not p.tossdelay then
			local tzbb = P_SpawnMobj(p.mo.x, p.mo.y, p.mo.z+30*FRACUNIT, MT_TAZBUBBLES)
			tzbb.state = S_WATERZAP
			tzbb.frame = $&FF_TRANS10|FF_ADD|FF_FULLBRIGHT
			tzbb.momx = P_RandomRange(-9, 9)*FRACUNIT
			tzbb.momy = P_RandomRange(-9, 9)*FRACUNIT
			tzbb.momz = P_RandomRange(-9, 9)*FRACUNIT
			tzbb.destscale = FRACUNIT/2*3
			p.tossdelay = TICRATE/5
			if P_RandomChance(FRACUNIT/2) then
				tzbb.mirrored = true
			end
		end
//Elemental shield
	elseif p.powers[pw_shield] == SH_ELEMENTAL then
		local tzbb = P_SpawnMobj(p.mo.x, p.mo.y, p.mo.z+30, MT_TAZBUBBLES)
		tzbb.color = SKINCOLOR_TAN
		tzbb.momx = P_RandomRange(-4, 4)*FRACUNIT
		tzbb.momy = P_RandomRange(-4, 4)*FRACUNIT
		tzbb.momz = P_RandomRange(0, 4)*FRACUNIT
		tzbb.destscale = FRACUNIT/2*3
		if not S_SoundPlaying(p.mo, sfx_brpb) then
			S_StartSound(p.mo, sfx_brpb)
		end
//Thunder shield
	elseif p.powers[pw_shield] == SH_THUNDERCOIN then
		if not p.tossdelay then
			local tzbb = P_SpawnMobj(p.mo.x, p.mo.y, p.mo.z+30*FRACUNIT, MT_TAZBUBBLES)
			tzbb.state = S_WATERZAP
			tzbb.colorized = true
			tzbb.frame = $&FF_TRANS10|FF_ADD|FF_FULLBRIGHT
			tzbb.color = SKINCOLOR_WHITE
			tzbb.momx = P_RandomRange(-9, 9)*FRACUNIT
			tzbb.momy = P_RandomRange(-9, 9)*FRACUNIT
			tzbb.momz = P_RandomRange(-9, 9)*FRACUNIT
			tzbb.destscale = FRACUNIT/2*3
			p.tossdelay = TICRATE/5
			if P_RandomChance(FRACUNIT/2) then
				tzbb.mirrored = true
			end
		end
	end
end)

//Startnado
addHook("SpinSpecial", function(p)
	if p.mo.skin != "taz" then return end
	if not P_IsObjectOnGround(p.mo) then return end
	if p.panim == PA_PAIN
	or p.tazlide != 0
	or p.tazquished == true then return end
	if S_SoundPlaying(p.mo, sfx_twolf)
	or S_SoundPlaying(p.mo, sfx_tzs1) 
	or S_SoundPlaying(p.mo, sfx_tzs2)
	or S_SoundPlaying(p.mo, sfx_tzs3) then
		S_StopSound(p.mo)
	end
	if p.mo.eflags & MFE_SPRUNG then
		p.pflags = $|PF_SPINNING
		p.mo.state = S_PLAY_ROLL
	end
	if not (p.mo.eflags & MFE_JUSTHITFLOOR)
	and p.speed > FRACUNIT
	and p.tashnado != true then
		p.ghostnado = false
		p.mo.state = S_TAZ1
		S_StartSound(p.mo, sfx_tnado)
		p.tashnado = true
	end
	if (p.pflags & PF_STARTDASH
	or p.pflags & PF_SPINNING)
	and p.tashnado != true then
		p.ghostnado = false
		p.tashnado = true
		p.normalspeed = FRACUNIT*36
		if p.pflags & PF_STARTDASH then	
			p.ghostnado = true
		end
	end
//Unspin
	if p.pflags & PF_SPINNING 
	and not (p.pflags & PF_STARTDASH) then
		if p.mo.state != S_PLAY_ROLL then
			p.mo.state = S_PLAY_ROLL
		end
		if not (p.pflags & PF_SPINDOWN) 
		and not S_SoundPlaying(p.mo, sfx_lazy)then
			p.pflags = $&~PF_SPINNING
			p.mo.state = S_TAZ0
			S_StartSound(p.mo,sfx_lazy)
			S_StartSound(p.mo,sfx_fart2)
		return true
		end
	end
end)

//Spike break, TY Alfredo!
addHook("MobjCollide", function(thing, mobj)
	if mobj.skin != "taz" then return end
	if thing and thing.valid
	and thing.z - thing.scale <= mobj.z + mobj.height
	and thing.z + thing.height + thing.scale >= mobj.z then
		if (mobj.player.tazwanted == true
		or mobj.state == S_PLAY_ROLL) then
			P_KillMobj(thing, mobj, mobj, 0)
		end
	end
end,MT_SPIKE)

//Taz Damage
addHook("PlayerCanDamage", function(p, m)
	if p.mo.skin != "taz" then return end
	if not m then return end
	if p.tazwanted == true
	or p.tazlide != 0
	or p.mo.state == S_TAZBITEG 
	or ((p.mo.state == S_TAZBITE
	and (not (p.pflags & PF_JUMPED)
	or not P_IsObjectOnGround(m)))) then
		if p.tazlide != 0
		and m.flags & MF_BOSS then
			p.tazlide = 0
			p.mo.state = S_PLAY_SPRING
			p.height = FRACUNIT*48
		elseif p.mo.state == S_TAZBITEG
		or p.mo.state == S_TAZBITE then
			p.drawangle = R_PointToAngle2(p.mo.x, p.mo.y, m.x, m.y)
			m.eaten = true
			p.mo.frame = $|C
			if m.type == MT_GOOMBA
			or m.type == MT_BLUEGOOMBA then
				S_StopSoundByID(p.mo,sfx_tasty)
				S_StopSoundByID(p.mo,sfx_tast2)
				S_StopSoundByID(p.mo,sfx_taste)
				S_StopSoundByID(p.mo,sfx_tzeat)
				S_StartSound(p.mo,sfx_taste)
			elseif m.type == MT_MGREENKOOPA
			or m.type == MT_SHELL then
				p.hungry = 3
				S_StopSoundByID(p.mo,sfx_tasty)
				S_StopSoundByID(p.mo,sfx_tast2)
				S_StopSoundByID(p.mo,sfx_taste)
				S_StartSound(p.mo,sfx_taste)
			elseif m.flags & MF_ENEMY
			or m.flags & MF_BOSS then
				S_StopSoundByID(p.mo,sfx_tasty)
				S_StopSoundByID(p.mo,sfx_tast2)
				S_StopSoundByID(p.mo,sfx_taste)
				if m.info.spawnhealth <= 1 then
					S_StartSound(p.mo,sfx_taste)
				else
					S_StartSoundAtVolume(p.mo,sfx_tzeat,150)
				end
			elseif m.flags & MF_MONITOR then
				if m.type == MT_ELEMENTAL_BOX
				or m.type == MT_ELEMENTAL_GOLDBOX then
					p.chili = true
				end
				if m.info.deathstate == S_BOX_POP1 then
					p.hungry = 2
					S_StopSoundByID(p.mo,sfx_tasty)
					S_StopSoundByID(p.mo,sfx_tast2)
					S_StopSoundByID(p.mo,sfx_taste)
					S_StartSound(p.mo,sfx_taste)
				end
			end
		elseif m.flags & MF_ENEMY
		or m.flags & MF_BOSS then
			p.wallbounces = 0
			p.zok = false
			p.floated = false
			p.laztwall = nil
		end
	return true	
	end
end)

//Should Damage?
addHook("ShouldDamage", function(t, i, s, damage, dt)
	if t and t.valid and t.skin == "taz" then
//Eat Missiles
		if i and i.valid and i.flags & MF_MISSILE
		and not (i.flags & MF_FIRE)
		and (t.state == S_TAZBITEG
		or t.state == S_TAZBITE
		or t.state == S_TAZEAT
		or t.state == S_TAZEATING) then
			t.player.drawangle = t.angle
			t.player.hungry = 8
			t.player.food = i.type
			t.state = S_TAZEAT
			t.player.weapondelay = TICRATE/4*3
			P_RemoveMobj(i)
			S_StopSoundByID(t, sfx_taste)
			S_StopSoundByID(t, sfx_tasty)
			S_StopSoundByID(t, sfx_tast2)
			S_StartSound(t, sfx_taste)
		return false
		end
//Crush "inmunity"
		if dt == DMG_CRUSHED 
		and t.player.tazquishing < FRACUNIT*70 then
			t.player.pflags = $&~PF_SPINNING
			t.state = S_TAZCRUSHED
			t.player.rings = 0
			t.flags = $|MF_NOCLIPTHING
			t.player.pflags = $&~PF_SPINNING
			t.player.pflags = $|PF_FULLSTASIS
			t.player.weapondelay = TICRATE/8
			P_InstaThrust(t, t.angle, 5*FRACUNIT)
			P_RemoveShield(t.player)
			if t.player.tazquished == false then
				S_StartSound(t, sfx_tsqsh)
				t.player.tazquished = true
				t.state = S_TAZCRUSHED
			end
			if t.player.tashnado == true then
				t.player.tashnado = false
			end
			if t.player.tazlide != 0 then
				t.player.tazlide = 0
				t.player.height = FRACUNIT*48
			end
			if t.player.tzflck and t.player.tzflck.valid then
				P_RemoveMobj(t.player.tzflck)
				t.player.tzflck = nil
			end
			if t.player.tzflck2 and t.player.tzflck2.valid then
				P_RemoveMobj(t.player.tzflck2)
				t.player.tzflck2 = nil
			end
			if t.player.tzflck3 and t.player.tzflck3.valid then
				P_RemoveMobj(t.player.tzflck3)
				t.player.tzflck3 = nil
			end
		return false
		end
//Force Shield Damage
		if (t.player.powers[pw_shield] & SH_FORCE)
		and (t.player.powers[pw_shield] & SH_FORCEHP)then
			if t.player.tzflck2 and t.player.tzflck2.valid 
			and not t.player.powers[pw_flashing]
			and not t.player.powers[pw_invulnerability] then
				P_RemoveMobj(t.player.tzflck2)
				t.player.tzflck2 = nil
			end
		elseif not t.player.powers[pw_flashing]
		and not t.player.powers[pw_invulnerability] then
			if t.player.tzflck and t.player.tzflck.valid then
				P_RemoveMobj(t.player.tzflck)
				t.player.tzflck = nil
			end
			if t.player.tzflck3 and t.player.tzflck3.valid then
				P_RemoveMobj(t.player.tzflck3)
				t.player.tzflck3 = nil
			end
		end
//Taz hates water
		if dt == DMG_DROWNED
		or (t.eflags & MFE_UNDERWATER
		and t.player.rings == 0
		and not t.player.powers[pw_flashing]
		and not t.player.powers[pw_invulnerability]
		and not (t.player.powers[pw_shield] == SH_BUBBLEWRAP)) then
			t.player.drowned = true
		end
//Misc and pain sound
		if (dt != DMG_DROWNED) 
		and not t.player.powers[pw_flashing]
		and not t.player.powers[pw_invulnerability]
		and s != t then
			t.player.tashnado = false
			t.player.crashed = false
			t.player.tazlide = 0
			t.player.tazfire = false
			t.player.height = FRACUNIT*48
			if t.player.powers[pw_shield] 
			and not P_CheckDeathPitCollide(t)
			and s != t then
				S_StartSound(t.player.mo, sfx_tbrnt)
			end
		end
	end
end,MT_PLAYER)

//Random Farts
addHook("JumpSpecial", function(p)
	if p.mo.skin != "taz" then return end
	if S_SoundPlaying(p.mo, sfx_s3k42) then
		S_StopSoundByID(p.mo, sfx_s3k42)
		S_StartSound(p.mo, sfx_tzpn0)
	end
	if p.pflags & PF_THOKKED then
		p.pflags = $&~PF_THOKKED
	end
	if not P_IsObjectOnGround(p.mo)then return end
	if p.pflags & PF_JUMPDOWN then return end
	if p.pflags & PF_SPINNING then
		p.pflags = $&~PF_SPINNING
		p.mo.state = S_PLAY_SPRING
		p.normalspeed = FRACUNIT*36
	end
	if S_SoundPlaying(p.mo, sfx_twolf)
	or S_SoundPlaying(p.mo, sfx_tzs1) 
	or S_SoundPlaying(p.mo, sfx_tzs2)
	or S_SoundPlaying(p.mo, sfx_tzs3) then
		S_StopSound(p.mo)
	end
	if p.farted != true then
		p.farted = true
		local fart = P_RandomRange(1, 7)
		if fart == 1 then
			S_StartSound(p.mo, sfx_fart)
		elseif fart == 2 then
			S_StartSound(p.mo, sfx_fart2)
		end
	end
	if p.tashnado == true then
		p.normalspeed = FRACUNIT*36
	end
end)