--========================================================-- -- BETTER DAMAGE SYSTEM -- SIMPLE / STABLE CLIENT VERSION -- R6 + R15 --========================================================-- local Players = game:GetService("Players") local SoundService = game:GetService("SoundService") local TweenService = game:GetService("TweenService") local Debris = game:GetService("Debris") local RunService = game:GetService("RunService") local player = Players.LocalPlayer print("================================") print("[BETTER DAMAGE] SCRIPT STARTED") print("Player:", player.Name) print("================================") --========================================================-- -- SETTINGS --========================================================-- local DAMAGE_HITS = 10 local NORMAL_SPEED = 16 local WEAK_SPEED = 5 local WEAK_DAMAGE = 3 local WEAK_DAMAGE_TIME = 10 local REST_TIME = 5 local RAGDOLL_TIME = 2.5 local BLOOD_COUNT = 12 --========================================================-- -- SOUNDS --========================================================-- local STARTUP_SOUND = "rbxassetid://5153734608" local WARNING_SOUND = "rbxassetid://3289150551" local BLOOD_SOUND = "rbxassetid://3626677712" local DEATH_SOUND = "rbxassetid://9118864035" -- Human-style scream pack local SCREAMS = { "rbxassetid://880159023", "rbxassetid://58520081", "rbxassetid://170399891" } --========================================================-- -- CHARACTER VARIABLES --========================================================-- local character = nil local humanoid = nil local root = nil local healthConnection = nil local diedConnection = nil local oldHealth = nil local damageCount = 0 local isWeak = false local weakTimer = 0 local restTimer = 0 local applyingWeakDamage = false local isRagdoll = false local deathPlayed = false local lastScream = 0 --========================================================-- -- GUI --========================================================-- local gui = Instance.new("ScreenGui") gui.Name = "BetterDamageGui" gui.ResetOnSpawn = false gui.IgnoreGuiInset = true gui.Parent = player:WaitForChild("PlayerGui") --========================================================-- -- ACTIVE TEXT --========================================================-- local activeText = Instance.new("TextLabel") activeText.Name = "ActiveText" activeText.Size = UDim2.new(0.95, 0, 0, 65) activeText.Position = UDim2.new(0.025, 0, 0.06, 0) activeText.BackgroundTransparency = 1 activeText.Text = "better damage script is active have fun son🤣✌️" activeText.TextScaled = true activeText.TextWrapped = true activeText.Font = Enum.Font.GothamBold activeText.TextStrokeTransparency = 0 activeText.Parent = gui -- Rainbow effect task.spawn(function() local hue = 0 while activeText.Parent do hue += 0.015 if hue >= 1 then hue = 0 end activeText.TextColor3 = Color3.fromHSV(hue, 1, 1) task.wait(0.03) end end) --========================================================-- -- WARNING --========================================================-- local warning = Instance.new("TextLabel") warning.Name = "Warning" warning.Size = UDim2.new(0.9, 0, 0, 115) warning.Position = UDim2.new(0.05, 0, 0.18, 0) warning.BackgroundColor3 = Color3.fromRGB(25, 25, 25) warning.BackgroundTransparency = 0.1 warning.Text = "warning:this script is not FE\n" .. "like ragdoll, sound, blood\n" .. "only the damage are FE" warning.TextColor3 = Color3.fromRGB(255, 60, 60) warning.TextScaled = true warning.TextWrapped = true warning.Font = Enum.Font.GothamBold warning.TextStrokeTransparency = 0.5 warning.Visible = false warning.Parent = gui local warningCorner = Instance.new("UICorner") warningCorner.CornerRadius = UDim.new(0, 12) warningCorner.Parent = warning --========================================================-- -- WEAK TEXT --========================================================-- local weakText = Instance.new("TextLabel") weakText.Name = "WeakText" weakText.Size = UDim2.new(0.9, 0, 0, 110) weakText.Position = UDim2.new(0.05, 0, 0.30, 0) weakText.BackgroundTransparency = 1 weakText.Text = "⚠ WEAK ⚠\nREST TO RECOVER" weakText.TextColor3 = Color3.fromRGB(255, 45, 45) weakText.TextStrokeTransparency = 0 weakText.TextScaled = true weakText.TextWrapped = true weakText.Font = Enum.Font.GothamBold weakText.Visible = false weakText.Parent = gui --========================================================-- -- REST BAR --========================================================-- local restBack = Instance.new("Frame") restBack.Name = "RestBar" restBack.Size = UDim2.new(0.7, 0, 0, 18) restBack.Position = UDim2.new(0.15, 0, 0.44, 0) restBack.BackgroundColor3 = Color3.fromRGB(45, 45, 45) restBack.BorderSizePixel = 0 restBack.Visible = false restBack.Parent = gui local restBackCorner = Instance.new("UICorner") restBackCorner.CornerRadius = UDim.new(1, 0) restBackCorner.Parent = restBack local restFill = Instance.new("Frame") restFill.Name = "Fill" restFill.Size = UDim2.new(0, 0, 1, 0) restFill.BackgroundColor3 = Color3.fromRGB(255, 60, 60) restFill.BorderSizePixel = 0 restFill.Parent = restBack local restFillCorner = Instance.new("UICorner") restFillCorner.CornerRadius = UDim.new(1, 0) restFillCorner.Parent = restFill --========================================================-- -- DEATH RED SCREEN --========================================================-- local deathScreen = Instance.new("Frame") deathScreen.Name = "DeathScreen" deathScreen.Size = UDim2.new(1, 0, 1, 0) deathScreen.Position = UDim2.new(0, 0, 0, 0) deathScreen.BackgroundColor3 = Color3.fromRGB(180, 0, 0) deathScreen.BackgroundTransparency = 1 deathScreen.BorderSizePixel = 0 deathScreen.ZIndex = 100 deathScreen.Visible = false deathScreen.Parent = gui --========================================================-- -- SOUND FUNCTION --========================================================-- local function playSound(id, volume, speed) local sound = Instance.new("Sound") sound.SoundId = id sound.Volume = volume or 1 sound.PlaybackSpeed = speed or 1 sound.Looped = false sound.Parent = SoundService SoundService:PlayLocalSound(sound) Debris:AddItem(sound, 8) return sound end --========================================================-- -- STARTUP SEQUENCE --========================================================-- task.spawn(function() task.wait(0.2) print("[BETTER DAMAGE] Playing startup") playSound( STARTUP_SOUND, 1, 1 ) task.wait(3) if activeText then activeText.Visible = false end -- User requested one-second delay. task.wait(1) if warning then warning.Visible = true print("[BETTER DAMAGE] Warning shown") playSound( WARNING_SOUND, 1, 1 ) task.wait(4) warning.Visible = false end end) --========================================================-- -- SCREAM --========================================================-- local function playScream() if #SCREAMS == 0 then return end local chosen if #SCREAMS == 1 then chosen = 1 else repeat chosen = math.random( 1, #SCREAMS ) until chosen ~= lastScream end lastScream = chosen print( "[BETTER DAMAGE] Playing scream", chosen ) playSound( SCREAMS[chosen], 1, 1 ) end --========================================================-- -- BLOOD --========================================================-- local function makeBlood() if not root then return end print("[BETTER DAMAGE] Blood") -- Blood sound playSound( BLOOD_SOUND, 0.7, 2.5 ) for i = 1, BLOOD_COUNT do local blood = Instance.new("Part") blood.Name = "ClientBlood" blood.Shape = Enum.PartType.Ball local size = math.random(25, 60) / 100 blood.Size = Vector3.new( size, size, size ) blood.Color = Color3.fromRGB( 145, 0, 0 ) blood.Material = Enum.Material.SmoothPlastic blood.CanCollide = true blood.CanTouch = true blood.CanQuery = false blood.Massless = false blood.CFrame = root.CFrame * CFrame.new( math.random(-15,15) / 10, math.random(-10,15) / 10, math.random(-15,15) / 10 ) blood.Parent = workspace local velocity = Instance.new("BodyVelocity") velocity.MaxForce = Vector3.new( 5000, 5000, 5000 ) velocity.Velocity = Vector3.new( math.random(-20,20), math.random(8,22), math.random(-20,20) ) velocity.Parent = blood Debris:AddItem( velocity, 0.12 ) Debris:AddItem( blood, 7 ) end end --========================================================-- -- RAGDOLL --========================================================-- local function ragdoll() if isRagdoll then return end if not character or not humanoid then return end if humanoid.Health <= 0 then return end isRagdoll = true print("[BETTER DAMAGE] Ragdoll") -- Save motors. local motors = {} -- Create constraints. for _, obj in ipairs( character:GetDescendants() ) do if obj:IsA("Motor6D") and obj.Part0 and obj.Part1 then -- Don't break the root joint. if obj.Name ~= "RootJoint" then local part0 = obj.Part0 local part1 = obj.Part1 local att0 = Instance.new("Attachment") local att1 = Instance.new("Attachment") att0.CFrame = obj.C0 att1.CFrame = obj.C1 att0.Parent = part0 att1.Parent = part1 local socket = Instance.new( "BallSocketConstraint" ) socket.Attachment0 = att0 socket.Attachment1 = att1 socket.LimitsEnabled = true socket.UpperAngle = 70 socket.TwistLimitsEnabled = true socket.TwistLowerAngle = -45 socket.TwistUpperAngle = 45 socket.Parent = part0 table.insert( motors, { motor = obj, attachment0 = att0, attachment1 = att1, socket = socket } ) obj.Enabled = false end end end -- Make every body part collide. for _, obj in ipairs( character:GetDescendants() ) do if obj:IsA("BasePart") then obj.CanCollide = true obj.CanTouch = true obj.Massless = false end end humanoid.PlatformStand = true pcall(function() humanoid.AutoRotate = false end) -- Push the character slightly. if root then root.AssemblyLinearVelocity = Vector3.new( math.random(-8,8), 10, math.random(-8,8) ) end -- Recover. task.delay( RAGDOLL_TIME, function() if not character or not character.Parent then return end for _, data in ipairs(motors) do if data.motor and data.motor.Parent then data.motor.Enabled = true end if data.attachment0 then data.attachment0:Destroy() end if data.attachment1 then data.attachment1:Destroy() end if data.socket then data.socket:Destroy() end end if humanoid and humanoid.Parent and humanoid.Health > 0 then humanoid.PlatformStand = false pcall(function() humanoid.AutoRotate = true end) humanoid:ChangeState( Enum.HumanoidStateType.GettingUp ) end -- Turn collision back off -- so normal Roblox movement returns. for _, obj in ipairs( character:GetDescendants() ) do if obj:IsA("BasePart") then if obj.Name == "HumanoidRootPart" then obj.CanCollide = false else obj.CanCollide = false end end end isRagdoll = false print( "[BETTER DAMAGE] Ragdoll ended" ) end ) end --========================================================-- -- DEATH EFFECT --========================================================-- local function deathEffect() if deathPlayed then return end deathPlayed = true print("[BETTER DAMAGE] DEATH") playSound( DEATH_SOUND, 1, 1 ) deathScreen.Visible = true deathScreen.BackgroundTransparency = 1 local tween = TweenService:Create( deathScreen, TweenInfo.new( 2.5, Enum.EasingStyle.Quad, Enum.EasingDirection.Out ), { BackgroundTransparency = 0.25 } ) tween:Play() end --========================================================-- -- ENTER WEAK --========================================================-- local function enterWeak() if isWeak then return end isWeak = true weakTimer = 0 restTimer = 0 weakText.Visible = true restBack.Visible = true restFill.Size = UDim2.new( 0, 0, 1, 0 ) if humanoid then humanoid.WalkSpeed = WEAK_SPEED end print( "[BETTER DAMAGE] WEAKNESS ACTIVATED" ) end --========================================================-- -- RECOVER --========================================================-- local function recover() isWeak = false damageCount = 0 weakTimer = 0 restTimer = 0 weakText.Visible = false restBack.Visible = false restFill.Size = UDim2.new( 0, 0, 1, 0 ) if humanoid and humanoid.Health > 0 then humanoid.WalkSpeed = NORMAL_SPEED end print( "[BETTER DAMAGE] RECOVERED" ) end --========================================================-- -- WEAKNESS LOOP --========================================================-- task.spawn(function() while true do task.wait(0.1) if isWeak and humanoid and humanoid.Parent and humanoid.Health > 0 then -- Weak damage timer. weakTimer += 0.1 if weakTimer >= WEAK_DAMAGE_TIME then weakTimer = 0 applyingWeakDamage = true humanoid.Health = math.max( 0, humanoid.Health - WEAK_DAMAGE ) applyingWeakDamage = false print( "[BETTER DAMAGE] " .. "Weak damage -3" ) end -- Rest timer. if humanoid.MoveDirection.Magnitude < 0.05 then restTimer += 0.1 else restTimer = 0 end local percent = math.clamp( restTimer / REST_TIME, 0, 1 ) restFill.Size = UDim2.new( percent, 0, 1, 0 ) if restTimer >= REST_TIME then recover() end end end end) --========================================================-- -- DAMAGE LISTENER --========================================================-- local function connectHealth() if healthConnection then healthConnection:Disconnect() healthConnection = nil end if diedConnection then diedConnection:Disconnect() diedConnection = nil end if not humanoid then return end oldHealth = humanoid.Health print( "[BETTER DAMAGE] Health:", oldHealth ) healthConnection = humanoid.HealthChanged:Connect( function(newHealth) print( "[BETTER DAMAGE] HealthChanged:", newHealth ) -- Death. if newHealth <= 0 then deathEffect() oldHealth = newHealth return end -- Ignore our automatic weak damage. if applyingWeakDamage then oldHealth = newHealth return end -- Damage happened. if oldHealth and newHealth < oldHealth then local damage = oldHealth - newHealth damageCount += 1 print( "------------------------------" ) print( "[BETTER DAMAGE] DAMAGE!" ) print( "Amount:", damage ) print( "Hits:", damageCount, "/", DAMAGE_HITS ) print( "------------------------------" ) oldHealth = newHealth -- Effects. makeBlood() playScream() ragdoll() -- Weakness. if damageCount >= DAMAGE_HITS then enterWeak() end else oldHealth = newHealth end end ) diedConnection = humanoid.Died:Connect( function() deathEffect() end ) print( "[BETTER DAMAGE] " .. "HEALTH LISTENER CONNECTED" ) end --========================================================-- -- CHARACTER SETUP --========================================================-- local function setupCharacter(newCharacter) print( "[BETTER DAMAGE] Character detected" ) character = newCharacter humanoid = character:WaitForChild( "Humanoid", 10 ) root = character:WaitForChild( "HumanoidRootPart", 10 ) if not humanoid then warn( "[BETTER DAMAGE] " .. "Humanoid NOT FOUND" ) return end if not root then warn( "[BETTER DAMAGE] " .. "Root NOT FOUND" ) return end -- Reset. damageCount = 0 isWeak = false weakTimer = 0 restTimer = 0 applyingWeakDamage = false isRagdoll = false deathPlayed = false weakText.Visible = false restBack.Visible = false deathScreen.Visible = false deathScreen.BackgroundTransparency = 1 humanoid.WalkSpeed = NORMAL_SPEED connectHealth() print( "[BETTER DAMAGE] CHARACTER READY" ) end --========================================================-- -- INITIAL CHARACTER --========================================================-- if player.Character then task.spawn(function() setupCharacter( player.Character ) end) end --========================================================-- -- RESPAWN --========================================================-- player.CharacterAdded:Connect( function(newCharacter) task.wait(0.2) setupCharacter( newCharacter ) end ) print( "================================" ) print( "[BETTER DAMAGE] READY!" ) print( "[BETTER DAMAGE] R6/R15" ) print( "[BETTER DAMAGE] Blood: ON" ) print( "[BETTER DAMAGE] Ragdoll: ON" ) print( "[BETTER DAMAGE] Screams: 3" ) print( "================================" )