-- 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