跳至內容
可用

Blood debt hub [OPEN SOURCE SILENT-AIM]

CLclarkdevlinorg0 次瀏覽Universal2026年7月26日
分享
Blood debt hub [OPEN SOURCE SILENT-AIM]

腳本程式碼

Lua
--[[
MIT License

Copyright (c) 2026 Ring0

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
]]

if getgenv()._bdhub then pcall(function() getgenv()._bdhub.kill() end) end

local Players, UIS, RunService, RS, Lighting, Teams =
    game:GetService("Players"), game:GetService("UserInputService"),
    game:GetService("RunService"), game:GetService("ReplicatedStorage"),
    game:GetService("Lighting"), game:GetService("Teams")
local LP, Camera = Players.LocalPlayer, workspace.CurrentCamera
local inflict = RS:WaitForChild("gun_res"):WaitForChild("evt"):WaitForChild("inflict")

local killerSet, vigSet = {}, {}
local sdOk, sd = pcall(function() return require(RS.Modules.ShopData) end)
if sdOk and sd and sd.Weapons then
    if sd.Weapons.Killer then for k in pairs(sd.Weapons.Killer) do killerSet[k] = true end end
    if sd.Weapons.Vigilante then for k in pairs(sd.Weapons.Vigilante) do vigSet[k] = true end end
end

local ROLE_COLORS = {
    Killer = Color3.fromRGB(200, 25, 30),
    Vigilante = Color3.fromRGB(50, 130, 220),
    Bystander = Color3.fromRGB(165, 165, 155),
    ["Bystander?"] = Color3.fromRGB(110, 110, 105),
    Detective = Color3.fromRGB(230, 175, 50),
    Unknown = Color3.fromRGB(220, 215, 200),
}

local ACCENT = Color3.fromRGB(220, 215, 200)
local ACCENT_DIM = Color3.fromRGB(110, 110, 105)
local BLOOD = Color3.fromRGB(165, 25, 30)

local cfg = {
    SA_Enabled=true, SA_Scoring="Crosshair", SA_HitPart="Head",
    SA_Wallcheck=false, SA_VisibleOnly=false, SA_FovEnabled=true, SA_FovDegrees=60,
    SA_OnlyIsPlayer=true, SA_MinInterval=0.1, SA_LastFire=0,
    SA_RoleTeamCheck=true, SA_TeamsCheck=true,

    CH_Enabled=true, CH_Color=BLOOD,
    CH_FillTransparency=0.82, CH_OutlineTransparency=0,
    CH_ThroughWalls=true, CH_ShowSelf=false, CH_Pulse=false,
    CH_PulseSpeed=2.0, CH_PulseDepth=0.15,
    CH_ColorByRole=true, CH_ColorByTeam=true,

    BL_Intensity=0.45, BL_Threshold=1.6, BL_Size=18,

    HB_Enabled=false, HB_Color=Color3.fromRGB(120, 180, 220), HB_Transparency=0.7,

    TE_Enabled=true, TE_Color=ACCENT, TE_Distance=true,
    TE_ShowRole=true, TE_ShowTeam=true, TE_ColorByRole=true,

    TL_Enabled=true, TL_Color=BLOOD, TL_Radius=12, TL_Thickness=1.4,

    AA_Enabled=false, AA_Mode="Spin", AA_SpinSpeed=600,
    WM_Enabled=true,

    WP_Enabled=false, WP_Transparency=0.0, WP_Material="None",

    GFX_Lighting=true, GFX_ClockTime=14.5, GFX_Brightness=2.0, GFX_Exposure=0.4,
    GFX_Ambient=Color3.fromRGB(120,120,135), GFX_OutdoorAmbient=Color3.fromRGB(140,140,160),
    GFX_SpecScale=1.0, GFX_DiffScale=1.0,
    GFX_Skybox=true,
    GFX_CC=true, GFX_Saturation=0.18, GFX_Contrast=0.10, GFX_CCBrightness=0.02,
    GFX_Bloom=true, GFX_BloomIntensity=0.35, GFX_BloomThreshold=1.6, GFX_BloomSize=22,
    GFX_SunRays=true, GFX_SunIntensity=0.04, GFX_SunSpread=0.65,
    GFX_DOF=false, GFX_DOFFocus=30, GFX_DOFRadius=10, GFX_DOFFar=0.5,
    GFX_XRay=false, GFX_XRayAmount=0.55, GFX_XRayMinSize=6,
    GFX_Shiny=false, GFX_ShinyAmount=0.25,
}

local roleCache = {}

local function getLPRole()
    local pgui = LP:FindFirstChild("PlayerGui")
    if not pgui then return "Unknown" end
    local rsod = pgui:FindFirstChild("RSOD")
    if rsod then
        local role = rsod:FindFirstChild("Role")
        if role and role:IsA("TextLabel") then
            local t = role.Text or ""
            if t:find("Bystander") then return "Bystander"
            elseif t:find("Killer") then return "Killer"
            elseif t:find("Vigilante") then return "Vigilante"
            elseif t:find("Detective") then return "Detective" end
        end
    end
    local sp = pgui:FindFirstChild("SpawnText")
    if sp then
        local r = sp:FindFirstChild("Rolery")
        if r and r:IsA("TextLabel") then
            local t = (r.Text or ""):upper()
            if t:find("BYSTANDER") then return "Bystander"
            elseif t:find("KILLER") then return "Killer"
            elseif t:find("VIGILANTE") then return "Vigilante"
            elseif t:find("DETECTIVE") then return "Detective" end
        end
    end
    return "Unknown"
end

local function scanToolsForRole(plr)
    local hasK, hasV = false, false
    if plr.Character then
        for _, c in ipairs(plr.Character:GetChildren()) do
            if c:IsA("Tool") then
                if killerSet[c.Name] then hasK = true
                elseif vigSet[c.Name] then hasV = true end
            end
        end
    end
    if plr == LP then
        local bp = plr:FindFirstChild("Backpack")
        if bp then
            for _, c in ipairs(bp:GetChildren()) do
                if c:IsA("Tool") then
                    if killerSet[c.Name] then hasK = true
                    elseif vigSet[c.Name] then hasV = true end
                end
            end
        end
    end
    if hasK then return "Killer"
    elseif hasV then return "Vigilante" end
    return nil
end

local function inferRole(plr)
    local uid = plr.UserId
    local current = scanToolsForRole(plr)
    if current then
        roleCache[uid] = current
        return current
    end
    if roleCache[uid] then return roleCache[uid] end
    return "Bystander?"
end

local function resetRoleCache() roleCache = {} end

local function teamsActive()
    return #Teams:GetTeams() > 0
end

local function getDisplayLabel(plr)
    if teamsActive() and plr.Team then return plr.Team.Name end
    return inferRole(plr)
end

local function getDisplayColor(plr, fallback)
    if teamsActive() and plr.Team and plr.TeamColor then return plr.TeamColor.Color end
    local r = inferRole(plr)
    return ROLE_COLORS[r] or fallback
end

local roundConns = {}
local function bindRoundResetSignals()
    for _, c in ipairs(roundConns) do pcall(function() c:Disconnect() end) end
    roundConns = {}
    table.insert(roundConns, LP.CharacterAdded:Connect(function() resetRoleCache() end))
    table.insert(roundConns, Players.PlayerAdded:Connect(function() resetRoleCache() end))
    table.insert(roundConns, Players.PlayerRemoving:Connect(function(p) roleCache[p.UserId] = nil end))
    for _, p in ipairs(Players:GetPlayers()) do
        if p ~= LP then
            table.insert(roundConns, p.CharacterAdded:Connect(function() roleCache[p.UserId] = nil end))
        end
    end
    table.insert(roundConns, Players.PlayerAdded:Connect(function(p)
        table.insert(roundConns, p.CharacterAdded:Connect(function() roleCache[p.UserId] = nil end))
    end))
end
bindRoundResetSignals()

local function colorForPlayer(plr)
    if cfg.CH_ColorByTeam and plr.Team and LP.Team and teamsActive() then
        return plr.TeamColor and plr.TeamColor.Color or cfg.CH_Color
    end
    if cfg.CH_ColorByRole then
        return getDisplayColor(plr, cfg.CH_Color)
    end
    return cfg.CH_Color
end

local function isFriendly(enemyPlr, enemyRole, lpRole)
    if cfg.SA_TeamsCheck and #Teams:GetTeams() > 0 and LP.Team and enemyPlr.Team then
        if LP.Team == enemyPlr.Team then return true end
        return false
    end
    if not cfg.SA_RoleTeamCheck then return false end
    if not lpRole or lpRole == "Unknown" then return false end
    if lpRole == "Killer" then return enemyRole == "Killer"
    elseif lpRole == "Vigilante" or lpRole == "Detective" then
        return enemyRole == "Vigilante" or enemyRole == "Detective" or enemyRole == "Bystander?"
    elseif lpRole == "Bystander" then
        return enemyRole == "Bystander?" or enemyRole == "Vigilante" or enemyRole == "Detective"
    end
    return false
end

local rcParams = RaycastParams.new()
rcParams.FilterType = Enum.RaycastFilterType.Exclude
rcParams.IgnoreWater = true

local function isVisibleHead(headPos, char)
    if LP.Character then rcParams.FilterDescendantsInstances = { LP.Character, Camera } end
    local hit = workspace:Raycast(Camera.CFrame.Position, headPos - Camera.CFrame.Position, rcParams)
    if not hit then return true end
    local p = hit.Instance
    while p and p ~= workspace do
        if p == char or p:FindFirstChildOfClass("Humanoid") then return true end
        p = p.Parent
    end
    return false
end

local function eachEnemy()
    local list = {}
    for _, plr in ipairs(Players:GetPlayers()) do
        if plr ~= LP then
            local char = plr.Character
            if char then
                local hum = char:FindFirstChildOfClass("Humanoid")
                local head = char:FindFirstChild("Head")
                if hum and head and hum.Health > 0 then
                    local ok = true
                    if cfg.SA_OnlyIsPlayer then
                        local f = char:FindFirstChild("IsInfactAPlayer")
                        if not f or not f.Value then ok = false end
                    end
                    if ok then table.insert(list, { Player=plr, Character=char, Humanoid=hum, Head=head }) end
                end
            end
        end
    end
    return list
end

local function getTarget()
    local best, bestScore = nil, math.huge
    local camCF = Camera.CFrame
    local camPos, lookDir = camCF.Position, camCF.LookVector
    local lpHrp = LP.Character and LP.Character:FindFirstChild("HumanoidRootPart")
    local lpRole = (cfg.SA_RoleTeamCheck or cfg.SA_TeamsCheck) and getLPRole() or "Unknown"
    for _, e in ipairs(eachEnemy()) do
        local headPos = e.Head.Position
        local toHead = headPos - camPos
        local mag = toHead.Magnitude
        if mag > 0 then
            local unit = toHead / mag
            local skip = false
            local enemyRole = inferRole(e.Player)
            if isFriendly(e.Player, enemyRole, lpRole) then skip = true end
            if not skip and cfg.SA_VisibleOnly then
                local _, onScreen = Camera:WorldToScreenPoint(headPos)
                if not onScreen then skip = true end
            end
            if not skip and cfg.SA_FovEnabled then
                local a = math.deg(math.acos(math.clamp(lookDir:Dot(unit), -1, 1)))
                if a > cfg.SA_FovDegrees then skip = true end
            end
            if not skip and cfg.SA_Wallcheck and not isVisibleHead(headPos, e.Character) then skip = true end
            if not skip then
                local hp = e.Character:FindFirstChild(cfg.SA_HitPart) or e.Head
                local score
                if cfg.SA_Scoring=="Crosshair" then score=math.acos(math.clamp(lookDir:Dot(unit),-1,1))
                elseif cfg.SA_Scoring=="3D" then score=lpHrp and (lpHrp.Position-headPos).Magnitude or mag
                else score=e.Humanoid.Health end
                if score < bestScore then
                    bestScore = score
                    best = { Player=e.Player, Character=e.Character, Humanoid=e.Humanoid, Head=e.Head, HitPart=hp }
                end
            end
        end
    end
    return best
end

local function resolveTool()
    local char = LP.Character
    if not char then return end
    for _, c in ipairs(char:GetChildren()) do
        if c:IsA("Tool") and c.Name ~= "Hands" then return c end
    end
end

local function fireInflict(t, tool)
    if not t or not tool then return end
    local hp = t.HitPart
    inflict:FireServer(tool, t.Humanoid, hp, workspace:GetServerTimeNow(),
        { pos=hp.Position, size=hp.Size })
end

local lmbConn = UIS.InputBegan:Connect(function(input, gpe)
    if gpe or not cfg.SA_Enabled then return end
    if input.UserInputType ~= Enum.UserInputType.MouseButton1 then return end
    if UIS:GetFocusedTextBox() then return end
    if os.clock() - cfg.SA_LastFire < cfg.SA_MinInterval then return end
    local t = getTarget()
    if not t then return end
    local tool = resolveTool()
    if not tool then return end
    cfg.SA_LastFire = os.clock()
    fireInflict(t, tool)
end)

local origFireServer, hookOk = nil, false
if typeof(hookfunction)=="function" and typeof(newcclosure)=="function" then
    local hookedSelf = inflict
    pcall(function()
        origFireServer = hookfunction(inflict.FireServer, newcclosure(function(self, ...)
            if cfg.SA_Enabled and self == hookedSelf then
                local t = getTarget()
                if t then
                    local a, b, c, d, e = ...
                    return origFireServer(self, a, t.Humanoid, t.HitPart, d,
                        { pos=t.HitPart.Position, size=t.HitPart.Size })
                end
            end
            return origFireServer(self, ...)
        end))
        hookOk = origFireServer ~= nil
    end)
end

local highlights, hbAdorns, toolGuis, charConns = {}, {}, {}, {}

local function clearChamFor(plr)
    local h = highlights[plr]
    if h then h:Destroy(); highlights[plr] = nil end
end
local function clearHbFor(char)
    local list = hbAdorns[char]
    if list then for _, a in ipairs(list) do a:Destroy() end; hbAdorns[char] = nil end
end
local function clearToolFor(plr)
    local g = toolGuis[plr]
    if g then g:Destroy(); toolGuis[plr] = nil end
end

local function applyCham(plr)
    if (plr == LP) and not cfg.CH_ShowSelf then return end
    clearChamFor(plr)
    if not cfg.CH_Enabled then return end
    local char = plr.Character
    if not char then return end
    local color = colorForPlayer(plr)
    local h = Instance.new("Highlight")
    h.Name = "BD_CHAM"
    h.Adornee = char
    h.FillColor = color
    h.OutlineColor = color
    h.FillTransparency = cfg.CH_FillTransparency
    h.OutlineTransparency = cfg.CH_OutlineTransparency
    h.DepthMode = cfg.CH_ThroughWalls and Enum.HighlightDepthMode.AlwaysOnTop or Enum.HighlightDepthMode.Occluded
    h.Parent = char
    highlights[plr] = h
end

local function applyHb(char)
    clearHbFor(char)
    if not cfg.HB_Enabled or not char then return end
    local list = {}
    for _, part in ipairs(char:GetChildren()) do
        if part:IsA("BasePart") and part.Name ~= "PeePee" and part.Name ~= "HumanoidRootPart" then
            local box = Instance.new("BoxHandleAdornment")
            box.Name = "BD_HB"
            box.Adornee = part
            box.Size = part.Size
            box.Color3 = cfg.HB_Color
            box.Transparency = cfg.HB_Transparency
            box.AlwaysOnTop = true
            box.ZIndex = 5
            box.Parent = part
            table.insert(list, box)
        end
    end
    hbAdorns[char] = list
end

local function applyTool(plr)
    clearToolFor(plr)
    if not cfg.TE_Enabled or plr == LP then return end
    local char = plr.Character
    local head = char and char:FindFirstChild("Head")
    if not head then return end
    local bg = Instance.new("BillboardGui")
    bg.Name = "BD_TE"
    bg.Adornee = head
    bg.Size = UDim2.new(0, 220, 0, 22)
    bg.StudsOffset = Vector3.new(0, 2.8, 0)
    bg.AlwaysOnTop = true
    bg.MaxDistance = 1500
    bg.Parent = char
    local lbl = Instance.new("TextLabel")
    lbl.BackgroundTransparency = 1
    lbl.Size = UDim2.new(1, 0, 1, 0)
    lbl.TextColor3 = cfg.TE_Color
    lbl.Font = Enum.Font.RobotoMono
    lbl.TextSize = 12
    lbl.TextScaled = false
    lbl.TextStrokeTransparency = 0.4
    lbl.TextStrokeColor3 = Color3.new(0,0,0)
    lbl.Text = "..."
    lbl.Parent = bg
    toolGuis[plr] = bg
end

local function refreshAll()
    for _, p in ipairs(Players:GetPlayers()) do
        applyCham(p)
        if p.Character then applyHb(p.Character) end
        applyTool(p)
    end
end

local function bindPlayer(plr)
    if charConns[plr] then charConns[plr]:Disconnect() end
    charConns[plr] = plr.CharacterAdded:Connect(function()
        task.wait(0.2)
        applyCham(plr); if plr.Character then applyHb(plr.Character) end; applyTool(plr)
    end)
    applyCham(plr)
    if plr.Character then applyHb(plr.Character) end
    applyTool(plr)
end
for _, p in ipairs(Players:GetPlayers()) do bindPlayer(p) end
local paConn = Players.PlayerAdded:Connect(bindPlayer)
local prConn = Players.PlayerRemoving:Connect(function(plr)
    clearChamFor(plr); clearToolFor(plr)
    if plr.Character then clearHbFor(plr.Character) end
    if charConns[plr] then charConns[plr]:Disconnect(); charConns[plr] = nil end
end)

local existingBloom = Lighting:FindFirstChild("BD_BLOOM")
if existingBloom then existingBloom:Destroy() end
local bloom = Instance.new("BloomEffect")
bloom.Name = "BD_BLOOM"
bloom.Intensity = cfg.BL_Intensity
bloom.Threshold = cfg.BL_Threshold
bloom.Size = cfg.BL_Size
bloom.Parent = Lighting

local Drawing = Drawing or _G.Drawing
local drawingOk = typeof(Drawing) == "table" and typeof(Drawing.new) == "function"
local lockRing, watermark
if drawingOk then
    lockRing = Drawing.new("Circle")
    lockRing.Visible = false; lockRing.NumSides = 32
    lockRing.Thickness = cfg.TL_Thickness; lockRing.Color = cfg.TL_Color
    lockRing.Transparency = 0.85; lockRing.Filled = false

    watermark = Drawing.new("Text")
    watermark.Text = "BDHUB    BY RING0"; watermark.Size = 14
    watermark.Color = ACCENT; watermark.Outline = true
    watermark.OutlineColor = Color3.new(0,0,0); watermark.Center = false
    watermark.Visible = cfg.WM_Enabled; watermark.Position = Vector2.new(10, 10)
    watermark.Font = 4
end

local pulseConn = RunService.Heartbeat:Connect(function()
    if cfg.CH_Enabled and cfg.CH_Pulse then
        local s = (math.sin(os.clock() * cfg.CH_PulseSpeed) + 1) * 0.5
        local fillT = math.clamp(cfg.CH_FillTransparency + (s - 0.5) * cfg.CH_PulseDepth, 0, 1)
        local intensity = cfg.BL_Intensity * (1 + (s - 0.5) * cfg.CH_PulseDepth)
        for _, h in pairs(highlights) do if h then h.FillTransparency = fillT end end
        if bloom then bloom.Intensity = intensity end
    end
end)

local lastChamRefresh = 0
local chamRefreshConn = RunService.Heartbeat:Connect(function()
    if not cfg.CH_Enabled then return end
    if os.clock() - lastChamRefresh < 0.2 then return end
    lastChamRefresh = os.clock()
    for plr, h in pairs(highlights) do
        if h and plr and plr.Parent then
            local c = colorForPlayer(plr)
            h.FillColor = c
            h.OutlineColor = c
        end
    end
end)

local lastToolUpdate = 0
local toolUpdateConn = RunService.Heartbeat:Connect(function()
    if os.clock() - lastToolUpdate < 0.2 then return end
    lastToolUpdate = os.clock()
    local lpHrp = LP.Character and LP.Character:FindFirstChild("HumanoidRootPart")
    for plr, bg in pairs(toolGuis) do
        local char = plr.Character
        local hum = char and char:FindFirstChildOfClass("Humanoid")
        local hrp = char and char:FindFirstChild("HumanoidRootPart")
        if not (char and hum and hrp) then bg.Enabled = false; continue end
        bg.Enabled = cfg.TE_Enabled
        local tool
        for _, c in ipairs(char:GetChildren()) do
            if c:IsA("Tool") and c.Name ~= "Hands" then tool = c; break end
        end
        local toolName = tool and tool.Name or "Hands"
        local distText = ""
        if cfg.TE_Distance and lpHrp then
            distText = string.format("  %dm", math.floor((lpHrp.Position - hrp.Position).Magnitude))
        end
        local roleText = ""
        local teamText = ""
        local color = cfg.TE_Color
        if cfg.TE_ShowRole then
            local label = getDisplayLabel(plr)
            roleText = "  " .. label
            if cfg.TE_ColorByRole then color = getDisplayColor(plr, cfg.TE_Color) end
        end
        if cfg.TE_ShowTeam and plr.Team and not teamsActive() then
            teamText = "  " .. plr.Team.Name
        end
        local lbl = bg:FindFirstChildOfClass("TextLabel")
        if lbl then
            lbl.Text = string.format("%s%s%s%s%s", plr.Name, roleText, teamText,
                tool and ("  " .. toolName) or "", distText)
            lbl.TextColor3 = color
        end
    end
end)

local hbResizeConn = RunService.Heartbeat:Connect(function()
    if not cfg.HB_Enabled then return end
    for _, list in pairs(hbAdorns) do
        for _, a in ipairs(list) do
            if a.Adornee then a.Color3 = cfg.HB_Color; a.Transparency = cfg.HB_Transparency end
        end
    end
end)

local drawConn
if drawingOk then
drawConn = RunService.RenderStepped:Connect(function()
    local viewport = Camera.ViewportSize
    local tgt = getTarget()

    if cfg.TL_Enabled and tgt then
        local sp, onScr = Camera:WorldToScreenPoint(tgt.HitPart.Position)
        if onScr then
            lockRing.Position = Vector2.new(sp.X, sp.Y)
            lockRing.Radius = cfg.TL_Radius
            lockRing.Color = cfg.TL_Color
            lockRing.Thickness = cfg.TL_Thickness
            lockRing.Visible = true
        else lockRing.Visible = false end
    else lockRing.Visible = false end

    if watermark then
        watermark.Visible = cfg.WM_Enabled
        if cfg.WM_Enabled then
            local lpRole = getLPRole()
            local lpTeam = LP.Team and LP.Team.Name or "-"
            watermark.Text = string.format("BDHUB    BY RING0    %s    %s    hook %s%s",
                lpRole, lpTeam, hookOk and "" or "",
                tgt and ("     " .. tgt.Player.Name) or "")
        end
    end
end)
end

local droppedTracked = {}
local function clearDropped(tool)
    local rec = droppedTracked[tool]
    if rec then
        if rec.hl then pcall(function() rec.hl:Destroy() end) end
        if rec.bg then pcall(function() rec.bg:Destroy() end) end
        droppedTracked[tool] = nil
    end
end
local function isDropped(tool)
    local p = tool.Parent
    while p and p ~= game do
        if p:IsA("Player") then return false end
        if p:IsA("Backpack") then return false end
        if p:IsA("Model") then
            local hum = p:FindFirstChildOfClass("Humanoid")
            if hum then
                if hum.Health > 0 then return false end
                return true
            end
        end
        p = p.Parent
    end
    return true
end
local function applyDropped(tool, role)
    clearDropped(tool)
    local color = ROLE_COLORS[role]
    if not color then return end
    local adornee = tool:FindFirstChildWhichIsA("BasePart")
    if not adornee then return end
    local hl = Instance.new("Highlight")
    hl.Name = "BD_DROP"
    hl.Adornee = tool
    hl.FillColor = color; hl.OutlineColor = color
    hl.FillTransparency = 0.4; hl.OutlineTransparency = 0
    hl.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop
    hl.Parent = tool
    local bg = Instance.new("BillboardGui")
    bg.Name = "BD_DROP_BG"; bg.Adornee = adornee
    bg.Size = UDim2.new(0, 200, 0, 24)
    bg.StudsOffset = Vector3.new(0, 1.8, 0)
    bg.AlwaysOnTop = true; bg.MaxDistance = 2000
    bg.Parent = tool
    local lbl = Instance.new("TextLabel")
    lbl.BackgroundTransparency = 1; lbl.Size = UDim2.new(1, 0, 1, 0)
    lbl.TextColor3 = color; lbl.Font = Enum.Font.RobotoMono
    lbl.TextSize = 12; lbl.TextStrokeTransparency = 0.4
    lbl.TextStrokeColor3 = Color3.new(0,0,0)
    lbl.Text = string.format("%s  %s", role, tool.Name)
    lbl.Parent = bg
    droppedTracked[tool] = { hl = hl, bg = bg, role = role }
end
local function checkDropped(tool)
    if not tool:IsA("Tool") then return end
    if not cfg.DR_Enabled then return end
    local role
    if killerSet[tool.Name] then role = "Killer"
    elseif vigSet[tool.Name] then role = "Vigilante" end
    if not role then return end
    if isDropped(tool) then
        if not droppedTracked[tool] or droppedTracked[tool].role ~= role then
            applyDropped(tool, role)
        end
    else clearDropped(tool) end
end
local function scanDropped()
    for _, d in ipairs(workspace:GetDescendants()) do
        if d:IsA("Tool") then checkDropped(d) end
    end
end
cfg.DR_Enabled = true
scanDropped()
local descAddedConn = workspace.DescendantAdded:Connect(function(d)
    if d:IsA("Tool") then task.wait(0.15); checkDropped(d) end
end)
local descRemovedConn = workspace.DescendantRemoving:Connect(function(d)
    if d:IsA("Tool") then clearDropped(d) end
end)
local lastDropScan = 0
local dropRescanConn = RunService.Heartbeat:Connect(function()
    if os.clock() - lastDropScan < 2.0 then return end
    lastDropScan = os.clock()
    for tool in pairs(droppedTracked) do
        if not tool.Parent or not isDropped(tool) then clearDropped(tool) end
    end
end)

local gfxOriginalLighting, gfxOriginalParts, gfxEffects, gfxSky = {}, {}, {}, nil
local gfxChildAddedConn, gfxSkyWatcherConn
local function gfxSaveL(prop) if gfxOriginalLighting[prop] == nil then gfxOriginalLighting[prop] = Lighting[prop] end end
local function gfxRestoreLighting()
    for k, v in pairs(gfxOriginalLighting) do pcall(function() Lighting[k] = v end) end
    gfxOriginalLighting = {}
end
local function gfxClearEffects()
    for _, e in ipairs(gfxEffects) do pcall(function() e:Destroy() end) end
    gfxEffects = {}
    if gfxSky then pcall(function() gfxSky:Destroy() end); gfxSky = nil end
end
local function gfxAddEffect(class, name, props)
    local ex = Lighting:FindFirstChild(name); if ex then ex:Destroy() end
    local e = Instance.new(class)
    e.Name = name
    for k, v in pairs(props) do e[k] = v end
    e.Parent = Lighting
    table.insert(gfxEffects, e)
    return e
end
local function gfxApplyLighting()
    if not cfg.GFX_Lighting then return end
    gfxSaveL("ClockTime"); gfxSaveL("Brightness"); gfxSaveL("ExposureCompensation")
    gfxSaveL("Ambient"); gfxSaveL("OutdoorAmbient"); gfxSaveL("GlobalShadows")
    gfxSaveL("EnvironmentSpecularScale"); gfxSaveL("EnvironmentDiffuseScale")
    Lighting.ClockTime = cfg.GFX_ClockTime
    Lighting.Brightness = cfg.GFX_Brightness
    Lighting.ExposureCompensation = cfg.GFX_Exposure
    Lighting.Ambient = cfg.GFX_Ambient
    Lighting.OutdoorAmbient = cfg.GFX_OutdoorAmbient
    Lighting.GlobalShadows = true
    Lighting.EnvironmentSpecularScale = cfg.GFX_SpecScale
    Lighting.EnvironmentDiffuseScale = cfg.GFX_DiffScale
end
local function gfxNukeOtherSkies()
    for _, c in ipairs(Lighting:GetChildren()) do
        if c:IsA("Sky") and c.Name ~= "BD_GFX_SKY" then pcall(function() c:Destroy() end) end
    end
end
local function gfxApplySkybox()
    if gfxSky then pcall(function() gfxSky:Destroy() end); gfxSky = nil end
    if gfxSkyWatcherConn then gfxSkyWatcherConn:Disconnect(); gfxSkyWatcherConn = nil end
    if not cfg.GFX_Skybox then return end
    gfxNukeOtherSkies()
    local sky = Instance.new("Sky")
    sky.Name = "BD_GFX_SKY"
    sky.SkyboxBk = "rbxassetid://159454275"
    sky.SkyboxDn = "rbxassetid://159454279"
    sky.SkyboxFt = "rbxassetid://159454286"
    sky.SkyboxLf = "rbxassetid://159454291"
    sky.SkyboxRt = "rbxassetid://159454293"
    sky.SkyboxUp = "rbxassetid://159454296"
    sky.StarCount = 3000
    sky.CelestialBodiesShown = true
    sky.SunAngularSize = 11
    sky.MoonAngularSize = 11
    sky.Parent = Lighting
    gfxSky = sky
    gfxSkyWatcherConn = Lighting.ChildAdded:Connect(function(c)
        if c:IsA("Sky") and c.Name ~= "BD_GFX_SKY" then
            task.wait(0.05); pcall(function() c:Destroy() end)
        end
    end)
end
local function gfxApplyEffects()
    gfxClearEffects()
    gfxApplySkybox()
    if cfg.GFX_CC then
        gfxAddEffect("ColorCorrectionEffect", "BD_GFX_CC", {
            Saturation = cfg.GFX_Saturation, Contrast = cfg.GFX_Contrast, Brightness = cfg.GFX_CCBrightness,
        })
    end
    if cfg.GFX_Bloom then
        gfxAddEffect("BloomEffect", "BD_GFX_BLOOM", {
            Intensity = cfg.GFX_BloomIntensity, Threshold = cfg.GFX_BloomThreshold, Size = cfg.GFX_BloomSize,
        })
    end
    if cfg.GFX_SunRays then
        gfxAddEffect("SunRaysEffect", "BD_GFX_SUN", {
            Intensity = cfg.GFX_SunIntensity, Spread = cfg.GFX_SunSpread,
        })
    end
    if cfg.GFX_DOF then
        gfxAddEffect("DepthOfFieldEffect", "BD_GFX_DOF", {
            FocusDistance = cfg.GFX_DOFFocus, InFocusRadius = cfg.GFX_DOFRadius,
            FarIntensity = cfg.GFX_DOFFar, NearIntensity = 0,
        })
    end
end
local function gfxIsPartIgnored(p)
    local par = p.Parent
    while par and par ~= game do
        if par:FindFirstChildOfClass("Humanoid") then return true end
        if par:IsA("Tool") then return true end
        if par == Lighting then return true end
        par = par.Parent
    end
    return false
end
local function gfxMutatePart(p)
    if gfxIsPartIgnored(p) then return end
    local sz = p.Size.Magnitude
    if cfg.GFX_XRay and p.Transparency < 0.4 and sz >= cfg.GFX_XRayMinSize then
        if not gfxOriginalParts[p] then gfxOriginalParts[p] = { t = p.Transparency, r = p.Reflectance } end
        p.Transparency = math.max(p.Transparency, cfg.GFX_XRayAmount)
    end
    if cfg.GFX_Shiny and (p.Material == Enum.Material.Plastic or p.Material == Enum.Material.SmoothPlastic or p.Material == Enum.Material.Metal) then
        if not gfxOriginalParts[p] then gfxOriginalParts[p] = { t = p.Transparency, r = p.Reflectance } end
        p.Reflectance = math.max(p.Reflectance, cfg.GFX_ShinyAmount)
    end
end
local function gfxScanOnce()
    if not (cfg.GFX_XRay or cfg.GFX_Shiny) then return end
    for _, p in ipairs(workspace:GetDescendants()) do
        if p:IsA("BasePart") and not p:IsA("Terrain") then gfxMutatePart(p) end
    end
end
local function gfxRestoreParts()
    for p, orig in pairs(gfxOriginalParts) do
        if p.Parent then pcall(function() p.Transparency = orig.t; p.Reflectance = orig.r end) end
    end
    gfxOriginalParts = {}
end
local function gfxReapplyParts()
    gfxRestoreParts()
    gfxScanOnce()
end
gfxApplyLighting()
gfxApplyEffects()
gfxScanOnce()
gfxChildAddedConn = workspace.DescendantAdded:Connect(function(d)
    if d:IsA("BasePart") and not d:IsA("Terrain") then task.wait(0.05); gfxMutatePart(d) end
end)

local wpOrigMat, wpOrigTrans, wpTrackedParts = {}, {}, {}

local function wpRestorePart(p)
    if not p then return end
    if wpOrigTrans[p] ~= nil then pcall(function() p.Transparency = wpOrigTrans[p] end); wpOrigTrans[p] = nil end
    if wpOrigMat[p] ~= nil then pcall(function() p.Material = wpOrigMat[p] end); wpOrigMat[p] = nil end
    wpTrackedParts[p] = nil
end

local function wpRestoreAll()
    for p in pairs(wpTrackedParts) do wpRestorePart(p) end
end

local function wpGetEquippedTool()
    local char = LP.Character
    if not char then return nil end
    for _, c in ipairs(char:GetChildren()) do
        if c:IsA("Tool") then return c end
    end
    return nil
end

local function wpApplyToPart(p, newMat, trans)
    if wpOrigMat[p] == nil then wpOrigMat[p] = p.Material end
    if wpOrigTrans[p] == nil then wpOrigTrans[p] = p.Transparency end
    wpTrackedParts[p] = true
    if newMat then pcall(function() p.Material = newMat end) end
    pcall(function() p.Transparency = math.max(wpOrigTrans[p], trans) end)
end

local function wpApplyToTool(tool, newMat, trans)
    if not tool then return end
    for _, d in ipairs(tool:GetDescendants()) do
        if d:IsA("BasePart") then wpApplyToPart(d, newMat, trans) end
    end
end

local wpHeartbeat = RunService.Heartbeat:Connect(function()
    if not cfg.WP_Enabled then
        if next(wpTrackedParts) then wpRestoreAll() end
        return
    end
    local tool = wpGetEquippedTool()
    if not tool then
        if next(wpTrackedParts) then wpRestoreAll() end
        return
    end
    for p in pairs(wpTrackedParts) do
        if not p.Parent or not p:IsDescendantOf(tool) then wpRestorePart(p) end
    end
    local newMat = (cfg.WP_Material ~= "None") and Enum.Material[cfg.WP_Material] or nil
    wpApplyToTool(tool, newMat, cfg.WP_Transparency)
end)

local antiAimConn = RunService.Heartbeat:Connect(function(dt)
    if not cfg.AA_Enabled then return end
    local char = LP.Character
    local hrp = char and char:FindFirstChild("HumanoidRootPart")
    if not hrp then return end
    if cfg.AA_Mode == "Spin" then
        hrp.CFrame = hrp.CFrame * CFrame.Angles(0, math.rad(cfg.AA_SpinSpeed * dt), 0)
    elseif cfg.AA_Mode == "Backward" then
        local p = hrp.Position
        hrp.CFrame = CFrame.new(p, p + Vector3.new(-Camera.CFrame.LookVector.X, 0, -Camera.CFrame.LookVector.Z))
    elseif cfg.AA_Mode == "Jitter" then
        hrp.CFrame = hrp.CFrame * CFrame.Angles(0, math.rad(math.random(-180, 180)), 0)
    end
end)

local STR = {
    tab_aim="", tab_visuals="VISUAL", tab_esp="", tab_gfx="", tab_misc="MISC",
    gb_silent="SILENT AIM", gb_filters="",
    gb_chams="", gb_effects="EFFECTS",
    gb_toolesp="TOOL ESP", gb_hitboxes="", gb_dropped="DROPPED WEAPONS",
    gb_world="", gb_postfx="POST FX", gb_wallhack="",
    gb_antiaim="ANTI-AIM", gb_system="",
    kill_button="KILL ALL   ",
}
local function T(key) return STR[key] or key end

local Library
pcall(function() Library = loadstring(game:HttpGet("https://raw.githubusercontent.com/violin-suzutsuki/LinoriaLib/main/Library.lua"))() end)

if Library then
    local Window = Library:CreateWindow({
        Title = "BDHUB    BY RING0",
        Center = true,
        AutoShow = true,
        TabPadding = 8,
        MenuFadeTime = 0.2,
    })

    local Tabs = {
        Aim = Window:AddTab(T("tab_aim")),
        Visuals = Window:AddTab(T("tab_visuals")),
        Esp = Window:AddTab(T("tab_esp")),
        Gfx = Window:AddTab(T("tab_gfx")),
        Misc = Window:AddTab(T("tab_misc")),
    }

    local SilentBox = Tabs.Aim:AddLeftGroupbox(T("gb_silent"))
    SilentBox:AddToggle("SAEnabled", {Text="Silent Aim  ", Default=cfg.SA_Enabled, Callback=function(v) cfg.SA_Enabled=v end})
    SilentBox:AddDropdown("SAScoring", {Values={"Crosshair","3D","LowHP"}, Default=cfg.SA_Scoring, Text="Scoring", Callback=function(v) cfg.SA_Scoring=v end})
    SilentBox:AddDropdown("SAHitPart", {Values={"Head","Torso","HumanoidRootPart"}, Default=cfg.SA_HitPart, Text="Hit part", Callback=function(v) cfg.SA_HitPart=v end})
    SilentBox:AddToggle("SAFovEnabled", {Text="FOV cone", Default=cfg.SA_FovEnabled, Callback=function(v) cfg.SA_FovEnabled=v end})
    SilentBox:AddSlider("SAFovDeg", {Text="FOV degrees", Default=cfg.SA_FovDegrees, Min=10, Max=180, Rounding=0, Callback=function(v) cfg.SA_FovDegrees=v end})
    SilentBox:AddSlider("SAMinInt", {Text="Fire interval", Default=cfg.SA_MinInterval, Min=0.05, Max=1.0, Rounding=2, Suffix="s", Callback=function(v) cfg.SA_MinInterval=v end})
    SilentBox:AddToggle("SASkipNPC", {Text="Skip NPCs", Default=cfg.SA_OnlyIsPlayer, Callback=function(v) cfg.SA_OnlyIsPlayer=v end})

    local FiltersBox = Tabs.Aim:AddRightGroupbox(T("gb_filters"))
    FiltersBox:AddToggle("SARoleCheck", {Text="Role team check", Default=cfg.SA_RoleTeamCheck, Callback=function(v) cfg.SA_RoleTeamCheck=v end})
    FiltersBox:AddToggle("SATeamsCheck", {Text="Teams team check", Default=cfg.SA_TeamsCheck, Callback=function(v) cfg.SA_TeamsCheck=v end})
    FiltersBox:AddToggle("SAWallcheck", {Text="Wallcheck", Default=cfg.SA_Wallcheck, Callback=function(v) cfg.SA_Wallcheck=v end})
    FiltersBox:AddToggle("SAVisibleOnly", {Text="Visible only", Default=cfg.SA_VisibleOnly, Callback=function(v) cfg.SA_VisibleOnly=v end})
    FiltersBox:AddDivider()
    FiltersBox:AddButton({Text="Reset role cache", Func=function() resetRoleCache() end})

    local ChamsBox = Tabs.Visuals:AddLeftGroupbox(T("gb_chams"))
    ChamsBox:AddToggle("CHEnabled", {Text="Enabled", Default=cfg.CH_Enabled, Callback=function(v) cfg.CH_Enabled=v; refreshAll() end})
    ChamsBox:AddToggle("CHColorByTeam", {Text="Color by team", Default=cfg.CH_ColorByTeam, Callback=function(v) cfg.CH_ColorByTeam=v end})
    ChamsBox:AddToggle("CHColorByRole", {Text="Color by role", Default=cfg.CH_ColorByRole, Callback=function(v) cfg.CH_ColorByRole=v end})
    ChamsBox:AddToggle("CHThroughWalls", {Text="Through walls", Default=cfg.CH_ThroughWalls, Callback=function(v) cfg.CH_ThroughWalls=v; for _,h in pairs(highlights) do h.DepthMode = v and Enum.HighlightDepthMode.AlwaysOnTop or Enum.HighlightDepthMode.Occluded end end})
    ChamsBox:AddToggle("CHShowSelf", {Text="Show self", Default=cfg.CH_ShowSelf, Callback=function(v) cfg.CH_ShowSelf=v; refreshAll() end})
    ChamsBox:AddToggle("CHPulse", {Text="Pulse", Default=cfg.CH_Pulse, Callback=function(v) cfg.CH_Pulse=v end})
    ChamsBox:AddSlider("CHFillT", {Text="Fill transparency", Default=cfg.CH_FillTransparency, Min=0, Max=1, Rounding=2, Callback=function(v) cfg.CH_FillTransparency=v end})
    ChamsBox:AddSlider("CHOutT", {Text="Outline transparency", Default=cfg.CH_OutlineTransparency, Min=0, Max=1, Rounding=2, Callback=function(v) cfg.CH_OutlineTransparency=v; for _,h in pairs(highlights) do h.OutlineTransparency=v end end})
    ChamsBox:AddLabel("Fallback color"):AddColorPicker("CHColor", {Default=cfg.CH_Color, Title="Cham color", Callback=function(c) cfg.CH_Color=c end})

    local EffBox = Tabs.Visuals:AddRightGroupbox(T("gb_effects"))
    EffBox:AddDivider()
    EffBox:AddDivider()
    EffBox:AddToggle("TLEnabled", {Text="Lock ring", Default=cfg.TL_Enabled, Callback=function(v) cfg.TL_Enabled=v end})
    EffBox:AddSlider("TLRadius", {Text="Lock ring radius", Default=cfg.TL_Radius, Min=6, Max=40, Rounding=0, Callback=function(v) cfg.TL_Radius=v end})
    EffBox:AddLabel("Lock ring color"):AddColorPicker("TLColor", {Default=cfg.TL_Color, Title="Lock ring color", Callback=function(c) cfg.TL_Color=c end})
    EffBox:AddDivider()
    EffBox:AddSlider("BLI", {Text="Bloom intensity", Default=cfg.BL_Intensity, Min=0, Max=5, Rounding=2, Callback=function(v) cfg.BL_Intensity=v; if bloom then bloom.Intensity=v end end})
    EffBox:AddSlider("BLT", {Text="Bloom threshold", Default=cfg.BL_Threshold, Min=0, Max=5, Rounding=2, Callback=function(v) cfg.BL_Threshold=v; if bloom then bloom.Threshold=v end end})

    local ToolBox = Tabs.Esp:AddLeftGroupbox(T("gb_toolesp"))
    ToolBox:AddToggle("TEEnabled", {Text="Enabled", Default=cfg.TE_Enabled, Callback=function(v) cfg.TE_Enabled=v; if v then refreshAll() else for _,p in ipairs(Players:GetPlayers()) do clearToolFor(p) end end end})
    ToolBox:AddToggle("TEShowRole", {Text="Show role", Default=cfg.TE_ShowRole, Callback=function(v) cfg.TE_ShowRole=v end})
    ToolBox:AddToggle("TEShowTeam", {Text="Show team", Default=cfg.TE_ShowTeam, Callback=function(v) cfg.TE_ShowTeam=v end})
    ToolBox:AddToggle("TEColorByRole", {Text="Color by role/team", Default=cfg.TE_ColorByRole, Callback=function(v) cfg.TE_ColorByRole=v end})
    ToolBox:AddToggle("TEDistance", {Text="Show distance", Default=cfg.TE_Distance, Callback=function(v) cfg.TE_Distance=v end})
    ToolBox:AddLabel("Text color"):AddColorPicker("TEColor", {Default=cfg.TE_Color, Title="Text color", Callback=function(c) cfg.TE_Color=c end})

    local HBBox = Tabs.Esp:AddRightGroupbox(T("gb_hitboxes"))
    HBBox:AddToggle("HBEnabled", {Text="Show hitboxes", Default=cfg.HB_Enabled, Callback=function(v) cfg.HB_Enabled=v; for _,p in ipairs(Players:GetPlayers()) do if p.Character then if v then applyHb(p.Character) else clearHbFor(p.Character) end end end end})
    HBBox:AddSlider("HBT", {Text="Transparency", Default=cfg.HB_Transparency, Min=0, Max=1, Rounding=2, Callback=function(v) cfg.HB_Transparency=v end})
    HBBox:AddLabel("Hitbox color"):AddColorPicker("HBColor", {Default=cfg.HB_Color, Title="Hitbox color", Callback=function(c) cfg.HB_Color=c end})

    local DropBox = Tabs.Esp:AddRightGroupbox(T("gb_dropped"))
    DropBox:AddToggle("DREnabled", {Text="Highlight dropped guns", Default=cfg.DR_Enabled, Callback=function(v) cfg.DR_Enabled=v; if not v then for t in pairs(droppedTracked) do clearDropped(t) end else scanDropped() end end})

    local WorldBox = Tabs.Gfx:AddLeftGroupbox(T("gb_world"))
    WorldBox:AddToggle("GFXL", {Text="Lighting overrides", Default=cfg.GFX_Lighting, Callback=function(v) cfg.GFX_Lighting=v; if v then gfxApplyLighting() else gfxRestoreLighting() end end})
    WorldBox:AddToggle("GFXSky", {Text="Galaxy skybox", Default=cfg.GFX_Skybox, Callback=function(v) cfg.GFX_Skybox=v; gfxApplySkybox() end})
    WorldBox:AddSlider("GFXClock", {Text="Clock time", Default=cfg.GFX_ClockTime, Min=0, Max=24, Rounding=1, Callback=function(v) cfg.GFX_ClockTime=v; if cfg.GFX_Lighting then Lighting.ClockTime=v end end})
    WorldBox:AddSlider("GFXBri", {Text="Brightness", Default=cfg.GFX_Brightness, Min=0, Max=8, Rounding=1, Callback=function(v) cfg.GFX_Brightness=v; if cfg.GFX_Lighting then Lighting.Brightness=v end end})
    WorldBox:AddSlider("GFXExp", {Text="Exposure", Default=cfg.GFX_Exposure, Min=-3, Max=3, Rounding=2, Callback=function(v) cfg.GFX_Exposure=v; if cfg.GFX_Lighting then Lighting.ExposureCompensation=v end end})
    WorldBox:AddSlider("GFXSpec", {Text="Specular", Default=cfg.GFX_SpecScale, Min=0, Max=1, Rounding=2, Callback=function(v) cfg.GFX_SpecScale=v; if cfg.GFX_Lighting then Lighting.EnvironmentSpecularScale=v end end})
    WorldBox:AddSlider("GFXDiff", {Text="Diffuse", Default=cfg.GFX_DiffScale, Min=0, Max=1, Rounding=2, Callback=function(v) cfg.GFX_DiffScale=v; if cfg.GFX_Lighting then Lighting.EnvironmentDiffuseScale=v end end})

    local PostBox = Tabs.Gfx:AddRightGroupbox(T("gb_postfx"))
    PostBox:AddToggle("GFXCC", {Text="Color correction", Default=cfg.GFX_CC, Callback=function(v) cfg.GFX_CC=v; gfxApplyEffects() end})
    PostBox:AddSlider("GFXSat", {Text="Saturation", Default=cfg.GFX_Saturation, Min=-1, Max=1, Rounding=2, Callback=function(v) cfg.GFX_Saturation=v; local e=Lighting:FindFirstChild("BD_GFX_CC"); if e then e.Saturation=v end end})
    PostBox:AddSlider("GFXCon", {Text="Contrast", Default=cfg.GFX_Contrast, Min=-1, Max=1, Rounding=2, Callback=function(v) cfg.GFX_Contrast=v; local e=Lighting:FindFirstChild("BD_GFX_CC"); if e then e.Contrast=v end end})
    PostBox:AddDivider()
    PostBox:AddToggle("GFXBloom", {Text="Bloom", Default=cfg.GFX_Bloom, Callback=function(v) cfg.GFX_Bloom=v; gfxApplyEffects() end})
    PostBox:AddSlider("GFXBloomI", {Text="Bloom intensity", Default=cfg.GFX_BloomIntensity, Min=0, Max=3, Rounding=2, Callback=function(v) cfg.GFX_BloomIntensity=v; local e=Lighting:FindFirstChild("BD_GFX_BLOOM"); if e then e.Intensity=v end end})
    PostBox:AddToggle("GFXSun", {Text="Sun rays", Default=cfg.GFX_SunRays, Callback=function(v) cfg.GFX_SunRays=v; gfxApplyEffects() end})
    PostBox:AddToggle("GFXDOF", {Text="Depth of field", Default=cfg.GFX_DOF, Callback=function(v) cfg.GFX_DOF=v; gfxApplyEffects() end})

    local WallBox = Tabs.Gfx:AddRightGroupbox(T("gb_wallhack"))
    WallBox:AddToggle("GFXXRay", {Text="X-ray walls (lag)", Default=cfg.GFX_XRay, Callback=function(v) cfg.GFX_XRay=v; gfxReapplyParts() end})
    WallBox:AddSlider("GFXXRayA", {Text="X-ray transparency", Default=cfg.GFX_XRayAmount, Min=0, Max=0.95, Rounding=2, Callback=function(v) cfg.GFX_XRayAmount=v; if cfg.GFX_XRay then gfxReapplyParts() end end})
    WallBox:AddSlider("GFXXRayMin", {Text="Min part size", Default=cfg.GFX_XRayMinSize, Min=1, Max=30, Rounding=0, Callback=function(v) cfg.GFX_XRayMinSize=v; if cfg.GFX_XRay then gfxReapplyParts() end end})
    WallBox:AddToggle("GFXShiny", {Text="Shiny parts (lag)", Default=cfg.GFX_Shiny, Callback=function(v) cfg.GFX_Shiny=v; gfxReapplyParts() end})
    WallBox:AddSlider("GFXShinyA", {Text="Reflectance", Default=cfg.GFX_ShinyAmount, Min=0, Max=1, Rounding=2, Callback=function(v) cfg.GFX_ShinyAmount=v; if cfg.GFX_Shiny then gfxReapplyParts() end end})
    WallBox:AddButton({Text="Rescan world", Func=function() gfxReapplyParts() end})

    local AABox = Tabs.Misc:AddLeftGroupbox(T("gb_antiaim"))
    AABox:AddToggle("AAEnabled", {Text="Enabled", Default=cfg.AA_Enabled, Callback=function(v) cfg.AA_Enabled=v end})
    AABox:AddDropdown("AAMode", {Values={"Spin","Backward","Jitter"}, Default=cfg.AA_Mode, Text="Mode", Callback=function(v) cfg.AA_Mode=v end})
    AABox:AddSlider("AASpeed", {Text="Spin speed", Default=cfg.AA_SpinSpeed, Min=60, Max=1800, Rounding=0, Callback=function(v) cfg.AA_SpinSpeed=v end})

    local WPBox = Tabs.Visuals:AddLeftGroupbox("WEAPON  ")
    WPBox:AddToggle("WPEnabled", {Text="Enabled", Default=cfg.WP_Enabled, Callback=function(v) cfg.WP_Enabled=v end})
    WPBox:AddSlider("WPT", {Text="Transparency", Default=cfg.WP_Transparency, Min=0, Max=1, Rounding=2, Callback=function(v) cfg.WP_Transparency=v end})
    WPBox:AddDropdown("WPMat", {Values={"None","Plastic","SmoothPlastic","Neon","Glass","Metal","DiamondPlate","Ice","ForceField","Wood","Concrete","Cobblestone","Foil","Granite","Slate","Sand","Fabric","Marble","Grass","Brick","Pebble"}, Default=cfg.WP_Material, Text="Material", Callback=function(v) cfg.WP_Material=v end})

    local SysBox = Tabs.Misc:AddRightGroupbox(T("gb_system"))
    SysBox:AddToggle("WMEnabled", {Text="Watermark", Default=cfg.WM_Enabled, Callback=function(v) cfg.WM_Enabled=v end})
    SysBox:AddDivider()
    SysBox:AddButton({Text=T("kill_button"), Func=function() getgenv()._bdhub.kill() end})
end

local function kill()
    if lmbConn then lmbConn:Disconnect() end
    if pulseConn then pulseConn:Disconnect() end
    if chamRefreshConn then chamRefreshConn:Disconnect() end
    if toolUpdateConn then toolUpdateConn:Disconnect() end
    if hbResizeConn then hbResizeConn:Disconnect() end
    if drawConn then drawConn:Disconnect() end
    if antiAimConn then antiAimConn:Disconnect() end
    if wpHeartbeat then wpHeartbeat:Disconnect() end
    wpRestoreAll()
    if descAddedConn then descAddedConn:Disconnect() end
    if descRemovedConn then descRemovedConn:Disconnect() end
    if dropRescanConn then dropRescanConn:Disconnect() end
    for tool in pairs(droppedTracked) do clearDropped(tool) end
    if gfxChildAddedConn then gfxChildAddedConn:Disconnect() end
    if gfxSkyWatcherConn then gfxSkyWatcherConn:Disconnect() end
    gfxRestoreParts()
    gfxRestoreLighting()
    gfxClearEffects()
    if paConn then paConn:Disconnect() end
    if prConn then prConn:Disconnect() end
    for _, c in pairs(charConns) do pcall(function() c:Disconnect() end) end
    charConns = {}
    if hookOk and origFireServer and typeof(hookfunction)=="function" then
        pcall(function() hookfunction(inflict.FireServer, origFireServer) end)
    end
    for _, p in ipairs(Players:GetPlayers()) do
        clearChamFor(p); clearToolFor(p)
        if p.Character then clearHbFor(p.Character) end
    end
    if bloom then pcall(function() bloom:Destroy() end) end
    if lockRing then pcall(function() lockRing:Remove() end) end
    if watermark then pcall(function() watermark:Remove() end) end
    if Library then pcall(function() Library:Unload() end) end
    getgenv()._bdhub = nil
end

getgenv()._bdhub = { cfg=cfg, kill=kill, getTarget=getTarget, hookOk=hookOk, getLPRole=getLPRole, inferRole=inferRole, resetRoleCache=resetRoleCache }

描述

bdhub for blood debt. mostly just a silent aim and other things. uses LinoriaLib. **aim stuff** - silent aim (one toggle, does both lmb fire and the hook thing) - pick what to hit (head/torso/hrp) - pick how to score (crosshair, distance, lowest hp) - fov cone, wallcheck, only visible targets, dont shoot teammates - role/team filter so it skips your own side **visuals** - chams with adjustable transparency + outline - color by role (killer red, vig blue etc) or team - weapon material/transparency **esp** - floating labels above heads (name, role/team, weapon, distance) - hitboxes per limb if you want - highlights dropped killer/vig guns on the ground so you can grab them **graphics** - lighting, bloom, color, sunrays - custom skybox (galaxy) - xray + shiny(Wow) **misc** - antiaim - watermark - kill button **tuff features** - detects round restarts and refreshes roles automatically - shows team names in team modes. how to use: 1. execute 2. ui opens by itself, leftshift to hide 3. turn on silent aim 4. hold a real weapon (not hands) and play needs hookfunction + drawing api. blood debt only MIT License

評論 (0)

登入以參與討論

  • 成為第一個評論的人。

常見問題

如何使用 Blood debt hub [OPEN SOURCE SILENT-AIM] 腳本?
複製上方的腳本程式碼,開啟你的 Roblox 執行器,貼上程式碼,然後在遊戲中點擊執行。腳本執行後功能會立即啟用。
Blood debt hub [OPEN SOURCE SILENT-AIM] 腳本免費嗎?
是的。此腳本免費複製和使用。如果使用金鑰系統,請透過「獲取金鑰」連結免費解鎖。
使用 Blood debt hub [OPEN SOURCE SILENT-AIM] 腳本安全嗎?
完整原始碼顯示在此頁面上,讓你在執行前準確了解其功能。請始終使用可信的執行器,並記住使用腳本違反 Roblox 服務條款,風險自負。
哪個執行器相容 Blood debt hub [OPEN SOURCE SILENT-AIM]?
此腳本相容大多數熱門 Roblox 執行器。查看我們的執行器頁面,為你的裝置找到可信的免費或付費執行器。
Blood debt hub [OPEN SOURCE SILENT-AIM] | BloxScripter