Please consider supporting us with disabling your AdBlock software and to gain access to thousands of free content!
Not sure how to disable AdBLock? Follow this tutorial: How to disable AdBlock
Get the UNNAMED ESP | UNIVERSAL DRAWING ESP [UNBANNABLE]
The UNNAMED ESP | UNIVERSAL DRAWING ESP [UNBANNABLE] code is below. Copy & inject it into the game. Enjoy!
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);