Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- SERVICES
- local Players = game:GetService("Players")
- local TweenService = game:GetService("TweenService")
- local RunService = game:GetService("RunService")
- local LocalPlayer = Players.LocalPlayer
- -- COLORS (Updated to Reaper theme)
- local pitchBlack = Color3.fromRGB(5, 5, 10)
- local bloodGlow = Color3.fromRGB(170, 0, 0)
- local ghostWhite = Color3.fromRGB(255, 255, 255)
- local dimGray = Color3.fromRGB(30, 30, 30)
- local standardBtnColor = dimGray
- local darkGold = Color3.fromRGB(180, 140, 30)
- local whiteText = ghostWhite
- local defaultBtnColor = pitchBlack
- -- STATES
- local toggleOpen = false
- local loopList = {}
- local playerButtons = {}
- local speedBoostOn = false
- local antiLagOn = false
- local frontLoopMode = false
- local loopbringAllActive = false
- local attachModeOn = false
- local twoSidePositionOn = false
- local myDeaths = 0
- -- ENHANCED KILL TRACKING DATA
- local killCounts = {}
- local damageTracker = {}
- local killConnections = {}
- local proximityTracker = {}
- local interactionTracker = {}
- local bodyDestructionTracker = {}
- -- GUI
- local gui = Instance.new("ScreenGui", LocalPlayer:WaitForChild("PlayerGui"))
- gui.Name = "ReaperLoopbringUI"
- gui.ResetOnSpawn = false
- gui.IgnoreGuiInset = true
- -- Toggle Button (Updated to Reaper theme)
- local toggle = Instance.new("TextButton", gui)
- toggle.Size = UDim2.new(0, 130, 0, 30)
- toggle.Position = UDim2.new(0, 10, 0, 60) -- Positioned on the left side, pulled down more
- toggle.BackgroundColor3 = bloodGlow
- toggle.TextColor3 = ghostWhite
- toggle.Font = Enum.Font.Antique
- toggle.Text = "☠ Reaper Toll ☠"
- toggle.TextScaled = true
- toggle.BorderSizePixel = 0
- toggle.ZIndex = 10
- -- Floating Words (Reaper theme effect)
- local horrorWords = {"DEATH", "SOULS", "FEAR"}
- for i = 1, 3 do
- local word = horrorWords[i]
- local lbl = Instance.new("TextLabel", toggle)
- lbl.Size = UDim2.new(0, 35, 0, 12)
- lbl.BackgroundTransparency = 1
- lbl.TextColor3 = Color3.fromRGB(255, 50, 50) -- Bright red color
- lbl.Text = word
- lbl.Font = Enum.Font.GothamBlack
- lbl.TextSize = 8
- lbl.TextScaled = false
- lbl.Rotation = math.random(-15, 15) -- Random slight rotation
- lbl.ZIndex = 12
- -- Position words below the toggle button
- local xOffset = (i - 2) * 35 -- Space them out horizontally
- lbl.Position = UDim2.new(0.5, xOffset - 17, 1, 2) -- Below toggle (y = 1 + 2 offset)
- -- Add a subtle glow effect
- lbl.TextStrokeTransparency = 0.5
- lbl.TextStrokeColor3 = Color3.fromRGB(100, 0, 0)
- end
- -- Main Frame (Updated to Reaper theme) - Positioned on the left side
- local frame = Instance.new("Frame", gui)
- frame.Size = UDim2.new(0, 230, 0, 340)
- frame.Position = UDim2.new(0, 10, 0, 100) -- Positioned on the left side, below the toggle
- frame.BackgroundColor3 = pitchBlack
- frame.BorderSizePixel = 0
- frame.Visible = false
- frame.Active = true
- frame.Draggable = true
- -- Title (Updated to Reaper theme)
- local title = Instance.new("TextLabel", frame)
- title.Size = UDim2.new(1, -20, 0, 30)
- title.Position = UDim2.new(0, 10, 0, 5)
- title.BackgroundTransparency = 1
- title.Text = "☠ Psycho Loopbring ☠"
- title.TextColor3 = bloodGlow
- title.TextScaled = true
- title.Font = Enum.Font.Fondamento
- title.TextXAlignment = Enum.TextXAlignment.Left
- -- Death Counter (Updated to Reaper theme)
- local myDeathLabel = Instance.new("TextLabel", frame)
- myDeathLabel.Size = UDim2.new(1, -20, 0, 30)
- myDeathLabel.Position = UDim2.new(0, 10, 0, 35)
- myDeathLabel.BackgroundTransparency = 1
- myDeathLabel.Text = "☠ My Deaths: 0"
- myDeathLabel.TextColor3 = bloodGlow
- myDeathLabel.TextScaled = true
- myDeathLabel.Font = Enum.Font.Antique
- myDeathLabel.TextXAlignment = Enum.TextXAlignment.Left
- -- Scroll Panel
- local scroll = Instance.new("ScrollingFrame", frame)
- scroll.Position = UDim2.new(0, 10, 0, 70)
- scroll.Size = UDim2.new(1, -20, 1, -80)
- scroll.BackgroundTransparency = 1
- scroll.BorderSizePixel = 0
- scroll.CanvasSize = UDim2.new(0, 0, 0, 0)
- scroll.AutomaticCanvasSize = Enum.AutomaticSize.Y
- scroll.ScrollBarThickness = 5
- scroll.ClipsDescendants = true
- local layout = Instance.new("UIListLayout", scroll)
- layout.SortOrder = Enum.SortOrder.LayoutOrder
- layout.Padding = UDim.new(0, 3)
- -- UTILITIES
- local function tweenColor(object, color, duration)
- TweenService:Create(object, TweenInfo.new(duration or 0.25), {BackgroundColor3 = color}):Play()
- end
- local function setNoClip(character, state)
- for _, part in pairs(character:GetDescendants()) do
- if part:IsA("BasePart") then
- part.CanCollide = not state
- end
- end
- end
- -- COMPREHENSIVE KILL TRACKING SYSTEM
- local function registerKill(playerName, method)
- killCounts[playerName] = (killCounts[playerName] or 0) + 1
- print("☠ KILL REGISTERED: " .. playerName .. " via " .. method .. " (Total: " .. killCounts[playerName] .. ")")
- -- Update display
- local button = playerButtons[playerName]
- if button then
- local killLabel = button:FindFirstChild("KillLabel")
- if killLabel then
- killLabel.Text = "Kills: " .. killCounts[playerName]
- end
- end
- end
- local function isPlayerCausedDeath(player)
- local myChar = LocalPlayer.Character
- if not myChar or not myChar:FindFirstChild("HumanoidRootPart") then return false end
- -- Check if we're actively loopbringing this player
- if loopList[player.Name] then
- return true
- end
- -- Check proximity (within 25 studs)
- local targetChar = player.Character
- if targetChar and targetChar:FindFirstChild("HumanoidRootPart") then
- local distance = (myChar.HumanoidRootPart.Position - targetChar.HumanoidRootPart.Position).Magnitude
- if distance <= 25 then
- return true
- end
- end
- -- Check recent damage interaction
- local damageData = damageTracker[player.Name]
- if damageData and damageData.attacker == LocalPlayer then
- local timeSinceDamage = tick() - damageData.timestamp
- if timeSinceDamage <= 8 then -- 8 second window
- return true
- end
- end
- -- Check recent interaction
- local interactionData = interactionTracker[player.Name]
- if interactionData then
- local timeSinceInteraction = tick() - interactionData.timestamp
- if timeSinceInteraction <= 10 then -- 10 second window
- return true
- end
- end
- return false
- end
- local function setupKillTracking(player)
- if not killCounts[player.Name] then
- killCounts[player.Name] = 0
- end
- local function trackCharacter(character)
- local humanoid = character:WaitForChild("Humanoid", 10)
- if not humanoid then return end
- -- Clean up old connections
- if killConnections[player.Name] then
- for _, conn in pairs(killConnections[player.Name]) do
- if conn then conn:Disconnect() end
- end
- end
- killConnections[player.Name] = {}
- -- Method 1: Direct creator tag detection (most reliable)
- local creatorConnection = humanoid.Died:Connect(function()
- task.wait(0.1) -- Allow time for creator tag to appear
- local creatorTag = humanoid:FindFirstChild("creator")
- if creatorTag and creatorTag.Value == LocalPlayer then
- registerKill(player.Name, "Creator Tag")
- return
- end
- -- If no creator tag, check our tracking methods
- if isPlayerCausedDeath(player) then
- registerKill(player.Name, "Tracked Death")
- end
- end)
- table.insert(killConnections[player.Name], creatorConnection)
- -- Method 2: Health change tracking
- local lastHealth = humanoid.Health
- local healthConnection = humanoid.HealthChanged:Connect(function(newHealth)
- if newHealth < lastHealth and newHealth >= 0 then
- -- Player took damage, mark us as potential killer
- damageTracker[player.Name] = {
- attacker = LocalPlayer,
- timestamp = tick(),
- lastDamage = lastHealth - newHealth
- }
- end
- lastHealth = newHealth
- end)
- table.insert(killConnections[player.Name], healthConnection)
- -- Method 3: Body destruction tracking
- local function trackBodyParts()
- for _, part in pairs(character:GetChildren()) do
- if part:IsA("BasePart") and part.Name ~= "HumanoidRootPart" then
- local partConnection = part.AncestryChanged:Connect(function()
- if not part.Parent and isPlayerCausedDeath(player) then
- -- Body part was destroyed and we're the cause
- interactionTracker[player.Name] = {
- timestamp = tick(),
- type = "Body Destruction"
- }
- end
- end)
- table.insert(killConnections[player.Name], partConnection)
- end
- end
- end
- -- Method 4: Joint breaking tracking
- local function trackJoints()
- for _, joint in pairs(character:GetDescendants()) do
- if joint:IsA("Motor6D") or joint:IsA("Weld") or joint:IsA("WeldConstraint") then
- local jointConnection = joint.AncestryChanged:Connect(function()
- if not joint.Parent and isPlayerCausedDeath(player) then
- -- Joint was broken and we're the cause
- interactionTracker[player.Name] = {
- timestamp = tick(),
- type = "Joint Breaking"
- }
- end
- end)
- table.insert(killConnections[player.Name], jointConnection)
- end
- end
- end
- -- Method 5: Character destruction tracking
- local charConnection = character.AncestryChanged:Connect(function()
- if not character.Parent and isPlayerCausedDeath(player) then
- -- Character was destroyed and we're the cause
- registerKill(player.Name, "Character Destruction")
- end
- end)
- table.insert(killConnections[player.Name], charConnection)
- -- Method 6: Humanoid state change tracking
- local stateConnection = humanoid.StateChanged:Connect(function(oldState, newState)
- if newState == Enum.HumanoidStateType.Dead and isPlayerCausedDeath(player) then
- -- Mark interaction for potential kill attribution
- interactionTracker[player.Name] = {
- timestamp = tick(),
- type = "State Change"
- }
- end
- end)
- table.insert(killConnections[player.Name], stateConnection)
- -- Initialize tracking
- trackBodyParts()
- trackJoints()
- -- Track new parts/joints added during character lifetime
- local childAddedConnection = character.ChildAdded:Connect(function(child)
- if child:IsA("BasePart") and child.Name ~= "HumanoidRootPart" then
- local partConnection = child.AncestryChanged:Connect(function()
- if not child.Parent and isPlayerCausedDeath(player) then
- interactionTracker[player.Name] = {
- timestamp = tick(),
- type = "New Body Part Destruction"
- }
- end
- end)
- table.insert(killConnections[player.Name], partConnection)
- end
- end)
- table.insert(killConnections[player.Name], childAddedConnection)
- -- Track descendant changes for joints
- local descendantConnection = character.DescendantAdded:Connect(function(descendant)
- if descendant:IsA("Motor6D") or descendant:IsA("Weld") or descendant:IsA("WeldConstraint") then
- local jointConnection = descendant.AncestryChanged:Connect(function()
- if not descendant.Parent and isPlayerCausedDeath(player) then
- interactionTracker[player.Name] = {
- timestamp = tick(),
- type = "New Joint Breaking"
- }
- end
- end)
- table.insert(killConnections[player.Name], jointConnection)
- end
- end)
- table.insert(killConnections[player.Name], descendantConnection)
- end
- -- Setup for current character
- if player.Character then
- trackCharacter(player.Character)
- end
- -- Setup for future characters
- local charAddedConnection = player.CharacterAdded:Connect(trackCharacter)
- if not killConnections[player.Name] then
- killConnections[player.Name] = {}
- end
- table.insert(killConnections[player.Name], charAddedConnection)
- end
- -- TOGGLE UI
- toggle.MouseButton1Click:Connect(function()
- toggleOpen = not toggleOpen
- frame.Visible = toggleOpen
- -- Update floating words when toggle is opened
- if toggleOpen then
- for i, child in pairs(toggle:GetChildren()) do
- if child:IsA("TextLabel") then
- local word = child.Text
- if word == "DEATH" then
- child.Text = "DEATH"
- elseif word == "SOULS" then
- child.Text = "SOULS"
- elseif word == "FEAR" then
- child.Text = "FEAR"
- end
- end
- end
- end
- end)
- -- SPEED BOOST BUTTON
- local speedButton = Instance.new("TextButton", scroll)
- speedButton.Size = UDim2.new(1, 0, 0, 28)
- speedButton.BackgroundColor3 = standardBtnColor
- speedButton.TextColor3 = whiteText
- speedButton.Font = Enum.Font.GothamBold
- speedButton.TextSize = 13
- speedButton.Text = "Speed Boost"
- speedButton.LayoutOrder = 0
- local function applySpeedBoost(state)
- local char = LocalPlayer.Character
- if char then
- local humanoid = char:FindFirstChildOfClass("Humanoid")
- if humanoid then
- humanoid.WalkSpeed = state and 120 or 16
- humanoid.JumpPower = state and 120 or 50
- tweenColor(speedButton, state and darkGold or standardBtnColor)
- end
- end
- end
- speedButton.MouseButton1Click:Connect(function()
- speedBoostOn = not speedBoostOn
- applySpeedBoost(speedBoostOn)
- end)
- -- LOOPBRING POSITION TOGGLE
- local loopbringToggleButton = Instance.new("TextButton", scroll)
- loopbringToggleButton.Size = UDim2.new(1, 0, 0, 28)
- loopbringToggleButton.BackgroundColor3 = standardBtnColor
- loopbringToggleButton.TextColor3 = whiteText
- loopbringToggleButton.Font = Enum.Font.GothamBold
- loopbringToggleButton.TextSize = 13
- loopbringToggleButton.Text = "Toggle Loopbring Position"
- loopbringToggleButton.LayoutOrder = 1
- loopbringToggleButton.MouseButton1Click:Connect(function()
- frontLoopMode = not frontLoopMode
- tweenColor(loopbringToggleButton, frontLoopMode and darkGold or standardBtnColor)
- end)
- -- LOOPBRING ALL BUTTON
- local loopbringAllButton = Instance.new("TextButton", scroll)
- loopbringAllButton.Size = UDim2.new(1, 0, 0, 28)
- loopbringAllButton.BackgroundColor3 = standardBtnColor
- loopbringAllButton.TextColor3 = whiteText
- loopbringAllButton.Font = Enum.Font.GothamBold
- loopbringAllButton.TextSize = 13
- loopbringAllButton.Text = "Loopbring All"
- loopbringAllButton.LayoutOrder = 2
- loopbringAllButton.MouseButton1Click:Connect(function()
- loopbringAllActive = not loopbringAllActive
- tweenColor(loopbringAllButton, loopbringAllActive and darkGold or standardBtnColor)
- for _, player in pairs(Players:GetPlayers()) do
- if player ~= LocalPlayer and playerButtons[player.Name] then
- loopList[player.Name] = loopbringAllActive or nil
- tweenColor(playerButtons[player.Name], loopbringAllActive and darkGold or defaultBtnColor)
- end
- end
- end)
- -- TWO SIDE POSITION BUTTON
- local twoSidePositionButton = Instance.new("TextButton", scroll)
- twoSidePositionButton.Size = UDim2.new(1, 0, 0, 28)
- twoSidePositionButton.BackgroundColor3 = standardBtnColor
- twoSidePositionButton.TextColor3 = whiteText
- twoSidePositionButton.Font = Enum.Font.GothamBold
- twoSidePositionButton.TextSize = 13
- twoSidePositionButton.Text = "2 Side Position: OFF"
- twoSidePositionButton.LayoutOrder = 2.5
- twoSidePositionButton.MouseButton1Click:Connect(function()
- twoSidePositionOn = not twoSidePositionOn
- tweenColor(twoSidePositionButton, twoSidePositionOn and darkGold or standardBtnColor)
- twoSidePositionButton.Text = twoSidePositionOn and "2 Side Position: ON" or "2 Side Position: OFF"
- end)
- -- ATTACH MODE BUTTON
- local attachModeButton = Instance.new("TextButton", scroll)
- attachModeButton.Size = UDim2.new(1, 0, 0, 28)
- attachModeButton.BackgroundColor3 = standardBtnColor
- attachModeButton.TextColor3 = whiteText
- attachModeButton.Font = Enum.Font.GothamBold
- attachModeButton.TextSize = 13
- attachModeButton.Text = "Attach Mode: OFF"
- attachModeButton.LayoutOrder = 3
- attachModeButton.MouseButton1Click:Connect(function()
- attachModeOn = not attachModeOn
- attachModeButton.Text = attachModeOn and "Attach Mode: ON" or "Attach Mode: OFF"
- tweenColor(attachModeButton, attachModeOn and darkGold or standardBtnColor)
- end)
- -- ADD PLAYER BUTTONS
- local function addPlayerButton(targetPlayer)
- if targetPlayer == LocalPlayer then return end
- local button = Instance.new("TextButton")
- button.Size = UDim2.new(1, 0, 0, 28)
- button.BackgroundColor3 = defaultBtnColor
- button.TextColor3 = whiteText
- button.Font = Enum.Font.GothamBold
- button.TextSize = 13
- button.Text = targetPlayer.Name
- button.LayoutOrder = 100
- button.Parent = scroll
- local killLabel = Instance.new("TextLabel", button)
- killLabel.Name = "KillLabel"
- killLabel.Size = UDim2.new(0, 60, 1, 0)
- killLabel.Position = UDim2.new(1, -65, 0, 0)
- killLabel.BackgroundTransparency = 1
- killLabel.TextColor3 = Color3.new(1, 0.2, 0.2)
- killLabel.Font = Enum.Font.GothamBold
- killLabel.TextSize = 12
- killLabel.TextXAlignment = Enum.TextXAlignment.Right
- killLabel.Text = "Kills: 0"
- -- Initialize kill tracking for this player
- setupKillTracking(targetPlayer)
- button.MouseButton1Click:Connect(function()
- local name = targetPlayer.Name
- loopList[name] = not loopList[name]
- tweenColor(button, loopList[name] and darkGold or defaultBtnColor)
- end)
- playerButtons[targetPlayer.Name] = button
- end
- -- CLEANUP ON PLAYER LEAVE
- Players.PlayerRemoving:Connect(function(player)
- if playerButtons[player.Name] then
- playerButtons[player.Name]:Destroy()
- playerButtons[player.Name] = nil
- end
- -- Clean up all tracking data
- if killConnections[player.Name] then
- for _, conn in pairs(killConnections[player.Name]) do
- if conn then conn:Disconnect() end
- end
- killConnections[player.Name] = nil
- end
- killCounts[player.Name] = nil
- damageTracker[player.Name] = nil
- interactionTracker[player.Name] = nil
- proximityTracker[player.Name] = nil
- bodyDestructionTracker[player.Name] = nil
- loopList[player.Name] = nil
- end)
- -- INIT ALL PLAYERS
- for _, p in ipairs(Players:GetPlayers()) do
- addPlayerButton(p)
- end
- Players.PlayerAdded:Connect(addPlayerButton)
- -- CHARACTER SPAWN (Updated to match first script)
- LocalPlayer.CharacterAdded:Connect(function(char)
- if speedBoostOn then
- local humanoid = char:WaitForChild("Humanoid", 5)
- if humanoid then
- applySpeedBoost(true)
- end
- end
- -- Death tracking
- local humanoid = char:WaitForChild("Humanoid", 5)
- if humanoid then
- humanoid.Died:Connect(function()
- myDeaths = myDeaths + 1
- myDeathLabel.Text = "☠ My Deaths: " .. myDeaths
- end)
- end
- end)
- -- Two Side Position loopbring function
- local function loopbringTwoSidePosition(myHRP, activeTargets)
- for i, char in ipairs(activeTargets) do
- local hrp = char:FindFirstChild("HumanoidRootPart")
- if hrp then
- setNoClip(char, true)
- hrp.Velocity = Vector3.new(0, 0, 0)
- hrp.RotVelocity = Vector3.new(0, 0, 0)
- local side = (i % 2 == 1) and -1 or 1
- local targetPos = Vector3.new(
- myHRP.Position.X + (myHRP.CFrame.RightVector * (side * 1)).X + (myHRP.CFrame.LookVector * 2).X,
- myHRP.Position.Y,
- myHRP.Position.Z + (myHRP.CFrame.RightVector * (side * 1)).Z + (myHRP.CFrame.LookVector * 2).Z
- )
- hrp.CFrame = CFrame.new(targetPos) * CFrame.Angles(0, math.rad(myHRP.Orientation.Y), 0)
- end
- end
- end
- -- LOOPBRING CORE LOOP
- task.spawn(function()
- while true do
- local myHRP = LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart")
- if myHRP then
- local activeTargets = {}
- for name, active in pairs(loopList) do
- if active then
- local target = Players:FindFirstChild(name)
- if target and target.Character and target.Character:FindFirstChild("HumanoidRootPart") then
- table.insert(activeTargets, target.Character)
- end
- end
- end
- if twoSidePositionOn and #activeTargets > 0 then
- loopbringTwoSidePosition(myHRP, activeTargets)
- else
- for name, active in pairs(loopList) do
- if active then
- local target = Players:FindFirstChild(name)
- if target and target.Character then
- local hrp = target.Character:FindFirstChild("HumanoidRootPart")
- if hrp then
- setNoClip(target.Character, true)
- hrp.Velocity = Vector3.zero
- hrp.RotVelocity = Vector3.zero
- local offset
- if attachModeOn then
- myHRP.CFrame = hrp.CFrame
- else
- if frontLoopMode then
- offset = myHRP.CFrame.LookVector * 3 + Vector3.new(0, 1, 0)
- else
- offset = myHRP.CFrame.RightVector * 3 + myHRP.CFrame.LookVector + Vector3.new(0, 1, 0)
- end
- hrp.CFrame = myHRP.CFrame + offset
- end
- end
- end
- end
- end
- end
- end
- task.wait(0)
- end
- end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement