Local Players = game:GetService("Players") local UserInputService = game:GetService("UserInputService") local ReplicatedStorage = game:GetService("ReplicatedStorage") local TweenService = game:GetService("TweenService") local RunService = game:GetService("RunService") local player = Players.LocalPlayer local character = player.Character or player.CharacterAdded:Wait() local humanoidRootPart = character:WaitForChild("HumanoidRootPart") local playerGui = player:WaitForChild("PlayerGui") -- ================== MANUAL SPELL CONFIG ================== local spell1 = "Fireball" -- Left button local spell2 = "Freeze" -- Middle button local spell3 = "Thunderbolt" -- Right button local cooldownTime = 3 -- seconds (you can change per spell later) -- ======================================================== -- Only for mobile if not (UserInputService.TouchEnabled and not UserInputService.KeyboardEnabled) then return end -- Create GUI (same as before, but bigger & nicer) local screenGui = Instance.new("ScreenGui") screenGui.Name = "MobileSpellGUI" screenGui.ResetOnSpawn = false screenGui.Parent = playerGui local mainFrame = Instance.new("Frame") mainFrame.Size = UDim2.new(0.96, 0, 0.20, 0) mainFrame.Position = UDim2.new(0.02, 0, 0.73, 0) mainFrame.BackgroundColor3 = Color3.fromRGB(15, 15, 45) mainFrame.BackgroundTransparency = 0.15 mainFrame.BorderSizePixel = 0 mainFrame.Parent = screenGui local corner = Instance.new("UICorner") corner.CornerRadius = UDim.new(0, 22) corner.Parent = mainFrame local listLayout = Instance.new("UIListLayout") listLayout.FillDirection = Enum.FillDirection.Horizontal listLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center listLayout.Padding = UDim.new(0, 15) listLayout.Parent = mainFrame local cooldowns = {} -- Simple client-side spell casting function local function castSpell(spellName) if not character or not humanoidRootPart then return end print("Casting: " .. spellName .. " (client-side)") if spellName == "Fireball" then -- Example: Spawn a red fireball projectile forward local fireball = Instance.new("Part") fireball.Name = "FireballProjectile" fireball.Shape = Enum.PartType.Ball fireball.Size = Vector3.new(3, 3, 3) fireball.Color = Color3.fromRGB(255, 80, 0) fireball.Material = Enum.Material.Neon fireball.CFrame = humanoidRootPart.CFrame * CFrame.new(0, 2, -6) fireball.CanCollide = false fireball.Anchored = false fireball.Parent = workspace local bv = Instance.new("BodyVelocity") bv.MaxForce = Vector3.new(math.huge, math.huge, math.huge) bv.Velocity = humanoidRootPart.CFrame.LookVector * 80 bv.Parent = fireball -- Simple explosion on touch or after time task.delay(2, function() if fireball then local explosion = Instance.new("Explosion") explosion.Position = fireball.Position explosion.Parent = workspace fireball:Destroy() end end) elseif spellName == "Freeze" then -- Example: Freeze effect (slow particles + visual) for i = 1, 15 do local ice = Instance.new("Part") ice.Size = Vector3.new(1, 1, 1) ice.Color = Color3.fromRGB(100, 200, 255) ice.Material = Enum.Material.Ice ice.CFrame = humanoidRootPart.CFrame * CFrame.new(math.random(-8,8), 1, -10) ice.CanCollide = false ice.Anchored = true ice.Parent = workspace task.delay(1.5, function() ice:Destroy() end) end elseif spellName == "Thunderbolt" then -- Example: Lightning strike forward local lightning = Instance.new("Part") lightning.Size = Vector3.new(1, 20, 1) lightning.Color = Color3.fromRGB(200, 220, 255) lightning.Material = Enum.Material.Neon lightning.CFrame = humanoidRootPart.CFrame * CFrame.new(0, 10, -15) lightning.CanCollide = false lightning.Anchored = true lightning.Parent = workspace task.delay(0.6, function() if lightning then lightning:Destroy() end end) -- Add a quick flash local flash = Instance.new("PointLight") flash.Brightness = 5 flash.Range = 50 flash.Color = Color3.fromRGB(200, 220, 255) flash.Parent = humanoidRootPart task.delay(0.3, function() flash:Destroy() end) end -- You can add more spells here easily end -- Create button function local function createButton(spellName, color) local button = Instance.new("TextButton") button.Size = UDim2.new(0.3, 0, 1, 0) button.BackgroundColor3 = color button.Text = spellName:upper() button.TextColor3 = Color3.new(1, 1, 1) button.TextScaled = true button.Font = Enum.Font.GothamBold button.Parent = mainFrame local btnCorner = Instance.new("UICorner") btnCorner.CornerRadius = UDim.new(0, 18) btnCorner.Parent = button button.MouseButton1Click:Connect(function() if cooldowns[spellName] then return end castSpell(spellName) -- This actually does the spell! cooldowns[spellName] = true button.BackgroundColor3 = Color3.fromRGB(80, 80, 80) button.Text = "⏳" task.delay(cooldownTime, function() cooldowns[spellName] = nil button.BackgroundColor3 = color button.Text = spellName:upper() end) end) end -- Create the 3 buttons createButton(spell1, Color3.fromRGB(200, 50, 50)) -- Fire = red/orange createButton(spell2, Color3.fromRGB(50, 120, 200)) -- Freeze = blue createButton(spell3, Color3.fromRGB(200, 180, 50)) -- Thunder = yellow print("✅ Mobile spell GUI with client-side casting loaded!")