local Players = game:GetService("Players") local RunService = game:GetService("RunService") local TextChatService = game:GetService("TextChatService") local GuiService = game:GetService("GuiService") local Debris = game:GetService("Debris") local Player = Players.LocalPlayer local PlayerNameFromId = Players:GetNameFromUserIdAsync(Player.UserId) -- // CONFIGURATION // local IMAGE_ID = "rbxassetid://126338282700056" local THEME_ID = "rbxassetid://82675021472003" local KILL_SOUND_ID = "rbxassetid://135557803" local RING_SOUND_ID = "rbxassetid://138688779679100" local DROWN_SOUND_ID = "rbxassetid://99211443575584" local SKID_1 = "rbxassetid://137066334962228" local SKID_2 = "rbxassetid://82308852446079" -- // AUDIO & PHYSICS SETTINGS // local CURRENT_SPEED = 150 local THEME_PITCH = 0.29 local THEME_VOLUME = 7 local DROWN_PITCH = 0.09 local FALL_LIMIT = -50 -- // TABLES // local KILL_LINES = {"YOU'RE TOO SLOW!", "COME ON STEP IT UP!", "TOOOO EZ, PEACE OF 🍰", "SORRY, BUT I GOTTA GO FAST! 🌀"} local greetedSonics = {} -- // CHAT FUNCTION // local function SayInChat(msg) if TextChatService.ChatVersion == Enum.ChatVersion.TextChatService then local channel = TextChatService.TextChannels.RBXGeneral if channel then channel:SendAsync(msg) end else local event = game:GetService("ReplicatedStorage"):FindFirstChild("DefaultChatSystemChatEvents") if event then event.SayMessageRequest:FireServer(msg, "All") end end end -- // INITIAL CHAT CREDIT // SayInChat("FE Sanic Script By: dariushstefan! (please use touch fling)") -- // KEYWORD & SONIC CHAT DETECTION // TextChatService.MessageReceived:Connect(function(msg) if not msg.TextSource then return end local sender = Players:GetPlayerByUserId(msg.TextSource.UserId) if not sender or sender == Player then return end local content = msg.Text:lower() if content:find("sonic") and not greetedSonics[sender.UserId] then greetedSonics[sender.UserId] = true if Player.Character and sender.Character then Player.Character:MoveTo(sender.Character.HumanoidRootPart.Position + Vector3.new(0, 3, 0)) SayInChat("YUR NAME IZ SANIC?! DUDE! I'M DA REAL SANIC!") end elseif content:find("report") then SayInChat("Report? 😂✌️") elseif content:find("bot") then SayInChat("Me? A bot? Maybe you might be the bot 🔥") elseif content:find("hacker") then SayInChat("Hacker? Nah, I'm just the fastest thing alive! 🌀💨") end end) -- // MAIN LOGIC // local function ApplySanic(Character) local Humanoid = Character:WaitForChild("Humanoid") local RootPart = Character:WaitForChild("HumanoidRootPart") local isDrowning = false local isRepelling = false local processed = {} for _, v in pairs(Character:GetDescendants()) do if v:IsA("BasePart") or v:IsA("Decal") then v.Transparency = 1 end end -- Billboard Setup local Billboard = Instance.new("BillboardGui", RootPart) Billboard.Size = UDim2.new(7, 0, 7, 0) Billboard.AlwaysOnTop = true local ImageLabel = Instance.new("ImageLabel", Billboard) ImageLabel.Size = UDim2.new(1, 0, 1, 0) ImageLabel.BackgroundTransparency = 1 ImageLabel.Image = IMAGE_ID -- Audio Setup local Music = Instance.new("Sound", RootPart) Music.SoundId = THEME_ID; Music.PlaybackSpeed = THEME_PITCH; Music.Looped = true; Music.Volume = THEME_VOLUME; Music:Play() local DrownMusic = Instance.new("Sound", RootPart) DrownMusic.SoundId = DROWN_SOUND_ID; DrownMusic.PlaybackSpeed = DROWN_PITCH; DrownMusic.Volume = 8 local S1 = Instance.new("Sound", RootPart); S1.SoundId = SKID_1; S1.Volume = 3 local S2 = Instance.new("Sound", RootPart); S2.SoundId = SKID_2; S2.Volume = 3 -- WATER REPELLENT & DROWNING SYSTEM task.spawn(function() while Character.Parent do local inWater = (Humanoid:GetState() == Enum.HumanoidStateType.Swimming) if not inWater and not isRepelling then local foundWater = false local params = OverlapParams.new() params.FilterDescendantsInstances = {Character} local parts = workspace:GetPartBoundsInRadius(RootPart.Position, 18, params) for _, p in pairs(parts) do if p.Material == Enum.Material.Water or p.Name:lower():find("water") then foundWater = true break end end if foundWater then isRepelling = true SayInChat("WHOA!") S1:Play(); S2:Play() local BV = Instance.new("BodyVelocity") BV.MaxForce = Vector3.new(math.huge, math.huge, math.huge) BV.Velocity = (RootPart.CFrame.LookVector * -130) + Vector3.new(0, 45, 0) BV.Parent = RootPart Debris:AddItem(BV, 0.5) task.wait(1) isRepelling = false end end if inWater then if not isDrowning then isDrowning = true Music:Pause(); DrownMusic:Play() SayInChat("*gurgles* HEEEELP! I CAHN'T SWEM!!! TUAIS!!!") task.spawn(function() while isDrowning do Billboard.StudsOffset = Vector3.new(math.random(-20,20)/10, math.random(-20,20)/10, 0) task.wait(0.05) end Billboard.StudsOffset = Vector3.new(0,0,0) end) DrownMusic.Ended:Connect(function() if isDrowning then Humanoid.Health = 0 end end) end elseif isDrowning then isDrowning = false DrownMusic:Stop(); Music:Resume() SayInChat("Holy #### that was close, right? RIGHT?!") end task.wait(0.1) end end) -- SPEED & FALL PROTECTION RunService.Heartbeat:Connect(function() if not Character.Parent then return end Humanoid.WalkSpeed = (isRepelling or isDrowning) and 0 or CURRENT_SPEED if RootPart.Position.Y < FALL_LIMIT then RootPart.CFrame = CFrame.new(0, 50, 0) end end) -- DAMAGE Logic (Rings Only) local lastH = Humanoid.Health Humanoid.HealthChanged:Connect(function(h) if h < lastH then ImageLabel.ImageColor3 = Color3.new(1, 0, 0) task.delay(0.2, function() ImageLabel.ImageColor3 = Color3.new(1, 1, 1) end) local r = Instance.new("Sound", RootPart); r.SoundId = RING_SOUND_ID; r:Play(); Debris:AddItem(r, 2) end lastH = h end) -- COLLISION CHAT (Only KILL_LINES) RootPart.Touched:Connect(function(hit) local m = hit.Parent local h = m:FindFirstChildOfClass("Humanoid") if h and m ~= Character and not processed[m] then processed[m] = true local s = Instance.new("Sound", RootPart); s.SoundId = KILL_SOUND_ID; s:Play(); Debris:AddItem(s, 2) SayInChat(KILL_LINES[math.random(1, #KILL_LINES)]) task.wait(3) processed[m] = nil end end) end -- Initialize if Player.Character then ApplySanic(Player.Character) end Player.CharacterAdded:Connect(ApplySanic)