0% found this document useful (0 votes)
56 views50 pages

PlayerEsp Lua

Uploaded by

singeddomallouco
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
56 views50 pages

PlayerEsp Lua

Uploaded by

singeddomallouco
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 50

assert(Drawing, 'exploit not supported')

if not syn and not PROTOSMASHER_LOADED then print'Unnamed ESP only officially
supports Synapse and Protosmasher! If you\'re an exploit developer and have added
drawing API to your exploit, try setting syn as true then checking if that works,
otherwise, DM me on discord @ cppbook.org#1968 or add an issue to the Unnamed ESP
Github Repository and I\'ll see it through email!' end

local UserInputService = game:GetService'UserInputService';


local HttpService = game:GetService'HttpService';
local GUIService = game:GetService'GuiService';
local TweenService = game:GetService'TweenService';
local RunService = game:GetService'RunService';
local Players = game:GetService'Players';
local LocalPlayer = Players.LocalPlayer;
local Camera = workspace.CurrentCamera;
local Mouse = LocalPlayer:GetMouse();
local V2New = Vector2.new;
local V3New = Vector3.new;
local WTVP = Camera.WorldToViewportPoint;
local WorldToViewport = function(...) return WTVP(Camera, ...) end;
local Menu = {};
local MouseHeld = false;
local LastRefresh = 0;
local OptionsFile = 'IC3_ESP_SETTINGS.dat';
local Binding = false;
local BindedKey = nil;
local OIndex = 0;
local LineBox = {};
local UIButtons = {};
local Sliders = {};
local ColorPicker = { Loading = false; LastGenerated = 0 };
local Dragging = false;
local DraggingUI = false;
local Rainbow = false;
local DragOffset = V2New();
local DraggingWhat = nil;
local OldData = {};
local IgnoreList = {};
local EnemyColor = Color3.new(1, 0, 0);
local TeamColor = Color3.new(0, 1, 0);
local MenuLoaded = false;
local ErrorLogging = false;
local TracerPosition = V2New(Camera.ViewportSize.X / 2, Camera.ViewportSize.Y -
135);
local DragTracerPosition= false;
local SubMenu = {};
local IsSynapse = syn and not PROTOSMASHER_LOADED;
local Connections = { Active = {} };
local Signal = {}; Signal.__index = Signal;
local GetCharacter;
local CurrentColorPicker;
local Spectating;

local Executor = (identifyexecutor or (function() return '' end))()


local SupportedExploits = { 'Synapse X', 'ScriptWare', 'Krnl', 'OxygenU',
'Temple' }
local QUAD_SUPPORTED_EXPLOIT = table.find(SupportedExploits, Executor) ~= nil
-- if not PROTOSMASHER_LOADED then Drawing.UseCompatTransparency = true; end -- For
Elysian

shared.MenuDrawingData = shared.MenuDrawingData or { Instances = {} };


shared.InstanceData = shared.InstanceData or {};
shared.RSName = shared.RSName or ('UnnamedESP_by_ic3-' ..
HttpService:GenerateGUID(false));

local GetDataName = shared.RSName .. '-GetData';


local UpdateName = shared.RSName .. '-Update';

local Debounce = setmetatable({}, {


__index = function(t, i)
return rawget(t, i) or false
end;
});

if shared.UESP_InputChangedCon then shared.UESP_InputChangedCon:Disconnect() end


if shared.UESP_InputBeganCon then shared.UESP_InputBeganCon:Disconnect() end
if shared.UESP_InputEndedCon then shared.UESP_InputEndedCon:Disconnect() end
if shared.CurrentColorPicker then shared.CurrentColorPicker:Dispose() end

local RealPrint, LastPrintTick = print, 0;


local LatestPrints = setmetatable({}, { __index = function(t, i) return rawget(t,
i) or 0 end });

local function print(...)


local Content = unpack{...};
local print = RealPrint;

if tick() - LatestPrints[Content] > 5 then


LatestPrints[Content] = tick();
print(Content);
end
end

local function FromHex(HEX)


HEX = HEX:gsub('#', '');

return Color3.fromRGB(tonumber('0x' .. HEX:sub(1, 2)), tonumber('0x' ..


HEX:sub(3, 4)), tonumber('0x' .. HEX:sub(5, 6)));
end

local function IsStringEmpty(String)


if type(String) == 'string' then
return String:match'^%s+$' ~= nil or #String == 0 or String == '' or
false;
end

return false;
end

local function Set(t, i, v)


t[i] = v;
end

local Teams = {};


local CustomTeams = { -- Games that don't use roblox's team system
[2563455047] = {
Initialize = function()
Teams.Sheriffs = {}; -- prevent big error
Teams.Bandits = {}; -- prevent big error
local Func =
game:GetService'ReplicatedStorage':WaitForChild('RogueFunc', 1);
local Event =
game:GetService'ReplicatedStorage':WaitForChild('RogueEvent', 1);
local S, B = Func:InvokeServer'AllTeamData';

Teams.Sheriffs = S;
Teams.Bandits = B;

Event.OnClientEvent:Connect(function(id, PlayerName, Team,


Remove) -- stolen straight from decompiled src lul
if id == 'UpdateTeam' then
local TeamTable, NotTeamTable
if Team == 'Bandits' then
TeamTable = TDM.Bandits
NotTeamTable = TDM.Sheriffs
else
TeamTable = TDM.Sheriffs
NotTeamTable = TDM.Bandits
end
if Remove then
TeamTable[PlayerName] = nil
else
TeamTable[PlayerName] = true
NotTeamTable[PlayerName] = nil
end
if PlayerName == LocalPlayer.Name then
TDM.Friendlys = TeamTable
TDM.Enemies = NotTeamTable
end
end
end)
end;
CheckTeam = function(Player)
local LocalTeam = Teams.Sheriffs[LocalPlayer.Name] and
Teams.Sheriffs or Teams.Bandits;

return LocalTeam[Player.Name] and true or false;


end;
};
[5208655184] = {
CheckTeam = function(Player)
local LocalLastName = LocalPlayer:GetAttribute'LastName' if not
LocalLastName or IsStringEmpty(LocalLastName) then return true end
local PlayerLastName = Player:GetAttribute'LastName' if not
PlayerLastName then return false end

return PlayerLastName == LocalLastName


end
};
[3541987450] = {
CheckTeam = function(Player)
local LocalStats = LocalPlayer:FindFirstChild'leaderstats';
local LocalLastName = LocalStats and
LocalStats:FindFirstChild'LastName'; if not LocalLastName or
IsStringEmpty(LocalLastName.Value) then return true; end
local PlayerStats = Player:FindFirstChild'leaderstats';
local PlayerLastName = PlayerStats and
PlayerStats:FindFirstChild'LastName'; if not PlayerLastName then return false; end

return PlayerLastName.Value == LocalLastName.Value;


end;
};
[6032399813] = {
CheckTeam = function(Player)
local LocalStats = LocalPlayer:FindFirstChild'leaderstats';
local LocalGuildName = LocalStats and
LocalStats:FindFirstChild'Guild'; if not LocalGuildName or
IsStringEmpty(LocalGuildName.Value) then return true; end
local PlayerStats = Player:FindFirstChild'leaderstats';
local PlayerGuildName = PlayerStats and
PlayerStats:FindFirstChild'Guild'; if not PlayerGuildName then return false; end

return PlayerGuildName.Value == LocalGuildName.Value;


end;
};
[5735553160] = {
CheckTeam = function(Player)
local LocalStats = LocalPlayer:FindFirstChild'leaderstats';
local LocalGuildName = LocalStats and
LocalStats:FindFirstChild'Guild'; if not LocalGuildName or
IsStringEmpty(LocalGuildName.Value) then return true; end
local PlayerStats = Player:FindFirstChild'leaderstats';
local PlayerGuildName = PlayerStats and
PlayerStats:FindFirstChild'Guild'; if not PlayerGuildName then return false; end

return PlayerGuildName.Value == LocalGuildName.Value;


end;
};
};

local RenderList = {Instances = {}};

function RenderList:AddOrUpdateInstance(Instance, Obj2Draw, Text, Color)


RenderList.Instances[Instance] = { ParentInstance = Instance; Instance =
Obj2Draw; Text = Text; Color = Color };
return RenderList.Instances[Instance];
end

local CustomPlayerTag;
local CustomESP;
local CustomCharacter;
local GetHealth;
local GetAliveState;
local CustomRootPartName;

local Modules = {
[292439477] = {
CustomESP = function()
if type(shared.PF_Replication) ~= 'table' then
local lastScan = shared.pfReplicationScan

if (tick() - (lastScan or 0)) > 0.01 then


shared.pfReplicationScan = tick()
local gc = getgc(true)
for i = 1, #gc do
local gcObject = gc[i];
if type(gcObject) == 'table' and
type(rawget(gcObject, 'getbodyparts')) == 'function' then
shared.PF_Replication = gcObject;
break
end
end
end

return
end

for Index, Player in pairs(Players:GetPlayers()) do


if Player == LocalPlayer then continue end

local Body = shared.PF_Replication.getbodyparts(Player);

if type(Body) == 'table' and typeof(rawget(Body, 'torso'))


== 'Instance' then
Player.Character = Body.torso.Parent
continue
end

Player.Character = nil;
end
end,

GetHealth = function(Player)
if type(shared.pfHud) ~= 'table' then
return false
end

return shared.pfHud:getplayerhealth(Player)
end,

GetAliveState = function(Player)
if type(shared.pfHud) ~= 'table' then
local lastScan = shared.pfHudScan

if (tick() - (lastScan or 0)) > 0.1 then


shared.pfHudScan = tick()

local gc = getgc(true)
for i = 1, #gc do
local gcObject = gc[i];
if type(gcObject) == 'table' and
type(rawget(gcObject, 'getplayerhealth')) == 'function' then
shared.pfHud = gcObject;
break
end
end
end

return
end

return shared.pfHud:isplayeralive(Player)
end,

CustomRootPartName = 'Torso',
};
[2950983942] = {
CustomCharacter = function(Player)
if workspace:FindFirstChild'Players' then
return workspace.Players:FindFirstChild(Player.Name);
end
end
};
[2262441883] = {
CustomPlayerTag = function(Player)
return Player:FindFirstChild'Job' and (' [' ..
Player.Job.Value .. ']') or '';
end;
CustomESP = function()
if workspace:FindFirstChild'MoneyPrinters' then
for i, v in pairs(workspace.MoneyPrinters:GetChildren()) do
local Main = v:FindFirstChild'Main';
local Owner = v:FindFirstChild'TrueOwner';
local Money = v:FindFirstChild'Int' and
v.Int:FindFirstChild'Money' or nil;
if Main and Owner and Money then
local O = tostring(Owner.Value);
local M = tostring(Money.Value);

pcall(RenderList.AddOrUpdateInstance,
RenderList, v, Main, string.format('Money Printer\nOwned by %s\n[%s]', O, M),
Color3.fromRGB(13, 255, 227));
end
end
end
end;
};
-- [4581966615] = {
-- CustomESP = function()
-- if workspace:FindFirstChild'Entities' then
-- for i, v in pairs(workspace.Entities:GetChildren()) do
-- if not v.Name:match'Printer' then continue end

-- local Properties = v:FindFirstChild'Properties' if


not Properties then continue end
-- local Main = v:FindFirstChild'hitbox';
-- local Owner = Properties:FindFirstChild'Owner';
-- local Money =
Properties:FindFirstChild'CurrentPrinted'

-- if Main and Owner and Money then


-- local O = Owner.Value and tostring(Owner.Value)
or 'no one';
-- local M = tostring(Money.Value);

-- pcall(RenderList.AddOrUpdateInstance,
RenderList, v, Main, string.format('Money Printer\nOwned by %s\n[%s]', O, M),
Color3.fromRGB(13, 255, 227));
-- end
-- end
-- end
-- end;
-- };
[4801598506] = {
CustomESP = function()
if workspace:FindFirstChild'Mobs' and
workspace.Mobs:FindFirstChild'Forest1' then
for i, v in pairs(workspace.Mobs.Forest1:GetChildren()) do
local Main = v:FindFirstChild'Head';
local Hum = v:FindFirstChild'Mob';

if Main and Hum then


pcall(RenderList.AddOrUpdateInstance,
RenderList, v, Main, string.format('[%s] [%s/%s]', v.Name, Hum.Health,
Hum.MaxHealth), Color3.fromRGB(13, 255, 227));
end
end
end
end;
};
[2555873122] = {
CustomESP = function()
if workspace:FindFirstChild'WoodPlanks' then
for i, v in pairs(workspace:GetChildren()) do
if v.Name == 'WoodPlanks' then
local Main = v:FindFirstChild'Wood';

if Main then
pcall(RenderList.AddOrUpdateInstance,
RenderList, v, Main, 'Wood Planks', Color3.fromRGB(13, 255, 227));
end
end
end
end
end;
};
[5208655184] = {
CustomESP = function()
-- if workspace:FindFirstChild'Live' then
-- for i, v in pairs(workspace.Live:GetChildren()) do
-- if v.Name:sub(1, 1) == '.' then
-- local Main = v:FindFirstChild'Head';

-- if Main then
-- pcall(RenderList.AddOrUpdateInstance,
RenderList, v, Main, v.Name:sub(2), Color3.fromRGB(250, 50, 40));
-- end
-- end
-- end
-- end
end;
CustomPlayerTag = function(Player)
if game.PlaceVersion < 457 then return '' end

local Name = '';


local FirstName = Player:GetAttribute'FirstName'

if typeof(FirstName) == 'string' and #FirstName > 0 then


local Prefix = '';
local Extra = {};
Name = Name .. '\n[';

if Player:GetAttribute'Prestige' > 0 then


Name = Name .. '#' ..
tostring(Player:GetAttribute'Prestige') .. ' ';
end
if not IsStringEmpty(Player:GetAttribute'HouseRank') then
Prefix = Player:GetAttribute'HouseRank' == 'Owner'
and (Player:GetAttribute'Gender' == 'Female' and 'Lady ' or 'Lord ') or '';
end
if not IsStringEmpty(FirstName) then
Name = Name .. '' .. Prefix .. FirstName;
end
if not IsStringEmpty(Player:GetAttribute'LastName') then
Name = Name .. ' ' .. Player:GetAttribute'LastName';
end

if not IsStringEmpty(Name) then Name = Name .. ']'; end

local Character = GetCharacter(Player);

if Character then
if Character and Character:FindFirstChild'Danger'
then table.insert(Extra, 'D'); end
if Character:FindFirstChild'ManaAbilities' and
Character.ManaAbilities:FindFirstChild'ManaSprint' then table.insert(Extra, 'D1');
end

if Character:FindFirstChild'Mana' then
table.insert(Extra, 'M' .. math.floor(Character.Mana.Value)); end
if Character:FindFirstChild'Vampirism' then
table.insert(Extra, 'V'); end
if Character:FindFirstChild'Observe' then
table.insert(Extra, 'ILL'); end
if Character:FindFirstChild'Inferi' then
table.insert(Extra, 'NEC'); end
if Character:FindFirstChild'World\'s Pulse' then
table.insert(Extra, 'DZIN'); end
if Character:FindFirstChild'Shift' then
table.insert(Extra, 'MAD'); end
if Character:FindFirstChild'Head' and
Character.Head:FindFirstChild'FacialMarking' then
local FM =
Character.Head:FindFirstChild'FacialMarking';
if FM.Texture == 'http://www.roblox.com/asset/?
id=4072968006' then
table.insert(Extra, 'HEALER');
elseif FM.Texture ==
'http://www.roblox.com/asset/?id=4072914434' then
table.insert(Extra, 'SEER');
elseif FM.Texture ==
'http://www.roblox.com/asset/?id=4094417635' then
table.insert(Extra, 'JESTER');
elseif FM.Texture ==
'http://www.roblox.com/asset/?id=4072968656' then
table.insert(Extra, 'BLADE');
end
end
end
if Player:FindFirstChild'Backpack' then
if Player.Backpack:FindFirstChild'Observe'
then table.insert(Extra, 'ILL'); end
if Player.Backpack:FindFirstChild'Inferi'
then table.insert(Extra, 'NEC'); end
if Player.Backpack:FindFirstChild'World\'s Pulse'
then table.insert(Extra, 'DZIN'); end
if Player.Backpack:FindFirstChild'Shift'
then table.insert(Extra, 'MAD'); end
end

if #Extra > 0 then Name = Name .. ' [' ..


table.concat(Extra, '-') .. ']'; end
end

return Name;
end;
};
[3541987450] = {
CustomPlayerTag = function(Player)
local Name = '';

if Player:FindFirstChild'leaderstats' then
Name = Name .. '\n[';
local Prefix = '';
local Extra = {};
if Player.leaderstats:FindFirstChild'Prestige' and
Player.leaderstats.Prestige.ClassName == 'IntValue' and
Player.leaderstats.Prestige.Value > 0 then
Name = Name .. '#' ..
tostring(Player.leaderstats.Prestige.Value) .. ' ';
end
if Player.leaderstats:FindFirstChild'HouseRank' and
Player.leaderstats:FindFirstChild'Gender' and
Player.leaderstats.HouseRank.ClassName == 'StringValue' and not
IsStringEmpty(Player.leaderstats.HouseRank.Value) then
Prefix = Player.leaderstats.HouseRank.Value ==
'Owner' and (Player.leaderstats.Gender.Value == 'Female' and 'Lady ' or 'Lord ') or
'';
end
if Player.leaderstats:FindFirstChild'FirstName' and
Player.leaderstats.FirstName.ClassName == 'StringValue' and not
IsStringEmpty(Player.leaderstats.FirstName.Value) then
Name = Name .. '' .. Prefix ..
Player.leaderstats.FirstName.Value;
end
if Player.leaderstats:FindFirstChild'LastName' and
Player.leaderstats.LastName.ClassName == 'StringValue' and not
IsStringEmpty(Player.leaderstats.LastName.Value) then
Name = Name .. ' ' ..
Player.leaderstats.LastName.Value;
end
if Player.leaderstats:FindFirstChild'UberTitle' and
Player.leaderstats.UberTitle.ClassName == 'StringValue' and not
IsStringEmpty(Player.leaderstats.UberTitle.Value) then
Name = Name .. ', ' ..
Player.leaderstats.UberTitle.Value;
end
if not IsStringEmpty(Name) then Name = Name .. ']'; end

local Character = GetCharacter(Player);

if Character then
if Character and Character:FindFirstChild'Danger'
then table.insert(Extra, 'D'); end
if Character:FindFirstChild'ManaAbilities' and
Character.ManaAbilities:FindFirstChild'ManaSprint' then table.insert(Extra, 'D1');
end

if Character:FindFirstChild'Mana' then
table.insert(Extra, 'M' .. math.floor(Character.Mana.Value)); end
if Character:FindFirstChild'Vampirism' then
table.insert(Extra, 'V'); end
if Character:FindFirstChild'Observe'
then table.insert(Extra, 'ILL'); end
if Character:FindFirstChild'Inferi' then
table.insert(Extra, 'NEC'); end

if Character:FindFirstChild'World\'s Pulse' then


table.insert(Extra, 'DZIN'); end
if Character:FindFirstChild'Head' and
Character.Head:FindFirstChild'FacialMarking' then
local FM =
Character.Head:FindFirstChild'FacialMarking';
if FM.Texture == 'http://www.roblox.com/asset/?
id=4072968006' then
table.insert(Extra, 'HEALER');
elseif FM.Texture ==
'http://www.roblox.com/asset/?id=4072914434' then
table.insert(Extra, 'SEER');
elseif FM.Texture ==
'http://www.roblox.com/asset/?id=4094417635' then
table.insert(Extra, 'JESTER');
end
end
end
if Player:FindFirstChild'Backpack' then
if Player.Backpack:FindFirstChild'Observe'
then table.insert(Extra, 'ILL'); end
if Player.Backpack:FindFirstChild'Inferi'
then table.insert(Extra, 'NEC'); end
if Player.Backpack:FindFirstChild'World\'s Pulse'
then table.insert(Extra, 'DZIN'); end
end

if #Extra > 0 then Name = Name .. ' [' ..


table.concat(Extra, '-') .. ']'; end
end

return Name;
end;
};

[4691401390] = { -- Vast Realm


CustomCharacter = function(Player)
if workspace:FindFirstChild'Players' then
return workspace.Players:FindFirstChild(Player.Name);
end
end
};

[6032399813] = { -- Deepwoken [Etrean]


CustomPlayerTag = function(Player)
local Name = '';
CharacterName = Player:GetAttribute'CharacterName'; -- could use
leaderstats but lazy

if not IsStringEmpty(CharacterName) then


Name = ('\n[%s]'):format(CharacterName);
local Character = GetCharacter(Player);
local Extra = {};

if Character then
local Blood, Armor = Character:FindFirstChild('Blood'),
Character:FindFirstChild('Armor');

if Blood and Blood.ClassName == 'DoubleConstrainedValue' then


table.insert(Extra, ('B%d'):format(Blood.Value));
end

if Armor and Armor.ClassName == 'DoubleConstrainedValue' then


table.insert(Extra, ('A%d'):format(math.floor(Armor.Value /
10)));
end
end

local BackpackChildren = Player.Backpack:GetChildren()

for index = 1, #BackpackChildren do


local Oath = BackpackChildren[index]
if Oath.ClassName == 'Folder' and Oath.Name:find('Talent:Oath')
then
local OathName = Oath.Name:gsub('Talent:Oath: ', '')
table.insert(Extra, OathName);
end
end

if #Extra > 0 then Name = Name .. ' [' .. table.concat(Extra,


'-') .. ']'; end
end

return Name;
end;
};

[5735553160] = { -- Deepwoken [Depths]


CustomPlayerTag = function(Player)
local Name = '';
CharacterName = Player:GetAttribute'CharacterName'; -- could use
leaderstats but lazy

if not IsStringEmpty(CharacterName) then


Name = ('\n[%s]'):format(CharacterName);
local Character = GetCharacter(Player);
local Extra = {};
if Character then
local Blood, Armor = Character:FindFirstChild('Blood'),
Character:FindFirstChild('Armor');

if Blood and Blood.ClassName == 'DoubleConstrainedValue' then


table.insert(Extra, ('B%d'):format(Blood.Value));
end

if Armor and Armor.ClassName == 'DoubleConstrainedValue' then


table.insert(Extra, ('A%d'):format(math.floor(Armor.Value /
10)));
end
end

local BackpackChildren = Player.Backpack:GetChildren()

for index = 1, #BackpackChildren do


local Oath = BackpackChildren[index]
if Oath.ClassName == 'Folder' and Oath.Name:find('Talent:Oath')
then
local OathName = Oath.Name:gsub('Talent:Oath: ', '')
table.insert(Extra, OathName);
end
end

if #Extra > 0 then Name = Name .. ' [' .. table.concat(Extra, '-') ..


']'; end
end

return Name;
end;
};
};

if Modules[game.PlaceId] ~= nil then


local Module = Modules[game.PlaceId];
CustomPlayerTag = Module.CustomPlayerTag or nil;
CustomESP = Module.CustomESP or nil;
CustomCharacter = Module.CustomCharacter or nil;
GetHealth = Module.GetHealth or nil;
GetAliveState = Module.GetAliveState or nil;
CustomRootPartName = Module.CustomRootPartName or nil;
end

function GetCharacter(Player)
return Player.Character or (CustomCharacter and CustomCharacter(Player));
end

function GetMouseLocation()
return UserInputService:GetMouseLocation();
end

function MouseHoveringOver(Values)
local X1, Y1, X2, Y2 = Values[1], Values[2], Values[3], Values[4]
local MLocation = GetMouseLocation();
return (MLocation.x >= X1 and MLocation.x <= (X1 + (X2 - X1))) and
(MLocation.y >= Y1 and MLocation.y <= (Y1 + (Y2 - Y1)));
end
function GetTableData(t) -- basically table.foreach i dont even know why i made
this
if typeof(t) ~= 'table' then return end

return setmetatable(t, {
__call = function(t, func)
if typeof(func) ~= 'function' then return end;
for i, v in pairs(t) do
pcall(func, i, v);
end
end;
});
end
local function Format(format, ...)
return string.format(format, ...);
end
function CalculateValue(Min, Max, Percent)
return Min + math.floor(((Max - Min) * Percent) + .5);
end

function NewDrawing(InstanceName)
local Instance = Drawing.new(InstanceName);
-- pcall(Set, Instance, 'OutlineOpacity', 0.8)
return (function(Properties)
for i, v in pairs(Properties) do
pcall(Set, Instance, i, v);
end
return Instance;
end)
end

function Menu:AddMenuInstance(Name, DrawingType, Properties)


local Instance;

if shared.MenuDrawingData.Instances[Name] ~= nil then


Instance = shared.MenuDrawingData.Instances[Name];
for i, v in pairs(Properties) do
pcall(Set, Instance, i, v);
end
else
Instance = NewDrawing(DrawingType)(Properties);
end

shared.MenuDrawingData.Instances[Name] = Instance;

return Instance;
end
function Menu:UpdateMenuInstance(Name)
local Instance = shared.MenuDrawingData.Instances[Name];
if Instance ~= nil then
return (function(Properties)
for i, v in pairs(Properties) do
pcall(Set, Instance, i, v);
end
return Instance;
end)
end
end
function Menu:GetInstance(Name)
return shared.MenuDrawingData.Instances[Name];
end

local Options = setmetatable({}, {


__call = function(t, ...)
local Arguments = {...};
local Name = Arguments[1];
OIndex = OIndex + 1;
rawset(t, Name, setmetatable({
Name = Arguments[1];
Text = Arguments[2];
Value = Arguments[3];
DefaultValue = Arguments[3];
AllArgs = Arguments;
Index = OIndex;
}, {
__call = function(t, v, force)
local self = t;

if typeof(t.Value) == 'function' then


t.Value();
elseif typeof(t.Value) == 'EnumItem' then
local BT = Menu:GetInstance(Format('%s_BindText',
t.Name));
if not force then
Binding = true;
local Val = 0
while Binding do
wait();
Val = (Val + 1) % 17;
BT.Text = Val <= 8 and '|' or '';
end
end
t.Value = force and v or BindedKey;
if BT and t.BasePosition and t.BaseSize then
BT.Text = tostring(t.Value):match'%w+%.%w+%.(.
+)';
BT.Position = t.BasePosition +
V2New(t.BaseSize.X - BT.TextBounds.X - 20, -10);
end
else
local NewValue = v;
if NewValue == nil then NewValue = not t.Value; end
rawset(t, 'Value', NewValue);

if Arguments[2] ~= nil and


Menu:GetInstance'TopBar'.Visible then
if typeof(Arguments[3]) == 'number' then
local AMT =
Menu:GetInstance(Format('%s_AmountText', t.Name));
if AMT then
AMT.Text = tostring(t.Value);
end
else
local Inner =
Menu:GetInstance(Format('%s_InnerCircle', t.Name));
if Inner then Inner.Visible = t.Value;
end
end
end
end
end;
}));
end;
})

function Load()
local _, Result = pcall(readfile, OptionsFile);

if _ then -- extremely ugly code yea i know but i dont care p.s. i hate pcall
local _, Table = pcall(HttpService.JSONDecode, HttpService, Result);
if _ and typeof(Table) == 'table' then
for i, v in pairs(Table) do
if typeof(Options[i]) == 'table' and Options[i].Value ~=
nil and (typeof(Options[i].Value) == 'boolean' or typeof(Options[i].Value) ==
'number') then
Options[i].Value = v.Value;
pcall(Options[i], v.Value);
end
end

if Table.TeamColor then TeamColor = Color3.new(Table.TeamColor.R,


Table.TeamColor.G, Table.TeamColor.B) end
if Table.EnemyColor then EnemyColor =
Color3.new(Table.EnemyColor.R, Table.EnemyColor.G, Table.EnemyColor.B) end

if typeof(Table.MenuKey) == 'string' then


Options.MenuKey(Enum.KeyCode[Table.MenuKey], true) end
if typeof(Table.ToggleKey) == 'string' then
Options.ToggleKey(Enum.KeyCode[Table.ToggleKey], true) end
end
end
end

Options('Enabled', 'ESP Enabled', true);


Options('ShowTeam', 'Show Team', true);
Options('ShowTeamColor', 'Show Team Color', false);
Options('ShowName', 'Show Names', true);
Options('ShowDistance', 'Show Distance', true);
Options('ShowHealth', 'Show Health', true);
Options('ShowBoxes', 'Show Boxes', true);
Options('ShowTracers', 'Show Tracers', true);
Options('ShowDot', 'Show Head Dot', false);
Options('VisCheck', 'Visibility Check', false);
Options('Crosshair', 'Crosshair', false);
Options('TextOutline', 'Text Outline', true);
-- Options('Rainbow', 'Rainbow Mode', false);
Options('TextSize', 'Text Size', syn and 18 or 14, 10, 24); -- cuz synapse fonts
look weird???
Options('MaxDistance', 'Max Distance', 2500, 100, 25000);
Options('RefreshRate', 'Refresh Rate (ms)', 5, 1, 200);
Options('YOffset', 'Y Offset', 0, -200, 200);
Options('MenuKey', 'Menu Key', Enum.KeyCode.F4, 1);
Options('ToggleKey', 'Toggle Key', Enum.KeyCode.F3, 1);
Options('ChangeColors', SENTINEL_LOADED and 'Sentinel Unsupported' or 'Change
Colors', function()
if SENTINEL_LOADED then return end
SubMenu:Show(GetMouseLocation(), 'Unnamed Colors', {
{
Type = 'Color'; Text = 'Team Color'; Color = TeamColor;

Function = function(Circ, Position)


if tick() - ColorPicker.LastGenerated < 1 then return; end

if shared.CurrentColorPicker then
shared.CurrentColorPicker:Dispose() end
local ColorPicker = ColorPicker.new(Position - V2New(-10,
50));
CurrentColorPicker = ColorPicker;
shared.CurrentColorPicker = CurrentColorPicker;
ColorPicker.ColorChanged:Connect(function(Color) Circ.Color
= Color TeamColor = Color Options.TeamColor = Color end);
end
};
{
Type = 'Color'; Text = 'Enemy Color'; Color = EnemyColor;

Function = function(Circ, Position)


if tick() - ColorPicker.LastGenerated < 1 then return; end

if shared.CurrentColorPicker then
shared.CurrentColorPicker:Dispose() end
local ColorPicker = ColorPicker.new(Position - V2New(-10,
50));
CurrentColorPicker = ColorPicker;
shared.CurrentColorPicker = CurrentColorPicker;
ColorPicker.ColorChanged:Connect(function(Color) Circ.Color
= Color EnemyColor = Color Options.EnemyColor = Color end);
end
};
{
Type = 'Button'; Text = 'Reset Colors';

Function = function()
EnemyColor = Color3.new(1, 0, 0);
TeamColor = Color3.new(0, 1, 0);

local C1 = Menu:GetInstance'Sub-ColorPreview.1'; if C1 then


C1.Color = TeamColor end
local C2 = Menu:GetInstance'Sub-ColorPreview.2'; if C2 then
C2.Color = EnemyColor end
end
};
{
Type = 'Button'; Text = 'Rainbow Mode';

Function = function()
Rainbow = not Rainbow;
end
};
});
end, 2);
Options('ResetSettings', 'Reset Settings', function()
for i, v in pairs(Options) do
if Options[i] ~= nil and Options[i].Value ~= nil and Options[i].Text ~=
nil and (typeof(Options[i].Value) == 'boolean' or typeof(Options[i].Value) ==
'number' or typeof(Options[i].Value) == 'EnumItem') then
Options[i](Options[i].DefaultValue, true);
end
end
end, 5);
Options('LoadSettings', 'Load Settings', Load, 4);
Options('SaveSettings', 'Save Settings', function()
local COptions = {};

for i, v in pairs(Options) do
COptions[i] = v;
end

if typeof(TeamColor) == 'Color3' then COptions.TeamColor = { R = TeamColor.R;


G = TeamColor.G; B = TeamColor.B } end
if typeof(EnemyColor) == 'Color3' then COptions.EnemyColor = { R =
EnemyColor.R; G = EnemyColor.G; B = EnemyColor.B } end

if typeof(COptions.MenuKey.Value) == 'EnumItem' then COptions.MenuKey =


COptions.MenuKey.Value.Name end
if typeof(COptions.ToggleKey.Value) == 'EnumItem' then COptions.ToggleKey =
COptions.ToggleKey.Value.Name end

writefile(OptionsFile, HttpService:JSONEncode(COptions));
end, 3);

Load(1);

Options('MenuOpen', nil, true);

local function Combine(...)


local Output = {};
for i, v in pairs{...} do
if typeof(v) == 'table' then
table.foreach(v, function(i, v)
Output[i] = v;
end)
end
end
return Output
end

function LineBox:Create(Properties)
local Box = { Visible = true }; -- prevent errors not really though dont
worry bout the Visible = true thing

local Properties = Combine({


Transparency = 1;
Thickness = 3;
Visible = true;
}, Properties);

if shared.am_ic3 then -- sory just my preference, dynamic boxes will be


optional in unnamed esp v2
Box['OutlineSquare']= NewDrawing'Square'(Properties);
Box['Square'] = NewDrawing'Square'(Properties);
elseif QUAD_SUPPORTED_EXPLOIT then
Box['Quad'] = NewDrawing'Quad'(Properties);
else
Box['TopLeft'] = NewDrawing'Line'(Properties);
Box['TopRight'] = NewDrawing'Line'(Properties);
Box['BottomLeft'] = NewDrawing'Line'(Properties);
Box['BottomRight'] = NewDrawing'Line'(Properties);
end

function Box:Update(CF, Size, Color, Properties, Parts)


if not CF or not Size then return end

if shared.am_ic3 and typeof(Parts) == 'table' then


local AllCorners = {};

for i, v in pairs(Parts) do
-- if not v:IsA'BasePart' then continue end

local CF, Size = v.CFrame, v.Size;


-- CF, Size = v.Parent:GetBoundingBox();

local Corners = {
Vector3.new(CF.X + Size.X / 2, CF.Y + Size.Y / 2,
CF.Z + Size.Z / 2);
Vector3.new(CF.X - Size.X / 2, CF.Y + Size.Y / 2,
CF.Z + Size.Z / 2);
Vector3.new(CF.X - Size.X / 2, CF.Y - Size.Y / 2,
CF.Z - Size.Z / 2);
Vector3.new(CF.X + Size.X / 2, CF.Y - Size.Y / 2,
CF.Z - Size.Z / 2);
Vector3.new(CF.X - Size.X / 2, CF.Y + Size.Y / 2,
CF.Z - Size.Z / 2);
Vector3.new(CF.X + Size.X / 2, CF.Y + Size.Y / 2,
CF.Z - Size.Z / 2);
Vector3.new(CF.X - Size.X / 2, CF.Y - Size.Y / 2,
CF.Z + Size.Z / 2);
Vector3.new(CF.X + Size.X / 2, CF.Y - Size.Y / 2,
CF.Z + Size.Z / 2);
};

for i, v in pairs(Corners) do
table.insert(AllCorners, v);
end

-- break
end

local xMin, yMin = Camera.ViewportSize.X, Camera.ViewportSize.Y;


local xMax, yMax = 0, 0;
local Vs = true;

for i, v in pairs(AllCorners) do
local Position, V = WorldToViewport(v);

if VS and not V then Vs = false break end

if Position.X > xMax then


xMax = Position.X;
end
if Position.X < xMin then
xMin = Position.X;
end
if Position.Y > yMax then
yMax = Position.Y;
end
if Position.Y < yMin then
yMin = Position.Y;
end
end

local xSize, ySize = xMax - xMin, yMax - yMin;

local Outline = Box['OutlineSquare'];


local Square = Box['Square'];
Outline.Visible = Vs;
Square.Visible = Vs;
Square.Position = V2New(xMin, yMin);
Square.Color = Color;
Square.Thickness = math.floor(Outline.Thickness * 0.3);
-- Square.Position = V2New(xMin, yMin);
Square.Size = V2New(xSize, ySize);
Outline.Position = Square.Position;
Outline.Size = Square.Size;
Outline.Color = Color3.new(0.12, 0.12, 0.12);
Outline.Transparency = 0.75;

return
end

local TLPos, Visible1 = WorldToViewport((CF * CFrame.new( Size.X,


Size.Y, 0)).Position);
local TRPos, Visible2 = WorldToViewport((CF * CFrame.new(-Size.X,
Size.Y, 0)).Position);
local BLPos, Visible3 = WorldToViewport((CF * CFrame.new( Size.X, -
Size.Y, 0)).Position);
local BRPos, Visible4 = WorldToViewport((CF * CFrame.new(-Size.X, -
Size.Y, 0)).Position);

local Quad = Box['Quad'];

if QUAD_SUPPORTED_EXPLOIT then
if Visible1 and Visible2 and Visible3 and Visible4 then
Quad.Visible = true;
Quad.Color = Color;
Quad.PointA = V2New(TLPos.X, TLPos.Y);
Quad.PointB = V2New(TRPos.X, TRPos.Y);
Quad.PointC = V2New(BRPos.X, BRPos.Y);
Quad.PointD = V2New(BLPos.X, BLPos.Y);
else
Box['Quad'].Visible = false;
end
else
Visible1 = TLPos.Z > 0 -- (commented | reason: random flashes);
Visible2 = TRPos.Z > 0 -- (commented | reason: random flashes);
Visible3 = BLPos.Z > 0 -- (commented | reason: random flashes);
Visible4 = BRPos.Z > 0 -- (commented | reason: random flashes);

-- ## BEGIN UGLY CODE


if Visible1 then
Box['TopLeft'].Visible = true;
Box['TopLeft'].Color = Color;
Box['TopLeft'].From = V2New(TLPos.X,
TLPos.Y);
Box['TopLeft'].To = V2New(TRPos.X, TRPos.Y);
else
Box['TopLeft'].Visible = false;
end
if Visible2 then
Box['TopRight'].Visible = true;
Box['TopRight'].Color = Color;
Box['TopRight'].From = V2New(TRPos.X, TRPos.Y);
Box['TopRight'].To = V2New(BRPos.X,
BRPos.Y);
else
Box['TopRight'].Visible = false;
end
if Visible3 then
Box['BottomLeft'].Visible = true;
Box['BottomLeft'].Color = Color;
Box['BottomLeft'].From = V2New(BLPos.X, BLPos.Y);
Box['BottomLeft'].To = V2New(TLPos.X, TLPos.Y);
else
Box['BottomLeft'].Visible = false;
end
if Visible4 then
Box['BottomRight'].Visible = true;
Box['BottomRight'].Color = Color;
Box['BottomRight'].From = V2New(BRPos.X, BRPos.Y);
Box['BottomRight'].To = V2New(BLPos.X, BLPos.Y);
else
Box['BottomRight'].Visible = false;
end
-- ## END UGLY CODE
if Properties and typeof(Properties) == 'table' then
GetTableData(Properties)(function(i, v)
pcall(Set, Box['TopLeft'], i, v);
pcall(Set, Box['TopRight'], i, v);
pcall(Set, Box['BottomLeft'], i, v);
pcall(Set, Box['BottomRight'], i, v);
end)
end
end
end
function Box:SetVisible(bool)
if shared.am_ic3 then
Box['Square'].Visible = bool;
Box['OutlineSquare'].Visible = bool;
else
pcall(Set, Box['Quad'], 'Visible', bool);
end
-- pcall(Set, Box['TopLeft'], 'Visible', bool);
-- pcall(Set, Box['TopRight'], 'Visible', bool);
-- pcall(Set, Box['BottomLeft'], 'Visible', bool);
-- pcall(Set, Box['BottomRight'], 'Visible', bool);
end
function Box:Remove()
self:SetVisible(false);
if shared.am_ic3 then
Box['Square']:Remove();
Box['OutlineSquare']:Remove();
else
Box['Quad']:Remove();
end
-- Box['TopLeft']:Remove();
-- Box['TopRight']:Remove();
-- Box['BottomLeft']:Remove();
-- Box['BottomRight']:Remove();
end

return Box;
end

local Colors = {
White = FromHex'ffffff';
Primary = {
Main = FromHex'424242';
Light = FromHex'6d6d6d';
Dark = FromHex'1b1b1b';
};
Secondary = {
Main = FromHex'e0e0e0';
Light = FromHex'ffffff';
Dark = FromHex'aeaeae';
};
};

function Connections:Listen(Connection, Function)


local NewConnection = Connection:Connect(Function);
table.insert(self.Active, NewConnection);
return NewConnection;
end

function Connections:DisconnectAll()
for Index, Connection in pairs(self.Active) do
if Connection.Connected then
Connection:Disconnect();
end
end

self.Active = {};
end

function Signal.new()
local self = setmetatable({ _BindableEvent = Instance.new'BindableEvent' },
Signal);

return self;
end

function Signal:Connect(Callback)
assert(typeof(Callback) == 'function', 'function expected; got ' ..
typeof(Callback));

return self._BindableEvent.Event:Connect(function(...) Callback(...) end);


end

function Signal:Fire(...)
self._BindableEvent:Fire(...);
end
function Signal:Wait()
local Arguments = self._BindableEvent:Wait();

return Arguments;
end

function Signal:Disconnect()
if self._BindableEvent then
self._BindableEvent:Destroy();
end
end

local function GetMouseLocation()


return UserInputService:GetMouseLocation();
end

local function IsMouseOverDrawing(Drawing, MousePosition)


local TopLeft = Drawing.Position;
local BottomRight = Drawing.Position + Drawing.Size;
local MousePosition = MousePosition or GetMouseLocation();

return MousePosition.X > TopLeft.X and MousePosition.Y > TopLeft.Y and


MousePosition.X < BottomRight.X and MousePosition.Y < BottomRight.Y;
end

local ImageCache = {};

local function SetImage(Drawing, Url)


local Data = IsSynapse and game:HttpGet(Url) or Url;

print(Drawing, IsSynapse)

Drawing[IsSynapse and 'Data' or 'Uri'] = ImageCache[Url] or Data;


ImageCache[Url] = Data;

if not IsSynapse then repeat wait() until Drawing.Loaded; end


end

-- oh god unnamed esp needs an entire rewrite, someone make a better one pls im too
lazy
-- btw the color picker was made seperately so it doesnt fit with the code of
unnamed esp

local function CreateDrawingsTable()


local Drawings = { __Objects = {} };
local Metatable = {};

function Metatable.__index(self, Index)


local Object = rawget(self.__Objects, Index);

if not Object or (IsSynapse and not Object.__SELF.__OBJECT_EXISTS) then


local Type = Index:sub(1, Index:find'-' - 1);

Success, Object = pcall(Drawing.new, Type);

if not Object or not Success then return function() end; end

self.__Objects[Index] = setmetatable({ __SELF = Object; Type = Type },


{
__call = function(self, Properties)
local Object = rawget(self, '__SELF'); if IsSynapse and not
Object.__OBJECT_EXISTS then return false, 'render object destroyed'; end

if Properties == false then


Object.Visible = false;
Object.Transparency = 0;
Object:Remove();

return true;
end

if typeof(Properties) == 'table' then


for Property, Value in pairs(Properties) do
local CanSet = true;

if self.Type == 'Image' and not IsSynapse and Property


== 'Size' and typeof(Value) == 'Vector2' then
CanSet = false;

spawn(function()
repeat wait() until Object.Loaded;
if not self.DefaultSize then rawset(self,
'DefaultSize', Object.Size) end

Property = 'ScaleFactor';
Value = Value.X / self.DefaultSize.X;

Object[Property] = Value
end)
end

if CanSet then Object[Property] = Value end


end
end

return Object;
end
});

Object.Visible = true;
Object.Transparency = 1; -- Transparency is really Opacity with drawing
api (1 being visible, 0 being invisible)

if Type == 'Text' then


if Drawing.Fonts then Object.Font = Drawing.Fonts.Monospace end
Object.Size = 20;
Object.Color = Color3.new(1, 1, 1);
Object.Center = true;
Object.Outline = true;
OutlineOpacity = 0.5;
elseif Type == 'Square' or Type == 'Rectangle' then
Object.Thickness = 2;
Object.Filled = false;
end

return self.__Objects[Index];
end
return Object;
end

function Metatable.__call(self, Delete, ...)


local Arguments = {Delete, ...};

if Delete == false then


for Index, Drawing in pairs(rawget(self, '__Objects')) do
Drawing(false);
end
end
end

return setmetatable(Drawings, Metatable);


end

local Images = {};

spawn(function()
Images.Ring = 'https://i.imgur.com/q4qx26f.png';
Images.Overlay = 'https://i.imgur.com/gOCxbsR.png';
end)

function ColorPicker.new(Position, Size, Color)


ColorPicker.LastGenerated = tick();
ColorPicker.Loading = true;

local Picker = { Color = Color or Color3.new(1, 1, 1); HSV = { H = 0, S = 1, V


= 1 } };
local Drawings = CreateDrawingsTable();
local Position = Position or V2New();
local Size = Size or 150;
local Padding = { 10, 10, 10, 10 };

Picker.ColorChanged = Signal.new();

local Background = Drawings['Square-Background'] {


Color = Color3.fromRGB(33, 33, 33);
Filled = false;
Visible = false;
Position = Position - V2New(Padding[4], Padding[1]);
Size = V2New(Size, Size) + V2New(Padding[4] + Padding[2], Padding[1] +
Padding[3]);
};
local ColorPreview = Drawings['Circle-Preview'] {
Position = Position + (V2New(Size, Size) / 2);
Radius = Size / 2 - 8;
Filled = true;
Thickness = 0;
NumSides = 20;
Color = Color3.new(1, 0, 0);
};
local Main = Drawings['Image-Main'] {
Position = Position;
Size = V2New(Size, Size);
}; SetImage(Main, Images.Ring);
local Preview = Drawings['Square-Preview'] {
Position = Main.Position + (Main.Size / 4.5);
Size = Main.Size / 1.75;
Color = Color3.new(1, 0, 0);
Filled = true;
Thickness = 0;
};
local Overlay = Drawings['Image-Overlay'] {
Position = Preview.Position;
Size = Preview.Size;
Transparency = 1;
}; SetImage(Overlay, Images.Overlay);
local CursorOutline = Drawings['Circle-CursorOutline'] {
Radius = 4;
Thickness = 2;
Filled = false;
Color = Color3.new(0.2, 0.2, 0.2);
Position = V2New(Main.Position.X + Main.Size.X - 10, Main.Position.Y +
(Main.Size.Y / 2));
};
local Cursor = Drawings['Circle-Cursor'] {
Radius = 3;
Transparency = 1;
Filled = true;
Color = Color3.new(1, 1, 1);
Position = CursorOutline.Position;
};
local CursorOutline = Drawings['Circle-CursorOutlineSquare'] {
Radius = 4;
Thickness = 2;
Filled = false;
Color = Color3.new(0.2, 0.2, 0.2);
Position = V2New(Preview.Position.X + Preview.Size.X - 2,
Preview.Position.Y + 2);
};
Drawings['Circle-CursorSquare'] {
Radius = 3;
Transparency = 1;
Filled = true;
Color = Color3.new(1, 1, 1);
Position = CursorOutline.Position;
};

function Picker:UpdatePosition(Input)
local MousePosition = V2New(Input.Position.X, Input.Position.Y + 33);

if self.MouseHeld then
if self.Item == 'Ring' then
local Main = self.Drawings['Image-Main'] ();
local Preview = self.Drawings['Square-Preview'] ();
local Bounds = Main.Size / 2;
local Center = Main.Position + Bounds;
local Relative = MousePosition - Center;
local Direction = Relative.unit;
local Position = Center + Direction * Main.Size.X / 2.15;
local H = (math.atan2(Position.Y - Center.Y, Position.X -
Center.X)) * 60;
if H < 0 then H = 360 + H; end
H = H / 360;
self.HSV.H = H;
local EndColor = Color3.fromHSV(H, self.HSV.S, self.HSV.V); if
EndColor ~= self.Color then self.ColorChanged:Fire(self.Color); end
local Pointer = self.Drawings['Circle-Cursor'] { Position =
Position };
self.Drawings['Circle-CursorOutline'] { Position = Pointer.Position
};
Bounds = Bounds * 2;
Preview.Color = Color3.fromHSV(H, 1, 1);
self.Color = EndColor;
self.Drawings['Circle-Preview'] { Color = EndColor };
elseif self.Item == 'HL' then
local Preview = self.Drawings['Square-Preview'] ();
local HSV = self.HSV;
local Position = V2New(math.clamp(MousePosition.X,
Preview.Position.X, Preview.Position.X + Preview.Size.X),
math.clamp(MousePosition.Y, Preview.Position.Y, Preview.Position.Y +
Preview.Size.Y));
HSV.S = (Position.X - Preview.Position.X) / Preview.Size.X;
HSV.V = 1 - (Position.Y - Preview.Position.Y) / Preview.Size.Y;
local EndColor = Color3.fromHSV(HSV.H, HSV.S, HSV.V); if EndColor
~= self.Color then self.ColorChanged:Fire(self.Color); end
self.Color = EndColor;
self.Drawings['Circle-Preview'] { Color = EndColor };
local Pointer = self.Drawings['Circle-CursorSquare'] { Position =
Position };
self.Drawings['Circle-CursorOutlineSquare'] { Position =
Pointer.Position };
end
end
end

function Picker:HandleInput(Input, P, Type)


if Type == 'Began' then
if Input.UserInputType.Name == 'MouseButton1' then
local Main = self.Drawings['Image-Main'] ();
local SquareSV = self.Drawings['Square-Preview'] ();
local MousePosition = V2New(Input.Position.X, Input.Position.Y +
33);
self.MouseHeld = true;
local Bounds = Main.Size / 2;
local Center = Main.Position + Bounds;
local R = (MousePosition - Center);

if R.Magnitude < Bounds.X and R.Magnitude > Bounds.X - 20 then


self.Item = 'Ring';
end

if MousePosition.X > SquareSV.Position.X and MousePosition.Y >


SquareSV.Position.Y and MousePosition.X < SquareSV.Position.X + SquareSV.Size.X and
MousePosition.Y < SquareSV.Position.Y + SquareSV.Size.Y then
self.Item = 'HL';
end

self:UpdatePosition(Input, P);
end
elseif Type == 'Changed' then
if Input.UserInputType.Name == 'MouseMovement' then
self:UpdatePosition(Input, P);
end
elseif Type == 'Ended' and Input.UserInputType.Name == 'MouseButton1' then
self.Item = nil;
end
end

function Picker:Dispose()
self.Drawings(false);
self.UpdatePosition = nil;
self.HandleInput = nil;
Connections:DisconnectAll(); -- scuffed tbh
end

Connections:Listen(UserInputService.InputBegan, function(Input, Process)


Picker:HandleInput(Input, Process, 'Began');
end);
Connections:Listen(UserInputService.InputChanged, function(Input, Process)
if Input.UserInputType.Name == 'MouseMovement' then
local MousePosition = V2New(Input.Position.X, Input.Position.Y +
33);
local Cursor = Picker.Drawings['Triangle-Cursor'] {
Filled = true;
Color = Color3.new(0.9, 0.9, 0.9);
PointA = MousePosition + V2New(0, 0);
PointB = MousePosition + V2New(12, 14);
PointC = MousePosition + V2New(0, 18);
Thickness = 0;
};
end
Picker:HandleInput(Input, Process, 'Changed');
end);
Connections:Listen(UserInputService.InputEnded, function(Input, Process)
Picker:HandleInput(Input, Process, 'Ended');

if Input.UserInputType.Name == 'MouseButton1' then


Picker.MouseHeld = false;
end
end);

ColorPicker.Loading = false;

Picker.Drawings = Drawings;
return Picker;
end

function SubMenu:Show(Position, Title, Options)


self.Open = true;

local Visible = true;


local BasePosition = Position;
local BaseSize = V2New(200, 140);
local End = BasePosition + BaseSize;

self.Bounds = { BasePosition.X, BasePosition.Y, End.X, End.Y };

delay(0.025, function()
if not self.Open then return; end

Menu:AddMenuInstance('Sub-Main', 'Square', {
Size = BaseSize;
Position = BasePosition;
Filled = false;
Color = Colors.Primary.Main;
Thickness = 3;
Visible = Visible;
});
end);
Menu:AddMenuInstance('Sub-TopBar', 'Square', {
Position = BasePosition;
Size = V2New(BaseSize.X, 10);
Color = Colors.Primary.Dark;
Filled = true;
Visible = Visible;
});
Menu:AddMenuInstance('Sub-TopBarTwo', 'Square', {
Position = BasePosition + V2New(0, 10);
Size = V2New(BaseSize.X, 20);
Color = Colors.Primary.Main;
Filled = true;
Visible = Visible;
});
Menu:AddMenuInstance('Sub-TopBarText', 'Text', {
Size = 20;
Position = shared.MenuDrawingData.Instances['Sub-
TopBarTwo'].Position + V2New(15, -3);
Text = Title or '';
Color = Colors.Secondary.Light;
Visible = Visible;
});
Menu:AddMenuInstance('Sub-Filling', 'Square', {
Size = BaseSize - V2New(0, 30);
Position = BasePosition + V2New(0, 30);
Filled = true;
Color = Colors.Secondary.Main;
Transparency= .75;
Visible = Visible;
});

if Options then
for Index, Option in pairs(Options) do -- currently only supports color
and button(but color is a button so), planning on fully rewriting or something
local function GetName(Name) return ('Sub-%s.%d'):format(Name,
Index) end
local Position = shared.MenuDrawingData.Instances['Sub-
Filling'].Position + V2New(20, Index * 25 - 10);
-- local BasePosition =
shared.MenuDrawingData.Instances.Filling.Position + V2New(30, v.Index * 25 - 10);

if Option.Type == 'Color' then


local ColorPreview =
Menu:AddMenuInstance(GetName'ColorPreview', 'Circle', {
Position = Position;
Color = Option.Color;
Radius = IsSynapse and 10 or 10;
NumSides = 10;
Filled = true;
Visible = true;
});
local Text = Menu:AddMenuInstance(GetName'Text', 'Text', {
Text = Option.Text;
Position = ColorPreview.Position + V2New(15, -8);
Size = 16;
Color = Colors.Primary.Dark;
Visible = true;
});
UIButtons[#UIButtons + 1] = {
FromSubMenu = true;
Option = function() return
Option.Function(ColorPreview, BasePosition + V2New(BaseSize.X, 0)) end;
Instance = Menu:AddMenuInstance(Format('%s_Hitbox',
GetName'Button'), 'Square', {
Position = Position - V2New(20, 12);
Size = V2New(BaseSize.X, 25);
Visible = false;
});
};
elseif Option.Type == 'Button' then
UIButtons[#UIButtons + 1] = {
FromSubMenu = true;
Option = Option.Function;
Instance = Menu:AddMenuInstance(Format('%s_Hitbox',
GetName'Button'), 'Square', {
Size = V2New(BaseSize.X, 20) - V2New(20,
0);
Visible = true;
Transparency= .5;
Position = Position - V2New(10, 10);
Color = Colors.Secondary.Light;
Filled = true;
});
};
local Text = Menu:AddMenuInstance(Format('%s_Text',
GetName'Text'), 'Text', {
Text = Option.Text;
Size = 18;
Position = Position + V2New(5, -10);
Visible = true;
Color = Colors.Primary.Dark;
});
end
end
end
end

function SubMenu:Hide()
self.Open = false;

for i, v in pairs(shared.MenuDrawingData.Instances) do
if i:sub(1, 3) == 'Sub' then
v.Visible = false;

if i:sub(4, 4) == ':' then -- ';' = Temporary so remove


v:Remove();
shared.MenuDrawingData.Instance[i] = nil;
end
end
end

for i, Button in pairs(UIButtons) do


if Button.FromSubMenu then
UIButtons[i] = nil;
end
end

spawn(function() -- stupid bug happens if i dont use this


for i = 1, 10 do
if shared.CurrentColorPicker then -- dont know why
'CurrentColorPicker' isnt a variable in this
shared.CurrentColorPicker:Dispose();
end
wait(0.1);
end
end)

CurrentColorPicker = nil;
end

function CreateMenu(NewPosition) -- Create Menu


MenuLoaded = false;
UIButtons = {};
Sliders = {};

local BaseSize = V2New(300, 625);


local BasePosition = NewPosition or V2New(Camera.ViewportSize.X / 8 -
(BaseSize.X / 2), Camera.ViewportSize.Y / 2 - (BaseSize.Y / 2));

BasePosition = V2New(math.clamp(BasePosition.X, 0, Camera.ViewportSize.X),


math.clamp(BasePosition.Y, 0, Camera.ViewportSize.Y));

Menu:AddMenuInstance('CrosshairX', 'Line', {
Visible = false;
Color = Color3.new(0, 1, 0);
Transparency = 1;
Thickness = 1;
});
Menu:AddMenuInstance('CrosshairY', 'Line', {
Visible = false;
Color = Color3.new(0, 1, 0);
Transparency = 1;
Thickness = 1;
});

delay(.025, function() -- since zindex doesnt exist


Menu:AddMenuInstance('Main', 'Square', {
Size = BaseSize;
Position = BasePosition;
Filled = false;
Color = Colors.Primary.Main;
Thickness = 3;
Visible = true;
});
end);
Menu:AddMenuInstance('TopBar', 'Square', {
Position = BasePosition;
Size = V2New(BaseSize.X, 15);
Color = Colors.Primary.Dark;
Filled = true;
Visible = true;
});
Menu:AddMenuInstance('TopBarTwo', 'Square', {
Position = BasePosition + V2New(0, 15);
Size = V2New(BaseSize.X, 45);
Color = Colors.Primary.Main;
Filled = true;
Visible = true;
});
Menu:AddMenuInstance('TopBarText', 'Text', {
Size = 25;
Position = shared.MenuDrawingData.Instances.TopBarTwo.Position +
V2New(25, 10);
Text = 'Unnamed ESP';
Color = Colors.Secondary.Light;
Visible = true;
Transparency= 1; -- proto outline fix
Outline = true;
OutlineOpacity = 0.5;
});
Menu:AddMenuInstance('TopBarTextBR', 'Text', {
Size = 18;
Position = shared.MenuDrawingData.Instances.TopBarTwo.Position +
V2New(BaseSize.X - 75, 25);
Text = 'by ic3w0lf';
Color = Colors.Secondary.Light;
Visible = true;
Transparency= 1;
Outline = true;
OutlineOpacity = 0.5;
});
Menu:AddMenuInstance('Filling', 'Square', {
Size = BaseSize - V2New(0, 60);
Position = BasePosition + V2New(0, 60);
Filled = true;
Color = Colors.Secondary.Main;
Transparency= .5;
Visible = true;
});

local CPos = 0;

GetTableData(Options)(function(i, v)
if typeof(v.Value) == 'boolean' and not IsStringEmpty(v.Text) and
v.Text ~= nil then
CPos = CPos + 25;
local BaseSize = V2New(BaseSize.X, 30);
local BasePosition =
shared.MenuDrawingData.Instances.Filling.Position + V2New(30, v.Index * 25 - 10);
UIButtons[#UIButtons + 1] = {
Option = v;
Instance = Menu:AddMenuInstance(Format('%s_Hitbox',
v.Name), 'Square', {
Position = BasePosition - V2New(30, 15);
Size = BaseSize;
Visible = false;
});
};
Menu:AddMenuInstance(Format('%s_OuterCircle', v.Name), 'Circle',
{
Radius = 10;
Position = BasePosition;
Color = Colors.Secondary.Light;
Filled = true;
Visible = true;
});
Menu:AddMenuInstance(Format('%s_InnerCircle', v.Name), 'Circle',
{
Radius = 7;
Position = BasePosition;
Color = Colors.Secondary.Dark;
Filled = true;
Visible = v.Value;
});
Menu:AddMenuInstance(Format('%s_Text', v.Name), 'Text', {
Text = v.Text;
Size = 20;
Position = BasePosition + V2New(20, -10);
Visible = true;
Color = Colors.Secondary.Light;
Transparency= 1;
Outline = true;
OutlineOpacity = 0.5;
});
end
end)
GetTableData(Options)(function(i, v) -- just to make sure certain things are
drawn before or after others, too lazy to actually sort table
if typeof(v.Value) == 'number' then
CPos = CPos + 25;

local BaseSize = V2New(BaseSize.X, 30);


local BasePosition =
shared.MenuDrawingData.Instances.Filling.Position + V2New(0, CPos - 10);

local Line =
Menu:AddMenuInstance(Format('%s_SliderLine', v.Name), 'Square', {
Transparency = 1;
Color = Colors.Secondary.Light;
-- Thickness = 3;
Filled = true;
Visible = true;
Position = BasePosition + V2New(15, -5);
Size = BaseSize - V2New(30, 10);
Transparency = 0.5;
});
local Slider =
Menu:AddMenuInstance(Format('%s_Slider', v.Name), 'Square', {
Visible = true;
Filled = true;
Color = Colors.Primary.Dark;
Size = V2New(5, Line.Size.Y);
Transparency = 0.5;
});
local Text = Menu:AddMenuInstance(Format('%s_Text',
v.Name), 'Text', {
Text = v.Text;
Size = 20;
Center = true;
Transparency = 1;
Outline = true;
OutlineOpacity = 0.5;
Visible = true;
Color = Colors.White;
}); Text.Position = Line.Position + (Line.Size / 2) - V2New(0,
Text.TextBounds.Y / 1.75);
local AMT =
Menu:AddMenuInstance(Format('%s_AmountText', v.Name), 'Text', {
Text = tostring(v.Value);
Size = 22;
Center = true;
Transparency = 1;
Outline = true;
OutlineOpacity = 0.5;
Visible = true;
Color = Colors.White;
Position = Text.Position;
});

local CSlider = {Slider = Slider; Line = Line; Min =


v.AllArgs[4]; Max = v.AllArgs[5]; Option = v};
local Dummy = Instance.new'NumberValue';

Dummy:GetPropertyChangedSignal'Value':Connect(function()
Text.Transparency = Dummy.Value;
-- Text.OutlineTransparency = 1 - Dummy.Value;
AMT.Transparency = 1 - Dummy.Value;
end);

Dummy.Value = 1;

function CSlider:ShowValue(Bool)
self.ShowingValue = Bool;

TweenService:Create(Dummy, TweenInfo.new(0.5,
Enum.EasingStyle.Quart, Enum.EasingDirection.Out), { Value = Bool and 0 or
1 }):Play();
end

Sliders[#Sliders + 1] = CSlider;

-- local Percent = (v.Value / CSlider.Max) * 100;


-- local Size = math.abs(Line.From.X - Line.To.X);
-- local Value = Size * (Percent / 100); -- this shit's
inaccurate but fuck it i'm not even gonna bother fixing it

Slider.Position = Line.Position + V2New(35, 0);

v.BaseSize = BaseSize;
v.BasePosition = BasePosition;
-- AMT.Position = BasePosition + V2New(BaseSize.X -
AMT.TextBounds.X - 10, -10)
end
end)
local FirstItem = false;
GetTableData(Options)(function(i, v) -- just to make sure certain things are
drawn before or after others, too lazy to actually sort table
if typeof(v.Value) == 'EnumItem' then
CPos = CPos + (not FirstItem and 30 or 25);
FirstItem = true;

local BaseSize = V2New(BaseSize.X, FirstItem and 30 or


25);
local BasePosition =
shared.MenuDrawingData.Instances.Filling.Position + V2New(0, CPos - 10);

UIButtons[#UIButtons + 1] = {
Option = v;
Instance = Menu:AddMenuInstance(Format('%s_Hitbox',
v.Name), 'Square', {
Size = V2New(BaseSize.X, 20) - V2New(30, 0);
Visible = true;
Transparency= .5;
Position = BasePosition + V2New(15, -10);
Color = Colors.Secondary.Light;
Filled = true;
});
};
local Text = Menu:AddMenuInstance(Format('%s_Text',
v.Name), 'Text', {
Text = v.Text;
Size = 20;
Position = BasePosition + V2New(20, -10);
Visible = true;
Color = Colors.Secondary.Light;
Transparency= 1;
Outline = true;
OutlineOpacity = 0.5;
});
local BindText = Menu:AddMenuInstance(Format('%s_BindText',
v.Name), 'Text', {
Text = tostring(v.Value):match'%w+%.%w+%.(.+)';
Size = 20;
Position = BasePosition;
Visible = true;
Color = Colors.Secondary.Light;
Transparency= 1;
Outline = true;
OutlineOpacity = 0.5;
});

Options[i].BaseSize = BaseSize;
Options[i].BasePosition = BasePosition;
BindText.Position = BasePosition + V2New(BaseSize.X -
BindText.TextBounds.X - 20, -10);
end
end)
GetTableData(Options)(function(i, v) -- just to make sure certain things are
drawn before or after others, too lazy to actually sort table
if typeof(v.Value) == 'function' then
local BaseSize = V2New(BaseSize.X, 30);
local BasePosition =
shared.MenuDrawingData.Instances.Filling.Position + V2New(0, CPos + (25 *
v.AllArgs[4]) - 35);

UIButtons[#UIButtons + 1] = {
Option = v;
Instance = Menu:AddMenuInstance(Format('%s_Hitbox',
v.Name), 'Square', {
Size = V2New(BaseSize.X, 20) - V2New(30, 0);
Visible = true;
Transparency= .5;
Position = BasePosition + V2New(15, -10);
Color = Colors.Secondary.Light;
Filled = true;
});
};
local Text = Menu:AddMenuInstance(Format('%s_Text',
v.Name), 'Text', {
Text = v.Text;
Size = 20;
Position = BasePosition + V2New(20, -10);
Visible = true;
Color = Colors.Secondary.Light;
Transparency= 1;
Outline = true;
OutlineOpacity = 0.5;
});

-- BindText.Position = BasePosition + V2New(BaseSize.X -


BindText.TextBounds.X - 10, -10);
end
end)

delay(.1, function()
MenuLoaded = true;
end);

-- this has to be at the bottom cuz proto drawing api doesnt have
zindex :triumph:
Menu:AddMenuInstance('Cursor1', 'Line', {
Visible = false;
Color = Color3.new(1, 0, 0);
Transparency = 1;
Thickness = 2;
});
Menu:AddMenuInstance('Cursor2', 'Line', {
Visible = false;
Color = Color3.new(1, 0, 0);
Transparency = 1;
Thickness = 2;
});
Menu:AddMenuInstance('Cursor3', 'Line', {
Visible = false;
Color = Color3.new(1, 0, 0);
Transparency = 1;
Thickness = 2;
});
end

CreateMenu();
delay(0.1, function()
SubMenu:Show(V2New()); -- Create the submenu
SubMenu:Hide();
end);
shared.UESP_InputChangedCon = UserInputService.InputChanged:Connect(function(input)
if input.UserInputType.Name == 'MouseMovement' and Options.MenuOpen.Value
then
for i, v in pairs(Sliders) do
local Values = {
v.Line.Position.X;
v.Line.Position.Y;
v.Line.Position.X + v.Line.Size.X;
v.Line.Position.Y + v.Line.Size.Y;
};
if MouseHoveringOver(Values) then
v:ShowValue(true);
else
if not MouseHeld then v:ShowValue(false); end
end
end
end
end)
shared.UESP_InputBeganCon = UserInputService.InputBegan:Connect(function(input)
if input.UserInputType.Name == 'MouseButton1' and Options.MenuOpen.Value then
MouseHeld = true;
local Bar = Menu:GetInstance'TopBar';
local Values = {
Bar.Position.X;
Bar.Position.Y;
Bar.Position.X + Bar.Size.X;
Bar.Position.Y + Bar.Size.Y;
}
if MouseHoveringOver(Values) then
DraggingUI = true;
DragOffset = Menu:GetInstance'Main'.Position -
GetMouseLocation();
else
for i, v in pairs(Sliders) do
local Values = {
v.Line.Position.X;
v.Line.Position.Y;
v.Line.Position.X + v.Line.Size.X;
v.Line.Position.Y + v.Line.Size.Y;
-- v.Line.From.X - (v.Slider.Radius);
-- v.Line.From.Y - (v.Slider.Radius);
-- v.Line.To.X + (v.Slider.Radius);
-- v.Line.To.Y + (v.Slider.Radius);
};
if MouseHoveringOver(Values) then
DraggingWhat = v;
Dragging = true;
break
end
end

if not Dragging then


local Values = {
TracerPosition.X - 10;
TracerPosition.Y - 10;
TracerPosition.X + 10;
TracerPosition.Y + 10;
};
if MouseHoveringOver(Values) then
DragTracerPosition = true;
end
end
end
end
end)
shared.UESP_InputEndedCon = UserInputService.InputEnded:Connect(function(input)
if input.UserInputType.Name == 'MouseButton1' and Options.MenuOpen.Value then
MouseHeld = false;
DragTracerPosition = false;
local IgnoreOtherInput = false;

if SubMenu.Open and not MouseHoveringOver(SubMenu.Bounds) then


if CurrentColorPicker and
IsMouseOverDrawing(CurrentColorPicker.Drawings['Square-Background']()) then
IgnoreOtherInput = true; end
if not IgnoreOtherInput then SubMenu:Hide() end
end

if not IgnoreOtherInput then


for i, v in pairs(UIButtons) do
if SubMenu.Open and MouseHoveringOver(SubMenu.Bounds) and
not v.FromSubMenu then continue end

local Values = {
v.Instance.Position.X;
v.Instance.Position.Y;
v.Instance.Position.X + v.Instance.Size.X;
v.Instance.Position.Y + v.Instance.Size.Y;
};
if MouseHoveringOver(Values) then
v.Option();
IgnoreOtherInput = true;
break -- prevent clicking 2 options
end
end
for i, v in pairs(Sliders) do
if IgnoreOtherInput then break end

local Values = {
v.Line.Position.X;
v.Line.Position.Y;
v.Line.Position.X + v.Line.Size.X;
v.Line.Position.Y + v.Line.Size.Y;
};
if not MouseHoveringOver(Values) then
v:ShowValue(false);
end
end
end
elseif input.UserInputType.Name == 'MouseButton2' and Options.MenuOpen.Value
and not DragTracerPosition then
local Values = {
TracerPosition.X - 10;
TracerPosition.Y - 10;
TracerPosition.X + 10;
TracerPosition.Y + 10;
}
if MouseHoveringOver(Values) then
DragTracerPosition = false;
TracerPosition = V2New(Camera.ViewportSize.X / 2,
Camera.ViewportSize.Y - 135);
end
elseif input.UserInputType.Name == 'Keyboard' then
if Binding then
BindedKey = input.KeyCode;
Binding = false;
elseif input.KeyCode == Options.MenuKey.Value or (input.KeyCode ==
Enum.KeyCode.Home and UserInputService:IsKeyDown(Enum.KeyCode.LeftControl)) then
Options.MenuOpen();
elseif input.KeyCode == Options.ToggleKey.Value then
Options.Enabled();
elseif input.KeyCode.Name == 'F1' and
UserInputService:IsMouseButtonPressed(1) and shared.am_ic3 then -- hehe hiden
spectate feature cuz why not
local HD, LPlayer, LCharacter = 0.95;

for i, Player in pairs(Players:GetPlayers()) do


local Character = GetCharacter(Player);

if Player ~= LocalPlayer and Player ~= Spectating and


Character and Character:FindFirstChild'HumanoidRootPart' then
local Head = Character:FindFirstChild'Head';
local Humanoid =
Character:FindFirstChildOfClass'Humanoid';

if Head then
local Distance = (Camera.CFrame.Position -
Head.Position).Magnitude;

if Distance > Options.MaxDistance.Value then


continue; end

local Direction = -(Camera.CFrame.Position -


Mouse.Hit.Position).unit;
local Relative = Character.Head.Position -
Camera.CFrame.Position;
local Unit = Relative.unit;

local DP = Direction:Dot(Unit);

if DP > HD then
HD = DP;
LPlayer = Player;
LCharacter = Character;
end
end
end
end

if LPlayer and LPlayer ~= Spectating and LCharacter then


Camera.CameraSubject = LCharacter.Head;
Spectating = LPlayer;
else
if LocalPlayer.Character and
LocalPlayer.Character:FindFirstChildOfClass'Humanoid' then
Camera.CameraSubject =
LocalPlayer.Character:FindFirstChildOfClass'Humanoid';
Spectating = nil;
end
end
end
end
end)

local function CameraCon() -- unnamed esp v1 sucks

workspace.CurrentCamera:GetPropertyChangedSignal'ViewportSize':Connect(function()
TracerPosition = V2New(Camera.ViewportSize.X / 2, Camera.ViewportSize.Y
- 135);
end);
end

CameraCon();

local function ToggleMenu()


if Options.MenuOpen.Value then
-- GUIService:SetMenuIsOpen(true);
GetTableData(shared.MenuDrawingData.Instances)(function(i, v)
if OldData[v] then
pcall(Set, v, 'Visible', true);
end
end)
else
-- GUIService:SetMenuIsOpen(false);
GetTableData(shared.MenuDrawingData.Instances)(function(i, v)
OldData[v] = v.Visible;
if v.Visible then
pcall(Set, v, 'Visible', false);
end
end)
end
end

local function CheckRay(Instance, Distance, Position, Unit)


local Pass = true;
local Model = Instance;

if Distance > 999 then return false; end

if Instance.ClassName == 'Player' then


Model = GetCharacter(Instance);
end

if not Model then


Model = Instance.Parent;

if Model.Parent == workspace then


Model = Instance;
end
end

if not Model then return false end

local _Ray = Ray.new(Position, Unit * Distance);

local List = {LocalPlayer.Character, Camera, Mouse.TargetFilter};


for i,v in pairs(IgnoreList) do table.insert(List, v); end;

local Hit = workspace:FindPartOnRayWithIgnoreList(_Ray, List);

if Hit and not Hit:IsDescendantOf(Model) then


Pass = false;
if Hit.Transparency >= .3 or not Hit.CanCollide and Hit.ClassName ~=
Terrain then -- Detect invisible walls
IgnoreList[#IgnoreList + 1] = Hit;
end
end

return Pass;
end

local function CheckTeam(Player)


if Player.Neutral and LocalPlayer.Neutral then return true; end
return Player.TeamColor == LocalPlayer.TeamColor;
end

local CustomTeam = CustomTeams[game.PlaceId];

if CustomTeam ~= nil then


if CustomTeam.Initialize then ypcall(CustomTeam.Initialize) end

CheckTeam = CustomTeam.CheckTeam;
end

local function CheckPlayer(Player, Character)


if not Options.Enabled.Value then return false end

local Pass = true;


local Distance = 0;

if Player ~= LocalPlayer and Character then


if not Options.ShowTeam.Value and CheckTeam(Player) then
Pass = false;
end

local Head = Character:FindFirstChild'Head';

if Pass and Character and Head then


Distance = (Camera.CFrame.Position - Head.Position).Magnitude;
if Options.VisCheck.Value then
Pass = CheckRay(Player, Distance, Camera.CFrame.Position,
(Head.Position - Camera.CFrame.Position).unit);
end
if Distance > Options.MaxDistance.Value then
Pass = false;
end
end
else
Pass = false;
end

return Pass, Distance;


end
local function CheckDistance(Instance)
if not Options.Enabled.Value then return false end

local Pass = true;


local Distance = 0;

if Instance ~= nil then


Distance = (Camera.CFrame.Position - Instance.Position).Magnitude;
if Options.VisCheck.Value then
Pass = CheckRay(Instance, Distance, Camera.CFrame.Position,
(Instance.Position - Camera.CFrame.Position).unit);
end
if Distance > Options.MaxDistance.Value then
Pass = false;
end
else
Pass = false;
end

return Pass, Distance;


end

local function UpdatePlayerData()


if (tick() - LastRefresh) > (Options.RefreshRate.Value / 1000) then
LastRefresh = tick();
if CustomESP and Options.Enabled.Value then
local a, b = pcall(CustomESP);
end
for i, v in pairs(RenderList.Instances) do
if v.Instance ~= nil and v.Instance.Parent ~= nil and
v.Instance:IsA'BasePart' then
local Data = shared.InstanceData[v.Instance:GetDebugId()]
or { Instances = {}; DontDelete = true };

Data.Instance = v.Instance;

Data.Instances['OutlineTracer'] =
Data.Instances['OutlineTracer'] or NewDrawing'Line'{
Transparency = 0.75;
Thickness = 5;
Color = Color3.new(0.1, 0.1, 0.1);
}
Data.Instances['Tracer'] = Data.Instances['Tracer'] or
NewDrawing'Line'{
Transparency = 1;
Thickness = 2;
}
Data.Instances['NameTag'] = Data.Instances['NameTag'] or
NewDrawing'Text'{
Size = Options.TextSize.Value;
Center = true;
Outline = Options.TextOutline.Value;
Visible = true;
};
Data.Instances['DistanceTag'] =
Data.Instances['DistanceTag'] or NewDrawing'Text'{
Size = Options.TextSize.Value - 1;
Center = true;
Outline = Options.TextOutline.Value;
Visible = true;
};

local NameTag = Data.Instances['NameTag'];


local DistanceTag = Data.Instances['DistanceTag'];
local Tracer = Data.Instances['Tracer'];
local OutlineTracer = Data.Instances['OutlineTracer'];

local Pass, Distance = CheckDistance(v.Instance);

if Pass then
local ScreenPosition, Vis =
WorldToViewport(v.Instance.Position);
local Color = v.Color;
local OPos =
Camera.CFrame:pointToObjectSpace(v.Instance.Position);

if ScreenPosition.Z < 0 then


local AT = math.atan2(OPos.Y, OPos.X) +
math.pi;
OPos = CFrame.Angles(0, 0,
AT):vectorToWorldSpace((CFrame.Angles(0, math.rad(89.9),
0):vectorToWorldSpace(V3New(0, 0, -1))));
end

local Position =
WorldToViewport(Camera.CFrame:pointToWorldSpace(OPos));

if Options.ShowTracers.Value then
Tracer.Transparency = math.clamp(Distance /
200, 0.45, 0.8);
Tracer.Visible = true;
Tracer.From = TracerPosition;
Tracer.To = V2New(Position.X,
Position.Y);
Tracer.Color = Color;
OutlineTracer.Visible = true;
OutlineTracer.Transparency =
Tracer.Transparency - 0.1;
OutlineTracer.From = Tracer.From;
OutlineTracer.To = Tracer.To;
OutlineTracer.Color = Color3.new(0.1, 0.1,
0.1);
else
Tracer.Visible = false;
OutlineTracer.Visible = false;
end

if ScreenPosition.Z > 0 then


local ScreenPositionUpper = ScreenPosition;

if Options.ShowName.Value then
LocalPlayer.NameDisplayDistance = 0;
NameTag.Visible = true;
NameTag.Text = v.Text;
NameTag.Size =
Options.TextSize.Value;
NameTag.Outline =
Options.TextOutline.Value;
NameTag.Position =
V2New(ScreenPositionUpper.X, ScreenPositionUpper.Y);
NameTag.Color = Color;
if Drawing.Fonts and shared.am_ic3 then
-- CURRENTLY SYNAPSE ONLY :MEGAHOLY:
NameTag.Font =
Drawing.Fonts.Monospace;
end
else
LocalPlayer.NameDisplayDistance = 100;
NameTag.Visible = false;
end
if Options.ShowDistance.Value or
Options.ShowHealth.Value then
DistanceTag.Visible = true;
DistanceTag.Size =
Options.TextSize.Value - 1;
DistanceTag.Outline =
Options.TextOutline.Value;
DistanceTag.Color = Color3.new(1, 1,
1);
if Drawing.Fonts and shared.am_ic3 then
-- CURRENTLY SYNAPSE ONLY :MEGAHOLY:
NameTag.Font =
Drawing.Fonts.Monospace;
end

local Str = '';

if Options.ShowDistance.Value then
Str = Str .. Format('[%d] ',
Distance);
end

DistanceTag.Text = Str;
DistanceTag.Position =
V2New(ScreenPositionUpper.X, ScreenPositionUpper.Y) + V2New(0,
NameTag.TextBounds.Y);
else
DistanceTag.Visible = false;
end
else
NameTag.Visible = false;
DistanceTag.Visible = false;
end
else
NameTag.Visible = false;
DistanceTag.Visible = false;
Tracer.Visible = false;
OutlineTracer.Visible = false;
end

Data.Instances['NameTag'] = NameTag;
Data.Instances['DistanceTag'] = DistanceTag;
Data.Instances['Tracer'] = Tracer;
Data.Instances['OutlineTracer'] = OutlineTracer;

shared.InstanceData[v.Instance:GetDebugId()] = Data;
end
end
for i, v in pairs(Players:GetPlayers()) do
local Data = shared.InstanceData[v.Name] or { Instances = {}; };

Data.Instances['Box'] = Data.Instances['Box'] or
LineBox:Create{Thickness = 4};
Data.Instances['OutlineTracer'] = Data.Instances['OutlineTracer']
or NewDrawing'Line'{
Transparency = 1;
Thickness = 3;
Color = Color3.new(0.1, 0.1, 0.1);
}
Data.Instances['Tracer'] = Data.Instances['Tracer'] or
NewDrawing'Line'{
Transparency = 1;
Thickness = 1;
}
Data.Instances['HeadDot'] = Data.Instances['HeadDot'] or
NewDrawing'Circle'{
Filled = true;
NumSides = 30;
}
Data.Instances['NameTag'] = Data.Instances['NameTag'] or
NewDrawing'Text'{
Size = Options.TextSize.Value;
Center = true;
Outline = Options.TextOutline.Value;
OutlineOpacity = 1;
Visible = true;
};
Data.Instances['DistanceHealthTag'] =
Data.Instances['DistanceHealthTag'] or NewDrawing'Text'{
Size = Options.TextSize.Value - 1;
Center = true;
Outline = Options.TextOutline.Value;
OutlineOpacity = 1;
Visible = true;
};

local NameTag = Data.Instances['NameTag'];


local DistanceTag = Data.Instances['DistanceHealthTag'];
local Tracer = Data.Instances['Tracer'];
local OutlineTracer = Data.Instances['OutlineTracer'];
local HeadDot = Data.Instances['HeadDot'];
local Box = Data.Instances['Box'];

local Character = GetCharacter(v);


local Pass, Distance = CheckPlayer(v, Character);

if Pass and Character then


local Humanoid = Character:FindFirstChildOfClass'Humanoid';
local Head = Character:FindFirstChild'Head';
local HumanoidRootPart =
Character:FindFirstChild(CustomRootPartName or 'HumanoidRootPart')

local Dead = (Humanoid and Humanoid:GetState().Name ==


'Dead')
if type(GetAliveState) == 'function' then
Dead = (not GetAliveState(v, Character))
end

if Character ~= nil and Head and HumanoidRootPart and not


Dead then
local ScreenPosition, Vis =
WorldToViewport(Head.Position);
local Color = Rainbow and Color3.fromHSV(tick() * 128
% 255/255, 1, 1) or (CheckTeam(v) and TeamColor or EnemyColor); Color =
Options.ShowTeamColor.Value and v.TeamColor.Color or Color;
local OPos =
Camera.CFrame:pointToObjectSpace(Head.Position);

if ScreenPosition.Z < 0 then


local AT = math.atan2(OPos.Y, OPos.X) +
math.pi;
OPos = CFrame.Angles(0, 0,
AT):vectorToWorldSpace((CFrame.Angles(0, math.rad(89.9),
0):vectorToWorldSpace(V3New(0, 0, -1))));
end

local Position =
WorldToViewport(Camera.CFrame:pointToWorldSpace(OPos));

if Options.ShowTracers.Value then
if TracerPosition.X >= Camera.ViewportSize.X or
TracerPosition.Y >= Camera.ViewportSize.Y or TracerPosition.X < 0 or
TracerPosition.Y < 0 then
TracerPosition =
V2New(Camera.ViewportSize.X / 2, Camera.ViewportSize.Y - 135);
end

Tracer.Visible = true;
Tracer.Transparency = math.clamp(1 -
(Distance / 200), 0.25, 0.75);
Tracer.From = TracerPosition;
Tracer.To = V2New(Position.X,
Position.Y);
Tracer.Color = Color;
OutlineTracer.From = Tracer.From;
OutlineTracer.To = Tracer.To;
OutlineTracer.Transparency =
Tracer.Transparency - 0.15;
OutlineTracer.Visible = true;
else
Tracer.Visible = false;
OutlineTracer.Visible = false;
end

if ScreenPosition.Z > 0 then


local ScreenPositionUpper =
WorldToViewport((HumanoidRootPart:GetRenderCFrame() * CFrame.new(0, Head.Size.Y +
HumanoidRootPart.Size.Y + (Options.YOffset.Value / 25), 0)).Position);
local Scale =
Head.Size.Y / 2;

if Options.ShowName.Value then
NameTag.Visible = true;
NameTag.Text = v.Name ..
(CustomPlayerTag and CustomPlayerTag(v) or '');
NameTag.Size =
Options.TextSize.Value;
NameTag.Outline =
Options.TextOutline.Value;
NameTag.Position =
V2New(ScreenPositionUpper.X, ScreenPositionUpper.Y) - V2New(0,
NameTag.TextBounds.Y);
NameTag.Color = Color;
NameTag.Color = Color;
NameTag.OutlineColor= Color3.new(0.05,
0.05, 0.05);
NameTag.Transparency= 0.85;
if Drawing.Fonts and shared.am_ic3 then
-- CURRENTLY SYNAPSE ONLY :MEGAHOLY:
NameTag.Font =
Drawing.Fonts.Monospace;
end
else
NameTag.Visible = false;
end
if Options.ShowDistance.Value or
Options.ShowHealth.Value then
DistanceTag.Visible = true;
DistanceTag.Size =
Options.TextSize.Value - 1;
DistanceTag.Outline =
Options.TextOutline.Value;
DistanceTag.Color = Color3.new(1, 1,
1);
DistanceTag.Transparency= 0.85;
if Drawing.Fonts and shared.am_ic3 then
-- CURRENTLY SYNAPSE ONLY :MEGAHOLY:
NameTag.Font =
Drawing.Fonts.Monospace;
end

local Str = '';

if Options.ShowDistance.Value then
Str = Str .. Format('[%d] ',
Distance);
end
if Options.ShowHealth.Value then

if typeof(Humanoid) == 'Instance'
then
Str = Str .. Format('[%d/%d]
[%s%%]', Humanoid.Health, Humanoid.MaxHealth, math.floor(Humanoid.Health /
Humanoid.MaxHealth * 100));
elseif type(GetHealth) ==
'function' then
local health, maxHealth =
GetHealth(v)

if type(health) == 'number'
and type(maxHealth) == 'number' then
Str = Str ..
Format('[%d/%d] [%s%%]', health, maxHealth, math.floor(health / maxHealth * 100))
end
end
end

DistanceTag.Text = Str;
DistanceTag.OutlineColor =
Color3.new(0.05, 0.05, 0.05);
DistanceTag.Position = (NameTag.Visible
and NameTag.Position + V2New(0, NameTag.TextBounds.Y) or
V2New(ScreenPositionUpper.X, ScreenPositionUpper.Y));
else
DistanceTag.Visible = false;
end
if Options.ShowDot.Value and Vis then
local Top =
WorldToViewport((Head.CFrame * CFrame.new(0, Scale, 0)).Position);
local Bottom =
WorldToViewport((Head.CFrame * CFrame.new(0, -Scale, 0)).Position);
local Radius = (Top -
Bottom).y;

HeadDot.Visible = true;
HeadDot.Color = Color;
HeadDot.Position =
V2New(ScreenPosition.X, ScreenPosition.Y);
HeadDot.Radius = Radius;
else
HeadDot.Visible = false;
end
if Options.ShowBoxes.Value and Vis and
HumanoidRootPart then
local Body = {
Head;
Character:FindFirstChild'Left Leg'
or Character:FindFirstChild'LeftLowerLeg';
Character:FindFirstChild'Right Leg'
or Character:FindFirstChild'RightLowerLeg';
Character:FindFirstChild'Left Arm'
or Character:FindFirstChild'LeftLowerArm';
Character:FindFirstChild'Right Arm'
or Character:FindFirstChild'RightLowerArm';
}
Box:Update(HumanoidRootPart.CFrame,
V3New(2, 3, 1) * (Scale * 2), Color, nil, shared.am_ic3 and Body);
else
Box:SetVisible(false);
end
else
NameTag.Visible = false;
DistanceTag.Visible = false;
HeadDot.Visible = false;

Box:SetVisible(false);
end
else
NameTag.Visible = false;
DistanceTag.Visible = false;
HeadDot.Visible = false;
Tracer.Visible = false;
OutlineTracer.Visible = false;
Box:SetVisible(false);
end
else
NameTag.Visible = false;
DistanceTag.Visible = false;
HeadDot.Visible = false;
Tracer.Visible = false;
OutlineTracer.Visible = false;

Box:SetVisible(false);
end

shared.InstanceData[v.Name] = Data;
end
end
end

local LastInvalidCheck = 0;

local function Update()


if tick() - LastInvalidCheck > 0.3 then
LastInvalidCheck = tick();

if Camera.Parent ~= workspace then


Camera = workspace.CurrentCamera;
CameraCon();
WTVP = Camera.WorldToViewportPoint;
end

for i, v in pairs(shared.InstanceData) do
if not Players:FindFirstChild(tostring(i)) then
if not shared.InstanceData[i].DontDelete then
GetTableData(v.Instances)(function(i, obj)
obj.Visible = false;
obj:Remove();
v.Instances[i] = nil;
end)
shared.InstanceData[i] = nil;
else
if shared.InstanceData[i].Instance == nil or
shared.InstanceData[i].Instance.Parent == nil then
GetTableData(v.Instances)(function(i, obj)
obj.Visible = false;
obj:Remove();
v.Instances[i] = nil;
end)
shared.InstanceData[i] = nil;
end
end
end
end
end

local CX = Menu:GetInstance'CrosshairX';
local CY = Menu:GetInstance'CrosshairY';

if Options.Crosshair.Value then
CX.Visible = true;
CY.Visible = true;

CX.To = V2New((Camera.ViewportSize.X / 2) - 8, (Camera.ViewportSize.Y /


2));
CX.From = V2New((Camera.ViewportSize.X / 2) + 8, (Camera.ViewportSize.Y
/ 2));
CY.To = V2New((Camera.ViewportSize.X / 2), (Camera.ViewportSize.Y / 2)
- 8);
CY.From = V2New((Camera.ViewportSize.X / 2), (Camera.ViewportSize.Y /
2) + 8);
else
CX.Visible = false;
CY.Visible = false;
end

if Options.MenuOpen.Value and MenuLoaded then


local MLocation = GetMouseLocation();
shared.MenuDrawingData.Instances.Main.Color = Color3.fromHSV(tick() *
24 % 255/255, 1, 1);
local MainInstance = Menu:GetInstance'Main';

local Values = {
MainInstance.Position.X;
MainInstance.Position.Y;
MainInstance.Position.X + MainInstance.Size.X;
MainInstance.Position.Y + MainInstance.Size.Y;
};

if MainInstance and (MouseHoveringOver(Values) or (SubMenu.Open and


MouseHoveringOver(SubMenu.Bounds))) then
Debounce.CursorVis = true;

Menu:UpdateMenuInstance'Cursor1'{
Visible = true;
From = V2New(MLocation.x, MLocation.y);
To = V2New(MLocation.x + 5, MLocation.y + 6);
}
Menu:UpdateMenuInstance'Cursor2'{
Visible = true;
From = V2New(MLocation.x, MLocation.y);
To = V2New(MLocation.x, MLocation.y + 8);
}
Menu:UpdateMenuInstance'Cursor3'{
Visible = true;
From = V2New(MLocation.x, MLocation.y + 6);
To = V2New(MLocation.x + 5, MLocation.y + 5);
}
else
if Debounce.CursorVis then
Debounce.CursorVis = false;

Menu:UpdateMenuInstance'Cursor1'{Visible = false};
Menu:UpdateMenuInstance'Cursor2'{Visible = false};
Menu:UpdateMenuInstance'Cursor3'{Visible = false};
end
end
if MouseHeld then
local MousePos = GetMouseLocation();
if Dragging then
DraggingWhat.Slider.Position = V2New(math.clamp(MLocation.X
- DraggingWhat.Slider.Size.X / 2, DraggingWhat.Line.Position.X,
DraggingWhat.Line.Position.X + DraggingWhat.Line.Size.X -
DraggingWhat.Slider.Size.X), DraggingWhat.Slider.Position.Y);
local Percent = (DraggingWhat.Slider.Position.X -
DraggingWhat.Line.Position.X) / ((DraggingWhat.Line.Position.X +
DraggingWhat.Line.Size.X - DraggingWhat.Line.Position.X) -
DraggingWhat.Slider.Size.X);
local Value = CalculateValue(DraggingWhat.Min,
DraggingWhat.Max, Percent);
DraggingWhat.Option(Value);
elseif DraggingUI then
Debounce.UIDrag = true;
local Main = Menu:GetInstance'Main';
Main.Position = MousePos + DragOffset;
elseif DragTracerPosition then
TracerPosition = MousePos;
end
else
Dragging = false;
DragTracerPosition = false;
if DraggingUI and Debounce.UIDrag then
Debounce.UIDrag = false;
DraggingUI = false;
CreateMenu(Menu:GetInstance'Main'.Position);
end
end
if not Debounce.Menu then
Debounce.Menu = true;
ToggleMenu();
end
elseif Debounce.Menu and not Options.MenuOpen.Value then
Debounce.Menu = false;
ToggleMenu();
end
end

RunService:UnbindFromRenderStep(GetDataName);
RunService:UnbindFromRenderStep(UpdateName);

RunService:BindToRenderStep(GetDataName, 300, UpdatePlayerData);


RunService:BindToRenderStep(UpdateName, 199, Update);

You might also like

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy