DankGreenMoney

CRESP

May 8th, 2022 (edited)
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 11.63 KB | None | 0 0
  1. --Settings--
  2. local ESP = {
  3.     Enabled = false,
  4.     Boxes = false,
  5.     BoxShift = CFrame.new(0,-1.5,0),
  6.     BoxSize = Vector3.new(4,6,0),
  7.     Color = Color3.fromRGB(255, 170, 0),
  8.     FaceCamera = false,
  9.     Names = false,
  10.     TeamColor = false,
  11.     Thickness = 2,
  12.     AttachShift = 1,
  13.     TeamMates = false,
  14.     Players = true,
  15.    
  16.     Objects = setmetatable({}, {__mode="kv"}),
  17.     Overrides = {}
  18. }
  19.  
  20. --Declarations--
  21. local cam = workspace.CurrentCamera
  22. local plrs = game:GetService("Players")
  23. local plr = plrs.LocalPlayer
  24. local mouse = plr:GetMouse()
  25.  
  26. local V3new = Vector3.new
  27. local WorldToViewportPoint = cam.WorldToViewportPoint
  28.  
  29. --Functions--
  30. local function Draw(obj, props)
  31.     local new = Drawing.new(obj)
  32.    
  33.     props = props or {}
  34.     for i,v in pairs(props) do
  35.         new[i] = v
  36.     end
  37.     return new
  38. end
  39.  
  40. function ESP:GetTeam(p)
  41.     local ov = self.Overrides.GetTeam
  42.     if ov then
  43.         return ov(p)
  44.     end
  45.    
  46.     return p and p.Team
  47. end
  48.  
  49. function ESP:IsTeamMate(p)
  50.     local ov = self.Overrides.IsTeamMate
  51.     if ov then
  52.         return ov(p)
  53.     end
  54.    
  55.     return self:GetTeam(p) == self:GetTeam(plr)
  56. end
  57.  
  58. function ESP:GetColor(obj)
  59.     local ov = self.Overrides.GetColor
  60.     if ov then
  61.         return ov(obj)
  62.     end
  63.     local p = self:GetPlrFromChar(obj)
  64.     return p and self.TeamColor and p.Team and p.Team.TeamColor.Color or self.Color
  65. end
  66.  
  67. function ESP:GetPlrFromChar(char)
  68.     local ov = self.Overrides.GetPlrFromChar
  69.     if ov then
  70.         return ov(char)
  71.     end
  72.    
  73.     return plrs:GetPlayerFromCharacter(char)
  74. end
  75.  
  76. function ESP:Toggle(bool)
  77.     self.Enabled = bool
  78.     if not bool then
  79.         for i,v in pairs(self.Objects) do
  80.             if v.Type == "Box" then --fov circle etc
  81.                 if v.Temporary then
  82.                     v:Remove()
  83.                 else
  84.                     for i,v in pairs(v.Components) do
  85.                         v.Visible = false
  86.                     end
  87.                 end
  88.             end
  89.         end
  90.     end
  91. end
  92.  
  93. function ESP:GetBox(obj)
  94.     return self.Objects[obj]
  95. end
  96.  
  97. function ESP:AddObjectListener(parent, options)
  98.     local function NewListener(c)
  99.         if type(options.Type) == "string" and c:IsA(options.Type) or options.Type == nil then
  100.             if type(options.Name) == "string" and c.Name == options.Name or options.Name == nil then
  101.                 if not options.Validator or options.Validator(c) then
  102.                     local box = ESP:Add(c, {
  103.                         PrimaryPart = type(options.PrimaryPart) == "string" and c:WaitForChild(options.PrimaryPart) or type(options.PrimaryPart) == "function" and options.PrimaryPart(c),
  104.                         Color = type(options.Color) == "function" and options.Color(c) or options.Color,
  105.                         ColorDynamic = options.ColorDynamic,
  106.                         Name = type(options.CustomName) == "function" and options.CustomName(c) or options.CustomName,
  107.                         IsEnabled = options.IsEnabled,
  108.                         RenderInNil = options.RenderInNil
  109.                     })
  110.                     --TODO: add a better way of passing options
  111.                     if options.OnAdded then
  112.                         coroutine.wrap(options.OnAdded)(box)
  113.                     end
  114.                 end
  115.             end
  116.         end
  117.     end
  118.  
  119.     if options.Recursive then
  120.         parent.DescendantAdded:Connect(NewListener)
  121.         for i,v in pairs(parent:GetDescendants()) do
  122.             coroutine.wrap(NewListener)(v)
  123.         end
  124.     else
  125.         parent.ChildAdded:Connect(NewListener)
  126.         for i,v in pairs(parent:GetChildren()) do
  127.             coroutine.wrap(NewListener)(v)
  128.         end
  129.     end
  130. end
  131.  
  132. local boxBase = {}
  133. boxBase.__index = boxBase
  134.  
  135. function boxBase:Remove()
  136.     ESP.Objects[self.Object] = nil
  137.     for i,v in pairs(self.Components) do
  138.         v.Visible = false
  139.         v:Remove()
  140.         self.Components[i] = nil
  141.     end
  142. end
  143.  
  144. function boxBase:Update()
  145.     if not self.PrimaryPart then
  146.         --warn("not supposed to print", self.Object)
  147.         return self:Remove()
  148.     end
  149.  
  150.     local color
  151.     if ESP.Highlighted == self.Object then
  152.        color = ESP.HighlightColor
  153.     else
  154.         color = self.Color or self.ColorDynamic and self:ColorDynamic() or ESP:GetColor(self.Object) or ESP.Color
  155.     end
  156.  
  157.     local allow = true
  158.     if ESP.Overrides.UpdateAllow and not ESP.Overrides.UpdateAllow(self) then
  159.         allow = false
  160.     end
  161.     if self.Player and not ESP.TeamMates and ESP:IsTeamMate(self.Player) then
  162.         allow = false
  163.     end
  164.     if self.Player and not ESP.Players then
  165.         allow = false
  166.     end
  167.     if self.IsEnabled and (type(self.IsEnabled) == "string" and not ESP[self.IsEnabled] or type(self.IsEnabled) == "function" and not self:IsEnabled()) then
  168.         allow = false
  169.     end
  170.     if not workspace:IsAncestorOf(self.PrimaryPart) and not self.RenderInNil then
  171.         allow = false
  172.     end
  173.  
  174.     if not allow then
  175.         for i,v in pairs(self.Components) do
  176.             v.Visible = false
  177.         end
  178.         return
  179.     end
  180.  
  181.     if ESP.Highlighted == self.Object then
  182.         color = ESP.HighlightColor
  183.     end
  184.  
  185.     --calculations--
  186.     local cf = self.PrimaryPart.CFrame
  187.     if ESP.FaceCamera then
  188.         cf = CFrame.new(cf.p, cam.CFrame.p)
  189.     end
  190.     local size = self.Size
  191.     local locs = {
  192.         TopLeft = cf * ESP.BoxShift * CFrame.new(size.X/2,size.Y/2,0),
  193.         TopRight = cf * ESP.BoxShift * CFrame.new(-size.X/2,size.Y/2,0),
  194.         BottomLeft = cf * ESP.BoxShift * CFrame.new(size.X/2,-size.Y/2,0),
  195.         BottomRight = cf * ESP.BoxShift * CFrame.new(-size.X/2,-size.Y/2,0),
  196.         TagPos = cf * ESP.BoxShift * CFrame.new(0,size.Y/2,0),
  197.         Torso = cf * ESP.BoxShift
  198.     }
  199.  
  200.     if ESP.Boxes then
  201.         local TopLeft, Vis1 = WorldToViewportPoint(cam, locs.TopLeft.p)
  202.         local TopRight, Vis2 = WorldToViewportPoint(cam, locs.TopRight.p)
  203.         local BottomLeft, Vis3 = WorldToViewportPoint(cam, locs.BottomLeft.p)
  204.         local BottomRight, Vis4 = WorldToViewportPoint(cam, locs.BottomRight.p)
  205.  
  206.         if self.Components.Quad then
  207.             if Vis1 or Vis2 or Vis3 or Vis4 then
  208.                 self.Components.Quad.Visible = true
  209.                 self.Components.Quad.PointA = Vector2.new(TopRight.X, TopRight.Y)
  210.                 self.Components.Quad.PointB = Vector2.new(TopLeft.X, TopLeft.Y)
  211.                 self.Components.Quad.PointC = Vector2.new(BottomLeft.X, BottomLeft.Y)
  212.                 self.Components.Quad.PointD = Vector2.new(BottomRight.X, BottomRight.Y)
  213.                 self.Components.Quad.Color = color
  214.             else
  215.                 self.Components.Quad.Visible = false
  216.             end
  217.         end
  218.     else
  219.         self.Components.Quad.Visible = false
  220.     end
  221.  
  222.     if ESP.Names then
  223.         local TagPos, Vis5 = WorldToViewportPoint(cam, locs.TagPos.p)
  224.        
  225.         if Vis5 then
  226.             self.Components.Name.Visible = true
  227.             self.Components.Name.Position = Vector2.new(TagPos.X, TagPos.Y)
  228.             self.Components.Name.Text = self.Name
  229.             self.Components.Name.Color = color
  230.            
  231.             self.Components.Distance.Visible = true
  232.             self.Components.Distance.Position = Vector2.new(TagPos.X, TagPos.Y + 14)
  233.             self.Components.Distance.Text = math.floor((cam.CFrame.p - cf.p).magnitude) .."m away"
  234.             self.Components.Distance.Color = color
  235.         else
  236.             self.Components.Name.Visible = false
  237.             self.Components.Distance.Visible = false
  238.         end
  239.     else
  240.         self.Components.Name.Visible = false
  241.         self.Components.Distance.Visible = false
  242.     end
  243.    
  244.     if ESP.Tracers then
  245.         local TorsoPos, Vis6 = WorldToViewportPoint(cam, locs.Torso.p)
  246.  
  247.         if Vis6 then
  248.             self.Components.Tracer.Visible = true
  249.             self.Components.Tracer.From = Vector2.new(TorsoPos.X, TorsoPos.Y)
  250.             self.Components.Tracer.To = Vector2.new(cam.ViewportSize.X/2,cam.ViewportSize.Y/ESP.AttachShift)
  251.             self.Components.Tracer.Color = color
  252.         else
  253.             self.Components.Tracer.Visible = false
  254.         end
  255.     else
  256.         self.Components.Tracer.Visible = false
  257.     end
  258. end
  259.  
  260. function ESP:Add(obj, options)
  261.     if not obj.Parent and not options.RenderInNil then
  262.         return warn(obj, "has no parent")
  263.     end
  264.  
  265.     local box = setmetatable({
  266.         Name = options.Name or obj.Name,
  267.         Type = "Box",
  268.         Color = options.Color --[[or self:GetColor(obj)]],
  269.         Size = options.Size or self.BoxSize,
  270.         Object = obj,
  271.         Player = options.Player or plrs:GetPlayerFromCharacter(obj),
  272.         PrimaryPart = options.PrimaryPart or obj.ClassName == "Model" and (obj.PrimaryPart or obj:FindFirstChild("HumanoidRootPart") or obj:FindFirstChildWhichIsA("BasePart")) or obj:IsA("BasePart") and obj,
  273.         Components = {},
  274.         IsEnabled = options.IsEnabled,
  275.         Temporary = options.Temporary,
  276.         ColorDynamic = options.ColorDynamic,
  277.         RenderInNil = options.RenderInNil
  278.     }, boxBase)
  279.  
  280.     if self:GetBox(obj) then
  281.         self:GetBox(obj):Remove()
  282.     end
  283.  
  284.     box.Components["Quad"] = Draw("Quad", {
  285.         Thickness = self.Thickness,
  286.         Color = color,
  287.         Transparency = 1,
  288.         Filled = false,
  289.         Visible = self.Enabled and self.Boxes
  290.     })
  291.     box.Components["Name"] = Draw("Text", {
  292.         Text = box.Name,
  293.         Color = box.Color,
  294.         Center = true,
  295.         Outline = true,
  296.         Size = 19,
  297.         Visible = self.Enabled and self.Names
  298.     })
  299.     box.Components["Distance"] = Draw("Text", {
  300.         Color = box.Color,
  301.         Center = true,
  302.         Outline = true,
  303.         Size = 19,
  304.         Visible = self.Enabled and self.Names
  305.     })
  306.    
  307.     box.Components["Tracer"] = Draw("Line", {
  308.         Thickness = ESP.Thickness,
  309.         Color = box.Color,
  310.         Transparency = 1,
  311.         Visible = self.Enabled and self.Tracers
  312.     })
  313.     self.Objects[obj] = box
  314.    
  315.     obj.AncestryChanged:Connect(function(_, parent)
  316.         if parent == nil and ESP.AutoRemove ~= false then
  317.             box:Remove()
  318.         end
  319.     end)
  320.     obj:GetPropertyChangedSignal("Parent"):Connect(function()
  321.         if obj.Parent == nil and ESP.AutoRemove ~= false then
  322.             box:Remove()
  323.         end
  324.     end)
  325.  
  326.     local hum = obj:FindFirstChildOfClass("Humanoid")
  327.     if hum then
  328.         hum.Died:Connect(function()
  329.             if ESP.AutoRemove ~= false then
  330.                 box:Remove()
  331.             end
  332.         end)
  333.     end
  334.  
  335.     return box
  336. end
  337.  
  338. local function CharAdded(char)
  339.     local p = plrs:GetPlayerFromCharacter(char)
  340.     if not char:FindFirstChild("HumanoidRootPart") then
  341.         local ev
  342.         ev = char.ChildAdded:Connect(function(c)
  343.             if c.Name == "HumanoidRootPart" then
  344.                 ev:Disconnect()
  345.                 ESP:Add(char, {
  346.                     Name = p.Name,
  347.                     Player = p,
  348.                     PrimaryPart = c
  349.                 })
  350.             end
  351.         end)
  352.     else
  353.         ESP:Add(char, {
  354.             Name = p.Name,
  355.             Player = p,
  356.             PrimaryPart = char.HumanoidRootPart
  357.         })
  358.     end
  359. end
  360. local function PlayerAdded(p)
  361.     p.CharacterAdded:Connect(CharAdded)
  362.     if p.Character then
  363.         coroutine.wrap(CharAdded)(p.Character)
  364.     end
  365. end
  366. plrs.PlayerAdded:Connect(PlayerAdded)
  367. for i,v in pairs(plrs:GetPlayers()) do
  368.     if v ~= plr then
  369.         PlayerAdded(v)
  370.     end
  371. end
  372.  
  373. game:GetService("RunService").RenderStepped:Connect(function()
  374.     cam = workspace.CurrentCamera
  375.     for i,v in (ESP.Enabled and pairs or ipairs)(ESP.Objects) do
  376.         if v.Update then
  377.             local s,e = pcall(v.Update, v)
  378.             if not s then warn("[EU]", e, v.Object:GetFullName()) end
  379.         end
  380.     end
  381. end)
  382.  
  383. return ESP
Add Comment
Please, Sign In to add comment