local UserInputService = game:GetService('UserInputService')
local TweenService = game:GetService('TweenService')
local RunService = game:GetService('RunService')
local CoreGui = game:GetService('CoreGui')
local Players = game:GetService('Players')
local TextService = game:GetService('TextService')
local HttpService = game:GetService('HttpService')
local LocalPlayer = Players.LocalPlayer
local uiParent = (pcall(function() return CoreGui.Name end) and CoreGui) or LocalPlayer:WaitForChild('PlayerGui')
local Themes = {
['Default'] = {
MainBG = Color3.fromRGB(15, 15, 17),
SidebarBG = Color3.fromRGB(18, 18, 21),
TopbarBG = Color3.fromRGB(12, 12, 14),
ElementBG = Color3.fromRGB(24, 24, 27),
Accent = Color3.fromRGB(59, 130, 246),
TextMain = Color3.fromRGB(240, 240, 240),
TextSub = Color3.fromRGB(160, 160, 165),
Border = Color3.fromRGB(39, 39, 42),
DropdownListBG = Color3.fromRGB(24, 24, 27),
DropdownListStroke = Color3.fromRGB(39, 39, 42)
},
['Dracula'] = {
MainBG = Color3.fromRGB(40, 42, 54),
SidebarBG = Color3.fromRGB(33, 34, 44),
TopbarBG = Color3.fromRGB(24, 25, 33),
ElementBG = Color3.fromRGB(56, 58, 89),
Accent = Color3.fromRGB(189, 147, 249),
TextMain = Color3.fromRGB(248, 248, 242),
TextSub = Color3.fromRGB(160, 165, 180),
Border = Color3.fromRGB(68, 71, 90),
DropdownListBG = Color3.fromRGB(56, 58, 89),
DropdownListStroke = Color3.fromRGB(68, 71, 90)
},
['Tokyo Night'] = {
MainBG = Color3.fromRGB(26, 27, 38),
SidebarBG = Color3.fromRGB(31, 35, 53),
TopbarBG = Color3.fromRGB(22, 22, 30),
ElementBG = Color3.fromRGB(41, 46, 66),
Accent = Color3.fromRGB(122, 162, 247),
TextMain = Color3.fromRGB(192, 202, 245),
TextSub = Color3.fromRGB(120, 124, 153),
Border = Color3.fromRGB(56, 62, 86),
DropdownListBG = Color3.fromRGB(41, 46, 66),
DropdownListStroke = Color3.fromRGB(56, 62, 86)
},
['Catppuccin'] = {
MainBG = Color3.fromRGB(30, 30, 46),
SidebarBG = Color3.fromRGB(24, 24, 37),
TopbarBG = Color3.fromRGB(17, 17, 27),
ElementBG = Color3.fromRGB(49, 50, 68),
Accent = Color3.fromRGB(203, 166, 247),
TextMain = Color3.fromRGB(205, 214, 244),
TextSub = Color3.fromRGB(166, 173, 200),
Border = Color3.fromRGB(69, 71, 90),
DropdownListBG = Color3.fromRGB(49, 50, 68),
DropdownListStroke = Color3.fromRGB(69, 71, 90)
},
['Rose Pine'] = {
MainBG = Color3.fromRGB(25, 23, 36),
SidebarBG = Color3.fromRGB(31, 29, 46),
TopbarBG = Color3.fromRGB(20, 18, 28),
ElementBG = Color3.fromRGB(38, 35, 58),
Accent = Color3.fromRGB(235, 188, 186),
TextMain = Color3.fromRGB(224, 222, 244),
TextSub = Color3.fromRGB(144, 140, 170),
Border = Color3.fromRGB(49, 47, 68),
DropdownListBG = Color3.fromRGB(38, 35, 58),
DropdownListStroke = Color3.fromRGB(49, 47, 68)
},
['Minimal White'] = {
MainBG = Color3.fromRGB(15, 15, 15),
SidebarBG = Color3.fromRGB(20, 20, 20),
TopbarBG = Color3.fromRGB(10, 10, 10),
ElementBG = Color3.fromRGB(26, 26, 26),
Accent = Color3.fromRGB(255, 255, 255),
TextMain = Color3.fromRGB(255, 255, 255),
TextSub = Color3.fromRGB(170, 170, 170),
Border = Color3.fromRGB(40, 40, 40),
DropdownListBG = Color3.fromRGB(26, 26, 26),
DropdownListStroke = Color3.fromRGB(40, 40, 40)
}
}
local Theme = {}
for k, v in pairs(Themes['Minimal White']) do Theme[k] = v end
local AkenaLib = {}
AkenaLib.Flags = {}
AkenaLib.ThemeConnections = {}
AkenaLib.RainbowAccent = false
AkenaLib.RainbowSpeed = 5
AkenaLib.ShowNotifications = true
AkenaLib.ShowTooltips = true
local SetupDirectories = function()
if delfolder and makefolder and isfolder then
if isfolder('cheeto') then
pcall(delfolder, 'cheeto')
end
if isfolder('akena') then
if isfile and not isfile('akena/v2_marker.txt') then
pcall(delfolder, 'akena')
pcall(makefolder, 'akena')
if writefile then
pcall(writefile, 'akena/v2_marker.txt', 'v2')
end
end
else
pcall(makefolder, 'akena')
if writefile then
pcall(writefile, 'akena/v2_marker.txt', 'v2')
end
end
end
end
SetupDirectories()
local createInstance = function(className, properties)
local inst = Instance.new(className)
for k, v in pairs(properties or {}) do
inst[k] = v
end
return inst
end
local getStringValue = function(val)
if type(val) == 'table' then
if val.Type == 'Color3' then
return string.format('RGB: %d, %d, %d', math.floor(val.R * 255), math.floor(val.G * 255), math.floor(val.B * 255))
elseif val.Type == 'EnumItem' then
return tostring(val.Name)
end
for _, v in pairs(val) do
if type(v) == 'string' or type(v) == 'number' then
return tostring(v)
end
end
return 'None'
end
return val ~= nil and tostring(val) or 'None'
end
local regTheme = function(instance, callback)
table.insert(AkenaLib.ThemeConnections, function()
local success, hasParent = pcall(function() return instance and instance.Parent end)
if success and hasParent then
callback()
return true
end
return false
end)
callback()
end
local UpdateThemeAccent = function(newColor)
Theme.Accent = newColor
local alive = {}
for i = 1, #AkenaLib.ThemeConnections do
local func = AkenaLib.ThemeConnections[i]
if type(func) == 'function' then
local s, res = pcall(func)
if s and res ~= false then
table.insert(alive, func)
end
end
end
AkenaLib.ThemeConnections = alive
end
local ApplySelectedTheme = function(themeName)
local targetTheme = Themes[themeName]
if not targetTheme then return end
for k, v in pairs(targetTheme) do
Theme[k] = v
end
local alive = {}
for i = 1, #AkenaLib.ThemeConnections do
local func = AkenaLib.ThemeConnections[i]
if type(func) == 'function' then
local s, res = pcall(func)
if s and res ~= false then
table.insert(alive, func)
end
end
end
AkenaLib.ThemeConnections = alive
end
RunService.RenderStepped:Connect(function()
if AkenaLib.RainbowAccent then
local hue = tick() * (AkenaLib.RainbowSpeed / 100) % 1
UpdateThemeAccent(Color3.fromHSV(hue, 1, 1))
end
end)
local GetDarkerColor = function(color, factor)
local h, s, v = Color3.toHSV(color)
return Color3.fromHSV(h, s, math.clamp(v * factor, 0, 1))
end
local SerializeValue = function(val)
if typeof(val) == 'Color3' then
return {Type = 'Color3', R = val.R, G = val.G, B = val.B}
elseif typeof(val) == 'EnumItem' then
return {Type = 'EnumItem', EnumType = tostring(val.EnumType), Name = val.Name}
elseif typeof(val) == 'table' then
local tbl = {}
for k, v in pairs(val) do
tbl[k] = SerializeValue(v)
end
return tbl
end
return val
end
local DeserializeValue = function(val)
if type(val) == 'table' then
if val.Type == 'Color3' then
return Color3.new(val.R, val.G, val.B)
elseif val.Type == 'EnumItem' then
local success, enum = pcall(function() return Enum[val.EnumType][val.Name] end)
return success and enum or nil
else
local tbl = {}
for k, v in pairs(val) do
tbl[k] = DeserializeValue(v)
end
return tbl
end
end
return val
end
AkenaLib.Notify = function(self, options)
if not AkenaLib.ShowNotifications then return end
local Title = options.Title or 'Notification'
local Content = options.Content or 'Notification content goes here.'
local Duration = options.Duration or 3
local ScreenGui = uiParent:FindFirstChild('AkenaUI')
if not ScreenGui then return end
local NotifContainer = ScreenGui:FindFirstChild('NotifyContainer')
if not NotifContainer then return end
local Wrapper = createInstance('Frame', {
Parent = NotifContainer,
BackgroundTransparency = 1,
Size = UDim2.new(0, 260, 0, 0),
ClipsDescendants = true,
ZIndex = 200
})
local NotifCard = createInstance('CanvasGroup', {
Parent = Wrapper,
BackgroundColor3 = Theme.MainBG,
BackgroundTransparency = 0.35,
Size = UDim2.new(1, 0, 0, 75),
Position = UDim2.new(1, 300, 0, 0),
GroupTransparency = 1,
ZIndex = 200
})
createInstance('UICorner', {Parent = NotifCard, CornerRadius = UDim.new(0, 6)})
regTheme(NotifCard, function() NotifCard.BackgroundColor3 = Theme.MainBG end)
local TitleLbl = createInstance('TextLabel', {
Parent = NotifCard,
BackgroundTransparency = 1,
Position = UDim2.new(0, 0, 0, 10),
Size = UDim2.new(1, 0, 0, 16),
Font = Enum.Font.GothamBold,
Text = Title,
TextColor3 = Theme.Accent,
TextSize = 14,
TextXAlignment = Enum.TextXAlignment.Center,
ZIndex = 201
})
regTheme(TitleLbl, function() TitleLbl.TextColor3 = Theme.Accent end)
local InfoLbl = createInstance('TextLabel', {
Parent = NotifCard,
BackgroundTransparency = 1,
Position = UDim2.new(0, 15, 0, 30),
Size = UDim2.new(1, -30, 0, 35),
Font = Enum.Font.Gotham,
Text = Content,
TextColor3 = Theme.TextSub,
TextSize = 12,
TextXAlignment = Enum.TextXAlignment.Center,
TextWrapped = true,
ZIndex = 201
})
regTheme(InfoLbl, function() InfoLbl.TextColor3 = Theme.TextSub end)
local LineFrame = createInstance('Frame', {
Parent = NotifCard,
BackgroundColor3 = Theme.Accent,
BorderSizePixel = 0,
AnchorPoint = Vector2.new(0.5, 1),
Position = UDim2.new(0.5, 0, 1, 0),
Size = UDim2.new(1, 0, 0, 2),
ZIndex = 201
})
createInstance('UICorner', {Parent = LineFrame, CornerRadius = UDim.new(1, 0)})
regTheme(LineFrame, function() LineFrame.BackgroundColor3 = Theme.Accent end)
TweenService:Create(Wrapper, TweenInfo.new(0.3, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {Size = UDim2.new(0, 260, 0, 85)}):Play()
TweenService:Create(NotifCard, TweenInfo.new(0.4, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {
Position = UDim2.new(0, 0, 0, 0),
GroupTransparency = 0
}):Play()
TweenService:Create(LineFrame, TweenInfo.new(Duration, Enum.EasingStyle.Linear), {Size = UDim2.new(0, 0, 0, 2)}):Play()
task.delay(Duration, function()
local outTween = TweenService:Create(NotifCard, TweenInfo.new(0.4, Enum.EasingStyle.Quart, Enum.EasingDirection.In), {
Position = UDim2.new(1, 300, 0, 0),
GroupTransparency = 1
})
outTween:Play()
outTween.Completed:Wait()
TweenService:Create(Wrapper, TweenInfo.new(0.3, Enum.EasingStyle.Quart, Enum.EasingDirection.In), {Size = UDim2.new(0, 260, 0, 0)}):Play()
task.delay(0.3, function() Wrapper:Destroy() end)
end)
end
AkenaLib.CreateWindow = function(self, options)
local WindowTitle = options.Title or 'na'
local TitlePrefix = options.Prefix or 'Ake'
local defaultTheme = options.Theme or 'Minimal White'
local ScreenGui = createInstance('ScreenGui', {
Name = 'AkenaUI',
ResetOnSpawn = false,
ZIndexBehavior = Enum.ZIndexBehavior.Sibling,
Parent = uiParent
})
if uiParent:FindFirstChild('AkenaUI') and uiParent:FindFirstChild('AkenaUI') ~= ScreenGui then
uiParent:FindFirstChild('AkenaUI'):Destroy()
end
local isMobile = UserInputService.TouchEnabled and not UserInputService.KeyboardEnabled
local MainGroup = createInstance('CanvasGroup', {
Name = 'MainGroup',
Parent = ScreenGui,
BackgroundColor3 = Theme.MainBG,
AnchorPoint = Vector2.new(0.5, 0.5),
Position = UDim2.new(0.5, 0, 0.5, 0),
Size = UDim2.new(0, 580, 0, 360),
BorderSizePixel = 0
})
regTheme(MainGroup, function() MainGroup.BackgroundColor3 = Theme.MainBG end)
local CurrentScale = 1
local MainScale = createInstance('UIScale', {Parent = MainGroup, Scale = CurrentScale})
local ScalesToUpdate = {MainScale}
local WindowObj = { Tabs = {}, CurrentTab = nil, ElementsList = {} }
local MenuVisible = true
local UpdateScale = function(newScale)
CurrentScale = newScale
if MenuVisible then
for i = 1, #ScalesToUpdate do
local scaleObj = ScalesToUpdate[i]
TweenService:Create(scaleObj, TweenInfo.new(0.2, Enum.EasingStyle.Quad), {Scale = CurrentScale}):Play()
end
end
end
WindowObj.UpdateScale = function(self, newScale)
local scale = type(self) == 'number' and self or newScale
UpdateScale(scale)
end
createInstance('UICorner', {Parent = MainGroup, CornerRadius = UDim.new(0, 6)})
local MainStrokeFrame = createInstance('Frame', {
Name = 'StrokeFrame',
Parent = MainGroup,
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 1, 0)
})
createInstance('UICorner', {Parent = MainStrokeFrame, CornerRadius = UDim.new(0, 6)})
local MainStroke = createInstance('UIStroke', {Parent = MainStrokeFrame, Color = Theme.Border})
regTheme(MainStroke, function() MainStroke.Color = Theme.Border end)
local NotifyContainer = createInstance('Frame', {
Name = 'NotifyContainer',
Parent = ScreenGui,
BackgroundTransparency = 1,
AnchorPoint = Vector2.new(1, 1),
Position = UDim2.new(1, -20, 1, -20),
Size = UDim2.new(0, 300, 1, 0),
ZIndex = 100
})
createInstance('UIListLayout', {
Parent = NotifyContainer,
SortOrder = Enum.SortOrder.LayoutOrder,
VerticalAlignment = Enum.VerticalAlignment.Bottom,
HorizontalAlignment = Enum.HorizontalAlignment.Right,
Padding = UDim.new(0, 10)
})
local TooltipCard = createInstance('CanvasGroup', {
Name = 'TooltipCard',
Parent = ScreenGui,
BackgroundColor3 = Theme.MainBG,
BackgroundTransparency = 0.1,
Size = UDim2.new(0, 0, 0, 24),
Position = UDim2.new(0, 0, 0, 0),
BorderSizePixel = 0,
Visible = false,
GroupTransparency = 1,
ZIndex = 300
})
regTheme(TooltipCard, function() TooltipCard.BackgroundColor3 = Theme.MainBG end)
createInstance('UICorner', {Parent = TooltipCard, CornerRadius = UDim.new(0, 2)})
createInstance('UIPadding', {Parent = TooltipCard, PaddingLeft = UDim.new(0, 10), PaddingRight = UDim.new(0, 10)})
local TooltipLine = createInstance('Frame', {
Parent = TooltipCard,
BackgroundColor3 = Theme.Accent,
BorderSizePixel = 0,
Position = UDim2.new(0, -10, 0, 0),
Size = UDim2.new(0, 3, 1, 0),
ZIndex = 301
})
regTheme(TooltipLine, function() TooltipLine.BackgroundColor3 = Theme.Accent end)
local TooltipText = createInstance('TextLabel', {
Parent = TooltipCard,
BackgroundTransparency = 1,
Position = UDim2.new(0, 0, 0, 0),
Size = UDim2.new(0, 0, 1, 0),
Font = Enum.Font.GothamMedium,
Text = '',
TextColor3 = Theme.TextMain,
TextSize = 11,
TextXAlignment = Enum.TextXAlignment.Left,
AutomaticSize = Enum.AutomaticSize.X,
ZIndex = 301
})
regTheme(TooltipText, function() TooltipText.TextColor3 = Theme.TextMain end)
local tooltipActive = false
local activeHoveredElement = nil
local tooltipCurrentOffset = 20
local targetTooltipOffset = 20
local ShowTooltip = function(text, targetY)
if not AkenaLib.ShowTooltips then return end
if not text or text == '' then return end
TooltipText.Text = text
TooltipCard.AutomaticSize = Enum.AutomaticSize.X
TooltipCard.Visible = true
tooltipActive = true
targetTooltipOffset = 0
TweenService:Create(TooltipCard, TweenInfo.new(0.25, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {
GroupTransparency = 0
}):Play()
end
local HideTooltip = function()
tooltipActive = false
targetTooltipOffset = 20
TweenService:Create(TooltipCard, TweenInfo.new(0.2, Enum.EasingStyle.Quart, Enum.EasingDirection.In), {
GroupTransparency = 1
}):Play()
task.delay(0.2, function()
if not tooltipActive then
TooltipCard.Visible = false
end
end)
end
RunService.RenderStepped:Connect(function(dt)
if TooltipCard.Visible and activeHoveredElement then
tooltipCurrentOffset = tooltipCurrentOffset + (targetTooltipOffset - tooltipCurrentOffset) * math.clamp(dt * 15, 0, 1)
local targetY = activeHoveredElement.AbsolutePosition.Y + (activeHoveredElement.AbsoluteSize.Y / 2) - (TooltipCard.AbsoluteSize.Y / 2)
local mainX = MainGroup.AbsolutePosition.X + MainGroup.AbsoluteSize.X + 15 + tooltipCurrentOffset
TooltipCard.Position = UDim2.new(0, mainX, 0, targetY)
end
end)
local SetupTooltip = function(elementFrame, tipText)
if not tipText or tipText == '' then return end
elementFrame.MouseEnter:Connect(function()
activeHoveredElement = elementFrame
ShowTooltip(tipText, elementFrame.AbsolutePosition.Y)
end)
elementFrame.MouseLeave:Connect(function()
if activeHoveredElement == elementFrame then
activeHoveredElement = nil
HideTooltip()
end
end)
end
local MenuKeybind = Enum.KeyCode.RightControl
local ToggleMenuVisible = function(state)
if state ~= nil then MenuVisible = state else MenuVisible = not MenuVisible end
MainGroup.Interactable = MenuVisible
if MenuVisible then
MainGroup.Visible = true
TweenService:Create(MainGroup, TweenInfo.new(0.3, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {GroupTransparency = 0}):Play()
TweenService:Create(MainStroke, TweenInfo.new(0.3, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {Transparency = 0}):Play()
for i = 1, #ScalesToUpdate do
local scaleObj = ScalesToUpdate[i]
TweenService:Create(scaleObj, TweenInfo.new(0.3, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {Scale = CurrentScale}):Play()
end
else
TweenService:Create(MainGroup, TweenInfo.new(0.3, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {GroupTransparency = 1}):Play()
TweenService:Create(MainStroke, TweenInfo.new(0.3, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {Transparency = 1}):Play()
for i = 1, #ScalesToUpdate do
local scaleObj = ScalesToUpdate[i]
TweenService:Create(scaleObj, TweenInfo.new(0.3, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {Scale = CurrentScale * 0.95}):Play()
end
task.delay(0.3, function() if not MenuVisible then MainGroup.Visible = false end end)
end
end
UserInputService.InputBegan:Connect(function(input, gpe)
if not gpe and input.KeyCode == MenuKeybind then ToggleMenuVisible() end
end)
if isMobile then
local ToggleBtn = createInstance('ImageButton', {
Parent = ScreenGui,
BackgroundColor3 = Theme.MainBG,
AnchorPoint = Vector2.new(0.5, 0),
Position = UDim2.new(0.5, 0, 0, 20),
Size = UDim2.new(0, 48, 0, 40),
AutoButtonColor = false,
Image = ''
})
createInstance('UICorner', {Parent = ToggleBtn, CornerRadius = UDim.new(0, 8)})
local btnStroke = createInstance('UIStroke', {Parent = ToggleBtn, Color = Theme.Border, ApplyStrokeMode = Enum.ApplyStrokeMode.Border})
regTheme(ToggleBtn, function()
ToggleBtn.BackgroundColor3 = Theme.MainBG
btnStroke.Color = Theme.Border
end)
local TogTextFrame = createInstance('Frame', {
Parent = ToggleBtn,
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 1, 0)
})
local TogText = createInstance('TextLabel', {
Parent = TogTextFrame,
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 1, 0),
RichText = true,
Font = Enum.Font.GothamBold,
TextColor3 = Color3.fromRGB(255, 255, 255),
TextSize = 14,
Text = 'AKE'
})
regTheme(TogText, function() TogText.TextColor3 = Theme.TextMain end)
local draggingTog, dragInputTog, dragStartTog, startPosTog
ToggleBtn.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then
draggingTog = true
dragStartTog = input.Position
startPosTog = ToggleBtn.Position
end
end)
ToggleBtn.InputChanged:Connect(function(input)
if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseMovement then
dragInputTog = input
end
end)
UserInputService.InputChanged:Connect(function(input)
if input == dragInputTog and draggingTog then
local delta = input.Position - dragStartTog
ToggleBtn.Position = UDim2.new(startPosTog.X.Scale, startPosTog.X.Offset + delta.X, startPosTog.Y.Scale, startPosTog.Y.Offset + delta.Y)
end
end)
UserInputService.InputEnded:Connect(function(input)
if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then
draggingTog = false
end
end)
ToggleBtn.MouseButton1Click:Connect(function() ToggleMenuVisible() end)
end
local Topbar = createInstance('Frame', {
Name = 'Topbar',
Parent = MainGroup,
BackgroundColor3 = Theme.TopbarBG,
Size = UDim2.new(1, 0, 0, 48),
BorderSizePixel = 0,
ZIndex = 2
})
regTheme(Topbar, function() Topbar.BackgroundColor3 = Theme.TopbarBG end)
local TopbarBorder = createInstance('Frame', {
Parent = Topbar,
BackgroundColor3 = Theme.Border,
BorderSizePixel = 0,
Position = UDim2.new(0, 0, 1, -1),
Size = UDim2.new(1, 0, 0, 1)
})
regTheme(TopbarBorder, function() TopbarBorder.BackgroundColor3 = Theme.Border end)
local dragging, dragInput, dragStart, startPos
Topbar.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
dragging = true
dragStart = input.Position
startPos = MainGroup.Position
input.Changed:Connect(function()
if input.UserInputState == Enum.UserInputState.End then dragging = false end
end)
end
end)
Topbar.InputChanged:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then
dragInput = input
end
end)
UserInputService.InputChanged:Connect(function(input)
if input == dragInput and dragging then
local delta = input.Position - dragStart
TweenService:Create(MainGroup, TweenInfo.new(0.1, Enum.EasingStyle.Linear), {
Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y)
}):Play()
end
end)
local cleanTitle = TitlePrefix .. WindowTitle
local titleBounds = TextService:GetTextSize(cleanTitle, 22, Enum.Font.GothamBold, Vector2.new(1000, 48))
local TitleLabel = createInstance('TextLabel', {
Parent = Topbar,
BackgroundTransparency = 1,
Position = UDim2.new(0, 18, 0, 0),
Size = UDim2.new(0, titleBounds.X + 10, 1, 0),
Font = Enum.Font.GothamBold,
Text = string.format('%s%s', TitlePrefix, WindowTitle),
RichText = true,
TextColor3 = Theme.TextMain,
TextSize = 22,
TextXAlignment = Enum.TextXAlignment.Left
})
regTheme(TitleLabel, function() TitleLabel.TextColor3 = Theme.TextMain end)
local profileText = 'Welcome, ' .. LocalPlayer.Name
local profileBounds = TextService:GetTextSize(profileText, 12, Enum.Font.Gotham, Vector2.new(1000, 48))
local ProfileBox = createInstance('Frame', {
Parent = Topbar,
BackgroundColor3 = Theme.MainBG,
AnchorPoint = Vector2.new(1, 0.5),
Position = UDim2.new(1, -50, 0.5, 0),
Size = UDim2.new(0, profileBounds.X + 42, 0, 30)
})
createInstance('UICorner', {Parent = ProfileBox, CornerRadius = UDim.new(0, 4)})
local ProfileStroke = createInstance('UIStroke', {Parent = ProfileBox, Color = Theme.Border})
regTheme(ProfileBox, function()
ProfileBox.BackgroundColor3 = Theme.MainBG
ProfileStroke.Color = Theme.Border
end)
local AvatarImg = createInstance('ImageLabel', {
Parent = ProfileBox,
BackgroundTransparency = 1,
Position = UDim2.new(0, 4, 0.5, -11),
Size = UDim2.new(0, 22, 0, 22)
})
createInstance('UICorner', {Parent = AvatarImg, CornerRadius = UDim.new(1, 0)})
task.spawn(function()
local content, isReady = Players:GetUserThumbnailAsync(LocalPlayer.UserId, Enum.ThumbnailType.HeadShot, Enum.ThumbnailSize.Size48x48)
if isReady then AvatarImg.Image = content end
end)
local ProfileName = createInstance('TextLabel', {
Parent = ProfileBox,
BackgroundTransparency = 1,
Position = UDim2.new(0, 32, 0, 0),
Size = UDim2.new(1, -36, 1, 0),
Font = Enum.Font.Gotham,
Text = profileText,
TextColor3 = Theme.TextMain,
TextSize = 12,
TextXAlignment = Enum.TextXAlignment.Left
})
regTheme(ProfileName, function() ProfileName.TextColor3 = Theme.TextMain end)
local SearchOverlay = createInstance('CanvasGroup', {
Parent = ScreenGui,
BackgroundColor3 = Color3.fromRGB(0, 0, 0),
BackgroundTransparency = 0.5,
Size = UDim2.new(1, 0, 1, 0),
ZIndex = 500,
GroupTransparency = 1,
Visible = false
})
local SearchPanel = createInstance('Frame', {
Parent = SearchOverlay,
BackgroundColor3 = Theme.MainBG,
AnchorPoint = Vector2.new(0.5, 0.5),
Position = UDim2.new(0.5, 0, 0.5, -20),
Size = UDim2.new(0, 400, 0, 300),
ClipsDescendants = true
})
createInstance('UICorner', {Parent = SearchPanel, CornerRadius = UDim.new(0, 6)})
local SearchPanelStroke = createInstance('UIStroke', {Parent = SearchPanel, Color = Theme.Border})
regTheme(SearchPanel, function()
SearchPanel.BackgroundColor3 = Theme.MainBG
SearchPanelStroke.Color = Theme.Border
end)
local SearchInputBox = createInstance('TextBox', {
Parent = SearchPanel,
BackgroundTransparency = 1,
Position = UDim2.new(0, 20, 0, 10),
Size = UDim2.new(1, -40, 0, 40),
Font = Enum.Font.GothamMedium,
PlaceholderText = 'Search elements...',
PlaceholderColor3 = Theme.TextSub,
TextColor3 = Theme.TextMain,
TextSize = 14,
TextXAlignment = Enum.TextXAlignment.Left,
ClearTextOnFocus = false,
Text = ''
})
regTheme(SearchInputBox, function()
SearchInputBox.TextColor3 = Theme.TextMain
SearchInputBox.PlaceholderColor3 = Theme.TextSub
end)
local SearchLine = createInstance('Frame', {
Parent = SearchPanel,
BackgroundColor3 = Theme.Border,
BorderSizePixel = 0,
Position = UDim2.new(0, 0, 0, 55),
Size = UDim2.new(1, 0, 0, 1)
})
regTheme(SearchLine, function() SearchLine.BackgroundColor3 = Theme.Border end)
local SearchScroll = createInstance('ScrollingFrame', {
Parent = SearchPanel,
BackgroundTransparency = 1,
Position = UDim2.new(0, 10, 0, 65),
Size = UDim2.new(1, -20, 1, -75),
ScrollBarThickness = 2,
ScrollBarImageColor3 = Theme.Border,
BorderSizePixel = 0,
AutomaticCanvasSize = Enum.AutomaticSize.Y,
CanvasSize = UDim2.new(0, 0, 0, 0)
})
regTheme(SearchScroll, function() SearchScroll.ScrollBarImageColor3 = Theme.Border end)
createInstance('UIListLayout', {
Parent = SearchScroll,
SortOrder = Enum.SortOrder.LayoutOrder,
Padding = UDim.new(0, 5)
})
local SearchBtn = createInstance('ImageButton', {
Parent = Topbar,
BackgroundTransparency = 1,
AnchorPoint = Vector2.new(1, 0.5),
Position = UDim2.new(1, -15, 0.5, 0),
Size = UDim2.new(0, 24, 0, 24),
Image = 'rbxassetid://6031154871',
ImageColor3 = Theme.TextSub
})
regTheme(SearchBtn, function() SearchBtn.ImageColor3 = Theme.TextSub end)
SearchBtn.MouseButton1Click:Connect(function()
SearchOverlay.Visible = true
SearchInputBox.Text = ''
TweenService:Create(SearchOverlay, TweenInfo.new(0.3, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {GroupTransparency = 0}):Play()
SearchInputBox:CaptureFocus()
end)
SearchOverlay.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 then
local pos = input.Position
local cx1, cy1 = SearchPanel.AbsolutePosition.X, SearchPanel.AbsolutePosition.Y
local cx2, cy2 = cx1 + SearchPanel.AbsoluteSize.X, cy1 + SearchPanel.AbsoluteSize.Y
if not (pos.X >= cx1 and pos.X <= cx2 and pos.Y >= cy1 and pos.Y <= cy2) then
TweenService:Create(SearchOverlay, TweenInfo.new(0.3, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {GroupTransparency = 1}):Play()
task.delay(0.3, function() SearchOverlay.Visible = false end)
end
end
end)
local PopulateSearch = function(query)
local cList = SearchScroll:GetChildren()
for i = 1, #cList do
local v = cList[i]
if v:IsA('TextButton') then v:Destroy() end
end
if query == '' then return end
query = query:lower()
for i = 1, #WindowObj.ElementsList do
local elementData = WindowObj.ElementsList[i]
if string.find(elementData.Name:lower(), query) then
local sBtn = createInstance('TextButton', {
Parent = SearchScroll,
BackgroundColor3 = Theme.ElementBG,
Size = UDim2.new(1, 0, 0, 34),
Text = '',
AutoButtonColor = false
})
createInstance('UICorner', {Parent = sBtn, CornerRadius = UDim.new(0, 4)})
local sText = createInstance('TextLabel', {
Parent = sBtn,
BackgroundTransparency = 1,
Position = UDim2.new(0, 10, 0, 0),
Size = UDim2.new(1, -20, 1, 0),
Font = Enum.Font.GothamMedium,
Text = elementData.Name .. " [" .. elementData.Tab.Name .. "]",
RichText = true,
TextColor3 = Theme.TextMain,
TextSize = 13,
TextXAlignment = Enum.TextXAlignment.Left
})
regTheme(sBtn, function() sBtn.BackgroundColor3 = Theme.ElementBG end)
regTheme(sText, function() sText.TextColor3 = Theme.TextMain end)
sBtn.MouseEnter:Connect(function()
TweenService:Create(sBtn, TweenInfo.new(0.2), {BackgroundColor3 = GetDarkerColor(Theme.ElementBG, 0.8)}):Play()
end)
sBtn.MouseLeave:Connect(function()
TweenService:Create(sBtn, TweenInfo.new(0.2), {BackgroundColor3 = Theme.ElementBG}):Play()
end)
sBtn.MouseButton1Click:Connect(function()
TweenService:Create(SearchOverlay, TweenInfo.new(0.3, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {GroupTransparency = 1}):Play()
task.delay(0.3, function() SearchOverlay.Visible = false end)
elementData.Tab.Select()
task.wait(0.1)
local targetY = elementData.Frame.AbsolutePosition.Y - elementData.Tab.Page.AbsolutePosition.Y + elementData.Tab.Page.CanvasPosition.Y - (elementData.Tab.Page.AbsoluteWindowSize.Y / 2) + (elementData.Frame.AbsoluteSize.Y / 2)
TweenService:Create(elementData.Tab.Page, TweenInfo.new(0.5, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {
CanvasPosition = Vector2.new(0, math.max(0, targetY))
}):Play()
local origColor = elementData.Frame.BackgroundColor3
TweenService:Create(elementData.Frame, TweenInfo.new(0.3), {BackgroundColor3 = Theme.Accent}):Play()
task.delay(0.6, function()
if elementData.Frame then
TweenService:Create(elementData.Frame, TweenInfo.new(0.5), {BackgroundColor3 = origColor}):Play()
end
end)
end)
end
end
end
SearchInputBox:GetPropertyChangedSignal('Text'):Connect(function()
PopulateSearch(SearchInputBox.Text)
end)
local startX = TitleLabel.Position.X.Offset + titleBounds.X + 25
local endX = 580 - 15 - (profileBounds.X + 42) - 15 - 30
local subTabsWidth = endX - startX
local SubTabs = createInstance('Frame', {
Parent = Topbar,
BackgroundTransparency = 1,
Position = UDim2.new(0, startX, 0, 0),
Size = UDim2.new(0, subTabsWidth, 1, 0)
})
createInstance('UIListLayout', {
Parent = SubTabs,
FillDirection = Enum.FillDirection.Horizontal,
SortOrder = Enum.SortOrder.LayoutOrder,
Padding = UDim.new(0, 15),
VerticalAlignment = Enum.VerticalAlignment.Center
})
local subTabItems = {'Home', 'UI Settings', 'Configs'}
local activeSubTab = 'Home'
local MasterContainers = {}
local BodyContainer = createInstance('Frame', {
Name = 'BodyContainer',
Parent = MainGroup,
BackgroundTransparency = 1,
Position = UDim2.new(0, 0, 0, 48),
Size = UDim2.new(1, 0, 1, -48),
ClipsDescendants = true
})
local CreateTopSubTab = function(text)
local SubContainer = createInstance('CanvasGroup', {
Name = text .. 'Container',
Parent = BodyContainer,
BackgroundTransparency = 1,
Position = UDim2.new(0, 0, 0, 0),
Size = UDim2.new(1, 0, 1, 0),
Visible = (text == activeSubTab),
GroupTransparency = (text == activeSubTab) and 0 or 1
})
MasterContainers[text] = SubContainer
local tabBtn = createInstance('ImageButton', {
Name = text .. 'Tab',
Parent = SubTabs,
BackgroundTransparency = 1,
AutoButtonColor = false,
Image = ''
})
local labelBounds = TextService:GetTextSize(text, 12, Enum.Font.GothamMedium, Vector2.new(1000, 48))
tabBtn.Size = UDim2.new(0, labelBounds.X + 10, 1, 0)
local tabLabel = createInstance('TextLabel', {
Parent = tabBtn,
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 1, 0),
Font = Enum.Font.GothamMedium,
Text = text,
TextSize = 12,
TextColor3 = (text == activeSubTab) and Theme.TextMain or Theme.TextSub
})
regTheme(tabLabel, function()
if activeSubTab == text then tabLabel.TextColor3 = Theme.TextMain end
end)
local underline = createInstance('Frame', {
Parent = tabBtn,
BackgroundColor3 = Theme.Accent,
BorderSizePixel = 0,
AnchorPoint = Vector2.new(0.5, 1),
Position = UDim2.new(0.5, 0, 1, -2),
Size = (text == activeSubTab) and UDim2.new(1, 0, 0, 2) or UDim2.new(0, 0, 0, 2),
BackgroundTransparency = (text == activeSubTab) and 0 or 1
})
regTheme(underline, function() underline.BackgroundColor3 = Theme.Accent end)
tabBtn.MouseEnter:Connect(function()
if activeSubTab ~= text then
TweenService:Create(tabLabel, TweenInfo.new(0.2), {TextColor3 = Theme.TextMain}):Play()
TweenService:Create(underline, TweenInfo.new(0.25, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {Size = UDim2.new(0.8, 0, 0, 2), BackgroundTransparency = 0.3}):Play()
end
end)
tabBtn.MouseLeave:Connect(function()
if activeSubTab ~= text then
TweenService:Create(tabLabel, TweenInfo.new(0.2), {TextColor3 = Theme.TextSub}):Play()
TweenService:Create(underline, TweenInfo.new(0.25, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {Size = UDim2.new(0, 0, 0, 2), BackgroundTransparency = 1}):Play()
end
end)
tabBtn.MouseButton1Click:Connect(function()
if activeSubTab ~= text then
local prevActive = activeSubTab
activeSubTab = text
local prevBtn = SubTabs:FindFirstChild(prevActive .. 'Tab')
if prevBtn then
TweenService:Create(prevBtn.TextLabel, TweenInfo.new(0.2), {TextColor3 = Theme.TextSub}):Play()
TweenService:Create(prevBtn.Frame, TweenInfo.new(0.2), {Size = UDim2.new(0, 0, 0, 2), BackgroundTransparency = 1}):Play()
end
TweenService:Create(tabLabel, TweenInfo.new(0.2), {TextColor3 = Theme.TextMain}):Play()
TweenService:Create(underline, TweenInfo.new(0.2), {Size = UDim2.new(1, 0, 0, 2), BackgroundTransparency = 0}):Play()
local prevContainer = MasterContainers[prevActive]
if prevContainer then
TweenService:Create(prevContainer, TweenInfo.new(0.25, Enum.EasingStyle.Quart, Enum.EasingDirection.In), {Position = UDim2.new(0, 0, 0, -15), GroupTransparency = 1}):Play()
task.delay(0.25, function() if activeSubTab ~= prevActive then prevContainer.Visible = false end end)
end
local newContainer = MasterContainers[text]
if newContainer then
newContainer.Visible = true
newContainer.Position = UDim2.new(0, 0, 0, 15)
newContainer.GroupTransparency = 1
TweenService:Create(newContainer, TweenInfo.new(0.4, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {Position = UDim2.new(0, 0, 0, 0), GroupTransparency = 0}):Play()
end
end
end)
end
for i = 1, #subTabItems do CreateTopSubTab(subTabItems[i]) end
local CreateElementBuilder = function(PageTarget, ParentTab)
local Builder = {}
Builder.CreateDivider = function(self)
local DivContainer = createInstance('Frame', {
Parent = PageTarget,
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 0, 14)
})
local Line = createInstance('Frame', {
Parent = DivContainer,
BackgroundColor3 = Theme.Border,
BorderSizePixel = 0,
AnchorPoint = Vector2.new(0.5, 0.5),
Position = UDim2.new(0.5, 0, 0.5, 0),
Size = UDim2.new(1, -20, 0, 2)
})
createInstance('UICorner', {Parent = Line, CornerRadius = UDim.new(0, 1)})
regTheme(Line, function()
if Line then Line.BackgroundColor3 = Theme.Border end
end)
end
Builder.CreateButton = function(self, options)
local BtnName = options.Name or 'Button'
local Callback = options.Callback or function() end
local BtnFrame = createInstance('ImageButton', {
Parent = PageTarget,
BackgroundColor3 = Theme.ElementBG,
Size = UDim2.new(1, 0, 0, 36),
AutoButtonColor = false,
Image = ''
})
createInstance('UICorner', {Parent = BtnFrame, CornerRadius = UDim.new(0, 4)})
regTheme(BtnFrame, function() BtnFrame.BackgroundColor3 = Theme.ElementBG end)
local TextLabel = createInstance('TextLabel', {
Parent = BtnFrame,
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 1, 0),
Font = Enum.Font.GothamMedium,
Text = BtnName,
TextColor3 = Theme.TextSub,
TextSize = 13
})
regTheme(TextLabel, function() TextLabel.TextColor3 = Theme.TextSub end)
SetupTooltip(BtnFrame, options.Tip)
table.insert(WindowObj.ElementsList, {Name = BtnName, Frame = BtnFrame, Tab = ParentTab})
BtnFrame.MouseEnter:Connect(function()
TweenService:Create(BtnFrame, TweenInfo.new(0.25, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {BackgroundColor3 = GetDarkerColor(Theme.ElementBG, 0.8)}):Play()
TweenService:Create(TextLabel, TweenInfo.new(0.25, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {TextColor3 = Theme.TextMain}):Play()
end)
BtnFrame.MouseLeave:Connect(function()
TweenService:Create(BtnFrame, TweenInfo.new(0.25, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {BackgroundColor3 = Theme.ElementBG}):Play()
TweenService:Create(TextLabel, TweenInfo.new(0.25, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {TextColor3 = Theme.TextSub}):Play()
end)
BtnFrame.MouseButton1Down:Connect(function()
TweenService:Create(BtnFrame, TweenInfo.new(0.1, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {BackgroundColor3 = Theme.Accent}):Play()
TweenService:Create(TextLabel, TweenInfo.new(0.1, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {TextColor3 = Color3.fromRGB(255, 255, 255)}):Play()
end)
BtnFrame.MouseButton1Click:Connect(function()
TweenService:Create(BtnFrame, TweenInfo.new(0.2, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {BackgroundColor3 = GetDarkerColor(Theme.ElementBG, 0.8)}):Play()
Callback()
end)
end
Builder.CreateTextbox = function(self, options)
local ElementName = options.Name or 'Textbox'
local Default = options.Default or ''
local UseLetter = options.UseLetter
local UseNumber = options.UseNumber
local Callback = options.Callback or function() end
local Element = { Value = Default }
AkenaLib.Flags[ElementName] = Element
local Container = createInstance('Frame', {
Parent = PageTarget,
BackgroundColor3 = Theme.ElementBG,
Size = UDim2.new(1, 0, 0, 36)
})
createInstance('UICorner', {Parent = Container, CornerRadius = UDim.new(0, 4)})
regTheme(Container, function() Container.BackgroundColor3 = Theme.ElementBG end)
table.insert(WindowObj.ElementsList, {Name = ElementName, Frame = Container, Tab = ParentTab})
local labelBounds = TextService:GetTextSize(ElementName, 13, Enum.Font.GothamMedium, Vector2.new(1000, 36))
local LabelText = createInstance('TextLabel', {
Parent = Container,
BackgroundTransparency = 1,
Position = UDim2.new(0, 12, 0, 0),
Size = UDim2.new(0, labelBounds.X + 5, 1, 0),
Font = Enum.Font.GothamMedium,
Text = ElementName,
TextColor3 = Theme.TextSub,
TextSize = 13,
TextXAlignment = Enum.TextXAlignment.Left
})
regTheme(LabelText, function() LabelText.TextColor3 = Theme.TextSub end)
local ValBox = createInstance('Frame', {
Parent = Container,
BackgroundColor3 = Color3.fromRGB(35, 35, 35),
AnchorPoint = Vector2.new(1, 0.5),
Position = UDim2.new(1, -6, 0.5, 0),
Size = UDim2.new(0, 120, 0, 24)
})
createInstance('UICorner', {Parent = ValBox, CornerRadius = UDim.new(0, 4)})
regTheme(ValBox, function() ValBox.BackgroundColor3 = Theme.MainBG end)
local ValBoxStroke = createInstance('UIStroke', {Parent = ValBox, Color = Theme.Border})
regTheme(ValBoxStroke, function() ValBoxStroke.Color = Theme.Border end)
local TextBox = createInstance('TextBox', {
Parent = ValBox,
BackgroundTransparency = 1,
Position = UDim2.new(0, 0, 0, 0),
Size = UDim2.new(1, -6, 1, 0),
Font = Enum.Font.Gotham,
Text = Default,
PlaceholderText = 'Type...',
PlaceholderColor3 = Color3.fromRGB(150, 150, 150),
TextColor3 = Theme.TextMain,
TextSize = 12,
TextXAlignment = Enum.TextXAlignment.Right,
ClearTextOnFocus = false
})
regTheme(TextBox, function() TextBox.TextColor3 = Theme.TextMain end)
SetupTooltip(Container, options.Tip)
TextBox:GetPropertyChangedSignal('Text'):Connect(function()
local original = TextBox.Text
local cleaned = original
if UseLetter and not UseNumber then
cleaned = original:gsub('[^%a%s]', '')
elseif UseNumber and not UseLetter then
cleaned = original:gsub('[^%d%.%-]', '')
elseif UseLetter and UseNumber then
cleaned = original:gsub('[^%w%s%_%-]', '')
end
if original ~= cleaned then TextBox.Text = cleaned end
end)
TextBox.FocusLost:Connect(function()
Element.Value = TextBox.Text
AkenaLib.Flags[ElementName].Value = Element.Value
Callback(Element.Value)
end)
function Element:Set(val)
TextBox.Text = val
Element.Value = val
AkenaLib.Flags[ElementName].Value = val
Callback(val)
end
return Element
end
Builder.CreateSlider = function(self, options)
local ElementName = options.Name or 'Slider'
local Min = options.Min or 0
local Max = options.Max or 100
local Default = options.Default or 35
local Increment = options.Increment or 1
local Suffix = options.Suffix or ''
local Callback = options.Callback or function() end
local Element = { Value = Default }
AkenaLib.Flags[ElementName] = Element
local Container = createInstance('Frame', {
Parent = PageTarget,
BackgroundColor3 = Theme.ElementBG,
Size = UDim2.new(1, 0, 0, 36)
})
createInstance('UICorner', {Parent = Container, CornerRadius = UDim.new(0, 4)})
regTheme(Container, function() Container.BackgroundColor3 = Theme.ElementBG end)
table.insert(WindowObj.ElementsList, {Name = ElementName, Frame = Container, Tab = ParentTab})
local labelBounds = TextService:GetTextSize(ElementName, 13, Enum.Font.GothamMedium, Vector2.new(1000, 36))
local LabelText = createInstance('TextLabel', {
Parent = Container,
BackgroundTransparency = 1,
Position = UDim2.new(0, 12, 0, 0),
Size = UDim2.new(0, labelBounds.X + 5, 1, 0),
Font = Enum.Font.GothamMedium,
Text = ElementName,
TextColor3 = Theme.TextSub,
TextSize = 13,
TextXAlignment = Enum.TextXAlignment.Left
})
regTheme(LabelText, function() LabelText.TextColor3 = Theme.TextSub end)
local ValBox = createInstance('Frame', {
Parent = Container,
BackgroundColor3 = Color3.fromRGB(35, 35, 35),
AnchorPoint = Vector2.new(1, 0.5),
Position = UDim2.new(1, -6, 0.5, 0),
Size = UDim2.new(0, 40, 0, 22)
})
createInstance('UICorner', {Parent = ValBox, CornerRadius = UDim.new(0, 4)})
regTheme(ValBox, function() ValBox.BackgroundColor3 = Theme.MainBG end)
local ValBoxStroke = createInstance('UIStroke', {Parent = ValBox, Color = Theme.Border})
regTheme(ValBoxStroke, function() ValBoxStroke.Color = Theme.Border end)
local ValTextBox = createInstance('TextBox', {
Parent = ValBox,
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 1, 0),
Font = Enum.Font.Gotham,
Text = tostring(Default) .. Suffix,
TextColor3 = Theme.TextSub,
TextSize = 11,
ClearTextOnFocus = false
})
regTheme(ValTextBox, function() ValTextBox.TextColor3 = Theme.TextSub end)
local sliderStartOffset = 12 + labelBounds.X + 15
local sliderEndPadding = 6 + 40 + 15
local TrackBox = createInstance('ImageButton', {
Parent = Container,
BackgroundColor3 = Color3.fromRGB(45, 45, 45),
AnchorPoint = Vector2.new(0, 0.5),
Position = UDim2.new(0, sliderStartOffset, 0.5, 0),
Size = UDim2.new(1, -(sliderStartOffset + sliderEndPadding), 0, 6),
AutoButtonColor = false,
Image = ''
})
createInstance('UICorner', {Parent = TrackBox, CornerRadius = UDim.new(1, 0)})
regTheme(TrackBox, function() TrackBox.BackgroundColor3 = Theme.DropdownListStroke end)
local FillBox = createInstance('Frame', {
Parent = TrackBox,
BackgroundColor3 = Theme.Accent,
Size = UDim2.new((Default - Min) / (Max - Min), 0, 1, 0)
})
createInstance('UICorner', {Parent = FillBox, CornerRadius = UDim.new(1, 0)})
regTheme(FillBox, function() FillBox.BackgroundColor3 = Theme.Accent end)
SetupTooltip(Container, options.Tip)
local SetValue = function(val)
val = math.clamp(val, Min, Max)
val = math.floor((val / Increment) + 0.5) * Increment
local percent = (val - Min) / (Max - Min)
TweenService:Create(FillBox, TweenInfo.new(0.15, Enum.EasingStyle.Quad), {Size = UDim2.new(percent, 0, 1, 0)}):Play()
ValTextBox.Text = tostring(val) .. Suffix
Element.Value = val
AkenaLib.Flags[ElementName].Value = val
Callback(val)
end
local UpdateSlider = function(input)
local percent = math.clamp((input.Position.X - TrackBox.AbsolutePosition.X) / TrackBox.AbsoluteSize.X, 0, 1)
local value = Min + ((Max - Min) * percent)
SetValue(value)
end
local dragging = false
TrackBox.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
dragging = true
UpdateSlider(input)
end
end)
UserInputService.InputEnded:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = false end
end)
UserInputService.InputChanged:Connect(function(input)
if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then UpdateSlider(input) end
end)
ValTextBox.FocusLost:Connect(function()
local numStr = string.match(ValTextBox.Text, '^%-?%d+%.?%d*')
local num = tonumber(numStr) or Default
SetValue(num)
end)
function Element:Set(val) SetValue(val) end
return Element
end
Builder.CreateToggle = function(self, options)
local ElementName = options.Name or 'Toggle'
local Default = options.Default or false
local Keybind = options.Keybind
local Callback = options.Callback or function() end
local state = Default
local currentBind = Keybind
local Element = { Value = Default }
AkenaLib.Flags[ElementName] = Element
local TogFrame = createInstance('ImageButton', {
Parent = PageTarget,
BackgroundColor3 = Theme.ElementBG,
Size = UDim2.new(1, 0, 0, 36),
AutoButtonColor = false,
Image = ''
})
createInstance('UICorner', {Parent = TogFrame, CornerRadius = UDim.new(0, 4)})
regTheme(TogFrame, function() TogFrame.BackgroundColor3 = Theme.ElementBG end)
table.insert(WindowObj.ElementsList, {Name = ElementName, Frame = TogFrame, Tab = ParentTab})
local TitleLabel = createInstance('TextLabel', {
Parent = TogFrame,
BackgroundTransparency = 1,
Position = UDim2.new(0, 12, 0, 0),
Size = UDim2.new(1, -120, 1, 0),
Font = Enum.Font.GothamMedium,
Text = ElementName,
TextColor3 = Theme.TextSub,
TextSize = 13,
TextXAlignment = Enum.TextXAlignment.Left
})
regTheme(TitleLabel, function()
TitleLabel.TextColor3 = state and Theme.TextMain or Theme.TextSub
end)
local Switch = createInstance('Frame', {
Parent = TogFrame,
BackgroundColor3 = Color3.fromRGB(20, 20, 20),
AnchorPoint = Vector2.new(1, 0.5),
Position = UDim2.new(1, -12, 0.5, 0),
Size = UDim2.new(0, 28, 0, 10)
})
createInstance('UICorner', {Parent = Switch, CornerRadius = UDim.new(1, 0)})
local Knob = createInstance('Frame', {
Parent = Switch,
BackgroundColor3 = state and GetDarkerColor(Theme.Accent, 0.4) or Color3.fromRGB(150, 150, 150),
AnchorPoint = Vector2.new(0, 0.5),
Position = state and UDim2.new(1, -14, 0.5, 0) or UDim2.new(0, -2, 0.5, 0),
Size = UDim2.new(0, 16, 0, 16)
})
createInstance('UICorner', {Parent = Knob, CornerRadius = UDim.new(1, 0)})
regTheme(Switch, function()
if state then
Switch.BackgroundColor3 = GetDarkerColor(Theme.Accent, 0.4)
Knob.BackgroundColor3 = Theme.Accent
else
Switch.BackgroundColor3 = Theme.MainBG
Knob.BackgroundColor3 = Color3.fromRGB(150, 150, 150)
end
end)
SetupTooltip(TogFrame, options.Tip)
local FireToggle = function(skipAnim)
local speed = skipAnim and 0 or 0.2
TweenService:Create(Switch, TweenInfo.new(speed), {BackgroundColor3 = state and GetDarkerColor(Theme.Accent, 0.4) or Theme.MainBG}):Play()
TweenService:Create(Knob, TweenInfo.new(speed), {Position = state and UDim2.new(1, -14, 0.5, 0) or UDim2.new(0, -2, 0.5, 0), BackgroundColor3 = state and Theme.Accent or Color3.fromRGB(150, 150, 150)}):Play()
TweenService:Create(TitleLabel, TweenInfo.new(speed), {TextColor3 = state and Theme.TextMain or Theme.TextSub}):Play()
Element.Value = state
AkenaLib.Flags[ElementName].Value = state
end
FireToggle(true)
TogFrame.MouseButton1Click:Connect(function()
state = not state
Callback(state)
FireToggle(false)
end)
if Keybind then
local BindContainer = createInstance('Frame', {
Parent = TogFrame,
AnchorPoint = Vector2.new(1, 0.5),
Position = UDim2.new(1, -55, 0.5, 0),
Size = UDim2.new(0, 45, 0, 22),
BackgroundColor3 = Color3.fromRGB(35, 35, 35)
})
createInstance('UICorner', {Parent = BindContainer, CornerRadius = UDim.new(0, 4)})
regTheme(BindContainer, function() BindContainer.BackgroundColor3 = Theme.MainBG end)
local BindContainerStroke = createInstance('UIStroke', {Parent = BindContainer, Color = Theme.Border})
regTheme(BindContainerStroke, function() BindContainerStroke.Color = Theme.Border end)
local BindBtn = createInstance('TextButton', {
Parent = BindContainer,
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 1, 0),
Text = currentBind and currentBind.Name or '',
Font = Enum.Font.Gotham,
TextColor3 = Theme.TextSub,
TextSize = 11
})
local UpdateBindSize = function()
local bindName = currentBind and currentBind.Name or 'None'
BindBtn.Text = bindName
local textBounds = TextService:GetTextSize(bindName, 11, Enum.Font.Gotham, Vector2.new(1000, 22))
BindContainer.Size = UDim2.new(0, math.max(textBounds.X + 16, 40), 0, 22)
end
UpdateBindSize()
local isBinding = false
BindBtn.MouseButton1Click:Connect(function()
isBinding = true
BindBtn.Text = '...'
BindContainer.Size = UDim2.new(0, 40, 0, 22)
end)
UserInputService.InputBegan:Connect(function(input, gpe)
if isBinding and (input.UserInputType == Enum.UserInputType.Keyboard or input.UserInputType == Enum.UserInputType.Gamepad1) then
currentBind = input.KeyCode
isBinding = false
UpdateBindSize()
Callback(state)
elseif not gpe and currentBind and input.KeyCode == currentBind then
state = not state
Callback(state)
FireToggle(false)
end
end)
end
function Element:Set(val)
state = val
Callback(state)
FireToggle(true)
end
return Element
end
Builder.CreateDropdown = function(self, options)
local ElementName = options.Name or 'Dropdown'
local DropOptions = options.Options or {}
local Default = options.Default
local MultiSelect = options.MultiSelect or false
local Callback = options.Callback or function() end
local currentSelection
if MultiSelect then
currentSelection = {}
if type(Default) == 'table' then
for i = 1, #Default do
table.insert(currentSelection, getStringValue(Default[i]))
end
elseif type(Default) == 'string' and Default ~= '' then
table.insert(currentSelection, Default)
end
else
if Default ~= nil then
currentSelection = type(Default) == 'table' and tostring(Default or '') or tostring(Default)
else
currentSelection = type(DropOptions) == 'table' and tostring(DropOptions or '') or ''
end
if type(currentSelection) == 'table' then currentSelection = 'None' end
end
local Element = { Value = currentSelection }
AkenaLib.Flags[ElementName] = Element
local Container = createInstance('ImageButton', {
Parent = PageTarget,
BackgroundColor3 = Theme.ElementBG,
Size = UDim2.new(1, 0, 0, 36),
AutoButtonColor = false,
Image = ''
})
createInstance('UICorner', {Parent = Container, CornerRadius = UDim.new(0, 4)})
regTheme(Container, function() Container.BackgroundColor3 = Theme.ElementBG end)
table.insert(WindowObj.ElementsList, {Name = ElementName, Frame = Container, Tab = ParentTab})
local TitleLabel = createInstance('TextLabel', {
Parent = Container,
BackgroundTransparency = 1,
Position = UDim2.new(0, 12, 0, 0),
Size = UDim2.new(1, -120, 1, 0),
Font = Enum.Font.GothamMedium,
Text = ElementName,
TextColor3 = Theme.TextSub,
TextSize = 13,
TextXAlignment = Enum.TextXAlignment.Left
})
regTheme(TitleLabel, function() TitleLabel.TextColor3 = Theme.TextSub end)
local SelectedBox = createInstance('Frame', {
Parent = Container,
BackgroundColor3 = Color3.fromRGB(22, 22, 22),
AnchorPoint = Vector2.new(1, 0.5),
Position = UDim2.new(1, -6, 0.5, 0),
Size = UDim2.new(0, 100, 0, 24)
})
createInstance('UICorner', {Parent = SelectedBox, CornerRadius = UDim.new(0, 4)})
regTheme(SelectedBox, function() SelectedBox.BackgroundColor3 = Theme.MainBG end)
local SelectedBoxStroke = createInstance('UIStroke', {Parent = SelectedBox, Color = Theme.Border})
regTheme(SelectedBoxStroke, function() SelectedBoxStroke.Color = Theme.Border end)
local SelectedLabel = createInstance('TextLabel', {
Parent = SelectedBox,
BackgroundTransparency = 1,
Size = UDim2.new(1, -20, 1, 0),
Position = UDim2.new(0, 8, 0, 0),
Font = Enum.Font.Gotham,
TextColor3 = Theme.TextMain,
TextSize = 11,
TextXAlignment = Enum.TextXAlignment.Left,
TextTruncate = Enum.TextTruncate.AtEnd
})
regTheme(SelectedLabel, function() SelectedLabel.TextColor3 = Theme.TextMain end)
local UpdateLabel = function()
if MultiSelect then
SelectedLabel.Text = #currentSelection > 0 and table.concat(currentSelection, ', ') or 'None'
else
SelectedLabel.Text = (currentSelection == '' or currentSelection == nil) and 'None' or tostring(currentSelection)
end
end
UpdateLabel()
local Icon = createInstance('TextLabel', {
Parent = SelectedBox,
BackgroundTransparency = 1,
AnchorPoint = Vector2.new(1, 0.5),
Position = UDim2.new(1, -5, 0.5, 0),
Size = UDim2.new(0, 16, 0, 16),
Font = Enum.Font.Gotham,
Text = '+',
TextColor3 = Theme.TextSub,
TextSize = 16
})
regTheme(Icon, function() Icon.TextColor3 = Theme.TextSub end)
local ListCanvas = createInstance('CanvasGroup', {
Parent = ScreenGui,
BackgroundTransparency = 1,
ZIndex = 100,
Size = UDim2.new(0, 0, 0, 0),
GroupTransparency = 1,
Visible = false
})
local LCScale = createInstance('UIScale', {Parent = ListCanvas, Scale = CurrentScale})
table.insert(ScalesToUpdate, LCScale)
createInstance('UICorner', {Parent = ListCanvas, CornerRadius = UDim.new(0, 4)})
local ListFrame = createInstance('ScrollingFrame', {
Parent = ListCanvas,
BackgroundColor3 = Theme.DropdownListBG,
Size = UDim2.new(1, 0, 1, 0),
ZIndex = 100,
ScrollBarThickness = 2,
BorderSizePixel = 0,
AutomaticCanvasSize = Enum.AutomaticSize.Y
})
local ListFrameStroke = createInstance('UIStroke', {Parent = ListFrame, Color = Theme.DropdownListStroke})
regTheme(ListFrame, function()
ListFrame.BackgroundColor3 = Theme.DropdownListBG
ListFrameStroke.Color = Theme.DropdownListStroke
end)
local CanvasLayout = createInstance('Frame', {
Parent = ListFrame,
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 0, 0),
AutomaticSize = Enum.AutomaticSize.Y
})
createInstance('UIListLayout', {Parent = CanvasLayout, SortOrder = Enum.SortOrder.LayoutOrder})
SetupTooltip(Container, options.Tip)
local expanded = false
local OptionsRendered = {}
local RefreshOptions = function()
local cList = CanvasLayout:GetChildren()
for i = 1, #cList do
local v = cList[i]
if v:IsA('TextButton') then v:Destroy() end
end
table.clear(OptionsRendered)
for i = 1, #DropOptions do
local strOpt = tostring(DropOptions[i])
local Option = createInstance('TextButton', {
Parent = CanvasLayout,
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 0, 26),
Text = '',
ZIndex = 101
})
local isSel = false
if MultiSelect then
isSel = table.find(currentSelection, strOpt) ~= nil
else
isSel = currentSelection == strOpt
end
local OptCheck = createInstance('ImageLabel', {
Parent = Option,
BackgroundTransparency = 1,
Position = isSel and UDim2.new(0, 8, 0.5, -7) or UDim2.new(0, 0, 0.5, -7),
Size = UDim2.new(0, 14, 0, 14),
Image = 'rbxassetid://6031094667',
ImageColor3 = Theme.TextMain,
ImageTransparency = isSel and 0 or 1,
ZIndex = 101
})
regTheme(OptCheck, function() OptCheck.ImageColor3 = Theme.TextMain end)
local OptText = createInstance('TextLabel', {
Parent = Option,
BackgroundTransparency = 1,
Size = UDim2.new(1, -30, 1, 0),
Position = UDim2.new(0, 28, 0, 0),
Font = Enum.Font.GothamMedium,
Text = strOpt,
TextColor3 = isSel and Theme.TextMain or Theme.TextSub,
TextSize = 13,
TextXAlignment = Enum.TextXAlignment.Left,
ZIndex = 101
})
table.insert(OptionsRendered, {
Value = strOpt,
Text = OptText,
Check = OptCheck,
Button = Option
})
Option.MouseEnter:Connect(function()
TweenService:Create(OptText, TweenInfo.new(0.2), {TextColor3 = Theme.TextMain}):Play()
end)
Option.MouseLeave:Connect(function()
local active = false
if MultiSelect then active = table.find(currentSelection, strOpt) ~= nil else active = currentSelection == strOpt end
TweenService:Create(OptText, TweenInfo.new(0.2), {TextColor3 = active and Theme.TextMain or Theme.TextSub}):Play()
end)
Option.MouseButton1Click:Connect(function()
if MultiSelect then
local idx = table.find(currentSelection, strOpt)
if idx then
table.remove(currentSelection, idx)
OptText.TextColor3 = Theme.TextSub
TweenService:Create(OptCheck, TweenInfo.new(0.3, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {Position = UDim2.new(0, 0, 0.5, -7), ImageTransparency = 1}):Play()
else
table.insert(currentSelection, strOpt)
OptText.TextColor3 = Theme.TextMain
TweenService:Create(OptCheck, TweenInfo.new(0.3, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {Position = UDim2.new(0, 8, 0.5, -7), ImageTransparency = 0}):Play()
end
else
currentSelection = strOpt
expanded = false
TweenService:Create(Icon, TweenInfo.new(0.3), {Rotation = 0}):Play()
TweenService:Create(ListCanvas, TweenInfo.new(0.3, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {Size = UDim2.new(0, SelectedBox.AbsoluteSize.X, 0, 0), GroupTransparency = 1}):Play()
task.delay(0.3, function() if not expanded then ListCanvas.Visible = false end end)
for k = 1, #OptionsRendered do
local renderData = OptionsRendered[k]
if renderData.Value == strOpt then
renderData.Text.TextColor3 = Theme.TextMain
TweenService:Create(renderData.Check, TweenInfo.new(0.3, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {Position = UDim2.new(0, 8, 0.5, -7), ImageTransparency = 0}):Play()
else
renderData.Text.TextColor3 = Theme.TextSub
TweenService:Create(renderData.Check, TweenInfo.new(0.3, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {Position = UDim2.new(0, 0, 0.5, -7), ImageTransparency = 1}):Play()
end
end
end
UpdateLabel()
Element.Value = currentSelection
AkenaLib.Flags[ElementName].Value = currentSelection
Callback(currentSelection)
end)
end
ListFrame.CanvasSize = UDim2.new(0, 0, 0, #DropOptions * 26)
end
RefreshOptions()
Container.MouseButton1Click:Connect(function()
expanded = not expanded
if expanded then
RefreshOptions()
ListCanvas.Position = UDim2.new(0, SelectedBox.AbsolutePosition.X, 0, SelectedBox.AbsolutePosition.Y + (28 * CurrentScale))
local dropHeight = math.min(#DropOptions * 26, 150)
ListCanvas.Size = UDim2.new(0, SelectedBox.AbsoluteSize.X, 0, 0)
ListCanvas.GroupTransparency = 1
ListCanvas.Visible = true
TweenService:Create(ListCanvas, TweenInfo.new(0.3, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {Size = UDim2.new(0, SelectedBox.AbsoluteSize.X, 0, dropHeight), GroupTransparency = 0}):Play()
else
TweenService:Create(ListCanvas, TweenInfo.new(0.3, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {Size = UDim2.new(0, SelectedBox.AbsoluteSize.X, 0, 0), GroupTransparency = 1}):Play()
task.delay(0.3, function() if not expanded then ListCanvas.Visible = false end end)
end
TweenService:Create(Icon, TweenInfo.new(0.3), {Rotation = expanded and 45 or 0}):Play()
end)
UserInputService.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
local pos = input.Position
if expanded and ListCanvas.Visible then
local x1 = ListCanvas.AbsolutePosition.X
local y1 = ListCanvas.AbsolutePosition.Y
local x2 = x1 + ListCanvas.AbsoluteSize.X
local y2 = y1 + ListCanvas.AbsoluteSize.Y
local cx1 = Container.AbsolutePosition.X
local cy1 = Container.AbsolutePosition.Y
local cx2 = cx1 + Container.AbsoluteSize.X
local cy2 = cy1 + Container.AbsoluteSize.Y
if not (pos.X >= x1 and pos.X <= x2 and pos.Y >= y1 and pos.Y <= y2) and not (pos.X >= cx1 and pos.X <= cx2 and pos.Y >= cy1 and pos.Y <= cy2) then
expanded = false
TweenService:Create(ListCanvas, TweenInfo.new(0.3, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {Size = UDim2.new(0, SelectedBox.AbsoluteSize.X, 0, 0), GroupTransparency = 1}):Play()
TweenService:Create(Icon, TweenInfo.new(0.3), {Rotation = 0}):Play()
task.delay(0.3, function() if not expanded then ListCanvas.Visible = false end end)
end
end
end
end)
function Element:Set(val)
if MultiSelect then
currentSelection = type(val) == 'table' and val or {}
else
currentSelection = getStringValue(val)
end
if type(currentSelection) == 'table' then currentSelection = 'None' end
UpdateLabel()
Element.Value = currentSelection
AkenaLib.Flags[ElementName].Value = currentSelection
RefreshOptions()
Callback(currentSelection)
end
function Element:Refresh(newOptions)
DropOptions = type(newOptions) == 'table' and newOptions or {}
if MultiSelect then
local newSel = {}
for i = 1, #currentSelection do
local v = currentSelection[i]
if table.find(DropOptions, v) then table.insert(newSel, v) end
end
currentSelection = newSel
else
if not table.find(DropOptions, currentSelection) then
currentSelection = getStringValue(DropOptions)
end
end
if type(currentSelection) == 'table' then currentSelection = 'None' end
UpdateLabel()
Element.Value = currentSelection
AkenaLib.Flags[ElementName].Value = currentSelection
RefreshOptions()
end
return Element
end
Builder.CreateColorpicker = function(self, options)
local ElementName = options.Name or 'Colorpicker'
local Default = options.Default or Color3.fromRGB(255, 255, 255)
local Callback = options.Callback or function() end
local Element = { Value = Default }
AkenaLib.Flags[ElementName] = Element
local currentColor = Default
local h, s, v = Color3.toHSV(currentColor)
local Container = createInstance('ImageButton', {
Parent = PageTarget,
BackgroundColor3 = Theme.ElementBG,
Size = UDim2.new(1, 0, 0, 36),
AutoButtonColor = false,
Image = ''
})
createInstance('UICorner', {Parent = Container, CornerRadius = UDim.new(0, 4)})
regTheme(Container, function() Container.BackgroundColor3 = Theme.ElementBG end)
table.insert(WindowObj.ElementsList, {Name = ElementName, Frame = Container, Tab = ParentTab})
local TitleLabel = createInstance('TextLabel', {
Parent = Container,
BackgroundTransparency = 1,
Position = UDim2.new(0, 12, 0, 0),
Size = UDim2.new(1, -120, 1, 0),
Font = Enum.Font.GothamMedium,
Text = ElementName,
TextColor3 = Theme.TextSub,
TextSize = 13,
TextXAlignment = Enum.TextXAlignment.Left
})
regTheme(TitleLabel, function() TitleLabel.TextColor3 = Theme.TextSub end)
local ColorView = createInstance('Frame', {
Parent = Container,
BackgroundColor3 = currentColor,
AnchorPoint = Vector2.new(1, 0.5),
Position = UDim2.new(1, -6, 0.5, 0),
Size = UDim2.new(0, 40, 0, 20)
})
createInstance('UICorner', {Parent = ColorView, CornerRadius = UDim.new(0, 4)})
local ColorViewStroke = createInstance('UIStroke', {Parent = ColorView, Color = Theme.Border})
regTheme(ColorViewStroke, function() ColorViewStroke.Color = Theme.Border end)
local FloatPicker = createInstance('Frame', {
Parent = ScreenGui,
BackgroundColor3 = Color3.fromRGB(25, 25, 25),
Size = UDim2.new(0, 180, 0, 190),
ZIndex = 100,
Visible = false
})
local FloatPickerScale = createInstance('UIScale', {Parent = FloatPicker, Scale = CurrentScale})
table.insert(ScalesToUpdate, FloatPickerScale)
createInstance('UICorner', {Parent = FloatPicker, CornerRadius = UDim.new(0, 6)})
local FloatPickerStroke = createInstance('UIStroke', {Parent = FloatPicker, Color = Theme.Border})
regTheme(FloatPickerStroke, function() FloatPickerStroke.Color = Theme.Border end)
regTheme(FloatPicker, function() FloatPicker.BackgroundColor3 = Theme.ElementBG end)
local SatValMap = createInstance('ImageButton', {
Parent = FloatPicker,
BackgroundColor3 = Color3.fromHSV(h, 1, 1),
Position = UDim2.new(0, 10, 0, 10),
Size = UDim2.new(0, 130, 0, 130),
Image = 'rbxassetid://4155801252',
AutoButtonColor = false
})
createInstance('UICorner', {Parent = SatValMap, CornerRadius = UDim.new(0, 4)})
local SVKnob = createInstance('Frame', {
Parent = SatValMap,
BackgroundColor3 = Color3.fromRGB(255, 255, 255),
Size = UDim2.new(0, 4, 0, 4),
AnchorPoint = Vector2.new(0.5, 0.5),
Position = UDim2.new(s, 0, 1 - v, 0)
})
createInstance('UICorner', {Parent = SVKnob, CornerRadius = UDim.new(1, 0)})
createInstance('UIStroke', {Parent = SVKnob, Color = Color3.fromRGB(0, 0, 0)})
local HueMap = createInstance('ImageButton', {
Parent = FloatPicker,
Position = UDim2.new(0, 150, 0, 10),
Size = UDim2.new(0, 20, 0, 130),
BackgroundColor3 = Color3.fromRGB(255, 255, 255),
AutoButtonColor = false,
Image = ''
})
createInstance('UICorner', {Parent = HueMap, CornerRadius = UDim.new(0, 4)})
createInstance('UIGradient', {
Parent = HueMap,
Color = ColorSequence.new({
ColorSequenceKeypoint.new(0, Color3.fromRGB(255, 0, 0)),
ColorSequenceKeypoint.new(0.167, Color3.fromRGB(255, 255, 0)),
ColorSequenceKeypoint.new(0.333, Color3.fromRGB(0, 255, 0)),
ColorSequenceKeypoint.new(0.5, Color3.fromRGB(0, 255, 255)),
ColorSequenceKeypoint.new(0.667, Color3.fromRGB(0, 0, 255)),
ColorSequenceKeypoint.new(0.833, Color3.fromRGB(255, 0, 255)),
ColorSequenceKeypoint.new(1, Color3.fromRGB(255, 0, 0))
}),
Rotation = 90
})
local HueKnob = createInstance('Frame', {
Parent = HueMap,
BackgroundColor3 = Color3.fromRGB(255, 255, 255),
Size = UDim2.new(1, 4, 0, 4),
AnchorPoint = Vector2.new(0.5, 0.5),
Position = UDim2.new(0.5, 0, 1 - h, 0)
})
createInstance('UIStroke', {Parent = HueKnob, Color = Color3.fromRGB(0, 0, 0)})
local HexBox = createInstance('TextBox', {
Parent = FloatPicker,
Position = UDim2.new(0, 10, 0, 150),
Size = UDim2.new(0, 75, 0, 24),
BackgroundColor3 = Color3.fromRGB(35, 35, 35),
TextColor3 = Color3.fromRGB(255, 255, 255),
Font = Enum.Font.Gotham,
TextSize = 11,
Text = currentColor:ToHex(),
ClearTextOnFocus = false
})
createInstance('UICorner', {Parent = HexBox, CornerRadius = UDim.new(0, 4)})
regTheme(HexBox, function() HexBox.BackgroundColor3 = Theme.MainBG end)
local RGBBox = createInstance('TextBox', {
Parent = FloatPicker,
Position = UDim2.new(0, 95, 0, 150),
Size = UDim2.new(0, 75, 0, 24),
BackgroundColor3 = Color3.fromRGB(35, 35, 35),
TextColor3 = Color3.fromRGB(255, 255, 255),
Font = Enum.Font.Gotham,
TextSize = 11,
Text = math.floor(currentColor.R*255)..', '..math.floor(currentColor.G*255)..', '..math.floor(currentColor.B*255),
ClearTextOnFocus = false
})
createInstance('UICorner', {Parent = RGBBox, CornerRadius = UDim.new(0, 4)})
regTheme(RGBBox, function() RGBBox.BackgroundColor3 = Theme.MainBG end)
SetupTooltip(Container, options.Tip)
local UpdateColor = function()
currentColor = Color3.fromHSV(h, s, v)
ColorView.BackgroundColor3 = currentColor
SatValMap.BackgroundColor3 = Color3.fromHSV(h, 1, 1)
HexBox.Text = currentColor:ToHex()
RGBBox.Text = math.floor(currentColor.R*255)..', '..math.floor(currentColor.G*255)..', '..math.floor(currentColor.B*255)
Element.Value = currentColor
AkenaLib.Flags[ElementName].Value = currentColor
Callback(currentColor)
end
HexBox.FocusLost:Connect(function()
local success, color = pcall(function() return Color3.fromHex(HexBox.Text) end)
if success then
currentColor = color
h, s, v = Color3.toHSV(currentColor)
SVKnob.Position = UDim2.new(s, 0, 1 - v, 0)
HueKnob.Position = UDim2.new(0.5, 0, 1 - h, 0)
UpdateColor()
else
HexBox.Text = currentColor:ToHex()
end
end)
RGBBox.FocusLost:Connect(function()
local r, g, b = RGBBox.Text:match('(%d+)[%s,]+(%d+)[%s,]+(%d+)')
if r and g and b then
currentColor = Color3.fromRGB(tonumber(r), tonumber(g), tonumber(b))
h, s, v = Color3.toHSV(currentColor)
SVKnob.Position = UDim2.new(s, 0, 1 - v, 0)
HueKnob.Position = UDim2.new(0.5, 0, 1 - h, 0)
UpdateColor()
else
RGBBox.Text = math.floor(currentColor.R*255)..', '..math.floor(currentColor.G*255)..', '..math.floor(currentColor.B*255)
end
end)
local draggingSV = false
SatValMap.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then draggingSV = true end
end)
local draggingHue = false
HueMap.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then draggingHue = true end
end)
UserInputService.InputEnded:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
draggingSV = false
draggingHue = false
end
end)
UserInputService.InputChanged:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then
if draggingSV then
local pctX = math.clamp((input.Position.X - SatValMap.AbsolutePosition.X) / SatValMap.AbsoluteSize.X, 0, 1)
local pctY = math.clamp((input.Position.Y - SatValMap.AbsolutePosition.Y) / SatValMap.AbsoluteSize.Y, 0, 1)
s = pctX
v = 1 - pctY
SVKnob.Position = UDim2.new(s, 0, 1 - v, 0)
UpdateColor()
elseif draggingHue then
local pctY = math.clamp((input.Position.Y - HueMap.AbsolutePosition.Y) / HueMap.AbsoluteSize.Y, 0, 1)
h = 1 - pctY
HueKnob.Position = UDim2.new(0.5, 0, 1 - h, 0)
UpdateColor()
end
end
end)
Container.MouseButton1Click:Connect(function()
FloatPicker.Position = UDim2.new(0, ColorView.AbsolutePosition.X - (140 * CurrentScale), 0, ColorView.AbsolutePosition.Y + (28 * CurrentScale))
FloatPicker.Visible = not FloatPicker.Visible
end)
UserInputService.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
local pos = input.Position
if FloatPicker.Visible then
local x1, y1 = FloatPicker.AbsolutePosition.X, FloatPicker.AbsolutePosition.Y
local x2, y2 = x1 + FloatPicker.AbsoluteSize.X, y1 + FloatPicker.AbsoluteSize.Y
local cx1, cy1 = Container.AbsolutePosition.X, Container.AbsolutePosition.Y
local cx2, cy2 = cx1 + Container.AbsoluteSize.X, cy1 + Container.AbsoluteSize.Y
if not (pos.X >= x1 and pos.X <= x2 and pos.Y >= y1 and pos.Y <= y2) and not (pos.X >= cx1 and pos.X <= cx2 and pos.Y >= cy1 and pos.Y <= cy2) then
FloatPicker.Visible = false
end
end
end
end)
function Element:Set(val)
currentColor = val
h, s, v = Color3.toHSV(currentColor)
SVKnob.Position = UDim2.new(s, 0, 1 - v, 0)
HueKnob.Position = UDim2.new(0.5, 0, 1 - h, 0)
UpdateColor()
end
return Element
end
Builder.CreateKeybind = function(self, options)
local ElementName = options.Name or 'Keybind'
local Default = options.Default or Enum.KeyCode.E
local Callback = options.Callback or function() end
local currentBind = Default
local Element = { Value = currentBind }
AkenaLib.Flags[ElementName] = Element
local BindFrame = createInstance('Frame', {
Parent = PageTarget,
BackgroundColor3 = Theme.ElementBG,
Size = UDim2.new(1, 0, 0, 36)
})
createInstance('UICorner', {Parent = BindFrame, CornerRadius = UDim.new(0, 4)})
regTheme(BindFrame, function() BindFrame.BackgroundColor3 = Theme.ElementBG end)
table.insert(WindowObj.ElementsList, {Name = ElementName, Frame = BindFrame, Tab = ParentTab})
local TitleLabel = createInstance('TextLabel', {
Parent = BindFrame,
BackgroundTransparency = 1,
Position = UDim2.new(0, 12, 0, 0),
Size = UDim2.new(1, -120, 1, 0),
Font = Enum.Font.GothamMedium,
Text = ElementName,
TextColor3 = Theme.TextSub,
TextSize = 13,
TextXAlignment = Enum.TextXAlignment.Left
})
regTheme(TitleLabel, function() TitleLabel.TextColor3 = Theme.TextSub end)
local BindContainer = createInstance('Frame', {
Parent = BindFrame,
AnchorPoint = Vector2.new(1, 0.5),
Position = UDim2.new(1, -6, 0.5, 0),
Size = UDim2.new(0, 60, 0, 22),
BackgroundColor3 = Color3.fromRGB(35, 35, 35)
})
createInstance('UICorner', {Parent = BindContainer, CornerRadius = UDim.new(0, 4)})
regTheme(BindContainer, function() BindContainer.BackgroundColor3 = Theme.MainBG end)
local BindContainerStroke = createInstance('UIStroke', {Parent = BindContainer, Color = Theme.Border})
regTheme(BindContainerStroke, function() BindContainerStroke.Color = Theme.Border end)
local BindBtn = createInstance('TextButton', {
Parent = BindContainer,
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 1, 0),
Text = currentBind.Name,
Font = Enum.Font.Gotham,
TextColor3 = Theme.TextSub,
TextSize = 11
})
SetupTooltip(BindFrame, options.Tip)
local UpdateBindSize = function()
local bindName = currentBind and currentBind.Name or 'None'
BindBtn.Text = bindName
local textBounds = TextService:GetTextSize(bindName, 11, Enum.Font.Gotham, Vector2.new(1000, 22))
BindContainer.Size = UDim2.new(0, math.max(textBounds.X + 16, 40), 0, 22)
end
UpdateBindSize()
local isBinding = false
BindBtn.MouseButton1Click:Connect(function()
isBinding = true
BindBtn.Text = '...'
BindContainer.Size = UDim2.new(0, 40, 0, 22)
end)
UserInputService.InputBegan:Connect(function(input, gpe)
if isBinding and (input.UserInputType == Enum.UserInputType.Keyboard or input.UserInputType == Enum.UserInputType.Gamepad1) then
currentBind = input.KeyCode
isBinding = false
UpdateBindSize()
Element.Value = currentBind
AkenaLib.Flags[ElementName].Value = currentBind
Callback(currentBind)
end
end)
function Element:Set(val)
currentBind = val
UpdateBindSize()
Element.Value = currentBind
AkenaLib.Flags[ElementName].Value = currentBind
Callback(currentBind)
end
return Element
end
return setmetatable(Builder, {__index = Builder})
end
local HomeBody = MasterContainers['Home']
local Sidebar = createInstance('ScrollingFrame', {
Parent = HomeBody,
BackgroundTransparency = 1,
Size = UDim2.new(0, 160, 1, 0),
BorderSizePixel = 0,
ScrollBarThickness = 0,
AutomaticCanvasSize = Enum.AutomaticSize.Y,
CanvasSize = UDim2.new(0, 0, 0, 0)
})
createInstance('UIListLayout', {
Parent = Sidebar,
SortOrder = Enum.SortOrder.LayoutOrder,
Padding = UDim.new(0, 4)
})
createInstance('UIPadding', {
Parent = Sidebar,
PaddingTop = UDim.new(0, 10),
PaddingLeft = UDim.new(0, 8),
PaddingRight = UDim.new(0, 8)
})
local ContentContainer = createInstance('Frame', {
Parent = HomeBody,
BackgroundTransparency = 1,
Position = UDim2.new(0, 160, 0, 0),
Size = UDim2.new(1, -160, 1, 0)
})
WindowObj.CreateTab = function(self, options)
local TabName = options.Name or 'Tab'
local TabIconId = options.Icon or 'rbxassetid://6034502844'
local TabBtn = createInstance('ImageButton', {
Parent = Sidebar,
BackgroundColor3 = Color3.fromRGB(255, 255, 255),
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 0, 38),
AutoButtonColor = false,
Image = ''
})
createInstance('UICorner', {Parent = TabBtn, CornerRadius = UDim.new(0, 4)})
local TabGradient = createInstance('UIGradient', {
Parent = TabBtn,
Color = ColorSequence.new(Theme.Accent),
Offset = Vector2.new(-1, 0),
Transparency = NumberSequence.new({
NumberSequenceKeypoint.new(0, 0.86),
NumberSequenceKeypoint.new(0.6, 1),
NumberSequenceKeypoint.new(1, 1)
})
})
regTheme(TabGradient, function()
TabGradient.Color = ColorSequence.new(Theme.Accent)
end)
local IconImg = createInstance('ImageLabel', {
Parent = TabBtn,
BackgroundTransparency = 1,
Position = UDim2.new(0, 12, 0.5, -9),
Size = UDim2.new(0, 18, 0, 18),
Image = TabIconId,
ImageColor3 = Theme.TextSub
})
local TextLabel = createInstance('TextLabel', {
Parent = TabBtn,
BackgroundTransparency = 1,
Position = UDim2.new(0, 40, 0, 0),
Size = UDim2.new(1, -40, 1, 0),
Font = Enum.Font.GothamMedium,
Text = TabName,
TextColor3 = Theme.TextSub,
TextSize = 13,
TextXAlignment = Enum.TextXAlignment.Left
})
TabBtn.MouseEnter:Connect(function()
if WindowObj.CurrentTab ~= TabName then
TweenService:Create(TextLabel, TweenInfo.new(0.2), {TextColor3 = Color3.fromRGB(210, 210, 210)}):Play()
TweenService:Create(IconImg, TweenInfo.new(0.2), {ImageColor3 = Color3.fromRGB(210, 210, 210)}):Play()
end
end)
TabBtn.MouseLeave:Connect(function()
if WindowObj.CurrentTab ~= TabName then
TweenService:Create(TextLabel, TweenInfo.new(0.2), {TextColor3 = Theme.TextSub}):Play()
TweenService:Create(IconImg, TweenInfo.new(0.2), {ImageColor3 = Theme.TextSub}):Play()
end
end)
local PageGroup = createInstance('CanvasGroup', {
Parent = ContentContainer,
Size = UDim2.new(1, 0, 1, 0),
Position = UDim2.new(0, 50, 0, 0),
BackgroundTransparency = 1,
GroupTransparency = 1,
BorderSizePixel = 0,
Visible = false
})
local Page = createInstance('ScrollingFrame', {
Parent = PageGroup,
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 1, 0),
ScrollBarThickness = 2,
ScrollBarImageColor3 = Theme.Border,
BorderSizePixel = 0,
AutomaticCanvasSize = Enum.AutomaticSize.Y,
CanvasSize = UDim2.new(0, 0, 0, 0)
})
regTheme(Page, function() Page.ScrollBarImageColor3 = Theme.Border end)
createInstance('UIPadding', {
Parent = Page,
PaddingTop = UDim.new(0, 15),
PaddingLeft = UDim.new(0, 20),
PaddingRight = UDim.new(0, 20)
})
createInstance('UIListLayout', {
Parent = Page,
SortOrder = Enum.SortOrder.LayoutOrder,
Padding = UDim.new(0, 8)
})
local TabObj = { Name = TabName, Page = Page, Select = nil }
local Builder = CreateElementBuilder(Page, TabObj)
TabObj.Select = function()
if WindowObj.CurrentTab == TabObj.Name then return end
if WindowObj.CurrentTab then
WindowObj.CurrentTab.Unselect()
end
WindowObj.CurrentTab = TabObj
PageGroup.Visible = true
PageGroup.Position = UDim2.new(0, 50, 0, 0)
PageGroup.GroupTransparency = 1
TweenService:Create(PageGroup, TweenInfo.new(0.65, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {Position = UDim2.new(0, 0, 0, 0), GroupTransparency = 0}):Play()
TweenService:Create(TabBtn, TweenInfo.new(0.2), {BackgroundTransparency = 0}):Play()
TweenService:Create(TabGradient, TweenInfo.new(0.45, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {Offset = Vector2.new(0, 0)}):Play()
TweenService:Create(TextLabel, TweenInfo.new(0.2), {TextColor3 = Theme.TextMain}):Play()
TweenService:Create(IconImg, TweenInfo.new(0.2), {ImageColor3 = Theme.TextMain}):Play()
end
TabObj.Unselect = function()
TweenService:Create(PageGroup, TweenInfo.new(0.65, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {Position = UDim2.new(0, -50, 0, 0), GroupTransparency = 1}):Play()
task.delay(0.65, function() if WindowObj.CurrentTab ~= TabObj then PageGroup.Visible = false end end)
TweenService:Create(TabGradient, TweenInfo.new(0.45, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {Offset = Vector2.new(-1, 0)}):Play()
TweenService:Create(TabBtn, TweenInfo.new(0.2), {BackgroundTransparency = 1}):Play()
TweenService:Create(TextLabel, TweenInfo.new(0.2), {TextColor3 = Theme.TextSub}):Play()
TweenService:Create(IconImg, TweenInfo.new(0.2), {ImageColor3 = Theme.TextSub}):Play()
end
TabBtn.MouseButton1Click:Connect(TabObj.Select)
if #WindowObj.Tabs == 0 then TabObj.Select() end
table.insert(WindowObj.Tabs, TabObj)
return setmetatable(TabObj, {__index = Builder})
end
local MakeSubTabElements = function(TabName)
local parentGrp = MasterContainers[TabName]
local Page = createInstance('ScrollingFrame', {
Parent = parentGrp,
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 1, 0),
ScrollBarThickness = 2,
ScrollBarImageColor3 = Theme.Border,
BorderSizePixel = 0,
AutomaticCanvasSize = Enum.AutomaticSize.Y,
CanvasSize = UDim2.new(0, 0, 0, 0)
})
createInstance('UIPadding', {
Parent = Page,
PaddingTop = UDim.new(0, 15),
PaddingLeft = UDim.new(0, 20),
PaddingRight = UDim.new(0, 20)
})
createInstance('UIListLayout', {
Parent = Page,
SortOrder = Enum.SortOrder.LayoutOrder,
Padding = UDim.new(0, 8)
})
regTheme(Page, function() Page.ScrollBarImageColor3 = Theme.Border end)
return CreateElementBuilder(Page, {Name = TabName, Page = Page, Select = function()
if activeSubTab ~= TabName then
local btn = SubTabs:FindFirstChild(TabName .. 'Tab')
if btn then
local subChildren = SubTabs:GetChildren()
for i = 1, #subChildren do
local child = subChildren[i]
if child:IsA('ImageButton') and child.Name ~= TabName .. 'Tab' then
TweenService:Create(child.TextLabel, TweenInfo.new(0.2), {TextColor3 = Theme.TextSub}):Play()
TweenService:Create(child.Frame, TweenInfo.new(0.2), {Size = UDim2.new(0, 0, 0, 2), BackgroundTransparency = 1}):Play()
local oc = MasterContainers[child.Name:gsub('Tab', '')]
if oc then
TweenService:Create(oc, TweenInfo.new(0.25, Enum.EasingStyle.Quart, Enum.EasingDirection.In), {Position = UDim2.new(0, 0, 0, -15), GroupTransparency = 1}):Play()
task.delay(0.25, function() oc.Visible = false end)
end
end
end
activeSubTab = TabName
TweenService:Create(btn.TextLabel, TweenInfo.new(0.2), {TextColor3 = Theme.TextMain}):Play()
TweenService:Create(btn.Frame, TweenInfo.new(0.2), {Size = UDim2.new(1, 0, 0, 2), BackgroundTransparency = 0}):Play()
local nc = MasterContainers[TabName]
if nc then
nc.Visible = true
nc.Position = UDim2.new(0, 0, 0, 15)
nc.GroupTransparency = 1
TweenService:Create(nc, TweenInfo.new(0.4, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {Position = UDim2.new(0, 0, 0, 0), GroupTransparency = 0}):Play()
end
end
end
end})
end
WindowObj.UISettings = MakeSubTabElements('UI Settings')
WindowObj.UISettings:CreateKeybind({
Name = 'Menu Visible Keybind',
Default = MenuKeybind,
Callback = function(key) MenuKeybind = key end
})
local themeNamesList = {}
for name, _ in pairs(Themes) do
table.insert(themeNamesList, name)
end
table.sort(themeNamesList)
WindowObj.UISettings:CreateDropdown({
Name = 'Select UI Theme',
Options = themeNamesList,
Default = defaultTheme,
Callback = function(selectedTheme)
ApplySelectedTheme(selectedTheme)
end
})
local AccentColorElement
AccentColorElement = WindowObj.UISettings:CreateColorpicker({
Name = 'Accent Color',
Default = Theme.Accent,
Callback = function(color)
if not AkenaLib.RainbowAccent then
UpdateThemeAccent(color)
end
end
})
WindowObj.UISettings:CreateToggle({
Name = 'Rainbow Accent',
Default = false,
Callback = function(val)
AkenaLib.RainbowAccent = val
if not val and AccentColorElement then
UpdateThemeAccent(AccentColorElement.Value)
end
end
})
WindowObj.UISettings:CreateSlider({
Name = 'Rainbow Speed',
Min = 1,
Max = 20,
Default = 5,
Increment = 1,
Suffix = '',
Callback = function(val)
AkenaLib.RainbowSpeed = val
end
})
WindowObj.UISettings:CreateButton({
Name = 'Randomize Theme',
Callback = function()
local baseHue = math.random()
local bgSaturation = math.random() * 0.2
local bgValue = math.random() * 0.15 + 0.05
Theme.MainBG = Color3.fromHSV(baseHue, bgSaturation, bgValue)
Theme.SidebarBG = Color3.fromHSV(baseHue, bgSaturation, math.clamp(bgValue + 0.02, 0, 1))
Theme.TopbarBG = Color3.fromHSV(baseHue, bgSaturation, math.clamp(bgValue - 0.02, 0, 1))
Theme.ElementBG = Color3.fromHSV(baseHue, bgSaturation, math.clamp(bgValue + 0.05, 0, 1))
Theme.Border = Color3.fromHSV(baseHue, bgSaturation, math.clamp(bgValue + 0.1, 0, 1))
Theme.DropdownListBG = Theme.ElementBG
Theme.DropdownListStroke = Theme.Border
local acH = (baseHue + math.random() * 0.5) % 1
Theme.Accent = Color3.fromHSV(acH, 0.8, 0.9)
Theme.TextMain = Color3.fromRGB(240, 240, 240)
Theme.TextSub = Color3.fromRGB(160, 160, 160)
local alive = {}
for i = 1, #AkenaLib.ThemeConnections do
local func = AkenaLib.ThemeConnections[i]
if type(func) == 'function' then
local s, res = pcall(func)
if s and res ~= false then
table.insert(alive, func)
end
end
end
AkenaLib.ThemeConnections = alive
end
})
WindowObj.UISettings:CreateToggle({
Name = 'Notifications & Tooltips',
Default = true,
Callback = function(val)
AkenaLib.ShowNotifications = val
AkenaLib.ShowTooltips = val
end
})
WindowObj.UISettings:CreateSlider({
Name = 'Window Scale',
Min = 50,
Max = 150,
Default = 100,
Increment = 5,
Suffix = '%',
Callback = function(val) WindowObj:UpdateScale(val / 100) end
})
WindowObj.Configs = MakeSubTabElements('Configs')
local ConfigName = 'default'
local ConfigFolder = 'akena/' .. tostring(game.GameId)
local SecureFolder = function()
if makefolder then
if not isfolder('akena') then makefolder('akena') end
if not isfolder(ConfigFolder) then makefolder(ConfigFolder) end
end
end
local RefreshConfigs = function(dropdownObj)
if not listfiles then return end
SecureFolder()
local list = {}
local success, files = pcall(function() return listfiles(ConfigFolder) end)
if success and type(files) == 'table' then
for i = 1, #files do
local file = files[i]
if type(file) == 'string' then
local match = file:match('([^/\\\\]+)%.json$')
if match then table.insert(list, match) end
elseif type(file) == 'table' then
local path = file.Path or file.path or file.Name or file.name or tostring(file)
if type(path) == 'string' then
local match = path:match('([^/\\\\]+)%.json$')
if match then table.insert(list, match) end
end
end
end
end
dropdownObj:Refresh(list)
end
local CfgTextBox = WindowObj.Configs:CreateTextbox({
Name = 'Config Name',
UseLetter = true,
UseNumber = true,
Callback = function(txt) ConfigName = txt end
})
local AutoloadTog
local isAutoload = (readfile and isfile('akena_autoload.txt') and readfile('akena_autoload.txt') == ConfigName) or false
AutoloadTog = WindowObj.Configs:CreateToggle({
Name = 'Autoload',
Default = isAutoload,
Callback = function(val)
if writefile then
SecureFolder()
if val then
writefile('akena_autoload.txt', ConfigName)
else
if isfile('akena_autoload.txt') then
delfile('akena_autoload.txt')
end
end
end
end
})
local ConfigDrop
WindowObj.Configs:CreateButton({
Name = 'Save Config',
Callback = function()
if writefile then
SecureFolder()
local data = {}
for k,v in pairs(AkenaLib.Flags) do
data[k] = SerializeValue(v.Value)
end
writefile(ConfigFolder .. '/' .. ConfigName .. '.json', HttpService:JSONEncode(data))
if ConfigDrop then RefreshConfigs(ConfigDrop) end
end
end
})
WindowObj.Configs:CreateButton({
Name = 'Load Config',
Callback = function()
if readfile and isfile(ConfigFolder .. '/' .. ConfigName .. '.json') then
local success, data = pcall(function()
return HttpService:JSONDecode(readfile(ConfigFolder .. '/' .. ConfigName .. '.json'))
end)
if success and type(data) == 'table' then
for k,v in pairs(data) do
local flagElement = AkenaLib.Flags[k]
if flagElement then
local decodedVal = DeserializeValue(v)
if decodedVal ~= nil then
flagElement:Set(decodedVal)
end
end
end
end
end
end
})
ConfigDrop = WindowObj.Configs:CreateDropdown({
Name = 'View Configs',
Options = {},
Callback = function(sel)
ConfigName = sel
if AutoloadTog then
local activeAuto = (readfile and isfile('akena_autoload.txt') and readfile('akena_autoload.txt') == ConfigName) or false
AutoloadTog:Set(activeAuto)
end
end
})
RefreshConfigs(ConfigDrop)
WindowObj.Configs:CreateButton({
Name = 'Delete Config',
Callback = function()
if delfile and isfile(ConfigFolder .. '/' .. ConfigName .. '.json') then
delfile(ConfigFolder .. '/' .. ConfigName .. '.json')
if ConfigDrop then RefreshConfigs(ConfigDrop) end
end
end
})
ApplySelectedTheme(defaultTheme)
task.spawn(function()
if readfile and isfile('akena_autoload.txt') then
local autoCfg = readfile('akena_autoload.txt')
local filePath = ConfigFolder .. '/' .. autoCfg .. '.json'
if isfile(filePath) then
local success, data = pcall(function()
return HttpService:JSONDecode(readfile(filePath))
end)
if success and type(data) == 'table' then
task.wait(0.5)
for k,v in pairs(data) do
local flagElement = AkenaLib.Flags[k]
if flagElement then
local decodedVal = DeserializeValue(v)
if decodedVal ~= nil then
flagElement:Set(decodedVal)
end
end
end
end
end
end
end)
local connection
connection = RunService.RenderStepped:Connect(function()
local success, hasParent = pcall(function() return ScreenGui and ScreenGui.Parent end)
if not success or not hasParent then
if connection then connection:Disconnect() end
return
end
end)
return WindowObj
end
local Window = AkenaLib:CreateWindow({
Title = 'na',
Prefix = 'Ake',
Theme = 'Minimal White'
})
local ThrowingTab = Window:CreateTab({ Name = 'QB Aimbot', Icon = 'rbxassetid://6034684949' })
enableQbAimbot = ThrowingTab:CreateToggle({
Name = 'Enable QB Aimbot',
Default = false,
Tip = 'Automatically aims passes at the best target for more accurate throws.',
})
throwAimbot = ThrowingTab:CreateToggle({
Name = 'Throw To Mouse Aimbot',
Default = false,
Tip = 'Automatically aims passes toward your mouse position.',
})
autoChooseWr = ThrowingTab:CreateToggle({
Name = 'Auto Choose Open Reciever',
Default = false,
Tip = 'Automatically selects the most open receiver for each throw.',
})
autoSelectThrowMode = ThrowingTab:CreateToggle({
Name = 'Auto Select Throw Type',
Default = false,
Tip = 'Automatically chooses the best throw type for each pass.',
})
autoPower = ThrowingTab:CreateToggle({
Name = 'Auto Power',
Default = false,
Tip = 'Automatically sets the optimal throw power.',
})
autoAngle = ThrowingTab:CreateToggle({
Name = 'Auto Angle',
Default = false,
Tip = 'Automatically adjusts throw angle for better accuracy.',
})
highPowerOnly = ThrowingTab:CreateToggle({
Name = 'High Power Only',
Default = false,
Tip = 'Only uses high-power throws when passing.',
})
antiDB = ThrowingTab:CreateToggle({
Name = 'Anti DB',
Default = false,
Tip = 'Avoids throws that defenders can easily intercept.',
})
antiDBThreshold = ThrowingTab:CreateSlider({
Name = 'Anti DB Threshold',
Min = 0,
Max = 15,
Default = 0,
Increment = 0.1,
Suffix = '',
Tip = 'Sets how aggressively defender coverage is avoided.',
})
antiOOB = ThrowingTab:CreateToggle({
Name = 'Anti OOB',
Default = false,
Tip = 'Prevents throws that may lead receivers out of bounds.',
})
antiOOBThreshold = ThrowingTab:CreateSlider({
Name = 'Anti OOB Threshold',
Min = 0,
Max = 15,
Default = 0,
Increment = 0.1,
Suffix = '',
Tip = 'Sets how close targets can be to the sideline.',
})
throwLeadOffset = ThrowingTab:CreateSlider({
Name = 'Throw Lead Offset',
Min = -10,
Max = 10,
Default = 0,
Increment = 0.1,
Suffix = '',
Tip = 'Adjusts how far ahead passes are led.',
})
throwHeightOffset = ThrowingTab:CreateSlider({
Name = 'Throw Height Offset',
Min = -10,
Max = 10,
Default = 0,
Increment = 0.1,
Suffix = '',
Tip = 'Adjusts the height of targeted throws.',
})
autoJuke = ThrowingTab:CreateToggle({
Name = 'Auto Juke Rusher',
Default = false,
Tip = 'Automatically jukes nearby rushers before throwing.',
})
hideCards = ThrowingTab:CreateToggle({
Name = 'Hide QB Aimbot Cards',
Default = false,
Tip = 'Hides QB Aimbot visual cards from the screen.',
})
autoChangePowerUI = ThrowingTab:CreateToggle({
Name = 'Auto Change Power UI',
Default = false,
Tip = 'Automatically updates the power UI to match throws.',
})
autoJumpWhenThrow = ThrowingTab:CreateToggle({
Name = 'Auto Jump Before Throw',
Default = false,
Tip = 'Automatically jumps before releasing the ball.',
})
autoThrowAfterSack = ThrowingTab:CreateToggle({
Name = 'Auto Throw Before Getting Sacked',
Default = false,
Tip = 'Automatically throws the ball when a sack is imminent.',
})
dimeKeybind = ThrowingTab:CreateKeybind({
Name = 'Dime Mode Keybind',
Default = Enum.KeyCode.One,
Tip = 'Switches to Dime throw mode.',
})
magKeybind = ThrowingTab:CreateKeybind({
Name = 'Mag Mode Keybind',
Default = Enum.KeyCode.Two,
Tip = 'Switches to Mag throw mode.',
})
diveKeybind = ThrowingTab:CreateKeybind({
Name = 'Dive Mode Keybind',
Default = Enum.KeyCode.Three,
Tip = 'Switches to Dive throw mode.',
})
jumpKeybind = ThrowingTab:CreateKeybind({
Name = 'Jump Mode Keybind',
Default = Enum.KeyCode.Four,
Tip = 'Switches to Jump throw mode.',
})
bulletKeybind = ThrowingTab:CreateKeybind({
Name = 'Bullet Mode Keybind',
Default = Enum.KeyCode.Five,
Tip = 'Switches to Bullet throw mode.',
})
throwBallAwayKeybind = ThrowingTab:CreateKeybind({
Name = 'Throw Ball Away Keybind',
Default = Enum.KeyCode.T,
Tip = 'Instantly throws the ball away.',
})
increaseAngleKeybind = ThrowingTab:CreateKeybind({
Name = 'Increase Angle Keybind',
Default = Enum.KeyCode.R,
Tip = 'Increases the current throw angle.',
})
decreaseAngleKeybind = ThrowingTab:CreateKeybind({
Name = 'Decrease Angle Keybind',
Default = Enum.KeyCode.F,
Tip = 'Decreases the current throw angle.',
})
lockKeybind = ThrowingTab:CreateKeybind({
Name = 'Lock To Target Keybind',
Default = Enum.KeyCode.Z,
Tip = 'Locks passes onto the current target.',
})
local players = game:GetService('Players')
local replicatedStorage = game:GetService('ReplicatedStorage')
local tweenService = game:GetService('TweenService')
local userInputService = game:GetService('UserInputService')
local runService = game:GetService('RunService')
local stats = game:GetService('Stats')
local camera = workspace.CurrentCamera
local lp = players.LocalPlayer
if not lp then
players:GetPropertyChangedSignal('LocalPlayer'):Wait()
lp = players.LocalPlayer
end
local mouse = lp:GetMouse()
local isPractice = (game.PlaceId == 81310542478972)
if isPractice then
autoJuke.Value = false
end
local targetLocked = false
local lockedTarget = nil
local RouteData = {}
local HUDCards = {}
local rusherHighlights = {}
local numCards = 0
local leadDime = 8.5
local leadMag = 8.6
local leadDive = 8.5
local leadJump = 8.4
local leadBullet = 2.5
local yLeadDime = 1.2
local yLeadMag = 1.0
local yLeadDive = 1.5
local yLeadJump = 2.0
local yLeadBullet = -0.8
local ModeOrder = {'Bullet', 'Dime', 'Dive', 'Jump', 'Mag'}
local QBKeybinds = {
[dimeKeybind.Value] = 'Dime',
[magKeybind.Value] = 'Mag',
[diveKeybind.Value] = 'Dive',
[jumpKeybind.Value] = 'Jump',
[bulletKeybind.Value] = 'Bullet'
}
local customHeight = { Value = 0 }
local target = nil
local lastValidTarget = nil
local targetLeadPos = nil
local highlight = nil
local direction = Vector3.new(0, 1, 0)
local power = 60
local angle = 45
local airtime = 0
local isThrowing = false
local isThrowingAway = false
local firedRemote = false
local modeIndex = 1
local smoothedJukeDir = Vector3.zero
local lockedMousePos = nil
local LockToggleBtn = nil
local LockedLabel = nil
local attach0 = Instance.new('Attachment', workspace.Terrain)
local attach1 = Instance.new('Attachment', workspace.Terrain)
local beam = Instance.new('Beam')
beam.Attachment0 = attach0
beam.Attachment1 = attach1
beam.Segments = 7500
beam.Width0 = 1
beam.Width1 = 1
beam.FaceCamera = true
beam.Color = ColorSequence.new(Color3.fromRGB(255, 255, 255))
beam.Transparency = NumberSequence.new({
NumberSequenceKeypoint.new(0, 1),
NumberSequenceKeypoint.new(0.01, 0),
NumberSequenceKeypoint.new(1, 0)
})
beam.Enabled = true
beam.Parent = workspace.Terrain
local posPart = Instance.new('Part', workspace.Terrain)
posPart.Anchored = true
posPart.CanCollide = false
posPart.CastShadow = false
posPart.Size = Vector3.new(3, 3, 3)
posPart.Shape = Enum.PartType.Ball
posPart.Color = Color3.fromRGB(0, 0, 0)
local hudFolder = nil
pcall(function()
hudFolder = (gethui and gethui()) or game:GetService('CoreGui')
end)
if not hudFolder or (hudFolder.Name == 'CoreGui' and not pcall(function() Instance.new('Folder', hudFolder):Destroy() end)) then
hudFolder = lp:WaitForChild('PlayerGui', 10)
end
local sg = Instance.new('ScreenGui')
sg.ResetOnSpawn = false
sg.Parent = hudFolder
sg.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
local container = Instance.new('CanvasGroup')
container.Size = UDim2.new(1, 0, 0, 100)
container.Position = UDim2.new(0.5, 0, 0.05, 0)
container.AnchorPoint = Vector2.new(0.5, 0)
container.BackgroundTransparency = 1
container.GroupTransparency = 1
container.Visible = true
container.Parent = sg
local hudVisible = false
local updateHUDVisibility = function(show)
if show and not hudVisible then
hudVisible = true
tweenService:Create(container, TweenInfo.new(0.3, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {GroupTransparency = 0}):Play()
elseif not show and hudVisible then
hudVisible = false
tweenService:Create(container, TweenInfo.new(0.3, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {GroupTransparency = 1}):Play()
end
end
local containerScale = Instance.new('UIScale', container)
local updateScale = function()
local vp = camera.ViewportSize
local scale = (vp.X / 1100)
containerScale.Scale = math.clamp(scale, 0.5, 1.2)
end
camera:GetPropertyChangedSignal('ViewportSize'):Connect(updateScale)
updateScale()
local layout = Instance.new('UIListLayout')
layout.FillDirection = Enum.FillDirection.Horizontal
layout.HorizontalAlignment = Enum.HorizontalAlignment.Center
layout.VerticalAlignment = Enum.VerticalAlignment.Center
layout.SortOrder = Enum.SortOrder.LayoutOrder
layout.Padding = UDim.new(0, 10)
layout.Parent = container
local assignFont = function(instance, font)
pcall(function()
instance.Font = font
end)
end
local createCard = function(titleTxt)
local card = Instance.new('Frame')
card.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
card.BackgroundTransparency = 0
card.BorderSizePixel = 0
local gradient = Instance.new('UIGradient')
gradient.Color = ColorSequence.new({
ColorSequenceKeypoint.new(0, Color3.fromRGB(45, 45, 50)),
ColorSequenceKeypoint.new(1, Color3.fromRGB(15, 15, 18))
})
gradient.Rotation = 90
gradient.Parent = card
if titleTxt == 'Throw Type' then
card.Size = UDim2.new(0, 110, 0, 80)
else
card.Size = UDim2.new(0, 95, 0, 80)
end
card.LayoutOrder = numCards
card.Parent = container
local corner = Instance.new('UICorner', card)
corner.CornerRadius = UDim.new(0, 8)
local stroke = Instance.new('UIStroke', card)
stroke.Color = Color3.fromRGB(80, 80, 85)
stroke.Thickness = 1.000
local padding = Instance.new('UIPadding', card)
padding.PaddingTop = UDim.new(0, 5)
padding.PaddingBottom = UDim.new(0, 5)
local title = Instance.new('TextLabel')
title.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
title.BackgroundTransparency = 1.000
title.BorderSizePixel = 0
title.Position = UDim2.new(0, 0, 0.70, 0)
title.Size = UDim2.new(1, 0, 0, 15)
assignFont(title, Enum.Font.GothamBold)
title.Text = titleTxt
title.TextColor3 = Color3.fromRGB(255, 255, 255)
title.TextScaled = true
title.Parent = card
local valBtn = Instance.new('TextButton')
valBtn.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
valBtn.BackgroundTransparency = 1.000
valBtn.BorderSizePixel = 0
valBtn.Position = UDim2.new(0, 0, 0.15, 0)
valBtn.Size = UDim2.new(1, 0, 0.5, 0)
assignFont(valBtn, Enum.Font.GothamBold)
valBtn.Text = '-'
valBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
valBtn.TextScaled = true
valBtn.AutoButtonColor = false
valBtn.Parent = card
if titleTxt == 'Throw Type' then
local uiScale = Instance.new('UIScale', card)
valBtn.MouseButton1Down:Connect(function()
local c = lp.Character
if not c or not c:FindFirstChild('Football') then return end
tweenService:Create(uiScale, TweenInfo.new(0.1, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {Scale = 0.9}):Play()
end)
valBtn.MouseButton1Up:Connect(function()
local c = lp.Character
if not c or not c:FindFirstChild('Football') then return end
tweenService:Create(uiScale, TweenInfo.new(0.1, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {Scale = 1}):Play()
modeIndex = modeIndex + 1
if modeIndex > #ModeOrder then modeIndex = 1 end
end)
end
if titleTxt == 'Player' then
local lockedLbl = Instance.new('TextLabel')
lockedLbl.Size = UDim2.new(1, 0, 0.25, 0)
lockedLbl.Position = UDim2.new(0, 0, 0.05, 0)
lockedLbl.BackgroundTransparency = 1
lockedLbl.Text = 'LOCKED'
lockedLbl.TextColor3 = Color3.fromRGB(255, 50, 50)
assignFont(lockedLbl, Enum.Font.GothamBold)
lockedLbl.TextSize = 12
lockedLbl.Visible = false
lockedLbl.ZIndex = 2
lockedLbl.Parent = card
LockedLabel = lockedLbl
local lockOverlay = Instance.new('TextButton')
lockOverlay.Size = UDim2.new(1, 0, 1, 0)
lockOverlay.BackgroundTransparency = 1
lockOverlay.Text = ''
lockOverlay.ZIndex = 5
lockOverlay.Parent = card
lockOverlay.MouseButton1Click:Connect(function()
local c = lp.Character
if not c or not c:FindFirstChild('Football') then return end
if target or targetLocked then
targetLocked = not targetLocked
if targetLocked then
lockedTarget = target
if LockedLabel then LockedLabel.Visible = true end
else
lockedTarget = nil
if LockedLabel then LockedLabel.Visible = false end
end
end
end)
LockToggleBtn = valBtn
end
HUDCards[titleTxt] = valBtn
numCards = numCards + 1
end
createCard('Angle')
createCard('Throw Type')
createCard('Player')
createCard('Airtime')
createCard('Power')
local getActiveBots = function()
local bots = {}
local npcwr = workspace:FindFirstChild('npcwr')
if npcwr then
local a = npcwr:FindFirstChild('a')
if a then
local bot1 = a:FindFirstChild('bot 1')
if bot1 and bot1:IsA('Model') then table.insert(bots, bot1) end
end
local b = npcwr:FindFirstChild('b')
if b then
local bot3 = b:FindFirstChild('bot 3')
if bot3 and bot3:IsA('Model') then table.insert(bots, bot3) end
end
end
return bots
end
local performThrow = function()
if not enableQbAimbot.Value then return end
local character = lp.Character
if not character then return end
local football = character:FindFirstChildOfClass('Tool')
if not football then return end
local handle = football:FindFirstChild('Handle')
if not handle then return end
local remote = handle:FindFirstChild('RemoteEvent')
if not remote then return end
local head = character:FindFirstChild('Head')
if not head then return end
local root = character:FindFirstChild('HumanoidRootPart')
if not root then return end
local finalDirection = direction or Vector3.new(0, 1, 0)
if isPractice then
local arg = 'Clicked'
local arg1 = head.Position
local arg2 = head.Position + finalDirection * 10000
local arg3 = tonumber(power) or 0
remote:FireServer(arg, arg1, arg2, arg3)
else
local arg = 'Clicked'
local arg1 = (root.CFrame * CFrame.new(0, 1.5, 0)).Position + Vector3.new(70000000)
local arg2 = head.Position + finalDirection * 10000
local arg3 = tonumber(power) or 0
remote:FireServer(arg, arg1, arg2, arg3, 1)
end
end
local findRoute = function(character)
if not character then return 'stationary', Vector3.zero end
local isPlayer = players:GetPlayerFromCharacter(character)
local humanoid = character:FindFirstChild('Humanoid')
local targetHRP = character:FindFirstChild('HumanoidRootPart')
local qbChar = lp.Character
local qbHRP = qbChar and qbChar:FindFirstChild('HumanoidRootPart')
if not humanoid or not targetHRP or not qbHRP then
return 'stationary', Vector3.zero
end
local moveDirection = Vector3.zero
if isPlayer then
moveDirection = humanoid.MoveDirection
else
local wtpDiff = humanoid.WalkToPoint - targetHRP.Position
moveDirection = wtpDiff.Magnitude > 0.01 and wtpDiff.Unit or Vector3.zero
end
local toWR = targetHRP.Position - qbHRP.Position
local distance = tonumber(toWR.Magnitude) or 0
local toWRDir = Vector3.new(toWR.X, 0, toWR.Z)
if toWRDir.Magnitude > 0.01 then
toWRDir = toWRDir.Unit
else
toWRDir = Vector3.new(0, 0, 1)
end
local mdFlat = Vector3.new(moveDirection.X, 0, moveDirection.Z)
if mdFlat.Magnitude < 0.01 then
return 'stationary', moveDirection
end
mdFlat = mdFlat.Unit
local dot = tonumber(mdFlat:Dot(toWRDir)) or 0
if dot > 0.75 then
return 'go/fade', moveDirection
elseif dot >= 0.25 and dot <= 0.75 then
if distance <= 120 then return 'slant', moveDirection
elseif distance <= 160 then return 'seam', moveDirection
else return 'post/corner', moveDirection end
elseif dot > -0.25 and dot < 0.25 then
if distance <= 60 then return 'drag', moveDirection
elseif distance <= 130 then return 'in/out', moveDirection
else return 'flat', moveDirection end
else
if distance <= 50 then return 'hitch', moveDirection
else return 'curl/comeback', moveDirection end
end
end
local isWROpen = function(wrChar)
if not wrChar then return false end
local hrp = wrChar:FindFirstChild('HumanoidRootPart')
if not hrp then return false end
local isCovered = false
local _, moveDir = findRoute(wrChar)
local teamCount = 0
pcall(function() teamCount = tonumber(#game:GetService('Teams'):GetTeams()) or 0 end)
local checkDB = function(dbHRP)
local toDB = dbHRP.Position - hrp.Position
local dist = tonumber(toDB.Magnitude) or 0
if dist < 5 then
local routeDirXZ = Vector3.new(moveDir.X, 0, moveDir.Z)
if (tonumber(routeDirXZ.Magnitude) or 0) > 0.01 then
routeDirXZ = routeDirXZ.Unit
local dot = tonumber(toDB.Unit:Dot(routeDirXZ)) or 0
if dot > -0.7 then
return true
end
else
return true
end
end
return false
end
local checkPR = function(dbHRP)
local qbChar = lp.Character
if not qbChar then return false end
local qbHRP = qbChar:FindFirstChild('HumanoidRootPart')
if not qbHRP then return false end
local toPR = dbHRP.Position - qbHRP.Position
local toWR = hrp.Position - qbHRP.Position
local wrDist = tonumber(toWR.Magnitude) or 0
local wrDir = toWR.Unit
local proj = tonumber(toPR:Dot(wrDir)) or 0
if proj > 2 and proj < (wrDist * 0.6) then
local distToLine = tonumber((toPR - (wrDir * proj)).Magnitude) or 0
if distToLine < 5.5 then
return true
end
end
return false
end
local plrs = players:GetPlayers()
for i = 1, #plrs do
local plr = plrs[i]
if plr ~= lp and plr.Character then
local isEnemy = true
if teamCount > 1 and lp.Team ~= nil and plr.Team ~= nil and lp.Team == plr.Team then
isEnemy = false
end
if isEnemy then
local dbHRP = plr.Character:FindFirstChild('HumanoidRootPart')
if dbHRP and (checkDB(dbHRP) or checkPR(dbHRP)) then
isCovered = true
break
end
end
end
end
if not isCovered then
local bots = getActiveBots()
for i = 1, #bots do
local bot = bots[i]
if bot ~= wrChar then
local dbHRP = bot:FindFirstChild('HumanoidRootPart')
if dbHRP and (checkDB(dbHRP) or checkPR(dbHRP)) then
isCovered = true
break
end
end
end
end
return not isCovered
end
local getTarget = function()
if isThrowing and target then return target end
if targetLocked and lockedTarget and lockedTarget:FindFirstChild('HumanoidRootPart') then
return lockedTarget
elseif targetLocked then
targetLocked = false
lockedTarget = nil
end
local potentialTargets = {}
local teamCount = 0
pcall(function() teamCount = tonumber(#game:GetService('Teams'):GetTeams()) or 0 end)
local plrs = players:GetPlayers()
for i = 1, #plrs do
local plr = plrs[i]
if plr ~= lp and plr.Character and plr.Character:FindFirstChild('HumanoidRootPart') then
local isTeammate = true
if teamCount > 1 and lp.Team ~= nil and plr.Team ~= nil and lp.Team ~= plr.Team then
isTeammate = false
end
if isTeammate then
local eHum = plr.Character:FindFirstChildOfClass('Humanoid')
if not eHum or not eHum.Sit then
table.insert(potentialTargets, plr.Character)
end
end
end
end
local bots = getActiveBots()
for i = 1, #bots do
local bot = bots[i]
if bot:FindFirstChild('HumanoidRootPart') then
local eHum = bot:FindFirstChildOfClass('Humanoid')
if not eHum or not eHum.Sit then
table.insert(potentialTargets, bot)
end
end
end
if #potentialTargets == 0 then return nil end
if autoChooseWr.Value then
local bestAutoTarget = nil
local bestAutoDist = math.huge
local qbHRP = lp.Character and lp.Character:FindFirstChild('HumanoidRootPart')
local qbPos = qbHRP and qbHRP.Position or Vector3.zero
for i = 1, #potentialTargets do
local char = potentialTargets[i]
local hrp = char:FindFirstChild('HumanoidRootPart')
if hrp then
local _, onScreen = camera:WorldToViewportPoint(hrp.Position)
if onScreen and isWROpen(char) then
local dist = tonumber((hrp.Position - qbPos).Magnitude) or 0
if dist < bestAutoDist then
bestAutoDist = dist
bestAutoTarget = char
end
end
end
end
if bestAutoTarget then
return bestAutoTarget
end
end
local mousePos2D = userInputService:GetMouseLocation()
local bestManualTarget = nil
local bestMouseDist = math.huge
for i = 1, #potentialTargets do
local char = potentialTargets[i]
local hrp = char:FindFirstChild('HumanoidRootPart')
if hrp then
local screenPos, onScreen = camera:WorldToViewportPoint(hrp.Position)
if onScreen then
local dist = tonumber((Vector2.new(screenPos.X, screenPos.Y) - mousePos2D).Magnitude) or 0
if dist < bestMouseDist then
bestMouseDist = dist
bestManualTarget = char
end
end
end
end
return bestManualTarget
end
local calculateRouteDirection = function(targetChar)
if not targetChar then return 'Mag' end
local targetHRP = targetChar:FindFirstChild('HumanoidRootPart')
if not targetHRP then return 'Mag' end
local lpChar = lp.Character
local lpHRP = lpChar and lpChar:FindFirstChild('HumanoidRootPart')
if not lpHRP then return 'Mag' end
local route, moveDir = findRoute(targetChar)
local dist = tonumber((targetHRP.Position - lpHRP.Position).Magnitude) or 0
if dist < 40 then return 'Bullet' end
local dbDistance = math.huge
local teamCount = 0
pcall(function() teamCount = tonumber(#game:GetService('Teams'):GetTeams()) or 0 end)
local plrs = players:GetPlayers()
for i = 1, #plrs do
local plr = plrs[i]
if plr ~= lp and plr.Character then
local eHRP = plr.Character:FindFirstChild('HumanoidRootPart')
if eHRP and eHRP ~= targetHRP then
local isEnemy = true
if teamCount > 1 and lp.Team ~= nil and plr.Team ~= nil and lp.Team == plr.Team then
isEnemy = false
end
if isEnemy then
local d = tonumber((eHRP.Position - targetHRP.Position).Magnitude) or 0
if d < dbDistance then dbDistance = d end
end
end
end
end
local bots = getActiveBots()
for i = 1, #bots do
local bot = bots[i]
local bHRP = bot:FindFirstChild('HumanoidRootPart')
if bHRP and bHRP ~= targetHRP then
local d = tonumber((bHRP.Position - targetHRP.Position).Magnitude) or 0
if d < dbDistance then dbDistance = d end
end
end
local within = function(tbl, val)
for i = 1, #tbl do
if tbl[i] == val then return true end
end
return false
end
local forwardRoutes = {'go/fade', 'post/corner', 'seam', 'curl/comeback', 'stationary'}
local sidewayRoutes = {'in/out', 'flat', 'wheel'}
if route == 'slant' or route == 'hitch' or route == 'drag' or route == 'in/out' or route == 'flat' then
return 'Bullet'
elseif within(forwardRoutes, route) then
if dbDistance > 5 then return ((tonumber(angle) or 45) < 40) and 'Jump' or 'Dime'
elseif dbDistance > 2 then return 'Dive' end
return 'Mag'
elseif within(sidewayRoutes, route) then
if dbDistance > 4 then return 'Dime' end
return 'Jump'
end
return 'Dime'
end
local getModeLead = function(modeName)
if modeName == 'Dime' then return leadDime
elseif modeName == 'Mag' then return leadMag
elseif modeName == 'Dive' then return leadDive
elseif modeName == 'Jump' then return leadJump
elseif modeName == 'Bullet' then return leadBullet
end
return 8.6
end
local getModeYLead = function(modeName)
if modeName == 'Dime' then return yLeadDime
elseif modeName == 'Mag' then return yLeadMag
elseif modeName == 'Dive' then return yLeadDive
elseif modeName == 'Jump' then return yLeadJump
elseif modeName == 'Bullet' then return yLeadBullet
end
return 0
end
local getPing = function()
local networkPing = 0
pcall(function() networkPing = tonumber(lp:GetNetworkPing()) or 0 end)
local dataPing = 0
pcall(function() dataPing = (tonumber(stats.Network.ServerStatsItem['Data Ping']:GetValue()) or 0) / 1000 end)
if dataPing == 0 then dataPing = networkPing end
return networkPing + dataPing
end
local solveKinematics = function(origin, targetPos, gravityMag)
local g = tonumber(gravityMag) or 28
local displacement = targetPos - origin
local x = tonumber(Vector3.new(displacement.X, 0, displacement.Z).Magnitude) or 0
local y = tonumber(displacement.Y) or 0
local inner = (x^2) + (y^2)
local root = tonumber(math.sqrt(math.max(inner, 0))) or 0
local baseAngleRad = math.rad(45)
if x > 0.01 then
local atanRes = tonumber(math.atan((y + root) / x)) or baseAngleRad
if atanRes and atanRes == atanRes then
baseAngleRad = atanRes
end
end
local angleRad = tonumber(math.clamp(baseAngleRad * 0.85, math.rad(-15), math.rad(65))) or 0
local cosA = tonumber(math.cos(angleRad)) or 1
local tanA = tonumber(math.tan(angleRad)) or 0
local v0 = 95
local denom = 2 * (cosA^2) * (x * tanA - y)
if denom > 0.001 then
local num = g * (x^2)
local res = tonumber(math.sqrt(num / denom)) or v0
if res and res == res and res ~= math.huge then
v0 = res
end
end
local angleDeg = tonumber(math.deg(angleRad)) or 45
return v0, angleDeg
end
local autoAim = function(targetHRP)
local head = lp.Character:FindFirstChild('Head')
local origin = head and head.Position or lp.Character.HumanoidRootPart.Position
local targetChar = targetHRP.Parent
local targetHeadObj = targetChar and targetChar:FindFirstChild('Head')
local targetHead = targetHeadObj and targetHeadObj.Position or targetHRP.Position + Vector3.new(0, 1.5, 0)
local moveDir = Vector3.zero
local targetHum = targetChar and targetChar:FindFirstChildOfClass('Humanoid')
if targetHum then
local isBot = targetChar:FindFirstAncestor('npcwr') ~= nil
if isBot then
local wtpDiff = targetHum.WalkToPoint - targetHRP.Position
local dir = Vector3.new(wtpDiff.X, 0, wtpDiff.Z)
moveDir = dir.Magnitude > 0.1 and dir.Unit or Vector3.zero
else
local md = targetHum.MoveDirection
local flatMd = Vector3.new(md.X, 0, md.Z)
moveDir = flatMd.Magnitude > 0.01 and flatMd.Unit or Vector3.zero
end
end
local ping = tonumber(getPing()) or 0
local speed = 20
local modeName = ModeOrder[modeIndex]
local isChestPass = (modeName == 'Bullet' or target and (findRoute(target) == 'slant' or findRoute(target) == 'drag' or findRoute(target) == 'in/out' or findRoute(target) == 'flat' or findRoute(target) == 'hitch' or findRoute(target) == 'curl/comeback'))
local routeStr = target and findRoute(target) or 'go/fade'
local activePower = tonumber(power) or 60
if modeName == 'Bullet' or (autoPower.Value and isChestPass) or highPowerOnly.Value then
activePower = 95
end
local lDivisor = 60
if activePower > 75 then
lDivisor = 60 + ((activePower - 75) * 1.5)
end
local distToTarget = tonumber((targetHRP.Position - origin).Magnitude) or 0
local estFlightTime = distToTarget / (tonumber(lDivisor) or 60)
local currentHVel = activePower * (tonumber(math.cos(math.rad(tonumber(angle) or 45))) or 1)
if currentHVel < 30 then currentHVel = 55 end
local estHVel = (modeName == 'Bullet' or isChestPass) and 90 or currentHVel
local modeLeadScale = (tonumber(getModeLead(modeName)) or 8.6) * 3.05
local selectedModeYLead = tonumber(getModeYLead(modeName)) or 0
local routeMultipliers = {
['slant'] = 0.45,
['drag'] = 0.6,
['in/out'] = 0.65,
['flat'] = 0.65,
['wheel'] = 0.9,
['go/fade'] = 1.0,
['post/corner'] = 0.85,
['seam'] = 0.85,
['hitch'] = 0.1,
['curl/comeback'] = 0.1,
['stationary'] = 0.0
}
local rMult = tonumber(routeMultipliers[routeStr]) or 1.0
local dirUnit = moveDir.Magnitude > 0.01 and moveDir.Unit or Vector3.zero
local targetBase = (isChestPass or modeName == 'Bullet') and targetHRP.Position or targetHead
local standingStill = (routeStr == 'stationary')
if standingStill then
leadPos = targetHead
else
leadPos = targetBase + (moveDir * speed * estFlightTime * rMult) + (moveDir * speed * ping * rMult) + (dirUnit * modeLeadScale * rMult)
leadPos = leadPos + (dirUnit * (tonumber(throwLeadOffset.Value) or 0))
if isChestPass or modeName == 'Bullet' then
leadPos = Vector3.new(leadPos.X, targetHead.Y, leadPos.Z)
selectedModeYLead = 0
end
leadPos = leadPos + Vector3.new(0, selectedModeYLead, 0)
leadPos = leadPos + Vector3.new(0, tonumber(throwHeightOffset.Value) or 0, 0)
if routeStr == 'curl/comeback' or routeStr == 'hitch' then
leadPos = leadPos + Vector3.new(0, -5, 0)
end
end
local forceAutoAngle = (modeName == 'Bullet' or isChestPass or (tonumber(power) or 60) == 95 or highPowerOnly.Value)
if not autoAngle.Value and not forceAutoAngle then
leadPos = leadPos + Vector3.new(0, tonumber(customHeight.Value) or 0, 0)
end
if antiDB.Value then
local pushVec = Vector3.zero
local plrs = players:GetPlayers()
local teamCount = 0
pcall(function() teamCount = tonumber(#game:GetService('Teams'):GetTeams()) or 0 end)
for i = 1, #plrs do
local plr = plrs[i]
if plr ~= lp and plr.Character then
local isEnemy = true
if teamCount > 1 and lp.Team ~= nil and plr.Team ~= nil and lp.Team == plr.Team then
isEnemy = false
end
if isEnemy then
local eHRP = plr.Character:FindFirstChild('HumanoidRootPart')
if eHRP then
local dist = tonumber(Vector3.new(eHRP.Position.X - leadPos.X, 0, eHRP.Position.Z - leadPos.Z).Magnitude) or 0
if dist < (tonumber(antiDBThreshold.Value) or 15) then
local away = (leadPos - eHRP.Position)
away = Vector3.new(away.X, 0, away.Z)
if away.Magnitude > 0 then
pushVec = pushVec + (away.Unit * ((tonumber(antiDBThreshold.Value) or 15) - dist))
end
end
end
end
end
end
leadPos = pushVec + leadPos
end
local fPos = Vector3.zero
local field = workspace:FindFirstChild('Models')
if field then field = field:FindFirstChild('Field') end
if field then field = field:FindFirstChild('Ground') end
if field then fPos = field.Position end
if antiOOB.Value and fPos ~= Vector3.zero then
local halfWidth = 75 - (tonumber(antiOOBThreshold.Value) or 5)
local halfLength = 175 - (tonumber(antiOOBThreshold.Value) or 5)
leadPos = Vector3.new(
math.clamp(leadPos.X, fPos.X - halfWidth, fPos.X + halfWidth),
leadPos.Y,
math.clamp(leadPos.Z, fPos.Z - halfLength, fPos.Z + halfLength)
)
end
targetLeadPos = leadPos
local gMag = 28
local calcPower, calcAngle = solveKinematics(origin, leadPos, gMag)
calcPower = tonumber(calcPower) or 95
calcAngle = tonumber(calcAngle) or 45
if standingStill and modeName ~= 'Bullet' and not highPowerOnly.Value then
local dynamicThreshold = tonumber(math.clamp(4 + (distToTarget * 0.08), 5, 14)) or 10
if calcAngle > dynamicThreshold then
local displacement = leadPos - origin
local x = tonumber(Vector3.new(displacement.X, 0, displacement.Z).Magnitude) or 0
local y = tonumber(displacement.Y) or 0
local aRad = tonumber(math.rad(dynamicThreshold)) or 0.1
local denom = 2 * (math.cos(aRad)^2) * (x * math.tan(aRad) - y)
if denom > 0.001 then
local newPwr = tonumber(math.sqrt((gMag * x^2) / denom)) or calcPower
if newPwr == newPwr and newPwr ~= math.huge then
calcAngle = dynamicThreshold
calcPower = newPwr
end
end
end
end
if highPowerOnly.Value then
power = 95
local displacement = leadPos - origin
local x = tonumber(Vector3.new(displacement.X, 0, displacement.Z).Magnitude) or 0
local y = tonumber(displacement.Y) or 0
local v2 = 95^2
local v4 = 95^4
local gx = gMag * x
local discriminant = v4 - gMag * (gMag * x^2 + 2 * y * v2)
if discriminant >= 0 then
angle = tonumber(math.clamp(math.deg(math.atan((v2 - math.sqrt(discriminant)) / gx)) * 0.94, -15, 85)) or 45
else
angle = 45
end
elseif modeName == 'Bullet' or (autoPower.Value and isChestPass) then
power = 95
local displacement = leadPos - origin
local h = tonumber(Vector3.new(displacement.X, 0, displacement.Z).Magnitude) or 0
local v = tonumber(displacement.Y) or 0
local t_est = h / 95
local drop = 0.5 * 28 * t_est * t_est
angle = tonumber(math.clamp(math.deg(math.atan2(v + drop, h)), -15, 45)) or 15
else
if autoPower.Value then
power = tonumber(math.clamp(calcPower, 0, 95)) or 60
end
if autoAngle.Value then
angle = tonumber(math.clamp(calcAngle, -15, 90)) or 45
end
end
if not autoAngle.Value and not forceAutoAngle then
angle = tonumber(math.clamp(calcAngle, -15, 90)) or 45
end
local safePower = tonumber(power) or 60
local safeAngle = tonumber(angle) or 45
local angleRad = tonumber(math.rad(safeAngle)) or 0
local hDirRaw = Vector3.new(leadPos.X - origin.X, 0, leadPos.Z - origin.Z)
local hDir = hDirRaw.Magnitude > 0.01 and hDirRaw.Unit or head.CFrame.LookVector
local dirVelocity = (hDir * (tonumber(math.cos(angleRad)) or 1) + Vector3.new(0, tonumber(math.sin(angleRad)) or 0, 0)) * safePower
direction = dirVelocity.Unit * safePower
local hVel = safePower * (tonumber(math.cos(angleRad)) or 1)
if hVel > 0.1 then
local xDist = tonumber(Vector3.new(leadPos.X - origin.X, 0, leadPos.Z - origin.Z).Magnitude) or 0
airtime = xDist / hVel
else
airtime = 0
end
return safeAngle
end
local beamProjectile = function(g, v0, x0, t1)
local c = 0.5 * 0.5 * 0.5
local safeT1 = tonumber(t1) or 0.1
local p3 = 0.5 * g * safeT1 * safeT1 + v0 * safeT1 + x0
local p2 = p3 - (g * safeT1 * safeT1 + v0 * safeT1) / 3
local p1 = (c * g * safeT1 * safeT1 + 0.5 * v0 * safeT1 + x0 - c * (x0 + p3)) / (3 * c) - p2
local curve0 = tonumber((p1 - x0).Magnitude) or 0
local curve1 = tonumber((p2 - p3).Magnitude) or 0
local b = (x0 - p3).Unit
local r1 = (p1 - x0).Unit
local u1 = r1:Cross(b).Unit
local r2 = (p2 - p3).Unit
local u2 = r2:Cross(b).Unit
b = u1:Cross(r1).Unit
local cf1 = CFrame.new(
x0.X, x0.Y, x0.Z,
r1.X, u1.X, b.X,
r1.Y, u1.Y, b.Y,
r1.Z, u1.Z, b.Z
)
local cf2 = CFrame.new(
p3.X, p3.Y, p3.Z,
r2.X, u2.X, b.X,
r2.Y, u2.Y, b.Y,
r2.Z, u2.Z, b.Z
)
return curve0, -curve1, cf1, cf2
end
userInputService.InputBegan:Connect(function(input, gpe)
if gpe then return end
local char = lp.Character
if not char or not char:FindFirstChild('Football') then return end
if input.KeyCode == throwBallAwayKeybind.Value then
local fPos = Vector3.zero
local field = workspace:FindFirstChild('Models')
if field then field = field:FindFirstChild('Field') end
if field then field = field:FindFirstChild('Ground') end
if field then fPos = field.Position end
local side = math.random(1, 2) == 1 and -1 or 1
local throwTarget = fPos + Vector3.new(side * 120, 0, math.random(-100, 100))
local head = char:FindFirstChild('Head')
local origin = head and head.Position or char.HumanoidRootPart.Position
isThrowingAway = true
power = 95
angle = 25
local angleRad = tonumber(math.rad(angle)) or 0
local hDir = Vector3.new(throwTarget.X - origin.X, 0, throwTarget.Z - origin.Z).Unit
local dirVelocity = (hDir * (tonumber(math.cos(angleRad)) or 1) + Vector3.new(0, tonumber(math.sin(angleRad)) or 0, 0)) * 95
direction = dirVelocity.Unit * 95
local hVel = 95 * (tonumber(math.cos(angleRad)) or 1)
airtime = hVel > 0.1 and ((tonumber(Vector3.new(throwTarget.X - origin.X, 0, throwTarget.Z - origin.Z).Magnitude) or 0) / hVel) or 1
local hum = char:FindFirstChildOfClass('Humanoid')
local throwAnim = replicatedStorage:FindFirstChild('Animations') and replicatedStorage.Animations:FindFirstChild('Throw')
if hum and throwAnim then
local animator = hum:FindFirstChild('Animator')
if animator then
local track = animator:LoadAnimation(throwAnim)
track:Play()
end
end
return
end
if input.KeyCode == increaseAngleKeybind.Value then
customHeight.Value = (tonumber(customHeight.Value) or 0) + 5
elseif input.KeyCode == decreaseAngleKeybind.Value then
customHeight.Value = (tonumber(customHeight.Value) or 0) - 5
end
if not autoSelectThrowMode.Value and QBKeybinds[input.KeyCode] then
local desiredMode = QBKeybinds[input.KeyCode]
for i = 1, #ModeOrder do
if ModeOrder[i] == desiredMode then
modeIndex = i
break
end
end
end
if input.KeyCode == lockKeybind.Value then
if target or targetLocked then
targetLocked = not targetLocked
if targetLocked then
lockedTarget = target
if LockToggleBtn then LockToggleBtn.TextColor3 = Color3.fromRGB(255, 50, 50) end
if LockedLabel then LockedLabel.Visible = true end
else
lockedTarget = nil
if LockToggleBtn then LockToggleBtn.TextColor3 = Color3.fromRGB(255, 255, 255) end
if LockedLabel then LockedLabel.Visible = false end
end
end
end
end)
local triggerThrowJump = function()
if autoJumpWhenThrow.Value then
task.delay(0.05, function()
local char = lp.Character
if char then
local hum = char:FindFirstChildOfClass('Humanoid')
if hum and hum:GetState() ~= Enum.HumanoidStateType.Jumping then
hum:ChangeState(Enum.HumanoidStateType.Jumping)
end
end
end)
end
end
task.spawn(function()
local bindAnimation = function(char)
local humanoid = char:WaitForChild('Humanoid', 5)
if not humanoid then return end
local animator = humanoid:WaitForChild('Animator', 5)
if not animator then return end
animator.AnimationPlayed:Connect(function(track)
local throwAnim = replicatedStorage:FindFirstChild('Animations') and replicatedStorage.Animations:FindFirstChild('Throw')
if throwAnim and track.Animation and (track.Animation == throwAnim or track.Animation.AnimationId == throwAnim.AnimationId) then
track:GetPropertyChangedSignal('IsPlaying'):Connect(function()
if track.IsPlaying then
if not isThrowing then
isThrowing = true
triggerThrowJump()
task.delay(0.12, function()
firedRemote = true
performThrow()
end)
end
else
isThrowing = false
firedRemote = false
isThrowingAway = false
end
end)
if track.IsPlaying and not isThrowing then
isThrowing = true
triggerThrowJump()
task.delay(0.12, function()
firedRemote = true
performThrow()
end)
end
end
end)
end
if lp.Character then
bindAnimation(lp.Character)
end
lp.CharacterAdded:Connect(function(char)
bindAnimation(char)
end)
end)
local setupSackHandler = function(character)
character.ChildAdded:Connect(function(v)
if not autoThrowAfterSack.Value then return end
if not v:IsA('LocalScript') then return end
if not v.Name:lower():find('tackle') then return end
task.wait()
local humanoid = character:FindFirstChildOfClass('Humanoid')
if not humanoid then return end
if autoChooseWr.Value then
local openWR = nil
local bestDist = math.huge
local mousePos2D = userInputService:GetMouseLocation()
local teamCount = 0
pcall(function() teamCount = tonumber(#game:GetService('Teams'):GetTeams()) or 0 end)
local plrs = players:GetPlayers()
for i = 1, #plrs do
local plr = plrs[i]
if plr ~= lp and plr.Character then
local isTeammate = true
if teamCount > 1 and lp.Team ~= nil and plr.Team ~= nil and lp.Team ~= plr.Team then
isTeammate = false
end
if isTeammate then
local eHrp = plr.Character:FindFirstChild('HumanoidRootPart')
local eHum = plr.Character:FindFirstChildOfClass('Humanoid')
if eHrp and (not eHum or not eHum.Sit) and isWROpen(plr.Character) then
local screenPos, onScreen = camera:WorldToViewportPoint(eHrp.Position)
if onScreen then
local dist = tonumber((Vector2.new(screenPos.X, screenPos.Y) - mousePos2D).Magnitude) or 0
if dist < bestDist then
bestDist = dist
openWR = plr.Character
end
end
end
end
end
end
if openWR then
target = openWR
targetLocked = true
lockedTarget = openWR
end
end
if target then
local throwAnim = replicatedStorage:FindFirstChild('Animations') and replicatedStorage.Animations:FindFirstChild('Throw')
if throwAnim then
local animator = humanoid:FindFirstChild('Animator')
if animator then
local track = animator:LoadAnimation(throwAnim)
track:Play()
end
end
end
end)
end
if lp.Character then
setupSackHandler(lp.Character)
end
lp.CharacterAdded:Connect(setupSackHandler)
local updateHighlights = function(isActive)
if not isActive then
if highlight then highlight:Destroy(); highlight = nil end
return
end
if target then
if not highlight then
highlight = Instance.new('Highlight')
end
highlight.Adornee = target
highlight.Parent = target
highlight.FillTransparency = 1
highlight.OutlineColor = targetLocked and Color3.new(0, 0, 0) or Color3.fromRGB(255, 255, 255)
highlight.OutlineTransparency = 0
elseif highlight then
highlight:Destroy()
highlight = nil
end
end
workspace.ChildAdded:Connect(function(v)
if not enableQbAimbot.Value then return end
if v:IsA('BasePart') and v.Name == 'Football' then
task.wait()
local lpChar = lp.Character
local lpHead = lpChar and lpChar:FindFirstChild('Head')
if not lpHead then return end
if v:GetAttribute('LocalAimbotBall') or (v.Position - lpHead.Position).Magnitude < 15 then
local tAttach0 = Instance.new('Attachment', workspace.Terrain)
local tAttach1 = Instance.new('Attachment', workspace.Terrain)
local tBeam = Instance.new('Beam')
tBeam.Attachment0 = tAttach0
tBeam.Attachment1 = tAttach1
tBeam.Segments = 7500
tBeam.Width0 = 1
tBeam.Width1 = 1
tBeam.FaceCamera = true
tBeam.Color = ColorSequence.new(Color3.fromRGB(255, 255, 255))
tBeam.Transparency = NumberSequence.new({
NumberSequenceKeypoint.new(0, 1),
NumberSequenceKeypoint.new(0.01, 0),
NumberSequenceKeypoint.new(1, 0)
})
tBeam.Parent = workspace.Terrain
local tPosPart = Instance.new('Part', workspace.Terrain)
tPosPart.Anchored = true
tPosPart.CanCollide = false
tPosPart.CastShadow = false
tPosPart.Size = Vector3.new(3, 3, 3)
tPosPart.Shape = Enum.PartType.Ball
tPosPart.Color = Color3.fromRGB(0, 0, 0)
local safeDirection = direction or Vector3.new(0, 1, 0)
local safeAirtime = math.max(tonumber(airtime) or 0.1, 0.1)
local curve0, curve1, cf1, cf2 = beamProjectile(Vector3.new(0, -28, 0), safeDirection, lpHead.Position + (safeDirection.Unit * 5), safeAirtime)
tBeam.CurveSize0 = curve0
tBeam.CurveSize1 = curve1
tAttach0.WorldCFrame = cf1
tAttach1.WorldCFrame = cf2
tPosPart.Position = Vector3.new(cf2.X, cf2.Y, cf2.Z)
task.delay(safeAirtime, function()
tBeam:Destroy()
tAttach0:Destroy()
tAttach1:Destroy()
tPosPart:Destroy()
end)
end
end
end)
runService.RenderStepped:Connect(function()
if not enableQbAimbot.Value then
updateHUDVisibility(false)
updateHighlights(false)
if beam then beam.Enabled = false end
if posPart then posPart.Position = Vector3.new(0, -9999, 0) end
if attach0 then attach0.WorldPosition = Vector3.new(0, -9999, 0) end
if attach1 then attach1.WorldPosition = Vector3.new(0, -9999, 0) end
target = nil
return
end
if not sg or not sg.Parent then return end
local char = lp.Character
if not char then return end
local head = char:FindFirstChild('Head')
local hrp = char:FindFirstChild('HumanoidRootPart')
if not head or not hrp then return end
local football = char:FindFirstChild('Football')
local hasFootball = (football ~= nil)
if hasFootball then
football:SetAttribute('LocalAimbotBall', true)
local fHandle = football:FindFirstChild('Handle')
if fHandle then fHandle:SetAttribute('LocalAimbotBall', true) end
end
local playerGui = lp:WaitForChild('PlayerGui', 10)
local ballGui = playerGui and playerGui:FindFirstChild('BallGui')
if autoJuke.Value and hasFootball and ballGui then
local fPos = Vector3.zero
local field = workspace:FindFirstChild('Models')
if field then field = field:FindFirstChild('Field') end
if field then field = field:FindFirstChild('Ground') end
if field then fPos = field.Position end
local minX = fPos.X - (155 / 2)
local maxX = fPos.X + (155 / 2)
local minZ = fPos.Z - (355 / 2)
local maxZ = fPos.Z + (355 / 2)
local dodgeVec = Vector3.zero
local threatCount = 0
local plrs = players:GetPlayers()
local teamCount = 0
pcall(function() teamCount = tonumber(#game:GetService('Teams'):GetTeams()) or 0 end)
for i = 1, #plrs do
local plr = plrs[i]
if plr ~= lp and plr.Character then
local isEnemy = true
if teamCount > 1 and lp.Team ~= nil and plr.Team ~= nil and lp.Team == plr.Team then
isEnemy = false
end
if isEnemy then
local eHrp = plr.Character:FindFirstChild('HumanoidRootPart')
if eHrp then
local distToMe = tonumber((eHrp.Position - hrp.Position).Magnitude) or 0
if distToMe < 45 then
local eVel = eHrp.AssemblyLinearVelocity or eHrp.Velocity or Vector3.zero
local eSpeed = tonumber(Vector3.new(eVel.X, 0, eVel.Z).Magnitude) or 0
local tta = distToMe / math.max(eSpeed, 1)
local futureTime = math.min(tta, 1)
local eFuture = eHrp.Position + (eVel * futureTime)
local myVel = hrp.AssemblyLinearVelocity or hrp.Velocity or Vector3.zero
local myFuture = hrp.Position + (myVel * futureTime)
local toThreat = eFuture - myFuture
local futureDist = tonumber(Vector3.new(toThreat.X, 0, toThreat.Z).Magnitude) or 0
if futureDist < 20 or distToMe < 25 then
threatCount = threatCount + 1
local awayDir = myFuture - eFuture
awayDir = Vector3.new(awayDir.X, 0, awayDir.Z)
if awayDir.Magnitude < 0.1 then
awayDir = hrp.CFrame.RightVector
end
awayDir = awayDir.Unit
local weight = math.clamp(45 - distToMe, 0, 45)
dodgeVec = dodgeVec + (awayDir * weight)
end
end
end
end
end
end
local hum = char:FindFirstChildOfClass('Humanoid')
if hum then
local checkPos = hrp.Position
local outOfBoundsPush = Vector3.zero
if checkPos.X < minX + 5 then outOfBoundsPush = outOfBoundsPush + Vector3.new(1, 0, 0) end
if checkPos.X > maxX - 5 then outOfBoundsPush = outOfBoundsPush + Vector3.new(-1, 0, 0) end
if checkPos.Z < minZ + 5 then outOfBoundsPush = outOfBoundsPush + Vector3.new(0, 0, 1) end
if checkPos.Z > maxZ - 5 then outOfBoundsPush = outOfBoundsPush + Vector3.new(0, 0, -1) end
local targetJukeDir = Vector3.zero
if threatCount > 0 then
targetJukeDir = dodgeVec.Unit
if outOfBoundsPush.Magnitude > 0 then
targetJukeDir = (targetJukeDir + outOfBoundsPush * 2).Unit
end
elseif outOfBoundsPush.Magnitude > 0 then
targetJukeDir = outOfBoundsPush.Unit
end
if targetJukeDir.Magnitude > 0 then
smoothedJukeDir = smoothedJukeDir:Lerp(targetJukeDir, 0.25)
hum:Move(smoothedJukeDir, false)
else
smoothedJukeDir = Vector3.zero
end
end
end
local isTracking = hasFootball and (ballGui ~= nil)
if isTracking then
if not hideCards.Value then
updateHUDVisibility(true)
else
updateHUDVisibility(false)
end
if not isThrowingAway then
local newTarget = getTarget()
if newTarget then
lastValidTarget = newTarget
elseif lastValidTarget and not lastValidTarget:FindFirstChild('HumanoidRootPart') then
lastValidTarget = nil
end
if throwAimbot.Value then
target = lastValidTarget
updateHighlights(false)
local targetPos
if isThrowing and lockedMousePos then
targetPos = lockedMousePos
else
targetPos = mouse.Hit.Position
lockedMousePos = targetPos
end
local headPos = head.Position
local gMag = 28
local calcPower, calcAngle = solveKinematics(headPos, targetPos, gMag)
calcPower = tonumber(calcPower) or 95
calcAngle = tonumber(calcAngle) or 45
if autoPower.Value then
power = math.clamp(calcPower, 0, 95)
end
if autoAngle.Value then
angle = math.clamp(calcAngle, -15, 90)
else
angle = math.clamp(tonumber(customHeight.Value) or 0, -15, 90)
end
local safePower = tonumber(power) or 60
local safeAngle = tonumber(angle) or 45
local angleRad = tonumber(math.rad(safeAngle)) or 0
local hDirRaw = Vector3.new(targetPos.X - headPos.X, 0, targetPos.Z - headPos.Z)
local hDir = hDirRaw.Magnitude > 0.01 and hDirRaw.Unit or hrp.CFrame.LookVector
local dirVelocity = (hDir * (tonumber(math.cos(angleRad)) or 1) + Vector3.new(0, tonumber(math.sin(angleRad)) or 0, 0)) * safePower
direction = dirVelocity.Unit * safePower
local hVel = safePower * (tonumber(math.cos(angleRad)) or 1)
if hVel > 0.1 then
local xDist = tonumber(Vector3.new(targetPos.X - headPos.X, 0, targetPos.Z - headPos.Z).Magnitude) or 0
airtime = xDist / hVel
else
airtime = 0
end
targetLeadPos = targetPos
else
target = newTarget or lastValidTarget
updateHighlights(true)
if target and hrp then
local tHRP = target:FindFirstChild('HumanoidRootPart')
if tHRP then
if autoSelectThrowMode.Value then
local m = calculateRouteDirection(target)
for i = 1, #ModeOrder do
if ModeOrder[i] == m then
modeIndex = i
break
end
end
local targetCurrentRoute = select(1, findRoute(target))
if ModeOrder[modeIndex] == 'Bullet' and (targetCurrentRoute == 'go/fade' or targetCurrentRoute == 'post/corner') then
for i = 1, #ModeOrder do
if ModeOrder[i] == 'Mag' then
modeIndex = i
break
end
end
end
end
autoAim(tHRP)
end
end
end
else
target = nil
updateHighlights(false)
end
if autoChangePowerUI.Value then
if ballGui and ballGui:FindFirstChild('Frame0') then
local frame0 = ballGui.Frame0
local safePower = tonumber(power) or 60
if safePower ~= safePower then safePower = 60 end
local displayPower = math.round(safePower / 5) * 5
local txt = frame0:FindFirstChildOfClass('TextLabel')
if txt then txt.Text = tostring(math.floor(displayPower)) end
local frames = frame0:GetChildren()
for i = 1, #frames do
local frame = frames[i]
if frame.Name ~= 'Disp' then
local frameNum = tonumber(frame.Name) or 0
frame.BackgroundTransparency = ((tonumber(frameNum) or 0) <= (tonumber(displayPower) or 0)) and 0 or 0.9
end
end
end
end
local safePowForCard = tonumber(power) or 60
if safePowForCard ~= safePowForCard then safePowForCard = 60 end
if HUDCards['Angle'] then
local forceAutoAngle = (ModeOrder[modeIndex] == 'Bullet' or (target and findRoute(target) == 'slant' or findRoute(target) == 'drag' or findRoute(target) == 'in/out' or findRoute(target) == 'flat' or findRoute(target) == 'hitch' or findRoute(target) == 'curl/comeback') or (tonumber(power) or 60) == 95 or highPowerOnly.Value)
if not autoAngle.Value and not forceAutoAngle then
HUDCards['Angle'].Text = tostring(math.floor(tonumber(customHeight.Value) or 0))
else
HUDCards['Angle'].Text = tostring(math.floor(tonumber(angle) or 45))
end
end
if HUDCards['Power'] then HUDCards['Power'].Text = string.format('%.0f', safePowForCard) end
if HUDCards['Airtime'] then HUDCards['Airtime'].Text = string.format('%.1fs', tonumber(airtime) or 0) end
if HUDCards['Throw Type'] then HUDCards['Throw Type'].Text = tostring(ModeOrder[modeIndex] or 'N/A') end
if HUDCards['Player'] then
if throwAimbot.Value then
HUDCards['Player'].Text = 'MOUSE'
else
HUDCards['Player'].Text = tostring((target and target.Name) or 'NONE')
end
end
else
updateHUDVisibility(false)
updateHighlights(false)
target = nil
lastValidTarget = nil
end
if beam and isTracking then
beam.Enabled = true
local startOrigin = head.Position
local safePowerForBeam = tonumber(power) or 60
local drawDir = direction or Vector3.new(0, 1, 0)
if throwAimbot.Value then
if (tonumber(drawDir.Magnitude) or 0) < 0.1 then
drawDir = Vector3.new(0, 1, 0) * safePowerForBeam
end
elseif not target or not targetLeadPos then
local mouseRay = camera:ScreenPointToRay(mouse.X, mouse.Y)
drawDir = mouseRay.Direction.Unit * safePowerForBeam
direction = drawDir
else
if (tonumber(drawDir.Magnitude) or 0) < 0.1 then
drawDir = Vector3.new(0, 1, 0) * safePowerForBeam
end
end
local safeAirtime = math.max(tonumber(airtime) or 0.1, 0.1)
local curve0, curve1, cf1, cf2 = beamProjectile(Vector3.new(0,-28,0), drawDir, startOrigin + (drawDir.Unit * 5), safeAirtime)
beam.CurveSize0 = curve0
beam.CurveSize1 = curve1
if attach0 and attach1 then
attach0.WorldCFrame = cf1
attach1.WorldCFrame = cf2
attach0.WorldPosition = Vector3.new(cf1.X, cf1.Y, cf1.Z)
attach1.WorldPosition = Vector3.new(cf2.X, cf2.Y, cf2.Z)
if posPart then posPart.Position = Vector3.new(attach1.WorldPosition.X, attach1.WorldPosition.Y, attach1.WorldPosition.Z) end
end
else
if beam then beam.Enabled = false end
if posPart then posPart.Position = Vector3.new(0, -9999, 0) end
if attach0 then attach0.WorldPosition = Vector3.new(0, -9999, 0) end
if attach1 then attach1.WorldPosition = Vector3.new(0, -9999, 0) end
end
end)
local CatchingTab = Window:CreateTab({ Name = 'Catching', Icon = 'rbxassetid://6034227067' })
footballMagnets = CatchingTab:CreateToggle({
Name = 'Enable Football Magnets',
Default = false,
Tip = 'Automatically pulls nearby footballs into catch range.',
})
freeFallCheck = CatchingTab:CreateToggle({
Name = 'Magnets Freefall Check',
Default = false,
Tip = 'Only activates football magnets while the ball is airborne.',
})
showCatchHitbox = CatchingTab:CreateToggle({
Name = 'Show Magnets Radius',
Default = false,
Tip = 'Displays the football magnets catch radius.',
})
magnetsRadius = CatchingTab:CreateSlider({
Name = 'Magnets Catch Distance',
Min = 0,
Max = 25,
Default = 0,
Increment = 0.1,
Suffix = '',
Tip = 'Sets the maximum distance footballs can be caught from.',
})
magnetsDelay = CatchingTab:CreateSlider({
Name = 'Magnets Catch Delay',
Min = 0,
Max = 1,
Default = 0,
Increment = 0.1,
Suffix = '',
Tip = 'Sets the delay before football magnets activate.',
})
magsType = CatchingTab:CreateDropdown({
Name = 'Magnets Type',
Options = {'Custom', 'Blatant', 'League', 'Legit'},
Default = 'Custom',
Tip = 'Selects the football magnets behavior preset.',
})
local player = game:GetService('Players').LocalPlayer
local part = Instance.new('Part')
part.Color = Color3.fromRGB(255, 255, 255)
part.Shape = Enum.PartType.Ball
part.Material = Enum.Material.ForceField
part.CastShadow = false
part.Anchored = true
part.CanCollide = false
local findClosestBall = function()
local character = player.Character
if not character then return end
local humanoidRootPart = character:FindFirstChild('HumanoidRootPart')
if not humanoidRootPart then return end
local dist = math.huge
local ball = nil
for _, v in next, workspace:GetChildren() do
if not v:IsA('BasePart') then continue end
if v.Name ~= 'Football' then continue end
local distance = (v.Position - humanoidRootPart.Position).Magnitude
if distance < dist then
dist = distance
ball = v
end
end
return ball
end
local selectedRange = function()
local range = tonumber(magnetsRadius.Value) or 0
local mode = tostring(magsType.Value or 'Custom'):lower()
if mode == 'legit' then
return range / 2
elseif mode == 'league' then
return range / 1.4
elseif mode == 'blatant' then
return range * 1.5
end
return range
end
task.spawn(function()
while true do
task.wait()
local character = player.Character
if not character then continue end
local humanoid = character:FindFirstChildOfClass('Humanoid')
if not humanoid then continue end
local ball = findClosestBall()
if not ball then continue end
local range = selectedRange()
part.Size = Vector3.new(range, range, range)
part.CFrame = CFrame.new(ball.Position)
part.Parent = (footballMagnets.Value and showCatchHitbox.Value) and workspace.Terrain or nil
for _, v in next, character:GetChildren() do
if not v:IsA('BasePart') then continue end
if not v.Name:lower():find('catch') then continue end
local distance = (ball.Position - v.Position).Magnitude
if freeFallCheck.Value and humanoid:GetState() ~= Enum.HumanoidStateType.Freefall then continue end
if footballMagnets.Value and distance < range then
tweenService:Create(v, TweenInfo.new(magnetsDelay.Value), {Position = ball.Position}):Play()
pcall(function()
firetouchinterest(v, ball, 0)
firetouchinterest(v, ball, 1)
end)
end
end
end
end)
CatchingTab:CreateDivider()
magEnhancer = CatchingTab:CreateToggle({
Name = 'Enable Mag Enhancer',
Default = false,
Tip = 'Enhances catches on footballs already within range.',
})
magEnhancerRadius = CatchingTab:CreateSlider({
Name = 'Mag Catch Distance',
Min = 0,
Max = 25,
Default = 0,
Increment = 0.1,
Suffix = '',
Tip = 'Sets the maximum distance the enhancer can assist catches.',
})
magEnhancerMaxAngle = CatchingTab:CreateSlider({
Name = 'Mag Max Angle',
Min = 50,
Max = 70,
Default = 50,
Increment = 0.1,
Suffix = '',
Tip = 'Sets the maximum catch angle the enhancer can assist.',
})
task.spawn(function()
while true do
task.wait(0.1)
if not magEnhancer.Value then continue end
local character = player.Character
if not character then continue end
local humanoidRootPart = character:FindFirstChild('HumanoidRootPart')
if not humanoidRootPart then continue end
local ball = findClosestBall()
if not ball then continue end
local verticalDistance = ball.Position.Y - humanoidRootPart.Position.Y
if verticalDistance > magEnhancerMaxAngle.Value then
continue
end
local lookVector = humanoidRootPart.CFrame.LookVector
local direction = (ball.Position - humanoidRootPart.Position).Unit
local dot = lookVector:Dot(direction)
for _, v in next, character:GetChildren() do
if not v:IsA('BasePart') then continue end
if not v.Name:lower():find('catch') then continue end
local distance = (ball.Position - v.Position).Magnitude
if dot > 0 and distance <= magEnhancerRadius.Value then
tweenService:Create(v, TweenInfo.new(0), {Position = ball.Position}):Play()
pcall(function()
firetouchinterest(v, ball, 0)
firetouchinterest(v, ball, 1)
end)
end
end
end
end)
CatchingTab:CreateDivider()
pullVector = CatchingTab:CreateToggle({
Name = 'Enable Pull Vector',
Default = false,
Tip = 'Pulls nearby footballs toward your catch position.',
})
pullVectorRadius = CatchingTab:CreateSlider({
Name = 'Pull Vector Radius',
Min = 0,
Max = 45,
Default = 0,
Increment = 0.1,
Suffix = '',
Tip = 'Sets the maximum distance footballs can be pulled from.',
})
pullVectorPower = CatchingTab:CreateSlider({
Name = 'Pull Vector Power',
Min = 0,
Max = 5,
Default = 0,
Increment = 0.1,
Suffix = '',
Tip = 'Controls how strongly footballs are pulled toward you.',
})
task.spawn(function()
while true do
task.wait()
if not pullVector.Value then continue end
local character = player.Character
if not character then continue end
local humanoidRootPart = character:FindFirstChild('HumanoidRootPart')
if not humanoidRootPart then continue end
local ball = findClosestBall()
if not ball then continue end
local distance = (ball.Position - humanoidRootPart.Position).Magnitude
if distance > pullVectorRadius.Value then continue end
local direction = (ball.Position - humanoidRootPart.Position).Unit
humanoidRootPart.AssemblyLinearVelocity = direction * (pullVectorPower.Value * 25)
end
end)
CatchingTab:CreateDivider()
increaseArmSize = CatchingTab:CreateToggle({
Name = 'Increase Arm Size',
Default = false,
Tip = 'Increases arm size to improve catch reach.',
})
armSizeValue = CatchingTab:CreateSlider({
Name = 'Arm Size Value',
Min = 2,
Max = 25,
Default = 2,
Increment = 0.1,
Suffix = '',
Tip = 'Sets the size applied to both arms.',
})
task.spawn(function()
while true do
task.wait()
local character = player.Character
if not character then continue end
for _, v in next, character:GetChildren() do
if not v:IsA('BasePart') then continue end
if not v.Name:lower():find('t arm') then continue end
v.Size = Vector3.new(v.Size.X, increaseArmSize.Value and armSizeValue.Value or 2, v.Size.Z)
end
end
end)
local PlayerTab = Window:CreateTab({ Name = 'Player', Icon = 'rbxassetid://103807548355126' })
customWalkSpeed = PlayerTab:CreateToggle({
Name = 'Custom WalkSpeed',
Default = false,
Tip = 'Overrides your character movement speed.',
})
walkSpeedValue = PlayerTab:CreateSlider({
Name = 'WalkSpeed Value',
Min = 20,
Max = 23,
Default = 20,
Increment = 0.1,
Suffix = '',
Tip = 'Sets the movement speed value.',
})
walkspeedType = PlayerTab:CreateDropdown({
Name = 'WalkSpeed Type',
Options = {'Normal', 'CFrame'},
Default = 'Normal',
Tip = 'Selects how movement speed is applied.',
})
task.spawn(function()
while true do
task.wait()
if not customWalkSpeed.Value then continue end
local character = player.Character
if not character then continue end
local humanoid = character:FindFirstChildOfClass('Humanoid')
if not humanoid then continue end
if humanoid.PlatformStand then continue end
if humanoid.WalkSpeed == 0 then continue end
local root = character:FindFirstChild('HumanoidRootPart')
if not root then continue end
local direction = Vector3.new(humanoid.MoveDirection.X, 0, humanoid.MoveDirection.Z)
if direction.Magnitude <= 0 then continue end
local velocity = direction.Unit * (walkspeedType.Value == 'CFrame' and (walkSpeedValue.Value / 75) or walkSpeedValue.Value)
if humanoid:GetState() == Enum.HumanoidStateType.Running then
local scale = walkSpeedValue.Value / math.max(humanoid.WalkSpeed, 1)
local animator = humanoid:FindFirstChildOfClass('Animator')
if animator then
for _, track in next, animator:GetPlayingAnimationTracks() do
track:AdjustSpeed(scale)
end
end
end
if walkspeedType.Value ~= 'CFrame' then
root.AssemblyLinearVelocity = Vector3.new(velocity.X, root.AssemblyLinearVelocity.Y, velocity.Z)
else
root.CFrame = root.CFrame + velocity
end
end
end)
PlayerTab:CreateDivider()
customJumpPower = PlayerTab:CreateToggle({
Name = 'Custom JumpPower',
Default = false,
Tip = 'Overrides your character jump power.',
})
jumpPowerValue = PlayerTab:CreateSlider({
Name = 'JumpPower Value',
Min = 50,
Max = 70,
Default = 50,
Increment = 0.1,
Suffix = '',
Tip = 'Sets the custom jump power.',
})
task.spawn(function()
while true do
task.wait()
if not customJumpPower.Value then continue end
local character = player.Character
if not character then continue end
local humanoid = character:FindFirstChildOfClass('Humanoid')
if not humanoid then continue end
local root = character:FindFirstChild('HumanoidRootPart')
if not root then continue end
if humanoid:GetState() ~= Enum.HumanoidStateType.Jumping then continue end
task.wait()
root.AssemblyLinearVelocity = Vector3.new(root.AssemblyLinearVelocity.X, jumpPowerValue.Value, root.AssemblyLinearVelocity.Z)
end
end)
PlayerTab:CreateDivider()
angleEnhancer = PlayerTab:CreateToggle({
Name = 'Angle Enhancer',
Default = false,
Tip = 'Boosts jump height when directional look changes while jumping.',
})
angleEnhancerIndicator = PlayerTab:CreateToggle({
Name = 'Angle Enhancer Indicator',
Default = false,
Tip = 'Showsa notification when an angle boost is triggered.',
})
autoFlip = PlayerTab:CreateToggle({
Name = 'Auto Flip Before Landing',
Default = false,
Tip = 'Automatically adjusts player orientation before landing.',
})
angleEnhanceBoost = PlayerTab:CreateSlider({
Name = 'Angle Boost Value',
Min = 50,
Max = 70,
Default = 50,
Increment = 0.1,
Suffix = '',
Tip = 'Sets the vertical velocity applied during angle boost.',
})
local lastTick = 0
local oldLookVector = nil
task.spawn(function()
while true do
task.wait()
if not angleEnhancer.Value then continue end
local character = player.Character
if not character then oldLookVector = nil continue end
local humanoid = character:FindFirstChildOfClass('Humanoid')
local hrp = character:FindFirstChild('HumanoidRootPart')
if not humanoid or not hrp then oldLookVector = nil continue end
if humanoid:GetState() ~= Enum.HumanoidStateType.Jumping then
continue
end
local currentTime = tick()
local newLookVector = hrp.CFrame.LookVector
if not oldLookVector then
oldLookVector = newLookVector
lastTick = currentTime
continue
end
local angleChange = math.acos(math.clamp(oldLookVector:Dot(newLookVector), -1, 1))
local shiftLockEnabled = userInputService.MouseBehavior == Enum.MouseBehavior.LockCenter
if currentTime - lastTick >= 0.2 and angleChange > math.rad(5) then
lastTick = currentTime
oldLookVector = newLookVector
end
if angleChange > math.rad(25) and currentTime - lastTick <= 2.5 then
lastTick = currentTime
oldLookVector = newLookVector
task.wait()
local vel = hrp.AssemblyLinearVelocity
hrp.AssemblyLinearVelocity = Vector3.new(vel.X, angleEnhanceBoost.Value, vel.Z)
if angleEnhancerIndicator.Value and (shiftLockEnabled or true) then
local hint = Instance.new('Hint')
hint.Text = 'Angled!'
hint.Parent = workspace.Terrain
task.delay(2.5, function()
if hint then
hint:Destroy()
end
end)
end
end
end
end)
local runtime, jumptime, hittime = 0, 0, 0
local arm, vLine, used, prevPs = false, nil, false, false
local seq = 0
local pack = nil
local xz = function(v: Vector3)
local f = Vector3.new(v.X, 0, v.Z)
return f.Magnitude > 0.001 and f.Unit or nil
end
local reset = function()
if not pack then return end
for _, o in next, { pack.spin, pack.ra, pack.pivot, pack.ha } do
if o then o:Destroy() end
end
pack = nil
end
local flip = function(root: BasePart, head: BasePart)
reset()
local m = math.max(root.AssemblyMass, 1)
local ha = Instance.new("Attachment")
ha.Parent = head
local pivot = Instance.new("AlignPosition")
pivot.Mode = Enum.PositionAlignmentMode.OneAttachment
pivot.Attachment0 = ha
pivot.Position = head.Position + Vector3.new(0, 0.15, 0)
pivot.MaxForce = 180000
pivot.Responsiveness = 120
pivot.RigidityEnabled = false
pivot.ApplyAtCenterOfMass = false
pivot.Parent = head
local ra = Instance.new("Attachment")
ra.Parent = root
local spin = Instance.new("AngularVelocity")
spin.Attachment0 = ra
spin.RelativeTo = Enum.ActuatorRelativeTo.Attachment0
spin.AngularVelocity = Vector3.new(-9, 0, 0)
spin.MaxTorque = 50000
spin.Parent = root
root:ApplyAngularImpulse(root.CFrame.RightVector * (-16 * m))
pack = { ha = ha, pivot = pivot, ra = ra, spin = spin }
end
task.spawn(function()
while true do
task.wait()
if not autoFlip.Value then continue end
local char = player.Character
if not char then
reset()
arm, vLine, used, prevPs = false, nil, false, false
continue
end
local hum = char:FindFirstChildOfClass("Humanoid")
local hrp = char:FindFirstChild("HumanoidRootPart")
local head = char:FindFirstChild("Head")
if not hum or not hrp or not head then continue end
local now = tick()
if hum:GetState() == Enum.HumanoidStateType.Running then runtime = now end
if hum:GetState() == Enum.HumanoidStateType.Jumping then jumptime = now end
local ps = hum.PlatformStand
if ps ~= prevPs then
if ps then
arm = (now - runtime <= 0.5) and (now - jumptime <= 0.7)
vLine = xz(hrp.AssemblyLinearVelocity) or xz(hrp.CFrame.LookVector)
used = false
else
arm, vLine, used = false, nil, false
seq += 1
reset()
end
prevPs = ps
end
if not ps or not arm or pack then continue end
local params = RaycastParams.new()
params.FilterType = Enum.RaycastFilterType.Exclude
params.FilterDescendantsInstances = { char }
local result = workspace:Raycast(head.Position, Vector3.new(0, -3, 0), params)
local ground = result and result.Instance ~= nil
if used or not ground or now - hittime < 0.12 then continue end
local dist = result and (head.Position - result.Position).Magnitude or math.huge
if dist > 1.6 then continue end
local move = xz(hrp.AssemblyLinearVelocity) or vLine
local face = xz(hrp.CFrame.LookVector)
if not move or not face or face:Dot(move) < 0.78 then continue end
hittime = now
used = true
seq += 1
local k = seq
flip(hrp, head)
task.delay(0.24, function()
if k == seq then
reset()
end
end)
end
end)
PlayerTab:CreateDivider()
PlayerTab:CreateButton({
Name = 'Unlock All Gamepass',
Tip = 'Enables all gamepass-related checks locally.',
Callback = function()
local replicatedFirst = game:GetService('ReplicatedFirst')
local module
local success = pcall(function()
module = require(replicatedFirst:FindFirstChild('LocalSave'))
end)
if not success or not module then
return
end
module.PlayerOwnsPass = function(a, b)
return true
end
end
})
local PhysicsTab = Window:CreateTab({ Name = 'Physics', Icon = 'rbxassetid://11537490966' })
local boundaries = {}
if not isPractice then
for i, v in next, workspace.Models.Boundaries:GetChildren() do
boundaries[#boundaries + 1] = v
end
end
antiBoundaries = PhysicsTab:CreateToggle({
Name = 'Anti OOB',
Default = false,
Tip = 'Prevents players from triggering out-of-bounds zones.',
Callback = function(v)
for i, b in next, boundaries do
if b then
b.Parent = not v and workspace.Models.Boundaries or nil
end
end
end
})
antiBench = PhysicsTab:CreateToggle({
Name = 'Anti Bench',
Default = false,
Tip = 'Prevents automatic benching.',
})
task.spawn(function()
while true do
task.wait()
if not antiBench.Value then continue end
local playerGui = player:FindFirstChild('PlayerGui')
if not playerGui then continue end
local benchButton = playerGui:FindFirstChild('Benched', true)
if not benchButton then continue end
if benchButton.BackgroundColor3 == Color3.fromRGB(120, 120, 120) then
replicatedStorage.Remotes.CharacterSoundEvent:FireServer('Game', 'ToggleBench')
end
end
end)
--[[
local scrambleWall = workspace:FindFirstChild('ScrambleWall')
antiQbBoundaries = PhysicsTab:CreateToggle({
Name = 'Anti QB Boundaries',
Default = false,
Tip = 'Disables invisible QB boundary walls.',
Callback = function(v)
if not scrambleWall then return end
scrambleWall.Parent = v and nil or workspace
end
})
]]
PhysicsTab:CreateDivider()
antiJam = PhysicsTab:CreateToggle({
Name = 'Anti Jam',
Default = false,
Tip = 'Reduces player collision while moving.',
})
antiJumpCooldown = PhysicsTab:CreateToggle({
Name = 'Anti Jump Cooldown',
Default = false,
Tip = 'Removes the delay between jumps.',
})
antiFreeze = PhysicsTab:CreateToggle({
Name = 'Anti Freeze',
Default = false,
Tip = 'Prevents movement speed from being reduced.',
})
task.spawn(function()
while true do
task.wait()
if antiJumpCooldown.Value then
player.Character.Humanoid:SetStateEnabled(Enum.HumanoidStateType.Jumping, true)
end
if antiFreeze.Value then
if player.Character.Humanoid.WalkSpeed ~= 20 then
player.Character.Humanoid.WalkSpeed = 20
end
end
for _, v in next, players:GetPlayers() do
if v == player then continue end
local character = v.Character
if not character then continue end
local hum = character:FindFirstChildOfClass('Humanoid')
if not hum then continue end
for _, part in next, character:GetChildren() do
if not part:IsA('BasePart') then continue end
if part.Name == 'Head' or part.Name == 'Torso' then
if hum:GetState() == Enum.HumanoidStateType.Running then
part.CanCollide = not antiJam.Value
else
part.CanCollide = true
end
end
end
end
end
end)
antiBlock = PhysicsTab:CreateToggle({
Name = 'Anti Block',
Default = false,
Tip = 'Reduces player collision while moving.',
})
task.spawn(function()
while true do
task.wait()
if not antiBlock.Value then continue end
local character = player.Character
if not character then continue end
local humanoid = character:FindFirstChildOfClass('Humanoid')
if not humanoid then continue end
for _, v in next, character:GetDescendants() do
if not v:IsA('BodyVelocity') then continue end
-- if not v.Name:lower():find('ffmover') then continue end
v.Velocity = Vector3.zero
v.MaxForce = Vector3.zero
humanoid.WalkSpeed = 20
pcall(function()
v:Destroy()
end)
end
end
end)
PhysicsTab:CreateDivider()
quickTP = PhysicsTab:CreateToggle({
Name = 'Quick TP',
Default = false,
Tip = 'Teleports forward in the direction you are facing.',
})
quickTPPower = PhysicsTab:CreateSlider({
Name = 'Quick TP Power',
Min = 0,
Max = 5,
Default = 0,
Increment = 0.1,
Suffix = '',
Tip = 'Sets the teleport distance.',
})
HideKeybind = PhysicsTab:CreateKeybind({
Name = 'Quick TP Keybind',
Default = Enum.KeyCode.Q,
Tip = 'Key used to activate Quick TP.',
})
userInputService.InputBegan:Connect(function(input, gpe)
if gpe then return end
if not quickTP.Value then return end
if input.KeyCode ~= HideKeybind.Value and input.UserInputType ~= Enum.UserInputType.Touch then return end
local character = player.Character
if not character then return end
local hrp = character:FindFirstChild('HumanoidRootPart')
if not hrp then return end
hrp.CFrame += hrp.CFrame.LookVector * quickTPPower.Value
end)
PhysicsTab:CreateDivider()
bigHead = PhysicsTab:CreateToggle({
Name = 'Big Head Players',
Default = false,
Tip = 'Increases the size of other players heads.',
})
bigHeadSize = PhysicsTab:CreateSlider({
Name = 'Big Head Size',
Min = 1,
Max = 6,
Default = 1,
Increment = 0.1,
Suffix = '',
Tip = 'Sets the size applied to player heads.',
})
task.spawn(function()
while true do
task.wait()
for _, v in next, players:GetPlayers() do
if v == player then continue end
local character = v.Character
if not character then continue end
local head = character:FindFirstChild('Head')
if not head then continue end
head.Size = Vector3.new(bigHead.Value and bigHeadSize.Value or 1, bigHead.Value and bigHeadSize.Value or 1, bigHead.Value and bigHeadSize.Value or 1)
end
end
end)
local VisualTab = Window:CreateTab({ Name = 'Visual', Icon = 'rbxassetid://88610077537468' })
jumpSpot = VisualTab:CreateToggle({
Name = 'Visualise Football Jump Spot',
Default = false,
Tip = 'Displays the predicted jump location of incoming footballs.',
})
workspace.ChildAdded:Connect(function(v)
if not jumpSpot.Value then return end
if not v:IsA('BasePart') or v.Name ~= 'Football' then return end
task.wait()
local position = v.Position
local velocity = v.AssemblyLinearVelocity
local gravity = Vector3.new(0, -28, 0)
local deltaTime = 1 / 30
local positions = {position}
local raycastParams = RaycastParams.new()
raycastParams.FilterType = Enum.RaycastFilterType.Exclude
raycastParams.FilterDescendantsInstances = {v}
raycastParams.IgnoreWater = true
for _ = 1, 300 do
local nextPosition = position + velocity * deltaTime + 0.5 * gravity * deltaTime ^ 2
velocity += gravity * deltaTime
if velocity.Y < 0 then
local direction = nextPosition - position
local result = workspace:Raycast(position, direction + Vector3.new(0, -14.4, 0), raycastParams)
if result then
nextPosition = result.Position
table.insert(positions, nextPosition)
break
end
end
table.insert(positions, nextPosition)
position = nextPosition
end
local optimalPoint = positions[#positions]
local model = Instance.new('Model')
model.Parent = workspace
local baseY = optimalPoint.Y - 1.5
local undergroundY = baseY - 6
local gradientCylinder = Instance.new('MeshPart')
gradientCylinder.MeshId = 'rbxassetid://8091779363'
gradientCylinder.Material = Enum.Material.Plastic
gradientCylinder.Size = Vector3.new(2, 4, 2)
gradientCylinder.Rotation = Vector3.new(180, 0, 180)
gradientCylinder.Transparency = 1
gradientCylinder.Anchored = true
gradientCylinder.CanCollide = false
gradientCylinder.Position = Vector3.new(optimalPoint.X, undergroundY, optimalPoint.Z)
gradientCylinder.Parent = model
local faces = {
Enum.NormalId.Front,
Enum.NormalId.Back,
Enum.NormalId.Left,
Enum.NormalId.Right
}
for _, face in next, faces do
local decal = Instance.new('Decal')
decal.Face = face
decal.Texture = 'rbxassetid://8097185954'
decal.Transparency = 0
decal.Color3 = Color3.fromRGB(255, 255, 255)
decal.Parent = gradientCylinder
end
local glowCircle = Instance.new('MeshPart')
glowCircle.MeshId = 'rbxassetid://8091848285'
glowCircle.Material = Enum.Material.Neon
glowCircle.Color = Color3.fromRGB(255, 255, 255)
glowCircle.Size = Vector3.new(3.731, 0.031, 3.731)
glowCircle.Rotation = Vector3.new(180, 0, 180)
glowCircle.Transparency = 1
glowCircle.Anchored = true
glowCircle.CanCollide = false
glowCircle.Position = Vector3.new(optimalPoint.X, undergroundY, optimalPoint.Z)
glowCircle.Parent = model
local emitter = Instance.new('ParticleEmitter')
emitter.Texture = 'rbxasset://textures/particles/sparkles_main.dds'
emitter.Rate = 5
emitter.Speed = NumberRange.new(5, 5)
emitter.Lifetime = NumberRange.new(0.5, 0.5)
emitter.EmissionDirection = Enum.NormalId.Top
emitter.TimeScale = 0.3
emitter.Color = ColorSequence.new(Color3.fromRGB(255, 255, 255))
emitter.Parent = gradientCylinder
local bottomPart = Instance.new('Part')
bottomPart.Size = Vector3.new(0.311, 0.311, 0.311)
bottomPart.Transparency = 1
bottomPart.Material = Enum.Material.Plastic
bottomPart.Anchored = true
bottomPart.CanCollide = false
bottomPart.Position = Vector3.new(optimalPoint.X, undergroundY, optimalPoint.Z)
bottomPart.Parent = model
local pointLight = Instance.new('PointLight')
pointLight.Color = Color3.fromRGB(255, 255, 255)
pointLight.Range = 12
pointLight.Brightness = 2
pointLight.Parent = bottomPart
local tweenInfo = TweenInfo.new(0.55, Enum.EasingStyle.Quad, Enum.EasingDirection.Out)
local upGoal = {
Position = Vector3.new(optimalPoint.X, baseY, optimalPoint.Z)
}
local downGoal = {
Position = Vector3.new(optimalPoint.X, undergroundY, optimalPoint.Z)
}
local upTweens = {
tweenService:Create(gradientCylinder, tweenInfo, upGoal),
tweenService:Create(glowCircle, tweenInfo, upGoal),
tweenService:Create(bottomPart, tweenInfo, upGoal)
}
for _, t in next, upTweens do
t:Play()
end
task.spawn(function()
while v and v.Parent and v.AssemblyLinearVelocity.Magnitude > 1 do
task.wait()
end
local downTweens = {
tweenService:Create(gradientCylinder, tweenInfo, downGoal),
tweenService:Create(glowCircle, tweenInfo, downGoal),
tweenService:Create(bottomPart, tweenInfo, downGoal)
}
for _, t in next, downTweens do
t:Play()
end
task.wait(0.4)
if model.Parent then
model:Destroy()
end
end)
end)
throwSpot = VisualTab:CreateToggle({
Name = 'Visualise Football Throw Spot',
Default = false,
Tip = 'Shows the predicted landing point of thrown footballs.',
})
workspace.ChildAdded:Connect(function(v)
if not throwSpot.Value then return end
if not v:IsA('BasePart') or v.Name ~= 'Football' then return end
task.wait()
local pos = v.Position
local vel = v.AssemblyLinearVelocity
local gravity = Vector3.new(0, -28, 0)
local positions = {}
local parts = {}
local dt = 0.05
local maxTime = 8
local lastPos = pos
local spawnY = pos.Y
for t = 0, maxTime, dt do
local projectilePos = pos + (vel * t) + (0.5 * gravity * t * t)
table.insert(positions, projectilePos)
if projectilePos.Y < spawnY then
break
end
local ray = workspace:Raycast(lastPos, projectilePos - lastPos)
if ray then
positions[#positions] = ray.Position
break
end
lastPos = projectilePos
end
local endPos = positions[#positions]
if not endPos then return end
local posPart = Instance.new('Part', workspace.Terrain)
posPart.Anchored = true
posPart.CanCollide = false
posPart.CastShadow = false
posPart.Size = Vector3.new(3, 3, 3)
posPart.Shape = Enum.PartType.Ball
posPart.Color = Color3.fromRGB(0, 0, 0)
posPart.Position = endPos
for i = 1, #positions - 1 do
local p0 = positions[i]
local p1 = positions[i + 1]
local beamPart = Instance.new('Part', workspace.Terrain)
beamPart.Anchored = true
beamPart.CanCollide = false
beamPart.CastShadow = false
beamPart.Material = Enum.Material.Neon
beamPart.Color = Color3.fromRGB(255, 255, 255)
local dist = (p1 - p0).Magnitude
beamPart.Size = Vector3.new(0.4, 0.4, dist)
beamPart.CFrame = CFrame.lookAt((p0 + p1) / 2, p1)
table.insert(parts, beamPart)
end
task.spawn(function()
local speed = math.max(vel.Magnitude, 1)
local delayTime = math.clamp(300 / speed, 0.01, 0.04)
for _, part in next, parts do
task.wait(delayTime)
if part.Parent then
part:Destroy()
end
end
if posPart.Parent then
posPart:Destroy()
end
end)
end)
VisualTab:CreateDivider()
enableGloves = VisualTab:CreateToggle({
Name = 'Enable Uniform Gloves',
Default = true,
Tip = 'Toggles visibility of uniform gloves.',
})
task.spawn(function()
while true do
task.wait()
local character = player.Character
if not character then continue end
local uniform = character:FindFirstChild('Uniform')
if not uniform then continue end
local gloveVisible
for _, v in next, uniform:GetDescendants() do
if not v:IsA('BasePart') then continue end
if not v.Name:lower():find('glove') then continue end
gloveVisible = v.Transparency == 0
break
end
if gloveVisible == nil then continue end
if enableGloves.Value and not gloveVisible then
replicatedStorage.Remotes.CharacterSoundEvent:FireServer('Game', 'Customization', 'Toggle', 'LeftGlove')
replicatedStorage.Remotes.CharacterSoundEvent:FireServer('Game', 'Customization', 'Toggle', 'RightGlove')
elseif not enableGloves.Value and gloveVisible then
replicatedStorage.Remotes.CharacterSoundEvent:FireServer('Game', 'Customization', 'Toggle', 'LeftGlove')
replicatedStorage.Remotes.CharacterSoundEvent:FireServer('Game', 'Customization', 'Toggle', 'RightGlove')
end
end
end)
VisualTab:CreateDivider()
noBallTrail = VisualTab:CreateToggle({
Name = 'No Ball Trail',
Default = false,
Tip = 'Removes football trail effects.',
})
workspace.ChildAdded:Connect(function(v)
if not noBallTrail.Value then return end
if v:IsA('BasePart') and v.Name == 'Football' then
local trail = v:FindFirstChildOfClass('Trail')
if trail then
trail:Destroy()
end
end
end)
local stadiumParts = {}
for _, v in next, workspace.Models.Stadium:GetDescendants() do
if not v:IsA('BasePart') then continue end
stadiumParts[#stadiumParts + 1] = {
Part = v,
Transparency = v.Transparency,
CanCollide = v.CanCollide
}
end
hideStadium = VisualTab:CreateToggle({
Name = 'Hide Stadium',
Default = false,
Tip = 'Hides visible stadium structures.',
Callback = function(v)
for _, p in next, stadiumParts do
p.Part.Transparency = v and 1 or p.Transparency
p.Part.CanCollide = v and false or p.CanCollide
end
end
})
VisualTab:CreateDivider()
local lighting = game:GetService('Lighting')
local function ApplySkyBox(name)
for _, v in next, lighting:GetChildren() do
if v:IsA("Sky") or v:IsA("PostEffect") or v:IsA("Atmosphere") then
v:Destroy()
end
end
if name == "Golden Twilight" then
local Sky = Instance.new("Sky")
Sky.Name = name
Sky.Parent = lighting
Sky.SkyboxBk = "rbxassetid://541743453"
Sky.SkyboxDn = "rbxassetid://541743443"
Sky.SkyboxFt = "rbxassetid://541743446"
Sky.SkyboxLf = "rbxassetid://541743436"
Sky.SkyboxRt = "rbxassetid://541743435"
Sky.SkyboxUp = "rbxassetid://541743441"
elseif name == "Infernal Horizon" then
local Sky = Instance.new("Sky")
Sky.Name = name
Sky.Parent = lighting
Sky.SkyboxBk = "http://www.roblox.com/asset/?id=169210090"
Sky.SkyboxDn = "http://www.roblox.com/asset/?id=169210108"
Sky.SkyboxFt = "http://www.roblox.com/asset/?id=169210121"
Sky.SkyboxLf = "http://www.roblox.com/asset/?id=169210133"
Sky.SkyboxRt = "http://www.roblox.com/asset/?id=169210143"
Sky.SkyboxUp = "http://www.roblox.com/asset/?id=169210149"
Sky.StarCount = 100
Sky.SunTextureId = " "
local BlurEffect = Instance.new("BlurEffect")
BlurEffect.Parent = lighting
BlurEffect.Size = 6
local ColorCorrectionEffect = Instance.new("ColorCorrectionEffect")
ColorCorrectionEffect.Parent = lighting
ColorCorrectionEffect.Brightness = 0.01
ColorCorrectionEffect.Contrast = 0.15
ColorCorrectionEffect.Saturation = 0.4
ColorCorrectionEffect.TintColor = Color3.new(0.815686, 0.776471, 0.690196)
elseif name == "Nebula Peaks" then
local Sky = Instance.new("Sky")
Sky.Name = name
Sky.Parent = lighting
Sky.CelestialBodiesShown = false
Sky.SkyboxBk = "http://www.roblox.com/asset/?id=17124357467"
Sky.SkyboxDn = "http://www.roblox.com/asset/?id=17124359797"
Sky.SkyboxFt = "http://www.roblox.com/asset/?id=17124362093"
Sky.SkyboxLf = "http://www.roblox.com/asset/?id=17124365127"
Sky.SkyboxRt = "http://www.roblox.com/asset/?id=17124367200"
Sky.SkyboxUp = "http://www.roblox.com/asset/?id=17124369657"
local cc = Instance.new("ColorCorrectionEffect")
cc.Parent = lighting
cc.Brightness = 0.1
cc.Contrast = 0.3
cc.Saturation = 0.2
cc.TintColor = Color3.fromRGB(140, 190, 255)
local bloom = Instance.new("BloomEffect")
bloom.Parent = lighting
bloom.Intensity = 1.2
bloom.Threshold = 0.8
bloom.Size = 56
local atmosphere = Instance.new("Atmosphere")
atmosphere.Parent = lighting
atmosphere.Density = 0.25
atmosphere.Offset = 0.2
atmosphere.Glare = 0.3
atmosphere.Haze = 1
atmosphere.Color = Color3.fromRGB(80, 110, 150)
atmosphere.Decay = Color3.fromRGB(25, 30, 35)
elseif name == "Rose Glow" then
local Sky = Instance.new("Sky")
Sky.Name = name
Sky.Parent = lighting
Sky.CelestialBodiesShown = false
Sky.SkyboxBk = "http://www.roblox.com/asset/?id=109305193"
Sky.SkyboxDn = "http://www.roblox.com/asset?id=58372722"
Sky.SkyboxFt = "http://www.roblox.com/asset/?id=109305200"
Sky.SkyboxLf = "http://www.roblox.com/asset/?id=109305185"
Sky.SkyboxRt = "http://www.roblox.com/asset/?id=109305189"
Sky.SkyboxUp = "http://www.roblox.com/asset/?id=109305207"
elseif name == "Night Sky" then
local Sky = Instance.new("Sky")
Sky.Name = name
Sky.Parent = lighting
Sky.CelestialBodiesShown = false
Sky.SkyboxBk = "http://www.roblox.com/Asset/?ID=12064107"
Sky.SkyboxDn = "http://www.roblox.com/Asset/?ID=12064152"
Sky.SkyboxFt = "http://www.roblox.com/Asset/?ID=12064121"
Sky.SkyboxLf = "http://www.roblox.com/Asset/?ID=12063984"
Sky.SkyboxRt = "http://www.roblox.com/Asset/?ID=12064115"
Sky.SkyboxUp = "http://www.roblox.com/Asset/?ID=12064131"
Sky.StarCount = 0
elseif name == "Northern Lights" then
local Sky = Instance.new("Sky")
Sky.Name = name
Sky.Parent = lighting
Sky.CelestialBodiesShown = false
Sky.SkyboxBk = "http://www.roblox.com/asset/?id=16563478983"
Sky.SkyboxDn = "http://www.roblox.com/asset/?id=16563481302"
Sky.SkyboxFt = "http://www.roblox.com/asset/?id=16563484084"
Sky.SkyboxLf = "http://www.roblox.com/asset/?id=16563485362"
Sky.SkyboxRt = "http://www.roblox.com/asset/?id=16563487078"
Sky.SkyboxUp = "http://www.roblox.com/asset/?id=16563489821"
end
end
local skyNames = {'Golden Twilight', 'Infernal Horizon', 'Nebula Peaks', 'Rose Glow', 'Night Sky', 'Northern Lights'}
for _, skyName in next, skyNames do
VisualTab:CreateButton({
Name = skyName,
Tip = 'Applies the ' .. skyName .. ' skybox.',
Callback = function()
ApplySkyBox(skyName)
end
})
end
local DefenseTab = Window:CreateTab({ Name = 'Defense', Icon = 'rbxassetid://14939023862' })
swatReach = DefenseTab:CreateToggle({
Name = 'Swat Reach',
Default = false,
Tip = 'Extends swat range on nearby footballs.',
})
swatReachDistance = DefenseTab:CreateSlider({
Name = 'Swat Reach Radius',
Min = 0,
Max = 25,
Default = 0,
Increment = 0.1,
Suffix = '',
Tip = 'Sets the maximum swat distance.',
})
task.spawn(function()
while true do
task.wait()
if not swatReach.Value then continue end
local character = player.Character
if not character then continue end
local ball = findClosestBall()
if not ball then continue end
for _, v in next, character:GetChildren() do
if v:IsA('BasePart') and v.Name:lower():find('catch') then
local distance = (ball.Position - v.Position).Magnitude
if distance < swatReachDistance.Value then
if v.Size.X > 2 then
firetouchinterest(v, ball, 0)
firetouchinterest(v, ball, 1)
end
end
end
end
end
end)
DefenseTab:CreateDivider()
tackleReach = DefenseTab:CreateToggle({
Name = 'Extend Tackle Reach',
Default = false,
Tip = 'Extends tackle range against ball carriers.',
})
tackleAimbot = DefenseTab:CreateToggle({
Name = 'Tackle Aimbot',
Default = false,
Tip = 'Automatically targets nearby ball carriers.',
})
tackleAimbotRange = DefenseTab:CreateSlider({
Name = 'Tackle Aimbot Distance',
Min = 0,
Max = 25,
Default = 0,
Increment = 0.1,
Suffix = '',
Tip = 'Sets the maximum targeting distance.',
})
task.spawn(function()
while true do
task.wait()
local character = player.Character
if not character then continue end
if tackleReach.Value then
for _, v in next, players:GetPlayers() do
if v ~= player and v.Team ~= player.Team and v.Character and v.Character:FindFirstChild('Football') then
local bodyParts = {'Torso', 'Head', 'HumanoidRootPart', 'Left Arm', 'Left Leg', 'Right Arm', 'Right Leg'}
local randomPart = bodyParts[math.random(1, #bodyParts)]
replicatedStorage.Remotes.CharacterSoundEvent:FireServer('Game', 'TackleTouch', randomPart, randomPart)
end
end
end
if tackleAimbot.Value then
for _, v in next, players:GetPlayers() do
if v ~= player and v.Team ~= player.Team and v.Character and v.Character.Humanoid.WalkSpeed > 0 and v.Character:FindFirstChild('Football') then
local distance = (v.Character.HumanoidRootPart.Position - character.HumanoidRootPart.Position).Magnitude
if distance < tackleAimbotRange.Value then
character.HumanoidRootPart.CFrame = v.Character.HumanoidRootPart.CFrame
character.HumanoidRootPart.CFrame = v.Character.HumanoidRootPart.CFrame
end
end
end
end
end
end)
local AutomaticsTab = Window:CreateTab({ Name = 'Automatics', Icon = 'rbxassetid://86084882582277' })
autoRush = AutomaticsTab:CreateToggle({
Name = 'Auto Rush',
Default = false,
Tip = 'Automatically moves toward the opposing ball carrier in range.',
})
walkToLine = AutomaticsTab:CreateToggle({
Name = 'Walk To Line',
Default = false,
Tip = 'Moves the player to the line before play starts.',
})
autoRushReactionTime = AutomaticsTab:CreateSlider({
Name = 'Reaction Time',
Min = 0,
Max = 1,
Default = 0.15,
Increment = 0.01,
Suffix = '',
Tip = 'Adjusts how quickly the feature responds.',
})
task.spawn(function()
while true do
task.wait()
if not autoRush.Value then continue end
local character = player.Character
if not character then continue end
local humanoid = character:FindFirstChildOfClass('Humanoid')
if not humanoid then continue end
local hrp = character:FindFirstChild('HumanoidRootPart')
if not hrp then continue end
if walkToLine.Value then
if replicatedStorage:FindFirstChild('Flags')
and replicatedStorage.Flags:FindFirstChild('PossessionTag')
and replicatedStorage.Flags:FindFirstChild('Status')
and replicatedStorage.Flags.PossessionTag.Value ~= player.Team.Name
and replicatedStorage.Flags.Status.Value == 'PrePlay' then
local line = workspace:FindFirstChild('LineDown')
if line then
humanoid:MoveTo(line.Position)
end
end
end
for _, v in next, players:GetPlayers() do
if v == player then continue end
if v.Team == player.Team then continue end
if not v.Character then continue end
local enemyChar = v.Character
local enemyHumanoid = enemyChar:FindFirstChildOfClass('Humanoid')
local enemyHrp = enemyChar:FindFirstChild('HumanoidRootPart')
if not enemyHumanoid or not enemyHrp then continue end
local football = enemyChar:FindFirstChild('Football')
if not football then continue end
local footballPart = football:FindFirstChildWhichIsA('BasePart')
if not footballPart then continue end
if enemyHumanoid.WalkSpeed <= 0 then continue end
if enemyHumanoid.PlatformStand then continue end
local ping = 0
if stats and stats:FindFirstChild('Network')
and stats.Network:FindFirstChild('ServerStatsItem')
and stats.Network.ServerStatsItem:FindFirstChild('Data Ping') then
ping = stats.Network.ServerStatsItem['Data Ping']:GetValue() / 1000
end
local speed = enemyHumanoid.MoveDirection.Magnitude > 0 and enemyHumanoid.WalkSpeed or 0
local predictionTime = ping + autoRushReactionTime.Value
local pos = footballPart.Position + (enemyHumanoid.MoveDirection * speed * predictionTime * 20)
local direction = pos - enemyHrp.Position
if direction.Magnitude > 0 then
pos += direction.Unit * ((hrp.Position - pos).Magnitude / 20)
end
humanoid:MoveTo(pos)
end
end
end)
AutomaticsTab:CreateDivider()
autoCatch = AutomaticsTab:CreateToggle({
Name = 'Auto Catch',
Default = false,
Tip = 'Automatically moves toward nearby catch opportunities.',
})
autoCatchRadius = AutomaticsTab:CreateSlider({
Name = 'Auto Catch Distance',
Min = 0,
Max = 25,
Default = 0,
Increment = 0.1,
Suffix = '',
Tip = 'Sets how far the auto catch detection can reach.',
})
AutomaticsTab:CreateDivider()
autoSwat = AutomaticsTab:CreateToggle({
Name = 'Auto Swat',
Default = false,
Tip = 'Automatically reacts to nearby incoming balls.',
})
autoSwatRadius = AutomaticsTab:CreateSlider({
Name = 'Auto Swat Distance',
Min = 0,
Max = 25,
Default = 0,
Increment = 0.1,
Suffix = '',
Tip = 'Sets how far the auto swat detection can reach.',
})
task.spawn(function()
while true do
task.wait()
if not autoCatch.Value and not autoSwat.Value then continue end
local character = player.Character
if not character then continue end
local humanoidRootPart = character:FindFirstChild('HumanoidRootPart')
if not humanoidRootPart then continue end
local ball = findClosestBall()
if not ball then continue end
local distance = (ball.Position - humanoidRootPart.Position).Magnitude
if autoCatch.Value and distance <= autoCatchRadius.Value then
replicatedStorage.Remotes.CharacterSoundEvent:FireServer('PlayerActions', isPractice and 'catch ' or 'catch')
end
if autoSwat.Value and distance <= autoSwatRadius.Value then
replicatedStorage.Remotes.CharacterSoundEvent:FireServer('PlayerActions', 'swat')
end
end
end)
AutomaticsTab:CreateDivider()
autoCaptain = AutomaticsTab:CreateToggle({
Name = 'Auto Win Captain',
Default = false,
Tip = 'Automatically moves toward the finish line during captain selection.',
})
task.spawn(function()
while true do
task.wait()
if not autoCaptain.Value then continue end
local character = player.Character
if not character then continue end
local hrp = character:FindFirstChild('HumanoidRootPart')
if not hrp then continue end
for _, v in next, workspace.Models.LockerRoomA:GetChildren() do
if v.Name:lower():find('finishline') and not player.Team then
v:GetPropertyChangedSignal('CFrame'):Connect(function()
for i = 1, 4 do
task.wait()
hrp.CFrame = v.CFrame
end
end)
end
end
end
end)
AutomaticsTab:CreateDivider()
autoFreeze = AutomaticsTab:CreateToggle({
Name = 'Auto Freeze',
Default = false,
Tip = 'Temporarily anchors your character on input.',
})
freezeDuration = AutomaticsTab:CreateSlider({
Name = 'Freeze Duration',
Min = 0,
Max = 3,
Default = 0,
Increment = 0.1,
Suffix = '',
Tip = 'Duration the freeze state lasts.',
})
freezeKeybind = AutomaticsTab:CreateKeybind({
Name = 'Freeze Keybind',
Default = nil,
Tip = 'Key used to trigger freeze.',
})
userInputService.InputBegan:Connect(function(input)
if not autoFreeze.Value then return end
if freezeKeybind.Value and input.KeyCode ~= freezeKeybind.Value then return end
local character = player.Character
if not character then return end
local hrp = character:FindFirstChild('HumanoidRootPart')
if not hrp then return end
hrp.Anchored = true
task.delay(freezeDuration.Value, function()
if hrp then
hrp.Anchored = false
end
end)
end)
AutomaticsTab:CreateDivider()
autoQb = AutomaticsTab:CreateToggle({
Name = 'Auto QB',
Default = false,
Tip = 'Automatically positions your character for quarterback play.',
})
autoQbMethod = AutomaticsTab:CreateDropdown({
Name = 'Auto QB Method',
Options = {'Walk', 'Teleport'},
Default = 'Walk',
Tip = 'Selects how automatic positioning is performed.',
})
task.spawn(function()
while true do
task.wait()
if not autoQb.Value then continue end
local character = player.Character
if not character then continue end
local humanoid = character:FindFirstChildOfClass('Humanoid')
local humanoidRootPart = character:FindFirstChild('HumanoidRootPart')
if not humanoid or not humanoidRootPart then continue end
local ball = findClosestBall()
if not ball then continue end
if replicatedStorage:FindFirstChild('Flags')
and replicatedStorage.Flags:FindFirstChild('PossessionTag')
and replicatedStorage.Flags:FindFirstChild('Status')
and replicatedStorage.Flags.PossessionTag.Value == player.Team.Name
and replicatedStorage.Flags.Status.Value == 'PrePlay' then
if autoQbMethod.Value == 'Walk' then
humanoid:MoveTo(ball.Position)
elseif autoQbMethod.Value == 'Teleport' then
humanoidRootPart.CFrame = ball.CFrame
end
else
pcall(function()
ball.CFrame = humanoidRootPart.CFrame
end)
end
end
end)
AutomaticsTab:CreateDivider()
autoBoost = AutomaticsTab:CreateToggle({
Name = 'Auto Boost',
Default = false,
Tip = 'Automatically assists aerial movement near incoming footballs.',
})
targetClosestPlayer = AutomaticsTab:CreateToggle({
Name = 'Target Player Closer To The Ball',
Default = false,
Tip = 'Prioritizes players closest to the football.',
})
boostStrength = AutomaticsTab:CreateSlider({
Name = 'Boost Strength',
Min = 0,
Max = 3,
Default = 1.5,
Increment = 0.1,
Suffix = '',
Tip = 'Adjusts the strength of the boost effect.',
})
boostRadius = AutomaticsTab:CreateSlider({
Name = 'Boost Radius',
Min = 0,
Max = 15,
Default = 0,
Increment = 0.1,
Suffix = '',
Tip = 'Sets the activation distance for boosting.',
})
boostPower = AutomaticsTab:CreateSlider({
Name = 'Boost Power',
Min = 50,
Max = 70,
Default = 50,
Increment = 0.1,
Suffix = '',
Tip = 'Controls the upward force applied during a boost.',
})
task.spawn(function()
local activeTween
while true do
task.wait()
if not autoBoost.Value then
if activeTween then
activeTween:Cancel()
activeTween = nil
end
continue
end
local char = player.Character
if not char then continue end
local hum = char:FindFirstChildOfClass('Humanoid')
if not hum then continue end
local hrp = char:FindFirstChild('HumanoidRootPart')
if not hrp then continue end
if hum:GetState() == Enum.HumanoidStateType.Landed then
if activeTween then
activeTween:Cancel()
activeTween = nil
end
continue
end
local myHead = char:FindFirstChild('Head')
if not myHead then continue end
local targetPlayer
if targetClosestPlayer.Value then
local nearestBall
local nearestBallDist = math.huge
for _, ball in next, workspace:GetChildren() do
if not ball:IsA('BasePart') then continue end
if not ball.Name:lower():find('ball') then continue end
local dist = (ball.Position - myHead.Position).Magnitude
if dist < nearestBallDist then
nearestBallDist = dist
nearestBall = ball
end
end
if not nearestBall then continue end
local closestDist = math.huge
for _, v in next, players:GetPlayers() do
if v == player then continue end
local character = v.Character
if not character then continue end
local head = character:FindFirstChild('Head')
if not head then continue end
local dist = (head.Position - nearestBall.Position).Magnitude
if dist < closestDist then
closestDist = dist
targetPlayer = v
end
end
else
local closestDist = math.huge
for _, v in next, players:GetPlayers() do
if v == player then continue end
local character = v.Character
if not character then continue end
local head = character:FindFirstChild('Head')
if not head then continue end
local dist = (head.Position - myHead.Position).Magnitude
if dist < closestDist then
closestDist = dist
targetPlayer = v
end
end
end
if not targetPlayer then continue end
local character = targetPlayer.Character
if not character then continue end
local head = character:FindFirstChild('Head')
if not head then continue end
local targetHumanoid = character:FindFirstChildOfClass('Humanoid')
if not targetHumanoid then continue end
local myState = hum:GetState()
local targetState = targetHumanoid:GetState()
local distance = (head.Position - myHead.Position).Magnitude
if distance > boostRadius.Value then
continue
end
if myState ~= Enum.HumanoidStateType.Jumping
and myState ~= Enum.HumanoidStateType.Freefall then
continue
end
if targetState ~= Enum.HumanoidStateType.Jumping
and targetState ~= Enum.HumanoidStateType.Freefall then
continue
end
local speed = math.max(hum.WalkSpeed * boostStrength.Value, 1)
local targetPos = head.Position
local duration = math.max((hrp.Position - targetPos).Magnitude / speed, 0.01)
if activeTween then
activeTween:Cancel()
end
activeTween = tweenService:Create(
hrp,
TweenInfo.new(duration, Enum.EasingStyle.Linear),
{
CFrame = CFrame.new(targetPos)
}
)
activeTween:Play()
activeTween.Completed:Once(function(state)
if state ~= Enum.PlaybackState.Completed then
return
end
hrp.AssemblyLinearVelocity = Vector3.new(
hrp.AssemblyLinearVelocity.X,
boostPower.Value,
hrp.AssemblyLinearVelocity.Z
)
end)
end
end)
local MiscTab = Window:CreateTab({ Name = 'Misc', Icon = 'rbxassetid://129082556946713' })
fpsCap = MiscTab:CreateSlider({
Name = 'Uncap FPS Amount',
Min = 30,
Max = 240,
Default = 240,
Increment = 1,
Suffix = '',
Tip = 'Sets the maximum FPS limit.',
})
task.spawn(function()
while true do
task.wait()
setfpscap(fpsCap.Value)
end
end)
antiAdmin = MiscTab:CreateToggle({
Name = 'Anti Admin',
Default = false,
Tip = 'Automatically reacts when administrators are detected.',
Keybind = nil,
})
task.spawn(function()
while task.wait() do
local playerGui = player:FindFirstChild("PlayerGui")
if not playerGui then continue end
local miscText = playerGui:FindFirstChild("MiscText")
if not miscText then continue end
local isVIP = miscText:FindFirstChild("IsVIP")
if not isVIP then continue end
if isVIP.Visible == true then continue end
for _, admin in next, players:GetPlayers() do
if admin == player then continue end
local swagData = admin:FindFirstChild("SwagData")
if not swagData then continue end
local adminTag = swagData:FindFirstChild("Admin")
if not adminTag then continue end
if adminTag.Value ~= "" and antiAdmin.Value then
player:Kick("[Cheeto Hub] Detected Admin\
Name: " .. admin.Name .. "\
ID: " .. admin.UserId)
end
end
end
end)
smoothReplay = MiscTab:CreateToggle({
Name = 'Smooth Replay',
Default = false,
Tip = 'Smooths replay playback for improved visual quality.',
Keybind = nil,
})
replayFPS = MiscTab:CreateSlider({
Name = 'Replay Frame Per Second',
Min = 9,
Max = 120,
Default = 9,
Increment = 1,
Tip = 'Sets the replay playback frame rate.',
})
if not isPractice then
local player = game:GetService('Players').LocalPlayer
local replicatedStorage = game:GetService('ReplicatedStorage')
local runService = game:GetService('RunService')
local remote = replicatedStorage:WaitForChild('Remotes'):WaitForChild('CharacterSoundEvent')
local heartbeat = runService.Heartbeat
local transition = player:WaitForChild('PlayerGui'):WaitForChild('MainGui'):WaitForChild('Transition')
local homeCamera = CFrame.Angles(-0.2617993877991494, 0, 0)
local awayCamera = CFrame.Angles(0.2617993877991494, math.pi, 0)
local cameraOffset = CFrame.new(0, 0, 19)
local limbs = {
'Torso',
'Left Arm',
'Right Arm',
'Left Leg',
'Right Leg',
'Head'
}
task.spawn(function()
while true do
task.wait()
local replayScript = player.PlayerScripts:FindFirstChild('ClientReplay')
if replayScript then
replayScript.Enabled = not smoothReplay.Value
end
end
end)
local replay = function(data, characters)
local replayBall = workspace:WaitForChild('ReplayBall')
local camera = workspace.CurrentCamera
camera.CameraType = Enum.CameraType.Scriptable
camera.CameraSubject = replayBall
local cameraRotation = data.changes[1].poss == 'h' and homeCamera or awayCamera
local currentChange = 1
local highestY = 18
local cameraTilt = true
local playback = 1
local recordedFPS = data.fps
local accumulator = 0
local last = tick()
local getFrame = function(index)
local maxFrames = #data.ball
if index < 1 then return 1 end
if index > maxFrames then return maxFrames end
return index
end
local interpolate = function(a, b, alpha)
return a:Lerp(b, alpha)
end
while playback < #data.ball do
if replicatedStorage.Flags.StatusTag.Value ~= 'REPLAY' then
break
end
if camera.CameraType ~= Enum.CameraType.Scriptable then
break
end
local replayFPSValue = replayFPS.Value
local replayDelta = 1 / replayFPSValue
local now = tick()
accumulator += now - last
last = now
while accumulator >= replayDelta do
playback += recordedFPS / replayFPSValue
accumulator -= replayDelta
end
local frame1 = getFrame(math.floor(playback))
local frame2 = getFrame(math.ceil(playback))
local alpha = playback - frame1
for _, character in next, characters do
local characterData = data.limbs[character.Name]
if not characterData then character.Parent = nil continue end
local limbData = characterData[1]
local accessoryData = characterData[2]
if not limbData[1] then
character.Parent = nil
continue
end
local torso1 = limbData[1][2][frame1]
local torso2 = limbData[1][2][frame2]
if not torso1 or not torso2 then
character.Parent = nil
continue
end
local torso = interpolate(torso1, torso2, alpha)
for i = 1, #limbs do
local limbName = limbs[i]
local limb = character:FindFirstChild(limbName)
if not limb then continue end
local replayLimb = limbData[i]
if not replayLimb then continue end
local cf1 = replayLimb[2][frame1]
local cf2 = replayLimb[2][frame2]
if i == 4 then
if cf1 and cf2 then
local angle = cf1 + ((cf2 - cf1) * alpha)
limb.CFrame =
torso *
CFrame.new(-0.5, -1, 0) *
CFrame.fromOrientation(angle, 0, 0) *
CFrame.new(0, -1, 0)
end
elseif i == 5 then
if cf1 and cf2 then
local angle = cf1 + ((cf2 - cf1) * alpha)
limb.CFrame =
torso *
CFrame.new(0.5, -1, 0) *
CFrame.fromOrientation(angle, 0, 0) *
CFrame.new(0, -1, 0)
end
else
if cf1 and cf2 then
limb.CFrame = interpolate(cf1, cf2, alpha)
elseif i == 6 then
limb.CFrame = torso * CFrame.new(0, 1.5, 0)
end
end
end
local uniform = character:FindFirstChild('Uniform')
if accessoryData and uniform then
for name, info in next, accessoryData do
if uniform:FindFirstChild(name) and character:FindFirstChild(info[1]) then
uniform[name].CFrame =
character[info[1]].CFrame * info[2]
end
end
end
end
local ball1 = data.ball[frame1]
local ball2 = data.ball[frame2]
if ball1 and ball2 then
replayBall.CFrame = interpolate(ball1, ball2, alpha)
end
if highestY < replayBall.Position.Y then
highestY = replayBall.Position.Y
elseif highestY > 49 and cameraTilt then
local x = select(1, cameraRotation:ToOrientation())
cameraRotation *= CFrame.Angles(
x * 3 * math.clamp((highestY - 50) / 99, 0, 1),
0,
0
)
cameraTilt = false
end
local targetCamera
if highestY > 49 and cameraTilt then
local x = select(1, cameraRotation:ToOrientation())
targetCamera =
CFrame.new(replayBall.Position) *
cameraRotation *
CFrame.Angles(
x * 3 * math.clamp((highestY - 50) / 99, 0, 1),
0,
0
) *
cameraOffset
else
targetCamera =
CFrame.new(replayBall.Position) *
cameraRotation *
cameraOffset
end
camera.CFrame = targetCamera
local change = data.changes[currentChange]
if change and change.frame <= frame1 then
currentChange += 1
if change.frame == frame1 then
if change.poss and (frame1 > 9 and (change.turnover or highestY > 49)) then
local nextRotation =
change.poss == 'h' and homeCamera or awayCamera
local duration =
(change.turnover == true or replayBall.Position.Y >= 13)
and 0.5
or (highestY / 500)
local elapsed = 0
local startRotation = cameraRotation
while elapsed < duration do
elapsed += heartbeat:Wait()
cameraRotation = startRotation:Lerp(
nextRotation,
math.clamp(elapsed / duration, 0, 1)
)
camera.CFrame =
CFrame.new(replayBall.Position) *
cameraRotation *
cameraOffset
end
cameraRotation = nextRotation
elseif change.freeze then
task.wait(change.freeze)
end
end
end
heartbeat:Wait()
end
remote:FireServer('ReplayFinished')
if replicatedStorage.Flags.StatusTag.Value == 'REPLAY' then
replicatedStorage.Flags.StatusTag.Value = ''
end
task.wait(0.2)
replayBall:Destroy()
for _, character in next, characters do
character:Destroy()
end
data.t = nil
data.limbs = nil
data.ball = nil
camera.CameraType = Enum.CameraType.Custom
camera.CameraSubject = player.Character.Humanoid
end
remote.OnClientEvent:Connect(function(action, ...)
if action == 'ClientReplay' then
while transition.Position.X.Scale > -2 and transition.Position.X.Scale < -0.5 do
task.wait()
end
replay(...)
end
end)
end