Run it
Copy the script and paste it into your executor.
version =
Players = :()
LocalPlayer = Players.LocalPlayer
RunService = :()
UserInputService = :()
ReplicatedStorage = :()
StarterGui = :()
TweenService = :()
CoreGui = :()
GuiService = :()
Teams = :()
guardsTeam = Teams:()
inmatesTeam = Teams:()
criminalsTeam = Teams:()
cfg = {
enabled = ,
teamcheck = ,
wallcheck = ,
deathcheck = ,
ffcheck = ,
hostilecheck = ,
trespasscheck = ,
vehiclecheck = ,
criminalsnoinnmates = ,
inmatesnocriminals = ,
shieldbreaker = ,
shieldfrontangle = ,
shieldrandomhead = ,
shieldheadchance = ,
taserbypasshostile = ,
taserbypasstrespass = ,
taseralwayshit = ,
ifplayerstill = ,
stillthreshold = ,
hitchance = ,
hitchanceAutoOnly = ,
distancebasedhitchance = ,
distancehitchancepoints = {},
distancehitchance1dist = ,
distancehitchance1value = ,
distancehitchance2dist = ,
distancehitchance2value = ,
distancehitchance3dist = ,
distancehitchance3value = ,
distancehitchance4dist = ,
distancehitchance4value = ,
distancehitchance5dist = ,
distancehitchance5value = ,
aimmaxdist = ,
missspread = ,
shotgunnaturalspread = ,
shotgungamehandled = ,
prioritizeclosest = ,
prioritizecriminals = ,
targetstickiness = ,
targetstickinessduration = ,
targetstickinessrandom = ,
targetstickinessmin = ,
targetstickinessmax = ,
fov = ,
showfov = ,
staticfov = ,
showtargetline = ,
togglekey = .KeyCode.RightShift,
aimpart = ,
randomparts = ,
partslist = {, , , , , , },
esp = ,
espteamcheck = ,
espshowteam = ,
esptargets = {guards = , inmates = , criminals = },
espmaxdist = ,
espshowdist = ,
esptoggle = .KeyCode.RightControl,
espcolor = .(, , ),
espguards = .(, , ),
espinmates = .(, , ),
espcriminals = .(, , ),
espteam = .(, , ),
espuseteamcolors = ,
autoshoot = ,
autoshootweapon = ,
autoshootdelay = ,
autoshootstartdelay = ,
autograb = ,
autograbdistance = ,
autograbdelay = ,
autograbkeycard = ,
autograbm9 = ,
c4esp = ,
c4esptoggle = .KeyCode.B,
c4espcolor = .(, , ),
c4espmaxdist = ,
c4espshowdist =
}
(value)
(value) ~=
value
copy = {}
key, nestedValue (value)
copy[key] = (nestedValue)
copy
defaultCfg = (cfg)
wallParams = RaycastParams.()
wallParams.FilterType = .RaycastFilterType.Exclude
wallParams.IgnoreWater =
wallParams.RespectCanCollide =
wallParams.CollisionGroup =
projectileParams = RaycastParams.()
projectileParams.FilterType = .RaycastFilterType.Exclude
projectileParams.IgnoreWater =
projectileParams.RespectCanCollide =
projectileParams.CollisionGroup =
currentGun =
rng = Random.()
lastShotTime =
lastShotResult =
shotCooldown = /
currentTarget =
targetSwitchTime =
currentStickiness =
randomPartCache = {}
lastTouchAimPos =
activeTouch =
mobileGuiButton =
mobileGuiDragInput =
lastAutoShoot =
cachedBulletsLabel =
targetAcquiredTime =
lastAutoTarget =
lastReloadRequest =
playerSettings = ReplicatedStorage:()
mobileCursorOffset =
isInsideDynThumbFrame =
giverPressedRemote = ReplicatedStorage:() ReplicatedStorage.Remotes:()
trackedGrabbables = {}
firstSeenGrabbables = {}
lastAutoGrab =
sharedModules = ReplicatedStorage:()
dynThumbModule = sharedModules sharedModules:()
dynThumbModule
ok, result = (, dynThumbModule)
ok (result) ==
isInsideDynThumbFrame = result
fovCircle = .()
fovCircle.Color = .(, , )
fovCircle.Radius = cfg.fov
fovCircle.Transparency =
fovCircle.Filled =
fovCircle.NumSides =
fovCircle.Thickness =
fovCircle.Visible = cfg.showfov cfg.enabled
targetLine = .()
targetLine.Color = .(, , )
targetLine.Thickness =
targetLine.Transparency =
targetLine.Visible =
visuals = {container = }
espCache = {}
uiElements = {}
resolveMacLibWindowGui
selectedDistanceHitchancePoint =
syncingDistanceHitchanceEditor =
storedAimMaxDistanceBeforeDistanceHitchance = (cfg.aimmaxdist)
distanceHitchanceForcesAimMaxDistance =
(value)
.(value - .(value)) <
(.(value))
.(, value)
(points)
copy = {}
_, point (points {})
copy[#copy + ] = {
distance = point.distance,
chance = point.chance
}
copy
(points)
baseChance = .((cfg.hitchance) , , )
normalized = {}
(points) ==
_, point (points)
(point) ==
normalized[#normalized + ] = {
distance = .((point.distance point.dist point[]) , ),
chance = .((point.chance point.value point[]) baseChance, , )
}
.(normalized, (a, b)
a.distance < b.distance
)
normalized
()
baseChance = .((cfg.hitchance) , , )
({
{distance = .((cfg.distancehitchance1dist) , ), chance = .((cfg.distancehitchance1value) baseChance, , )},
{distance = .((cfg.distancehitchance2dist) , ), chance = .((cfg.distancehitchance2value) baseChance, , )},
{distance = .((cfg.distancehitchance3dist) , ), chance = .((cfg.distancehitchance3value) baseChance, , )},
{distance = .((cfg.distancehitchance4dist) , ), chance = .((cfg.distancehitchance4value) baseChance, , )},
{distance = .((cfg.distancehitchance5dist) , ), chance = .((cfg.distancehitchance5value) baseChance, , )}
})
()
points = (cfg.distancehitchancepoints)
#points ==
points = ()
points
()
points = ()
#points ==
points = {
{distance = , chance = }
}
cfg.distancehitchancepoints = (points)
cfg.distancehitchancepoints
(point, index)
.(
,
index,
(point.distance),
(point.chance)
)
()
syncingDistanceHitchanceEditor
syncingDistanceHitchanceEditor =
points = ()
selectedDistanceHitchancePoint = .(selectedDistanceHitchancePoint, , .(#points, ))
labels = {}
index, point (points)
labels[index] = (point, index)
uiElements.DistanceHitchancePointDropdown
uiElements.DistanceHitchancePointDropdown.ClearOptions
uiElements.DistanceHitchancePointDropdown:()
uiElements.DistanceHitchancePointDropdown.InsertOptions
uiElements.DistanceHitchancePointDropdown:(labels)
labels[selectedDistanceHitchancePoint] uiElements.DistanceHitchancePointDropdown.UpdateSelection
uiElements.DistanceHitchancePointDropdown:(labels[selectedDistanceHitchancePoint])
selectedPoint = points[selectedDistanceHitchancePoint]
selectedPoint
uiElements.SelectedDistancePointDistanceSlider
uiElements.SelectedDistancePointDistanceSlider:(selectedPoint.distance)
uiElements.SelectedDistancePointHitchanceSlider
uiElements.SelectedDistancePointHitchanceSlider:(selectedPoint.chance)
syncingDistanceHitchanceEditor =
(enabled)
enabled
distanceHitchanceForcesAimMaxDistance
storedAimMaxDistanceBeforeDistanceHitchance = (cfg.aimmaxdist)
cfg.distancebasedhitchance =
cfg.aimmaxdist =
distanceHitchanceForcesAimMaxDistance =
cfg.distancebasedhitchance =
distanceHitchanceForcesAimMaxDistance
cfg.aimmaxdist = (storedAimMaxDistanceBeforeDistanceHitchance)
distanceHitchanceForcesAimMaxDistance =
()
currentAimMaxDistance = (cfg.aimmaxdist)
cfg.distancebasedhitchance
currentAimMaxDistance >
storedAimMaxDistanceBeforeDistanceHitchance = currentAimMaxDistance
storedAimMaxDistanceBeforeDistanceHitchance <=
storedAimMaxDistanceBeforeDistanceHitchance = (defaultCfg.aimmaxdist)
cfg.aimmaxdist =
distanceHitchanceForcesAimMaxDistance =
storedAimMaxDistanceBeforeDistanceHitchance = currentAimMaxDistance
distanceHitchanceForcesAimMaxDistance =
()
cfg.hitchance =
()
cfg.distancehitchancepoints = {
{distance = , chance = },
{distance = , chance = },
{distance = , chance = },
{distance = , chance = },
{distance = , chance = },
{distance = , chance = },
{distance = , chance = }
}
selectedDistanceHitchancePoint =
()
cfg.hitchance =
()
cfg.distancehitchancepoints = {
{distance = , chance = },
{distance = , chance = },
{distance = , chance = },
{distance = , chance = },
{distance = , chance = },
{distance = , chance = },
{distance = , chance = }
}
selectedDistanceHitchancePoint =
()
lastShotTime =
lastShotResult =
currentTarget =
targetSwitchTime =
currentStickiness =
lastAutoShoot =
lastAutoTarget =
targetAcquiredTime =
cachedBulletsLabel =
()
playerGui = LocalPlayer:()
home = playerGui playerGui:()
home home:()
()
hud = ()
hud hud:()
()
mobileGunFrame = ()
mobileGunFrame mobileGunFrame:()
()
playerSettings
mobileCursorOffset =
offset = playerSettings:()
(offset) ==
mobileCursorOffset = offset *
mobileCursorOffset =
playerSettings
()
playerSettings:():(updateMobileCursorOffset)
(position)
mobileGuiDragInput
isInsideDynThumbFrame (position.X, position.Y)
mobileGuiButton mobileGuiButton.Parent mobileGuiButton.Visible
x = position.X
y = position.Y
left = mobileGuiButton.AbsolutePosition.X
right = left + mobileGuiButton.AbsoluteSize.X
top = mobileGuiButton.AbsolutePosition.Y
bottom = top + mobileGuiButton.AbsoluteSize.Y
left <= x x <= right top <= y y <= bottom
resolveMacLibWindowGui
windowGui = ()
windowGui windowGui.Enabled
ok, guiObjects = (()
GuiService:(position.X, position.Y)
)
ok guiObjects
_, guiObject (guiObjects)
guiObject:(windowGui)
mobileGunFrame = ()
ignoreTouchArea = mobileGunFrame mobileGunFrame:()
ignoreTouchArea
x = position.X
y = position.Y
left = ignoreTouchArea.AbsolutePosition.X
right = left + ignoreTouchArea.AbsoluteSize.X
top = ignoreTouchArea.AbsolutePosition.Y
bottom = top + ignoreTouchArea.AbsoluteSize.Y
left <= x x <= right top <= y y <= bottom
(camera)
camera = camera .CurrentCamera
camera
UserInputService:()
lastInput = UserInputService:()
UserInputService.MouseBehavior == .MouseBehavior.LockCenter
viewportSize = camera.ViewportSize
.(viewportSize.X / , viewportSize.Y / )
lastInput == .UserInputType.Touch
mobileCursor = ()
mobileCursor mobileCursor.Visible
pos = mobileCursor.AbsolutePosition
size = mobileCursor.AbsoluteSize
.(pos.X + size.X / , pos.Y + size.Y / )
viewportSize = camera.ViewportSize
.(viewportSize.X / , viewportSize.Y / )
UserInputService:()
(camera)
camera = camera .CurrentCamera
camera
.zero
viewportSize = camera.ViewportSize
.(viewportSize.X / , viewportSize.Y / )
(camera)
cfg.staticfov
(camera)
(camera)
(gun)
gun gun:() ==
(gun)
gun (gun:() == gun:() == )
(gun)
gun (gun:() gun:() == )
(gun)
gun gun:() ==
(value)
(value ):():(, )
(gun)
gun
selector = (cfg.autoshootweapon)
selector == selector == selector ==
gunName = (gun.Name)
behavior = (gun:())
projectile = (gun:())
selector ==
(gun) gunName:(, , ) ~=
selector ==
(gun)
selector ==
(gun)
selector == selector ==
(gun)
selector == gunName selector == behavior selector == projectile
()
character = LocalPlayer.Character
character
character:() character:()
(targetPos)
maxDistance = (cfg.aimmaxdist)
maxDistance <= targetPos
originPart = ()
originPart
(targetPos - originPart.Position).Magnitude <= maxDistance
(gun)
gun ~= cfg.hitchanceAutoOnly (gun)
()
character = LocalPlayer.Character
character character:()
(gun)
(gun)
UserInputService.MouseBehavior ~= .MouseBehavior.LockCenter
humanoid = ()
humanoid humanoid:() ~= .HumanoidStateType.Freefall
()
myChar = LocalPlayer.Character
myHead = myChar myChar:()
myHead
muzzle = currentGun currentGun:()
muzzle muzzle.Position myHead.Position
(targetPos, originPos)
currentGun targetPos
range = currentGun:()
(range) ~= range <=
originPos = originPos ()
originPos
(targetPos - originPos).Magnitude <= range +
(obj)
obj obj:()
name = obj.Name:()
name:(, , ) ~= name ==
(obj)
cfg.autograb obj obj:()
name = obj.Name:()
name:(, , ) ~=
cfg.autograbkeycard
name ==
cfg.autograbm9
(obj)
ancestor = obj obj.Parent
ancestor ancestor ~=
ancestor:()
ancestor.Name ==
ancestor = ancestor.Parent
(model)
model
model.PrimaryPart model:(, )
(a, b)
delta = a - b
delta.X * delta.X + delta.Y * delta.Y + delta.Z * delta.Z
(obj)
(obj)
trackedGrabbables[obj] =
(obj)
trackedGrabbables[obj] =
firstSeenGrabbables[obj] =
(now)
cfg.autograb giverPressedRemote
now - lastAutoGrab <
root = ()
root
grabDistance = .((cfg.autograbdistance) , , )
grabDistance <=
requiredDelay = .((cfg.autograbdelay) , )
grabDistanceSq = grabDistance * grabDistance
item (trackedGrabbables)
item item.Parent
(item)
(item)
firstSeenGrabbables[item] =
(item)
firstSeenGrabbables[item] =
part = (item)
part (root.Position, part.Position) <= grabDistanceSq
firstSeenGrabbables[item]
firstSeenGrabbables[item] = now
now - firstSeenGrabbables[item] >= requiredDelay
lastAutoGrab = now
firstSeenGrabbables[item] =
(giverPressedRemote.FireServer, giverPressedRemote, item)
firstSeenGrabbables[item] =
(gun)
gun
lastInput = UserInputService:()
lastInput == .UserInputType.Touch lastInput == .UserInputType.Gamepad1 (gun)
(startPos, aimPos, gun)
gun startPos aimPos
, aimPos
behavior = gun:()
spread = gun:()
range = gun:()
randomScale = rng:()
behavior == behavior ==
randomScale = .(randomScale)
baseCFrame = .(startPos, aimPos)
rollAngle = .( - * rng:())
direction = (baseCFrame * .(, , rollAngle) * .(, randomScale * spread, )).LookVector * range
projectileParams.FilterDescendantsInstances = {LocalPlayer.Character}
result = :(startPos, direction, projectileParams)
result
result.Instance, result.Position
, startPos + direction
()
container
guiParent = (gethui ()) CoreGui
existing = guiParent:() CoreGui:()
existing
existing:()
gethui
screen = .()
screen.Name =
screen.ResetOnSpawn =
screen.Parent = ()
container = screen
.protect_gui
screen = .()
screen.Name =
screen.ResetOnSpawn =
.(screen)
screen.Parent = CoreGui
container = screen
screen = .()
screen.Name =
screen.ResetOnSpawn =
screen.Parent = CoreGui
container = screen
visuals.container = container
(player)
espCache[player] espCache[player]
esp = .()
esp.Name = .. player.Name
esp.AlwaysOnTop =
esp.Size = .(, , , )
esp.StudsOffset = .(, , )
esp.LightInfluence =
diamond = .()
diamond.Name =
diamond.BackgroundColor3 = cfg.espcolor
diamond.BorderSizePixel =
diamond.Size = .(, , , )
diamond.Position = .(, -, , -)
diamond.Rotation =
diamond.Parent = esp
stroke = .()
stroke.Color = .(, , )
stroke.Thickness =
stroke.Transparency =
stroke.Parent = diamond
distLabel = .()
distLabel.Name =
distLabel.BackgroundTransparency =
distLabel.Size = .(, , , )
distLabel.Position = .(, -, , )
distLabel.Font = .Font.GothamBold
distLabel.TextSize =
distLabel.TextColor3 = .(, , )
distLabel.TextStrokeTransparency =
distLabel.TextStrokeColor3 = .(, , )
distLabel.Text =
distLabel.Parent = esp
nameLabel = .()
nameLabel.Name =
nameLabel.BackgroundTransparency =
nameLabel.Size = .(, , , )
nameLabel.Position = .(, -, , -)
nameLabel.Font = .Font.GothamBold
nameLabel.TextSize =
nameLabel.TextColor3 = .(, , )
nameLabel.TextStrokeTransparency =
nameLabel.TextStrokeColor3 = .(, , )
nameLabel.Text = player.Name
nameLabel.Parent = esp
espCache[player] = esp
esp
(player)
e = espCache[player]
e e:() espCache[player] =
player player.Character
randomPartCache[player.Character] =
currentTarget == player
currentTarget =
lastAutoTarget == player
lastAutoTarget =
(player)
player player == LocalPlayer player.Character
humanoid = player.Character:()
humanoid humanoid.Health <=
hrp = player.Character:()
hrp
myChar = LocalPlayer.Character
myChar
myHrp = myChar:()
myHrp
distance = (hrp.Position - myHrp.Position).Magnitude
espMaxDistance = (cfg.espmaxdist)
espMaxDistance > distance > espMaxDistance
myTeam = LocalPlayer.Team
theirTeam = player.Team
theirTeam == myTeam
cfg.espshowteam
cfg.espteamcheck
imCrimOrInmate = (myTeam == criminalsTeam myTeam == inmatesTeam)
theyCrimOrInmate = (theirTeam == criminalsTeam theirTeam == inmatesTeam)
imCrimOrInmate theyCrimOrInmate
theirTeam == guardsTeam cfg.esptargets.guards
theirTeam == inmatesTeam cfg.esptargets.inmates
theirTeam == criminalsTeam cfg.esptargets.criminals
()
cfg.esp visuals.container
_, e (espCache) e.Parent =
myChar = LocalPlayer.Character
myHrp = myChar myChar:()
_, player (Players:())
show = (player)
show
char = player.Character
hrp = char char:()
head = char char:()
hrp head
esp = (player)
esp.Adornee = head
esp.Parent = visuals.container
d = esp:()
d cfg.espuseteamcolors
t = player.Team
t == LocalPlayer.Team d.BackgroundColor3 = cfg.espteam
t == guardsTeam d.BackgroundColor3 = cfg.espguards
t == inmatesTeam d.BackgroundColor3 = cfg.espinmates
t == criminalsTeam d.BackgroundColor3 = cfg.espcriminals
d.BackgroundColor3 = cfg.espcolor
cfg.espshowdist myHrp
label = esp:()
label
label.Text = .((hrp.Position - myHrp.Position).Magnitude) ..
label.Visible =
label = esp:()
label
label.Visible =
e = espCache[player]
e e.Parent =
c4espCache = {}
(c4Part)
c4espCache[c4Part] c4espCache[c4Part]
esp = .()
esp.Name = .. (c4Part)
esp.AlwaysOnTop =
esp.Size = .(, , , )
esp.StudsOffset = .(, , )
esp.LightInfluence =
icon = .()
icon.Name =
icon.BackgroundColor3 = cfg.c4espcolor
icon.BorderSizePixel =
icon.Size = .(, , , )
icon.Position = .(, -, , -)
icon.Rotation =
icon.Parent = esp
stroke = .()
stroke.Color = .(, , )
stroke.Thickness =
stroke.Transparency =
stroke.Parent = icon
label = .()
label.Name =
label.BackgroundTransparency =
label.Size = .(, , , )
label.Position = .(, -, , )
label.Font = .Font.GothamBold
label.TextSize =
label.TextColor3 = .(, , )
label.TextStrokeTransparency =
label.TextStrokeColor3 = .(, , )
label.Text =
label.Parent = esp
distLabel = .()
distLabel.Name =
distLabel.BackgroundTransparency =
distLabel.Size = .(, , , )
distLabel.Position = .(, -, , )
distLabel.Font = .Font.GothamBold
distLabel.TextSize =
distLabel.TextColor3 = cfg.c4espcolor
distLabel.TextStrokeTransparency =
distLabel.TextStrokeColor3 = .(, , )
distLabel.Text =
distLabel.Parent = esp
c4espCache[c4Part] = esp
esp
trackedC4s = {}
(part)
part part:()
name = part.Name:()
parentName = part.Parent part.Parent.Name:()
name == name == name ==
parentName:() name:()
(desc)
(desc)
trackedC4s[desc] =
(desc)
trackedC4s[desc] =
c4espCache[desc]
c4espCache[desc]:()
c4espCache[desc] =
_, desc (:())
(desc) trackedC4s[desc] =
(desc)
.DescendantAdded:(onDescendantAdded)
.DescendantRemoving:(onDescendantRemoving)
.DescendantAdded:(trackGrabbable)
.DescendantRemoving:(untrackGrabbable)
()
cfg.c4esp visuals.container
_, e (c4espCache) e.Parent =
myChar = LocalPlayer.Character
myHrp = myChar myChar:()
part (trackedC4s)
part part:()
dist =
myHrp
dist = (part.Position - myHrp.Position).Magnitude
c4MaxDistance = (cfg.c4espmaxdist)
c4MaxDistance <= dist <= c4MaxDistance
esp = (part)
esp.Adornee = part
esp.Parent = visuals.container
cfg.c4espshowdist myHrp
distLabel = esp:()
distLabel
distLabel.Text = .(dist) ..
distLabel = esp:()
distLabel
distLabel.Text =
e = c4espCache[part]
e e.Parent =
trackedC4s[part] =
c4espCache[part]
c4espCache[part]:()
c4espCache[part] =
()
partMap = {
[] = {},
[] = {},
[] = {},
[] = {},
[] = {}
}
(name)
(name ):(, )
(char, name)
char
p = char:(name)
p p
maps = partMap[(name)]
maps
_, n (maps)
part = char:(n)
part part
char:() char:()
(char)
char
char:()
char:()
char:()
(char)
char
(currentGun)
(char)
cfg.shieldbreaker
shield = char:()
shield shield:()
hp = shield:()
hp hp >
myChar = LocalPlayer.Character
myHrp = myChar myChar:()
theirHrp = char:()
myHrp theirHrp
toMe = (myHrp.Position - theirHrp.Position).Unit
theirLook = theirHrp.CFrame.LookVector
dot = toMe:(theirLook)
dot > cfg.shieldfrontangle
cfg.shieldrandomhead rng:(, ) <= cfg.shieldheadchance
(char, )
shield
partName
cfg.randomparts
cached = randomPartCache[char]
cached cached.part cached.part.Parent == char cached.expiresAt > .()
cached.part
list = cfg.partslist
partName = (list #list > ) list[rng:(, #list)]
partName = cfg.aimpart
part = (char, partName)
cfg.randomparts part
randomPartCache[char] = {
part = part,
partName = partName,
expiresAt = .() +
}
part
(player)
player player.Character
humanoid = player.Character:()
humanoid humanoid.Health <=
(player)
player player.Character
hrp = player.Character:()
hrp
vel = hrp.AssemblyLinearVelocity
.(vel.X, vel.Z).Magnitude <= cfg.stillthreshold
(player)
player player.Character
player.Character:() ~=
(player)
player player.Character
humanoid = player.Character:()
humanoid
humanoid.SeatPart ~=
(startPos, endPos, targetChar)
myChar = LocalPlayer.Character
myChar
filter = {myChar}
targetChar .(filter, targetChar)
wallParams.FilterDescendantsInstances = filter
direction = endPos - startPos
distance = direction.Magnitude
distance <=
unit = direction.Unit
currentStart = startPos
remaining = distance
_ = ,
result = :(currentStart, unit * remaining, wallParams)
result
hit = result.Instance
hit.Transparency < hit.CanCollide
hitDist = (result.Position - currentStart).Magnitude
remaining = remaining - hitDist -
remaining <=
currentStart = result.Position + unit *
(player)
player player == LocalPlayer player.Character
targetPart = (player.Character)
targetPart
(targetPart.Position)
(targetPart.Position)
cfg.deathcheck (player)
cfg.ffcheck (player)
cfg.vehiclecheck (player)
cfg.teamcheck player.Team == LocalPlayer.Team
cfg.criminalsnoinnmates
LocalPlayer.Team == criminalsTeam player.Team == inmatesTeam
cfg.inmatesnocriminals
LocalPlayer.Team == inmatesTeam player.Team == criminalsTeam
cfg.hostilecheck cfg.trespasscheck
isTaser = (currentGun)
bypassHostile = cfg.taserbypasshostile isTaser
bypassTrespass = cfg.taserbypasstrespass isTaser
targetChar = player.Character
LocalPlayer.Team == guardsTeam player.Team == inmatesTeam
hostile = targetChar:()
trespass = targetChar:()
cfg.hostilecheck cfg.trespasscheck
bypassHostile bypassTrespass
hostile trespass
cfg.hostilecheck bypassHostile
hostile
cfg.trespasscheck bypassTrespass
trespass
(player)
(player)
cfg.wallcheck
myChar = LocalPlayer.Character
myHead = myChar myChar:()
targetPart = (player.Character)
myHead targetPart
(myHead.Position, targetPart.Position, player.Character)
(chanceOverride)
lastShotTime = .()
chance = .((chanceOverride) (cfg.hitchance) , , )
chance >=
lastShotResult =
chance <=
lastShotResult =
lastShotResult = rng:(, ) <= chance
lastShotResult
(targetPart, originPos)
baseChance = .((cfg.hitchance) , , )
cfg.distancebasedhitchance
baseChance
targetPart
baseChance
origin = originPos ()
origin
originPart = ()
origin = originPart originPart.Position
origin
baseChance
distance = (targetPart.Position - origin).Magnitude
selectedChance = baseChance
points = ()
_, point (points)
point.distance > distance >= point.distance
selectedChance = point.chance
selectedChance
(startPos, targetPartOrPos)
targetPart = (targetPartOrPos) == targetPartOrPos:() targetPartOrPos
targetPos = targetPart targetPart.Position targetPartOrPos
targetPos startPos
toTarget = targetPos - startPos
toTarget.Magnitude <=
targetPos + .(cfg.missspread + , , )
direction = toTarget.Unit
reference = .(direction.Y) > .(, , ) .(, , )
right = direction:(reference)
right.Magnitude <=
right = .(, , )
right = right.Unit
up = right:(direction)
up.Magnitude <=
up = .(, , )
up = up.Unit
partRadius = targetPart .(targetPart.Size.X, targetPart.Size.Y, targetPart.Size.Z) *
missRadius = .(cfg.missspread, partRadius + )
angle = rng:(, .pi * )
offset = right * .(angle) * missRadius + up * .(angle) * missRadius
targetPos + offset
(player)
cfg.prioritizecriminals
player.Team == criminalsTeam
player.Team == inmatesTeam
(fovRadius)
fovRadius = fovRadius cfg.fov
camera = .CurrentCamera
camera ,
aimPos = (camera)
now = .()
cfg.targetstickiness currentTarget (now - targetSwitchTime) < currentStickiness
(currentTarget)
part = (currentTarget.Character)
part
screenPos, onScreen = camera:(part.Position)
onScreen screenPos.Z >
dist = (.(screenPos.X, screenPos.Y) - aimPos).Magnitude
dist < fovRadius
currentTarget, part.Position
candidates = {}
_, player (Players:())
(player)
part = (player.Character)
part
screenPos, onScreen = camera:(part.Position)
onScreen screenPos.Z >
dist = (.(screenPos.X, screenPos.Y) - aimPos).Magnitude
dist < fovRadius
candidates[#candidates + ] = {
player = player,
dist = dist,
part = part,
priority = (player)
}
cfg.prioritizeclosest
.(candidates, (a, b)
a.priority ~= b.priority
a.priority < b.priority
a.dist < b.dist
)
bestPriority = .huge
_, candidate (candidates)
candidate.priority < bestPriority
bestPriority = candidate.priority
bestPriority < .huge
prioritizedCandidates = {}
_, candidate (candidates)
candidate.priority == bestPriority
prioritizedCandidates[#prioritizedCandidates + ] = candidate
candidates = prioritizedCandidates
i = #candidates, , -
j = rng:(, i)
candidates[i], candidates[j] = candidates[j], candidates[i]
_, candidate (candidates)
(candidate.player)
part = (candidate.player.Character)
part
candidate.player ~= currentTarget
currentTarget = candidate.player
targetSwitchTime = now
cfg.targetstickinessrandom
currentStickiness = rng:(cfg.targetstickinessmin, cfg.targetstickinessmax)
currentStickiness = cfg.targetstickinessduration
candidate.player, part.Position
currentTarget =
,
ShootEvent = ReplicatedStorage:():()
ReloadRemote = ReplicatedStorage:():()
Debris = :()
(startPos, endPos, isTaser)
distance = (endPos - startPos).Magnitude
trail = .()
trail.Name =
trail.Anchored =
trail.CanCollide =
trail.CanQuery =
trail.CanTouch =
trail.Material = .Material.Neon
trail.Size = .(, , distance)
trail.CFrame = .(startPos, endPos) * .(, , -distance / )
trail.Transparency =
isTaser
trail.BrickColor = BrickColor.()
trail.Size = .(, , distance)
light = .()
light.Color = .(, , )
light.Range =
light.Brightness =
light.Face = .NormalId.Bottom
light.Parent = trail
trail.BrickColor = BrickColor.()
trail.Parent =
Debris:(trail, isTaser )
()
cachedBulletsLabel cachedBulletsLabel.Parent
cachedBulletsLabel
cachedBulletsLabel =
playerGui = LocalPlayer:()
home = playerGui playerGui:()
hud = home home:()
bottomRight = hud hud:()
gunFrame = bottomRight bottomRight:()
cachedBulletsLabel = gunFrame gunFrame:()
cachedBulletsLabel
(gun)
now = .()
now - lastReloadRequest <
gun gun:() ~=
storedAmmo = gun:()
(storedAmmo) == storedAmmo <=
lastReloadRequest = now
.(()
(()
ReloadRemote:()
)
)
()
gun = currentGun
cfg.autoshoot cfg.enabled gun
gun.Parent ~= LocalPlayer.Character
(gun)
lastAutoTarget =
now = .()
reloadSession = gun:()
reloadSession ~= gun:()
(gun)
fireRate = .(gun:() , cfg.autoshootdelay)
now - lastAutoShoot < fireRate
myChar = LocalPlayer.Character
myChar
myHead = myChar:()
myHead
muzzle = currentGun:()
startPos = muzzle muzzle.Position myHead.Position
target, targetPos = (cfg.fov)
target (target)
lastAutoTarget =
target ~= lastAutoTarget
targetAcquiredTime = now
lastAutoTarget = target
acquireDelay = (gun) cfg.autoshootstartdelay
requiredDelay = .(acquireDelay, gun:() )
now - targetAcquiredTime < requiredDelay
targetPart = (target.Character)
targetPart
weaponRange = gun:()
weaponRange (targetPart.Position - startPos).Magnitude > weaponRange +
ammo = gun:() gun:()
ammo <=
(gun)
lastAutoShoot = now
isTaser = (gun)
sniper = (gun)
shotgun = (gun)
shouldHit =
cfg.taseralwayshit isTaser
shouldHit =
cfg.ifplayerstill (target)
shouldHit =
(gun)
shouldHit =
shouldHit = ((targetPart, startPos))
projectileCount = currentGun:()
shots = {}
i = , projectileCount
aimPoint
shouldHit
aimPoint = targetPart.Position
cfg.missspread >
aimPoint = (startPos, targetPart)
hitPart = shouldHit targetPart
finalPos = aimPoint
shouldHit
isTaser
simulatedHit, simulatedPos = (startPos, aimPoint, gun)
finalPos = simulatedPos
hitPart = simulatedHit targetPart
shotgun cfg.shotgunnaturalspread
simulatedHit, simulatedPos = (startPos, aimPoint, gun)
finalPos = simulatedPos
hitPart = simulatedHit targetPart
shots[i] = {myHead.Position, finalPos, hitPart}
(startPos, finalPos, isTaser)
ShootEvent:(shots)
gun ~= currentGun gun.Parent ~= LocalPlayer.Character
newAmmo = ammo -
gun:(, newAmmo)
bulletsLabel = ()
bulletsLabel
sniper
bulletsLabel.Text = newAmmo .. .. (gun:() )
bulletsLabel.Text = newAmmo .. .. (gun:() )
handle = gun:()
handle
shootSound = handle:()
shootSound
sound = shootSound:()
sound.Parent = handle
sound:()
Debris:(sound, )
()
char = LocalPlayer.Character
char
children = char:()
index = #children, , -
tool = children[index]
tool:() tool:() ==
tool
(title, text, duration)
(()
StarterGui:(, {
Title = title,
Text = text,
Duration = duration
})
)
lastGun =
RunService.Heartbeat:(()
now = .()
currentGun = ()
currentGun ~= lastGun
()
lastGun = currentGun
(now)
()
)
UserInputService.InputBegan:((input, gameProcessed)
gameProcessed
input.KeyCode == cfg.togglekey
cfg.enabled = cfg.enabled
uiElements.SilentAimToggle uiElements.SilentAimToggle:(cfg.enabled)
(, .. (cfg.enabled), )
input.KeyCode == cfg.esptoggle
cfg.esp = cfg.esp
uiElements.EspToggle uiElements.EspToggle:(cfg.esp)
(, .. (cfg.esp), )
input.KeyCode == cfg.c4esptoggle
cfg.c4esp = cfg.c4esp
uiElements.C4EspToggle uiElements.C4EspToggle:(cfg.c4esp)
(, .. (cfg.c4esp), )
)
RunService.PreRender:(()
camera = .CurrentCamera
fovPos = (camera)
fovCircle.Position = fovPos
fovCircle.Radius = cfg.fov
fovCircle.Visible = cfg.showfov cfg.enabled
cfg.showtargetline cfg.enabled
target, targetPos = ()
target targetPos camera
screenPos, onScreen = camera:(targetPos)
onScreen
targetLine.From = fovPos
targetLine.To = .(screenPos.X, screenPos.Y)
targetLine.Visible =
targetLine.Visible =
targetLine.Visible =
targetLine.Visible =
()
()
)
Players.PlayerRemoving:(removeEsp)
(player)
player.CharacterRemoving:((char)
randomPartCache[char] =
currentTarget currentTarget == player
currentTarget =
lastAutoTarget lastAutoTarget == player
lastAutoTarget =
)
_, player (Players:())
(player)
Players.PlayerAdded:(bindPlayer)
()
player, e (espCache)
e e:()
espCache[player] =
randomPartCache = {}
currentTarget =
LocalPlayer:():(()
()
()
)
(fn)
(...) (...)
origCastRay
hooked =
()
castRayFunc = (, {Name = }, )
castRayFunc
origCastRay = (castRayFunc, ((startPos, targetPos, ...)
cfg.enabled (startPos, targetPos, ...)
closest = (cfg.fov)
closest closest.Character
gun = currentGun
gun
(startPos, targetPos, ...)
isTaser = (gun)
shotgun = (gun)
sniperStable = (gun)
shouldHit =
bypassHitchance = (gun)
targetPart = (closest.Character)
targetPart
(startPos, targetPos, ...)
(targetPart.Position, startPos)
(startPos, targetPos, ...)
cfg.shotgungamehandled shotgun
(startPos, targetPart.Position, ...)
cfg.taseralwayshit isTaser
shouldHit =
cfg.ifplayerstill (closest)
shouldHit =
bypassHitchance
shouldHit =
shouldHit = ((targetPart, startPos))
shouldHit
(gun) sniperStable
(startPos, targetPart.Position, ...)
isTaser
(startPos, targetPart.Position, ...)
cfg.shotgunnaturalspread shotgun
(startPos, targetPart.Position, ...)
targetPart, targetPart.Position
cfg.missspread >
missPos = (startPos, targetPart)
(startPos, missPos, ...)
(startPos, targetPos, ...)
(startPos, targetPos, ...)
))
()
.(()
hooked
.()
()
hooked =
)
hooked =
(, , )
(source, oldText, newText)
startIndex = .(source, oldText, , )
startIndex
source,
endIndex = startIndex + #oldText -
.(source, , startIndex - ) .. newText .. .(source, endIndex + ),
()
source = :()
source = (, (
source,
,
))
source = (, (
source,
,
))
source = (, (
source,
,
))
(source)()
MacLib = ()
Folder =
()
viewport = .CurrentCamera .CurrentCamera.ViewportSize .(, )
UserInputService.TouchEnabled
maxWidth = .(, .(, viewport.X - ))
maxHeight = .(, .(, viewport.Y - ))
minWidth = .(, maxWidth)
minHeight = .(, maxHeight)
width = .(.(viewport.X * , minWidth, maxWidth))
height = .(.(viewport.Y * , minHeight, maxHeight))
.(width, height)
.(, )
Window = MacLib:({
Title = ,
Subtitle = ,
Size = .(, ),
DragStyle = ,
DisabledWindowControls = {},
ShowUserInfo = UserInputService.TouchEnabled,
Keybind = .KeyCode.RightAlt,
AcrylicBlur = ,
})
MacLib:(Folder)
()
Window:(())
()
.(applyPreferredWindowSize)
.(, applyPreferredWindowSize)
UserInputService.TouchEnabled then
task.defer(function()
pcall(function()
Window:SetUserInfoState(false)
end)
end)
end
local clampMobileButtonPosition
local currentViewportConn = nil
local refreshMobileButtonVisibility
local syncMobileButtonLayer
local function bindWindowResizeToCamera()
if currentViewportConn then
currentViewportConn:Disconnect()
currentViewportConn = nil
end
local camera = workspace.CurrentCamera
if not camera then
return
end
currentViewportConn = camera:GetPropertyChangedSignal("ViewportSize"):Connect(function()
if UserInputService.TouchEnabled then
applyPreferredWindowSize()
if clampMobileButtonPosition then
clampMobileButtonPosition()
end
end
end)
end
workspace:GetPropertyChangedSignal("CurrentCamera"):Connect(function()
bindWindowResizeToCamera()
if UserInputService.TouchEnabled then
task.defer(applyPreferredWindowSize)
end
end)
bindWindowResizeToCamera()
local function getMobileButtonParent()
return (gethui and gethui()) or CoreGui
end
local function getClampedButtonCenter(rawCenter, buttonSize)
local viewport = workspace.CurrentCamera and workspace.CurrentCamera.ViewportSize or Vector2.new(1920, 1080)
local padding = 10
local halfWidth = buttonSize.X * 0.5
local halfHeight = buttonSize.Y * 0.5
local minX = halfWidth + padding
local maxX = math.max(minX, viewport.X - halfWidth - padding)
local minY = halfHeight + padding
local maxY = math.max(minY, viewport.Y - halfHeight - padding)
return Vector2.new(
math.clamp(rawCenter.X, minX, maxX),
math.clamp(rawCenter.Y, minY, maxY)
)
end
local function getDefaultMobileButtonCenter(buttonSize)
local viewport = workspace.CurrentCamera and workspace.CurrentCamera.ViewportSize or Vector2.new(1920, 1080)
local topOffset = math.max(118, viewport.Y * 0.12)
local desiredCenter = Vector2.new(buttonSize.X * 0.5 + 28, topOffset + buttonSize.Y * 0.5)
return getClampedButtonCenter(desiredCenter, buttonSize)
end
local function getInputPosition2D(input)
local position = input and input.Position
if not position then
return Vector2.zero
end
return Vector2.new(position.X, position.Y)
end
clampMobileButtonPosition = function()
if not mobileGuiButton or not mobileGuiButton.Parent then
return
end
local currentCenter = Vector2.new(
mobileGuiButton.AbsolutePosition.X + mobileGuiButton.AbsoluteSize.X * 0.5,
mobileGuiButton.AbsolutePosition.Y + mobileGuiButton.AbsoluteSize.Y * 0.5
)
local clampedCenter = getClampedButtonCenter(currentCenter, mobileGuiButton.AbsoluteSize)
mobileGuiButton.Position = UDim2.fromOffset(clampedCenter.X, clampedCenter.Y)
end
resolveMacLibWindowGui = function()
local title = Window and Window.Settings and Window.Settings.Title or "Prison Life Silent Aim"
local guiParent = getMobileButtonParent()
local candidates = {guiParent}
if guiParent ~= CoreGui then
candidates[#candidates + 1] = CoreGui
end
for _, parent in ipairs(candidates) do
for _, descendant in ipairs(parent:GetDescendants()) do
if descendant:IsA("TextLabel") and descendant.Text == title then
return descendant:FindFirstAncestorOfClass("ScreenGui")
end
end
end
return nil
end
refreshMobileButtonVisibility = function()
if not mobileGuiButton then
return
end
mobileGuiButton.Visible = true
mobileGuiButton.Active = true
end
syncMobileButtonLayer = function()
if not mobileGuiButton then
return
end
local screen = mobileGuiButton:FindFirstAncestorOfClass("ScreenGui")
if not screen then
return
end
local windowGui = resolveMacLibWindowGui and resolveMacLibWindowGui() or nil
local targetParent = getMobileButtonParent()
if windowGui and windowGui.Parent then
targetParent = windowGui.Parent
end
screen.ScreenInsets = Enum.ScreenInsets.None
screen.DisplayOrder = windowGui and windowGui.DisplayOrder or 2147483647
if screen.Parent ~= targetParent then
screen.Parent = targetParent
end
-- Reparent once so this layer collector is inserted after the menu.
screen.Parent = nil
screen.Parent = targetParent
end
local function toggleMacLibWindow()
local windowGui = resolveMacLibWindowGui()
if not windowGui then
Window:Notify({
Title = Window.Settings.Title,
Description = "Couldn't find the window to toggle yet.",
Lifetime = 3
})
return
end
windowGui.Enabled = not windowGui.Enabled
refreshMobileButtonVisibility()
end
local function createMobileWindowButton()
if not UserInputService.TouchEnabled then
return
end
local existing = getMobileButtonParent():FindFirstChild("SilentAimMobileButton")
if existing then
existing:Destroy()
end
local screen = Instance.new("ScreenGui")
screen.Name = "SilentAimMobileButton"
screen.ResetOnSpawn = false
screen.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
screen.IgnoreGuiInset = true
screen.ScreenInsets = Enum.ScreenInsets.None
screen.DisplayOrder = 2147483647
screen.Parent = getMobileButtonParent()
local buttonSize = Vector2.new(68, 68)
local defaultCenter = getDefaultMobileButtonCenter(buttonSize)
local button = Instance.new("ImageButton")
button.Name = "ToggleButton"
button.AnchorPoint = Vector2.new(0.5, 0.5)
button.Position = UDim2.fromOffset(defaultCenter.X, defaultCenter.Y)
button.Size = UDim2.fromOffset(buttonSize.X, buttonSize.Y)
button.BackgroundTransparency = 1
button.BorderSizePixel = 0
button.Image = "rbxassetid://100746642581984"
button.ScaleType = Enum.ScaleType.Fit
button.Active = true
button.ZIndex = 1000
button.Parent = screen
mobileGuiButton = button
local dragInput = nil
local dragStart = nil
local startCenter = nil
local moved = false
local moveThreshold = 14
button.InputBegan:Connect(function(input)
if input.UserInputType ~= Enum.UserInputType.Touch and input.UserInputType ~= Enum.UserInputType.MouseButton1 then
return
end
dragInput = input
mobileGuiDragInput = input
dragStart = getInputPosition2D(input)
startCenter = Vector2.new(
button.AbsolutePosition.X + button.AbsoluteSize.X * 0.5,
button.AbsolutePosition.Y + button.AbsoluteSize.Y * 0.5
)
activeTouch = nil
lastTouchAimPos = nil
moved = false
end)
UserInputService.InputChanged:Connect(function(input)
if input == dragInput and dragStart and startCenter then
local delta = getInputPosition2D(input) - dragStart
if not moved then
if delta.Magnitude < moveThreshold then
return
end
moved = true
end
local nextCenter = getClampedButtonCenter(startCenter + delta, button.AbsoluteSize)
button.Position = UDim2.fromOffset(nextCenter.X, nextCenter.Y)
end
end)
UserInputService.InputEnded:Connect(function(input)
if input ~= dragInput then
return
end
local wasMoved = moved
mobileGuiDragInput = nil
dragInput = nil
dragStart = nil
startCenter = nil
moved = false
if wasMoved then
clampMobileButtonPosition()
else
toggleMacLibWindow()
end
end)
task.defer(clampMobileButtonPosition)
task.defer(syncMobileButtonLayer)
task.defer(refreshMobileButtonVisibility)
end
createMobileWindowButton()
task.defer(function()
local windowGui = resolveMacLibWindowGui and resolveMacLibWindowGui() or nil
syncMobileButtonLayer()
if windowGui then
windowGui:GetPropertyChangedSignal("Enabled"):Connect(function()
syncMobileButtonLayer()
refreshMobileButtonVisibility()
end)
end
end)
local globalSettings = {
UIBlurToggle = Window:GlobalSetting({
Name = "UI Blur",
Default = Window:GetAcrylicBlurState(),
Callback = function(bool)
Window:SetAcrylicBlurState(bool)
Window:Notify({
Title = Window.Settings.Title,
Description = (bool and "Enabled" or "Disabled") .. " UI Blur",
Lifetime = 5
})
end,
}),
NotificationToggler = Window:GlobalSetting({
Name = "Notifications",
Default = Window:GetNotificationsState(),
Callback = function(bool)
Window:SetNotificationsState(bool)
Window:Notify({
Title = Window.Settings.Title,
Description = (bool and "Enabled" or "Disabled") .. " Notifications",
Lifetime = 5
})
end,
}),
ShowUserInfo = Window:GlobalSetting({
Name = "Show User Info",
Default = Window:GetUserInfoState(),
Callback = function(bool)
Window:SetUserInfoState(bool)
Window:Notify({
Title = Window.Settings.Title,
Description = (bool and "Showing" or "Redacted") .. " User Info",
Lifetime = 5
})
end,
})
}
local MainGroup = Window:TabGroup()
local AimbotTab = MainGroup:Tab({Name = "Aimbot", Image = "rbxassetid://4034483344"})
local DistanceHitchanceTab = MainGroup:Tab({Name = "Distance Hitchance", Image = "rbxassetid://4034483344"})
local ESPTab = MainGroup:Tab({Name = "ESP", Image = "rbxassetid://4034483345"})
local AutoshootTab = MainGroup:Tab({Name = "Autoshoot", Image = "rbxassetid://4034483346"})
local SettingsTab = MainGroup:Tab({Name = "Settings", Image = "rbxassetid://4034483347"})
local sections = {
aimbotLeft = AimbotTab:Section({ Side = "Left" }),
aimbotRight = AimbotTab:Section({ Side = "Right" }),
distanceHitchanceLeft = DistanceHitchanceTab:Section({ Side = "Left" }),
distanceHitchanceRight = DistanceHitchanceTab:Section({ Side = "Right" }),
espLeft = ESPTab:Section({ Side = "Left" }),
espRight = ESPTab:Section({ Side = "Right" }),
autoshootLeft = AutoshootTab:Section({ Side = "Left" }),
autoshootRight = AutoshootTab:Section({ Side = "Right" }),
settingsLeft = SettingsTab:Section({ Side = "Left" }),
settingsRight = SettingsTab:Section({ Side = "Right" })
}
AimbotTab:Select()
Window:Notify({
Title = "Build Loaded",
Description = string.format("GUI build %s loaded with Distance Hitchance tab.", version),
Lifetime = 5
})
local configFolder = "SilentAimConfigs"
local autoloadConfigFile = configFolder .. "/_autoload.txt"
local function serializeColor3(color)
return {R = color.R, G = color.G, B = color.B}
end
local function deserializeColor3(tbl)
if tbl and tbl.R and tbl.G and tbl.B then
return Color3.new(tbl.R, tbl.G, tbl.B)
end
return Color3.new(1, 1, 1)
end
local function serializeConfig()
local data = {}
for key, value in pairs(cfg) do
if typeof(value) == "Color3" then
data[key] = {type = "Color3", value = serializeColor3(value)}
elseif typeof(value) == "EnumItem" then
data[key] = {type = "EnumItem", value = tostring(value)}
elseif typeof(value) == "table" then
data[key] = {type = "table", value = value}
else
data[key] = {type = typeof(value), value = value}
end
end
return game:GetService("HttpService"):JSONEncode(data)
end
local function deserializeConfig(jsonString)
local success, data = pcall(function()
return game:GetService("HttpService"):JSONDecode(jsonString)
end)
if not success then return nil end
local result = {}
for key, entry in pairs(data) do
if entry.type == "Color3" then
result[key] = deserializeColor3(entry.value)
elseif entry.type == "EnumItem" then
local enumPath = entry.value:match("Enum%.(.+)")
if enumPath then
local parts = enumPath:split(".")
if #parts == 2 then
local enumType = Enum[parts[1]]
if enumType then
result[key] = enumType[parts[2]]
end
end
end
elseif entry.type == "table" then
result[key] = entry.value
else
result[key] = entry.value
end
end
return result
end
local function saveConfig(name)
if not isfolder then return false end
if not isfolder(configFolder) then
makefolder(configFolder)
end
local path = configFolder .. "/" .. name .. ".json"
local data = serializeConfig()
writefile(path, data)
return true
end
local function loadConfig(name)
if not isfolder or not isfile then return false end
local path = configFolder .. "/" .. name .. ".json"
if not isfile(path) then return false end
local data = readfile(path)
local loaded = deserializeConfig(data)
if not loaded then return false end
for key, value in pairs(loaded) do
if cfg[key] ~= nil then
cfg[key] = value
end
end
syncDistanceHitchanceAimMaxDistanceFromConfig()
return true
end
local function getConfigList()
if not isfolder or not listfiles then return {} end
if not isfolder(configFolder) then return {} end
local files = listfiles(configFolder)
local configs = {}
for _, path in ipairs(files) do
local name = path:match("([^/\\]+)%.json$")
if name then
table.insert(configs, name)
end
end
return configs
end
local function deleteConfig(name)
if not isfolder or not isfile or not delfile then return false end
local path = configFolder .. "/" .. name .. ".json"
if isfile(path) then
delfile(path)
return true
end
return false
end
local function getAutoLoadConfigName()
if not isfolder or not isfile or not readfile then
return ""
end
if not isfolder(configFolder) or not isfile(autoloadConfigFile) then
return ""
end
return tostring(readfile(autoloadConfigFile) or ""):gsub("^%s+", ""):gsub("%s+$", "")
end
local function setAutoLoadConfigName(name)
if not isfolder or not writefile then
return false
end
if not isfolder(configFolder) then
makefolder(configFolder)
end
writefile(autoloadConfigFile, tostring(name or ""))
return true
end
local function clearAutoLoadConfigName()
if not isfolder or not isfile or not delfile then
return false
end
if isfile(autoloadConfigFile) then
delfile(autoloadConfigFile)
end
return true
end
local currentAutoLoadConfigName = getAutoLoadConfigName()
if currentAutoLoadConfigName ~= "" then
if loadConfig(currentAutoLoadConfigName) then
Window:Notify({
Title = "Auto Load",
Description = "Loaded config: " .. currentAutoLoadConfigName,
Lifetime = 4
})
else
Window:Notify({
Title = "Auto Load",
Description = "Couldn't load config: " .. currentAutoLoadConfigName,
Lifetime = 4
})
end
end
syncDistanceHitchanceAimMaxDistanceFromConfig()
local function refreshUI()
if uiElements.SilentAimToggle then uiElements.SilentAimToggle:UpdateState(cfg.enabled) end
if uiElements.TeamCheckToggle then uiElements.TeamCheckToggle:UpdateState(cfg.teamcheck) end
if uiElements.WallCheckToggle then uiElements.WallCheckToggle:UpdateState(cfg.wallcheck) end
if uiElements.DeathCheckToggle then uiElements.DeathCheckToggle:UpdateState(cfg.deathcheck) end
if uiElements.VehicleCheckToggle then uiElements.VehicleCheckToggle:UpdateState(cfg.vehiclecheck) end
if uiElements.HostileCheckToggle then uiElements.HostileCheckToggle:UpdateState(cfg.hostilecheck) end
if uiElements.TrespassCheckToggle then uiElements.TrespassCheckToggle:UpdateState(cfg.trespasscheck) end
if uiElements.CriminalsSkipInmatesToggle then uiElements.CriminalsSkipInmatesToggle:UpdateState(cfg.criminalsnoinnmates) end
if uiElements.InmatesSkipCriminalsToggle then uiElements.InmatesSkipCriminalsToggle:UpdateState(cfg.inmatesnocriminals) end
if uiElements.FFCheckToggle then uiElements.FFCheckToggle:UpdateState(cfg.ffcheck) end
if uiElements.ShieldBreakerToggle then uiElements.ShieldBreakerToggle:UpdateState(cfg.shieldbreaker) end
if uiElements.ShieldFrontAngleSlider then uiElements.ShieldFrontAngleSlider:UpdateValue(cfg.shieldfrontangle) end
if uiElements.ShieldRandomHeadToggle then uiElements.ShieldRandomHeadToggle:UpdateState(cfg.shieldrandomhead) end
if uiElements.ShieldHeadChanceSlider then uiElements.ShieldHeadChanceSlider:UpdateValue(cfg.shieldheadchance) end
if uiElements.TaserBypassHostileToggle then uiElements.TaserBypassHostileToggle:UpdateState(cfg.taserbypasshostile) end
if uiElements.TaserBypassTrespassToggle then uiElements.TaserBypassTrespassToggle:UpdateState(cfg.taserbypasstrespass) end
if uiElements.TaserAlwaysHitToggle then uiElements.TaserAlwaysHitToggle:UpdateState(cfg.taseralwayshit) end
if uiElements.HitIfPlayerStillToggle then uiElements.HitIfPlayerStillToggle:UpdateState(cfg.ifplayerstill) end
if uiElements.StillThresholdSlider then uiElements.StillThresholdSlider:UpdateValue(cfg.stillthreshold) end
if uiElements.HitChanceSlider then uiElements.HitChanceSlider:UpdateValue(cfg.hitchance) end
if uiElements.HitChanceAutoOnlyToggle then uiElements.HitChanceAutoOnlyToggle:UpdateState(cfg.hitchanceAutoOnly) end
if uiElements.DistanceBasedHitChanceToggle then uiElements.DistanceBasedHitChanceToggle:UpdateState(cfg.distancebasedhitchance) end
if uiElements.AimMaxDistSlider then uiElements.AimMaxDistSlider:UpdateValue(cfg.aimmaxdist) end
if uiElements.MissSpreadSlider then uiElements.MissSpreadSlider:UpdateValue(cfg.missspread) end
if uiElements.ShotgunNaturalSpreadToggle then uiElements.ShotgunNaturalSpreadToggle:UpdateState(cfg.shotgunnaturalspread) end
if uiElements.ShotgunGameHandledToggle then uiElements.ShotgunGameHandledToggle:UpdateState(cfg.shotgungamehandled) end
if uiElements.PrioritizeClosestToggle then uiElements.PrioritizeClosestToggle:UpdateState(cfg.prioritizeclosest) end
if uiElements.PrioritizeCriminalsToggle then uiElements.PrioritizeCriminalsToggle:UpdateState(cfg.prioritizecriminals) end
if uiElements.TargetStickinessToggle then uiElements.TargetStickinessToggle:UpdateState(cfg.targetstickiness) end
if uiElements.StickinessDurationSlider then uiElements.StickinessDurationSlider:UpdateValue(cfg.targetstickinessduration) end
if uiElements.TargetStickinessRandomToggle then uiElements.TargetStickinessRandomToggle:UpdateState(cfg.targetstickinessrandom) end
if uiElements.TargetStickinessMinSlider then uiElements.TargetStickinessMinSlider:UpdateValue(cfg.targetstickinessmin) end
if uiElements.TargetStickinessMaxSlider then uiElements.TargetStickinessMaxSlider:UpdateValue(cfg.targetstickinessmax) end
if uiElements.FovSlider then uiElements.FovSlider:UpdateValue(cfg.fov) end
if uiElements.ShowFovToggle then uiElements.ShowFovToggle:UpdateState(cfg.showfov) end
if uiElements.StaticFovToggle then uiElements.StaticFovToggle:UpdateState(cfg.staticfov) end
if uiElements.ShowTargetLineToggle then uiElements.ShowTargetLineToggle:UpdateState(cfg.showtargetline) end
if uiElements.AimPartDropdown then uiElements.AimPartDropdown:UpdateSelection(cfg.aimpart) end
if uiElements.RandomPartsToggle then uiElements.RandomPartsToggle:UpdateState(cfg.randomparts) end
if uiElements.EspToggle then uiElements.EspToggle:UpdateState(cfg.esp) end
if uiElements.EspTeamCheckToggle then uiElements.EspTeamCheckToggle:UpdateState(cfg.espteamcheck) end
if uiElements.ShowTeamToggle then uiElements.ShowTeamToggle:UpdateState(cfg.espshowteam) end
if uiElements.EspMaxDistanceSlider then uiElements.EspMaxDistanceSlider:UpdateValue(cfg.espmaxdist) end
if uiElements.ShowDistanceToggle then uiElements.ShowDistanceToggle:UpdateState(cfg.espshowdist) end
if uiElements.UseTeamColorsToggle then uiElements.UseTeamColorsToggle:UpdateState(cfg.espuseteamcolors) end
if uiElements.EspColorPicker then uiElements.EspColorPicker:SetColor(cfg.espcolor) end
if uiElements.GuardsColorPicker then uiElements.GuardsColorPicker:SetColor(cfg.espguards) end
if uiElements.InmatesColorPicker then uiElements.InmatesColorPicker:SetColor(cfg.espinmates) end
if uiElements.CriminalsColorPicker then uiElements.CriminalsColorPicker:SetColor(cfg.espcriminals) end
if uiElements.TeamColorPicker then uiElements.TeamColorPicker:SetColor(cfg.espteam) end
if uiElements.C4EspToggle then uiElements.C4EspToggle:UpdateState(cfg.c4esp) end
if uiElements.C4EspMaxDistanceSlider then uiElements.C4EspMaxDistanceSlider:UpdateValue(cfg.c4espmaxdist) end
if uiElements.C4ShowDistanceToggle then uiElements.C4ShowDistanceToggle:UpdateState(cfg.c4espshowdist) end
if uiElements.C4EspColorPicker then uiElements.C4EspColorPicker:SetColor(cfg.c4espcolor) end
if uiElements.AutoshootToggle then uiElements.AutoshootToggle:UpdateState(cfg.autoshoot) end
if uiElements.AutoshootWeaponDropdown then uiElements.AutoshootWeaponDropdown:UpdateSelection(cfg.autoshootweapon) end
if uiElements.AutoshootDelaySlider then uiElements.AutoshootDelaySlider:UpdateValue(cfg.autoshootdelay) end
if uiElements.AutoshootStartDelaySlider then uiElements.AutoshootStartDelaySlider:UpdateValue(cfg.autoshootstartdelay) end
if uiElements.AutoGrabToggle then uiElements.AutoGrabToggle:UpdateState(cfg.autograb) end
if uiElements.AutoGrabDistanceSlider then uiElements.AutoGrabDistanceSlider:UpdateValue(cfg.autograbdistance) end
if uiElements.AutoGrabDelaySlider then uiElements.AutoGrabDelaySlider:UpdateValue(cfg.autograbdelay) end
if uiElements.AutoGrabKeycardToggle then uiElements.AutoGrabKeycardToggle:UpdateState(cfg.autograbkeycard) end
if uiElements.AutoGrabM9Toggle then uiElements.AutoGrabM9Toggle:UpdateState(cfg.autograbm9) end
syncDistanceHitchanceEditor()
updateEsp()
updateC4Esp()
end
uiElements.SilentAimToggle = sections.aimbotLeft:Toggle({
Name = "Silent Aim",
Default = cfg.enabled,
Callback = function(state)
cfg.enabled = state
end,
}, "SilentAimToggle")
uiElements.TeamCheckToggle = sections.aimbotLeft:Toggle({
Name = "Team Check",
Default = cfg.teamcheck,
Callback = function(state)
cfg.teamcheck = state
end,
}, "TeamCheckToggle")
uiElements.WallCheckToggle = sections.aimbotLeft:Toggle({
Name = "Wall Check",
Default = cfg.wallcheck,
Callback = function(state)
cfg.wallcheck = state
end,
}, "WallCheckToggle")
uiElements.DeathCheckToggle = sections.aimbotLeft:Toggle({
Name = "Death Check",
Default = cfg.deathcheck,
Callback = function(state)
cfg.deathcheck = state
end,
}, "DeathCheckToggle")
uiElements.VehicleCheckToggle = sections.aimbotLeft:Toggle({
Name = "Vehicle Check",
Default = cfg.vehiclecheck,
Callback = function(state)
cfg.vehiclecheck = state
end,
}, "VehicleCheckToggle")
uiElements.HostileCheckToggle = sections.aimbotLeft:Toggle({
Name = "Hostile Check",
Default = cfg.hostilecheck,
Callback = function(state)
cfg.hostilecheck = state
end,
}, "HostileCheckToggle")
uiElements.TrespassCheckToggle = sections.aimbotLeft:Toggle({
Name = "Trespass Check",
Default = cfg.trespasscheck,
Callback = function(state)
cfg.trespasscheck = state
end,
}, "TrespassCheckToggle")
uiElements.CriminalsSkipInmatesToggle = sections.aimbotLeft:Toggle({
Name = "Criminals Skip Inmates",
Default = cfg.criminalsnoinnmates,
Callback = function(state)
cfg.criminalsnoinnmates = state
end,
}, "CriminalsSkipInmatesToggle")
uiElements.InmatesSkipCriminalsToggle = sections.aimbotLeft:Toggle({
Name = "Inmates Skip Criminals",
Default = cfg.inmatesnocriminals,
Callback = function(state)
cfg.inmatesnocriminals = state
end,
}, "InmatesSkipCriminalsToggle")
uiElements.FFCheckToggle = sections.aimbotLeft:Toggle({
Name = "ForceField Check",
Default = cfg.ffcheck,
Callback = function(state)
cfg.ffcheck = state
end,
}, "FFCheckToggle")
uiElements.ShieldBreakerToggle = sections.aimbotRight:Toggle({
Name = "Shield Breaker",
Default = cfg.shieldbreaker,
Callback = function(state)
cfg.shieldbreaker = state
end,
}, "ShieldBreakerToggle")
uiElements.ShieldFrontAngleSlider = sections.aimbotRight:Slider({
Name = "Shield Front Angle",
Default = cfg.shieldfrontangle,
Minimum = -1,
Maximum = 1,
Precision = 1,
Callback = function(value)
cfg.shieldfrontangle = value
end,
}, "ShieldFrontAngleSlider")
uiElements.ShieldRandomHeadToggle = sections.aimbotRight:Toggle({
Name = "Shield Random Head",
Default = cfg.shieldrandomhead,
Callback = function(state)
cfg.shieldrandomhead = state
end,
}, "ShieldRandomHeadToggle")
uiElements.ShieldHeadChanceSlider = sections.aimbotRight:Slider({
Name = "Shield Head Chance",
Default = cfg.shieldheadchance,
Minimum = 0,
Maximum = 100,
Precision = 0,
Callback = function(value)
cfg.shieldheadchance = value
end,
}, "ShieldHeadChanceSlider")
uiElements.TaserBypassHostileToggle = sections.aimbotRight:Toggle({
Name = "Taser Bypass Hostile",
Default = cfg.taserbypasshostile,
Callback = function(state)
cfg.taserbypasshostile = state
end,
}, "TaserBypassHostileToggle")
uiElements.TaserBypassTrespassToggle = sections.aimbotRight:Toggle({
Name = "Taser Bypass Trespass",
Default = cfg.taserbypasstrespass,
Callback = function(state)
cfg.taserbypasstrespass = state
end,
}, "TaserBypassTrespassToggle")
uiElements.TaserAlwaysHitToggle = sections.aimbotRight:Toggle({
Name = "Taser Always Hit",
Default = cfg.taseralwayshit,
Callback = function(state)
cfg.taseralwayshit = state
end,
}, "TaserAlwaysHitToggle")
uiElements.HitIfPlayerStillToggle = sections.aimbotRight:Toggle({
Name = "Hit If Player Still",
Default = cfg.ifplayerstill,
Callback = function(state)
cfg.ifplayerstill = state
end,
}, "HitIfPlayerStillToggle")
uiElements.StillThresholdSlider = sections.aimbotRight:Slider({
Name = "Still Threshold",
Default = cfg.stillthreshold,
Minimum = 0,
Maximum = 5,
Precision = 1,
Callback = function(value)
cfg.stillthreshold = value
end,
}, "StillThresholdSlider")
uiElements.HitChanceSlider = sections.aimbotRight:Slider({
Name = "Hit Chance",
Default = cfg.hitchance,
Minimum = 0,
Maximum = 100,
Precision = 0,
Callback = function(value)
cfg.hitchance = value
end,
}, "HitChanceSlider")
uiElements.HitChanceAutoOnlyToggle = sections.aimbotRight:Toggle({
Name = "Hit Chance Auto Only",
Default = cfg.hitchanceAutoOnly,
Callback = function(state)
cfg.hitchanceAutoOnly = state
end,
}, "HitChanceAutoOnlyToggle")
uiElements.DistanceBasedHitChanceToggle = sections.distanceHitchanceLeft:Toggle({
Name = "Distance Based Hitchance",
Default = cfg.distancebasedhitchance,
Callback = function(state)
setDistanceHitchanceEnabledState(state)
if uiElements.AimMaxDistSlider then
uiElements.AimMaxDistSlider:UpdateValue(cfg.aimmaxdist)
end
end,
}, "DistanceBasedHitChanceToggle")
uiElements.DistanceHitchancePointDropdown = sections.distanceHitchanceLeft:Dropdown({
Name = "Selected Point",
Default = "1. 200 studs -> 30%",
Options = {"1. 200 studs -> 30%"},
Callback = function(value)
if syncingDistanceHitchanceEditor then
return
end
local selectedIndex = tonumber(tostring(value):match("^(%d+)%."))
if selectedIndex then
selectedDistanceHitchancePoint = selectedIndex
syncDistanceHitchanceEditor()
end
end,
}, "DistanceHitchancePointDropdown")
sections.distanceHitchanceLeft:Button({
Name = "Add Point",
Callback = function()
local points = ensureEditableDistanceHitchancePoints()
local lastPoint = points[#points]
local newPoint = {
distance = lastPoint and (lastPoint.distance + 100) or 200,
chance = lastPoint and math.max(lastPoint.chance - 8, 0) or 30
}
points[#points + 1] = newPoint
table.sort(points, function(a, b)
return a.distance < b.distance
end)
for index, point in ipairs(points) do
if point == newPoint then
selectedDistanceHitchancePoint = index
break
end
end
setDistanceHitchanceEnabledState(true)
refreshUI()
Window:Notify({
Title = "Distance Hitchance",
Description = "Added a new distance point.",
Lifetime = 4
})
end,
})
sections.distanceHitchanceLeft:Button({
Name = "Remove Selected",
Callback = function()
local points = ensureEditableDistanceHitchancePoints()
if #points <= 1 then
Window:Notify({
Title = "Distance Hitchance",
Description = "Keep at least one point in the list.",
Lifetime = 4
})
return
end
table.remove(points, selectedDistanceHitchancePoint)
selectedDistanceHitchancePoint = math.clamp(selectedDistanceHitchancePoint, 1, #points)
refreshUI()
Window:Notify({
Title = "Distance Hitchance",
Description = "Removed the selected point.",
Lifetime = 4
})
end,
})
sections.distanceHitchanceLeft:Button({
Name = "Load Legit Preset",
Callback = function()
loadLegitDistanceHitchancePreset()
refreshUI()
Window:Notify({
Title = "Distance Hitchance",
Description = "Loaded a legit distance preset and set base hitchance to 82.",
Lifetime = 5
})
end,
})
sections.distanceHitchanceLeft:Button({
Name = "Load Blatant Preset",
Callback = function()
loadBlatantDistanceHitchancePreset()
refreshUI()
Window:Notify({
Title = "Distance Hitchance",
Description = "Loaded a blatant distance preset and set base hitchance to 99.",
Lifetime = 5
})
end,
})
sections.distanceHitchanceLeft:Button({
Name = "Reset to Default",
Callback = function()
cfg.distancehitchancepoints = getDefaultDistanceHitchancePoints()
selectedDistanceHitchancePoint = 1
refreshUI()
Window:Notify({
Title = "Distance Hitchance",
Description = "Reset the distance list back to the default build.",
Lifetime = 4
})
end,
})
uiElements.SelectedDistancePointDistanceSlider = sections.distanceHitchanceRight:Slider({
Name = "Selected Distance",
Default = 200,
Minimum = 0,
Maximum = 5000,
Precision = 0,
Callback = function(value)
if syncingDistanceHitchanceEditor then
return
end
local points = ensureEditableDistanceHitchancePoints()
local point = points[selectedDistanceHitchancePoint]
if not point then
return
end
point.distance = value
table.sort(points, function(a, b)
return a.distance < b.distance
end)
for index, existingPoint in ipairs(points) do
if existingPoint == point then
selectedDistanceHitchancePoint = index
break
end
end
syncDistanceHitchanceEditor()
end,
}, "SelectedDistancePointDistanceSlider")
uiElements.SelectedDistancePointHitchanceSlider = sections.distanceHitchanceRight:Slider({
Name = "Selected Hitchance",
Default = 30,
Minimum = 0,
Maximum = 100,
Precision = 0,
Callback = function(value)
if syncingDistanceHitchanceEditor then
return
end
local points = ensureEditableDistanceHitchancePoints()
local point = points[selectedDistanceHitchancePoint]
if not point then
return
end
point.chance = value
syncDistanceHitchanceEditor()
end,
}, "SelectedDistancePointHitchanceSlider")
uiElements.AimMaxDistSlider = sections.aimbotRight:Slider({
Name = "Aim Max Distance (0 = Any)",
Default = cfg.aimmaxdist,
Minimum = 0,
Maximum = 5000,
Precision = 0,
Callback = function(value)
if cfg.distancebasedhitchance or distanceHitchanceForcesAimMaxDistance then
storedAimMaxDistanceBeforeDistanceHitchance = value
cfg.aimmaxdist = 0
if uiElements.AimMaxDistSlider and value ~= 0 then
uiElements.AimMaxDistSlider:UpdateValue(0)
end
return
end
cfg.aimmaxdist = value
end,
}, "AimMaxDistSlider")
uiElements.MissSpreadSlider = sections.aimbotRight:Slider({
Name = "Miss Spread",
Default = cfg.missspread,
Minimum = 0,
Maximum = 20,
Precision = 1,
Callback = function(value)
cfg.missspread = value
end,
}, "MissSpreadSlider")
uiElements.ShotgunNaturalSpreadToggle = sections.aimbotRight:Toggle({
Name = "Shotgun Natural Spread",
Default = cfg.shotgunnaturalspread,
Callback = function(state)
cfg.shotgunnaturalspread = state
end,
}, "ShotgunNaturalSpreadToggle")
uiElements.ShotgunGameHandledToggle = sections.aimbotRight:Toggle({
Name = "Shotgun Game Handled",
Default = cfg.shotgungamehandled,
Callback = function(state)
cfg.shotgungamehandled = state
end,
}, "ShotgunGameHandledToggle")
uiElements.PrioritizeClosestToggle = sections.aimbotRight:Toggle({
Name = "Prioritize Closest",
Default = cfg.prioritizeclosest,
Callback = function(state)
cfg.prioritizeclosest = state
end,
}, "PrioritizeClosestToggle")
uiElements.PrioritizeCriminalsToggle = sections.aimbotRight:Toggle({
Name = "Prioritize Criminals",
Default = cfg.prioritizecriminals,
Callback = function(state)
cfg.prioritizecriminals = state
end,
}, "PrioritizeCriminalsToggle")
uiElements.TargetStickinessToggle = sections.aimbotRight:Toggle({
Name = "Target Stickiness",
Default = cfg.targetstickiness,
Callback = function(state)
cfg.targetstickiness = state
end,
}, "TargetStickinessToggle")
uiElements.StickinessDurationSlider = sections.aimbotRight:Slider({
Name = "Stickiness Duration",
Default = cfg.targetstickinessduration,
Minimum = 0.1,
Maximum = 2,
Precision = 1,
Callback = function(value)
cfg.targetstickinessduration = value
end,
}, "StickinessDurationSlider")
uiElements.TargetStickinessRandomToggle = sections.aimbotRight:Toggle({
Name = "Target Stickiness Random",
Default = cfg.targetstickinessrandom,
Callback = function(state)
cfg.targetstickinessrandom = state
end,
}, "TargetStickinessRandomToggle")
uiElements.TargetStickinessMinSlider = sections.aimbotRight:Slider({
Name = "Target Stickiness Min",
Default = cfg.targetstickinessmin,
Minimum = 0.1,
Maximum = 1,
Precision = 1,
Callback = function(value)
cfg.targetstickinessmin = value
end,
}, "TargetStickinessMinSlider")
uiElements.TargetStickinessMaxSlider = sections.aimbotRight:Slider({
Name = "Target Stickiness Max",
Default = cfg.targetstickinessmax,
Minimum = 0.1,
Maximum = 1,
Precision = 1,
Callback = function(value)
cfg.targetstickinessmax = value
end,
}, "TargetStickinessMaxSlider")
uiElements.FovSlider = sections.aimbotRight:Slider({
Name = "FOV",
Default = cfg.fov,
Minimum = 10,
Maximum = 500,
Precision = 0,
Callback = function(value)
cfg.fov = value
end,
}, "FovSlider")
uiElements.ShowFovToggle = sections.aimbotRight:Toggle({
Name = "Show FOV",
Default = cfg.showfov,
Callback = function(state)
cfg.showfov = state
end,
}, "ShowFovToggle")
uiElements.StaticFovToggle = sections.aimbotRight:Toggle({
Name = "Static FOV",
Default = cfg.staticfov,
Callback = function(state)
cfg.staticfov = state
end,
}, "StaticFovToggle")
uiElements.ShowTargetLineToggle = sections.aimbotRight:Toggle({
Name = "Show Target Line",
Default = cfg.showtargetline,
Callback = function(state)
cfg.showtargetline = state
end,
}, "ShowTargetLineToggle")
uiElements.AimPartDropdown = sections.aimbotRight:Dropdown({
Name = "Aim Part",
Default = cfg.aimpart,
Options = cfg.partslist,
Callback = function(value)
cfg.aimpart = value
end,
}, "AimPartDropdown")
uiElements.RandomPartsToggle = sections.aimbotRight:Toggle({
Name = "Random Parts",
Default = cfg.randomparts,
Callback = function(state)
cfg.randomparts = state
end,
}, "RandomPartsToggle")
uiElements.EspToggle = sections.espLeft:Toggle({
Name = "ESP",
Default = cfg.esp,
Callback = function(state)
cfg.esp = state
updateEsp()
end,
}, "EspToggle")
uiElements.EspTeamCheckToggle = sections.espLeft:Toggle({
Name = "ESP Team Check",
Default = cfg.espteamcheck,
Callback = function(state)
cfg.espteamcheck = state
updateEsp()
end,
}, "EspTeamCheckToggle")
uiElements.ShowTeamToggle = sections.espLeft:Toggle({
Name = "Show Team",
Default = cfg.espshowteam,
Callback = function(state)
cfg.espshowteam = state
updateEsp()
end,
}, "ShowTeamToggle")
uiElements.EspMaxDistanceSlider = sections.espLeft:Slider({
Name = "ESP Max Distance (0 = Any)",
Default = cfg.espmaxdist,
Minimum = 0,
Maximum = 5000,
Precision = 0,
Callback = function(value)
cfg.espmaxdist = value
updateEsp()
end,
}, "EspMaxDistanceSlider")
uiElements.ShowDistanceToggle = sections.espLeft:Toggle({
Name = "Show Distance",
Default = cfg.espshowdist,
Callback = function(state)
cfg.espshowdist = state
updateEsp()
end,
}, "ShowDistanceToggle")
uiElements.UseTeamColorsToggle = sections.espLeft:Toggle({
Name = "Use Team Colors",
Default = cfg.espuseteamcolors,
Callback = function(state)
cfg.espuseteamcolors = state
updateEsp()
end,
}, "UseTeamColorsToggle")
uiElements.EspColorPicker = sections.espLeft:Colorpicker({
Name = "ESP Color",
Default = cfg.espcolor,
Callback = function(color)
cfg.espcolor = color
updateEsp()
end,
}, "EspColorPicker")
uiElements.GuardsColorPicker = sections.espLeft:Colorpicker({
Name = "Guards Color",
Default = cfg.espguards,
Callback = function(color)
cfg.espguards = color
updateEsp()
end,
}, "GuardsColorPicker")
uiElements.InmatesColorPicker = sections.espLeft:Colorpicker({
Name = "Inmates Color",
Default = cfg.espinmates,
Callback = function(color)
cfg.espinmates = color
updateEsp()
end,
}, "InmatesColorPicker")
uiElements.CriminalsColorPicker = sections.espLeft:Colorpicker({
Name = "Criminals Color",
Default = cfg.espcriminals,
Callback = function(color)
cfg.espcriminals = color
updateEsp()
end,
}, "CriminalsColorPicker")
uiElements.TeamColorPicker = sections.espLeft:Colorpicker({
Name = "Team Color",
Default = cfg.espteam,
Callback = function(color)
cfg.espteam = color
updateEsp()
end,
}, "TeamColorPicker")
uiElements.C4EspToggle = sections.espRight:Toggle({
Name = "C4 ESP",
Default = cfg.c4esp,
Callback = function(state)
cfg.c4esp = state
updateC4Esp()
end,
}, "C4EspToggle")
uiElements.C4EspMaxDistanceSlider = sections.espRight:Slider({
Name = "C4 ESP Max Distance (0 = Any)",
Default = cfg.c4espmaxdist,
Minimum = 0,
Maximum = 5000,
Precision = 0,
Callback = function(value)
cfg.c4espmaxdist = value
updateC4Esp()
end,
}, "C4EspMaxDistanceSlider")
uiElements.C4ShowDistanceToggle = sections.espRight:Toggle({
Name = "C4 Show Distance",
Default = cfg.c4espshowdist,
Callback = function(state)
cfg.c4espshowdist = state
updateC4Esp()
end,
}, "C4ShowDistanceToggle")
uiElements.C4EspColorPicker = sections.espRight:Colorpicker({
Name = "C4 ESP Color",
Default = cfg.c4espcolor,
Callback = function(color)
cfg.c4espcolor = color
updateC4Esp()
end,
}, "C4EspColorPicker")
uiElements.AutoshootToggle = sections.autoshootLeft:Toggle({
Name = "Autoshoot",
Default = cfg.autoshoot,
Callback = function(state)
cfg.autoshoot = state
end,
}, "AutoshootToggle")
uiElements.AutoshootWeaponDropdown = sections.autoshootRight:Dropdown({
Name = "Autoshoot Weapon",
Default = cfg.autoshootweapon,
Options = {"Any", "Taser", "M9", "AK-47", "M4A1", "Remington 870", "Revolver", "Shotgun", "Sniper", "Automatic"},
Callback = function(value)
cfg.autoshootweapon = value
end,
}, "AutoshootWeaponDropdown")
uiElements.AutoshootDelaySlider = sections.autoshootLeft:Slider({
Name = "Autoshoot Delay",
Default = cfg.autoshootdelay,
Minimum = 0.05,
Maximum = 0.5,
Precision = 1,
Callback = function(value)
cfg.autoshootdelay = value
end,
}, "AutoshootDelaySlider")
uiElements.AutoshootStartDelaySlider = sections.autoshootLeft:Slider({
Name = "Autoshoot Start Delay",
Default = cfg.autoshootstartdelay,
Minimum = 0,
Maximum = 1,
Precision = 1,
Callback = function(value)
cfg.autoshootstartdelay = value
end,
}, "AutoshootStartDelaySlider")
uiElements.AutoGrabToggle = sections.autoshootRight:Toggle({
Name = "Auto Grab",
Default = cfg.autograb,
Callback = function(state)
cfg.autograb = state
end,
}, "AutoGrabToggle")
uiElements.AutoGrabDistanceSlider = sections.autoshootRight:Slider({
Name = "Auto Grab Distance",
Default = cfg.autograbdistance,
Minimum = 0,
Maximum = 12,
Precision = 1,
Callback = function(value)
cfg.autograbdistance = value
end,
}, "AutoGrabDistanceSlider")
uiElements.AutoGrabDelaySlider = sections.autoshootRight:Slider({
Name = "Auto Grab Delay",
Default = cfg.autograbdelay,
Minimum = 0,
Maximum = 3,
Precision = 1,
Callback = function(value)
cfg.autograbdelay = value
end,
}, "AutoGrabDelaySlider")
uiElements.AutoGrabKeycardToggle = sections.autoshootRight:Toggle({
Name = "Grab Keycards",
Default = cfg.autograbkeycard,
Callback = function(state)
cfg.autograbkeycard = state
end,
}, "AutoGrabKeycardToggle")
uiElements.AutoGrabM9Toggle = sections.autoshootRight:Toggle({
Name = "Grab M9",
Default = cfg.autograbm9,
Callback = function(state)
cfg.autograbm9 = state
end,
}, "AutoGrabM9Toggle")
local configNameInput = currentAutoLoadConfigName ~= "" and currentAutoLoadConfigName or ""
sections.settingsLeft:Input({
Name = "Config Name",
Placeholder = "Enter config name...",
Callback = function(text)
configNameInput = text
end,
}, "ConfigNameInput")
sections.settingsLeft:Button({
Name = "Save Config",
Callback = function()
if configNameInput == "" then
Window:Notify({
Title = "Config",
Description = "Please enter a config name!",
Lifetime = 3
})
return
end
if saveConfig(configNameInput) then
Window:Notify({
Title = "Config",
Description = "Saved config: " .. configNameInput,
Lifetime = 3
})
else
Window:Notify({
Title = "Config",
Description = "Failed to save config!",
Lifetime = 3
})
end
end,
})
sections.settingsLeft:Button({
Name = "Load Config",
Callback = function()
if configNameInput == "" then
Window:Notify({
Title = "Config",
Description = "Please enter a config name!",
Lifetime = 3
})
return
end
if loadConfig(configNameInput) then
refreshUI()
Window:Notify({
Title = "Config",
Description = "Loaded config: " .. configNameInput,
Lifetime = 3
})
else
Window:Notify({
Title = "Config",
Description = "Config not found: " .. configNameInput,
Lifetime = 3
})
end
end,
})
sections.settingsLeft:Button({
Name = "Delete Config",
Callback = function()
if configNameInput == "" then
Window:Notify({
Title = "Config",
Description = "Please enter a config name!",
Lifetime = 3
})
return
end
if deleteConfig(configNameInput) then
Window:Notify({
Title = "Config",
Description = "Deleted config: " .. configNameInput,
Lifetime = 3
})
else
Window:Notify({
Title = "Config",
Description = "Config not found: " .. configNameInput,
Lifetime = 3
})
end
end,
})
sections.settingsLeft:Button({
Name = "List Configs",
Callback = function()
local configs = getConfigList()
if #configs == 0 then
Window:Notify({
Title = "Configs",
Description = "No configs found!",
Lifetime = 5
})
else
Window:Notify({
Title = "Configs",
Description = table.concat(configs, ", "),
Lifetime = 10
})
end
end,
})
sections.settingsRight:Button({
Name = "Set Auto Load",
Callback = function()
if configNameInput == "" then
Window:Notify({
Title = "Auto Load",
Description = "Enter a config name first.",
Lifetime = 3
})
return
end
if not isfile or not isfile(configFolder .. "/" .. configNameInput .. ".json") then
Window:Notify({
Title = "Auto Load",
Description = "Config not found: " .. configNameInput,
Lifetime = 3
})
return
end
if setAutoLoadConfigName(configNameInput) then
currentAutoLoadConfigName = configNameInput
Window:Notify({
Title = "Auto Load",
Description = "Will auto load: " .. configNameInput,
Lifetime = 4
})
else
Window:Notify({
Title = "Auto Load",
Description = "Failed to save auto load config.",
Lifetime = 3
})
end
end,
})
sections.settingsRight:Button({
Name = "Load Auto Config Now",
Callback = function()
local autoName = getAutoLoadConfigName()
if autoName == "" then
Window:Notify({
Title = "Auto Load",
Description = "No auto load config set.",
Lifetime = 3
})
return
end
if loadConfig(autoName) then
currentAutoLoadConfigName = autoName
configNameInput = autoName
refreshUI()
Window:Notify({
Title = "Auto Load",
Description = "Loaded auto config: " .. autoName,
Lifetime = 4
})
else
Window:Notify({
Title = "Auto Load",
Description = "Config not found: " .. autoName,
Lifetime = 3
})
end
end,
})
sections.settingsRight:Button({
Name = "Clear Auto Load",
Callback = function()
if clearAutoLoadConfigName() then
currentAutoLoadConfigName = ""
Window:Notify({
Title = "Auto Load",
Description = "Cleared auto load config.",
Lifetime = 3
})
else
Window:Notify({
Title = "Auto Load",
Description = "Failed to clear auto load config.",
Lifetime = 3
})
end
end,
})
sections.settingsRight:Button({
Name = "Reset to Defaults",
Callback = function()
for key, value in pairs(defaultCfg) do
cfg[key] = deepCopyTable(value)
end
syncDistanceHitchanceAimMaxDistanceFromConfig()
resetAimState()
refreshUI()
Window:Notify({
Title = "Config",
Description = "Reset to defaults!",
Lifetime = 3
})
end,
})
refreshUI()Loads code from the internet. It downloads more code when it runs (loadstring + HttpGet), which can change after it was posted. From: github.com.
TO ENABLE/DISABLE THE UI USE AltRight -- update 2 Fixed more bugs features added: m9/keycard auto pickup distance by when silent aim works (by studs) FOV that doesn't move (static FOV) Distance Hitchance (whatever distance you are is the hitchance EX: your 50 studs away from someone your hitchance will be 40 and if your 100 studs or more if you dont have another distance point) Added mobile support for the GUI with a button >~< -- update 1 Fixed a lot of bugs added mobile support and added a static FOV (FOV dont move when you move your cursor or finger) I wanna say im very sorry for not keeping up with the script ive been dealing with school and doing new things This is the same exact thing as my other script i just added a UI so uh yeah skids go crazy this has to many features to list :p

Prison Life