- 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 = Y1 and MLocation.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);