assert(Drawing, 'exploit not supported') if not syn and not PROTOSMASHER_LOADED then print'Unnamed ESP only officially supports Synapse and Protosmasher! If you\'re an exploit developer and have added drawing API to your exploit, try setting syn as true then checking if that works, otherwise, DM me on discord @ cppbook.org#1968 or add an issue to the Unnamed ESP Github Repository and I\'ll see it through email!' end local UserInputService = game:GetService'UserInputService'; local HttpService = game:GetService'HttpService'; local GUIService = game:GetService'GuiService'; local TweenService = game:GetService'TweenService'; local RunService = game:GetService'RunService'; local Players = game:GetService'Players'; local LocalPlayer = Players.LocalPlayer; local Camera = workspace.CurrentCamera; local Mouse = LocalPlayer:GetMouse(); local V2New = Vector2.new; local V3New = Vector3.new; local WTVP = Camera.WorldToViewportPoint; local WorldToViewport = function(...) return WTVP(Camera, ...) end; local Menu = {}; local MouseHeld = false; local LastRefresh = 0; local OptionsFile = 'IC3_ESP_SETTINGS.dat'; local Binding = false; local BindedKey = nil; local OIndex = 0; local LineBox = {}; local UIButtons = {}; local Sliders = {}; local ColorPicker = { Loading = false; LastGenerated = 0 }; local Dragging = false; local DraggingUI = false; local Rainbow = false; local DragOffset = V2New(); local DraggingWhat = nil; local OldData = {}; local IgnoreList = {}; local EnemyColor = Color3.new(1, 0, 0); local TeamColor = Color3.new(0, 1, 0); local MenuLoaded = false; local ErrorLogging = false; local TracerPosition = V2New(Camera.ViewportSize.X / 2, Camera.ViewportSize.Y - 135); local DragTracerPosition= false; local SubMenu = {}; local IsSynapse = syn and not PROTOSMASHER_LOADED; local Connections = { Active = {} }; local Signal = {}; Signal.__index = Signal; local GetCharacter; local CurrentColorPicker; local Spectating; local Executor = (identifyexecutor or (function() return '' end))() local SupportedExploits = { 'Synapse X', 'ScriptWare', 'Krnl', 'OxygenU', 'Temple' } local QUAD_SUPPORTED_EXPLOIT = table.find(SupportedExploits, Executor) ~= nil -- if not PROTOSMASHER_LOADED then Drawing.UseCompatTransparency = true; end -- For Elysian shared.MenuDrawingData = shared.MenuDrawingData or { Instances = {} }; shared.InstanceData = shared.InstanceData or {}; shared.RSName = shared.RSName or ('UnnamedESP_by_ic3-' .. HttpService:GenerateGUID(false)); local GetDataName = shared.RSName .. '-GetData'; local UpdateName = shared.RSName .. '-Update'; local Debounce = setmetatable({}, { __index = function(t, i) return rawget(t, i) or false end; }); if shared.UESP_InputChangedCon then shared.UESP_InputChangedCon:Disconnect() end if shared.UESP_InputBeganCon then shared.UESP_InputBeganCon:Disconnect() end if shared.UESP_InputEndedCon then shared.UESP_InputEndedCon:Disconnect() end if shared.CurrentColorPicker then shared.CurrentColorPicker:Dispose() end local RealPrint, LastPrintTick = print, 0; local LatestPrints = setmetatable({}, { __index = function(t, i) return rawget(t, i) or 0 end }); local function print(...) local Content = unpack{...}; local print = RealPrint; if tick() - LatestPrints[Content] > 5 then LatestPrints[Content] = tick(); print(Content); end end local function FromHex(HEX) HEX = HEX:gsub('#', ''); return Color3.fromRGB(tonumber('0x' .. HEX:sub(1, 2)), tonumber('0x' .. HEX:sub(3, 4)), tonumber('0x' .. HEX:sub(5, 6))); end local function IsStringEmpty(String) if type(String) == 'string' then return String:match'^%s+$' ~= nil or #String == 0 or String == '' or false; end return false; end local function Set(t, i, v) t[i] = v; end local Teams = {}; local CustomTeams = { -- Games that don't use roblox's team system [2563455047] = { Initialize = function() Teams.Sheriffs = {}; -- prevent big error Teams.Bandits = {}; -- prevent big error local Func = game:GetService'ReplicatedStorage':WaitForChild('RogueFunc', 1); local Event = game:GetService'ReplicatedStorage':WaitForChild('RogueEvent', 1); local S, B = Func:InvokeServer'AllTeamData'; Teams.Sheriffs = S; Teams.Bandits = B; Event.OnClientEvent:Connect(function(id, PlayerName, Team, Remove) -- stolen straight from decompiled src lul if id == 'UpdateTeam' then local TeamTable, NotTeamTable if Team == 'Bandits' then TeamTable = TDM.Bandits NotTeamTable = TDM.Sheriffs else TeamTable = TDM.Sheriffs NotTeamTable = TDM.Bandits end if Remove then TeamTable[PlayerName] = nil else TeamTable[PlayerName] = true NotTeamTable[PlayerName] = nil end if PlayerName == LocalPlayer.Name then TDM.Friendlys = TeamTable TDM.Enemies = NotTeamTable end end end) end; CheckTeam = function(Player) local LocalTeam = Teams.Sheriffs[LocalPlayer.Name] and Teams.Sheriffs or Teams.Bandits; return LocalTeam[Player.Name] and true or false; end; }; [5208655184] = { CheckTeam = function(Player) local LocalLastName = LocalPlayer:GetAttribute'LastName' if not LocalLastName or IsStringEmpty(LocalLastName) then return true end local PlayerLastName = Player:GetAttribute'LastName' if not PlayerLastName then return false end return PlayerLastName == LocalLastName end }; [3541987450] = { CheckTeam = function(Player) local LocalStats = LocalPlayer:FindFirstChild'leaderstats'; local LocalLastName = LocalStats and LocalStats:FindFirstChild'LastName'; if not LocalLastName or IsStringEmpty(LocalLastName.Value) then return true; end local PlayerStats = Player:FindFirstChild'leaderstats'; local PlayerLastName = PlayerStats and PlayerStats:FindFirstChild'LastName'; if not PlayerLastName then return false; end return PlayerLastName.Value == LocalLastName.Value; end; }; [6032399813] = { CheckTeam = function(Player) local LocalStats = LocalPlayer:FindFirstChild'leaderstats'; local LocalGuildName = LocalStats and LocalStats:FindFirstChild'Guild'; if not LocalGuildName or IsStringEmpty(LocalGuildName.Value) then return true; end local PlayerStats = Player:FindFirstChild'leaderstats'; local PlayerGuildName = PlayerStats and PlayerStats:FindFirstChild'Guild'; if not PlayerGuildName then return false; end return PlayerGuildName.Value == LocalGuildName.Value; end; }; [5735553160] = { CheckTeam = function(Player) local LocalStats = LocalPlayer:FindFirstChild'leaderstats'; local LocalGuildName = LocalStats and LocalStats:FindFirstChild'Guild'; if not LocalGuildName or IsStringEmpty(LocalGuildName.Value) then return true; end local PlayerStats = Player:FindFirstChild'leaderstats'; local PlayerGuildName = PlayerStats and PlayerStats:FindFirstChild'Guild'; if not PlayerGuildName then return false; end return PlayerGuildName.Value == LocalGuildName.Value; end; }; }; local RenderList = {Instances = {}}; function RenderList:AddOrUpdateInstance(Instance, Obj2Draw, Text, Color) RenderList.Instances[Instance] = { ParentInstance = Instance; Instance = Obj2Draw; Text = Text; Color = Color }; return RenderList.Instances[Instance]; end local CustomPlayerTag; local CustomESP; local CustomCharacter; local GetHealth; local GetAliveState; local CustomRootPartName; local Modules = { [292439477] = { CustomESP = function() if type(shared.PF_Replication) ~= 'table' then local lastScan = shared.pfReplicationScan if (tick() - (lastScan or 0)) > 0.01 then shared.pfReplicationScan = tick() local gc = getgc(true) for i = 1, #gc do local gcObject = gc[i]; if type(gcObject) == 'table' and type(rawget(gcObject, 'getbodyparts')) == 'function' then shared.PF_Replication = gcObject; break end end end return end for Index, Player in pairs(Players:GetPlayers()) do if Player == LocalPlayer then continue end local Body = shared.PF_Replication.getbodyparts(Player); if type(Body) == 'table' and typeof(rawget(Body, 'torso')) == 'Instance' then Player.Character = Body.torso.Parent continue end Player.Character = nil; end end, GetHealth = function(Player) if type(shared.pfHud) ~= 'table' then return false end return shared.pfHud:getplayerhealth(Player) end, GetAliveState = function(Player) if type(shared.pfHud) ~= 'table' then local lastScan = shared.pfHudScan if (tick() - (lastScan or 0)) > 0.1 then shared.pfHudScan = tick() local gc = getgc(true) for i = 1, #gc do local gcObject = gc[i]; if type(gcObject) == 'table' and type(rawget(gcObject, 'getplayerhealth')) == 'function' then shared.pfHud = gcObject; break end end end return end return shared.pfHud:isplayeralive(Player) end, CustomRootPartName = 'Torso', }; [2950983942] = { CustomCharacter = function(Player) if workspace:FindFirstChild'Players' then return workspace.Players:FindFirstChild(Player.Name); end end }; [2262441883] = { CustomPlayerTag = function(Player) return Player:FindFirstChild'Job' and (' [' .. Player.Job.Value .. ']') or ''; end; CustomESP = function() if workspace:FindFirstChild'MoneyPrinters' then for i, v in pairs(workspace.MoneyPrinters:GetChildren()) do local Main = v:FindFirstChild'Main'; local Owner = v:FindFirstChild'TrueOwner'; local Money = v:FindFirstChild'Int' and v.Int:FindFirstChild'Money' or nil; if Main and Owner and Money then local O = tostring(Owner.Value); local M = tostring(Money.Value); pcall(RenderList.AddOrUpdateInstance, RenderList, v, Main, string.format('Money Printer\nOwned by %s\n[%s]', O, M), Color3.fromRGB(13, 255, 227)); end end end end; }; -- [4581966615] = { -- CustomESP = function() -- if workspace:FindFirstChild'Entities' then -- for i, v in pairs(workspace.Entities:GetChildren()) do -- if not v.Name:match'Printer' then continue end -- local Properties = v:FindFirstChild'Properties' if not Properties then continue end -- local Main = v:FindFirstChild'hitbox'; -- local Owner = Properties:FindFirstChild'Owner'; -- local Money = Properties:FindFirstChild'CurrentPrinted' -- if Main and Owner and Money then -- local O = Owner.Value and tostring(Owner.Value) or 'no one'; -- local M = tostring(Money.Value); -- pcall(RenderList.AddOrUpdateInstance, RenderList, v, Main, string.format('Money Printer\nOwned by %s\n[%s]', O, M), Color3.fromRGB(13, 255, 227)); -- end -- end -- end -- end; -- }; [4801598506] = { CustomESP = function() if workspace:FindFirstChild'Mobs' and workspace.Mobs:FindFirstChild'Forest1' then for i, v in pairs(workspace.Mobs.Forest1:GetChildren()) do local Main = v:FindFirstChild'Head'; local Hum = v:FindFirstChild'Mob'; if Main and Hum then pcall(RenderList.AddOrUpdateInstance, RenderList, v, Main, string.format('[%s] [%s/%s]', v.Name, Hum.Health, Hum.MaxHealth), Color3.fromRGB(13, 255, 227)); end end end end; }; [2555873122] = { CustomESP = function() if workspace:FindFirstChild'WoodPlanks' then for i, v in pairs(workspace:GetChildren()) do if v.Name == 'WoodPlanks' then local Main = v:FindFirstChild'Wood'; if Main then pcall(RenderList.AddOrUpdateInstance, RenderList, v, Main, 'Wood Planks', Color3.fromRGB(13, 255, 227)); end end end end end; }; [5208655184] = { CustomESP = function() -- if workspace:FindFirstChild'Live' then -- for i, v in pairs(workspace.Live:GetChildren()) do -- if v.Name:sub(1, 1) == '.' then -- local Main = v:FindFirstChild'Head'; -- if Main then -- pcall(RenderList.AddOrUpdateInstance, RenderList, v, Main, v.Name:sub(2), Color3.fromRGB(250, 50, 40)); -- end -- end -- end -- end end; CustomPlayerTag = function(Player) if game.PlaceVersion < 457 then return '' end local Name = ''; local FirstName = Player:GetAttribute'FirstName' if typeof(FirstName) == 'string' and #FirstName > 0 then local Prefix = ''; local Extra = {}; Name = Name .. '\n['; if Player:GetAttribute'Prestige' > 0 then Name = Name .. '#' .. tostring(Player:GetAttribute'Prestige') .. ' '; end if not IsStringEmpty(Player:GetAttribute'HouseRank') then Prefix = Player:GetAttribute'HouseRank' == 'Owner' and (Player:GetAttribute'Gender' == 'Female' and 'Lady ' or 'Lord ') or ''; end if not IsStringEmpty(FirstName) then Name = Name .. '' .. Prefix .. FirstName; end if not IsStringEmpty(Player:GetAttribute'LastName') then Name = Name .. ' ' .. Player:GetAttribute'LastName'; end if not IsStringEmpty(Name) then Name = Name .. ']'; end local Character = GetCharacter(Player); if Character then if Character and Character:FindFirstChild'Danger' then table.insert(Extra, 'D'); end if Character:FindFirstChild'ManaAbilities' and Character.ManaAbilities:FindFirstChild'ManaSprint' then table.insert(Extra, 'D1'); end if Character:FindFirstChild'Mana' then table.insert(Extra, 'M' .. math.floor(Character.Mana.Value)); end if Character:FindFirstChild'Vampirism' then table.insert(Extra, 'V'); end if Character:FindFirstChild'Observe' then table.insert(Extra, 'ILL'); end if Character:FindFirstChild'Inferi' then table.insert(Extra, 'NEC'); end if Character:FindFirstChild'World\'s Pulse' then table.insert(Extra, 'DZIN'); end if Character:FindFirstChild'Shift' then table.insert(Extra, 'MAD'); end if Character:FindFirstChild'Head' and Character.Head:FindFirstChild'FacialMarking' then local FM = Character.Head:FindFirstChild'FacialMarking'; if FM.Texture == 'http://www.roblox.com/asset/?id=4072968006' then table.insert(Extra, 'HEALER'); elseif FM.Texture == 'http://www.roblox.com/asset/?id=4072914434' then table.insert(Extra, 'SEER'); elseif FM.Texture == 'http://www.roblox.com/asset/?id=4094417635' then table.insert(Extra, 'JESTER'); elseif FM.Texture == 'http://www.roblox.com/asset/?id=4072968656' then table.insert(Extra, 'BLADE'); end end end if Player:FindFirstChild'Backpack' then if Player.Backpack:FindFirstChild'Observe' then table.insert(Extra, 'ILL'); end if Player.Backpack:FindFirstChild'Inferi' then table.insert(Extra, 'NEC'); end if Player.Backpack:FindFirstChild'World\'s Pulse' then table.insert(Extra, 'DZIN'); end if Player.Backpack:FindFirstChild'Shift' then table.insert(Extra, 'MAD'); end end if #Extra > 0 then Name = Name .. ' [' .. table.concat(Extra, '-') .. ']'; end end return Name; end; }; [3541987450] = { CustomPlayerTag = function(Player) local Name = ''; if Player:FindFirstChild'leaderstats' then Name = Name .. '\n['; local Prefix = ''; local Extra = {}; if Player.leaderstats:FindFirstChild'Prestige' and Player.leaderstats.Prestige.ClassName == 'IntValue' and Player.leaderstats.Prestige.Value > 0 then Name = Name .. '#' .. tostring(Player.leaderstats.Prestige.Value) .. ' '; end if Player.leaderstats:FindFirstChild'HouseRank' and Player.leaderstats:FindFirstChild'Gender' and Player.leaderstats.HouseRank.ClassName == 'StringValue' and not IsStringEmpty(Player.leaderstats.HouseRank.Value) then Prefix = Player.leaderstats.HouseRank.Value == 'Owner' and (Player.leaderstats.Gender.Value == 'Female' and 'Lady ' or 'Lord ') or ''; end if Player.leaderstats:FindFirstChild'FirstName' and Player.leaderstats.FirstName.ClassName == 'StringValue' and not IsStringEmpty(Player.leaderstats.FirstName.Value) then Name = Name .. '' .. Prefix .. Player.leaderstats.FirstName.Value; end if Player.leaderstats:FindFirstChild'LastName' and Player.leaderstats.LastName.ClassName == 'StringValue' and not IsStringEmpty(Player.leaderstats.LastName.Value) then Name = Name .. ' ' .. Player.leaderstats.LastName.Value; end if Player.leaderstats:FindFirstChild'UberTitle' and Player.leaderstats.UberTitle.ClassName == 'StringValue' and not IsStringEmpty(Player.leaderstats.UberTitle.Value) then Name = Name .. ', ' .. Player.leaderstats.UberTitle.Value; end if not IsStringEmpty(Name) then Name = Name .. ']'; end local Character = GetCharacter(Player); if Character then if Character and Character:FindFirstChild'Danger' then table.insert(Extra, 'D'); end if Character:FindFirstChild'ManaAbilities' and Character.ManaAbilities:FindFirstChild'ManaSprint' then table.insert(Extra, 'D1'); end if Character:FindFirstChild'Mana' then table.insert(Extra, 'M' .. math.floor(Character.Mana.Value)); end if Character:FindFirstChild'Vampirism' then table.insert(Extra, 'V'); end if Character:FindFirstChild'Observe' then table.insert(Extra, 'ILL'); end if Character:FindFirstChild'Inferi' then table.insert(Extra, 'NEC'); end if Character:FindFirstChild'World\'s Pulse' then table.insert(Extra, 'DZIN'); end if Character:FindFirstChild'Head' and Character.Head:FindFirstChild'FacialMarking' then local FM = Character.Head:FindFirstChild'FacialMarking'; if FM.Texture == 'http://www.roblox.com/asset/?id=4072968006' then table.insert(Extra, 'HEALER'); elseif FM.Texture == 'http://www.roblox.com/asset/?id=4072914434' then table.insert(Extra, 'SEER'); elseif FM.Texture == 'http://www.roblox.com/asset/?id=4094417635' then table.insert(Extra, 'JESTER'); end end end if Player:FindFirstChild'Backpack' then if Player.Backpack:FindFirstChild'Observe' then table.insert(Extra, 'ILL'); end if Player.Backpack:FindFirstChild'Inferi' then table.insert(Extra, 'NEC'); end if Player.Backpack:FindFirstChild'World\'s Pulse' then table.insert(Extra, 'DZIN'); end end if #Extra > 0 then Name = Name .. ' [' .. table.concat(Extra, '-') .. ']'; end end return Name; end; }; [4691401390] = { -- Vast Realm CustomCharacter = function(Player) if workspace:FindFirstChild'Players' then return workspace.Players:FindFirstChild(Player.Name); end end }; [6032399813] = { -- Deepwoken [Etrean] CustomPlayerTag = function(Player) local Name = ''; CharacterName = Player:GetAttribute'CharacterName'; -- could use leaderstats but lazy if not IsStringEmpty(CharacterName) then Name = ('\n[%s]'):format(CharacterName); local Character = GetCharacter(Player); local Extra = {}; if Character then local Blood, Armor = Character:FindFirstChild('Blood'), Character:FindFirstChild('Armor'); if Blood and Blood.ClassName == 'DoubleConstrainedValue' then table.insert(Extra, ('B%d'):format(Blood.Value)); end if Armor and Armor.ClassName == 'DoubleConstrainedValue' then table.insert(Extra, ('A%d'):format(math.floor(Armor.Value / 10))); end end local BackpackChildren = Player.Backpack:GetChildren() for index = 1, #BackpackChildren do local Oath = BackpackChildren[index] if Oath.ClassName == 'Folder' and Oath.Name:find('Talent:Oath') then local OathName = Oath.Name:gsub('Talent:Oath: ', '') table.insert(Extra, OathName); end end if #Extra > 0 then Name = Name .. ' [' .. table.concat(Extra, '-') .. ']'; end end return Name; end; }; [5735553160] = { -- Deepwoken [Depths] CustomPlayerTag = function(Player) local Name = ''; CharacterName = Player:GetAttribute'CharacterName'; -- could use leaderstats but lazy if not IsStringEmpty(CharacterName) then Name = ('\n[%s]'):format(CharacterName); local Character = GetCharacter(Player); local Extra = {}; if Character then local Blood, Armor = Character:FindFirstChild('Blood'), Character:FindFirstChild('Armor'); if Blood and Blood.ClassName == 'DoubleConstrainedValue' then table.insert(Extra, ('B%d'):format(Blood.Value)); end if Armor and Armor.ClassName == 'DoubleConstrainedValue' then table.insert(Extra, ('A%d'):format(math.floor(Armor.Value / 10))); end end local BackpackChildren = Player.Backpack:GetChildren() for index = 1, #BackpackChildren do local Oath = BackpackChildren[index] if Oath.ClassName == 'Folder' and Oath.Name:find('Talent:Oath') then local OathName = Oath.Name:gsub('Talent:Oath: ', '') table.insert(Extra, OathName); end end if #Extra > 0 then Name = Name .. ' [' .. table.concat(Extra, '-') .. ']'; end end return Name; end; }; }; if Modules[game.PlaceId] ~= nil then local Module = Modules[game.PlaceId]; CustomPlayerTag = Module.CustomPlayerTag or nil; CustomESP = Module.CustomESP or nil; CustomCharacter = Module.CustomCharacter or nil; GetHealth = Module.GetHealth or nil; GetAliveState = Module.GetAliveState or nil; CustomRootPartName = Module.CustomRootPartName or nil; end function GetCharacter(Player) return Player.Character or (CustomCharacter and CustomCharacter(Player)); end function GetMouseLocation() return UserInputService:GetMouseLocation(); end function MouseHoveringOver(Values) local X1, Y1, X2, Y2 = Values[1], Values[2], Values[3], Values[4] local MLocation = GetMouseLocation(); return (MLocation.x >= X1 and MLocation.x <= (X1 + (X2 - X1))) and (MLocation.y >= Y1 and MLocation.y <= (Y1 + (Y2 - Y1))); end function GetTableData(t) -- basically table.foreach i dont even know why i made this if typeof(t) ~= 'table' then return end return setmetatable(t, { __call = function(t, func) if typeof(func) ~= 'function' then return end; for i, v in pairs(t) do pcall(func, i, v); end end; }); end local function Format(format, ...) return string.format(format, ...); end function CalculateValue(Min, Max, Percent) return Min + math.floor(((Max - Min) * Percent) + .5); end function NewDrawing(InstanceName) local Instance = Drawing.new(InstanceName); -- pcall(Set, Instance, 'OutlineOpacity', 0.8) return (function(Properties) for i, v in pairs(Properties) do pcall(Set, Instance, i, v); end return Instance; end) end function Menu:AddMenuInstance(Name, DrawingType, Properties) local Instance; if shared.MenuDrawingData.Instances[Name] ~= nil then Instance = shared.MenuDrawingData.Instances[Name]; for i, v in pairs(Properties) do pcall(Set, Instance, i, v); end else Instance = NewDrawing(DrawingType)(Properties); end shared.MenuDrawingData.Instances[Name] = Instance; return Instance; end function Menu:UpdateMenuInstance(Name) local Instance = shared.MenuDrawingData.Instances[Name]; if Instance ~= nil then return (function(Properties) for i, v in pairs(Properties) do pcall(Set, Instance, i, v); end return Instance; end) end end function Menu:GetInstance(Name) return shared.MenuDrawingData.Instances[Name]; end local Options = setmetatable({}, { __call = function(t, ...) local Arguments = {...}; local Name = Arguments[1]; OIndex = OIndex + 1; rawset(t, Name, setmetatable({ Name = Arguments[1]; Text = Arguments[2]; Value = Arguments[3]; DefaultValue = Arguments[3]; AllArgs = Arguments; Index = OIndex; }, { __call = function(t, v, force) local self = t; if typeof(t.Value) == 'function' then t.Value(); elseif typeof(t.Value) == 'EnumItem' then local BT = Menu:GetInstance(Format('%s_BindText', t.Name)); if not force then Binding = true; local Val = 0 while Binding do wait(); Val = (Val + 1) % 17; BT.Text = Val <= 8 and '|' or ''; end end t.Value = force and v or BindedKey; if BT and t.BasePosition and t.BaseSize then BT.Text = tostring(t.Value):match'%w+%.%w+%.(.+)'; BT.Position = t.BasePosition + V2New(t.BaseSize.X - BT.TextBounds.X - 20, -10); end else local NewValue = v; if NewValue == nil then NewValue = not t.Value; end rawset(t, 'Value', NewValue); if Arguments[2] ~= nil and Menu:GetInstance'TopBar'.Visible then if typeof(Arguments[3]) == 'number' then local AMT = Menu:GetInstance(Format('%s_AmountText', t.Name)); if AMT then AMT.Text = tostring(t.Value); end else local Inner = Menu:GetInstance(Format('%s_InnerCircle', t.Name)); if Inner then Inner.Visible = t.Value; end end end end end; })); end; }) function Load() local _, Result = pcall(readfile, OptionsFile); if _ then -- extremely ugly code yea i know but i dont care p.s. i hate pcall local _, Table = pcall(HttpService.JSONDecode, HttpService, Result); if _ and typeof(Table) == 'table' then for i, v in pairs(Table) do if typeof(Options[i]) == 'table' and Options[i].Value ~= nil and (typeof(Options[i].Value) == 'boolean' or typeof(Options[i].Value) == 'number') then Options[i].Value = v.Value; pcall(Options[i], v.Value); end end if Table.TeamColor then TeamColor = Color3.new(Table.TeamColor.R, Table.TeamColor.G, Table.TeamColor.B) end if Table.EnemyColor then EnemyColor = Color3.new(Table.EnemyColor.R, Table.EnemyColor.G, Table.EnemyColor.B) end if typeof(Table.MenuKey) == 'string' then Options.MenuKey(Enum.KeyCode[Table.MenuKey], true) end if typeof(Table.ToggleKey) == 'string' then Options.ToggleKey(Enum.KeyCode[Table.ToggleKey], true) end end end end Options('Enabled', 'ESP Enabled', true); Options('ShowTeam', 'Show Team', true); Options('ShowTeamColor', 'Show Team Color', false); Options('ShowName', 'Show Names', true); Options('ShowDistance', 'Show Distance', true); Options('ShowHealth', 'Show Health', true); Options('ShowBoxes', 'Show Boxes', true); Options('ShowTracers', 'Show Tracers', true); Options('ShowDot', 'Show Head Dot', false); Options('VisCheck', 'Visibility Check', false); Options('Crosshair', 'Crosshair', false); Options('TextOutline', 'Text Outline', true); -- Options('Rainbow', 'Rainbow Mode', false); Options('TextSize', 'Text Size', syn and 18 or 14, 10, 24); -- cuz synapse fonts look weird??? Options('MaxDistance', 'Max Distance', 2500, 100, 25000); Options('RefreshRate', 'Refresh Rate (ms)', 5, 1, 200); Options('YOffset', 'Y Offset', 0, -200, 200); Options('MenuKey', 'Menu Key', Enum.KeyCode.F4, 1); Options('ToggleKey', 'Toggle Key', Enum.KeyCode.F3, 1); Options('ChangeColors', SENTINEL_LOADED and 'Sentinel Unsupported' or 'Change Colors', function() if SENTINEL_LOADED then return end SubMenu:Show(GetMouseLocation(), 'Unnamed Colors', { { Type = 'Color'; Text = 'Team Color'; Color = TeamColor; Function = function(Circ, Position) if tick() - ColorPicker.LastGenerated < 1 then return; end if shared.CurrentColorPicker then shared.CurrentColorPicker:Dispose() end local ColorPicker = ColorPicker.new(Position - V2New(-10, 50)); CurrentColorPicker = ColorPicker; shared.CurrentColorPicker = CurrentColorPicker; ColorPicker.ColorChanged:Connect(function(Color) Circ.Color = Color TeamColor = Color Options.TeamColor = Color end); end }; { Type = 'Color'; Text = 'Enemy Color'; Color = EnemyColor; Function = function(Circ, Position) if tick() - ColorPicker.LastGenerated < 1 then return; end if shared.CurrentColorPicker then shared.CurrentColorPicker:Dispose() end local ColorPicker = ColorPicker.new(Position - V2New(-10, 50)); CurrentColorPicker = ColorPicker; shared.CurrentColorPicker = CurrentColorPicker; ColorPicker.ColorChanged:Connect(function(Color) Circ.Color = Color EnemyColor = Color Options.EnemyColor = Color end); end }; { Type = 'Button'; Text = 'Reset Colors'; Function = function() EnemyColor = Color3.new(1, 0, 0); TeamColor = Color3.new(0, 1, 0); local C1 = Menu:GetInstance'Sub-ColorPreview.1'; if C1 then C1.Color = TeamColor end local C2 = Menu:GetInstance'Sub-ColorPreview.2'; if C2 then C2.Color = EnemyColor end end }; { Type = 'Button'; Text = 'Rainbow Mode'; Function = function() Rainbow = not Rainbow; end }; }); end, 2); Options('ResetSettings', 'Reset Settings', function() for i, v in pairs(Options) do if Options[i] ~= nil and Options[i].Value ~= nil and Options[i].Text ~= nil and (typeof(Options[i].Value) == 'boolean' or typeof(Options[i].Value) == 'number' or typeof(Options[i].Value) == 'EnumItem') then Options[i](Options[i].DefaultValue, true); end end end, 5); Options('LoadSettings', 'Load Settings', Load, 4); Options('SaveSettings', 'Save Settings', function() local COptions = {}; for i, v in pairs(Options) do COptions[i] = v; end if typeof(TeamColor) == 'Color3' then COptions.TeamColor = { R = TeamColor.R; G = TeamColor.G; B = TeamColor.B } end if typeof(EnemyColor) == 'Color3' then COptions.EnemyColor = { R = EnemyColor.R; G = EnemyColor.G; B = EnemyColor.B } end if typeof(COptions.MenuKey.Value) == 'EnumItem' then COptions.MenuKey = COptions.MenuKey.Value.Name end if typeof(COptions.ToggleKey.Value) == 'EnumItem' then COptions.ToggleKey = COptions.ToggleKey.Value.Name end writefile(OptionsFile, HttpService:JSONEncode(COptions)); end, 3); Load(1); Options('MenuOpen', nil, true); local function Combine(...) local Output = {}; for i, v in pairs{...} do if typeof(v) == 'table' then table.foreach(v, function(i, v) Output[i] = v; end) end end return Output end function LineBox:Create(Properties) local Box = { Visible = true }; -- prevent errors not really though dont worry bout the Visible = true thing local Properties = Combine({ Transparency = 1; Thickness = 3; Visible = true; }, Properties); if shared.am_ic3 then -- sory just my preference, dynamic boxes will be optional in unnamed esp v2 Box['OutlineSquare']= NewDrawing'Square'(Properties); Box['Square'] = NewDrawing'Square'(Properties); elseif QUAD_SUPPORTED_EXPLOIT then Box['Quad'] = NewDrawing'Quad'(Properties); else Box['TopLeft'] = NewDrawing'Line'(Properties); Box['TopRight'] = NewDrawing'Line'(Properties); Box['BottomLeft'] = NewDrawing'Line'(Properties); Box['BottomRight'] = NewDrawing'Line'(Properties); end function Box:Update(CF, Size, Color, Properties, Parts) if not CF or not Size then return end if shared.am_ic3 and typeof(Parts) == 'table' then local AllCorners = {}; for i, v in pairs(Parts) do -- if not v:IsA'BasePart' then continue end local CF, Size = v.CFrame, v.Size; -- CF, Size = v.Parent:GetBoundingBox(); local Corners = { Vector3.new(CF.X + Size.X / 2, CF.Y + Size.Y / 2, CF.Z + Size.Z / 2); Vector3.new(CF.X - Size.X / 2, CF.Y + Size.Y / 2, CF.Z + Size.Z / 2); Vector3.new(CF.X - Size.X / 2, CF.Y - Size.Y / 2, CF.Z - Size.Z / 2); Vector3.new(CF.X + Size.X / 2, CF.Y - Size.Y / 2, CF.Z - Size.Z / 2); Vector3.new(CF.X - Size.X / 2, CF.Y + Size.Y / 2, CF.Z - Size.Z / 2); Vector3.new(CF.X + Size.X / 2, CF.Y + Size.Y / 2, CF.Z - Size.Z / 2); Vector3.new(CF.X - Size.X / 2, CF.Y - Size.Y / 2, CF.Z + Size.Z / 2); Vector3.new(CF.X + Size.X / 2, CF.Y - Size.Y / 2, CF.Z + Size.Z / 2); }; for i, v in pairs(Corners) do table.insert(AllCorners, v); end -- break end local xMin, yMin = Camera.ViewportSize.X, Camera.ViewportSize.Y; local xMax, yMax = 0, 0; local Vs = true; for i, v in pairs(AllCorners) do local Position, V = WorldToViewport(v); if VS and not V then Vs = false break end if Position.X > xMax then xMax = Position.X; end if Position.X < xMin then xMin = Position.X; end if Position.Y > yMax then yMax = Position.Y; end if Position.Y < yMin then yMin = Position.Y; end end local xSize, ySize = xMax - xMin, yMax - yMin; local Outline = Box['OutlineSquare']; local Square = Box['Square']; Outline.Visible = Vs; Square.Visible = Vs; Square.Position = V2New(xMin, yMin); Square.Color = Color; Square.Thickness = math.floor(Outline.Thickness * 0.3); -- Square.Position = V2New(xMin, yMin); Square.Size = V2New(xSize, ySize); Outline.Position = Square.Position; Outline.Size = Square.Size; Outline.Color = Color3.new(0.12, 0.12, 0.12); Outline.Transparency = 0.75; return end local TLPos, Visible1 = WorldToViewport((CF * CFrame.new( Size.X, Size.Y, 0)).Position); local TRPos, Visible2 = WorldToViewport((CF * CFrame.new(-Size.X, Size.Y, 0)).Position); local BLPos, Visible3 = WorldToViewport((CF * CFrame.new( Size.X, -Size.Y, 0)).Position); local BRPos, Visible4 = WorldToViewport((CF * CFrame.new(-Size.X, -Size.Y, 0)).Position); local Quad = Box['Quad']; if QUAD_SUPPORTED_EXPLOIT then if Visible1 and Visible2 and Visible3 and Visible4 then Quad.Visible = true; Quad.Color = Color; Quad.PointA = V2New(TLPos.X, TLPos.Y); Quad.PointB = V2New(TRPos.X, TRPos.Y); Quad.PointC = V2New(BRPos.X, BRPos.Y); Quad.PointD = V2New(BLPos.X, BLPos.Y); else Box['Quad'].Visible = false; end else Visible1 = TLPos.Z > 0 -- (commented | reason: random flashes); Visible2 = TRPos.Z > 0 -- (commented | reason: random flashes); Visible3 = BLPos.Z > 0 -- (commented | reason: random flashes); Visible4 = BRPos.Z > 0 -- (commented | reason: random flashes); -- ## BEGIN UGLY CODE if Visible1 then Box['TopLeft'].Visible = true; Box['TopLeft'].Color = Color; Box['TopLeft'].From = V2New(TLPos.X, TLPos.Y); Box['TopLeft'].To = V2New(TRPos.X, TRPos.Y); else Box['TopLeft'].Visible = false; end if Visible2 then Box['TopRight'].Visible = true; Box['TopRight'].Color = Color; Box['TopRight'].From = V2New(TRPos.X, TRPos.Y); Box['TopRight'].To = V2New(BRPos.X, BRPos.Y); else Box['TopRight'].Visible = false; end if Visible3 then Box['BottomLeft'].Visible = true; Box['BottomLeft'].Color = Color; Box['BottomLeft'].From = V2New(BLPos.X, BLPos.Y); Box['BottomLeft'].To = V2New(TLPos.X, TLPos.Y); else Box['BottomLeft'].Visible = false; end if Visible4 then Box['BottomRight'].Visible = true; Box['BottomRight'].Color = Color; Box['BottomRight'].From = V2New(BRPos.X, BRPos.Y); Box['BottomRight'].To = V2New(BLPos.X, BLPos.Y); else Box['BottomRight'].Visible = false; end -- ## END UGLY CODE if Properties and typeof(Properties) == 'table' then GetTableData(Properties)(function(i, v) pcall(Set, Box['TopLeft'], i, v); pcall(Set, Box['TopRight'], i, v); pcall(Set, Box['BottomLeft'], i, v); pcall(Set, Box['BottomRight'], i, v); end) end end end function Box:SetVisible(bool) if shared.am_ic3 then Box['Square'].Visible = bool; Box['OutlineSquare'].Visible = bool; else pcall(Set, Box['Quad'], 'Visible', bool); end -- pcall(Set, Box['TopLeft'], 'Visible', bool); -- pcall(Set, Box['TopRight'], 'Visible', bool); -- pcall(Set, Box['BottomLeft'], 'Visible', bool); -- pcall(Set, Box['BottomRight'], 'Visible', bool); end function Box:Remove() self:SetVisible(false); if shared.am_ic3 then Box['Square']:Remove(); Box['OutlineSquare']:Remove(); else Box['Quad']:Remove(); end -- Box['TopLeft']:Remove(); -- Box['TopRight']:Remove(); -- Box['BottomLeft']:Remove(); -- Box['BottomRight']:Remove(); end return Box; end local Colors = { White = FromHex'ffffff'; Primary = { Main = FromHex'424242'; Light = FromHex'6d6d6d'; Dark = FromHex'1b1b1b'; }; Secondary = { Main = FromHex'e0e0e0'; Light = FromHex'ffffff'; Dark = FromHex'aeaeae'; }; }; function Connections:Listen(Connection, Function) local NewConnection = Connection:Connect(Function); table.insert(self.Active, NewConnection); return NewConnection; end function Connections:DisconnectAll() for Index, Connection in pairs(self.Active) do if Connection.Connected then Connection:Disconnect(); end end self.Active = {}; end function Signal.new() local self = setmetatable({ _BindableEvent = Instance.new'BindableEvent' }, Signal); return self; end function Signal:Connect(Callback) assert(typeof(Callback) == 'function', 'function expected; got ' .. typeof(Callback)); return self._BindableEvent.Event:Connect(function(...) Callback(...) end); end function Signal:Fire(...) self._BindableEvent:Fire(...); end function Signal:Wait() local Arguments = self._BindableEvent:Wait(); return Arguments; end function Signal:Disconnect() if self._BindableEvent then self._BindableEvent:Destroy(); end end local function GetMouseLocation() return UserInputService:GetMouseLocation(); end local function IsMouseOverDrawing(Drawing, MousePosition) local TopLeft = Drawing.Position; local BottomRight = Drawing.Position + Drawing.Size; local MousePosition = MousePosition or GetMouseLocation(); return MousePosition.X > TopLeft.X and MousePosition.Y > TopLeft.Y and MousePosition.X < BottomRight.X and MousePosition.Y < BottomRight.Y; end local ImageCache = {}; local function SetImage(Drawing, Url) local Data = IsSynapse and game:HttpGet(Url) or Url; print(Drawing, IsSynapse) Drawing[IsSynapse and 'Data' or 'Uri'] = ImageCache[Url] or Data; ImageCache[Url] = Data; if not IsSynapse then repeat wait() until Drawing.Loaded; end end -- oh god unnamed esp needs an entire rewrite, someone make a better one pls im too lazy -- btw the color picker was made seperately so it doesnt fit with the code of unnamed esp local function CreateDrawingsTable() local Drawings = { __Objects = {} }; local Metatable = {}; function Metatable.__index(self, Index) local Object = rawget(self.__Objects, Index); if not Object or (IsSynapse and not Object.__SELF.__OBJECT_EXISTS) then local Type = Index:sub(1, Index:find'-' - 1); Success, Object = pcall(Drawing.new, Type); if not Object or not Success then return function() end; end self.__Objects[Index] = setmetatable({ __SELF = Object; Type = Type }, { __call = function(self, Properties) local Object = rawget(self, '__SELF'); if IsSynapse and not Object.__OBJECT_EXISTS then return false, 'render object destroyed'; end if Properties == false then Object.Visible = false; Object.Transparency = 0; Object:Remove(); return true; end if typeof(Properties) == 'table' then for Property, Value in pairs(Properties) do local CanSet = true; if self.Type == 'Image' and not IsSynapse and Property == 'Size' and typeof(Value) == 'Vector2' then CanSet = false; spawn(function() repeat wait() until Object.Loaded; if not self.DefaultSize then rawset(self, 'DefaultSize', Object.Size) end Property = 'ScaleFactor'; Value = Value.X / self.DefaultSize.X; Object[Property] = Value end) end if CanSet then Object[Property] = Value end end end return Object; end }); Object.Visible = true; Object.Transparency = 1; -- Transparency is really Opacity with drawing api (1 being visible, 0 being invisible) if Type == 'Text' then if Drawing.Fonts then Object.Font = Drawing.Fonts.Monospace end Object.Size = 20; Object.Color = Color3.new(1, 1, 1); Object.Center = true; Object.Outline = true; OutlineOpacity = 0.5; elseif Type == 'Square' or Type == 'Rectangle' then Object.Thickness = 2; Object.Filled = false; end return self.__Objects[Index]; end return Object; end function Metatable.__call(self, Delete, ...) local Arguments = {Delete, ...}; if Delete == false then for Index, Drawing in pairs(rawget(self, '__Objects')) do Drawing(false); end end end return setmetatable(Drawings, Metatable); end local Images = {}; spawn(function() Images.Ring = 'https://i.imgur.com/q4qx26f.png'; Images.Overlay = 'https://i.imgur.com/gOCxbsR.png'; end) function ColorPicker.new(Position, Size, Color) ColorPicker.LastGenerated = tick(); ColorPicker.Loading = true; local Picker = { Color = Color or Color3.new(1, 1, 1); HSV = { H = 0, S = 1, V = 1 } }; local Drawings = CreateDrawingsTable(); local Position = Position or V2New(); local Size = Size or 150; local Padding = { 10, 10, 10, 10 }; Picker.ColorChanged = Signal.new(); local Background = Drawings['Square-Background'] { Color = Color3.fromRGB(33, 33, 33); Filled = false; Visible = false; Position = Position - V2New(Padding[4], Padding[1]); Size = V2New(Size, Size) + V2New(Padding[4] + Padding[2], Padding[1] + Padding[3]); }; local ColorPreview = Drawings['Circle-Preview'] { Position = Position + (V2New(Size, Size) / 2); Radius = Size / 2 - 8; Filled = true; Thickness = 0; NumSides = 20; Color = Color3.new(1, 0, 0); }; local Main = Drawings['Image-Main'] { Position = Position; Size = V2New(Size, Size); }; SetImage(Main, Images.Ring); local Preview = Drawings['Square-Preview'] { Position = Main.Position + (Main.Size / 4.5); Size = Main.Size / 1.75; Color = Color3.new(1, 0, 0); Filled = true; Thickness = 0; }; local Overlay = Drawings['Image-Overlay'] { Position = Preview.Position; Size = Preview.Size; Transparency = 1; }; SetImage(Overlay, Images.Overlay); local CursorOutline = Drawings['Circle-CursorOutline'] { Radius = 4; Thickness = 2; Filled = false; Color = Color3.new(0.2, 0.2, 0.2); Position = V2New(Main.Position.X + Main.Size.X - 10, Main.Position.Y + (Main.Size.Y / 2)); }; local Cursor = Drawings['Circle-Cursor'] { Radius = 3; Transparency = 1; Filled = true; Color = Color3.new(1, 1, 1); Position = CursorOutline.Position; }; local CursorOutline = Drawings['Circle-CursorOutlineSquare'] { Radius = 4; Thickness = 2; Filled = false; Color = Color3.new(0.2, 0.2, 0.2); Position = V2New(Preview.Position.X + Preview.Size.X - 2, Preview.Position.Y + 2); }; Drawings['Circle-CursorSquare'] { Radius = 3; Transparency = 1; Filled = true; Color = Color3.new(1, 1, 1); Position = CursorOutline.Position; }; function Picker:UpdatePosition(Input) local MousePosition = V2New(Input.Position.X, Input.Position.Y + 33); if self.MouseHeld then if self.Item == 'Ring' then local Main = self.Drawings['Image-Main'] (); local Preview = self.Drawings['Square-Preview'] (); local Bounds = Main.Size / 2; local Center = Main.Position + Bounds; local Relative = MousePosition - Center; local Direction = Relative.unit; local Position = Center + Direction * Main.Size.X / 2.15; local H = (math.atan2(Position.Y - Center.Y, Position.X - Center.X)) * 60; if H < 0 then H = 360 + H; end H = H / 360; self.HSV.H = H; local EndColor = Color3.fromHSV(H, self.HSV.S, self.HSV.V); if EndColor ~= self.Color then self.ColorChanged:Fire(self.Color); end local Pointer = self.Drawings['Circle-Cursor'] { Position = Position }; self.Drawings['Circle-CursorOutline'] { Position = Pointer.Position }; Bounds = Bounds * 2; Preview.Color = Color3.fromHSV(H, 1, 1); self.Color = EndColor; self.Drawings['Circle-Preview'] { Color = EndColor }; elseif self.Item == 'HL' then local Preview = self.Drawings['Square-Preview'] (); local HSV = self.HSV; local Position = V2New(math.clamp(MousePosition.X, Preview.Position.X, Preview.Position.X + Preview.Size.X), math.clamp(MousePosition.Y, Preview.Position.Y, Preview.Position.Y + Preview.Size.Y)); HSV.S = (Position.X - Preview.Position.X) / Preview.Size.X; HSV.V = 1 - (Position.Y - Preview.Position.Y) / Preview.Size.Y; local EndColor = Color3.fromHSV(HSV.H, HSV.S, HSV.V); if EndColor ~= self.Color then self.ColorChanged:Fire(self.Color); end self.Color = EndColor; self.Drawings['Circle-Preview'] { Color = EndColor }; local Pointer = self.Drawings['Circle-CursorSquare'] { Position = Position }; self.Drawings['Circle-CursorOutlineSquare'] { Position = Pointer.Position }; end end end function Picker:HandleInput(Input, P, Type) if Type == 'Began' then if Input.UserInputType.Name == 'MouseButton1' then local Main = self.Drawings['Image-Main'] (); local SquareSV = self.Drawings['Square-Preview'] (); local MousePosition = V2New(Input.Position.X, Input.Position.Y + 33); self.MouseHeld = true; local Bounds = Main.Size / 2; local Center = Main.Position + Bounds; local R = (MousePosition - Center); if R.Magnitude < Bounds.X and R.Magnitude > Bounds.X - 20 then self.Item = 'Ring'; end if MousePosition.X > SquareSV.Position.X and MousePosition.Y > SquareSV.Position.Y and MousePosition.X < SquareSV.Position.X + SquareSV.Size.X and MousePosition.Y < SquareSV.Position.Y + SquareSV.Size.Y then self.Item = 'HL'; end self:UpdatePosition(Input, P); end elseif Type == 'Changed' then if Input.UserInputType.Name == 'MouseMovement' then self:UpdatePosition(Input, P); end elseif Type == 'Ended' and Input.UserInputType.Name == 'MouseButton1' then self.Item = nil; end end function Picker:Dispose() self.Drawings(false); self.UpdatePosition = nil; self.HandleInput = nil; Connections:DisconnectAll(); -- scuffed tbh end Connections:Listen(UserInputService.InputBegan, function(Input, Process) Picker:HandleInput(Input, Process, 'Began'); end); Connections:Listen(UserInputService.InputChanged, function(Input, Process) if Input.UserInputType.Name == 'MouseMovement' then local MousePosition = V2New(Input.Position.X, Input.Position.Y + 33); local Cursor = Picker.Drawings['Triangle-Cursor'] { Filled = true; Color = Color3.new(0.9, 0.9, 0.9); PointA = MousePosition + V2New(0, 0); PointB = MousePosition + V2New(12, 14); PointC = MousePosition + V2New(0, 18); Thickness = 0; }; end Picker:HandleInput(Input, Process, 'Changed'); end); Connections:Listen(UserInputService.InputEnded, function(Input, Process) Picker:HandleInput(Input, Process, 'Ended'); if Input.UserInputType.Name == 'MouseButton1' then Picker.MouseHeld = false; end end); ColorPicker.Loading = false; Picker.Drawings = Drawings; return Picker; end function SubMenu:Show(Position, Title, Options) self.Open = true; local Visible = true; local BasePosition = Position; local BaseSize = V2New(200, 140); local End = BasePosition + BaseSize; self.Bounds = { BasePosition.X, BasePosition.Y, End.X, End.Y }; delay(0.025, function() if not self.Open then return; end Menu:AddMenuInstance('Sub-Main', 'Square', { Size = BaseSize; Position = BasePosition; Filled = false; Color = Colors.Primary.Main; Thickness = 3; Visible = Visible; }); end); Menu:AddMenuInstance('Sub-TopBar', 'Square', { Position = BasePosition; Size = V2New(BaseSize.X, 10); Color = Colors.Primary.Dark; Filled = true; Visible = Visible; }); Menu:AddMenuInstance('Sub-TopBarTwo', 'Square', { Position = BasePosition + V2New(0, 10); Size = V2New(BaseSize.X, 20); Color = Colors.Primary.Main; Filled = true; Visible = Visible; }); Menu:AddMenuInstance('Sub-TopBarText', 'Text', { Size = 20; Position = shared.MenuDrawingData.Instances['Sub-TopBarTwo'].Position + V2New(15, -3); Text = Title or ''; Color = Colors.Secondary.Light; Visible = Visible; }); Menu:AddMenuInstance('Sub-Filling', 'Square', { Size = BaseSize - V2New(0, 30); Position = BasePosition + V2New(0, 30); Filled = true; Color = Colors.Secondary.Main; Transparency= .75; Visible = Visible; }); if Options then for Index, Option in pairs(Options) do -- currently only supports color and button(but color is a button so), planning on fully rewriting or something local function GetName(Name) return ('Sub-%s.%d'):format(Name, Index) end local Position = shared.MenuDrawingData.Instances['Sub-Filling'].Position + V2New(20, Index * 25 - 10); -- local BasePosition = shared.MenuDrawingData.Instances.Filling.Position + V2New(30, v.Index * 25 - 10); if Option.Type == 'Color' then local ColorPreview = Menu:AddMenuInstance(GetName'ColorPreview', 'Circle', { Position = Position; Color = Option.Color; Radius = IsSynapse and 10 or 10; NumSides = 10; Filled = true; Visible = true; }); local Text = Menu:AddMenuInstance(GetName'Text', 'Text', { Text = Option.Text; Position = ColorPreview.Position + V2New(15, -8); Size = 16; Color = Colors.Primary.Dark; Visible = true; }); UIButtons[#UIButtons + 1] = { FromSubMenu = true; Option = function() return Option.Function(ColorPreview, BasePosition + V2New(BaseSize.X, 0)) end; Instance = Menu:AddMenuInstance(Format('%s_Hitbox', GetName'Button'), 'Square', { Position = Position - V2New(20, 12); Size = V2New(BaseSize.X, 25); Visible = false; }); }; elseif Option.Type == 'Button' then UIButtons[#UIButtons + 1] = { FromSubMenu = true; Option = Option.Function; Instance = Menu:AddMenuInstance(Format('%s_Hitbox', GetName'Button'), 'Square', { Size = V2New(BaseSize.X, 20) - V2New(20, 0); Visible = true; Transparency= .5; Position = Position - V2New(10, 10); Color = Colors.Secondary.Light; Filled = true; }); }; local Text = Menu:AddMenuInstance(Format('%s_Text', GetName'Text'), 'Text', { Text = Option.Text; Size = 18; Position = Position + V2New(5, -10); Visible = true; Color = Colors.Primary.Dark; }); end end end end function SubMenu:Hide() self.Open = false; for i, v in pairs(shared.MenuDrawingData.Instances) do if i:sub(1, 3) == 'Sub' then v.Visible = false; if i:sub(4, 4) == ':' then -- ';' = Temporary so remove v:Remove(); shared.MenuDrawingData.Instance[i] = nil; end end end for i, Button in pairs(UIButtons) do if Button.FromSubMenu then UIButtons[i] = nil; end end spawn(function() -- stupid bug happens if i dont use this for i = 1, 10 do if shared.CurrentColorPicker then -- dont know why 'CurrentColorPicker' isnt a variable in this shared.CurrentColorPicker:Dispose(); end wait(0.1); end end) CurrentColorPicker = nil; end function CreateMenu(NewPosition) -- Create Menu MenuLoaded = false; UIButtons = {}; Sliders = {}; local BaseSize = V2New(300, 625); local BasePosition = NewPosition or V2New(Camera.ViewportSize.X / 8 - (BaseSize.X / 2), Camera.ViewportSize.Y / 2 - (BaseSize.Y / 2)); BasePosition = V2New(math.clamp(BasePosition.X, 0, Camera.ViewportSize.X), math.clamp(BasePosition.Y, 0, Camera.ViewportSize.Y)); Menu:AddMenuInstance('CrosshairX', 'Line', { Visible = false; Color = Color3.new(0, 1, 0); Transparency = 1; Thickness = 1; }); Menu:AddMenuInstance('CrosshairY', 'Line', { Visible = false; Color = Color3.new(0, 1, 0); Transparency = 1; Thickness = 1; }); delay(.025, function() -- since zindex doesnt exist Menu:AddMenuInstance('Main', 'Square', { Size = BaseSize; Position = BasePosition; Filled = false; Color = Colors.Primary.Main; Thickness = 3; Visible = true; }); end); Menu:AddMenuInstance('TopBar', 'Square', { Position = BasePosition; Size = V2New(BaseSize.X, 15); Color = Colors.Primary.Dark; Filled = true; Visible = true; }); Menu:AddMenuInstance('TopBarTwo', 'Square', { Position = BasePosition + V2New(0, 15); Size = V2New(BaseSize.X, 45); Color = Colors.Primary.Main; Filled = true; Visible = true; }); Menu:AddMenuInstance('TopBarText', 'Text', { Size = 25; Position = shared.MenuDrawingData.Instances.TopBarTwo.Position + V2New(25, 10); Text = 'Unnamed ESP'; Color = Colors.Secondary.Light; Visible = true; Transparency= 1; -- proto outline fix Outline = true; OutlineOpacity = 0.5; }); Menu:AddMenuInstance('TopBarTextBR', 'Text', { Size = 18; Position = shared.MenuDrawingData.Instances.TopBarTwo.Position + V2New(BaseSize.X - 75, 25); Text = 'by ic3w0lf'; Color = Colors.Secondary.Light; Visible = true; Transparency= 1; Outline = true; OutlineOpacity = 0.5; }); Menu:AddMenuInstance('Filling', 'Square', { Size = BaseSize - V2New(0, 60); Position = BasePosition + V2New(0, 60); Filled = true; Color = Colors.Secondary.Main; Transparency= .5; Visible = true; }); local CPos = 0; GetTableData(Options)(function(i, v) if typeof(v.Value) == 'boolean' and not IsStringEmpty(v.Text) and v.Text ~= nil then CPos = CPos + 25; local BaseSize = V2New(BaseSize.X, 30); local BasePosition = shared.MenuDrawingData.Instances.Filling.Position + V2New(30, v.Index * 25 - 10); UIButtons[#UIButtons + 1] = { Option = v; Instance = Menu:AddMenuInstance(Format('%s_Hitbox', v.Name), 'Square', { Position = BasePosition - V2New(30, 15); Size = BaseSize; Visible = false; }); }; Menu:AddMenuInstance(Format('%s_OuterCircle', v.Name), 'Circle', { Radius = 10; Position = BasePosition; Color = Colors.Secondary.Light; Filled = true; Visible = true; }); Menu:AddMenuInstance(Format('%s_InnerCircle', v.Name), 'Circle', { Radius = 7; Position = BasePosition; Color = Colors.Secondary.Dark; Filled = true; Visible = v.Value; }); Menu:AddMenuInstance(Format('%s_Text', v.Name), 'Text', { Text = v.Text; Size = 20; Position = BasePosition + V2New(20, -10); Visible = true; Color = Colors.Secondary.Light; Transparency= 1; Outline = true; OutlineOpacity = 0.5; }); end end) GetTableData(Options)(function(i, v) -- just to make sure certain things are drawn before or after others, too lazy to actually sort table if typeof(v.Value) == 'number' then CPos = CPos + 25; local BaseSize = V2New(BaseSize.X, 30); local BasePosition = shared.MenuDrawingData.Instances.Filling.Position + V2New(0, CPos - 10); local Line = Menu:AddMenuInstance(Format('%s_SliderLine', v.Name), 'Square', { Transparency = 1; Color = Colors.Secondary.Light; -- Thickness = 3; Filled = true; Visible = true; Position = BasePosition + V2New(15, -5); Size = BaseSize - V2New(30, 10); Transparency = 0.5; }); local Slider = Menu:AddMenuInstance(Format('%s_Slider', v.Name), 'Square', { Visible = true; Filled = true; Color = Colors.Primary.Dark; Size = V2New(5, Line.Size.Y); Transparency = 0.5; }); local Text = Menu:AddMenuInstance(Format('%s_Text', v.Name), 'Text', { Text = v.Text; Size = 20; Center = true; Transparency = 1; Outline = true; OutlineOpacity = 0.5; Visible = true; Color = Colors.White; }); Text.Position = Line.Position + (Line.Size / 2) - V2New(0, Text.TextBounds.Y / 1.75); local AMT = Menu:AddMenuInstance(Format('%s_AmountText', v.Name), 'Text', { Text = tostring(v.Value); Size = 22; Center = true; Transparency = 1; Outline = true; OutlineOpacity = 0.5; Visible = true; Color = Colors.White; Position = Text.Position; }); local CSlider = {Slider = Slider; Line = Line; Min = v.AllArgs[4]; Max = v.AllArgs[5]; Option = v}; local Dummy = Instance.new'NumberValue'; Dummy:GetPropertyChangedSignal'Value':Connect(function() Text.Transparency = Dummy.Value; -- Text.OutlineTransparency = 1 - Dummy.Value; AMT.Transparency = 1 - Dummy.Value; end); Dummy.Value = 1; function CSlider:ShowValue(Bool) self.ShowingValue = Bool; TweenService:Create(Dummy, TweenInfo.new(0.5, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), { Value = Bool and 0 or 1 }):Play(); end Sliders[#Sliders + 1] = CSlider; -- local Percent = (v.Value / CSlider.Max) * 100; -- local Size = math.abs(Line.From.X - Line.To.X); -- local Value = Size * (Percent / 100); -- this shit's inaccurate but fuck it i'm not even gonna bother fixing it Slider.Position = Line.Position + V2New(35, 0); v.BaseSize = BaseSize; v.BasePosition = BasePosition; -- AMT.Position = BasePosition + V2New(BaseSize.X - AMT.TextBounds.X - 10, -10) end end) local FirstItem = false; GetTableData(Options)(function(i, v) -- just to make sure certain things are drawn before or after others, too lazy to actually sort table if typeof(v.Value) == 'EnumItem' then CPos = CPos + (not FirstItem and 30 or 25); FirstItem = true; local BaseSize = V2New(BaseSize.X, FirstItem and 30 or 25); local BasePosition = shared.MenuDrawingData.Instances.Filling.Position + V2New(0, CPos - 10); UIButtons[#UIButtons + 1] = { Option = v; Instance = Menu:AddMenuInstance(Format('%s_Hitbox', v.Name), 'Square', { Size = V2New(BaseSize.X, 20) - V2New(30, 0); Visible = true; Transparency= .5; Position = BasePosition + V2New(15, -10); Color = Colors.Secondary.Light; Filled = true; }); }; local Text = Menu:AddMenuInstance(Format('%s_Text', v.Name), 'Text', { Text = v.Text; Size = 20; Position = BasePosition + V2New(20, -10); Visible = true; Color = Colors.Secondary.Light; Transparency= 1; Outline = true; OutlineOpacity = 0.5; }); local BindText = Menu:AddMenuInstance(Format('%s_BindText', v.Name), 'Text', { Text = tostring(v.Value):match'%w+%.%w+%.(.+)'; Size = 20; Position = BasePosition; Visible = true; Color = Colors.Secondary.Light; Transparency= 1; Outline = true; OutlineOpacity = 0.5; }); Options[i].BaseSize = BaseSize; Options[i].BasePosition = BasePosition; BindText.Position = BasePosition + V2New(BaseSize.X - BindText.TextBounds.X - 20, -10); end end) GetTableData(Options)(function(i, v) -- just to make sure certain things are drawn before or after others, too lazy to actually sort table if typeof(v.Value) == 'function' then local BaseSize = V2New(BaseSize.X, 30); local BasePosition = shared.MenuDrawingData.Instances.Filling.Position + V2New(0, CPos + (25 * v.AllArgs[4]) - 35); UIButtons[#UIButtons + 1] = { Option = v; Instance = Menu:AddMenuInstance(Format('%s_Hitbox', v.Name), 'Square', { Size = V2New(BaseSize.X, 20) - V2New(30, 0); Visible = true; Transparency= .5; Position = BasePosition + V2New(15, -10); Color = Colors.Secondary.Light; Filled = true; }); }; local Text = Menu:AddMenuInstance(Format('%s_Text', v.Name), 'Text', { Text = v.Text; Size = 20; Position = BasePosition + V2New(20, -10); Visible = true; Color = Colors.Secondary.Light; Transparency= 1; Outline = true; OutlineOpacity = 0.5; }); -- BindText.Position = BasePosition + V2New(BaseSize.X - BindText.TextBounds.X - 10, -10); end end) delay(.1, function() MenuLoaded = true; end); -- this has to be at the bottom cuz proto drawing api doesnt have zindex :triumph: Menu:AddMenuInstance('Cursor1', 'Line', { Visible = false; Color = Color3.new(1, 0, 0); Transparency = 1; Thickness = 2; }); Menu:AddMenuInstance('Cursor2', 'Line', { Visible = false; Color = Color3.new(1, 0, 0); Transparency = 1; Thickness = 2; }); Menu:AddMenuInstance('Cursor3', 'Line', { Visible = false; Color = Color3.new(1, 0, 0); Transparency = 1; Thickness = 2; }); end CreateMenu(); delay(0.1, function() SubMenu:Show(V2New()); -- Create the submenu SubMenu:Hide(); end); shared.UESP_InputChangedCon = UserInputService.InputChanged:Connect(function(input) if input.UserInputType.Name == 'MouseMovement' and Options.MenuOpen.Value then for i, v in pairs(Sliders) do local Values = { v.Line.Position.X; v.Line.Position.Y; v.Line.Position.X + v.Line.Size.X; v.Line.Position.Y + v.Line.Size.Y; }; if MouseHoveringOver(Values) then v:ShowValue(true); else if not MouseHeld then v:ShowValue(false); end end end end end) shared.UESP_InputBeganCon = UserInputService.InputBegan:Connect(function(input) if input.UserInputType.Name == 'MouseButton1' and Options.MenuOpen.Value then MouseHeld = true; local Bar = Menu:GetInstance'TopBar'; local Values = { Bar.Position.X; Bar.Position.Y; Bar.Position.X + Bar.Size.X; Bar.Position.Y + Bar.Size.Y; } if MouseHoveringOver(Values) then DraggingUI = true; DragOffset = Menu:GetInstance'Main'.Position - GetMouseLocation(); else for i, v in pairs(Sliders) do local Values = { v.Line.Position.X; v.Line.Position.Y; v.Line.Position.X + v.Line.Size.X; v.Line.Position.Y + v.Line.Size.Y; -- v.Line.From.X - (v.Slider.Radius); -- v.Line.From.Y - (v.Slider.Radius); -- v.Line.To.X + (v.Slider.Radius); -- v.Line.To.Y + (v.Slider.Radius); }; if MouseHoveringOver(Values) then DraggingWhat = v; Dragging = true; break end end if not Dragging then local Values = { TracerPosition.X - 10; TracerPosition.Y - 10; TracerPosition.X + 10; TracerPosition.Y + 10; }; if MouseHoveringOver(Values) then DragTracerPosition = true; end end end end end) shared.UESP_InputEndedCon = UserInputService.InputEnded:Connect(function(input) if input.UserInputType.Name == 'MouseButton1' and Options.MenuOpen.Value then MouseHeld = false; DragTracerPosition = false; local IgnoreOtherInput = false; if SubMenu.Open and not MouseHoveringOver(SubMenu.Bounds) then if CurrentColorPicker and IsMouseOverDrawing(CurrentColorPicker.Drawings['Square-Background']()) then IgnoreOtherInput = true; end if not IgnoreOtherInput then SubMenu:Hide() end end if not IgnoreOtherInput then for i, v in pairs(UIButtons) do if SubMenu.Open and MouseHoveringOver(SubMenu.Bounds) and not v.FromSubMenu then continue end local Values = { v.Instance.Position.X; v.Instance.Position.Y; v.Instance.Position.X + v.Instance.Size.X; v.Instance.Position.Y + v.Instance.Size.Y; }; if MouseHoveringOver(Values) then v.Option(); IgnoreOtherInput = true; break -- prevent clicking 2 options end end for i, v in pairs(Sliders) do if IgnoreOtherInput then break end local Values = { v.Line.Position.X; v.Line.Position.Y; v.Line.Position.X + v.Line.Size.X; v.Line.Position.Y + v.Line.Size.Y; }; if not MouseHoveringOver(Values) then v:ShowValue(false); end end end elseif input.UserInputType.Name == 'MouseButton2' and Options.MenuOpen.Value and not DragTracerPosition then local Values = { TracerPosition.X - 10; TracerPosition.Y - 10; TracerPosition.X + 10; TracerPosition.Y + 10; } if MouseHoveringOver(Values) then DragTracerPosition = false; TracerPosition = V2New(Camera.ViewportSize.X / 2, Camera.ViewportSize.Y - 135); end elseif input.UserInputType.Name == 'Keyboard' then if Binding then BindedKey = input.KeyCode; Binding = false; elseif input.KeyCode == Options.MenuKey.Value or (input.KeyCode == Enum.KeyCode.Home and UserInputService:IsKeyDown(Enum.KeyCode.LeftControl)) then Options.MenuOpen(); elseif input.KeyCode == Options.ToggleKey.Value then Options.Enabled(); elseif input.KeyCode.Name == 'F1' and UserInputService:IsMouseButtonPressed(1) and shared.am_ic3 then -- hehe hiden spectate feature cuz why not local HD, LPlayer, LCharacter = 0.95; for i, Player in pairs(Players:GetPlayers()) do local Character = GetCharacter(Player); if Player ~= LocalPlayer and Player ~= Spectating and Character and Character:FindFirstChild'HumanoidRootPart' then local Head = Character:FindFirstChild'Head'; local Humanoid = Character:FindFirstChildOfClass'Humanoid'; if Head then local Distance = (Camera.CFrame.Position - Head.Position).Magnitude; if Distance > Options.MaxDistance.Value then continue; end local Direction = -(Camera.CFrame.Position - Mouse.Hit.Position).unit; local Relative = Character.Head.Position - Camera.CFrame.Position; local Unit = Relative.unit; local DP = Direction:Dot(Unit); if DP > HD then HD = DP; LPlayer = Player; LCharacter = Character; end end end end if LPlayer and LPlayer ~= Spectating and LCharacter then Camera.CameraSubject = LCharacter.Head; Spectating = LPlayer; else if LocalPlayer.Character and LocalPlayer.Character:FindFirstChildOfClass'Humanoid' then Camera.CameraSubject = LocalPlayer.Character:FindFirstChildOfClass'Humanoid'; Spectating = nil; end end end end end) local function CameraCon() -- unnamed esp v1 sucks workspace.CurrentCamera:GetPropertyChangedSignal'ViewportSize':Connect(function() TracerPosition = V2New(Camera.ViewportSize.X / 2, Camera.ViewportSize.Y - 135); end); end CameraCon(); local function ToggleMenu() if Options.MenuOpen.Value then -- GUIService:SetMenuIsOpen(true); GetTableData(shared.MenuDrawingData.Instances)(function(i, v) if OldData[v] then pcall(Set, v, 'Visible', true); end end) else -- GUIService:SetMenuIsOpen(false); GetTableData(shared.MenuDrawingData.Instances)(function(i, v) OldData[v] = v.Visible; if v.Visible then pcall(Set, v, 'Visible', false); end end) end end local function CheckRay(Instance, Distance, Position, Unit) local Pass = true; local Model = Instance; if Distance > 999 then return false; end if Instance.ClassName == 'Player' then Model = GetCharacter(Instance); end if not Model then Model = Instance.Parent; if Model.Parent == workspace then Model = Instance; end end if not Model then return false end local _Ray = Ray.new(Position, Unit * Distance); local List = {LocalPlayer.Character, Camera, Mouse.TargetFilter}; for i,v in pairs(IgnoreList) do table.insert(List, v); end; local Hit = workspace:FindPartOnRayWithIgnoreList(_Ray, List); if Hit and not Hit:IsDescendantOf(Model) then Pass = false; if Hit.Transparency >= .3 or not Hit.CanCollide and Hit.ClassName ~= Terrain then -- Detect invisible walls IgnoreList[#IgnoreList + 1] = Hit; end end return Pass; end local function CheckTeam(Player) if Player.Neutral and LocalPlayer.Neutral then return true; end return Player.TeamColor == LocalPlayer.TeamColor; end local CustomTeam = CustomTeams[game.PlaceId]; if CustomTeam ~= nil then if CustomTeam.Initialize then ypcall(CustomTeam.Initialize) end CheckTeam = CustomTeam.CheckTeam; end local function CheckPlayer(Player, Character) if not Options.Enabled.Value then return false end local Pass = true; local Distance = 0; if Player ~= LocalPlayer and Character then if not Options.ShowTeam.Value and CheckTeam(Player) then Pass = false; end local Head = Character:FindFirstChild'Head'; if Pass and Character and Head then Distance = (Camera.CFrame.Position - Head.Position).Magnitude; if Options.VisCheck.Value then Pass = CheckRay(Player, Distance, Camera.CFrame.Position, (Head.Position - Camera.CFrame.Position).unit); end if Distance > Options.MaxDistance.Value then Pass = false; end end else Pass = false; end return Pass, Distance; end local function CheckDistance(Instance) if not Options.Enabled.Value then return false end local Pass = true; local Distance = 0; if Instance ~= nil then Distance = (Camera.CFrame.Position - Instance.Position).Magnitude; if Options.VisCheck.Value then Pass = CheckRay(Instance, Distance, Camera.CFrame.Position, (Instance.Position - Camera.CFrame.Position).unit); end if Distance > Options.MaxDistance.Value then Pass = false; end else Pass = false; end return Pass, Distance; end local function UpdatePlayerData() if (tick() - LastRefresh) > (Options.RefreshRate.Value / 1000) then LastRefresh = tick(); if CustomESP and Options.Enabled.Value then local a, b = pcall(CustomESP); end for i, v in pairs(RenderList.Instances) do if v.Instance ~= nil and v.Instance.Parent ~= nil and v.Instance:IsA'BasePart' then local Data = shared.InstanceData[v.Instance:GetDebugId()] or { Instances = {}; DontDelete = true }; Data.Instance = v.Instance; Data.Instances['OutlineTracer'] = Data.Instances['OutlineTracer'] or NewDrawing'Line'{ Transparency = 0.75; Thickness = 5; Color = Color3.new(0.1, 0.1, 0.1); } Data.Instances['Tracer'] = Data.Instances['Tracer'] or NewDrawing'Line'{ Transparency = 1; Thickness = 2; } Data.Instances['NameTag'] = Data.Instances['NameTag'] or NewDrawing'Text'{ Size = Options.TextSize.Value; Center = true; Outline = Options.TextOutline.Value; Visible = true; }; Data.Instances['DistanceTag'] = Data.Instances['DistanceTag'] or NewDrawing'Text'{ Size = Options.TextSize.Value - 1; Center = true; Outline = Options.TextOutline.Value; Visible = true; }; local NameTag = Data.Instances['NameTag']; local DistanceTag = Data.Instances['DistanceTag']; local Tracer = Data.Instances['Tracer']; local OutlineTracer = Data.Instances['OutlineTracer']; local Pass, Distance = CheckDistance(v.Instance); if Pass then local ScreenPosition, Vis = WorldToViewport(v.Instance.Position); local Color = v.Color; local OPos = Camera.CFrame:pointToObjectSpace(v.Instance.Position); if ScreenPosition.Z < 0 then local AT = math.atan2(OPos.Y, OPos.X) + math.pi; OPos = CFrame.Angles(0, 0, AT):vectorToWorldSpace((CFrame.Angles(0, math.rad(89.9), 0):vectorToWorldSpace(V3New(0, 0, -1)))); end local Position = WorldToViewport(Camera.CFrame:pointToWorldSpace(OPos)); if Options.ShowTracers.Value then Tracer.Transparency = math.clamp(Distance / 200, 0.45, 0.8); Tracer.Visible = true; Tracer.From = TracerPosition; Tracer.To = V2New(Position.X, Position.Y); Tracer.Color = Color; OutlineTracer.Visible = true; OutlineTracer.Transparency = Tracer.Transparency - 0.1; OutlineTracer.From = Tracer.From; OutlineTracer.To = Tracer.To; OutlineTracer.Color = Color3.new(0.1, 0.1, 0.1); else Tracer.Visible = false; OutlineTracer.Visible = false; end if ScreenPosition.Z > 0 then local ScreenPositionUpper = ScreenPosition; if Options.ShowName.Value then LocalPlayer.NameDisplayDistance = 0; NameTag.Visible = true; NameTag.Text = v.Text; NameTag.Size = Options.TextSize.Value; NameTag.Outline = Options.TextOutline.Value; NameTag.Position = V2New(ScreenPositionUpper.X, ScreenPositionUpper.Y); NameTag.Color = Color; if Drawing.Fonts and shared.am_ic3 then -- CURRENTLY SYNAPSE ONLY :MEGAHOLY: NameTag.Font = Drawing.Fonts.Monospace; end else LocalPlayer.NameDisplayDistance = 100; NameTag.Visible = false; end if Options.ShowDistance.Value or Options.ShowHealth.Value then DistanceTag.Visible = true; DistanceTag.Size = Options.TextSize.Value - 1; DistanceTag.Outline = Options.TextOutline.Value; DistanceTag.Color = Color3.new(1, 1, 1); if Drawing.Fonts and shared.am_ic3 then -- CURRENTLY SYNAPSE ONLY :MEGAHOLY: NameTag.Font = Drawing.Fonts.Monospace; end local Str = ''; if Options.ShowDistance.Value then Str = Str .. Format('[%d] ', Distance); end DistanceTag.Text = Str; DistanceTag.Position = V2New(ScreenPositionUpper.X, ScreenPositionUpper.Y) + V2New(0, NameTag.TextBounds.Y); else DistanceTag.Visible = false; end else NameTag.Visible = false; DistanceTag.Visible = false; end else NameTag.Visible = false; DistanceTag.Visible = false; Tracer.Visible = false; OutlineTracer.Visible = false; end Data.Instances['NameTag'] = NameTag; Data.Instances['DistanceTag'] = DistanceTag; Data.Instances['Tracer'] = Tracer; Data.Instances['OutlineTracer'] = OutlineTracer; shared.InstanceData[v.Instance:GetDebugId()] = Data; end end for i, v in pairs(Players:GetPlayers()) do local Data = shared.InstanceData[v.Name] or { Instances = {}; }; Data.Instances['Box'] = Data.Instances['Box'] or LineBox:Create{Thickness = 4}; Data.Instances['OutlineTracer'] = Data.Instances['OutlineTracer'] or NewDrawing'Line'{ Transparency = 1; Thickness = 3; Color = Color3.new(0.1, 0.1, 0.1); } Data.Instances['Tracer'] = Data.Instances['Tracer'] or NewDrawing'Line'{ Transparency = 1; Thickness = 1; } Data.Instances['HeadDot'] = Data.Instances['HeadDot'] or NewDrawing'Circle'{ Filled = true; NumSides = 30; } Data.Instances['NameTag'] = Data.Instances['NameTag'] or NewDrawing'Text'{ Size = Options.TextSize.Value; Center = true; Outline = Options.TextOutline.Value; OutlineOpacity = 1; Visible = true; }; Data.Instances['DistanceHealthTag'] = Data.Instances['DistanceHealthTag'] or NewDrawing'Text'{ Size = Options.TextSize.Value - 1; Center = true; Outline = Options.TextOutline.Value; OutlineOpacity = 1; Visible = true; }; local NameTag = Data.Instances['NameTag']; local DistanceTag = Data.Instances['DistanceHealthTag']; local Tracer = Data.Instances['Tracer']; local OutlineTracer = Data.Instances['OutlineTracer']; local HeadDot = Data.Instances['HeadDot']; local Box = Data.Instances['Box']; local Character = GetCharacter(v); local Pass, Distance = CheckPlayer(v, Character); if Pass and Character then local Humanoid = Character:FindFirstChildOfClass'Humanoid'; local Head = Character:FindFirstChild'Head'; local HumanoidRootPart = Character:FindFirstChild(CustomRootPartName or 'HumanoidRootPart') local Dead = (Humanoid and Humanoid:GetState().Name == 'Dead') if type(GetAliveState) == 'function' then Dead = (not GetAliveState(v, Character)) end if Character ~= nil and Head and HumanoidRootPart and not Dead then local ScreenPosition, Vis = WorldToViewport(Head.Position); local Color = Rainbow and Color3.fromHSV(tick() * 128 % 255/255, 1, 1) or (CheckTeam(v) and TeamColor or EnemyColor); Color = Options.ShowTeamColor.Value and v.TeamColor.Color or Color; local OPos = Camera.CFrame:pointToObjectSpace(Head.Position); if ScreenPosition.Z < 0 then local AT = math.atan2(OPos.Y, OPos.X) + math.pi; OPos = CFrame.Angles(0, 0, AT):vectorToWorldSpace((CFrame.Angles(0, math.rad(89.9), 0):vectorToWorldSpace(V3New(0, 0, -1)))); end local Position = WorldToViewport(Camera.CFrame:pointToWorldSpace(OPos)); if Options.ShowTracers.Value then if TracerPosition.X >= Camera.ViewportSize.X or TracerPosition.Y >= Camera.ViewportSize.Y or TracerPosition.X < 0 or TracerPosition.Y < 0 then TracerPosition = V2New(Camera.ViewportSize.X / 2, Camera.ViewportSize.Y - 135); end Tracer.Visible = true; Tracer.Transparency = math.clamp(1 - (Distance / 200), 0.25, 0.75); Tracer.From = TracerPosition; Tracer.To = V2New(Position.X, Position.Y); Tracer.Color = Color; OutlineTracer.From = Tracer.From; OutlineTracer.To = Tracer.To; OutlineTracer.Transparency = Tracer.Transparency - 0.15; OutlineTracer.Visible = true; else Tracer.Visible = false; OutlineTracer.Visible = false; end if ScreenPosition.Z > 0 then local ScreenPositionUpper = WorldToViewport((HumanoidRootPart:GetRenderCFrame() * CFrame.new(0, Head.Size.Y + HumanoidRootPart.Size.Y + (Options.YOffset.Value / 25), 0)).Position); local Scale = Head.Size.Y / 2; if Options.ShowName.Value then NameTag.Visible = true; NameTag.Text = v.Name .. (CustomPlayerTag and CustomPlayerTag(v) or ''); NameTag.Size = Options.TextSize.Value; NameTag.Outline = Options.TextOutline.Value; NameTag.Position = V2New(ScreenPositionUpper.X, ScreenPositionUpper.Y) - V2New(0, NameTag.TextBounds.Y); NameTag.Color = Color; NameTag.Color = Color; NameTag.OutlineColor= Color3.new(0.05, 0.05, 0.05); NameTag.Transparency= 0.85; if Drawing.Fonts and shared.am_ic3 then -- CURRENTLY SYNAPSE ONLY :MEGAHOLY: NameTag.Font = Drawing.Fonts.Monospace; end else NameTag.Visible = false; end if Options.ShowDistance.Value or Options.ShowHealth.Value then DistanceTag.Visible = true; DistanceTag.Size = Options.TextSize.Value - 1; DistanceTag.Outline = Options.TextOutline.Value; DistanceTag.Color = Color3.new(1, 1, 1); DistanceTag.Transparency= 0.85; if Drawing.Fonts and shared.am_ic3 then -- CURRENTLY SYNAPSE ONLY :MEGAHOLY: NameTag.Font = Drawing.Fonts.Monospace; end local Str = ''; if Options.ShowDistance.Value then Str = Str .. Format('[%d] ', Distance); end if Options.ShowHealth.Value then if typeof(Humanoid) == 'Instance' then Str = Str .. Format('[%d/%d] [%s%%]', Humanoid.Health, Humanoid.MaxHealth, math.floor(Humanoid.Health / Humanoid.MaxHealth * 100)); elseif type(GetHealth) == 'function' then local health, maxHealth = GetHealth(v) if type(health) == 'number' and type(maxHealth) == 'number' then Str = Str .. Format('[%d/%d] [%s%%]', health, maxHealth, math.floor(health / maxHealth * 100)) end end end DistanceTag.Text = Str; DistanceTag.OutlineColor = Color3.new(0.05, 0.05, 0.05); DistanceTag.Position = (NameTag.Visible and NameTag.Position + V2New(0, NameTag.TextBounds.Y) or V2New(ScreenPositionUpper.X, ScreenPositionUpper.Y)); else DistanceTag.Visible = false; end if Options.ShowDot.Value and Vis then local Top = WorldToViewport((Head.CFrame * CFrame.new(0, Scale, 0)).Position); local Bottom = WorldToViewport((Head.CFrame * CFrame.new(0, -Scale, 0)).Position); local Radius = (Top - Bottom).y; HeadDot.Visible = true; HeadDot.Color = Color; HeadDot.Position = V2New(ScreenPosition.X, ScreenPosition.Y); HeadDot.Radius = Radius; else HeadDot.Visible = false; end if Options.ShowBoxes.Value and Vis and HumanoidRootPart then local Body = { Head; Character:FindFirstChild'Left Leg' or Character:FindFirstChild'LeftLowerLeg'; Character:FindFirstChild'Right Leg' or Character:FindFirstChild'RightLowerLeg'; Character:FindFirstChild'Left Arm' or Character:FindFirstChild'LeftLowerArm'; Character:FindFirstChild'Right Arm' or Character:FindFirstChild'RightLowerArm'; } Box:Update(HumanoidRootPart.CFrame, V3New(2, 3, 1) * (Scale * 2), Color, nil, shared.am_ic3 and Body); else Box:SetVisible(false); end else NameTag.Visible = false; DistanceTag.Visible = false; HeadDot.Visible = false; Box:SetVisible(false); end else NameTag.Visible = false; DistanceTag.Visible = false; HeadDot.Visible = false; Tracer.Visible = false; OutlineTracer.Visible = false; Box:SetVisible(false); end else NameTag.Visible = false; DistanceTag.Visible = false; HeadDot.Visible = false; Tracer.Visible = false; OutlineTracer.Visible = false; Box:SetVisible(false); end shared.InstanceData[v.Name] = Data; end end end local LastInvalidCheck = 0; local function Update() if tick() - LastInvalidCheck > 0.3 then LastInvalidCheck = tick(); if Camera.Parent ~= workspace then Camera = workspace.CurrentCamera; CameraCon(); WTVP = Camera.WorldToViewportPoint; end for i, v in pairs(shared.InstanceData) do if not Players:FindFirstChild(tostring(i)) then if not shared.InstanceData[i].DontDelete then GetTableData(v.Instances)(function(i, obj) obj.Visible = false; obj:Remove(); v.Instances[i] = nil; end) shared.InstanceData[i] = nil; else if shared.InstanceData[i].Instance == nil or shared.InstanceData[i].Instance.Parent == nil then GetTableData(v.Instances)(function(i, obj) obj.Visible = false; obj:Remove(); v.Instances[i] = nil; end) shared.InstanceData[i] = nil; end end end end end local CX = Menu:GetInstance'CrosshairX'; local CY = Menu:GetInstance'CrosshairY'; if Options.Crosshair.Value then CX.Visible = true; CY.Visible = true; CX.To = V2New((Camera.ViewportSize.X / 2) - 8, (Camera.ViewportSize.Y / 2)); CX.From = V2New((Camera.ViewportSize.X / 2) + 8, (Camera.ViewportSize.Y / 2)); CY.To = V2New((Camera.ViewportSize.X / 2), (Camera.ViewportSize.Y / 2) - 8); CY.From = V2New((Camera.ViewportSize.X / 2), (Camera.ViewportSize.Y / 2) + 8); else CX.Visible = false; CY.Visible = false; end if Options.MenuOpen.Value and MenuLoaded then local MLocation = GetMouseLocation(); shared.MenuDrawingData.Instances.Main.Color = Color3.fromHSV(tick() * 24 % 255/255, 1, 1); local MainInstance = Menu:GetInstance'Main'; local Values = { MainInstance.Position.X; MainInstance.Position.Y; MainInstance.Position.X + MainInstance.Size.X; MainInstance.Position.Y + MainInstance.Size.Y; }; if MainInstance and (MouseHoveringOver(Values) or (SubMenu.Open and MouseHoveringOver(SubMenu.Bounds))) then Debounce.CursorVis = true; Menu:UpdateMenuInstance'Cursor1'{ Visible = true; From = V2New(MLocation.x, MLocation.y); To = V2New(MLocation.x + 5, MLocation.y + 6); } Menu:UpdateMenuInstance'Cursor2'{ Visible = true; From = V2New(MLocation.x, MLocation.y); To = V2New(MLocation.x, MLocation.y + 8); } Menu:UpdateMenuInstance'Cursor3'{ Visible = true; From = V2New(MLocation.x, MLocation.y + 6); To = V2New(MLocation.x + 5, MLocation.y + 5); } else if Debounce.CursorVis then Debounce.CursorVis = false; Menu:UpdateMenuInstance'Cursor1'{Visible = false}; Menu:UpdateMenuInstance'Cursor2'{Visible = false}; Menu:UpdateMenuInstance'Cursor3'{Visible = false}; end end if MouseHeld then local MousePos = GetMouseLocation(); if Dragging then DraggingWhat.Slider.Position = V2New(math.clamp(MLocation.X - DraggingWhat.Slider.Size.X / 2, DraggingWhat.Line.Position.X, DraggingWhat.Line.Position.X + DraggingWhat.Line.Size.X - DraggingWhat.Slider.Size.X), DraggingWhat.Slider.Position.Y); local Percent = (DraggingWhat.Slider.Position.X - DraggingWhat.Line.Position.X) / ((DraggingWhat.Line.Position.X + DraggingWhat.Line.Size.X - DraggingWhat.Line.Position.X) - DraggingWhat.Slider.Size.X); local Value = CalculateValue(DraggingWhat.Min, DraggingWhat.Max, Percent); DraggingWhat.Option(Value); elseif DraggingUI then Debounce.UIDrag = true; local Main = Menu:GetInstance'Main'; Main.Position = MousePos + DragOffset; elseif DragTracerPosition then TracerPosition = MousePos; end else Dragging = false; DragTracerPosition = false; if DraggingUI and Debounce.UIDrag then Debounce.UIDrag = false; DraggingUI = false; CreateMenu(Menu:GetInstance'Main'.Position); end end if not Debounce.Menu then Debounce.Menu = true; ToggleMenu(); end elseif Debounce.Menu and not Options.MenuOpen.Value then Debounce.Menu = false; ToggleMenu(); end end RunService:UnbindFromRenderStep(GetDataName); RunService:UnbindFromRenderStep(UpdateName); RunService:BindToRenderStep(GetDataName, 300, UpdatePlayerData); RunService:BindToRenderStep(UpdateName, 199, Update);