-- Settings local DAMAGE_COLOR = Color3.fromRGB(255, 75, 75) local DEATH_COLOR = Color3.fromRGB(255, 0, 0) local HEAVY_HIT_THRESHOLD = 50 local DISPLAY_TIME = 1.3 local BASE_SHAKE = 0.12 local BASE_SIZE = 2.2 local function formatDamage(amount) local absAmount = math.abs(amount) -- Custom Smart Decimals logic if absAmount % 1 == 0 then return tostring(math.floor(absAmount)) else return string.format("%.1f", absAmount) end end local function createIndicator(targetPart, amount, isDeath) local billboard = Instance.new("BillboardGui") billboard.Size = UDim2.new(BASE_SIZE, 0, BASE_SIZE, 0) billboard.Adornee = targetPart billboard.AlwaysOnTop = true local label = Instance.new("TextLabel") label.Size = UDim2.new(1, 0, 1, 0) label.BackgroundTransparency = 1 label.TextScaled = true label.Font = Enum.Font.Cartoon label.TextStrokeColor3 = Color3.fromRGB(0, 0, 0) label.TextStrokeTransparency = 0 label.Rotation = math.random(-15, 15) local isHeavy = math.abs(amount) >= HEAVY_HIT_THRESHOLD if isDeath then label.Text = "DEATH" label.TextColor3 = DEATH_COLOR else label.Text = formatDamage(amount) label.TextColor3 = isHeavy and Color3.new(1, 1, 1) or DAMAGE_COLOR end label.Parent = billboard billboard.Parent = game.CoreGui task.spawn(function() local startTime = tick() while tick() - startTime < DISPLAY_TIME do local elapsed = tick() - startTime local progress = elapsed / DISPLAY_TIME if not targetPart or not targetPart.Parent then break end if isHeavy and not isDeath then label.TextColor3 = (math.sin(tick() * 25) > 0) and Color3.new(1, 1, 1) or Color3.new(1, 0, 0) end local currentShake = BASE_SHAKE if isDeath then currentShake = BASE_SHAKE * 3 elseif isHeavy then currentShake = BASE_SHAKE * 2 end local yOffset = 3 + (progress * 3.5) local sizeMultiplier = 1.0 if progress < 0.25 then sizeMultiplier = isDeath and 2.0 or (isHeavy and 1.7 or 1.4) sizeMultiplier = sizeMultiplier - (progress * 1.5) end billboard.Size = UDim2.new(BASE_SIZE * sizeMultiplier, 0, BASE_SIZE * sizeMultiplier, 0) local shakeX = (math.random() - 0.5) * currentShake local shakeY = (math.random() - 0.5) * currentShake -- Use StudsOffset to track the Head's world position accurately billboard.StudsOffset = Vector3.new(shakeX, yOffset + shakeY, 0) label.TextTransparency = progress label.TextStrokeTransparency = progress task.wait() end billboard:Destroy() end) end local function watchHumanoid(humanoid) local lastHealth = humanoid.Health humanoid.HealthChanged:Connect(function(newHealth) local delta = newHealth - lastHealth if delta <= -0.1 then -- Force targeting the Head for the pop-up local head = humanoid.Parent:FindFirstChild("Head") if head then local isDeath = (newHealth <= 0 and lastHealth > 0) createIndicator(head, delta, isDeath) end end lastHealth = newHealth end) end for _, v in pairs(workspace:GetDescendants()) do if v:IsA("Humanoid") then watchHumanoid(v) end end workspace.DescendantAdded:Connect(function(v) if v:IsA("Humanoid") then watchHumanoid(v) end end)