local function l(l,O,h)if l and O then local O,A=FindCharacterAncestor(l.Parent)if O then local l=CreatorTag.Value if l and not l.Neutral then local h=PlayersService:GetPlayerFromCharacter(O)if h and(h~=l and h.TeamColor==Rocket.BrickColor)then return end end end if A and A.Health>0 then if l.Name=="\084\111\114\115\111"then ApplyTags(A)A:TakeDamage(BLAST_DAMAGE)end else if l.Name~="\072\097\110\100\108\101"then l:BreakJoints()local O=Instance.new("\066\111\100\121\070\111\114\099\101",l)O.force=((l.Position-h).unit*BLAST_FORCE)*l:GetMass()DebrisService:AddItem(O,.1)end end end end local function O(O)if Rocket and O then if IGNORE_LIST[string.lower(O.Name)]then return end local h=CreatorTag.Value if h then if h.Character and h.Character:IsAncestorOf(O)then return end if not h.Neutral then local l=FindCharacterAncestor(O.Parent)local A=PlayersService:GetPlayerFromCharacter(l)if A and(A~=h and A.TeamColor==Rocket.BrickColor)then return end end end if O==game.Workspace.Terrain then local l=Rocket.Position+Rocket.CFrame.lookVector*(Rocket.Size.Z/2)local O=game.Workspace.Terrain:WorldToCellPreferSolid(l)local h=game.Workspace.Terrain:GetCell(O.X,O.Y,O.Z)if h==Enum.CellMaterial.Water or h==Enum.CellMaterial.Empty then return end end local A=Instance.new("\069\120\112\108\111\115\105\111\110")A.BlastPressure=0 A.BlastRadius=BLAST_RADIUS A.ExplosionType=Enum.ExplosionType.NoCraters A.Position=Rocket.Position A.Parent=game.Workspace A.Hit:connect(function(O,h)l(O,h,A.Position)end)script.Parent=A CreatorTag.Parent=script Rocket:Destroy()end end
-- Customized explosive effect that doesn't affect teammates and only breaks joints on dead parts
local function OnExplosionHit(hitPart, hitDistance, blastCenter)
	if hitPart and hitDistance then
		local character, humanoid = FindCharacterAncestor(hitPart.Parent)

		if character then
			local myPlayer = CreatorTag.Value
			if myPlayer and not myPlayer.Neutral then -- Ignore friendlies caught in the blast
				local player = PlayersService:GetPlayerFromCharacter(character)
				if player and player ~= myPlayer and player.TeamColor == Rocket.BrickColor then
					return
				end
			end
		end

		if humanoid and humanoid.Health > 0 then -- Humanoids are tagged and damaged
			if hitPart.Name == "Torso" then
				ApplyTags(humanoid)
				humanoid:TakeDamage(BLAST_DAMAGE)
			end
		else -- Loose parts and dead parts are blasted
			if hitPart.Name ~= "Handle" then
				hitPart:BreakJoints()
				local blastForce = Instance.new("BodyForce", hitPart) --NOTE: We will multiply by mass so bigger parts get blasted more
				blastForce.force = (hitPart.Position - blastCenter).unit * BLAST_FORCE * hitPart:GetMass()
				DebrisService:AddItem(blastForce, 0.1)
			end
		end
	end
end

local function OnTouched(otherPart)
	if Rocket and otherPart then
		-- Fly through anything in the ignore list
		if IGNORE_LIST[string.lower(otherPart.Name)] then
			return
		end

		local myPlayer = CreatorTag.Value
		if myPlayer then
			-- Fly through the creator
			if myPlayer.Character and myPlayer.Character:IsAncestorOf(otherPart) then
				return
			end

			-- Fly through friendlies
			if not myPlayer.Neutral then
				local character = FindCharacterAncestor(otherPart.Parent)
				local player = PlayersService:GetPlayerFromCharacter(character)
				if player and player ~= myPlayer and player.TeamColor == Rocket.BrickColor then
					return
				end
			end
		end

		-- Fly through terrain water
		if otherPart == game.Workspace.Terrain then
			--NOTE: If the rocket is large, then the simplifications made here will cause it to fly through terrain in some cases
			local frontOfRocket = Rocket.Position + (Rocket.CFrame.lookVector * (Rocket.Size.Z / 2))
			local cellLocation = game.Workspace.Terrain:WorldToCellPreferSolid(frontOfRocket)
			local cellMaterial = game.Workspace.Terrain:GetCell(cellLocation.X, cellLocation.Y, cellLocation.Z)
			if cellMaterial == Enum.CellMaterial.Water or cellMaterial == Enum.CellMaterial.Empty then
				return
			end
		end

		-- Create the explosion
		local explosion = Instance.new("Explosion")
		explosion.BlastPressure = 0 -- Completely safe explosion
		explosion.BlastRadius = BLAST_RADIUS
		explosion.ExplosionType = Enum.ExplosionType.NoCraters
		explosion.Position = Rocket.Position
		explosion.Parent = game.Workspace

		-- Connect custom logic for the explosion
		explosion.Hit:connect(function(hitPart, hitDistance)
			OnExplosionHit(hitPart, hitDistance, explosion.Position)
		end)

		-- Move this script and the creator tag (so our custom logic can execute), then destroy the rocket
		script.Parent = explosion
		CreatorTag.Parent = script
		Rocket:Destroy()
	end
end
