//Bubblegum shield from: Extra Shields and Powerups by Goldenhog(modified) 
//TY Goldenhog!

freeslot("MT_EXTRA_TGORB","S_EXTRA_TGORB")

mobjinfo[MT_EXTRA_TGORB] = {
	doomednum = -1,
	spawnstate = S_EXTRA_TGORB,
	spawnhealth = 1000,
	reactiontime = 8,
	radius = 32*FRACUNIT,
	height = 64*FRACUNIT,
	mass = 16,
	dispoffset = 1,
	flags = MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_SCENERY
}

function A_GiveExtraShield(actor,var1)
	if actor.target and actor.target.player
		if actor.target.player.powers[pw_shield] != SH_TGUM
			local extraorb = P_SpawnMobj(actor.target.x,actor.target.y,actor.target.z,MT_EXTRA_TGORB)
			extraorb.target = actor.target
		end
		P_SwitchShield(actor.target.player,var1)
		S_StartSound(actor.target,actor.info.seesound)
	end
end

function A_Sparkling(actor,var1)
-- P_RandomRange can suck my ass
	local rad = ((actor.radius/FRACUNIT)/2)*3
	local h8 = actor.height/FRACUNIT
-- Let's go. Action to replace A_BossScream since that can spawn stuff right in
-- front of your FPS viewpoint, which'll mess you up when RPing as Doomguy.
	local h1 = P_RandomRange(rad/8,rad)*FRACUNIT
	local h2 = P_RandomRange(rad/8,rad)*FRACUNIT
	local ang = actor.angle+FixedAngle(P_RandomRange(45,315)*FRACUNIT)
	local x = FixedMul(h1,cos(ang))
	local y = FixedMul(h2,sin(ang))
	local z = FixedDiv(actor.height/2,actor.scale)+(P_RandomRange(-h8/4,h8/4)*FRACUNIT)
	local spk = P_SpawnMobjFromMobj(actor,x,y,z,var1)
end

states[S_EXTRA_TGORB] = {
	sprite = SPR_NULL,
	frame = A,
	tics = -1,
	nextstate = S_EXTRA_TGORB

}

freeslot("MT_TAZ_BUBBLEGUM",
"S_TAZ_BUBBLEGUM"
)

local SH_TGUM = 18
rawset(_G, "SH_TGUM", SH_TGUM)

mobjinfo[MT_TAZ_BUBBLEGUM] = {
	doomednum = -1,
	spawnstate = S_INVISIBLE,
	flags = MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIP|MF_SCENERY|MF_NOCLIPHEIGHT
}

states[S_TAZ_BUBBLEGUM] = {SPR_TGUM,FF_TRANS40|A,-1}

addHook("MobjThinker",function(mo)
	if not mo.target
		if mo.effthis
			mo.effthis.target = nil
		end
		P_RemoveMobj(mo)
		return
	end
	if not mo.effthis
		mo.effthis = P_SpawnMobjFromMobj(mo.target,0,0,0,MT_OVERLAY)
		mo.effthis.target = mo.target
		mo.effthis.state = S_TAZ_BUBBLEGUM
		mo.effthis.color = SKINCOLOR_BUBBLEGUM
	end

	if mo.target.player.powers[pw_shield] != SH_TGUM
	or P_IsObjectOnGround(mo.target)
	or mo.target.eflags & MFE_SPRUNG
	or mo.target.eflags & MFE_GOOWATER
	or mo.target.player.powers[pw_carry]
		S_StartSound(mo.target,sfx_s3k77)
		S_StartSound(mo.target,sfx_gpop)
		mo.target = nil
		return
	end
	if mo.target.state != S_PLAY_GASP then
		mo.target.player.panim = PA_RIDE
		mo.target.state = S_PLAY_GASP
		mo.target.player.gum = true
	end
	if not mo.target.player.tossdelay
		mo.destscale = FRACUNIT/2
	end
	if not (mo.target.eflags & MFE_VERTICALFLIP)
		if mo.target.player.cmd.buttons & BT_SPIN 
		or not mo.target.player.tossdelay then
			P_SetObjectMomZ(mo.target,-mo.target.momz/16,true)
		else
			P_SetObjectMomZ(mo.target,FRACUNIT*7)
		end
	end
	if mo.target.eflags & MFE_VERTICALFLIP
		if mo.target.player.cmd.buttons & BT_SPIN 
		or not mo.target.player.tossdelay then
			P_SetObjectMomZ(mo.target,mo.target.momz/16,true)
		else
			P_SetObjectMomZ(mo.target,-7*FRACUNIT)
		end
	end
	if mo.target.player.cmd.buttons & BT_JUMP 
	and not (mo.target.player.pflags & PF_SPINDOWN) then
		S_StartSound(mo.target,sfx_s3k77)
		S_StartSound(mo.target,sfx_gpop)
		P_DoJump(mo.target.player,false)
		local pop = P_SpawnMobj(mo.target.player.mo.x, mo.target.player.mo.y, mo.target.player.mo.z, MT_GUMPOP)
		pop.color = SKINCOLOR_BUBBLEGUM
		mo.target.player.pflags = $ & ~PF_STARTJUMP //& ~PF_JUMPED
		mo.target.state = S_PLAY_SPRING
		mo.target.player.panim = PA_SPRING
		mo.target = nil
		return
	elseif mo.target.player.cmd.buttons & BT_JUMP
	and (mo.target.player.pflags & PF_SPINDOWN)
	and mo.target.state == S_PLAY_GASP then
		S_StartSound(mo.target,sfx_s3k77)
		S_StartSound(mo.target,sfx_gpop)
		local pop = P_SpawnMobj(mo.target.player.mo.x, mo.target.player.mo.y, mo.target.player.mo.z, MT_GUMPOP)
		pop.color = SKINCOLOR_BUBBLEGUM
		mo.target.player.pflags = $ & ~PF_STARTJUMP
		mo.target.player.pflags = $|PF_JUMPED
		mo.target.state = S_PLAY_SPRING
		mo.target.player.panim = PA_SPRING
		mo.target = nil
		return
	end
end, MT_TAZ_BUBBLEGUM)

addHook("MobjThinker", function(mo)
	if not mo.target P_KillMobj(mo) return end
	if mo.target.player.powers[pw_shield] == SH_TGUM
		mo.color = SKINCOLOR_BUBBLEGUM
	end
	mo.scale = skins[mo.target.skin].shieldscale + (FRACUNIT/10)
	if (mo.target.player.powers[pw_invulnerability] > 0)
	or (mo.target.player.powers[pw_super] > 0)
		mo.flags2 = $ | MF2_DONTDRAW
	else
		mo.flags2 = $ & ~MF2_DONTDRAW
	end
	if  mo.target.player.powers[pw_shield] != SH_TGUM
		mo.target.flags2 = $ & ~MF2_OBJECTFLIP
		mo.target.star_timer = 0
		P_KillMobj(mo)
		return
	end
	if (mo.target.sprite2 == SPR2_ROLL)
	or (mo.target.sprite2 == SPR2_SPIN)
	or (mo.target.sprite2 == SPR2_GLID)
		A_CapeChase(mo,(-7*FRACUNIT)+0)
	else
		A_CapeChase(mo)
	end
end, MT_EXTRA_TGORB)

addHook("ShieldSpecial", function(player)
	if player.powers[pw_shield] == SH_TGUM
	and player.tossdelay
	and player.gumw != true
	and not (player.pflags & PF_JUMPDOWN) then
		S_StartSound(player.mo, sfx_s3k8a)
		local bubb = P_SpawnMobjFromMobj(player.mo,0,0,0,MT_TAZ_BUBBLEGUM)
		bubb.target = player.mo
		player.pflags = $ & ~PF_STARTJUMP & ~PF_JUMPED & ~PF_SPINNING
	return true
	end
end)