Gallbox rock That heals
Key RequiredUniversal

Gallbox rock That heals

Universal ScriptRubixScriptingsRubixScriptings 300 views 180 executesUpdated Apr 24, 2026
Unrated
00
Lua Script•518 lines (14626 chars)
-- Gallhealer Generator (LocalScript)
-- Place this LocalScript in StarterPlayerScripts

local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local Debris = game:GetService("Debris")

local Player = Players.LocalPlayer
local Character = Player.Character or Player.CharacterAdded:Wait()
local Humanoid = Character:WaitForChild("Humanoid")

-- Teal Colors (dark to light, 15 colors)
local tealColors = {
	Color3.fromRGB(0, 60, 70),
	Color3.fromRGB(0, 80, 90),
	Color3.fromRGB(0, 100, 110),
	Color3.fromRGB(0, 120, 128),
	Color3.fromRGB(0, 128, 128),
	Color3.fromRGB(0, 139, 139),
	Color3.fromRGB(0, 150, 150),
	Color3.fromRGB(0, 160, 160),
	Color3.fromRGB(32, 178, 170),
	Color3.fromRGB(64, 190, 180),
	Color3.fromRGB(72, 200, 190),
	Color3.fromRGB(100, 210, 200),
	Color3.fromRGB(128, 220, 210),
	Color3.fromRGB(150, 230, 220),
	Color3.fromRGB(175, 238, 238),
}

local cooldown = false
local cooldownTime = 1
local colorCycleConnection = nil
local particleConnection = nil
local glowPulseConnection = nil

-- Random Color Cycle Function
local function StartColorCycle(handle)
	if colorCycleConnection then
		colorCycleConnection:Disconnect()
		colorCycleConnection = nil
	end

	local timer = 0
	local interval = 1 / 3

	colorCycleConnection = RunService.Heartbeat:Connect(function(dt)
		if not handle or not handle.Parent then
			colorCycleConnection:Disconnect()
			colorCycleConnection = nil
			return
		end

		timer = timer + dt
		if timer >= interval then
			timer = timer - interval
			local randomIndex = math.random(1, #tealColors)
			handle.Color = tealColors[randomIndex]
		end
	end)
end

-- Stop Color Cycle
local function StopColorCycle()
	if colorCycleConnection then
		colorCycleConnection:Disconnect()
		colorCycleConnection = nil
	end
end

-- Glow Pulse using PointLight
local function StartGlow(handle)
	if glowPulseConnection then
		glowPulseConnection:Disconnect()
		glowPulseConnection = nil
	end

	-- Remove old light if exists
	local oldLight = handle:FindFirstChild("GallLight")
	if oldLight then oldLight:Destroy() end

	-- Create PointLight for greenish teal glow
	local light = Instance.new("PointLight")
	light.Name = "GallLight"
	light.Color = Color3.fromRGB(0, 210, 150) -- greenish teal
	light.Brightness = 3
	light.Range = 16
	light.Shadows = true
	light.Parent = handle

	-- Pulse the glow smoothly
	local timer = 0
	glowPulseConnection = RunService.Heartbeat:Connect(function(dt)
		if not handle or not handle.Parent then
			glowPulseConnection:Disconnect()
			glowPulseConnection = nil
			return
		end

		timer = timer + dt
		-- Smooth sine wave pulse between brightness 2 and 5
		light.Brightness = 3 + math.sin(timer * 2) * 2
		-- Slightly shift color between green-teal and pure teal
		light.Color = Color3.fromRGB(
			0,
			math.floor(190 + math.sin(timer * 1.5) * 20),
			math.floor(140 + math.cos(timer * 1.5) * 15)
		)
	end)
end

-- Stop Glow
local function StopGlow(handle)
	if glowPulseConnection then
		glowPulseConnection:Disconnect()
		glowPulseConnection = nil
	end

	if handle then
		local light = handle:FindFirstChild("GallLight")
		if light then light:Destroy() end
	end
end

-- Floating Particles around the handle
local function StartParticles(handle)
	if particleConnection then
		particleConnection:Disconnect()
		particleConnection = nil
	end

	local attachment = Instance.new("Attachment")
	attachment.Name = "ParticleAttachment"
	attachment.Position = Vector3.new(0, 0, 0)
	attachment.Parent = handle

	-- Main sparkle particles
	local emitter = Instance.new("ParticleEmitter")
	emitter.Name = "GallParticles"
	emitter.Texture = "rbxassetid://242102612"
	emitter.Color = ColorSequence.new({
		ColorSequenceKeypoint.new(0, tealColors[1]),
		ColorSequenceKeypoint.new(0.25, tealColors[5]),
		ColorSequenceKeypoint.new(0.5, tealColors[8]),
		ColorSequenceKeypoint.new(0.75, tealColors[12]),
		ColorSequenceKeypoint.new(1, tealColors[15]),
	})
	emitter.LightEmission = 1
	emitter.LightInfluence = 0
	emitter.Size = NumberSequence.new({
		NumberSequenceKeypoint.new(0, 0.05),
		NumberSequenceKeypoint.new(0.5, 0.12),
		NumberSequenceKeypoint.new(1, 0),
	})
	emitter.Transparency = NumberSequence.new({
		NumberSequenceKeypoint.new(0, 0.2),
		NumberSequenceKeypoint.new(0.8, 0.6),
		NumberSequenceKeypoint.new(1, 1),
	})
	emitter.Lifetime = NumberRange.new(0.5, 1.2)
	emitter.Rate = 30
	emitter.Speed = NumberRange.new(0.5, 2)
	emitter.SpreadAngle = Vector2.new(180, 180)
	emitter.RotSpeed = NumberRange.new(-90, 90)
	emitter.Rotation = NumberRange.new(0, 360)
	emitter.Parent = attachment

	-- Floating orb particles
	local orbEmitter = Instance.new("ParticleEmitter")
	orbEmitter.Name = "OrbParticles"
	orbEmitter.Texture = "rbxassetid://1266170131"
	orbEmitter.Color = ColorSequence.new({
		ColorSequenceKeypoint.new(0, tealColors[3]),
		ColorSequenceKeypoint.new(0.5, tealColors[9]),
		ColorSequenceKeypoint.new(1, tealColors[14]),
	})
	orbEmitter.LightEmission = 1
	orbEmitter.LightInfluence = 0
	orbEmitter.Size = NumberSequence.new({
		NumberSequenceKeypoint.new(0, 0),
		NumberSequenceKeypoint.new(0.3, 0.18),
		NumberSequenceKeypoint.new(1, 0),
	})
	orbEmitter.Transparency = NumberSequence.new({
		NumberSequenceKeypoint.new(0, 0.1),
		NumberSequenceKeypoint.new(0.7, 0.5),
		NumberSequenceKeypoint.new(1, 1),
	})
	orbEmitter.Lifetime = NumberRange.new(0.8, 1.5)
	orbEmitter.Rate = 15
	orbEmitter.Speed = NumberRange.new(0.3, 1.5)
	orbEmitter.SpreadAngle = Vector2.new(180, 180)
	orbEmitter.RotSpeed = NumberRange.new(-45, 45)
	orbEmitter.Rotation = NumberRange.new(0, 360)
	orbEmitter.Parent = attachment

	-- Rising mist particles
	local mistEmitter = Instance.new("ParticleEmitter")
	mistEmitter.Name = "MistParticles"
	mistEmitter.Texture = "rbxassetid://255531807"
	mistEmitter.Color = ColorSequence.new({
		ColorSequenceKeypoint.new(0, tealColors[6]),
		ColorSequenceKeypoint.new(1, tealColors[13]),
	})
	mistEmitter.LightEmission = 0.8
	mistEmitter.LightInfluence = 0.2
	mistEmitter.Size = NumberSequence.new({
		NumberSequenceKeypoint.new(0, 0.1),
		NumberSequenceKeypoint.new(0.5, 0.3),
		NumberSequenceKeypoint.new(1, 0),
	})
	mistEmitter.Transparency = NumberSequence.new({
		NumberSequenceKeypoint.new(0, 0.5),
		NumberSequenceKeypoint.new(0.5, 0.75),
		NumberSequenceKeypoint.new(1, 1),
	})
	mistEmitter.Lifetime = NumberRange.new(1, 2)
	mistEmitter.Rate = 10
	mistEmitter.Speed = NumberRange.new(0.5, 1)
	mistEmitter.SpreadAngle = Vector2.new(30, 30)
	mistEmitter.RotSpeed = NumberRange.new(-20, 20)
	mistEmitter.Rotation = NumberRange.new(0, 360)
	mistEmitter.VelocityInheritance = 0
	mistEmitter.Parent = attachment

	-- Update particle colors randomly over time
	particleConnection = RunService.Heartbeat:Connect(function()
		if not handle or not handle.Parent then
			particleConnection:Disconnect()
			particleConnection = nil
			return
		end

		local r1 = math.random(1, #tealColors)
		local r2 = math.random(1, #tealColors)
		local r3 = math.random(1, #tealColors)

		emitter.Color = ColorSequence.new({
			ColorSequenceKeypoint.new(0, tealColors[r1]),
			ColorSequenceKeypoint.new(0.5, tealColors[r2]),
			ColorSequenceKeypoint.new(1, tealColors[r3]),
		})

		orbEmitter.Color = ColorSequence.new({
			ColorSequenceKeypoint.new(0, tealColors[r2]),
			ColorSequenceKeypoint.new(0.5, tealColors[r3]),
			ColorSequenceKeypoint.new(1, tealColors[r1]),
		})
	end)
end

-- Stop Particles
local function StopParticles(handle)
	if particleConnection then
		particleConnection:Disconnect()
		particleConnection = nil
	end

	if handle then
		local attachment = handle:FindFirstChild("ParticleAttachment")
		if attachment then
			for _, emitter in ipairs(attachment:GetChildren()) do
				if emitter:IsA("ParticleEmitter") then
					emitter.Enabled = false
				end
			end
			Debris:AddItem(attachment, 2)
		end
	end
end

-- Shockwave Effect
local function CreateShockwave()
	Character = Player.Character
	if not Character then return end
	local hrp = Character:FindFirstChild("HumanoidRootPart")
	if not hrp then return end

	local shockwave = Instance.new("Part")
	shockwave.Shape = Enum.PartType.Cylinder
	shockwave.Size = Vector3.new(0.3, 1, 1)
	shockwave.CFrame = hrp.CFrame * CFrame.new(0, -2, 0) * CFrame.Angles(0, 0, math.rad(90))
	shockwave.Anchored = true
	shockwave.CanCollide = false
	shockwave.CastShadow = false
	shockwave.Material = Enum.Material.Neon
	shockwave.Color = tealColors[math.random(1, #tealColors)]
	shockwave.Transparency = 0.2
	shockwave.Parent = workspace

	-- Glow on shockwave
	local shockLight = Instance.new("PointLight")
	shockLight.Color = Color3.fromRGB(0, 210, 150)
	shockLight.Brightness = 5
	shockLight.Range = 20
	shockLight.Parent = shockwave

	local ring2 = Instance.new("Part")
	ring2.Shape = Enum.PartType.Cylinder
	ring2.Size = Vector3.new(0.2, 0.5, 0.5)
	ring2.CFrame = hrp.CFrame * CFrame.new(0, -1.5, 0) * CFrame.Angles(0, 0, math.rad(90))
	ring2.Anchored = true
	ring2.CanCollide = false
	ring2.CastShadow = false
	ring2.Material = Enum.Material.Neon
	ring2.Color = tealColors[math.random(1, #tealColors)]
	ring2.Transparency = 0.4
	ring2.Parent = workspace

	-- Shockwave particles
	local shockAttachment = Instance.new("Attachment")
	shockAttachment.Parent = shockwave

	local shockParticle = Instance.new("ParticleEmitter")
	shockParticle.Texture = "rbxassetid://242102612"
	shockParticle.Color = ColorSequence.new({
		ColorSequenceKeypoint.new(0, tealColors[math.random(1, #tealColors)]),
		ColorSequenceKeypoint.new(1, tealColors[math.random(1, #tealColors)]),
	})
	shockParticle.LightEmission = 1
	shockParticle.Size = NumberSequence.new({
		NumberSequenceKeypoint.new(0, 0.3),
		NumberSequenceKeypoint.new(1, 0),
	})
	shockParticle.Transparency = NumberSequence.new({
		NumberSequenceKeypoint.new(0, 0),
		NumberSequenceKeypoint.new(1, 1),
	})
	shockParticle.Lifetime = NumberRange.new(0.2, 0.5)
	shockParticle.Rate = 100
	shockParticle.Speed = NumberRange.new(2, 5)
	shockParticle.SpreadAngle = Vector2.new(180, 180)
	shockParticle.Parent = shockAttachment

	local steps = 25
	local stepTime = 0.35 / steps

	for i = 1, steps do
		local size = i * 0.7

		if not shockwave.Parent then break end
		shockwave.Size = Vector3.new(0.3, size, size)
		shockwave.CFrame = hrp.CFrame * CFrame.new(0, -2, 0) * CFrame.Angles(0, 0, math.rad(90))
		shockwave.Transparency = 0.2 + (i / steps) * 0.8
		shockLight.Brightness = 5 - (i / steps) * 5

		if not ring2.Parent then break end
		ring2.Size = Vector3.new(0.2, size * 0.5, size * 0.5)
		ring2.CFrame = hrp.CFrame * CFrame.new(0, -1.5, 0) * CFrame.Angles(0, 0, math.rad(90))
		ring2.Transparency = 0.4 + (i / steps) * 0.6

		task.wait(stepTime)
	end

	shockParticle.Enabled = false
	Debris:AddItem(shockwave, 1)
	Debris:AddItem(ring2, 1)
end

-- Heal Particles Burst
local function CreateHealEffect()
	Character = Player.Character
	if not Character then return end
	local hrp = Character:FindFirstChild("HumanoidRootPart")
	if not hrp then return end

	for i = 1, 12 do
		local particle = Instance.new("Part")
		particle.Size = Vector3.new(0.15, 0.15, 0.15)
		particle.Shape = Enum.PartType.Ball
		particle.Material = Enum.Material.Neon
		particle.Color = tealColors[math.random(1, #tealColors)]
		particle.Transparency = 0.2
		particle.CanCollide = false
		particle.Anchored = false
		particle.CFrame = hrp.CFrame * CFrame.new(
			math.random(-2, 2),
			math.random(0, 3),
			math.random(-2, 2)
		)
		particle.Parent = workspace

		local bv = Instance.new("BodyVelocity")
		bv.Velocity = Vector3.new(
			math.random(-6, 6),
			math.random(6, 12),
			math.random(-6, 6)
		)
		bv.MaxForce = Vector3.new(1e4, 1e4, 1e4)
		bv.Parent = particle

		task.spawn(function()
			for t = 1, 10 do
				task.wait(0.08)
				if particle and particle.Parent then
					particle.Transparency = 0.2 + (t / 10) * 0.8
					particle.Size = particle.Size * 0.85
				end
			end
		end)

		Debris:AddItem(particle, 1)
	end
end

-- Heal Function
local function HealPlayer()
	Character = Player.Character
	if not Character then return end
	Humanoid = Character:FindFirstChild("Humanoid")
	if not Humanoid then return end

	Humanoid.MaxHealth = 150
	Humanoid.Health = math.min(Humanoid.Health + 30, 150)
end

-- Create the Tool
local function CreateGallhealer()
	local oldTool = Player.Backpack:FindFirstChild("Gallhealer")
		or (Player.Character and Player.Character:FindFirstChild("Gallhealer"))
	if oldTool then oldTool:Destroy() end

	StopColorCycle()

	-- Create Tool
	local tool = Instance.new("Tool")
	tool.Name = "Gallhealer"
	tool.ToolTip = "I wonder how did it get here..."
	tool.RequiresHandle = true
	tool.CanBeDropped = false

	-- Create Handle (Cube)
	local handle = Instance.new("Part")
	handle.Name = "Handle"
	handle.Size = Vector3.new(1, 1, 1)
	handle.Material = Enum.Material.Neon
	handle.Shape = Enum.PartType.Block
	handle.CanCollide = false
	handle.CastShadow = true
	handle.Color = tealColors[math.random(1, #tealColors)]

	-- Block Mesh
	local mesh = Instance.new("BlockMesh")
	mesh.Scale = Vector3.new(1, 1, 1)
	mesh.Parent = handle

	-- Always on dim glow even in backpack
	local idleLight = Instance.new("PointLight")
	idleLight.Name = "IdleGlow"
	idleLight.Color = Color3.fromRGB(0, 210, 150)
	idleLight.Brightness = 1.5
	idleLight.Range = 10
	idleLight.Shadows = false
	idleLight.Parent = handle

	handle.Parent = tool

	-- On Equip
	tool.Equipped:Connect(function()
		-- Remove idle light and start pulse glow
		local idle = handle:FindFirstChild("IdleGlow")
		if idle then idle:Destroy() end

		StartColorCycle(handle)
		StartParticles(handle)
		StartGlow(handle)
	end)

	-- On Unequip
	tool.Unequipped:Connect(function()
		StopColorCycle()
		StopParticles(handle)
		StopGlow(handle)
		handle.Color = tealColors[math.random(1, #tealColors)]

		-- Restore idle dim glow
		local idleLight2 = Instance.new("PointLight")
		idleLight2.Name = "IdleGlow"
		idleLight2.Color = Color3.fromRGB(0, 210, 150)
		idleLight2.Brightness = 1.5
		idleLight2.Range = 10
		idleLight2.Shadows = false
		idleLight2.Parent = handle
	end)

	-- On Activate
	tool.Activated:Connect(function()
		if cooldown then return end
		cooldown = true

		task.spawn(CreateShockwave)
		task.spawn(CreateHealEffect)

		HealPlayer()

		task.wait(cooldownTime)
		cooldown = false
	end)

	tool.Parent = Player.Backpack
end

-- On Character Added
local function OnCharacterAdded(char)
	Character = char
	Humanoid = char:WaitForChild("Humanoid")
	StopColorCycle()
	StopParticles(nil)
	StopGlow(nil)
	task.wait(0.5)
	CreateGallhealer()
end

Player.CharacterAdded:Connect(OnCharacterAdded)

if Player.Character then
	task.spawn(OnCharacterAdded, Player.Character)
end

Features & Information

it just heals you i guess

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts