
Key Required Verified

-- not the best as of right now, but i will definitely update this overtime.
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local LocalPlayer = Players.LocalPlayer
local Camera = workspace.CurrentCamera
local ESP = {
players = {}
}
local SHOW_DISTANCE = true
local SHOW_NAMES = true
local SHOW_BOXES = true
local SHOW_TRACERS = true
local MAX_DISTANCE = 500
local previousPositions = {}
function ESP:CreateDrawing(type, properties)
local drawing = Drawing.new(type)
for prop, value in pairs(properties) do
drawing[prop] = value
end
return drawing
end
function ESP:Add(player)
if player == LocalPlayer then return end
local drawings = {
boxTL = self:CreateDrawing("Line", {Thickness = 1}),
boxTR = self:CreateDrawing("Line", {Thickness = 1}),
boxBL = self:CreateDrawing("Line", {Thickness = 1}),
boxBR = self:CreateDrawing("Line", {Thickness = 1}),
boxTLv = self:CreateDrawing("Line", {Thickness = 1}),
boxTRv = self:CreateDrawing("Line", {Thickness = 1}),
boxBLv = self:CreateDrawing("Line", {Thickness = 1}),
boxBRv = self:CreateDrawing("Line", {Thickness = 1}),
tracer = self:CreateDrawing("Line", {Thickness = 1}),
name = self:CreateDrawing("Text", {
Size = 13,
Center = true,
Outline = false,
Font = 2
})
}
self.players[player] = drawings
end
function ESP:Remove(player)
local drawings = self.players[player]
if drawings then
for _, drawing in pairs(drawings) do
drawing:Remove()
end
self.players[player] = nil
end
previousPositions[tostring(player.UserId)] = nil
end
function ESP:GetTeamInfo(player)
local isTeammate = false
local teamName = "Enemy"
local color = Color3.fromRGB(255, 50, 50)
if player.Team then
if player.Team == LocalPlayer.Team and not player.Neutral then
isTeammate = true
teamName = "Teammate"
color = Color3.fromRGB(50, 255, 50)
else
teamName = player.Team.Name or "Enemy"
end
end
if string.lower(player.Name) == "killer" or string.find(string.lower(player.Name), "killer") then
teamName = "Killer"
color = Color3.fromRGB(255, 0, 0)
elseif string.find(string.lower(player.Name), "survivor") then
teamName = "Survivor"
color = Color3.fromRGB(0, 255, 0)
end
return isTeammate, teamName, color
end
function ESP:GetCharacterBounds(character)
local rootPart = character:FindFirstChild("HumanoidRootPart")
local head = character:FindFirstChild("Head")
if not rootPart or not head then
return 20, 45
end
local minX, maxX, minY, maxY, minZ, maxZ = rootPart.Position.X, rootPart.Position.X, rootPart.Position.Y, rootPart.Position.Y, rootPart.Position.Z, rootPart.Position.Z
for _, part in pairs(character:GetChildren()) do
if part:IsA("BasePart") then
local partPos = part.Position
local partSize = part.Size
minX = math.min(minX, partPos.X - partSize.X/2)
maxX = math.max(maxX, partPos.X + partSize.X/2)
minY = math.min(minY, partPos.Y - partSize.Y/2)
maxY = math.max(maxY, partPos.Y + partSize.Y/2)
end
end
local width = (maxX - minX) * 2
local height = (maxY - minY) * 1.5
width = math.clamp(width, 15, 35)
height = math.clamp(height, 40, 60)
return width, height
end
function ESP:Update()
for player, drawings in pairs(self.players) do
local character = player.Character
if not character then
for _, drawing in pairs(drawings) do
drawing.Visible = false
end
continue
end
local humanoid = character:FindFirstChildOfClass("Humanoid")
local head = character:FindFirstChild("Head")
local rootPart = character:FindFirstChild("HumanoidRootPart")
if not humanoid or not head or not rootPart or humanoid.Health <= 0 then
for _, drawing in pairs(drawings) do
drawing.Visible = false
end
continue
end
local currentPos = rootPart.Position
local playerKey = tostring(player.UserId)
if not previousPositions[playerKey] then
previousPositions[playerKey] = currentPos
end
local smoothFactor = 0.2
local smoothedPos = previousPositions[playerKey] + (currentPos - previousPositions[playerKey]) * smoothFactor
previousPositions[playerKey] = smoothedPos
local headPos, headVisible = Camera:WorldToViewportPoint(head.Position)
local rootPos, rootVisible = Camera:WorldToViewportPoint(smoothedPos)
if not headVisible or not rootVisible then
for _, drawing in pairs(drawings) do
drawing.Visible = false
end
continue
end
local distance = (LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart"))
and (LocalPlayer.Character.HumanoidRootPart.Position - smoothedPos).Magnitude
or 0
if distance > MAX_DISTANCE then
for _, drawing in pairs(drawings) do
drawing.Visible = false
end
continue
end
local isTeammate, teamName, color = self:GetTeamInfo(player)
local boxWidth, boxHeight = self:GetCharacterBounds(character)
local distanceScale = math.clamp(50 / (distance / 10), 0.8, 1.2)
boxWidth = boxWidth * distanceScale
boxHeight = boxHeight * distanceScale
boxWidth = math.max(boxWidth, 18)
boxHeight = math.max(boxHeight, 42)
local boxPos = Vector2.new(rootPos.X, rootPos.Y - boxHeight / 3)
local cornerLength = math.clamp(boxWidth * 0.3, 6, 10)
if SHOW_BOXES then
drawings.boxTL.From = Vector2.new(boxPos.X - boxWidth/2, boxPos.Y - boxHeight/2)
drawings.boxTL.To = Vector2.new(boxPos.X - boxWidth/2 + cornerLength, boxPos.Y - boxHeight/2)
drawings.boxTL.Color = color
drawings.boxTL.Visible = true
drawings.boxTLv.From = Vector2.new(boxPos.X - boxWidth/2, boxPos.Y - boxHeight/2)
drawings.boxTLv.To = Vector2.new(boxPos.X - boxWidth/2, boxPos.Y - boxHeight/2 + cornerLength)
drawings.boxTLv.Color = color
drawings.boxTLv.Visible = true
drawings.boxTR.From = Vector2.new(boxPos.X + boxWidth/2, boxPos.Y - boxHeight/2)
drawings.boxTR.To = Vector2.new(boxPos.X + boxWidth/2 - cornerLength, boxPos.Y - boxHeight/2)
drawings.boxTR.Color = color
drawings.boxTR.Visible = true
drawings.boxTRv.From = Vector2.new(boxPos.X + boxWidth/2, boxPos.Y - boxHeight/2)
drawings.boxTRv.To = Vector2.new(boxPos.X + boxWidth/2, boxPos.Y - boxHeight/2 + cornerLength)
drawings.boxTRv.Color = color
drawings.boxTRv.Visible = true
drawings.boxBL.From = Vector2.new(boxPos.X - boxWidth/2, boxPos.Y + boxHeight/2)
drawings.boxBL.To = Vector2.new(boxPos.X - boxWidth/2 + cornerLength, boxPos.Y + boxHeight/2)
drawings.boxBL.Color = color
drawings.boxBL.Visible = true
drawings.boxBLv.From = Vector2.new(boxPos.X - boxWidth/2, boxPos.Y + boxHeight/2)
drawings.boxBLv.To = Vector2.new(boxPos.X - boxWidth/2, boxPos.Y + boxHeight/2 - cornerLength)
drawings.boxBLv.Color = color
drawings.boxBLv.Visible = true
drawings.boxBR.From = Vector2.new(boxPos.X + boxWidth/2, boxPos.Y + boxHeight/2)
drawings.boxBR.To = Vector2.new(boxPos.X + boxWidth/2 - cornerLength, boxPos.Y + boxHeight/2)
drawings.boxBR.Color = color
drawings.boxBR.Visible = true
drawings.boxBRv.From = Vector2.new(boxPos.X + boxWidth/2, boxPos.Y + boxHeight/2)
drawings.boxBRv.To = Vector2.new(boxPos.X + boxWidth/2, boxPos.Y + boxHeight/2 - cornerLength)
drawings.boxBRv.Color = color
drawings.boxBRv.Visible = true
end
if SHOW_TRACERS then
drawings.tracer.From = Vector2.new(Camera.ViewportSize.X / 2, Camera.ViewportSize.Y)
drawings.tracer.To = Vector2.new(boxPos.X, boxPos.Y + boxHeight/2)
drawings.tracer.Color = color
drawings.tracer.Visible = true
end
if SHOW_NAMES then
local displayText = player.Name
if SHOW_DISTANCE then
displayText = string.format("%s [%d]", player.Name, math.floor(distance))
end
displayText = displayText .. "\n" .. teamName
drawings.name.Position = Vector2.new(boxPos.X, boxPos.Y - boxHeight/2 - 20)
drawings.name.Text = displayText
drawings.name.Color = Color3.fromRGB(255, 255, 255)
drawings.name.Visible = true
end
end
end
function ESP:Init()
self.players = {}
for _, player in pairs(Players:GetPlayers()) do
if player ~= LocalPlayer then
self:Add(player)
end
end
Players.PlayerAdded:Connect(function(player)
if player ~= LocalPlayer then
self:Add(player)
end
end)
Players.PlayerRemoving:Connect(function(player)
self:Remove(player)
end)
local frameCount = 0
RunService.RenderStepped:Connect(function()
frameCount = frameCount + 1
if frameCount % 2 == 0 then
self:Update()
end
end)
end
ESP:Init()
print(" [~] Created by Homless (Violence District ESP)")
print(" [~] Experiencing Issues Join our Discord -> https://discord.gg/t6AAJsHmV7")No comments yet for this script.