if not(kirbyabilitytable)
    rawset(_G, "kirbyabilitytable", {})
end
kirbyabilitytable["taz"] = 7

COM_AddCommand("tazbt", do
	if consoleplayer.tazbt == 1
		consoleplayer.tazbt = 3
		print("C2")
	elseif consoleplayer.tazbt != 2 then
		consoleplayer.tazbt = 2
		print("FireNormal")
	elseif consoleplayer.tazbt != 1
		consoleplayer.tazbt = 1
		print("Fire")
	end
end)

freeslot(
"MT_TAZSPITTLE",
"MT_TAZSPITTLE2",
"MT_TAZROCK",
"MT_TAZBUBBLES",
"MT_TAZSMOKE",
"MT_TAZGUM",
"MT_TAZFLICKY",
"MT_TAZFLICKY2",
"MT_GUMSPAWN",
"MT_GUMPOP",
"MT_OTRAIL",
"MT_TMQUIL",
"MT_MGREENKOOPA",
"MT_CRYSTALCRUMBLE",
"MT_TIDB",
"S_TASH",
"S_TAZ1",
"S_TAZ0",
"S_TAZTHOK",
"S_TAZFLOAT",
"S_TAZBITE",
"S_TAZBITEG",
"S_TAZSPIT",
"S_TAZEAT",
"S_TAZEATING",
"S_SPINTWIN",
"S_TRIPLETSPIN",
"S_TAZGAP",
"S_TAZSKATE",
"S_TAZDROWN",
"S_TAZDROWN2",
"S_TAZSPITTLE",
"S_TAZSPITTLE2",
"S_TAZROCK",
"S_TAZCRUSHED",
"S_TAZCRASHED",
"S_TAZBUBBLE",
"S_TAZFIRESHIELD",
"S_TAZSMOKE",
"S_TAZGUM",
"S_TAZFLICKY",
"S_TAZFLICKY2",
"S_GUMSPAWN",
"S_GUMPOP",
"S_TWDB",
"S_TWDB2",
"S_OTRAIL",
"S_OTRAIL2",
"S_OTRAIL3",
"S_OTRAIL4",
"S_OTRAIL5",
"S_TAZMINECART",
"S_TAZMINECARTL",
"S_TAZMINECARTR",
"S_TMQUIL",
"SPR_TASH",
"SPR_TAZH",
"SPR_TZBT",
"SPR_TZSP",
"SPR_TZGP",
"SPR_TZSK",
"SPR_TZCR",
"SPR_TZCL",
"SPR_TZBB",
"SPR_TZMK",
"SPR_FTZ1",
"SPR_FTZ2",
"SPR_TZBN",
"SPR_TZBK",
"SPR_TZDW",
"SPR_TZFS",
"SPR_TZMC",
"SPR_TMQL",
"SPR_TGUM"
)
sfxinfo[freeslot("sfx_tsup")].caption = "Wassup!"
sfxinfo[freeslot("sfx_tyow")].caption = "Yo, yo, yo!"
sfxinfo[freeslot("sfx_tnado")].caption = "/"
sfxinfo[freeslot("sfx_tspt")].caption = "Spit"
sfxinfo[freeslot("sfx_fart")].caption = "/"
sfxinfo[freeslot("sfx_fart2")].caption = "/"
sfxinfo[freeslot("sfx_chili")].caption = "/"
sfxinfo[freeslot("sfx_burp")].caption = "BURP"
sfxinfo[freeslot("sfx_burp")].flags = $|SF_X8AWAYSOUND
sfxinfo[freeslot("sfx_tbnk")].caption = "Crash"
sfxinfo[freeslot("sfx_tbrnt")].caption = "/"
sfxinfo[freeslot("sfx_tzs1")].caption = "/"
sfxinfo[freeslot("sfx_tzs2")].caption = "/"
sfxinfo[freeslot("sfx_tzs3")].caption = "/"
sfxinfo[freeslot("sfx_twolf")].caption = "/"
sfxinfo[freeslot("sfx_skate")].caption = "Skate"
sfxinfo[freeslot("sfx_brpb")].caption = "/"
sfxinfo[freeslot("sfx_tzpn0")].caption = "/"
sfxinfo[freeslot("sfx_tzpn")].caption = "Spintwin"
sfxinfo[freeslot("sfx_tzft")].caption = "Float"
sfxinfo[freeslot("sfx_tzok")].caption = "Thok"
sfxinfo[freeslot("sfx_tzbt")].caption = "Bite"
sfxinfo[freeslot("sfx_tsqsh")].caption = "Squish!"

sfxinfo[freeslot("sfx_gpop")].caption = "/"
sfxinfo[freeslot("sfx_burpc")].caption = "/"
sfxinfo[freeslot("sfx_flck2")].caption = "/"
sfxinfo[freeslot("sfx_gump")].caption = "Nyam!"
sfxinfo[freeslot("sfx_taste")].caption = "Mmmm"
sfxinfo[freeslot("sfx_tast2")].caption = "Mmmm..."
sfxinfo[freeslot("sfx_tasty")].caption = "Mmmm... Tasty!"

mobjinfo[MT_TAZSPITTLE] = {
	spawnstate = S_TAZSPITTLE,
	spawnhealth = 1000,
	deathstate = S_BOSSEXPLODE,
	deathsound = sfx_bexpld,
	speed = 100<<FRACBITS,
	radius = 8*FRACUNIT,
	height = 8*FRACUNIT,
	mass = 100,
	damage = 1*TICRATE,
	flags = MF_NOBLOCKMAP|MF_MISSILE|MF_GRENADEBOUNCE
}
mobjinfo[MT_TAZSPITTLE2] = {
	spawnstate = S_TAZSPITTLE2,
	spawnhealth = 1000,
	deathsound = sfx_wbreak,
	speed = 100<<FRACBITS,
	radius = 8*FRACUNIT,
	height = 8*FRACUNIT,
	mass = 100,
	damage = 1*TICRATE,
	flags = MF_NOBLOCKMAP|MF_MISSILE|MF_GRENADEBOUNCE
}
mobjinfo[MT_TAZROCK] = {
	spawnstate = S_TAZROCK,
	spawnhealth = 1000,
	speed = 100<<FRACBITS,
	radius = 8*FRACUNIT,
	height = 8*FRACUNIT,
	mass = 100,
	damage = 1*TICRATE,
	flags = MF_NOBLOCKMAP|MF_MISSILE|MF_GRENADEBOUNCE
}
mobjinfo[MT_TAZBUBBLES] = {
	spawnstate = S_TAZBUBBLE,
	spawnhealth = 1000,
	flags = MF_NOBLOCKMAP|MF_NOGRAVITY
}
mobjinfo[MT_TAZSMOKE] = {
	spawnstate = S_TAZSMOKE,
	spawnhealth = 1000,
	flags = MF_NOBLOCKMAP|MF_NOGRAVITY
}
mobjinfo[MT_TAZGUM] = {
	spawnstate = S_TAZGUM,
	spawnhealth = 1000,
	radius = 16*FRACUNIT,
	height = 16*FRACUNIT,
	flags = MF_SPECIAL|MF_NOGRAVITY
}
mobjinfo[MT_TAZFLICKY] = {
	spawnstate = S_TAZFLICKY,
	spawnhealth = 1000,
	speed = -4<<FRACBITS,
	flags = MF_NOCLIPHEIGHT|MF_NOBLOCKMAP|MF_NOGRAVITY
}
mobjinfo[MT_TAZFLICKY2] = {
	spawnstate = S_TAZFLICKY2,
	spawnhealth = 1000,
	speed = 4<<FRACBITS,
	flags = MF_NOCLIPHEIGHT|MF_NOBLOCKMAP|MF_NOGRAVITY
}
mobjinfo[MT_GUMSPAWN] = {
	spawnstate = S_GUMSPAWN,
	spawnhealth = 1000,
	speed = 36<<FRACBITS,
	radius = 25*FRACUNIT,
	height = 25*FRACUNIT,
	flags = MF_NOCLIP|MF_MISSILE|MF_NOGRAVITY
}
mobjinfo[MT_GUMPOP] = {
	spawnstate = S_GUMPOP,
	spawnhealth = 1000,
	flags = MF_NOCLIP|MF_NOCLIPHEIGHT
}
mobjinfo[MT_OTRAIL] = {
	spawnstate = S_OTRAIL,
	spawnhealth = 1000,
	flags = MF_NOGRAVITY
}
mobjinfo[MT_TMQUIL] = {
	spawnstate = S_TMQUIL,
	spawnhealth = 1000,
	flags = MF_NOCLIP|MF_NOCLIPHEIGHT
}
states[S_TMQUIL] = {
	sprite = SPR_TMQL,
	frame = FF_ANIMATE|FF_RANDOMANIM|A,
	tics = 50,
	var1 = 2,
	var2 = 5,
	nextstate = S_NULL
}
states[S_TAZTHOK] = {
	sprite = SPR_TAZH,
	frame = FF_ANIMATE|A,
	tics = 18,
	var1 = 5,
	var2 = 2,
	nextstate = S_TASH
}
states[S_SPINTWIN] = {
	sprite = SPR_TASH,
	frame = FF_ANIMATE|A,
	tics = 12,
	var1 = 5,
	var2 = 2,
	nextstate = S_PLAY_FALL
}
states[S_TRIPLETSPIN] = {
	sprite = SPR_TASH,
	frame = FF_ANIMATE|A,
	tics = 12,
	var1 = 5,
	var2 = 2,
	nextstate = S_PLAY_FALL
}
states[S_TAZSPITTLE] = {
	sprite = SPR_TZBN,
	frame = FF_ANIMATE|A,
	tics = -1,
	var1 = 3,
	var2 = 2,
	nextstate = S_TAZSPITTLE
}
states[S_TAZSPITTLE2] = {
	sprite = SPR_TZBK,
	frame = FF_ANIMATE|A,
	tics = -1,
	var1 = 3,
	var2 = 2,
	nextstate = S_TAZSPITTLE2
}
states[S_TAZROCK] = {
	sprite = SPR_ROIJ,
	frame = FF_ANIMATE|A,
	tics = -1,
	var1 = 4,
	var2 = 2,
	nextstate = S_TAZROCK
}
states[S_TASH] = {
	sprite = SPR_TASH,
	frame = FF_ANIMATE|A,
	tics = -1,
	var1 = 5,
	var2 = 2,
	nextstate = S_TASH
}
states[S_TAZ1] = {
	sprite = SPR_TAZH,
	frame = FF_ANIMATE|A,
	tics = 12,
	var1 = 5,
	var2 = 2,
	nextstate = S_TASH
}
states[S_TAZ0] = {
	sprite = SPR_TAZH,
	frame = FF_ANIMATE|A,
	tics = 12,
	var1 = 5,
	var2 = 2,
	nextstate = S_PLAY_WALK
}
states[S_TAZFLOAT] = {
	sprite = SPR_TASH,
	frame = FF_ANIMATE|A,
	tics = 12,
	var1 = 5,
	var2 = 2,
	nextstate = S_PLAY_FALL
}
states[S_TAZBITE] = {
	sprite = SPR_TZBT,
	frame = FF_ANIMATE|A,
	tics = 8,
	var1 = 3,
	var2 = 2,
	nextstate = S_PLAY_FALL
}
states[S_TAZBITEG] = {
	sprite = SPR_TZBT,
	frame = FF_ANIMATE|A,
	tics = 8,
	var1 = 3,
	var2 = 2,
	nextstate = S_PLAY_FALL
}
states[S_TAZEAT] = {
	sprite = SPR_TZBT,
	frame = FF_ANIMATE|A,
	tics = 8,
	var1 = 3,
	var2 = 2,
	nextstate = S_TAZEATING
}
states[S_TAZEATING] = {
	sprite = SPR_TZBT,
	frame = D,
	tics = 16,
	nextstate = S_PLAY_FALL
}
states[S_TAZSPIT] = {
	sprite = SPR_TZSP,
	frame = FF_ANIMATE|A,
	tics = 12,
	var1 = 3,
	var2 = 3,
	nextstate = S_PLAY_FALL
}
states[S_TAZGAP] = {
	sprite = SPR_TZGP,
	frame = A,
	tics = -1,
	nextstate = S_TAZGAP
}
states[S_TAZSKATE] = {
	sprite = SPR_TZSK,
	frame = FF_ANIMATE|A,
	tics = 6,
	var1 = 1,
	var2 = 3,
	nextstate = S_TAZSKATE
}
states[S_TAZCRASHED] = {
	sprite = SPR_TZCL,
	frame = A,
	tics = 15,
	nextstate = S_TAZCRUSHED
}
states[S_TAZCRUSHED] = {
	sprite = SPR_TZCR,
	frame = FF_ANIMATE|A,
	tics = 40,
	var1 = 7,
	var2 = 5,
	nextstate = S_PLAY_STND
}
states[S_TAZBUBBLE] = {
	sprite = SPR_TZBB,
	frame = FF_ANIMATE|A,
	tics = 24,
	var1 = 7,
	var2 = 3,
	nextstate = S_NULL
}
states[S_TAZSMOKE] = {
	sprite = SPR_TZMK,
	frame = FF_ANIMATE|A,
	tics = 15,
	var1 = 4,
	var2 = 3,
	nextstate = S_NULL
}
states[S_TAZFIRESHIELD] = {
	sprite = SPR_TZFS,
	frame = FF_ANIMATE|A,
	tics = 10,
	var1 = 1,
	var2 = 5,
	nextstate = S_PLAY_WAIT
}
states[S_TAZGUM] = {
	sprite = SPR_TGUM,
	frame = FF_ANIMATE|C,
	tics = 360,
	var1 = 3,
	var2 = 5,
	nextstate = S_DEATHSTATE
}
states[S_TAZFLICKY] = {
	sprite = SPR_FTZ1,
	frame = FF_ANIMATE|A,
	tics = -1,
	var1 = 2,
	var2 = 4,
	nextstate = S_TAZFLICKY
}
states[S_TAZFLICKY2] = {
	sprite = SPR_FTZ2,
	frame = FF_ANIMATE|A,
	tics = -1,
	var1 = 2,
	var2 = 4,
	nextstate = S_TAZFLICKY2
}
states[S_GUMSPAWN] = {
	sprite = SPR_NULL,
	frame = A,
	tics = 2,
	nextstate = S_DEATHSTATE
}
states[S_GUMPOP] = {
	sprite = SPR_TGUM,
	frame = B,
	tics = 3,
	nextstate = S_NULL
}
states[S_OTRAIL] = {
	sprite = SPR_SPLA,
	frame = FF_ANIMATE|A,
	tics = 6,
	var1 = 2,
	var2 = 2,
	nextstate = S_OTRAIL2
}
states[S_OTRAIL2] = {
	sprite = SPR_SPLA,
	frame = FF_ADD|FF_TRANS20|C,
	tics = 3,
	nextstate = S_OTRAIL3
}
states[S_OTRAIL3] = {
	sprite = SPR_SPLA,
	frame = FF_ADD|FF_TRANS40|C,
	tics = 3,
	nextstate = S_OTRAIL4
}
states[S_OTRAIL4] = {
	sprite = SPR_SPLA,
	frame = FF_ADD|FF_TRANS60|C,
	tics = 3,
	nextstate = S_OTRAIL5
}
states[S_OTRAIL5] = {
	sprite = SPR_SPLA,
	frame = FF_ADD|FF_TRANS80|C,
	tics = 3,
	nextstate = S_NULL
}
states[S_TAZDROWN] = {
	sprite = SPR_TZDW,
	frame = FF_ANIMATE|A,
	tics = 60,
	var1 = 3,
	var2 = 3,
	nextstate = S_TAZDROWN2
}
states[S_TAZDROWN2] = {
	sprite = SPR_TZDW,
	frame = FF_ANIMATE|A,
	tics = 12,
	var1 = 3,
	var2 = 3,
	nextstate = S_PLAY_STND
}
states[S_TAZMINECART] = {
	sprite = SPR_TZMC,
	frame = C,
	tics = 3,
	nextstate = S_PLAY_STND
}
states[S_TAZMINECARTL] = {
	sprite = SPR_TZMC,
	frame = A,
	tics = 3,
	nextstate = S_PLAY_STND
}
states[S_TAZMINECARTR] = {
	sprite = SPR_TZMC,
	frame = B,
	tics = 3,
	nextstate = S_PLAY_STND
}

hud.add(function(wp, p, cam)
	if p and p.valid and p.mo and p.mo.valid then
		if p.powers[pw_shield] == SH_TGUM then
			wp.drawString(16, 192, "Gum", V_MAGENTAMAP|V_HUDTRANSDOUBLE|V_PERPLAYER)
			if p.tossdelay >= TICRATE*4 then
				wp.drawString(150, 185, "|||||", V_MAGENTAMAP|V_HUDTRANSDOUBLE|V_PERPLAYER)
			elseif p.tossdelay >= TICRATE*3 then
				wp.drawString(152, 185, "||||", V_MAGENTAMAP|V_HUDTRANSDOUBLE|V_PERPLAYER)
			elseif p.tossdelay >= TICRATE*2 then
				wp.drawString(154, 185, "|||", V_MAGENTAMAP|V_HUDTRANSDOUBLE|V_PERPLAYER)
			elseif p.tossdelay >= TICRATE then
				wp.drawString(156, 185, "||", V_MAGENTAMAP|V_HUDTRANSDOUBLE|V_PERPLAYER)
			elseif not p.tossdelay then
				wp.drawString(154, 185, "...", V_MAGENTAMAP|V_HUDTRANSDOUBLE|V_PERPLAYER)
			else
				wp.drawString(158, 185, "|", V_MAGENTAMAP|V_HUDTRANSDOUBLE|V_PERPLAYER)
			end
		elseif p.mo.state == S_TAZDROWN 
		or p.mo.state == S_TAZDROWN2 then
			wp.draw(158, 80, wp.cachePatch("TZHW"),V_PERPLAYER)
		end
	end
end)

//Taz Damage
addHook("PlayerCanDamage", function(p, m)
	if p.mo.skin != "taz" then return end
	if p.tazwanted == true
	or p.mo.state == S_TAZBITEG 
	or ((p.mo.state == S_TAZBITE
	and (not (p.pflags & PF_JUMPED)
	or not P_IsObjectOnGround(m)))
	and not (m.flags & MF_BOSS)) then
		if p.tazlide != 0
		and m.flags & MF_BOSS then
			p.tazlide = 0
			p.mo.state = S_PLAY_STND
		end
		if 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
			if 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_GOLDBOX_OFF1 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
			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_StartSound(p.mo,sfx_taste)
			end
			if 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)
			end
		end
	return true	
	end
end)

addHook("ThinkFrame", do
	for player in players.iterate
//Bubblegum Powerup
		if player.mo
		and player.powers[pw_shield] == SH_TGUM 
		and player.gumw != true then
			if S_SoundPlaying(player.mo, sfx_wirlsg)
			or S_SoundPlaying(player.mo, sfx_s3k41) then
				S_StopSoundByID(player.mo, sfx_wirlsg)
				S_StopSoundByID(player.mo, sfx_s3k41)
			end
			if P_IsObjectOnGround(player.mo)
			and (player.gum != false
			or player.gump != false) then
				player.gum = false		
				player.gump = false
			end
			if player.gum != true then
				player.tossdelay = TICRATE*5
			end
			if not (player.pflags & PF_AUTOBRAKE)
			and not P_IsObjectOnGround(player.mo)
			and player.mo.state == S_PLAY_GASP then
				player.pflags = $|PF_AUTOBRAKE
			end
			if player.mo.state == S_PLAY_SPRING 
			and not (player.pflags & PF_JUMPED) 
			and player.tossdelay then
				player.pflags = $|PF_JUMPED
			end
			if not (player.pflags & PF_JUMPED) 
			and not P_IsObjectOnGround(player.mo)
			and player.mo.state != S_PLAY_GASP
			and player.gump != true then
				player.pflags = $|PF_JUMPED
				player.gump = true
			end
		elseif player.gum != false
		and player.gumw != true then
			player.gum = false
		end
//Taz
		if player.mo and player.mo.skin == "taz" 
		and 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
				if player.cheatbounce != true then
					P_BounceMove(player.mo)
					S_StartSound(player.mo, sfx_s3k7b)
					player.wallbounce = false
					player.weapondelay = TICRATE/2
				end
			end
//"Dash Mode"
			if (player.mo.state == S_TASH
			or player.pflags & PF_SPINNING)
			and player.normalspeed != FRACUNIT*40 then
				//player.normalspeed = FRACUNIT*40
				player.normalspeed = player.normalspeed + FRACUNIT/2
			end
			if player.mo.state == S_TAZ1
			and player.normalspeed != FRACUNIT*40 then
				//player.normalspeed = FRACUNIT*40
				player.normalspeed = player.normalspeed + FRACUNIT/2
			end
			if player.tashnado == true then
				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
						and player.cmd.forwardmove == 0
						and player.cmd.sidemove == 0 then
							player.mo.state = S_PLAY_SKID
							player.tashnado = false
						else
							player.mo.state = S_TAZ1
							S_StartSound(player.mo, sfx_tnado)
						end
					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) then
					player.charability = CA_JUMPBOOST
					player.jumpfactor = FRACUNIT/2
				else 
					player.charability = CA_TWINSPIN
					player.jumpfactor = FRACUNIT
				end
			end
			if player.tashnado != true then
				player.charability = CA_TWINSPIN
				player.jumpfactor = FRACUNIT
				player.normalspeed = FRACUNIT*30
			end
			if player.cmd.forwardmove == 0
			and player.cmd.sidemove == 0
			and player.speed == 0
			and (player.mo.state == S_TASH or player.mo.state == S_TAZ1)
			and not (player.powers[pw_carry])
			and player.tashnado == true 
			and player.mo.state != S_TAZ0 then
				player.mo.state = S_TAZ0
				player.tashnado = false
			end
			if P_IsObjectOnGround(player.mo)
			and player.pflags & PF_SPINNING
			and not (player.pflags & PF_STARTDASH)
			and player.mo.state != S_PLAY_ROLL then
				player.mo.state = S_PLAY_ROLL
			end
			if player.mo.state == S_TASH 
			or player.mo.state == S_TAZ1
			or player.mo.state == S_TAZ0
			or player.mo.state == S_TAZTHOK
			or player.mo.state == S_TAZFLOAT
			or player.mo.state == S_TAZGAP
			or player.mo.state == S_TAZSKATE 
			or player.mo.state == S_SPINTWIN
			or player.mo.state == S_TRIPLETSPIN
			or player.mo.state == S_PLAY_TWINSPIN then
				if player.tazwanted != true then
					player.tazwanted = true
				end
			elseif player.tazwanted != false then
				player.tazwanted = false
			end
			if not P_IsObjectOnGround(player.mo) then
				if player.pflags & PF_SPINNING then
					player.pflags = $&~PF_SPINNING
					player.mo.state = S_TASH
				end
				if S_SoundPlaying(player.mo, sfx_tnado) then
					S_StopSoundByID(player.mo, sfx_tnado)
				end
				if player.farted != false then
					player.farted = false
				end
				if player.normalspeed > FRACUNIT*35 
				and player.tazwanted != true then
					player.normalspeed = FRACUNIT*36
				end
//No Air Walk, TY Kirb!
				if (player.mo.state == S_PLAY_WALK or player.mo.state == S_PLAY_RUN)
				and not (player.powers[pw_carry]) then
					player.mo.state = S_PLAY_FALL
				end
//Misc
				if player.mo.state == S_TAZFLOAT
				and player.tossdelay 
				and player.floated == true then
					P_SetObjectMomZ(player.mo, FRACUNIT, false) 
				end
				if player.mo.state == S_PLAY_WAIT 
				and not player.powers[pw_carry] then
					player.mo.state = S_PLAY_FALL
				end
			end
			if player.powers[pw_carry] == CR_PTERABYTE 
			and player.mo.state != S_PLAY_WAIT then
				player.mo.state = S_PLAY_WAIT
				if player.tashnado == true then
					player.tashnado = false
					S_StartSound(player.mo, sfx_fart)
				end
			end
			if player.powers[pw_carry] == CR_MINECART then
				if player.cmd.sidemove == 0 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
			if player.tazlide != 0 
			and player.playerstate != PST_DEAD then
				if player.tazlide == 2 then
					player.mo.state = S_TAZGAP
				else
					player.mo.state = S_TAZSKATE
				end
			end
//Force Shield
			if (player.powers[pw_shield] & SH_FORCE)
			and not ((player.powers[pw_shield] & SH_PITY)
			or (player.powers[pw_shield] & SH_PINK)) then
				if player.tzflck and not player.tzflck.valid then
					local flicky = P_SpawnMobj(player.mo.x, player.mo.y, player.mo.z, MT_TAZFLICKY)
					flicky.color = SKINCOLOR_WAVE
					flicky.target = player.mo
					player.tzflck = flicky
					S_StartSound(player.mo, sfx_3db09)
				end
			end
//Armageddon
			if player.powers[pw_shield] == SH_ARMAGEDDON then
				local tzbb = P_SpawnMobj(player.mo.x, player.mo.y, player.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 player.tossdelay then
					S_StartSound(player.mo, sfx_brpb)
					player.tossdelay = TICRATE
				end
				if S_SoundPlaying(player.mo, sfx_armasg) then
					S_StopSoundByID(player.mo, sfx_armasg)
					S_StartSound(player.mo, sfx_burpc)
				end
			end
//Attract shield
			if player.powers[pw_shield] == SH_ATTRACT then
				if not player.tossdelay then
					local tzbb = P_SpawnMobj(player.mo.x, player.mo.y, player.mo.z+30*FRACUNIT, MT_TAZBUBBLES)
					tzbb.state = S_WATERZAP
					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
					player.tossdelay = TICRATE/5
				end
			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.cmd.forwardmove == 0
					and player.cmd.sidemove == 0
					and player.speed == 0
					and player.mo.state != S_TAZFIRESHIELD
					and not (player.pflags & PF_STARTDASH) then
						player.mo.state = S_TAZFIRESHIELD
					end
				end
				if 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
				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
				end
			elseif player.tazfire == true 
			and not (player.mo.eflags & MFE_UNDERWATER) then
				player.tazfire = false
			end
			if player.tazfire == true 
			and 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
			if player.powers[pw_shield] == SH_FIREFLOWER then
				P_RemoveShield(player)
				player.powers[pw_shield] = SH_FLAMEAURA
				player.tazfire = 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 p.mo.state != S_TAZ0 then
		if not (p.mo.eflags & MFE_JUSTHITFLOOR)
		and p.speed > FRACUNIT
		and p.tashnado != true then
			p.mo.state = S_TAZ1
			S_StartSound(p.mo, sfx_tnado)
			p.tashnado = true
			p.normalspeed = FRACUNIT*36
		end
	end
	if (p.mo.eflags & MFE_TOUCHWATER 
	or p.mo.eflags & MFE_GOOWATER)
	and p.mo.state == S_PLAY_SPINDASH then
		P_SetObjectMomZ(p.mo, -FRACUNIT)
	end
	if (p.pflags & PF_STARTDASH
	or p.pflags & PF_SPINNING)
	and p.tashnado != true then
		p.tashnado = true
		p.normalspeed = FRACUNIT*36
	end
//Unspin
	if p.pflags & PF_SPINNING 
	and not (p.pflags & PF_SPINDOWN) then
		p.pflags = $&~PF_SPINNING
		p.mo.state = S_TAZ0
		S_StartSound(p.mo,sfx_fart2)
	return true
	end
end)

addHook("PlayerThink", function(p)
	if not(p and p.valid and p.mo and p.mo.valid) then return end
	if p.mo.skin != "taz" then return end
	if p.pflags & PF_THOKKED then
		p.pflags = $&~PF_THOKKED
	end
	if S_SoundPlaying(p.mo, sfx_s3k42) then
		S_StopSoundByID(p.mo, sfx_s3k42)
		S_StartSound(p.mo, sfx_tzpn0)
	end
//Spin/Dash
	if p.panim == PA_RUN
	or p.panim == PA_WALK
	or p.mo.state == S_PLAY_SKID
	or p.mo.state == S_TAZGAP
	or p.mo.state == S_TAZSKATE
	or p.tazquished == true then
		p.charability2 = CA2_NONE
	else
		p.charability2 = CA2_SPINDASH
	end
//C1: Bite and spit
	if p.cmd.buttons & BT_CUSTOM1
	and p.thatwasall != true then
		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
	end
	if p.mo.state == S_TAZSPIT then 
		p.drawangle = p.mo.angle
	end	
//C2: Skate/Tackle/Gum Spawn
	if p.cmd.buttons & BT_CUSTOM2 
	or (p.cmd.buttons & BT_ATTACK and p.tazbt != 2 and p.tazbt !=3)
	or (p.cmd.buttons & BT_FIRENORMAL and p.tazbt == 2) then
		if p.tazlide == 0 
		and p.mo.state != S_PLAY_GASP
		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 emeralds >= 7
					and 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
	if p.tazlide == 1 then
		p.mo.friction = FRACUNIT/45*44
	end
	if p.tazlide != 0 then
		p.height = 32*FRACUNIT
		p.pflags = $|PF_FULLSTASIS
	elseif p.mo.state == S_TAZCRUSHED then
		p.height = 32*FRACUNIT
	elseif p.height != 55*FRACUNIT then
		p.height = 50*FRACUNIT
	end
	if p.tazlide != 0
	and p.tazquished != true
	and ((p.speed <= 8*FRACUNIT
	and P_IsObjectOnGround(p.mo))
	or p.powers[pw_carry]) then
		p.tashnado = false
		p.mo.state = S_PLAY_STND
		p.tazlide = 0
	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
			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
			end
		end
	end
	if p.mo.state == S_TAZCRUSHED then
		p.pflags = $&~PF_SPINNING
	end
//Bust Walls
	if p.tazwanted == true
	or p.mo.state == S_PLAY_SPINDASH
	or p.mo.state == S_PLAY_ROLL then
		p.charflags = $|SF_CANBUSTWALLS
		p.mo.flags = $|MF_SLIDEME
	else
		p.charflags = $&~SF_CANBUSTWALLS
		p.mo.flags = $&~MF_SLIDEME
	end
//Misc
	if 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
	end
	if p.mo.state == S_TAZDROWN2 then
		p.drowned = false
		if p.mo.speed != 0 then
			p.mo.state = S_PLAY_WALK
		end
	end
	if p.panim == PA_PAIN 
	and P_IsObjectOnGround(p.mo) then
		if p.spinheight != 32*FRACUNIT then
			p.tashnado = false
			p.spinheight = 32*FRACUNIT
		end
	elseif p.spinheight != 55*FRACUNIT then
		p.spinheight = 50*FRACUNIT
	end
	if p.powers[pw_carry]
	and p.zok != false then
		p.zok = false
	end
	if p.powers[pw_carry] == CR_ZOOMTUBE then
		p.mo.state = S_TAZGAP
		if p.spinheight != 32*FRACUNIT then
			p.spinheight = 32*FRACUNIT
		end
		if p.tashnado == true then
			p.tashnado = false
			S_StartSound(p.mo, sfx_fart)
			p.mo.state = S_TAZGAP
		end
	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.pflags & PF_SPINNING) 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 = 2*FRACUNIT
		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 = 4*FRACUNIT
		end
	end
//Coyote Time fix and resets
	if p.mo.eflags & MFE_SPRUNG then
		p.charflags = $|SF_STOMPDAMAGE
		p.coyotet = false
		p.tazlide = 0
		p.mo.state = S_PLAY_SPRING
	end
	if P_IsObjectOnGround(p.mo) then
		if p.wallbounces != 0 then
			p.wallbounces = 0
			if p.cheatbounce == true then
				p.cheatbounce = false
			end
			if p.laztwall != nil then
				p.laztwall = nil
			end
		end
		if p.tazwall == true then
			p.tazwall = false
		end
		if p.zok == true then
			p.zok = false
		end
		if p.charflags & SF_STOMPDAMAGE then
			p.charflags = $&~SF_STOMPDAMAGE
		end
		if p.coyotet == false then
			p.coyotet = true
		end
		if p.floated == true then
			p.floated = false
		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
			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	
	end
//Skins
	if p.skincolor == SKINCOLOR_WERETAZ then
		if p.mo.colorized != true then
			p.mo.color = SKINCOLOR_WERETAZ
			p.mo.colorized = true
		end
	elseif p.skincolor == SKINCOLOR_ZTATUE then
		if p.mo.colorized != true then
			p.mo.color = SKINCOLOR_ZTATUE
			p.mo.colorized = true
		end
	elseif p.mo.colorized == true then
		p.mo.colorized = false
	end
end)

//Eat/Spit ability stuff
addHook("MobjSpawn", function(mobj)
	if P_RandomChance(FRACUNIT/2) then
		mobj.mirrored = true
	end
end,MT_TAZSPITTLE)
addHook("MobjSpawn", function(mobj)
	if P_RandomChance(FRACUNIT/2) then
		mobj.mirrored = true
	end
end,MT_TAZSPITTLE2)
addHook("MobjSpawn", function(mobj)
	if P_RandomChance(FRACUNIT/2) then
		mobj.mirrored = true
	end
end,MT_TAZROCK)
addHook("MobjSpawn", function(mobj)
	if P_RandomChance(FRACUNIT/2) then
		mobj.mirrored = true
	end
end,MT_OTRAIL)

addHook("TouchSpecial", function(s, t)
	if t.state == S_TAZBITEG
	or t.state == S_TAZBITE then
		t.player.hungry = 3
		t.player.weapondelay = TICRATE/4*3
		P_KillMobj(s, t, t, 0)
		S_StopSoundByID(t, sfx_tasty)
		S_StopSoundByID(t, sfx_taste)
		S_StopSoundByID(t, sfx_tast2)
		S_StartSound(t,sfx_taste)
	return true
	end
end,MT_SHELL)

addHook("TouchSpecial", function(s, t)
	if t.state == S_TAZBITEG
	or t.state == S_TAZBITE then
		S_StartSound(t, sfx_gasp)
		t.player.powers[pw_underwater] = TICRATE*30
		P_RestoreMusic(t.player)
		local bub1 = P_SpawnMobj(s.x, s.y, s.z, MT_TAZBUBBLES)
		bub1.state = S_POP1
		P_RemoveMobj(s)
	return true
	end
end,MT_EXTRALARGEBUBBLE)

addHook("MobjDeath", function(t, i)
	if t.eaten != true then return end
	if t.flags & MF_ENEMY
	and not (t.flags & MF_BOSS)
		t.state = S_XPLD1
		i.player.weapondelay = TICRATE/4*3
		S_StopSoundByID(i,sfx_taste)
		S_StopSoundByID(i,sfx_tasty)
		S_StopSoundByID(i,sfx_tast2)
		S_StartSound(i,sfx_taste)
		if t.type != MT_FACESTABBER
		and t.type != MT_HIVEELEMENTAL
		and t.type != MT_MGREENKOOPA
		and t.type != MT_GOOMBA
		and t.type != MT_BLUEGOOMBA then
			i.player.hungry = 1
		end
	return true
	end
end)

//Spintwin Thok and Float
addHook("JumpSpinSpecial", function(p)
	if p.mo.skin != "taz" then return end
	if (p.pflags & PF_SPINDOWN) then return end
	if p.mo.state == S_SPINTWIN 
	and p.floated != true 
	and p.wallbounces == 0
	and p.mo.momz >= -5*FRACUNIT 
	and p.mo.momz <= 5*FRACUNIT 
	and not (p.mo.eflags & MFE_GOOWATER)then
		p.mo.state = S_TAZFLOAT
		S_StartSound(p.mo, sfx_tzft)
		p.tossdelay = TICRATE/4*3
		p.floated = true
		p.wallbounce = false
		P_SpawnMobj(p.mo.x, p.mo.y, p.mo.z, MT_OTRAIL)
	elseif p.mo.state == S_PLAY_TWINSPIN
	and p.zok != true then
		p.mo.state = S_TAZTHOK
		p.normalspeed = 40*FRACUNIT
		S_StartSound(p.mo, sfx_tzok)
		p.zok = true
		if p.powers[pw_shield] == SH_FLAMEAURA 
		or (p.tashnado != true 
		and p.wallbounces == 0) then
			P_InstaThrust(p.mo, p.drawangle, 40*FRACUNIT)
			p.tashnado = true
		else
			P_InstaThrust(p.mo, p.drawangle, 25*FRACUNIT)
		end
	else	
		p.mo.state = S_SPINTWIN
		S_StartSound(p.mo, sfx_tzpn)
		if p.mo.eflags & MFE_GOOWATER then
			P_SetObjectMomZ(p.mo, p.mo.momz-FRACUNIT*2)
		end
	return true
	end
end)

//Float alternate input
addHook("AbilitySpecial", function(p)
	if p.mo.skin != "taz" then return end 
	if (p.pflags & PF_JUMPDOWN) then return end
	if p.mo.state == S_SPINTWIN 
	and p.floated != true 
	and p.mo.momz >= -4*FRACUNIT 
	and p.mo.momz <= 4*FRACUNIT 
	and not (p.mo.eflags & MFE_GOOWATER) then
		p.mo.state = S_TAZFLOAT
		S_StartSound(p.mo, sfx_tzft)
		p.tossdelay = TICRATE/4*3
		p.floated = true
		p.wallbounce = false
		P_SpawnMobj(p.mo.x, p.mo.y, p.mo.z, MT_OTRAIL)
	return true
	end
	if p.mo.eflags & MFE_GOOWATER then
		P_SetObjectMomZ(p.mo, p.mo.momz+FRACUNIT)
	end
end)

addHook("MobjMoveCollide", function(m,t)
	if m.player and m.player.valid and m.player.mo.skin == "taz" then
//Wall Crash
		if t and t.valid and t.flags & MF_MONITOR 
		and t.target 
		and t.info.deathstate != S_GOLDBOX_OFF1 then
		return false
		end
		if t and t.valid and t.flags & MF_MONITOR 
		and m.player.tazlide != 0 
		and not t.target 
		and t.info.deathstate != S_GOLDBOX_OFF1 then
		t.target = m.player.mo
		t.state = t.info.deathstate
		return false
		end
	end
end,MT_PLAYER)	

//Wallbounce Wallslide Walljump
addHook("MobjMoveBlocked", function(mo,t,l)
    local player = mo.player
	if player and player.valid and player.mo.skin == "taz" then
		if not (player.mo.eflags & MFE_UNDERWATER) then
//Wall Bounce
			if (player.mo.state == S_SPINTWIN
			or (player.mo.state == S_TAZFLOAT
			and (player.pflags & PF_JUMPDOWN or player.pflags & PF_SPINDOWN)))
			and player.speed > 10*FRACUNIT
			and player.wallbounce != true
			and player.wallbounces != 30 
			and l and l.valid then
				if l == player.laztwall then
					player.cheatbounce = true
				else
					player.cheatbounce = false
				end
				player.laztwall = l
				player.pflags = $&~PF_STARTJUMP
				player.normalspeed = FRACUNIT*36
				player.wallmomx = player.mo.momx
				player.wallmomy = player.mo.momy
				player.wallbounce = true
				player.wallbounces = $+1
				if player.cheatbounce != true then
					if not (player.mo.flags2 & MF2_OBJECTFLIP)
					and not (player.mo.eflags & MFE_VERTICALFLIP)then
						if player.mo.momz >= 0 then
							player.mo.state = S_TRIPLETSPIN
							P_SetObjectMomZ(player.mo, FRACUNIT/2*23, false)
							P_SpawnMobj(player.mo.x, player.mo.y, player.mo.z, MT_OTRAIL)
						else
							player.mo.state = S_TRIPLETSPIN
							P_SetObjectMomZ(player.mo, FRACUNIT*5, false)
							P_SpawnMobj(player.mo.x, player.mo.y, player.mo.z, MT_OTRAIL)
						end
					elseif player.mo.flags2 & MF2_OBJECTFLIP
					or player.mo.eflags & MFE_VERTICALFLIP then 
						if player.mo.momz <= 0 then
							player.mo.state = S_TRIPLETSPIN
							P_SetObjectMomZ(player.mo, FRACUNIT/2*23, false)
							P_SpawnMobj(player.mo.x, player.mo.y, player.mo.z, MT_OTRAIL)
						else
							player.mo.state = S_TRIPLETSPIN
							P_SetObjectMomZ(player.mo, FRACUNIT*5, false)
							P_SpawnMobj(player.mo.x, player.mo.y, player.mo.z, MT_OTRAIL)
						end
					end
				else
					player.wallbounce = false
				end
			end
//Wall Slide by KirbTheKorb, from: Extra spicy momentum! (modified a bit) TY Kirb!
			if (player.pflags & PF_SPINNING
			or player.tazwanted == true)
			and player.mo.state != S_TAZFLOAT
			and player.mo.state != S_SPINTWIN
			and player.mo.state != S_TAZTHOK
			and player.mo.state != S_TRIPLETSPIN
			and player.mo.state != S_PLAY_TWINSPIN 
			and player.tazlide == 0 
			and l and l.valid then
				if player.tazwall != true then
					player.weapondelay = TICRATE/2*3
				end
				if player.speed >= 10*FRACUNIT 
				and player.weapondelay then
					player.tazwall = true
					player.charability = CA_TWINSPIN
					if (player.mo.momz < 1
					and not (player.mo.flags2 & MF2_OBJECTFLIP)
					and not (player.mo.eflags & MFE_VERTICALFLIP))
					or (player.mo.momz > -1
					and (player.mo.flags2 & MF2_OBJECTFLIP
					or player.mo.eflags & MFE_VERTICALFLIP)) then
						if player.pflags & PF_SPINNING then
							P_SetObjectMomZ(player.mo, player.speed/5, true)
						else
							P_SetObjectMomZ(player.mo, player.speed/4, true)
						end
					end
				end
			end
//Wall Jump
			if player.cmd.buttons & BT_JUMP
			and player.tazwall == true 
			and l and l.valid then
				player.pflags = $&~PF_JUMPED
				player.jumpfactor = 11*FRACUNIT/10
				P_DoJump(player)
				P_SpawnMobj(player.mo.x, player.mo.y, player.mo.z, MT_OTRAIL)
				player.tazwall = false
				local fart = (P_RandomRange(1, 3))
				if fart == 1 then
					S_StartSound(player.mo, sfx_fart)
				elseif fart == 2 then
					S_StartSound(player.mo, sfx_fart2)	
				end
			end
		end
//Wall Crash
		if player.tazlide != 0 
		and player.speed > 20*FRACUNIT 
		and l and l.valid then
			player.tashnado = false
			player.tazwanted = false
			player.tazlide = 0
			player.mo.momx = -player.mo.momx/7
			player.mo.momy = -player.mo.momy/7
			player.tazquished = true
			player.crashed = true
			player.pflags = $|PF_FULLSTASIS
			player.mo.state = S_TAZCRASHED
			S_StartSound(player.mo, sfx_tbnk)
			P_StartQuake(FRACUNIT*20, TICRATE/4)
		end
	end
end,MT_PLAYER)

//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.state == S_TASH 
		or mobj.state == S_TAZ1 
		or mobj.state == S_TAZ0
		or mobj.state == S_TAZFLOAT
		or mobj.state == S_SPINTWIN
		or mobj.state == S_PLAY_ROLL) then
			P_KillMobj(thing, mobj, mobj, 0)
		end
	end
end,MT_SPIKE)

//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_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
			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]then
			t.player.tashnado = false
			t.player.crashed = false
			t.player.tazlide = 0
			t.player.tazfire = false
			if t.player.powers[pw_shield] 
			and not P_CheckDeathPitCollide(t) then
				S_StartSound(t.player.mo, sfx_tbrnt)
			end
		end
	end
end,MT_PLAYER)

//Shields
addHook("ShieldSpecial", function(p)
	if p.mo.skin != "taz" then return end
	if (p.powers[pw_shield] != SH_TGUM  
	and (p.mo.state != S_SPINTWIN
	or (p.pflags & PF_JUMPDOWN)))
	or (p.powers[pw_shield] == SH_TGUM 
	and p.mo.state == S_PLAY_TWINSPIN)
	or p.mo.state == S_PLAY_GASP
	or p.powers[pw_shield] == SH_FLAMEAURA then
	return true
	end
	if p.powers[pw_shield] == SH_ARMAGEDDON then
		S_StartSound(p.mo, sfx_burp)
		P_FlashPal(p, PAL_MIXUP, TICRATE/4)
	end
end)

addHook("ShieldSpawn", function(p)
	if p.mo.skin != "taz" then return end
	if p.powers[pw_shield] == SH_GUM
	or p.powers[pw_shield] == SH_THUNDERCOIN
	or p.powers[pw_shield] == SH_WHIRLWIND then
		P_RemoveShield(p)
		p.powers[pw_shield] = SH_TGUM
		S_StartSound(p.mo, sfx_gump)
		p.shieldscale = 0
	end
	if p.powers[pw_shield] == SH_TGUM then
		S_StartSound(p.mo, sfx_gump)
		p.shieldscale = 0
	end
	if p.powers[pw_shield] == SH_ARMAGEDDON then
		p.tossdelay = 0
		p.shieldscale = 0
	end
	if p.powers[pw_shield] == SH_ATTRACT then
		p.shieldscale = 0
	end
	if p.powers[pw_shield] == SH_BUBBLEWRAP then
		p.shieldscale = FRACUNIT/4*5
	end
	if p.powers[pw_shield] == SH_FLAMEAURA then
		p.shieldscale = 0
		p.tazfire = true
	end
	if p.powers[pw_shield] == SH_ELEMENTAL then
		P_RemoveShield(p)
		if p.chili == true then
			p.powers[pw_shield] = SH_FLAMEAURA
			p.shieldscale = 0
			p.tazfire = true
			p.chili = false
		else
			p.powers[pw_shield] = SH_BUBBLEWRAP
			p.shieldscale = FRACUNIT/4*5
			P_SpawnShieldOrb(p)
		end
	end
	if (p.powers[pw_shield] == SH_PITY) 
	or (p.powers[pw_shield] == SH_PINK) then
		p.shieldscale = 0
		if p.tzflck3 == nil 
		or (p.tzflck3 and not p.tzflck3.valid) then
			if (p.powers[pw_shield] == SH_PITY) then
				local flicky = P_SpawnMobj(p.mo.x, p.mo.y, p.mo.z, MT_TAZFLICKY)
				flicky.color = SKINCOLOR_GREEN
				flicky.target = p.mo
				p.tzflck3 = flicky
				S_StartSound(p.mo, sfx_3db09)
			else
				local flicky = P_SpawnMobj(p.mo.x, p.mo.y, p.mo.z, MT_TAZFLICKY)
				flicky.color = SKINCOLOR_ROSY
				flicky.target = p.mo
				p.tzflck3 = flicky
				S_StartSound(p.mo, sfx_3db09)
			end
		end
	elseif p.tzflck3 and p.tzflck3.valid then
		P_RemoveMobj(p.tzflck3)
		p.tzflck3 = nil
	end
	if (p.powers[pw_shield] & SH_FORCE)
	and (p.powers[pw_shield] & SH_FORCEHP) then
		p.shieldscale = 0
		if p.tzflck == nil 
		or (p.tzflck and not p.tzflck.valid) then
			local flicky = P_SpawnMobj(p.mo.x, p.mo.y, p.mo.z, MT_TAZFLICKY)
			flicky.color = SKINCOLOR_WAVE
			flicky.target = p.mo
			p.tzflck = flicky
			S_StopSoundByID(p.mo, sfx_forcsg)
			S_StopSoundByID(p.mo, sfx_frcssg)
			S_StartSound(p.mo, sfx_3db09)
		end
		if p.tzflck2 == nil 
		or (p.tzflck2 and not p.tzflck2.valid)then
			local flicky2 = P_SpawnMobj(p.mo.x, p.mo.y, p.mo.z, MT_TAZFLICKY2)
			flicky2.color = SKINCOLOR_WAVE
			flicky2.target = p.mo
			p.tzflck2 = flicky2
			S_StopSoundByID(p.mo, sfx_forcsg)
			S_StopSoundByID(p.mo, sfx_frcssg)
			S_StartSound(p.mo, sfx_flck2)
		end
	else
		if p.tzflck and p.tzflck.valid then
			P_RemoveMobj(p.tzflck)
			p.tzflck = nil
		end
		if p.tzflck2 and p.tzflck2.valid then
			P_RemoveMobj(p.tzflck2)
			p.tzflck2 = nil
		end
	end
end)

addHook("MobjRemoved", function(m)
	if m.state == S_TAZROCK then
		local rock0 = P_SpawnMobj(m.x, m.y, m.z, MT_ROCKCRUMBLE10)
		rock0.scale = FRACUNIT/3
		rock0.momz = P_RandomRange(1, 3)*FRACUNIT
		rock0.momx = P_RandomRange(-3, 3)*FRACUNIT
		rock0.momy = P_RandomRange(-3, 3)*FRACUNIT
		local rock2 = P_SpawnMobj(m.x, m.y, m.z, MT_ROCKCRUMBLE10)
		rock2.scale = FRACUNIT/3
		rock2.momz = P_RandomRange(1, 3)*FRACUNIT
		rock2.momx = P_RandomRange(-3, 3)*FRACUNIT
		rock2.momy = P_RandomRange(-3, 3)*FRACUNIT
		local rock3 = P_SpawnMobj(m.x, m.y, m.z, MT_ROCKCRUMBLE10)
		rock3.scale = FRACUNIT/3
		rock3.momz = P_RandomRange(1, 3)*FRACUNIT
		rock3.momx = P_RandomRange(-3, 3)*FRACUNIT
		rock3.momy = P_RandomRange(-3, 3)*FRACUNIT
		S_StartSound(rock3, sfx_wbreak)
	elseif m.sprite == SPR_ROII then
		local ice = P_SpawnMobj(m.x, m.y, m.z, MT_SPARK)
		ice.colorized = true
		ice.color = SKINCOLOR_ICY
		ice.scale = FRACUNIT/2*3
		local rock0 = P_SpawnMobj(m.x, m.y, m.z, MT_TIDB)
		rock0.scale = FRACUNIT/2
		rock0.momz = P_RandomRange(1, 3)*FRACUNIT
		rock0.momx = P_RandomRange(-3, 3)*FRACUNIT
		rock0.momy = P_RandomRange(-3, 3)*FRACUNIT
		local rock2 = P_SpawnMobj(m.x, m.y, m.z, MT_TIDB)
		rock2.scale = FRACUNIT/2
		rock2.momz = P_RandomRange(1, 3)*FRACUNIT
		rock2.momx = P_RandomRange(-3, 3)*FRACUNIT
		rock2.momy = P_RandomRange(-3, 3)*FRACUNIT
		local rock3 = P_SpawnMobj(m.x, m.y, m.z, MT_TIDB)
		rock3.scale = FRACUNIT/2
		rock3.momz = P_RandomRange(1, 3)*FRACUNIT
		rock3.momx = P_RandomRange(-3, 3)*FRACUNIT
		rock3.momy = P_RandomRange(-3, 3)*FRACUNIT
		S_StartSound(rock3, sfx_shattr)
	elseif m.sprite == SPR_ROID then
		local ice = P_SpawnMobj(m.x, m.y, m.z, MT_SPARK)
		ice.colorized = true
		ice.color = SKINCOLOR_AETHER
		ice.scale = FRACUNIT/2*3
		local rock0 = P_SpawnMobj(m.x, m.y, m.z, MT_CRYSTALCRUMBLE)
		rock0.scale = FRACUNIT/2
		rock0.momz = P_RandomRange(1, 3)*FRACUNIT
		rock0.momx = P_RandomRange(-3, 3)*FRACUNIT
		rock0.momy = P_RandomRange(-3, 3)*FRACUNIT
		local rock2 = P_SpawnMobj(m.x, m.y, m.z, MT_CRYSTALCRUMBLE)
		rock2.scale = FRACUNIT/2
		rock2.momz = P_RandomRange(1, 3)*FRACUNIT
		rock2.momx = P_RandomRange(-3, 3)*FRACUNIT
		rock2.momy = P_RandomRange(-3, 3)*FRACUNIT
		local rock3 = P_SpawnMobj(m.x, m.y, m.z, MT_CRYSTALCRUMBLE)
		rock3.scale = FRACUNIT/2
		rock3.momz = P_RandomRange(1, 3)*FRACUNIT
		rock3.momx = P_RandomRange(-3, 3)*FRACUNIT
		rock3.momy = P_RandomRange(-3, 3)*FRACUNIT
		S_StartSound(rock3, sfx_shattr)
	else
		local rock0 = P_SpawnMobj(m.x, m.y, m.z, MT_LAVASPLISH)
		rock0.scale = FRACUNIT/2
		rock0.momz = P_RandomRange(1, 3)*FRACUNIT
		rock0.momx = P_RandomRange(-3, 3)*FRACUNIT
		rock0.momy = P_RandomRange(-3, 3)*FRACUNIT
		local rock2 = P_SpawnMobj(m.x, m.y, m.z, MT_LAVASPLISH)
		rock2.scale = FRACUNIT/2
		rock2.momz = P_RandomRange(1, 3)*FRACUNIT
		rock2.momx = P_RandomRange(-3, 3)*FRACUNIT
		rock2.momy = P_RandomRange(-3, 3)*FRACUNIT
		local rock3 = P_SpawnMobj(m.x, m.y, m.z, MT_LAVASPLISH)
		rock3.scale = FRACUNIT/2
		rock3.momz = P_RandomRange(1, 3)*FRACUNIT
		rock3.momx = P_RandomRange(-3, 3)*FRACUNIT
		rock3.momy = P_RandomRange(-3, 3)*FRACUNIT
		S_StartSound(rock3, sfx_bexpld)
	end
end,MT_TAZROCK)

addHook("MobjRemoved", function(m)
	if m.state == S_TWDB 
	or m.state == S_TWDB2 then
		local expl = P_SpawnMobj(m.x, m.y, m.z, MT_DUST)
		expl.colorized = true
		expl.color = SKINCOLOR_BRONZE
		expl.scale = FRACUNIT/2*3
		expl.destscale = FRACUNIT*2
		S_StartSound(rock3, sfx_wbreak)
	else
		P_SpawnMobj(m.x, m.y, m.z, MT_EXPLODE)
		S_StartSound(rock3, sfx_wbreak)
	end
end,MT_TAZSPITTLE2)

//Bubblegum item
addHook("MobjRemoved", function(mobj)
	if mobj and mobj.valid then
		P_SpawnMobj(mobj.x, mobj.y, mobj.z, MT_TAZGUM)
	end
end,MT_GUMSPAWN)
addHook("TouchSpecial", function(s, t)
	if t and t.valid
	and t.player.charability != CA_FLY
	and t.player.powers[pw_shield] != SH_TGUM then
		if t.skin == "taz" then
			S_StartSound(t, sfx_gump)
		end
		t.player.powers[pw_shield] = SH_TGUM
		S_StartSound(t, sfx_s3k77)
		P_RemoveMobj(s)
	end
return true
end,MT_TAZGUM)

//Force Shield "Orb"
addHook("MobjThinker", function(m)
	A_RotateSpikeBall(m)
	m.z = m.target.z + 50*FRACUNIT
end,MT_TAZFLICKY)
addHook("MobjThinker", function(m)
	A_RotateSpikeBall(m)
	m.z = m.target.z + 50*FRACUNIT
end,MT_TAZFLICKY2)
addHook("MobjRemoved", function(m)
	local quil0 = P_SpawnMobj(m.x, m.y, m.z, MT_TMQUIL)
	quil0.color = m.color
	quil0.momz = P_RandomRange(3, 5)*FRACUNIT
	quil0.momx = P_RandomRange(-3, 3)*FRACUNIT
	quil0.momy = P_RandomRange(-3, 3)*FRACUNIT
	local quil2 = P_SpawnMobj(m.x, m.y, m.z, MT_TMQUIL)
	quil2.color = m.color
	quil2.momz = P_RandomRange(3, 5)*FRACUNIT
	quil2.momx = P_RandomRange(-3, 3)*FRACUNIT
	quil2.momy = P_RandomRange(-3, 3)*FRACUNIT
	local quil3 = P_SpawnMobj(m.x, m.y, m.z, MT_TMQUIL)
	quil3.color = m.color
	quil3.momz = P_RandomRange(3, 5)*FRACUNIT
	quil3.momx = P_RandomRange(-3, 3)*FRACUNIT
	quil3.momy = P_RandomRange(-3, 3)*FRACUNIT
	S_StartSound(m.target, sfx_3db14)
end,MT_TAZFLICKY)
addHook("MobjRemoved", function(m)
	local quil0 = P_SpawnMobj(m.x, m.y, m.z, MT_TMQUIL)
	quil0.color = m.color
	quil0.momz = P_RandomRange(3, 5)*FRACUNIT
	quil0.momx = P_RandomRange(-3, 3)*FRACUNIT
	quil0.momy = P_RandomRange(-3, 3)*FRACUNIT
	local quil2 = P_SpawnMobj(m.x, m.y, m.z, MT_TMQUIL)
	quil2.color = m.color
	quil2.momz = P_RandomRange(3, 5)*FRACUNIT
	quil2.momx = P_RandomRange(-3, 3)*FRACUNIT
	quil2.momy = P_RandomRange(-3, 3)*FRACUNIT
	local quil3 = P_SpawnMobj(m.x, m.y, m.z, MT_TMQUIL)
	quil3.color = m.color
	quil3.momz = P_RandomRange(3, 5)*FRACUNIT
	quil3.momx = P_RandomRange(-3, 3)*FRACUNIT
	quil3.momy = P_RandomRange(-3, 3)*FRACUNIT
	S_StartSound(m.target, sfx_3db14)
end,MT_TAZFLICKY2)

//Respawn reset
addHook("PlayerSpawn", function(p)
	if p and p.valid and p.mo and p.mo.valid and p.mo.skin == "taz" then
		p.normalspeed = FRACUNIT*30
		p.jumpfactor = FRACUNIT
		p.tazquishing = FRACUNIT
		p.height = 50*FRACUNIT
		p.mo.shadowscale = FRACUNIT/10*12
		p.tashnado = false
		p.hungry = true
		p.wallbounce = false
		p.tazlide = 0
		p.crashed = false
		p.tazquished = false
		p.farted = false
		p.thatwasall = false
		p.chili = false
		p.spcanflip = false
		if multiplayer == false then
			p.skincolor = SKINCOLOR_TAZ
			if gamemap == 40 then
				p.skincolor = SKINCOLOR_WERETAZ
			end
		end
		if p.drowned == true 
		and not (p.mo.eflags & MFE_UNDERWATER) then
			p.mo.state = S_TAZDROWN
			p.weapondelay = TICRATE/10
		elseif p.skincolor == SKINCOLOR_WERETAZ then
			S_StartSound(p.mo, sfx_twolf)
		else
			local zpawn = P_RandomRange(1, 5)
			if zpawn == 1 then
				S_StartSound(p.mo, sfx_tsup)
			elseif zpawn == 2 then
				S_StartSound(p.mo, sfx_tzs1)
			elseif zpawn == 3 then
				S_StartSound(p.mo, sfx_tzs2)
			elseif zpawn == 4 then
				S_StartSound(p.mo, sfx_tzs3)
			elseif zpawn == 5 then
				S_StartSound(p.mo, sfx_tyow)
			end
		end
	end
end)

//Random Farts
addHook("JumpSpecial", function(p)
	if p.mo.skin != "taz" then return 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 = 36*FRACUNIT
	end
	if p.farted != true then
		p.farted = true
		local fart = P_RandomRange(1, 5)
		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 = 36*FRACUNIT
	end
end)