
Key Required

local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local RunService = game:GetService("RunService")
local TweenService = game:GetService("TweenService")
local TeleportService = game:GetService("TeleportService")
local HttpService = game:GetService("HttpService")
local UserInputService = game:GetService("UserInputService")
local PathfindingService = game:GetService("PathfindingService")
local Player = Players.LocalPlayer
local Mouse = Player:GetMouse()
local Library = loadstring(game:HttpGet("https://raw.githubusercontent.com/ValoranterDev/Obs0/refs/heads/main/Library.lua"))()
local repoForAddons = "https://raw.githubusercontent.com/deividcomsono/Obsidian/main/"
local ThemeManager = loadstring(game:HttpGet(repoForAddons .. "addons/ThemeManager.lua"))()
local SaveManager = loadstring(game:HttpGet(repoForAddons .. "addons/SaveManager.lua"))()
local Options = Library.Options
local Toggles = Library.Toggles
Library.ForceCheckbox = false
Library.ShowToggleFrameInKeybinds = true
local UI = {}
local Logic = {
TIME_WINDOW = 2,
LastFiredTick = 0,
TargetAnimations = {
["100962226150441"] = true,
["95852624447551"] = true,
["74145636023952"] = true,
["123171106092050"] = true
},
DashAnimLeft = Instance.new("Animation"),
DashAnimRight = Instance.new("Animation"),
DashAssistState = {
Enabled = false,
CameraLock = false,
OnlyIfFacing = false,
DetectionRange = 60,
BehindDistance = 5,
FlightDuration = 0.42,
CurveStrength = 10,
ArchHeight = 3,
LockDuration = 0.35,
},
Pathfinding = {
Active = false,
Speed = 350,
VisualizeOn = true,
CurrentTween = nil,
VisualParts = {},
VisualFolder = nil,
},
TargetRemote = nil,
ESPObjects = {},
Connections = {},
ServerMap = {},
ShadowColor = Color3.fromRGB(0, 0, 0),
CooldownGradient = ColorSequence.new({
ColorSequenceKeypoint.new(0, Color3.fromRGB(20, 255, 255)),
ColorSequenceKeypoint.new(1, Color3.fromRGB(20, 177, 255))
}),
R15Bones = {
{"Head","UpperTorso"}, {"UpperTorso","LowerTorso"},
{"UpperTorso","LeftUpperArm"}, {"LeftUpperArm","LeftLowerArm"}, {"LeftLowerArm","LeftHand"},
{"UpperTorso","RightUpperArm"}, {"RightUpperArm","RightLowerArm"},{"RightLowerArm","RightHand"},
{"LowerTorso","LeftUpperLeg"}, {"LeftUpperLeg","LeftLowerLeg"}, {"LeftLowerLeg","LeftFoot"},
{"LowerTorso","RightUpperLeg"}, {"RightUpperLeg","RightLowerLeg"},{"RightLowerLeg","RightFoot"},
},
R6Bones = {
{"Head","Torso"}, {"Torso","Left Arm"}, {"Torso","Right Arm"},
{"Torso","Left Leg"}, {"Torso","Right Leg"},
},
LockSettings = {
ESPEnabled = false,
Sticky = false,
Method = "Camera",
TargetMode = "Closest",
TargetPart = "HumanoidRootPart",
Smoothness = 0,
SideOffset = 1.75,
MaxDistance = 500,
WallCheck = false,
ShowFOV = false,
FOVRadius = 200,
FOVFilled = false,
FOVTransparency = 0.8,
FOVSides = 60,
Prediction = 0,
SelectedPlayer = "Auto",
ShowTargetInfo = false,
LockNotification = true,
AutoRetarget = false,
TargetInfoPos = "Top",
},
LockState = {
Enabled = false,
LastTargetSearch = 0,
WasLockedBody = false,
ZoomDistance = 10,
CurrentLockTarget = nil,
CameraLocked = false,
OrigCamType = Enum.CameraType.Custom,
LockBodyGyro = nil,
ESPGui = nil,
FOVCircle = nil,
TargetInfoName = nil,
TargetInfoHP = nil,
TargetInfoDist = nil,
TargetInfoLine = nil,
LastTargetName = nil,
}
}
UI.Window = Library:CreateWindow({
Title = "Razorbill",
Center = true,
AutoShow = true,
Resizable = true,
Icon = 133671154311695,
NotifySide = "Right",
ShowCustomCursor = true,
TabSwipeOffset = 30,
Size = UDim2.new(0, 650, 0, 410),
})
UI.Tabs = {
Main = UI.Window:AddTab("Blackflash Chain", "zap", "Combat Modules"),
Visuals = UI.Window:AddTab("Visuals", "eye", "ESP and Visuals"),
Lock = UI.Window:AddTab("Lock", "crosshair", "Target Locking"),
Teleports = UI.Window:AddTab("Teleports", "map", "Travel"),
SideDash = UI.Window:AddTab("Side Dash", "move-horizontal", "Side Dash Assist"),
Servers = UI.Window:AddTab("Servers", "globe", "Server Browser"),
UISettings = UI.Window:AddTab("UI Settings", "settings", "Configure UI and visuals"),
}
UI.CombatGroup = UI.Tabs.Main:AddLeftGroupbox("Black Flash Chain", "swords")
UI.CombatGroup:AddToggle("BlackFlashEnabled", {
Text = "Enable Black Flash Chain",
Default = false,
Tooltip = "Automatically target and dash behind enemies when using Divergent Fist."
})
UI.CombatGroup:AddToggle("CameraLockEnabled", {
Text = "Camera Lock During Dash",
Default = true,
Tooltip = "Forces your camera to lock onto the enemy's back while dashing."
})
UI.CombatGroup:AddSlider("DashDistance", {
Text = "Max Dash Distance",
Default = 15,
Min = 5,
Max = 50,
Rounding = 0,
})
UI.CombatGroup:AddSlider("FireDelay", {
Text = "Combo Fire Delay (s)",
Default = 0.25,
Min = 0.1,
Max = 1.0,
Rounding = 2,
})
UI.CombatGroup:AddSlider("DashDuration", {
Text = "Dash Duration (s)",
Default = 0.35,
Min = 0.1,
Max = 1.0,
Rounding = 2,
})
UI.CombatGroup:AddSlider("LockTime", {
Text = "post Dash Lock Time",
Default = 0.1,
Min = 0.0,
Max = 0.5,
Rounding = 2,
})
UI.CombatGroup:AddDropdown("DashEasingStyle", {
Values = {"Linear", "Sine", "Quad", "Cubic", "Quart", "Quint", "Expo", "Circ", "Elastic", "Back", "Bounce"},
Default = "Cubic",
Multi = false,
Text = "Dash Easing Style",
Tooltip = "Changes the momentum curve of the dash."
})
UI.CombatGroup:AddDropdown("DashEasingDirection", {
Values = {"In", "Out", "InOut"},
Default = "Out",
Multi = false,
Text = "Dash Easing Direction",
Tooltip = "In = Fast at end. Out = Fast at start. InOut = Fast in middle."
})
UI.ESPBoxGrp = UI.Tabs.Visuals:AddLeftGroupbox("ESP Overlays")
UI.ESPBoxGrp:AddToggle("ESPBox", { Text = "Box ESP", Default = false })
:AddColorPicker("ESPBoxColor", { Default = Color3.fromRGB(255, 65, 65), Title = "Box Color" })
UI.ESPBoxGrp:AddToggle("ESPCorner", { Text = "Corner ESP", Default = false })
:AddColorPicker("ESPCornerColor", { Default = Color3.fromRGB(0, 255, 255), Title = "Corner Color" })
UI.ESPBoxGrp:AddToggle("ESPOutline", { Text = "Outline ESP", Default = false })
:AddColorPicker("ESPOutlineColor", { Default = Color3.fromRGB(255, 255, 255), Title = "Outline Color" })
UI.ESPBoxGrp:AddToggle("ESPSkeleton", { Text = "Skeleton ESP", Default = false })
:AddColorPicker("ESPSkeletonColor", { Default = Color3.fromRGB(190, 90, 255), Title = "Skeleton Color" })
UI.ESPBoxGrp:AddToggle("ESPHeadDot", { Text = "Head Dot", Default = false })
:AddColorPicker("ESPHeadDotColor", { Default = Color3.fromRGB(255, 255, 0), Title = "Head Dot Color" })
UI.ESPBoxGrp:AddToggle("ESPTracer", { Text = "Tracer ESP", Default = false })
:AddColorPicker("ESPTracerColor", { Default = Color3.fromRGB(85, 255, 85), Title = "Tracer Color" })
UI.ESPInfoGrp = UI.Tabs.Visuals:AddRightGroupbox("ESP Information")
UI.ESPInfoGrp:AddToggle("ESPName", { Text = "Name ESP", Default = false })
:AddColorPicker("ESPNameColor", { Default = Color3.fromRGB(255, 255, 255), Title = "Name Color" })
UI.ESPInfoGrp:AddToggle("ESPCharacter", { Text = "Character Moveset ESP", Default = false })
:AddColorPicker("ESPCharacterColor", { Default = Color3.fromRGB(180, 200, 255), Title = "Character Color" })
UI.ESPInfoGrp:AddToggle("ESPDistance", { Text = "Distance ESP", Default = false })
:AddColorPicker("ESPDistanceColor", { Default = Color3.fromRGB(120, 200, 255), Title = "Distance Color" })
UI.ESPInfoGrp:AddToggle("ESPKill", { Text = "Kill ESP", Default = false })
:AddColorPicker("ESPKillColor", { Default = Color3.fromRGB(255, 170, 0), Title = "Kill Color" })
UI.ESPInfoGrp:AddToggle("ESPHPText", { Text = "HP Text", Default = false, Tooltip = "Shows actual Health values" })
UI.ESPInfoGrp:AddToggle("ESPHPBar", { Text = "HP Bar", Default = false, Tooltip = "Shows a graphical Health bar" })
UI.ESPInfoGrp:AddDivider()
UI.ESPInfoGrp:AddToggle("CooldownRevealer", { Text = "Cooldown Revealer", Default = false, Tooltip = "Shows enemy moveset cooldowns, ultimate, and evasive." })
UI.LockGroup = UI.Tabs.Lock:AddLeftGroupbox("Target Lock", "crosshair")
UI.LockConfigGroup = UI.Tabs.Lock:AddRightGroupbox("Configuration", "settings")
UI.LockGroup:AddToggle("EnableLock", {
Text = "Enable Lock",
Default = Logic.LockState.Enabled,
Callback = function(state)
Logic.LockState.Enabled = state
if Logic.LockSettings.LockNotification then
if state then
Library:Notify({ Title = "Target Lock", Description = "Lock ENABLED - searching for targets...", Time = 2 })
else
if Logic.LockState.LastTargetName then
Library:Notify({ Title = "Target Lock", Description = "Unlocked from " .. tostring(Logic.LockState.LastTargetName), Time = 2 })
else
Library:Notify({ Title = "Target Lock", Description = "Lock DISABLED", Time = 2 })
end
Logic.LockState.LastTargetName = nil
end
end
end
}):AddKeyPicker("LockKeybind", {
Default = "C",
SyncToggleState = true,
Mode = "Toggle",
Text = "Lock Keybind",
NoUI = false
})
Options.LockKeybind:OnClick(function()
Toggles.EnableLock:SetValue(Options.LockKeybind:GetState())
end)
UI.LockGroup:AddToggle("LockESP", {
Text = "Lock ESP",
Default = Logic.LockSettings.ESPEnabled,
Callback = function(state) Logic.LockSettings.ESPEnabled = state end
})
UI.LockGroup:AddDivider()
UI.LockGroup:AddDropdown("LockSpecificPlayer", {
Values = {"Auto"},
Default = 1,
Multi = false,
Text = "Target Player",
Searchable = true,
Tooltip = "Lock onto a specific player only, or Auto for normal targeting.",
Callback = function(val)
Logic.LockSettings.SelectedPlayer = val
if val ~= "Auto" then
Logic.LockState.CurrentLockTarget = nil
Logic.LockState.LastTargetSearch = 0
end
end
})
UI.LockGroup:AddButton({
Text = "Refresh Player List",
Func = function()
local vals = {"Auto"}
local charsFolder = workspace:FindFirstChild("Characters")
for _, p in ipairs(Players:GetPlayers()) do
if p ~= Player then
table.insert(vals, p.Name)
end
end
if charsFolder then
for _, model in ipairs(charsFolder:GetChildren()) do
if model:IsA("Model") and not Players:GetPlayerFromCharacter(model) then
local hum = model:FindFirstChildOfClass("Humanoid")
if hum and hum.Health > 0 then
local npcName = "[NPC] " .. model.Name
if not table.find(vals, npcName) then
table.insert(vals, npcName)
end
end
end
end
end
Options.LockSpecificPlayer:SetValues(vals)
if not table.find(vals, Logic.LockSettings.SelectedPlayer) then
Logic.LockSettings.SelectedPlayer = "Auto"
Options.LockSpecificPlayer:SetValue("Auto")
end
Library:Notify({ Title = "Target Lock", Description = "Player list refreshed! Found " .. (#vals - 1) .. " targets.", Time = 2 })
end,
Tooltip = "Refresh the list of available players and NPCs",
})
UI.LockGroup:AddToggle("LockWallCheck", {
Text = "Wall Check",
Default = false,
Tooltip = "Won't lock onto targets behind walls/obstacles.",
Callback = function(state) Logic.LockSettings.WallCheck = state end
})
UI.LockGroup:AddToggle("LockAutoRetarget", {
Text = "Auto Retarget",
Default = false,
Tooltip = "Automatically find a new target when current one dies (different from Sticky).",
Callback = function(state) Logic.LockSettings.AutoRetarget = state end
})
UI.LockGroup:AddToggle("LockNotification", {
Text = "Lock Notifications",
Default = true,
Tooltip = "Show notifications when locking/unlocking targets.",
Callback = function(state) Logic.LockSettings.LockNotification = state end
})
UI.LockConfigGroup:AddDropdown("LockMethod", {
Values = {"Camera", "Body"},
Default = 1,
Multi = false,
Text = "Method",
Callback = function(val) Logic.LockSettings.Method = val end
})
UI.LockConfigGroup:AddDropdown("LockTargetMode", {
Values = {"Closest", "Closest to Mouse"},
Default = 1,
Multi = false,
Text = "Target Mode",
Callback = function(val) Logic.LockSettings.TargetMode = val end
})
UI.LockConfigGroup:AddDropdown("LockTargetPart", {
Values = {"Head", "HumanoidRootPart", "UpperTorso", "LowerTorso"},
Default = 2,
Multi = false,
Text = "Target Part",
Callback = function(val) Logic.LockSettings.TargetPart = val end
})
UI.LockConfigGroup:AddSlider("LockSmoothness", {
Text = "Smoothness",
Default = 0,
Min = 0,
Max = 20,
Rounding = 1,
Callback = function(val) Logic.LockSettings.Smoothness = val end
})
UI.LockConfigGroup:AddSlider("LockSideOffset", {
Text = "Camera Side Offset",
Default = 1.75,
Min = -8,
Max = 8,
Rounding = 2,
Callback = function(val) Logic.LockSettings.SideOffset = val end
})
UI.LockConfigGroup:AddDivider()
UI.LockConfigGroup:AddSlider("LockMaxDistance", {
Text = "Max Lock Distance",
Default = 500,
Min = 10,
Max = 2000,
Rounding = 0,
Tooltip = "Maximum distance to lock onto a target (studs).",
Callback = function(val) Logic.LockSettings.MaxDistance = val end
})
UI.LockConfigGroup:AddSlider("LockPrediction", {
Text = "Prediction",
Default = 0,
Min = 0,
Max = 1,
Rounding = 2,
Tooltip = "Predicts target movement for smoother tracking. 0 = off.",
Callback = function(val) Logic.LockSettings.Prediction = val end
})
UI.DashGroup = UI.Tabs.SideDash:AddLeftGroupbox("Side Dash Settings", "move")
UI.DashConfigGroup = UI.Tabs.SideDash:AddRightGroupbox("Arc Modifiers", "settings")
UI.DashGroup:AddToggle("EnableDashAssist", {
Text = "Enable Side Dash Assist",
Default = Logic.DashAssistState.Enabled,
Callback = function(val) Logic.DashAssistState.Enabled = val end
})
UI.DashGroup:AddToggle("DashCameraLock", {
Text = "Lock Camera On Enemy",
Default = Logic.DashAssistState.CameraLock,
Callback = function(val) Logic.DashAssistState.CameraLock = val end
})
UI.DashGroup:AddToggle("DashOnlyIfFacing", {
Text = "Dash Only If Facing Front",
Default = Logic.DashAssistState.OnlyIfFacing,
Callback = function(val) Logic.DashAssistState.OnlyIfFacing = val end
})
UI.DashGroup:AddLabel("Dash Keybind"):AddKeyPicker("DashAssistKeybind", {
Default = "J",
SyncToggleState = false,
Mode = "Toggle",
Text = "Dash Keybind",
NoUI = false
})
UI.DashGroup:AddSlider("DashDetectionRange", {
Text = "Detection Range",
Default = 15, Min = 1, Max = 50, Rounding = 0,
Callback = function(val) Logic.DashAssistState.DetectionRange = val end
})
UI.DashGroup:AddSlider("DashBehindDistance", {
Text = "Behind Distance",
Default = 5, Min = 1, Max = 15, Rounding = 1,
Callback = function(val) Logic.DashAssistState.BehindDistance = val end
})
UI.DashGroup:AddSlider("DashFlightDuration", {
Text = "Flight Duration",
Default = 0.42, Min = 0.1, Max = 1, Rounding = 2,
Callback = function(val) Logic.DashAssistState.FlightDuration = val end
})
UI.DashConfigGroup:AddSlider("DashCurveStrength", {
Text = "Curve Strength",
Default = 10, Min = 0, Max = 25, Rounding = 1,
Callback = function(val) Logic.DashAssistState.CurveStrength = val end
})
UI.DashConfigGroup:AddSlider("DashArchHeight", {
Text = "Arch Height",
Default = 3, Min = 0, Max = 10, Rounding = 1,
Callback = function(val) Logic.DashAssistState.ArchHeight = val end
})
UI.DashConfigGroup:AddSlider("DashLockDuration", {
Text = "Lock Duration",
Default = 0.35, Min = 0.1, Max = 1.5, Rounding = 2,
Callback = function(val) Logic.DashAssistState.LockDuration = val end
})
local TeleportLocations = {
["Under the Map"] = Vector3.new(-20.23, -61.53, -146.34),
["Unlicensed Studios"] = Vector3.new(196.86, 23.58, -37.27),
["Towers"] = Vector3.new(25.35, 183.08, 110.77),
["Train Button"] = Vector3.new(182.21, -9.33, 562.54),
["Bowling"] = Vector3.new(267.60, -59.89, -255.06),
["Restaurant"] = Vector3.new(-43.24, 23.63, -83.07),
["Storage House"] = Vector3.new(195.69, 23.58, 151.44),
["Sewers 1"] = Vector3.new(-148.14, -31.48, -127.22),
["Train Station"] = Vector3.new(185.27, -9.69, -97.17),
["Sewers 2"] = Vector3.new(60.84, -10.58, 167.47),
["Shenanigans Mall"] = Vector3.new(155.66, -26.38, -254.85),
["Rhythm Game"] = Vector3.new(12.23, -30.21, -315.03),
["Piano"] = Vector3.new(-86.38, 26.65, -252.48),
["Convenience Store"] = Vector3.new(-247.51, 26.96, -116.64),
["Court"] = Vector3.new(124.48, 23.78, -247.06),
["Graveyard"] = Vector3.new(228.55, 23.68, -130.48),
["Train Station Exit"] = Vector3.new(1.52, 24.72, 396.06),
["Tze's"] = Vector3.new(-55.30, 23.62, 245.42),
["Jail"] = Vector3.new(-243.84, 23.58, 126.97),
}
local LocationNames = {}
for k, _ in pairs(TeleportLocations) do table.insert(LocationNames, k) end
table.sort(LocationNames)
_G.MiscState = _G.MiscState or {}
local Invisibility = { Connections = {} }
function Invisibility.toggle(state, silent)
local char = Player.Character
if not char then return end
local hum = char:FindFirstChildOfClass("Humanoid")
local hrp = char:FindFirstChild("HumanoidRootPart")
local animator = hum and hum:FindFirstChildOfClass("Animator")
if not (hum and hrp and animator) then return end
local Camera = workspace.CurrentCamera
if state then
_G.MiscState.IsInvisible = true
if not silent then
hum.AutoRotate = false
hrp.Anchored = true
end
Invisibility.Connections["InvisNoclip"] = RunService.Stepped:Connect(function()
if not _G.MiscState.IsInvisible then return end
for _, part in ipairs(char:GetDescendants()) do
if part:IsA("BasePart") then part.CanCollide = false end
end
end)
_G.MiscState.InvisibleFakeTorso = Instance.new("Part")
_G.MiscState.InvisibleFakeTorso.Name = "FakeTorso"
_G.MiscState.InvisibleFakeTorso.Size = Vector3.new(2,2,1)
_G.MiscState.InvisibleFakeTorso.Transparency = 1
_G.MiscState.InvisibleFakeTorso.CanCollide = false
_G.MiscState.InvisibleFakeTorso.Anchored = true
_G.MiscState.InvisibleFakeTorso.Parent = workspace
Camera.CameraType = Enum.CameraType.Custom
Camera.CameraSubject = _G.MiscState.InvisibleFakeTorso
if not silent then
RunService:BindToRenderStep("MeditationFocus", Enum.RenderPriority.Camera.Value - 1, function()
if not _G.MiscState.IsInvisible or not hrp or not hrp.Parent or not _G.MiscState.InvisibleFakeTorso then return end
local camCF = Camera.CFrame
local lookDir = Vector3.new(camCF.LookVector.X, 0, camCF.LookVector.Z)
if lookDir.Magnitude > 0.001 then
hrp.CFrame = CFrame.new(hrp.Position, hrp.Position + lookDir.Unit)
end
_G.MiscState.InvisibleFakeTorso.CFrame = CFrame.new(hrp.Position + Vector3.new(0, 1.5, 0))
end)
end
pcall(function()
local animObj = ReplicatedStorage.Modules.MVP.Meditation.Character
_G.MiscState.InvisibleTrack = animator:LoadAnimation(animObj)
_G.MiscState.InvisibleTrack.Priority = Enum.AnimationPriority.Action4
_G.MiscState.InvisibleTrack:Play()
task.wait(0.1)
_G.MiscState.InvisibleTrack.TimePosition = 0.1
_G.MiscState.InvisibleTrack:AdjustSpeed(0)
for _, t in ipairs(animator:GetPlayingAnimationTracks()) do
if t ~= _G.MiscState.InvisibleTrack then t:Stop(0) end
end
Invisibility.Connections["InvisAnim"] = animator.AnimationPlayed:Connect(function(newTrack)
if newTrack ~= _G.MiscState.InvisibleTrack then newTrack:Stop(0) end
end)
end)
Library:Notify({ Title = "Invisibility", Description = "Invisibility Enabled", Time = 2 })
else
_G.MiscState.IsInvisible = false
if Invisibility.Connections["InvisNoclip"] then
Invisibility.Connections["InvisNoclip"]:Disconnect()
Invisibility.Connections["InvisNoclip"] = nil
end
if Invisibility.Connections["InvisAnim"] then
Invisibility.Connections["InvisAnim"]:Disconnect()
Invisibility.Connections["InvisAnim"] = nil
end
pcall(function() RunService:UnbindFromRenderStep("MeditationFocus") end)
if char and char.Parent then
for _, part in ipairs(char:GetDescendants()) do
if part:IsA("BasePart") then part.CanCollide = true end
end
end
if hrp and hrp.Parent then hrp.Anchored = false end
if hum and hum.Parent then hum.AutoRotate = true; Camera.CameraSubject = hum end
if _G.MiscState.InvisibleFakeTorso then
_G.MiscState.InvisibleFakeTorso:Destroy()
_G.MiscState.InvisibleFakeTorso = nil
end
if _G.MiscState.InvisibleTrack then
pcall(function() _G.MiscState.InvisibleTrack:Stop(0) end)
pcall(function() _G.MiscState.InvisibleTrack:Destroy() end)
_G.MiscState.InvisibleTrack = nil
end
Library:Notify({ Title = "Invisibility", Description = "Invisibility Disabled", Time = 2 })
end
end
local function getWaypointSpacing(speed)
if speed <= 30 then return 4
elseif speed <= 100 then return 6
elseif speed <= 300 then return 10
elseif speed <= 600 then return 16
else return 24 end
end
local function clearPathVisualization()
for _, p in ipairs(Logic.Pathfinding.VisualParts) do pcall(function() p:Destroy() end) end
Logic.Pathfinding.VisualParts = {}
if Logic.Pathfinding.VisualFolder and Logic.Pathfinding.VisualFolder.Parent then
Logic.Pathfinding.VisualFolder:Destroy()
end
Logic.Pathfinding.VisualFolder = nil
end
local function visualizePath(waypoints)
clearPathVisualization()
if not Logic.Pathfinding.VisualizeOn then return end
local folder = Instance.new("Folder")
folder.Name = "PathVisuals"
folder.Parent = workspace
Logic.Pathfinding.VisualFolder = folder
for i, wp in ipairs(waypoints) do
local isJump = (wp.Action == Enum.PathWaypointAction.Jump)
local node = Instance.new("Part")
node.Shape = Enum.PartType.Ball
node.Size = isJump and Vector3.new(1.4, 1.4, 1.4) or Vector3.new(0.9, 0.9, 0.9)
node.Position = wp.Position
node.Anchored = true
node.CanCollide = false
node.Material = Enum.Material.Neon
node.Transparency = 0.25
node.Color = isJump and Color3.fromRGB(255, 180, 30) or Color3.fromRGB(30, 180, 255)
node.Parent = folder
table.insert(Logic.Pathfinding.VisualParts, node)
if i > 1 then
local prevPos = waypoints[i - 1].Position
local currPos = wp.Position
local mid = (prevPos + currPos) / 2
local dist = (currPos - prevPos).Magnitude
local line = Instance.new("Part")
line.Anchored = true
line.CanCollide = false
line.Material = Enum.Material.Neon
line.Color = Color3.fromRGB(50, 100, 255)
line.Transparency = 0.55
line.Size = Vector3.new(0.22, 0.22, dist)
line.CFrame = CFrame.lookAt(mid, currPos)
line.Parent = folder
table.insert(Logic.Pathfinding.VisualParts, line)
end
end
end
local function batchWaypoints(waypoints, minSegmentLength)
local batched = {}
local lastAdded = waypoints[1]
table.insert(batched, waypoints[1])
for i = 2, #waypoints do
local wp = waypoints[i]
local isJump = (wp.Action == Enum.PathWaypointAction.Jump)
local isLast = (i == #waypoints)
local distFromLast = (wp.Position - lastAdded.Position).Magnitude
if isJump or isLast or distFromLast >= minSegmentLength then
table.insert(batched, wp)
lastAdded = wp
end
end
return batched
end
local function tweenToPosition(hrp, targetPos, speed)
local distance = (hrp.Position - targetPos).Magnitude
if distance < 0.5 then return true end
local duration = math.max(distance / speed, 0.001)
local direction = (targetPos - hrp.Position)
local flatDir = Vector3.new(direction.X, 0, direction.Z)
local targetCF = flatDir.Magnitude > 0.1 and CFrame.new(targetPos, targetPos + flatDir.Unit) or CFrame.new(targetPos) * hrp.CFrame.Rotation
local tween = TweenService:Create(hrp, TweenInfo.new(duration, Enum.EasingStyle.Linear), { CFrame = targetCF })
Logic.Pathfinding.CurrentTween = tween
tween:Play()
local done = false
local conn
conn = tween.Completed:Connect(function()
done = true
if conn then conn:Disconnect() end
end)
while not done and Logic.Pathfinding.Active do RunService.Heartbeat:Wait() end
if not done and Logic.Pathfinding.CurrentTween == tween then tween:Cancel() end
return done and Logic.Pathfinding.Active
end
local function stepToPosition(hrp, targetPos, speed)
local startPos = hrp.Position
local direction = (targetPos - startPos)
local distance = direction.Magnitude
if distance < 0.5 then return true end
local dirUnit = direction.Unit
local flatDir = Vector3.new(dirUnit.X, 0, dirUnit.Z)
local lookCF = flatDir.Magnitude > 0.01 and CFrame.lookAt(Vector3.zero, flatDir) or CFrame.new()
local traveled = 0
while traveled < distance and Logic.Pathfinding.Active do
local dt = RunService.Heartbeat:Wait()
local step = speed * dt
traveled = math.min(traveled + step, distance)
hrp.CFrame = CFrame.new(startPos + dirUnit * traveled) * lookCF.Rotation
end
return traveled >= distance and Logic.Pathfinding.Active
end
local function stopPathfinding()
Logic.Pathfinding.Active = false
if _G.MiscState and _G.MiscState.IsInvisible then Invisibility.toggle(false, false) end
if Logic.Pathfinding.CurrentTween then pcall(function() Logic.Pathfinding.CurrentTween:Cancel() end) end
local hrp = Player.Character and Player.Character:FindFirstChild("HumanoidRootPart")
if hrp then hrp.Anchored = false end
local hum = Player.Character and Player.Character:FindFirstChildOfClass("Humanoid")
if hum then hum.PlatformStand = false end
clearPathVisualization()
end
local function startPathfinding(targetPos)
if Logic.Pathfinding.Active then stopPathfinding(); task.wait(0.15) end
Logic.Pathfinding.Active = true
task.spawn(function()
while Logic.Pathfinding.Active do
local speed = Logic.Pathfinding.Speed
local agentParams = { AgentRadius = 3, AgentHeight = 6, AgentCanJump = true, AgentCanClimb = true, WaypointSpacing = getWaypointSpacing(speed) }
local path = PathfindingService:CreatePath(agentParams)
local hrp = Player.Character and Player.Character:FindFirstChild("HumanoidRootPart")
local humanoid = Player.Character and Player.Character:FindFirstChildOfClass("Humanoid")
if not hrp or not humanoid then task.wait(1) continue end
if (hrp.Position - targetPos).Magnitude < 6 then
Library:Notify({ Title = "Teleport", Description = "Destination reached!", Time = 3 })
stopPathfinding()
break
end
local ok, _ = pcall(function() path:ComputeAsync(hrp.Position, targetPos) end)
if not ok or path.Status == Enum.PathStatus.NoPath then
Library:Notify({ Title = "Teleport", Description = "No path found! Retrying...", Time = 2 })
task.wait(1.5)
continue
end
local batchedWP = batchWaypoints(path:GetWaypoints(), math.max(speed * 0.05, 2))
visualizePath(path:GetWaypoints())
local pathBlocked = false
local blockedConn = path.Blocked:Connect(function() pathBlocked = true end)
hrp.Anchored = true
humanoid.PlatformStand = true
local completed = true
for i = 2, #batchedWP do
if not Logic.Pathfinding.Active or pathBlocked then completed = false break end
local success
if Logic.Pathfinding.Speed > 500 then
success = stepToPosition(hrp, batchedWP[i].Position, Logic.Pathfinding.Speed)
else
success = tweenToPosition(hrp, batchedWP[i].Position, Logic.Pathfinding.Speed)
end
if not success then completed = false break end
end
if blockedConn then blockedConn:Disconnect() end
if completed and Logic.Pathfinding.Active then
Library:Notify({ Title = "Teleport", Description = "Destination reached!", Time = 3 })
stopPathfinding()
break
end
task.wait(0.3)
end
end)
end
UI.TeleportGroup = UI.Tabs.Teleports:AddLeftGroupbox("Auto Teleport Settings", "map")
UI.TeleportGroup:AddDropdown("TeleportDestination", {
Values = LocationNames,
Default = 1,
Multi = false,
Text = "Destination",
Searchable = true,
})
UI.TeleportGroup:AddDropdown("TeleportMode", {
Values = {"Tween", "Tween + Invis"},
Default = 1,
Multi = false,
Text = "Teleport Method",
})
UI.TeleportGroup:AddSlider("TeleportSpeed", {
Text = "Teleport Speed (Studs/s)",
Default = 350, Min = 30, Max = 1500, Rounding = 0,
Callback = function(val) Logic.Pathfinding.Speed = val end
})
UI.TeleportGroup:AddToggle("TeleportVisualize", {
Text = "Show Path Visualization",
Default = true,
Callback = function(val) Logic.Pathfinding.VisualizeOn = val end
})
UI.TeleportGroup:AddDivider()
UI.TeleportGroup:AddButton({
Text = "Start Teleport",
Func = function()
local destName = Options.TeleportDestination.Value
local destPos = TeleportLocations[destName]
if destPos then
if Options.TeleportMode.Value == "Tween + Invis" then Invisibility.toggle(true, false) end
Library:Notify({ Title = "Teleport", Description = "Pathfinding to " .. destName .. "...", Time = 2 })
startPathfinding(destPos)
end
end
})
UI.TeleportGroup:AddButton({
Text = "Stop Teleport",
Func = function()
stopPathfinding()
Library:Notify({ Title = "Teleport", Description = "Teleport manually stopped.", Time = 2 })
end
})
task.spawn(function()
local circle = Drawing.new("Circle")
circle.Visible = false
circle.Thickness = 1.5
circle.NumSides = 60
circle.Filled = false
circle.Transparency = 0.2
circle.Color = Color3.fromRGB(255, 255, 255)
circle.Radius = 200
Logic.LockState.FOVCircle = circle
end)
task.spawn(function()
local nameText = Drawing.new("Text")
nameText.Visible = false
nameText.Size = 18
nameText.Center = true
nameText.Outline = true
nameText.OutlineColor = Color3.new(0, 0, 0)
nameText.Font = 2
nameText.Color = Color3.fromRGB(255, 255, 255)
Logic.LockState.TargetInfoName = nameText
local hpText = Drawing.new("Text")
hpText.Visible = false
hpText.Size = 15
hpText.Center = true
hpText.Outline = true
hpText.OutlineColor = Color3.new(0, 0, 0)
hpText.Font = 2
Logic.LockState.TargetInfoHP = hpText
local distText = Drawing.new("Text")
distText.Visible = false
distText.Size = 14
distText.Center = true
distText.Outline = true
distText.OutlineColor = Color3.new(0, 0, 0)
distText.Font = 2
Logic.LockState.TargetInfoDist = distText
local sepLine = Drawing.new("Line")
sepLine.Visible = false
sepLine.Thickness = 1
sepLine.Color = Color3.fromRGB(255, 255, 255)
sepLine.Transparency = 0.5
Logic.LockState.TargetInfoLine = sepLine
end)
task.spawn(function()
if Logic.LockState.ESPGui then pcall(function() Logic.LockState.ESPGui:Destroy() end) end
local lockEspGui = Instance.new("BillboardGui")
lockEspGui.Name = "RazorbillLockESP"
lockEspGui.Size = UDim2.new(0, 150, 0, 150)
lockEspGui.AlwaysOnTop = true
lockEspGui.LightInfluence = 0
lockEspGui.Enabled = false
lockEspGui.Adornee = nil
local mainImg = Instance.new("ImageLabel")
mainImg.Name = "Main"
mainImg.BackgroundTransparency = 1
mainImg.Image = "rbxassetid://119160428107030"
mainImg.Size = UDim2.new(0, 110, 0, 110)
mainImg.Position = UDim2.new(0.5, 0, 0.5, 0)
mainImg.AnchorPoint = Vector2.new(0.5, 0.5)
mainImg.Parent = lockEspGui
local markerImg = Instance.new("ImageLabel")
markerImg.Name = "Marker"
markerImg.BackgroundTransparency = 1
markerImg.Image = "rbxassetid://85142373343991"
markerImg.Size = UDim2.new(0, 25, 0, 15)
markerImg.Position = UDim2.new(0.5, 0, -0.05, 0)
markerImg.AnchorPoint = Vector2.new(0.5, 0.5)
markerImg.Parent = lockEspGui
pcall(function()
local coreGui = game:GetService("CoreGui")
if coreGui then lockEspGui.Parent = coreGui else lockEspGui.Parent = Player:WaitForChild("PlayerGui") end
end)
if not lockEspGui.Parent then lockEspGui.Parent = Player:WaitForChild("PlayerGui") end
Logic.LockState.ESPGui = lockEspGui
end)
local function refreshPlayerDropdown()
local vals = {"Auto"}
local charsFolder = workspace:FindFirstChild("Characters")
for _, p in ipairs(Players:GetPlayers()) do
if p ~= Player then
table.insert(vals, p.Name)
end
end
if charsFolder then
for _, model in ipairs(charsFolder:GetChildren()) do
if model:IsA("Model") and not Players:GetPlayerFromCharacter(model) then
local hum = model:FindFirstChildOfClass("Humanoid")
if hum and hum.Health > 0 then
local npcName = "[NPC] " .. model.Name
if not table.find(vals, npcName) then
table.insert(vals, npcName)
end
end
end
end
end
pcall(function()
Options.LockSpecificPlayer:SetValues(vals)
if not table.find(vals, Logic.LockSettings.SelectedPlayer) then
Logic.LockSettings.SelectedPlayer = "Auto"
Options.LockSpecificPlayer:SetValue("Auto")
end
end)
end
Logic.Connections.PlayerAdded = Players.PlayerAdded:Connect(function()
task.wait(1)
refreshPlayerDropdown()
end)
Logic.Connections.PlayerRemoving = Players.PlayerRemoving:Connect(function(plr)
task.wait(0.5)
refreshPlayerDropdown()
if Logic.LockState.CurrentLockTarget then
local targetPlayer = Players:GetPlayerFromCharacter(Logic.LockState.CurrentLockTarget)
if targetPlayer == plr then
Logic.LockState.CurrentLockTarget = nil
Logic.LockState.LastTargetName = nil
if Logic.LockSettings.LockNotification then
Library:Notify({ Title = "Target Lock", Description = plr.Name .. " left the game. Target lost.", Time = 3 })
end
end
end
end)
task.spawn(function()
task.wait(1)
refreshPlayerDropdown()
end)
local function getLockTarget()
if tick() - Logic.LockState.LastTargetSearch < 0.5 then return nil end
Logic.LockState.LastTargetSearch = tick()
local char = Player.Character
if not char then return nil end
local root = char:FindFirstChild("HumanoidRootPart")
if not root then return nil end
if Logic.LockSettings.SelectedPlayer ~= "Auto" then
local selectedName = Logic.LockSettings.SelectedPlayer
local isNPC = string.sub(selectedName, 1, 6) == "[NPC] "
if isNPC then
local npcName = string.sub(selectedName, 7)
local charsFolder = workspace:FindFirstChild("Characters")
if charsFolder then
for _, model in ipairs(charsFolder:GetChildren()) do
if model.Name == npcName and model:IsA("Model") then
local tHum = model:FindFirstChildOfClass("Humanoid")
local tRoot = model:FindFirstChild("HumanoidRootPart") or model:FindFirstChild("Torso")
if tHum and tHum.Health > 0 and tRoot then
local dist = (root.Position - tRoot.Position).Magnitude
if dist <= Logic.LockSettings.MaxDistance then
if Logic.LockSettings.WallCheck then
local rayParams = RaycastParams.new()
rayParams.FilterDescendantsInstances = {char, model}
rayParams.FilterType = Enum.RaycastFilterType.Exclude
local ray = workspace:Raycast(root.Position, (tRoot.Position - root.Position).Unit * dist, rayParams)
if ray then return nil end
end
return model
end
end
end
end
end
return nil
else
local targetPlayer = Players:FindFirstChild(selectedName)
if targetPlayer and targetPlayer.Character then
local tChar = targetPlayer.Character
local tHum = tChar:FindFirstChildOfClass("Humanoid")
local tRoot = tChar:FindFirstChild("HumanoidRootPart") or tChar:FindFirstChild("Torso")
if tHum and tHum.Health > 0 and tRoot and tChar ~= char then
local dist = (root.Position - tRoot.Position).Magnitude
if dist <= Logic.LockSettings.MaxDistance then
if Logic.LockSettings.WallCheck then
local rayParams = RaycastParams.new()
rayParams.FilterDescendantsInstances = {char, tChar}
rayParams.FilterType = Enum.RaycastFilterType.Exclude
local ray = workspace:Raycast(root.Position, (tRoot.Position - root.Position).Unit * dist, rayParams)
if ray then return nil end
end
return tChar
end
end
end
return nil
end
end
local best, shortest = nil, math.huge
local charsFolder = workspace:FindFirstChild("Characters")
local entities = charsFolder and charsFolder:GetChildren() or {}
if #entities == 0 then
for _, p in ipairs(Players:GetPlayers()) do
if p.Character then table.insert(entities, p.Character) end
end
end
local Camera = workspace.CurrentCamera
for _, tChar in ipairs(entities) do
if tChar:IsA("Model") and tChar ~= char then
local tHum = tChar:FindFirstChildOfClass("Humanoid")
local tRoot = tChar:FindFirstChild("HumanoidRootPart") or tChar:FindFirstChild("Torso")
if tHum and tHum.Health > 0 and tRoot then
local worldDist = (root.Position - tRoot.Position).Magnitude
if worldDist > Logic.LockSettings.MaxDistance then continue end
if Logic.LockSettings.WallCheck then
local rayParams = RaycastParams.new()
rayParams.FilterDescendantsInstances = {char, tChar}
rayParams.FilterType = Enum.RaycastFilterType.Exclude
local ray = workspace:Raycast(root.Position, (tRoot.Position - root.Position).Unit * worldDist, rayParams)
if ray then continue end
end
if Logic.LockSettings.TargetMode == "Closest" then
if worldDist < shortest then shortest = worldDist; best = tChar end
else
local pos, onScreen = Camera:WorldToViewportPoint(tRoot.Position)
if onScreen then
local d = (Vector2.new(Mouse.X, Mouse.Y) - Vector2.new(pos.X, pos.Y)).Magnitude
if Logic.LockSettings.ShowFOV and Logic.LockSettings.FOVRadius > 0 then
if d > Logic.LockSettings.FOVRadius then continue end
end
if d < shortest then shortest = d; best = tChar end
end
end
end
end
end
return best
end
Logic.Connections.LockZoom = UserInputService.InputChanged:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseWheel and Logic.LockState.CameraLocked then
Logic.LockState.ZoomDistance = math.clamp(Logic.LockState.ZoomDistance - (input.Position.Z * 2), 4, 50)
end
end)
local function hideTargetInfoHUD()
if Logic.LockState.TargetInfoName then Logic.LockState.TargetInfoName.Visible = false end
if Logic.LockState.TargetInfoHP then Logic.LockState.TargetInfoHP.Visible = false end
if Logic.LockState.TargetInfoDist then Logic.LockState.TargetInfoDist.Visible = false end
if Logic.LockState.TargetInfoLine then Logic.LockState.TargetInfoLine.Visible = false end
end
local function hideFOVCircle()
if Logic.LockState.FOVCircle then Logic.LockState.FOVCircle.Visible = false end
end
RunService:BindToRenderStep("RazorbillTargetLock", Enum.RenderPriority.Camera.Value + 5, function(dt)
local Camera = workspace.CurrentCamera
local char = Player.Character
local hum = char and char:FindFirstChildOfClass("Humanoid")
local root = char and char:FindFirstChild("HumanoidRootPart")
local isAlive = (hum and hum.Health > 0 and root)
if Logic.LockState.FOVCircle then
if Logic.LockSettings.ShowFOV and Logic.LockState.Enabled then
Logic.LockState.FOVCircle.Position = Vector2.new(Mouse.X, Mouse.Y)
Logic.LockState.FOVCircle.Radius = Logic.LockSettings.FOVRadius
Logic.LockState.FOVCircle.Color = Options.FOVColor and Options.FOVColor.Value or Color3.fromRGB(255, 255, 255)
Logic.LockState.FOVCircle.Filled = Logic.LockSettings.FOVFilled
Logic.LockState.FOVCircle.Transparency = 1 - Logic.LockSettings.FOVTransparency
Logic.LockState.FOVCircle.NumSides = Logic.LockSettings.FOVSides
Logic.LockState.FOVCircle.Visible = true
else
Logic.LockState.FOVCircle.Visible = false
end
end
if not Logic.LockState.Enabled or not isAlive then
if Logic.LockState.ESPGui then
Logic.LockState.ESPGui.Adornee = nil
Logic.LockState.ESPGui.Enabled = false
end
if Logic.LockState.CameraLocked then
Camera.CameraType = Enum.CameraType.Custom
if hum then Camera.CameraSubject = hum end
Logic.LockState.CameraLocked = false
end
if Logic.LockState.WasLockedBody then
if hum then hum.AutoRotate = true end
if Logic.LockState.LockBodyGyro then Logic.LockState.LockBodyGyro:Destroy(); Logic.LockState.LockBodyGyro = nil end
Logic.LockState.WasLockedBody = false
end
if not Logic.LockState.Enabled then
Logic.LockState.CurrentLockTarget = nil
end
hideTargetInfoHUD()
return
end
if Logic.LockState.CurrentLockTarget then
local eHum = Logic.LockState.CurrentLockTarget:FindFirstChildOfClass("Humanoid")
local targetAlive = Logic.LockState.CurrentLockTarget.Parent and eHum and eHum.Health > 0
if not targetAlive then
local deadName = Logic.LockState.LastTargetName
Logic.LockState.CurrentLockTarget = nil
Logic.LockState.LastTargetName = nil
if Logic.LockSettings.AutoRetarget then
Logic.LockState.LastTargetSearch = 0
if Logic.LockSettings.LockNotification and deadName then
Library:Notify({ Title = "Target Lock", Description = deadName .. " eliminated. Retargeting...", Time = 2 })
end
elseif Logic.LockSettings.Sticky then
if Logic.LockSettings.LockNotification and deadName then
Library:Notify({ Title = "Target Lock", Description = deadName .. " eliminated. Target lost.", Time = 2 })
end
end
else
local tRoot = Logic.LockState.CurrentLockTarget:FindFirstChild("HumanoidRootPart") or Logic.LockState.CurrentLockTarget:FindFirstChild("Torso")
if tRoot then
local dist = (root.Position - tRoot.Position).Magnitude
if dist > Logic.LockSettings.MaxDistance then
if not Logic.LockSettings.Sticky then
Logic.LockState.CurrentLockTarget = nil
if Logic.LockSettings.LockNotification then
Library:Notify({ Title = "Target Lock", Description = "Target out of range. Searching...", Time = 2 })
end
end
end
end
end
end
if not Logic.LockSettings.Sticky and Logic.LockState.CurrentLockTarget == nil then
Logic.LockState.CurrentLockTarget = getLockTarget()
elseif not Logic.LockState.CurrentLockTarget then
Logic.LockState.CurrentLockTarget = getLockTarget()
end
if Logic.LockState.CurrentLockTarget then
local newName = Logic.LockState.CurrentLockTarget.Name
local plrFromChar = Players:GetPlayerFromCharacter(Logic.LockState.CurrentLockTarget)
if plrFromChar then newName = plrFromChar.DisplayName .. " (@" .. plrFromChar.Name .. ")" end
if newName ~= Logic.LockState.LastTargetName then
Logic.LockState.LastTargetName = newName
if Logic.LockSettings.LockNotification then
Library:Notify({ Title = "Target Lock", Description = "Locked onto: " .. newName, Time = 2 })
end
end
end
if not Logic.LockState.CurrentLockTarget or not root or not hum then
if Logic.LockState.ESPGui then
Logic.LockState.ESPGui.Adornee = nil
Logic.LockState.ESPGui.Enabled = false
end
hideTargetInfoHUD()
return
end
local targetPart = Logic.LockState.CurrentLockTarget:FindFirstChild(Logic.LockSettings.TargetPart)
or Logic.LockState.CurrentLockTarget:FindFirstChild("HumanoidRootPart")
if not targetPart then
if Logic.LockState.ESPGui then
Logic.LockState.ESPGui.Adornee = nil
Logic.LockState.ESPGui.Enabled = false
end
hideTargetInfoHUD()
return
end
local targetPos = targetPart.Position
if Logic.LockSettings.Prediction > 0 then
local tRoot = Logic.LockState.CurrentLockTarget:FindFirstChild("HumanoidRootPart")
if tRoot and tRoot:IsA("BasePart") then
targetPos = targetPos + (tRoot.AssemblyLinearVelocity * Logic.LockSettings.Prediction)
end
end
if Logic.LockSettings.ESPEnabled and Logic.LockState.ESPGui then
Logic.LockState.ESPGui.Enabled = true
Logic.LockState.ESPGui.Adornee = targetPart
local espMain = Logic.LockState.ESPGui:FindFirstChild("Main")
if espMain then
espMain.Rotation = (tick() * 45) % 360
end
local espMarker = Logic.LockState.ESPGui:FindFirstChild("Marker")
if espMarker then
espMarker.Position = UDim2.new(0.5, 0, -0.05, 0)
end
elseif Logic.LockState.ESPGui then
Logic.LockState.ESPGui.Adornee = nil
Logic.LockState.ESPGui.Enabled = false
end
if Logic.LockSettings.ShowTargetInfo and Logic.LockState.TargetInfoName then
local viewport = Camera.ViewportSize
local infoColor = Options.TargetInfoColor and Options.TargetInfoColor.Value or Color3.fromRGB(255, 255, 255)
local eHum = Logic.LockState.CurrentLockTarget:FindFirstChildOfClass("Humanoid")
local tDist = (root.Position - targetPart.Position).Magnitude
local baseX, baseY
if Logic.LockSettings.TargetInfoPos == "Top Center" then
baseX = viewport.X / 2
baseY = 35
elseif Logic.LockSettings.TargetInfoPos == "Bottom Center" then
baseX = viewport.X / 2
baseY = viewport.Y - 90
elseif Logic.LockSettings.TargetInfoPos == "Top Right" then
baseX = viewport.X - 150
baseY = 35
else
baseX = viewport.X / 2
baseY = 35
end
local displayName = Logic.LockState.CurrentLockTarget.Name
local plrFromChar = Players:GetPlayerFromCharacter(Logic.LockState.CurrentLockTarget)
if plrFromChar then displayName = plrFromChar.DisplayName end
Logic.LockState.TargetInfoName.Text = "🎯 " .. displayName
Logic.LockState.TargetInfoName.Position = Vector2.new(baseX, baseY)
Logic.LockState.TargetInfoName.Color = infoColor
Logic.LockState.TargetInfoName.Visible = true
Logic.LockState.TargetInfoLine.From = Vector2.new(baseX - 60, baseY + 20)
Logic.LockState.TargetInfoLine.To = Vector2.new(baseX + 60, baseY + 20)
Logic.LockState.TargetInfoLine.Color = infoColor
Logic.LockState.TargetInfoLine.Visible = true
if eHum then
local hpFrac = math.clamp(eHum.Health / eHum.MaxHealth, 0, 1)
local hpCol = Color3.fromRGB(255 * (1 - hpFrac), 255 * hpFrac, 50)
Logic.LockState.TargetInfoHP.Text = string.format("HP: %d / %d (%.0f%%)", math.floor(eHum.Health), math.floor(eHum.MaxHealth), hpFrac * 100)
Logic.LockState.TargetInfoHP.Position = Vector2.new(baseX, baseY + 24)
Logic.LockState.TargetInfoHP.Color = hpCol
Logic.LockState.TargetInfoHP.Visible = true
else
Logic.LockState.TargetInfoHP.Visible = false
end
Logic.LockState.TargetInfoDist.Text = string.format("Distance: %d studs", math.floor(tDist))
Logic.LockState.TargetInfoDist.Position = Vector2.new(baseX, baseY + 40)
Logic.LockState.TargetInfoDist.Color = infoColor
Logic.LockState.TargetInfoDist.Visible = true
else
hideTargetInfoHUD()
end
if Logic.LockSettings.Method == "Camera" then
if Logic.LockState.WasLockedBody then
hum.AutoRotate = true
if Logic.LockState.LockBodyGyro then Logic.LockState.LockBodyGyro:Destroy(); Logic.LockState.LockBodyGyro = nil end
Logic.LockState.WasLockedBody = false
end
if not Logic.LockState.CameraLocked then
Logic.LockState.OrigCamType = Camera.CameraType
local dist = (Camera.CFrame.Position - root.Position).Magnitude
if dist <= 50 then
Logic.LockState.ZoomDistance = math.clamp(dist, 4, 50)
else
Logic.LockState.ZoomDistance = 10
end
Logic.LockState.CameraLocked = true
end
Camera.CameraType = Enum.CameraType.Scriptable
local offsetDir = root.Position - targetPos
local flatDir = Vector3.new(offsetDir.X, 0, offsetDir.Z)
if flatDir.Magnitude < 0.001 then
flatDir = -root.CFrame.LookVector
flatDir = Vector3.new(flatDir.X, 0, flatDir.Z)
end
flatDir = flatDir.Unit
local baseHeight = Vector3.new(0, 2.5, 0)
local camPos = root.Position + (flatDir * Logic.LockState.ZoomDistance) + baseHeight
local lookCF = CFrame.lookAt(camPos, targetPos)
camPos = camPos + (lookCF.RightVector * Logic.LockSettings.SideOffset)
local rayParams = RaycastParams.new()
rayParams.FilterDescendantsInstances = {char, Logic.LockState.CurrentLockTarget}
rayParams.FilterType = Enum.RaycastFilterType.Exclude
local rayStart = root.Position + Vector3.new(0, 1.5, 0)
local rayResult = workspace:Raycast(rayStart, camPos - rayStart, rayParams)
if rayResult then
camPos = rayResult.Position + (lookCF.LookVector * 0.5)
end
local desiredCF = CFrame.lookAt(camPos, targetPos)
if Logic.LockSettings.Smoothness <= 0 then
Camera.CFrame = desiredCF
else
local rate = 30 / Logic.LockSettings.Smoothness
local alpha = math.clamp(1 - math.exp(-rate * dt), 0, 1)
Camera.CFrame = Camera.CFrame:Lerp(desiredCF, alpha)
end
else
if Logic.LockState.CameraLocked then
Camera.CameraType = Enum.CameraType.Custom
Camera.CameraSubject = hum
Logic.LockState.CameraLocked = false
end
hum.AutoRotate = false
Logic.LockState.WasLockedBody = true
if not Logic.LockState.LockBodyGyro or Logic.LockState.LockBodyGyro.Parent ~= root then
if Logic.LockState.LockBodyGyro then Logic.LockState.LockBodyGyro:Destroy() end
Logic.LockState.LockBodyGyro = Instance.new("BodyGyro")
Logic.LockState.LockBodyGyro.MaxTorque = Vector3.new(0, 400000, 0)
Logic.LockState.LockBodyGyro.P = 50000
Logic.LockState.LockBodyGyro.D = 500
Logic.LockState.LockBodyGyro.Parent = root
end
Logic.LockState.LockBodyGyro.CFrame = CFrame.lookAt(
root.Position,
Vector3.new(targetPos.X, root.Position.Y, targetPos.Z)
)
end
end)
local function getClosestTarget(maxDist)
local char = Player.Character
local root = char and char:FindFirstChild("HumanoidRootPart")
if not root then return nil end
local closest = nil
local minDistance = math.huge
local charactersFolder = workspace:FindFirstChild("Characters")
local targetsToSearch = charactersFolder and charactersFolder:GetChildren() or workspace:GetChildren()
for _, model in ipairs(targetsToSearch) do
if model ~= char and model:IsA("Model") then
local enemyRoot = model:FindFirstChild("HumanoidRootPart")
local enemyHum = model:FindFirstChild("Humanoid")
if enemyRoot and enemyHum and enemyHum.Health > 0 then
local dist = (enemyRoot.Position - root.Position).Magnitude
if dist < minDistance and dist <= maxDist then
minDistance = dist
closest = model
end
end
end
end
return closest
end
Logic.DashAnimLeft.AnimationId = "rbxassetid://75203303352791"
Logic.DashAnimRight.AnimationId = "rbxassetid://117223862448096"
local isDashingArc = false
local function getBezierPoint(t, p0, p1, p2)
return (1 - t)^2 * p0 + 2 * (1 - t) * t * p1 + t^2 * p2
end
local function executeDashArc(direction)
if isDashingArc then return end
isDashingArc = true
local character = Player.Character
if not character then isDashingArc = false return end
local root = character:FindFirstChild("HumanoidRootPart")
local humanoid = character:FindFirstChildOfClass("Humanoid")
if not root or not humanoid then isDashingArc = false return end
local targetChar = getClosestTarget(Logic.DashAssistState.DetectionRange)
local target = targetChar and targetChar:FindFirstChild("HumanoidRootPart")
if not target then isDashingArc = false return end
if Logic.DashAssistState.OnlyIfFacing then
local toPlayer = (root.Position - target.Position).Unit
local dot = target.CFrame.LookVector:Dot(toPlayer)
if dot < -0.1 then isDashingArc = false return end
end
root.Anchored = true
humanoid.AutoRotate = false
root.AssemblyLinearVelocity = Vector3.zero
for _, mover in pairs(root:GetChildren()) do
if mover:IsA("BodyVelocity") or mover:IsA("LinearVelocity") or mover:IsA("AlignPosition") or mover:IsA("VectorForce") or mover:IsA("BodyPosition") then
mover:Destroy()
end
end
local animator = humanoid:FindFirstChildOfClass("Animator")
local dashTrack = nil
if animator then
for _, track in pairs(animator:GetPlayingAnimationTracks()) do
if track.Animation and (track.Animation.AnimationId:match("117223862448096") or track.Animation.AnimationId:match("75203303352791")) then
track:Stop(0)
end
end
local animToUse = (direction == "Left") and Logic.DashAnimLeft or Logic.DashAnimRight
dashTrack = animator:LoadAnimation(animToUse)
dashTrack.Priority = Enum.AnimationPriority.Action4
dashTrack:Play(0.05, 1, 1 / Logic.DashAssistState.FlightDuration)
end
local p0 = root.Position
local sideMult = (direction == "Left") and -1 or 1
local progress = Instance.new("NumberValue")
progress.Value = 0
local dashName = "RazorbillFakeDash_" .. tostring(tick())
local tween = TweenService:Create(
progress,
TweenInfo.new(Logic.DashAssistState.FlightDuration, Enum.EasingStyle.Quad, Enum.EasingDirection.InOut),
{ Value = 1 }
)
local Camera = workspace.CurrentCamera
local prevCamType = Camera.CameraType
RunService:BindToRenderStep(dashName, 20000, function()
if not target or not target.Parent or not root then
RunService:UnbindFromRenderStep(dashName)
if root then root.Anchored = false end
if humanoid then humanoid.AutoRotate = true end
if dashTrack then dashTrack:Stop() end
if Logic.DashAssistState.CameraLock then Camera.CameraType = prevCamType end
isDashingArc = false
return
end
root.Anchored = true
humanoid.AutoRotate = false
root.AssemblyLinearVelocity = Vector3.zero
local val = progress.Value
local tPos = target.Position
local tLook = target.CFrame.LookVector
local flatLook = Vector3.new(tLook.X, 0, tLook.Z)
if flatLook.Magnitude > 0.001 then flatLook = flatLook.Unit else flatLook = Vector3.new(0, 0, -1) end
local tRight = target.CFrame.RightVector
local flatRight = Vector3.new(tRight.X, 0, tRight.Z)
if flatRight.Magnitude > 0.001 then flatRight = flatRight.Unit else flatRight = Vector3.new(1, 0, 0) end
local p2 = tPos + (flatLook * -Logic.DashAssistState.BehindDistance)
local midPoint = (p0 + p2) / 2
local p1 = midPoint + (flatRight * (Logic.DashAssistState.CurveStrength * sideMult)) + Vector3.new(0, Logic.DashAssistState.ArchHeight, 0)
local currentPos = getBezierPoint(val, p0, p1, p2)
local lookPos = Vector3.new(tPos.X, currentPos.Y, tPos.Z)
if (lookPos - currentPos).Magnitude > 0.1 then
root.CFrame = CFrame.lookAt(currentPos, lookPos)
else
root.CFrame = CFrame.new(currentPos)
end
if Logic.DashAssistState.CameraLock then
Camera.CameraType = Enum.CameraType.Scriptable
local dirToEnemy = (tPos - root.Position).Unit
local targetCamCF = CFrame.lookAt(root.Position - (dirToEnemy * 11) + Vector3.new(0, 4.5, 0), tPos)
Camera.CFrame = Camera.CFrame:Lerp(targetCamCF, 0.35)
end
end)
tween:Play()
tween.Completed:Connect(function()
RunService:UnbindFromRenderStep(dashName)
progress:Destroy()
if dashTrack then dashTrack:Stop(0.1) end
if Logic.DashAssistState.CameraLock then
Camera.CameraType = prevCamType
end
local lockStart = tick()
local lockName = "RazorbillDashLock_" .. tostring(lockStart)
RunService:BindToRenderStep(lockName, 20000, function()
if tick() - lockStart > Logic.DashAssistState.LockDuration or not target or not target.Parent or not root then
RunService:UnbindFromRenderStep(lockName)
if root then
root.Anchored = false
root.AssemblyLinearVelocity = Vector3.zero
end
if humanoid then humanoid.AutoRotate = true end
isDashingArc = false
return
end
root.Anchored = true
if humanoid then humanoid.AutoRotate = false end
root.AssemblyLinearVelocity = Vector3.zero
local lockedPos = root.Position
local facePos = Vector3.new(target.Position.X, lockedPos.Y, target.Position.Z)
if (facePos - lockedPos).Magnitude > 0.1 then
root.CFrame = CFrame.lookAt(lockedPos, facePos)
end
end)
end)
end
Logic.Connections.DashInput = UserInputService.InputBegan:Connect(function(input, gp)
if gp then return end
if not Logic.DashAssistState.Enabled then return end
local assignedKey = Options.DashAssistKeybind.Value
local targetKeyCode
if typeof(assignedKey) == "EnumItem" then
targetKeyCode = assignedKey
elseif typeof(assignedKey) == "string" then
local ok, kc = pcall(function() return Enum.KeyCode[assignedKey] end)
if ok then targetKeyCode = kc else return end
else
return
end
if input.KeyCode == targetKeyCode then
local direction = "Right"
local char = Player.Character
local hum = char and char:FindFirstChildOfClass("Humanoid")
if hum and hum.MoveDirection.Magnitude > 0 then
local camRight = workspace.CurrentCamera.CFrame.RightVector * Vector3.new(1, 0, 1)
if camRight.Magnitude > 0 then
camRight = camRight.Unit
if hum.MoveDirection:Dot(camRight) < -0.2 then direction = "Left" end
end
end
task.spawn(function() executeDashArc(direction) end)
end
end)
task.spawn(function()
Logic.TargetRemote = ReplicatedStorage:WaitForChild("Knit")
:WaitForChild("Knit")
:WaitForChild("Services")
:WaitForChild("DivergentFistService")
:WaitForChild("RE")
:WaitForChild("Activated")
end)
local oldNamecall
oldNamecall = hookmetamethod(game, "__namecall", function(self, ...)
local method = getnamecallmethod()
if not checkcaller() and method == "FireServer" and self == Logic.TargetRemote and Toggles.BlackFlashEnabled.Value then
Logic.LastFiredTick = tick()
end
return oldNamecall(self, ...)
end)
local function autoFireDivergentFist()
local character = Player.Character
if character and character:FindFirstChild("Moveset") then
local divergentFistMove = character.Moveset:FindFirstChild("Divergent Fist")
if divergentFistMove and Logic.TargetRemote then
Logic.TargetRemote:FireServer(divergentFistMove, nil)
end
end
end
local function performDashLogic(target)
local MAX_DASH_DISTANCE = Options.DashDistance.Value
local FIRE_DELAY = Options.FireDelay.Value
local DASH_DURATION = Options.DashDuration.Value
local POST_DASH_LOCK_TIME = Options.LockTime.Value
local easingStyleEnum = Enum.EasingStyle[Options.DashEasingStyle.Value] or Enum.EasingStyle.Cubic
local easingDirectionEnum = Enum.EasingDirection[Options.DashEasingDirection.Value] or Enum.EasingDirection.Out
local char = Player.Character
local root = char and char:FindFirstChild("HumanoidRootPart")
local humanoid = char and char:FindFirstChild("Humanoid")
local enemyRoot = target:FindFirstChild("HumanoidRootPart")
if not root or not enemyRoot then
task.delay(FIRE_DELAY, autoFireDivergentFist)
return
end
local initialEnemyCFrame = enemyRoot.CFrame
local initialEnemyPos = initialEnemyCFrame.Position
local startPos = root.Position
local objectSpacePos = initialEnemyCFrame:PointToObjectSpace(startPos)
local isBehind = objectSpacePos.Z > 0
local distanceToEnemy = (startPos - initialEnemyPos).Magnitude
local isDash = true
local dashType = "Arch"
local endPos = startPos
local controlPos = startPos
if isBehind and distanceToEnemy <= 10 then
isDash = false
elseif isBehind and distanceToEnemy > 10 then
dashType = "Straight"
endPos = (initialEnemyCFrame * CFrame.new(0, 0, 5)).Position
else
dashType = "Arch"
endPos = (initialEnemyCFrame * CFrame.new(0, 0, 4)).Position
local distance = (endPos - startPos).Magnitude
local archWidth = math.clamp(distance / 1.5, 5, 25)
local direction = endPos - startPos
local perp = Vector3.new(-direction.Z, 0, direction.X)
if perp.Magnitude > 0.001 then
perp = perp.Unit
else
perp = Vector3.new(1, 0, 0)
end
local midPos = (startPos + endPos) / 2
local cp1 = midPos + (perp * archWidth)
local cp2 = midPos - (perp * archWidth)
local enemyRightVector = initialEnemyCFrame.RightVector
local playerIsOnRightSide = (startPos - initialEnemyPos):Dot(enemyRightVector) > 0
local cp1IsOnRightSide = (cp1 - initialEnemyPos):Dot(enemyRightVector) > 0
controlPos = (playerIsOnRightSide == cp1IsOnRightSide) and cp1 or cp2
end
if humanoid then humanoid.AutoRotate = false end
local startTime = tick()
local hasFired = false
local dashConn
local function finalizeMovement(finalCFrame)
if dashConn then dashConn:Disconnect() end
if humanoid then humanoid.AutoRotate = true end
if finalCFrame and root and root.Parent then root.CFrame = finalCFrame end
if not hasFired then
hasFired = true
autoFireDivergentFist()
end
end
dashConn = RunService.Heartbeat:Connect(function()
if not root or not root.Parent then return finalizeMovement(nil) end
local elapsed = tick() - startTime
if elapsed >= FIRE_DELAY and not hasFired then
hasFired = true
autoFireDivergentFist()
end
local currentPos = startPos
if isDash then
local alpha = math.clamp(elapsed / DASH_DURATION, 0, 1)
local easedAlpha = TweenService:GetValue(alpha, easingStyleEnum, easingDirectionEnum)
if dashType == "Straight" then
currentPos = startPos:Lerp(endPos, easedAlpha)
elseif dashType == "Arch" then
currentPos = (1 - easedAlpha)^2 * startPos + 2 * (1 - easedAlpha) * easedAlpha * controlPos + easedAlpha^2 * endPos
end
end
root.CFrame = CFrame.lookAt(currentPos, initialEnemyPos)
if Toggles.CameraLockEnabled.Value then
local cam = workspace.CurrentCamera
if cam then
cam.CFrame = CFrame.lookAt(cam.CFrame.Position, initialEnemyPos)
end
end
local totalWaitTime = isDash and (DASH_DURATION + POST_DASH_LOCK_TIME) or (FIRE_DELAY + POST_DASH_LOCK_TIME)
if elapsed >= totalWaitTime then
finalizeMovement(CFrame.lookAt(currentPos, initialEnemyPos))
end
end)
end
local function onAnimationPlayed(animTrack)
local animId = animTrack.Animation and animTrack.Animation.AnimationId or ""
if Logic.DashAssistState.Enabled and not isDashingArc then
if animId:match("75203303352791") then
task.spawn(function() executeDashArc("Left") end)
elseif animId:match("117223862448096") then
task.spawn(function() executeDashArc("Right") end)
end
end
if Toggles.BlackFlashEnabled.Value then
local idMatch = string.match(animId, "%d+")
if idMatch and Logic.TargetAnimations[idMatch] then
if (tick() - Logic.LastFiredTick) <= Logic.TIME_WINDOW then
Logic.LastFiredTick = 0
local closestTarget = getClosestTarget(Options.DashDistance.Value)
if closestTarget then
performDashLogic(closestTarget)
else
task.delay(Options.FireDelay.Value, autoFireDivergentFist)
end
end
end
end
end
local function setupCharacter(character)
local humanoid = character:WaitForChild("Humanoid", 10)
if humanoid then
local animator = humanoid:WaitForChild("Animator", 10)
if animator then
animator.AnimationPlayed:Connect(onAnimationPlayed)
end
end
end
if Player.Character then task.spawn(setupCharacter, Player.Character) end
Player.CharacterAdded:Connect(setupCharacter)
local function w2v(pos)
local cam = workspace.CurrentCamera
if not cam then return nil, false end
local sp, on = cam:WorldToViewportPoint(pos)
return Vector2.new(sp.X, sp.Y), on
end
local function hpColor(f)
f = math.clamp(f, 0, 1)
return Color3.fromRGB(255 * (1 - f), 255 * f, 50)
end
local function getCharBounds(char)
local cam = workspace.CurrentCamera
if not cam then return nil end
local hrp = char:FindFirstChild("HumanoidRootPart") or char:FindFirstChild("Torso") or char:FindFirstChild("UpperTorso")
if not hrp then return nil end
local head = char:FindFirstChild("Head")
local pos = hrp.Position
local topY = head and (head.Position.Y + 0.5) or (pos.Y + 2.8)
local botY = pos.Y - 3.1
local topWorld = Vector3.new(pos.X, topY, pos.Z)
local botWorld = Vector3.new(pos.X, botY, pos.Z)
local topSP, topOn = cam:WorldToViewportPoint(topWorld)
local botSP, botOn = cam:WorldToViewportPoint(botWorld)
if not topOn or not botOn then return nil end
local h = math.abs(botSP.Y - topSP.Y)
local w = h * 0.5
local cx = (topSP.X + botSP.X) / 2
local my = math.min(topSP.Y, botSP.Y)
return { X = cx - w / 2, Y = my, W = w, H = h, CX = cx, CY = (topSP.Y + botSP.Y) / 2 }
end
local function getEntities()
local out = {}
local folder = workspace:FindFirstChild("Characters")
local targetsToSearch = folder and folder:GetChildren() or workspace:GetChildren()
for _, char in ipairs(targetsToSearch) do
if char:IsA("Model") and char:FindFirstChildOfClass("Humanoid") then
local plr = Players:GetPlayerFromCharacter(char)
out[#out + 1] = {
Model = char,
Player = plr,
Name = plr and plr.DisplayName or char.Name,
}
end
end
return out
end
local function mkLine(thick)
local l = Drawing.new("Line")
l.Visible = false
l.Thickness = thick or 1
return l
end
local function mkCircle(thick, filled)
local c = Drawing.new("Circle")
c.Visible = false
c.Thickness = thick or 2
c.Filled = filled or false
c.NumSides = 30
return c
end
local function mkText(size)
local t = Drawing.new("Text")
t.Visible = false
t.Size = size or 14
t.Center = true
t.Outline = true
t.OutlineColor = Color3.new(0, 0, 0)
t.Font = 2
return t
end
local function CreateCooldownBillboard(character, player, rootPart)
if not player or not rootPart then return nil, nil end
local Reveal = Instance.new("BillboardGui")
Reveal.Name = "Reveal"
Reveal.SizeOffset = Vector2.new(1.1, 0)
Reveal.StudsOffset = Vector3.new(0, 1, 0)
Reveal.MaxDistance = 75
Reveal.ClipsDescendants = false
Reveal.AlwaysOnTop = true
Reveal.Size = UDim2.new(2, 0, 4, 0)
Reveal.Adornee = rootPart
Reveal.Parent = rootPart
local Moveset = Instance.new("Frame")
Moveset.Name = "Moveset"
Moveset.Visible = true
Moveset.ClipsDescendants = false
Moveset.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
Moveset.BackgroundTransparency = 1
Moveset.BorderSizePixel = 0
Moveset.Size = UDim2.new(0.45, 0, 1, 0)
Moveset.Parent = Reveal
local UIListLayout = Instance.new("UIListLayout")
UIListLayout.Name = "UIListLayout"
UIListLayout.SortOrder = Enum.SortOrder.LayoutOrder
UIListLayout.Padding = UDim.new(0.04, 0)
UIListLayout.Parent = Moveset
local Ult = Instance.new("Frame")
Ult.Name = "Ult"
Ult.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
Ult.BackgroundTransparency = 0.5
Ult.Position = UDim2.new(0.55, 0, 0, 0)
Ult.BorderSizePixel = 0
Ult.Size = UDim2.new(0.25, 0, 1, 0)
Ult.Parent = Reveal
local UltStroke = Instance.new("UIStroke")
UltStroke.Thickness = 2
UltStroke.Transparency = 0.5
UltStroke.Color = Color3.fromRGB(0, 0, 0)
UltStroke.Parent = Ult
local UltFill = Instance.new("Frame")
UltFill.Name = "Fill"
UltFill.AnchorPoint = Vector2.new(0, 1)
UltFill.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
UltFill.BackgroundTransparency = 0.25
UltFill.Position = UDim2.new(0, 0, 1, 0)
UltFill.BorderSizePixel = 0
UltFill.Size = UDim2.new(1, 0, 0, 0)
UltFill.Parent = Ult
local UltFillGradient = Instance.new("UIGradient")
UltFillGradient.Color = Logic.CooldownGradient
UltFillGradient.Parent = UltFill
local Evasive = Instance.new("Frame")
Evasive.Name = "Evasive"
Evasive.AnchorPoint = Vector2.new(1, 0)
Evasive.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
Evasive.BackgroundTransparency = 0.5
Evasive.Position = UDim2.new(0.95, 0, 0, 0)
Evasive.BorderSizePixel = 0
Evasive.Size = UDim2.new(0.1, 0, 1, 0)
Evasive.Parent = Reveal
local EvasiveStroke = Instance.new("UIStroke")
EvasiveStroke.Thickness = 2
EvasiveStroke.Transparency = 0.5
EvasiveStroke.Color = Color3.fromRGB(0, 0, 0)
EvasiveStroke.Parent = Evasive
local EvasiveFill = Instance.new("Frame")
EvasiveFill.Name = "Fill"
EvasiveFill.AnchorPoint = Vector2.new(0, 1)
EvasiveFill.BackgroundColor3 = Color3.fromRGB(0, 85, 127)
EvasiveFill.BackgroundTransparency = 0
EvasiveFill.Position = UDim2.new(0, 0, 1, 0)
EvasiveFill.BorderSizePixel = 0
EvasiveFill.Size = UDim2.new(1, 0, 0, 0)
EvasiveFill.Parent = Evasive
local EvasiveFillGradient = Instance.new("UIGradient")
EvasiveFillGradient.Color = Logic.CooldownGradient
EvasiveFillGradient.Parent = EvasiveFill
local connections = {}
local moveFrames = {}
local function addMoveCooldown(moveValue)
if moveFrames[moveValue] then return end
local Move = Instance.new("Frame")
Move.Name = moveValue.Name
Move.BackgroundColor3 = Color3.fromRGB(31, 31, 31)
Move.BackgroundTransparency = 0.5
Move.BorderSizePixel = 0
Move.Size = UDim2.new(1, 0, 0.22, 0)
Move.Parent = Moveset
local MoveStroke = Instance.new("UIStroke")
MoveStroke.Thickness = 2
MoveStroke.Transparency = 0.5
MoveStroke.Color = Color3.fromRGB(0, 0, 0)
MoveStroke.Parent = Move
local MoveCooldown = Instance.new("Frame")
MoveCooldown.Name = "Cooldown"
MoveCooldown.AnchorPoint = Vector2.new(0.5, 1)
MoveCooldown.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
MoveCooldown.BackgroundTransparency = 0.25
MoveCooldown.Position = UDim2.new(0.5, 0, 1, 0)
MoveCooldown.BorderSizePixel = 0
MoveCooldown.Size = UDim2.new(1, 0, 0, 0)
MoveCooldown.ZIndex = 1
MoveCooldown.Parent = Move
local MoveGradient = Instance.new("UIGradient")
MoveGradient.Color = Logic.CooldownGradient
MoveGradient.Parent = MoveCooldown
local MoveText = Instance.new("TextLabel")
MoveText.Name = "MoveNameText"
MoveText.Parent = Move
MoveText.Size = UDim2.new(1, -4, 1, -4)
MoveText.Position = UDim2.new(0, 2, 0, 2)
MoveText.BackgroundTransparency = 1
MoveText.Text = moveValue.Name
MoveText.TextColor3 = Color3.fromRGB(255, 255, 255)
MoveText.TextScaled = true
MoveText.Font = Enum.Font.GothamBold
MoveText.ZIndex = 2
local TextStroke = Instance.new("UIStroke")
TextStroke.Parent = MoveText
TextStroke.Thickness = 1.2
TextStroke.Color = Color3.fromRGB(0, 0, 0)
moveFrames[moveValue] = Move
table.insert(connections, moveValue:GetAttributeChangedSignal("ReadyAt"):Connect(function()
local maxCd = moveValue.Value or 0
local readyAt = moveValue:GetAttribute("ReadyAt")
if maxCd <= 0 or not readyAt then
if MoveCooldown then MoveCooldown.Size = UDim2.new(1, 0, 0, 0) end
return
end
task.spawn(function()
while MoveCooldown and MoveCooldown.Parent and Reveal and Reveal.Parent do
local currentTime = workspace:GetServerTimeNow()
local remaining = readyAt - currentTime
if remaining <= 0 then
MoveCooldown.Size = UDim2.new(1, 0, 0, 0)
break
else
MoveCooldown.Size = UDim2.new(1, 0, math.clamp(remaining / maxCd, 0, 1), 0)
end
task.wait()
end
end)
end))
end
local function trackMoveset()
local moveset = character:FindFirstChild("Moveset")
if not moveset then return end
for _, child in ipairs(moveset:GetChildren()) do
if child:IsA("NumberValue") then addMoveCooldown(child) end
end
table.insert(connections, moveset.ChildAdded:Connect(function(child)
if child:IsA("NumberValue") then addMoveCooldown(child) end
end))
end
table.insert(connections, character.ChildAdded:Connect(function(child)
if child.Name == "Moveset" then trackMoveset() end
end))
trackMoveset()
local function updateUltimate()
local ultValue = math.clamp((player:GetAttribute("Ultimate") or 0) / 100, 0, 1)
if UltFill then UltFill.Size = UDim2.new(1, 0, ultValue, 0) end
end
local function updateEvade()
local evadeValue = math.clamp((character:GetAttribute("Evade") or 0) / 50, 0, 1)
if EvasiveFill then EvasiveFill.Size = UDim2.new(1, 0, evadeValue, 0) end
end
updateUltimate()
updateEvade()
table.insert(connections, player:GetAttributeChangedSignal("Ultimate"):Connect(updateUltimate))
table.insert(connections, character:GetAttributeChangedSignal("Evade"):Connect(updateEvade))
local function Cleanup()
if Reveal then Reveal:Destroy() end
for _, conn in ipairs(connections) do
conn:Disconnect()
end
table.clear(connections)
end
return Reveal, Cleanup
end
local function createESP()
local e = {}
e.BoxS = {}; e.BoxL = {}
for i = 1, 4 do
e.BoxS[i] = mkLine(3.5); e.BoxS[i].Color = Logic.ShadowColor
e.BoxL[i] = mkLine(1.5)
end
e.CorS = {}; e.CorL = {}
for i = 1, 8 do
e.CorS[i] = mkLine(3.5); e.CorS[i].Color = Logic.ShadowColor
e.CorL[i] = mkLine(1.5)
end
e.Skel = {}
for i = 1, 14 do e.Skel[i] = mkLine(1.5) end
e.HDotS = mkCircle(4, false); e.HDotS.Color = Logic.ShadowColor
e.HDot = mkCircle(2, false)
e.TrcS = mkLine(3); e.TrcS.Color = Logic.ShadowColor
e.Trc = mkLine(1.5)
e.HPTxt = mkText(13); e.HPTxt.Center = false
e.BarO = mkLine(7); e.BarO.Color = Logic.ShadowColor
e.BarBG = mkLine(5); e.BarBG.Color = Color3.fromRGB(40, 40, 40)
e.BarF = mkLine(3)
e.NameTxt = mkText(14)
e.CharTxt = mkText(12)
e.DistTxt = mkText(12)
e.KillTxt = mkText(12)
e.HL = nil
e.RevealGui = nil
e.CooldownCleanup = nil
return e
end
local function hideAll(e)
if not e then return end
for i = 1, 4 do e.BoxS[i].Visible = false; e.BoxL[i].Visible = false end
for i = 1, 8 do e.CorS[i].Visible = false; e.CorL[i].Visible = false end
for i = 1, 14 do e.Skel[i].Visible = false end
e.HDotS.Visible = false; e.HDot.Visible = false
e.TrcS.Visible = false; e.Trc.Visible = false
e.HPTxt.Visible = false
e.BarO.Visible = false; e.BarBG.Visible = false; e.BarF.Visible = false
e.NameTxt.Visible = false; e.CharTxt.Visible = false
e.DistTxt.Visible = false; e.KillTxt.Visible = false
if e.RevealGui then e.RevealGui.Enabled = false end
end
local function safeRM(obj)
if not obj then return end
pcall(function()
if typeof(obj) == "Instance" then obj:Destroy()
elseif type(obj) == "userdata" and obj.Remove then obj:Remove() end
end)
end
local function removeAll(e)
if not e then return end
for i = 1, 4 do safeRM(e.BoxS[i]); safeRM(e.BoxL[i]) end
for i = 1, 8 do safeRM(e.CorS[i]); safeRM(e.CorL[i]) end
for i = 1, 14 do safeRM(e.Skel[i]) end
safeRM(e.HDotS); safeRM(e.HDot)
safeRM(e.TrcS); safeRM(e.Trc)
safeRM(e.HPTxt)
safeRM(e.BarO); safeRM(e.BarBG); safeRM(e.BarF)
safeRM(e.NameTxt); safeRM(e.CharTxt)
safeRM(e.DistTxt); safeRM(e.KillTxt)
safeRM(e.HL)
if e.CooldownCleanup then e.CooldownCleanup() end
end
local function setLinePair(shadow, line, from, to, vis)
shadow.From = from; shadow.To = to; shadow.Visible = vis
line.From = from; line.To = to; line.Visible = vis
end
Logic.Connections.ESP = RunService.Heartbeat:Connect(function()
local cam = workspace.CurrentCamera
if not cam then return end
local entities = getEntities()
local alive = {}
for _, data in ipairs(entities) do
local char = data.Model
local plr = data.Player
local dName = data.Name
alive[char] = true
if plr == Player then
if Logic.ESPObjects[char] then
hideAll(Logic.ESPObjects[char])
if Logic.ESPObjects[char].HL then Logic.ESPObjects[char].HL.Enabled = false end
end
continue
end
local hrp = char:FindFirstChild("HumanoidRootPart") or char:FindFirstChild("Torso") or char:FindFirstChild("UpperTorso")
local hum = char:FindFirstChildOfClass("Humanoid")
local head = char:FindFirstChild("Head")
if not Logic.ESPObjects[char] then
Logic.ESPObjects[char] = createESP()
end
local e = Logic.ESPObjects[char]
if not (hrp and hum and hum.Health > 0) then
hideAll(e)
if e.HL then e.HL.Enabled = false end
continue
end
local dist = (cam.CFrame.Position - hrp.Position).Magnitude
local box = getCharBounds(char)
if Toggles.ESPBox.Value and box then
for i = 1, 4 do e.BoxL[i].Color = Options.ESPBoxColor.Value end
local tl = Vector2.new(box.X, box.Y); local tr = Vector2.new(box.X + box.W, box.Y)
local bl = Vector2.new(box.X, box.Y + box.H); local br = Vector2.new(box.X + box.W, box.Y + box.H)
setLinePair(e.BoxS[1], e.BoxL[1], tl, tr, true); setLinePair(e.BoxS[2], e.BoxL[2], tr, br, true)
setLinePair(e.BoxS[3], e.BoxL[3], br, bl, true); setLinePair(e.BoxS[4], e.BoxL[4], bl, tl, true)
else
for i = 1, 4 do e.BoxS[i].Visible = false; e.BoxL[i].Visible = false end
end
if Toggles.ESPCorner.Value and box then
for i = 1, 8 do e.CorL[i].Color = Options.ESPCornerColor.Value end
local x, y, w, h = box.X, box.Y, box.W, box.H
local len = math.clamp(math.min(w, h) * 0.25, 5, 9999)
local tl = Vector2.new(x, y); local tr = Vector2.new(x + w, y)
local bl = Vector2.new(x, y + h); local br = Vector2.new(x + w, y + h)
local segs = {
{tl, tl + Vector2.new(len, 0)}, {tl, tl + Vector2.new(0, len)},
{tr, tr + Vector2.new(-len, 0)}, {tr, tr + Vector2.new(0, len)},
{bl, bl + Vector2.new(len, 0)}, {bl, bl + Vector2.new(0, -len)},
{br, br + Vector2.new(-len, 0)}, {br, br + Vector2.new(0, -len)},
}
for i = 1, 8 do setLinePair(e.CorS[i], e.CorL[i], segs[i][1], segs[i][2], true) end
else
for i = 1, 8 do e.CorS[i].Visible = false; e.CorL[i].Visible = false end
end
if Toggles.ESPSkeleton.Value then
local bones = char:FindFirstChild("UpperTorso") and Logic.R15Bones or Logic.R6Bones
local idx = 0
for _, b in ipairs(bones) do
idx += 1
local p1 = char:FindFirstChild(b[1])
local p2 = char:FindFirstChild(b[2])
if p1 and p2 then
local s1, o1 = w2v(p1.Position)
local s2, o2 = w2v(p2.Position)
if o1 and o2 then
e.Skel[idx].Color = Options.ESPSkeletonColor.Value
e.Skel[idx].From = s1
e.Skel[idx].To = s2
e.Skel[idx].Visible = true
else e.Skel[idx].Visible = false end
else e.Skel[idx].Visible = false end
end
for i = idx + 1, 14 do e.Skel[i].Visible = false end
else
for i = 1, 14 do e.Skel[i].Visible = false end
end
if Toggles.ESPHeadDot.Value and head then
local hs, ho = w2v(head.Position)
if ho then
local headTop = w2v(head.Position + Vector3.new(0, head.Size.Y * 0.5, 0))
local r = headTop and math.abs(hs.Y - headTop.Y) or 5
r = math.clamp(r, 3, 50)
e.HDot.Color = Options.ESPHeadDotColor.Value
e.HDotS.Position = hs; e.HDotS.Radius = r + 1; e.HDotS.Visible = true
e.HDot.Position = hs; e.HDot.Radius = r; e.HDot.Visible = true
else
e.HDotS.Visible = false; e.HDot.Visible = false
end
else
e.HDotS.Visible = false; e.HDot.Visible = false
end
if Toggles.ESPTracer.Value then
local fp, fo = w2v(hrp.Position - Vector3.new(0, 3, 0))
if fo then
local bot = Vector2.new(cam.ViewportSize.X / 2, cam.ViewportSize.Y)
e.Trc.Color = Options.ESPTracerColor.Value
e.TrcS.From = bot; e.TrcS.To = fp; e.TrcS.Visible = true
e.Trc.From = bot; e.Trc.To = fp; e.Trc.Visible = true
else
e.TrcS.Visible = false; e.Trc.Visible = false
end
else
e.TrcS.Visible = false; e.Trc.Visible = false
end
if Toggles.ESPHPText.Value and box then
local f = math.clamp(hum.Health / hum.MaxHealth, 0, 1)
e.HPTxt.Position = Vector2.new(box.X + box.W + 4, box.Y)
e.HPTxt.Text = math.floor(hum.Health) .. "/" .. math.floor(hum.MaxHealth)
e.HPTxt.Color = hpColor(f)
e.HPTxt.Visible = true
else
e.HPTxt.Visible = false
end
if Toggles.ESPHPBar.Value and box then
local f = math.clamp(hum.Health / hum.MaxHealth, 0, 1)
local bx = box.X - 6
local top = Vector2.new(bx, box.Y)
local bot = Vector2.new(bx, box.Y + box.H)
local ft = Vector2.new(bx, box.Y + box.H * (1 - f))
e.BarO.From = top; e.BarO.To = bot; e.BarO.Visible = true
e.BarBG.From = top; e.BarBG.To = bot; e.BarBG.Visible = true
e.BarF.From = ft; e.BarF.To = bot; e.BarF.Color = hpColor(f); e.BarF.Visible = f > 0
else
e.BarO.Visible = false; e.BarBG.Visible = false; e.BarF.Visible = false
end
if Toggles.ESPOutline.Value then
if not e.HL or e.HL.Parent ~= char then
safeRM(e.HL)
local hl = Instance.new("Highlight")
hl.FillTransparency = 1
hl.OutlineColor = Options.ESPOutlineColor.Value
hl.OutlineTransparency = 0
hl.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop
hl.Parent = char
e.HL = hl
end
e.HL.OutlineColor = Options.ESPOutlineColor.Value
e.HL.Enabled = true
else
if e.HL then e.HL.Enabled = false end
end
if Toggles.CooldownRevealer.Value then
if not e.CooldownCleanup then
e.RevealGui, e.CooldownCleanup = CreateCooldownBillboard(char, plr, hrp)
end
if e.RevealGui then e.RevealGui.Enabled = true end
else
if e.CooldownCleanup then
e.CooldownCleanup()
e.CooldownCleanup = nil
e.RevealGui = nil
end
end
if box then
local ay = box.Y - 2
if Toggles.ESPCharacter.Value then
ay = ay - 14
local ms = char:GetAttribute("Moveset") or (plr and plr:GetAttribute("Moveset")) or "Unknown"
e.CharTxt.Color = Options.ESPCharacterColor.Value
e.CharTxt.Position = Vector2.new(box.CX, ay)
e.CharTxt.Text = "[" .. tostring(ms) .. "]"
e.CharTxt.Visible = true
else
e.CharTxt.Visible = false
end
if Toggles.ESPName.Value then
ay = ay - 16
e.NameTxt.Color = Options.ESPNameColor.Value
e.NameTxt.Position = Vector2.new(box.CX, ay)
e.NameTxt.Text = dName
e.NameTxt.Visible = true
else
e.NameTxt.Visible = false
end
local by = box.Y + box.H + 2
if Toggles.ESPDistance.Value then
e.DistTxt.Color = Options.ESPDistanceColor.Value
e.DistTxt.Position = Vector2.new(box.CX, by)
e.DistTxt.Text = math.floor(dist) .. " studs"
e.DistTxt.Visible = true
by = by + 14
else
e.DistTxt.Visible = false
end
if Toggles.ESPKill.Value then
local kills = 0
if plr then
local ls = plr:FindFirstChild("leaderstats")
if ls then
local ks = ls:FindFirstChild("Kills") or ls:FindFirstChild("kills") or ls:FindFirstChild("KOs") or ls:FindFirstChild("KO")
if ks then kills = ks.Value end
end
end
e.KillTxt.Color = Options.ESPKillColor.Value
e.KillTxt.Position = Vector2.new(box.CX, by)
e.KillTxt.Text = "Kills: " .. tostring(kills)
e.KillTxt.Visible = true
else
e.KillTxt.Visible = false
end
else
e.NameTxt.Visible = false
e.CharTxt.Visible = false
e.DistTxt.Visible = false
e.KillTxt.Visible = false
end
end
for char, e in pairs(Logic.ESPObjects) do
if not alive[char] or not char.Parent then
hideAll(e)
if e.HL then e.HL.Enabled = false; safeRM(e.HL) end
removeAll(e)
Logic.ESPObjects[char] = nil
end
end
end)
UI.ServerListGrp = UI.Tabs.Servers:AddLeftGroupbox("Server List", "list")
UI.ServerInfoGrp = UI.Tabs.Servers:AddRightGroupbox("Server Details", "info")
Logic.ServerList = {}
Logic.ServerMap = {}
Logic.SelectedServerData = nil
local function estimateRegion(ping)
if ping <= 0 then return "Unknown"
elseif ping <= 40 then return "US East / Nearby"
elseif ping <= 70 then return "US Central"
elseif ping <= 100 then return "US West / Regional"
elseif ping <= 140 then return "EU West"
elseif ping <= 180 then return "EU East / Middle East"
elseif ping <= 220 then return "South America"
elseif ping <= 270 then return "East Asia"
elseif ping <= 320 then return "Southeast Asia / Oceania"
elseif ping <= 400 then return "Africa / South Asia"
else return "Very Far" end
end
local function pingQualityIcon(ping)
if ping <= 60 then return "[+++]"
elseif ping <= 120 then return "[++ ]"
elseif ping <= 200 then return "[+ ]"
else return "[! ]" end
end
local function buildServerMap(serverList)
Logic.ServerMap = {}
local vals = {}
for i, entry in ipairs(serverList) do
local label = string.format("%s #%d | %d/%d | %dms%s",
pingQualityIcon(entry.Ping),
i,
entry.Playing,
entry.MaxPlayers,
entry.Ping,
entry.IsCurrent and " [YOU]" or ""
)
Logic.ServerMap[label] = entry
vals[#vals + 1] = label
end
return vals
end
local function updateServerInfo(entry)
if not UI.SrvInfoLabel then return end
if not entry then
UI.SrvInfoLabel:SetText("No server selected.\n\nClick 'Refresh Server List' to load servers,\nthen select one from the dropdown.")
return
end
local fillPercent = entry.MaxPlayers > 0 and math.floor((entry.Playing / entry.MaxPlayers) * 100) or 0
local fillBar = string.rep("|", math.floor(fillPercent / 5)) .. string.rep(".", 20 - math.floor(fillPercent / 5))
local info = string.format(
"Job ID:\n%s\n\n" ..
"Players: %d / %d (%d%%)\n[%s]\n\n" ..
"Ping: %d ms %s\n" ..
"Server FPS: %.1f\n\n" ..
"Estimated Region: %s\n" ..
"%s",
entry.JobId,
entry.Playing, entry.MaxPlayers, fillPercent,
fillBar,
entry.Ping, pingQualityIcon(entry.Ping),
entry.FPS,
entry.Region,
entry.IsCurrent and "\n>> This is YOUR current server <<" or ""
)
UI.SrvInfoLabel:SetText(info)
end
local function updateStatsLabel()
if not UI.SrvStatsLabel then return end
if #Logic.ServerList == 0 then
UI.SrvStatsLabel:SetText("No data. Refresh to load servers.")
return
end
local totalPlayers, totalPing, minPing, maxPing = 0, 0, math.huge, 0
local fullServers, emptyServers = 0, 0
for _, srv in ipairs(Logic.ServerList) do
totalPlayers += srv.Playing
totalPing += srv.Ping
if srv.Ping < minPing then minPing = srv.Ping end
if srv.Ping > maxPing then maxPing = srv.Ping end
if srv.Playing >= srv.MaxPlayers then fullServers += 1 end
if srv.Playing == 0 then emptyServers += 1 end
end
local avgPing = math.floor(totalPing / #Logic.ServerList)
UI.SrvStatsLabel:SetText(string.format(
"Total Servers: %d\nTotal Players: %d\n\nAvg Ping: %dms\nBest Ping: %dms\nWorst Ping: %dms\n\nFull Servers: %d\nEmpty Servers: %d",
#Logic.ServerList, totalPlayers, avgPing, minPing, maxPing, fullServers, emptyServers
))
end
local function refreshDropdown()
local vals = buildServerMap(Logic.ServerList)
if #vals > 0 then
Options.ServerDropdown:SetValues(vals)
Options.ServerDropdown:SetValue(vals[1])
else
Options.ServerDropdown:SetValues({ "No servers found" })
end
updateStatsLabel()
end
local function fetchServers()
Logic.ServerList = {}
Logic.ServerMap = {}
local placeId = game.PlaceId
local cursor = ""
local maxPages = 10
local idx = 0
Library:Notify({ Title = "Server Browser", Description = "Fetching servers... This may take a moment.", Time = 4 })
for page = 1, maxPages do
local url = string.format(
"https://games.roblox.com/v1/games/%d/servers/0?sortOrder=2&excludeFullGames=false&limit=100%s",
placeId, cursor ~= "" and ("&cursor=" .. cursor) or ""
)
local ok, res = pcall(game.HttpGet, game, url)
if not ok or not res then break end
local ok2, data = pcall(HttpService.JSONDecode, HttpService, res)
if not ok2 or not data or not data.data then break end
for _, srv in ipairs(data.data) do
idx += 1
local entry = {
JobId = srv.id or "",
Playing = srv.playing or 0,
MaxPlayers = srv.maxPlayers or 0,
Ping = srv.ping or 0,
FPS = srv.fps or 0,
Index = idx,
Region = estimateRegion(srv.ping or 0),
IsCurrent = (srv.id == game.JobId),
}
table.insert(Logic.ServerList, entry)
end
cursor = data.nextPageCursor or ""
if cursor == "" then break end
task.wait(0.4)
end
Library:Notify({ Title = "Server Browser", Description = "Found " .. tostring(#Logic.ServerList) .. " servers!", Time = 4 })
return Logic.ServerList
end
UI.SrvInfoLabel = UI.ServerInfoGrp:AddLabel("SrvInfo", {
Text = "No server selected.\n\nClick 'Refresh Server List' to load servers,\nthen select one from the dropdown.",
DoesWrap = true,
})
UI.ServerInfoGrp:AddDivider()
UI.ServerInfoGrp:AddButton({
Text = "Join Selected Server",
Func = function()
if not Logic.SelectedServerData then
Library:Notify({ Title = "Servers", Description = "No server selected!", Time = 3 })
return
end
if Logic.SelectedServerData.IsCurrent then
Library:Notify({ Title = "Servers", Description = "You're already in this server!", Time = 3 })
return
end
Library:Notify({ Title = "Servers", Description = "Teleporting...", Time = 3 })
TeleportService:TeleportToPlaceInstance(game.PlaceId, Logic.SelectedServerData.JobId, Player)
end,
DoubleClick = true,
Tooltip = "Double-click to teleport to the selected server",
})
UI.ServerInfoGrp:AddButton({
Text = "Join Lowest Ping Server",
Func = function()
if #Logic.ServerList == 0 then
Library:Notify({ Title = "Servers", Description = "Refresh the server list first!", Time = 3 })
return
end
local best = nil
for _, srv in ipairs(Logic.ServerList) do
if not srv.IsCurrent and srv.Playing > 0 and srv.Ping > 0 then
if not best or srv.Ping < best.Ping then best = srv end
end
end
if best then
Library:Notify({ Title = "Servers", Description = "Joining best ping server (" .. best.Ping .. "ms, " .. best.Playing .. " players)...", Time = 3 })
TeleportService:TeleportToPlaceInstance(game.PlaceId, best.JobId, Player)
else
Library:Notify({ Title = "Servers", Description = "No valid server found!", Time = 3 })
end
end,
DoubleClick = true,
Tooltip = "Double-click to join the server with lowest ping",
})
UI.ServerInfoGrp:AddButton({
Text = "Join Smallest Server",
Func = function()
if #Logic.ServerList == 0 then
Library:Notify({ Title = "Servers", Description = "Refresh the server list first!", Time = 3 })
return
end
local smallest = nil
for _, srv in ipairs(Logic.ServerList) do
if not srv.IsCurrent and srv.Playing > 0 then
if not smallest or srv.Playing < smallest.Playing then smallest = srv end
end
end
if smallest then
Library:Notify({ Title = "Servers", Description = "Joining smallest server (" .. smallest.Playing .. " players, " .. smallest.Ping .. "ms)...", Time = 3 })
TeleportService:TeleportToPlaceInstance(game.PlaceId, smallest.JobId, Player)
else
Library:Notify({ Title = "Servers", Description = "No valid server found!", Time = 3 })
end
end,
DoubleClick = true,
Tooltip = "Double-click to join the server with fewest players",
})
UI.ServerInfoGrp:AddButton({
Text = "Join Random Server",
Func = function()
if #Logic.ServerList == 0 then
Library:Notify({ Title = "Servers", Description = "Refresh the server list first!", Time = 3 })
return
end
local candidates = {}
for _, srv in ipairs(Logic.ServerList) do
if not srv.IsCurrent then table.insert(candidates, srv) end
end
if #candidates > 0 then
local pick = candidates[math.random(1, #candidates)]
Library:Notify({ Title = "Servers", Description = "Joining random server (" .. pick.Playing .. " players, " .. pick.Ping .. "ms)...", Time = 3 })
TeleportService:TeleportToPlaceInstance(game.PlaceId, pick.JobId, Player)
else
Library:Notify({ Title = "Servers", Description = "No other servers available!", Time = 3 })
end
end,
DoubleClick = true,
Tooltip = "Double-click to join a random server",
})
UI.ServerInfoGrp:AddButton({
Text = "Rejoin Current Server",
Func = function()
Library:Notify({ Title = "Servers", Description = "Rejoining...", Time = 3 })
TeleportService:TeleportToPlaceInstance(game.PlaceId, game.JobId, Player)
end,
DoubleClick = true,
Tooltip = "Double-click to rejoin your current server",
})
UI.ServerInfoGrp:AddDivider()
UI.SrvStatsLabel = UI.ServerInfoGrp:AddLabel("SrvStats", {
Text = "No data. Refresh to load servers.",
DoesWrap = true,
})
UI.ServerListGrp:AddButton({
Text = "Refresh Server List",
Func = function()
task.spawn(function()
fetchServers()
refreshDropdown()
end)
end,
DoubleClick = false,
Tooltip = "Fetches all available servers (up to ~1000)",
})
UI.ServerListGrp:AddDivider()
UI.ServerListGrp:AddDropdown("ServerDropdown", {
Values = { "Click 'Refresh' to load servers" },
Default = 1,
Multi = false,
Text = "Select Server",
Searchable = true,
MaxVisibleDropdownItems = 10,
Tooltip = "[+++] = Great ping | [! ] = Poor ping",
Callback = function(Value)
Logic.SelectedServerData = Logic.ServerMap[Value]
updateServerInfo(Logic.SelectedServerData)
end,
})
UI.ServerListGrp:AddDivider()
UI.ServerListGrp:AddDropdown("ServerSortBy", {
Values = { "Default (Roblox)", "Most Players", "Least Players", "Lowest Ping", "Highest Ping", "Highest FPS" },
Default = 1,
Multi = false,
Text = "Sort By",
Tooltip = "Re-sorts the server list",
Callback = function(Value)
if #Logic.ServerList == 0 then return end
local sorted = {}
for i, v in ipairs(Logic.ServerList) do sorted[i] = v end
if Value == "Most Players" then
table.sort(sorted, function(a, b) return a.Playing > b.Playing end)
elseif Value == "Least Players" then
table.sort(sorted, function(a, b) return a.Playing < b.Playing end)
elseif Value == "Lowest Ping" then
table.sort(sorted, function(a, b) return a.Ping < b.Ping end)
elseif Value == "Highest Ping" then
table.sort(sorted, function(a, b) return a.Ping > b.Ping end)
elseif Value == "Highest FPS" then
table.sort(sorted, function(a, b) return a.FPS > b.FPS end)
end
local vals = buildServerMap(sorted)
Options.ServerDropdown:SetValues(vals)
if #vals > 0 then Options.ServerDropdown:SetValue(vals[1]) end
end,
})
UI.ServerListGrp:AddSlider("MinPlayersFilter", {
Text = "Min Players Filter",
Default = 0,
Min = 0,
Max = 50,
Rounding = 0,
Tooltip = "Only show servers with at least this many players",
})
UI.ServerListGrp:AddSlider("MaxPingFilter", {
Text = "Max Ping Filter",
Default = 999,
Min = 10,
Max = 999,
Rounding = 0,
Tooltip = "Only show servers with ping below this value (999 = no filter)",
})
UI.ServerListGrp:AddButton({
Text = "Apply Filters",
Func = function()
if #Logic.ServerList == 0 then
Library:Notify({ Title = "Servers", Description = "Refresh the server list first!", Time = 3 })
return
end
local minP = Options.MinPlayersFilter.Value
local maxPing = Options.MaxPingFilter.Value
local filtered = {}
for _, entry in ipairs(Logic.ServerList) do
if entry.Playing >= minP and (maxPing >= 999 or entry.Ping <= maxPing) then
table.insert(filtered, entry)
end
end
local vals = buildServerMap(filtered)
Options.ServerDropdown:SetValues(#vals > 0 and vals or { "No servers match filters" })
if #vals > 0 then Options.ServerDropdown:SetValue(vals[1]) end
Library:Notify({ Title = "Servers", Description = "Showing " .. #vals .. " servers after filtering.", Time = 3 })
end,
Tooltip = "Apply min players and max ping filters",
})
task.spawn(function()
task.wait(2)
fetchServers()
refreshDropdown()
end)
UI.UIBox = UI.Tabs.UISettings:AddLeftGroupbox("UI Configuration", "palette")
UI.UIBox:AddButton("Unload UI", function() Library:Unload() end)
UI.UIBox:AddLabel("Menu Bind"):AddKeyPicker("MenuBind", {
Default = "RightShift",
NoUI = true,
Text = "Menu Toggle Key"
})
Library.ToggleKeybind = Options.MenuBind
ThemeManager:SetLibrary(Library)
SaveManager:SetLibrary(Library)
SaveManager:IgnoreThemeSettings()
SaveManager:SetIgnoreIndexes({ "MenuBind" })
ThemeManager:SetFolder("razorbill")
SaveManager:SetFolder("mspaint/razorbillhub")
SaveManager:BuildConfigSection(UI.Tabs.UISettings)
ThemeManager:ApplyToTab(UI.Tabs.UISettings)
if Options.AccentColor then
Options.AccentColor:SetValueRGB(Color3.fromRGB(185, 186, 189))
end
SaveManager:LoadAutoloadConfig()
Library:OnUnload(function()
if Logic.Connections.ESP then Logic.Connections.ESP:Disconnect() end
if Logic.Connections.LockZoom then Logic.Connections.LockZoom:Disconnect() end
if Logic.Connections.PlayerAdded then Logic.Connections.PlayerAdded:Disconnect() end
if Logic.Connections.PlayerRemoving then Logic.Connections.PlayerRemoving:Disconnect() end
if Logic.Connections.DashInput then Logic.Connections.DashInput:Disconnect() end
pcall(function() RunService:UnbindFromRenderStep("RazorbillTargetLock") end)
if Logic.LockState.ESPGui then
pcall(function() Logic.LockState.ESPGui:Destroy() end)
end
if Logic.LockState.LockBodyGyro then
pcall(function() Logic.LockState.LockBodyGyro:Destroy() end)
end
if Logic.LockState.FOVCircle then pcall(function() Logic.LockState.FOVCircle:Remove() end) end
if Logic.LockState.TargetInfoName then pcall(function() Logic.LockState.TargetInfoName:Remove() end) end
if Logic.LockState.TargetInfoHP then pcall(function() Logic.LockState.TargetInfoHP:Remove() end) end
if Logic.LockState.TargetInfoDist then pcall(function() Logic.LockState.TargetInfoDist:Remove() end) end
if Logic.LockState.TargetInfoLine then pcall(function() Logic.LockState.TargetInfoLine:Remove() end) end
stopPathfinding()
if workspace.CurrentCamera then
workspace.CurrentCamera.CameraType = Enum.CameraType.Custom
local char = Player.Character
local hum = char and char:FindFirstChildOfClass("Humanoid")
if hum then
workspace.CurrentCamera.CameraSubject = hum
hum.AutoRotate = true
end
end
for _, e in pairs(Logic.ESPObjects) do
hideAll(e)
removeAll(e)
end
Logic.ESPObjects = {}
end)



send the discord invite to voidseen gng its expired