When the script runs in test-mode (client) it runs as expected. When the script runs in a game, the onTouch event proves to be very delayed from the time the rocket hits the object to the time it actually explodes. Here's the code that makes the rocket explode:
script.Parent.Sound:Play() debounce = true script.Parent.Touched:connect(function(part) if debounce == true then debounce = false local explosion = Instance.new("Explosion") explosion.Parent = game.Workspace script.Parent.Explosion.PlayOnRemove = true explosion.Position = script.Parent.CFrame * Vector3.new(0,0,-script.Parent.Size.Z/2) function ExplosionHit(part) if part:IsA("Part") and part.Anchored == false and part.Shape.Name == "Block" then -- you can also use just the objectvalue of the part part.CanCollide = false end end local creator = script.Parent:findFirstChild("creator") function tagHumanoid(humanoid, creator) -- tag does not need to expire iff all explosions lethal if creator ~= nil then local new_tag = creator:clone() new_tag.Parent = humanoid end end function untagHumanoid(humanoid) if humanoid ~= nil then local tag = humanoid:findFirstChild("creator") if tag ~= nil then tag.Parent = nil end end end local humanoid = part.Parent:FindFirstChild("Humanoid") tagHumanoid(humanoid, creator) explosion.Hit:connect(ExplosionHit) script.Parent:remove() end end)