Universal better damage script
Key RequiredUniversal

Universal better damage script

Universal ScriptEatkidmasterEatkidmaster 508 views 2.4K executesUpdated Sep 6, 2026
0.0/ 5(1 votes)
010% Positive
Lua Script•1179 lines (18140 chars)
--========================================================--
-- 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(
"================================"
)

Features & Information

Try to damage yourself!(Also that one scream sound effect very loud so lower ur volume down)
#Universal#Fun

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts