Description
CORE-OPS creado por durac402 & alguien un poco especial Trae la perspectiva OTS (over-the-shoulder) estilo Hellmet / Project Apex a Roblox móvil. También incluye ESP y sistema de guardado de perspectivas. FEATURES: • OTS camera (recomiendo editarla, está un poco buggy jeje) → se edita con las flechas ⬅️ ⬆️ ⬇️ ➡️ → y con los botones "ADELANTE" / "ATRAS" • ESP de enemigos, aliados y NPCs • VM hide para ocultar brazos falsos(no los oculta por completo) • 5 slots para guardar tus perspectivas(no funcionan bien en eso se esta trabajando) • Botón SWAP flotante (L-izquierda/R-derecha) • UI con tabs MAIN / SLOTS REQUIERE: Delta Executor FUNCIONA EN: clear Feedback?, bienvenido — cualquier bug lo parchamos en la próxima actualización. Se esperan bugs esta en una fase temprana✌️
Script source Luau
-- [[ BloxScripts Risk Notice ]]
-- This script has not been verified by BloxScripts.fun. Deal with caution.
--
-- Stay safe:
-- • Never log in on unofficial Roblox sites or lookalike domains.
-- • Real Roblox links use roblox.com (check the .com ending).
-- • Treat fake Roblox login / "claim reward" pages as phishing.
-- [[ End BloxScripts Risk Notice ]]
--[[
CORE-OPS v1.4
Autor: durac402 & alguien especial
Delta Executor (móvil)
LOGO NUEVO:
- Monograma "C O" entrelazado (Bodoni serif)
- C cyan a la izquierda + O verde a la derecha
- Línea diagonal sutil conectando ambos
- Underline decorativo
- Pulso animado del connector
]]
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UIS = game:GetService("UserInputService")
local CoreGui = game:GetService("CoreGui")
local StarterGui = game:GetService("StarterGui")
local TweenService = game:GetService("TweenService")
local LP = Players.LocalPlayer
local Camera = workspace.CurrentCamera
local DEFAULT_OFFSET = { X = 1.3, Y = 0.15, Z = 0.9 }
local SAVE_FILE = "CORE_OPS_v14_slots.txt"
local CFG = {
OTS_FOV = 100,
OTS_OFFSET_X = DEFAULT_OFFSET.X,
OTS_OFFSET_Y = DEFAULT_OFFSET.Y,
OTS_OFFSET_Z = DEFAULT_OFFSET.Z,
OTS_STEP = 0.1,
OTS_SENS = 0.18,
OTS_PITCH_MIN = -70,
OTS_PITCH_MAX = 70,
OTS_TOUCH_DEADZONE = 0.35,
HIDE_VIEWMODEL = false,
ESP_RANGE = 800,
COLOR_ENEMY = Color3.fromRGB(255, 50, 50),
COLOR_PLAYER = Color3.fromRGB(210, 210, 210),
COLOR_NPC = Color3.fromRGB(255, 220, 0),
ESP_FILL = 0.7,
GUI_POS = UDim2.new(0, 8, 0.1, 0),
SWAP_BTN_POS = UDim2.new(1, -70, 1, -180),
SWAP_BTN_SIZE = 50,
UI_WIDTH = 150,
UI_HEIGHT = 254,
CLR_PRIMARY = Color3.fromRGB(80, 200, 255),
CLR_SECONDARY = Color3.fromRGB(0, 255, 100),
CLR_DARK = Color3.fromRGB(20, 20, 25),
CLR_HEADER = Color3.fromRGB(28, 28, 34),
CLR_TAB_ACTIVE = Color3.fromRGB(40, 100, 150),
CLR_TAB_INACTIVE = Color3.fromRGB(28, 28, 34),
CLR_BTN = Color3.fromRGB(60, 60, 60),
CLR_BTN_ACTIVE = Color3.fromRGB(0, 180, 90),
CLR_BTN_MOMENT = Color3.fromRGB(40, 40, 55),
CLR_BTN_ARROW = Color3.fromRGB(50, 70, 110),
CLR_BTN_FWD = Color3.fromRGB(60, 130, 80),
CLR_BTN_BACK = Color3.fromRGB(130, 80, 60),
CLR_BTN_RESET = Color3.fromRGB(120, 80, 160),
CLR_BTN_SAVE = Color3.fromRGB(0, 150, 100),
CLR_BTN_LOAD = Color3.fromRGB(80, 120, 200),
CLR_BTN_CLOSE = Color3.fromRGB(180, 50, 50),
}
local S = {
otsOn = false,
espOn = true,
yaw = 0,
pitch = 0,
shoulder = 1,
currentTab = "MAIN",
origFOV = nil,
origCamType = nil,
origCamMode = nil,
origAutoRotate = true,
highlights = {},
cameraTouch = nil,
touchConns = {},
charConn = nil,
camConn = nil,
vmConn = nil,
guiRefs = {},
}
-- ============================================================
-- SLOTS
-- ============================================================
local saveSlots = { nil, nil, nil, nil, nil }
local selectedSlot = 1
local function serializeSlots()
local parts = {}
for i = 1, 5 do
local s = saveSlots[i]
if s then
table.insert(parts, string.format("%.4f,%.4f,%.4f,%d", s.X, s.Y, s.Z, s.shoulder))
else
table.insert(parts, "-")
end
end
return table.concat(parts, "|")
end
local function deserializeSlots(str)
local slots = {}
local idx = 1
for part in string.gmatch(str, "[^|]+") do
if idx > 5 then break end
if part ~= "-" then
local x, y, z, sh = string.match(part, "([%-%d%.]+),([%-%d%.]+),([%-%d%.]+),(%d+)")
if x then
slots[idx] = { X = tonumber(x), Y = tonumber(y), Z = tonumber(z), shoulder = tonumber(sh) }
end
end
idx = idx + 1
end
return slots
end
local function loadSlotsFromDisk()
if not (readfile and isfile) then return end
local ok, exists = pcall(isfile, SAVE_FILE)
if not ok or not exists then return end
local ok2, content = pcall(readfile, SAVE_FILE)
if not ok2 or not content or content == "" then return end
local parsed = deserializeSlots(content)
if parsed then
for i = 1, 5 do saveSlots[i] = parsed[i] end
end
end
local function persistSlots()
if not writefile then return end
pcall(function()
writefile(SAVE_FILE, serializeSlots())
end)
end
-- ============================================================
-- VIEWMODEL
-- ============================================================
local function isViewmodelName(n)
n = (n or ""):lower()
if n:find("viewmodel") or n:find("view_model") then return true end
if n:find("fps_arm") or n:find("fpsarm") then return true end
if n:find("firstperson") or n:find("first_person") then return true end
if n:find("fp_arm") or n:find("fparm") then return true end
if n == "arms" or n == "viewarms" or n == "view_arms" then return true end
if n:find("weaponmodel") or n:find("weapon_model") then return true end
if n:find("heldmodel") or n:find("held_model") then return true end
return false
end
local function isInsideCamera(obj)
if not obj then return false end
local p = obj.Parent
while p do
if p == Camera then return true end
p = p.Parent
end
return false
end
local function isViewmodel(model)
if not model then return false end
if isInsideCamera(model) then return true end
if isViewmodelName(model.Name) then return true end
return false
end
-- ============================================================
-- ESP
-- ============================================================
local function classifyModel(model)
local player = Players:GetPlayerFromCharacter(model)
if player then
if player.Team and LP.Team and player.Team ~= LP.Team then
return CFG.COLOR_ENEMY
end
return CFG.COLOR_PLAYER
end
return CFG.COLOR_NPC
end
local function addHighlight(model)
if S.highlights[model] then return end
if model == LP.Character then return end
if isViewmodel(model) then return end
local hum = model:FindFirstChildOfClass("Humanoid")
if not hum then return end
local hrp = model:FindFirstChild("HumanoidRootPart")
if not hrp then return end
local color = classifyModel(model)
local hl = Instance.new("Highlight")
hl.Name = "COPS_ESP_HL"
hl.Adornee = model
hl.FillColor = color
hl.FillTransparency = CFG.ESP_FILL
hl.OutlineColor = color
hl.OutlineTransparency = 0
hl.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop
hl.Enabled = S.espOn
hl.Parent = model
S.highlights[model] = hl
end
local function removeHighlight(model)
local hl = S.highlights[model]
if hl and hl.Parent then hl:Destroy() end
S.highlights[model] = nil
end
local function updateHighlights()
for model, hl in pairs(S.highlights) do
if not model or not model.Parent then
removeHighlight(model)
elseif isViewmodel(model) then
removeHighlight(model)
else
local hum = model:FindFirstChildOfClass("Humanoid")
local hrp = model:FindFirstChild("HumanoidRootPart")
if not hum or not hrp or hum.Health <= 0 or model == LP.Character then
hl.Enabled = false
elseif (Camera.CFrame.Position - hrp.Position).Magnitude > CFG.ESP_RANGE then
hl.Enabled = false
else
hl.Enabled = S.espOn
end
end
end
end
local function scanWorld()
for _, obj in ipairs(workspace:GetDescendants()) do
if obj:IsA("Model") and obj ~= LP.Character then
addHighlight(obj)
end
end
end
-- ============================================================
-- VM HIDE
-- ============================================================
local function restoreViewmodels()
for _, child in ipairs(Camera:GetChildren()) do
if child:IsA("Model") then
for _, p in ipairs(child:GetDescendants()) do
if p:IsA("BasePart") then p.LocalTransparencyModifier = 0 end
end
end
end
for _, obj in ipairs(Camera:GetDescendants()) do
if obj:IsA("BasePart") then obj.LocalTransparencyModifier = 0 end
end
end
local function startVMLoop()
if S.vmConn then return end
S.vmConn = RunService.RenderStepped:Connect(function()
if not CFG.HIDE_VIEWMODEL then return end
if not S.otsOn then return end
for _, child in ipairs(Camera:GetChildren()) do
if child:IsA("Model") then
for _, p in ipairs(child:GetDescendants()) do
if p:IsA("BasePart") then p.LocalTransparencyModifier = 1 end
end
elseif child:IsA("BasePart") then
child.LocalTransparencyModifier = 1
end
end
for _, obj in ipairs(Camera:GetDescendants()) do
if obj:IsA("BasePart") then obj.LocalTransparencyModifier = 1 end
end
end)
end
-- ============================================================
-- OTS
-- ============================================================
local function initAngles()
local look = Camera.CFrame.LookVector
S.yaw = math.deg(math.atan2(-look.X, -look.Z))
S.pitch = math.deg(math.asin(look.Y))
S.pitch = math.clamp(S.pitch, CFG.OTS_PITCH_MIN, CFG.OTS_PITCH_MAX)
end
local function renderOTS()
if not S.otsOn then return end
if Camera.CameraType ~= Enum.CameraType.Scriptable then
Camera.CameraType = Enum.CameraType.Scriptable
end
local char = LP.Character
if not char then return end
local hrp = char:FindFirstChild("HumanoidRootPart")
local head = char:FindFirstChild("Head")
if not hrp or not head then return end
hrp.CFrame = CFrame.new(hrp.Position) * CFrame.Angles(0, math.rad(S.yaw), 0)
local rot = CFrame.Angles(0, math.rad(S.yaw), 0) * CFrame.Angles(math.rad(S.pitch), 0, 0)
local camPos = head.Position
+ rot.RightVector * (S.shoulder * CFG.OTS_OFFSET_X)
+ Vector3.new(0, CFG.OTS_OFFSET_Y, 0)
- rot.LookVector * CFG.OTS_OFFSET_Z
Camera.CFrame = CFrame.new(camPos) * rot
Camera.Focus = CFrame.new(camPos + rot.LookVector * 50)
Camera.FieldOfView = CFG.OTS_FOV
end
local function startOTS()
if S.otsOn then return end
S.otsOn = true
S.origFOV = Camera.FieldOfView
S.origCamType = Camera.CameraType
S.origCamMode = LP.CameraMode
local hum = LP.Character and LP.Character:FindFirstChildOfClass("Humanoid")
if hum then
S.origAutoRotate = hum.AutoRotate
hum.AutoRotate = false
end
initAngles()
if S.camConn then S.camConn:Disconnect() end
S.camConn = RunService.RenderStepped:Connect(renderOTS)
end
local function stopOTS()
if not S.otsOn then return end
S.otsOn = false
if S.camConn then S.camConn:Disconnect() S.camConn = nil end
local hum = LP.Character and LP.Character:FindFirstChildOfClass("Humanoid")
if hum then hum.AutoRotate = S.origAutoRotate end
if S.origFOV then Camera.FieldOfView = S.origFOV end
if S.origCamType then Camera.CameraType = S.origCamType end
if S.origCamMode then LP.CameraMode = S.origCamMode end
end
local function toggleOTS()
if S.otsOn then stopOTS() else startOTS() end
end
local function swapShoulder()
S.shoulder = -S.shoulder
pcall(function()
StarterGui:SetCore("SendNotification", {
Title = "SWAP",
Text = S.shoulder == 1 and "Hombro DERECHO" or "Hombro IZQUIERDO",
Duration = 1
})
end)
end
local function adjustOffset(axis, delta)
if axis == "Y" then
CFG.OTS_OFFSET_Y = math.clamp(CFG.OTS_OFFSET_Y + delta, -1.0, 1.5)
elseif axis == "X" then
CFG.OTS_OFFSET_X = math.clamp(CFG.OTS_OFFSET_X + delta, -2.0, 2.0)
elseif axis == "Z" then
CFG.OTS_OFFSET_Z = math.clamp(CFG.OTS_OFFSET_Z + delta, 0.0, 3.0)
end
pcall(function()
StarterGui:SetCore("SendNotification", {
Title = "Offset " .. axis,
Text = string.format("%.2f", axis == "X" and CFG.OTS_OFFSET_X or axis == "Y" and CFG.OTS_OFFSET_Y or CFG.OTS_OFFSET_Z),
Duration = 0.8
})
end)
end
local function resetOffset()
CFG.OTS_OFFSET_X = DEFAULT_OFFSET.X
CFG.OTS_OFFSET_Y = DEFAULT_OFFSET.Y
CFG.OTS_OFFSET_Z = DEFAULT_OFFSET.Z
S.shoulder = 1
pcall(function()
StarterGui:SetCore("SendNotification", {
Title = "RESET",
Text = "Offset y hombro restaurados",
Duration = 1.5
})
end)
end
-- ============================================================
-- TOUCH
-- ============================================================
local function onTouchBegan(input, gp)
if not S.otsOn or gp then return end
if input.UserInputType ~= Enum.UserInputType.Touch then return end
if S.cameraTouch ~= nil then return end
local screenW = Camera.ViewportSize.X
if input.Position.X < screenW * CFG.OTS_TOUCH_DEADZONE then return end
S.cameraTouch = input
end
local function onTouchEnded(input)
if input == S.cameraTouch then S.cameraTouch = nil end
end
local function onTouchMoved(input, gp)
if not S.otsOn or gp then return end
if input ~= S.cameraTouch then return end
local d = input.Delta
S.yaw = S.yaw - d.X * CFG.OTS_SENS
S.pitch = S.pitch - d.Y * CFG.OTS_SENS
S.pitch = math.clamp(S.pitch, CFG.OTS_PITCH_MIN, CFG.OTS_PITCH_MAX)
if S.yaw > 180 then S.yaw = S.yaw - 360 end
if S.yaw < -180 then S.yaw = S.yaw + 360 end
end
local function setupTouch()
S.touchConns[1] = UIS.TouchStarted:Connect(onTouchBegan)
S.touchConns[2] = UIS.TouchEnded:Connect(onTouchEnded)
S.touchConns[3] = UIS.TouchMoved:Connect(onTouchMoved)
end
local function teardownTouch()
for _, c in ipairs(S.touchConns) do
pcall(function() c:Disconnect() end)
end
S.touchConns = {}
S.cameraTouch = nil
end
-- ============================================================
-- HOOKS
-- ============================================================
local function hookPlayer(p)
if p == LP then return end
p.CharacterAdded:Connect(function(c)
task.wait(0.5)
addHighlight(c)
end)
end
for _, p in ipairs(Players:GetPlayers()) do
if p ~= LP and p.Character then addHighlight(p.Character) end
hookPlayer(p)
end
Players.PlayerAdded:Connect(hookPlayer)
Players.PlayerRemoving:Connect(function(p)
if p.Character then removeHighlight(p.Character) end
end)
workspace.DescendantAdded:Connect(function(child)
if child:IsA("Humanoid") and child.Parent and child.Parent:IsA("Model") then
task.wait(0.2)
addHighlight(child.Parent)
end
end)
workspace.DescendantRemoving:Connect(function(child)
if child:IsA("Model") and S.highlights[child] then
removeHighlight(child)
end
end)
S.charConn = LP.CharacterAdded:Connect(function(char)
task.wait(0.5)
scanWorld()
if S.otsOn then
local hum = char:FindFirstChildOfClass("Humanoid")
if hum then hum.AutoRotate = false end
initAngles()
end
end)
-- ============================================================
-- LOGO: Monograma "CO" entrelazado (elegante)
-- ============================================================
local function buildLogo(parent, size, cA, cB)
local logo = Instance.new("Frame")
logo.Name = "Logo"
logo.Size = UDim2.new(0, size, 0, size)
logo.AnchorPoint = Vector2.new(0.5, 0.5)
logo.Position = UDim2.new(0.5, 0, 0.5, 0)
logo.BackgroundTransparency = 1
logo.Parent = parent
-- Línea diagonal de "entrelazado" (detrás de las letras)
local conn = Instance.new("Frame")
conn.Name = "Connector"
conn.Size = UDim2.new(0, size * 1.1, 0, 1)
conn.AnchorPoint = Vector2.new(0.5, 0.5)
conn.Position = UDim2.new(0.5, 0, 0.55, 0)
conn.Rotation = -28
conn.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
conn.BackgroundTransparency = 0.75
conn.BorderSizePixel = 0
conn.ZIndex = 1
conn.Parent = logo
-- Letra C (izquierda, cyan)
local letterC = Instance.new("TextLabel")
letterC.Name = "LetterC"
letterC.Size = UDim2.new(0.58, 0, 0.9, 0)
letterC.Position = UDim2.new(0.02, 0, 0.05, 0)
letterC.BackgroundTransparency = 1
letterC.Text = "C"
letterC.TextColor3 = cA
letterC.TextScaled = true
letterC.Font = Enum.Font.Bodoni
letterC.TextXAlignment = Enum.TextXAlignment.Center
letterC.TextYAlignment = Enum.TextYAlignment.Center
letterC.ZIndex = 3
letterC.Parent = logo
-- Letra O (derecha, verde, solapada ligeramente)
local letterO = Instance.new("TextLabel")
letterO.Name = "LetterO"
letterO.Size = UDim2.new(0.58, 0, 0.9, 0)
letterO.Position = UDim2.new(0.40, 0, 0.05, 0)
letterO.BackgroundTransparency = 1
letterO.Text = "O"
letterO.TextColor3 = cB
letterO.TextScaled = true
letterO.Font = Enum.Font.Bodoni
letterO.TextXAlignment = Enum.TextXAlignment.Center
letterO.TextYAlignment = Enum.TextYAlignment.Center
letterO.ZIndex = 2
letterO.Parent = logo
-- Underline decorativo (ancla visual)
local underline = Instance.new("Frame")
underline.Name = "Underline"
underline.Size = UDim2.new(0.85, 0, 0, 1)
underline.Position = UDim2.new(0.5, 0, 0.96, 0)
underline.AnchorPoint = Vector2.new(0.5, 0.5)
underline.BackgroundColor3 = cA
underline.BackgroundTransparency = 0.4
underline.BorderSizePixel = 0
underline.ZIndex = 4
underline.Parent = logo
local ulCorner = Instance.new("UICorner")
ulCorner.CornerRadius = UDim.new(1, 0)
ulCorner.Parent = underline
-- Animación: pulso sutil del connector diagonal
task.spawn(function()
while logo.Parent do
local t1 = TweenService:Create(conn, TweenInfo.new(1.4), {BackgroundTransparency = 0.9})
t1:Play()
task.wait(1.4)
local t2 = TweenService:Create(conn, TweenInfo.new(1.4), {BackgroundTransparency = 0.65})
t2:Play()
task.wait(1.4)
end
end)
end
-- ============================================================
-- MENU
-- ============================================================
local function buildMenu()
local existing = CoreGui:FindFirstChild("COPS_GUI")
if existing then existing:Destroy() end
local sg = Instance.new("ScreenGui")
sg.Name = "COPS_GUI"
sg.ResetOnSpawn = false
sg.IgnoreGuiInset = true
sg.Parent = CoreGui
local mf = Instance.new("Frame")
mf.Name = "Main"
mf.Size = UDim2.new(0, CFG.UI_WIDTH, 0, CFG.UI_HEIGHT)
mf.Position = CFG.GUI_POS
mf.BackgroundColor3 = CFG.CLR_DARK
mf.BackgroundTransparency = 0.1
mf.BorderSizePixel = 0
mf.Active = true
mf.Draggable = true
mf.Parent = sg
local cr = Instance.new("UICorner") cr.CornerRadius = UDim.new(0, 12) cr.Parent = mf
local stk = Instance.new("UIStroke")
stk.Color = CFG.CLR_PRIMARY
stk.Thickness = 1.2
stk.Transparency = 0.4
stk.Parent = mf
local scale = Instance.new("UIScale")
scale.Parent = mf
local vp = Camera.ViewportSize
local minDim = math.min(vp.X, vp.Y)
if minDim < 500 then
scale.Scale = math.clamp(minDim / 500, 0.7, 1.0)
else
scale.Scale = 1.0
end
Camera:GetPropertyChangedSignal("ViewportSize"):Connect(function()
local v = Camera.ViewportSize
local m = math.min(v.X, v.Y)
if m < 500 then
scale.Scale = math.clamp(m / 500, 0.7, 1.0)
else
scale.Scale = 1.0
end
end)
-- HEADER
local header = Instance.new("Frame")
header.Size = UDim2.new(1, 0, 0, 28)
header.BackgroundColor3 = CFG.CLR_HEADER
header.BorderSizePixel = 0
header.Parent = mf
local hc = Instance.new("UICorner") hc.CornerRadius = UDim.new(0, 12) hc.Parent = header
local logoHolder = Instance.new("Frame")
logoHolder.Size = UDim2.new(0, 20, 0, 20)
logoHolder.Position = UDim2.new(0, 5, 0.5, 0)
logoHolder.AnchorPoint = Vector2.new(0, 0.5)
logoHolder.BackgroundTransparency = 1
logoHolder.Parent = header
buildLogo(logoHolder, 18, CFG.CLR_PRIMARY, CFG.CLR_SECONDARY)
local title = Instance.new("TextLabel")
title.Size = UDim2.new(1, -30, 1, 0)
title.Position = UDim2.new(0, 28, 0, 0)
title.BackgroundTransparency = 1
title.Text = "CORE-OPS"
title.TextColor3 = CFG.CLR_PRIMARY
title.TextSize = 11
title.Font = Enum.Font.GothamBold
title.TextXAlignment = Enum.TextXAlignment.Left
title.Parent = header
-- TABS
local tabBar = Instance.new("Frame")
tabBar.Size = UDim2.new(1, -8, 0, 24)
tabBar.Position = UDim2.new(0, 4, 0, 32)
tabBar.BackgroundTransparency = 1
tabBar.Parent = mf
local tabMainBtn = Instance.new("TextButton")
tabMainBtn.Size = UDim2.new(0.5, -2, 1, 0)
tabMainBtn.Position = UDim2.new(0, 0, 0, 0)
tabMainBtn.BackgroundColor3 = CFG.CLR_TAB_ACTIVE
tabMainBtn.BorderSizePixel = 0
tabMainBtn.Text = "MAIN"
tabMainBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
tabMainBtn.TextSize = 11
tabMainBtn.Font = Enum.Font.GothamBold
tabMainBtn.AutoButtonColor = false
tabMainBtn.Parent = tabBar
local tmc = Instance.new("UICorner") tmc.CornerRadius = UDim.new(0, 6) tmc.Parent = tabMainBtn
local tabSlotsBtn = Instance.new("TextButton")
tabSlotsBtn.Size = UDim2.new(0.5, -2, 1, 0)
tabSlotsBtn.Position = UDim2.new(0.5, 2, 0, 0)
tabSlotsBtn.BackgroundColor3 = CFG.CLR_TAB_INACTIVE
tabSlotsBtn.BorderSizePixel = 0
tabSlotsBtn.Text = "SLOTS"
tabSlotsBtn.TextColor3 = Color3.fromRGB(180, 180, 180)
tabSlotsBtn.TextSize = 11
tabSlotsBtn.Font = Enum.Font.GothamBold
tabSlotsBtn.AutoButtonColor = false
tabSlotsBtn.Parent = tabBar
local tsc = Instance.new("UICorner") tsc.CornerRadius = UDim.new(0, 6) tsc.Parent = tabSlotsBtn
local mainPanel = Instance.new("Frame")
mainPanel.Size = UDim2.new(1, 0, 1, -90)
mainPanel.Position = UDim2.new(0, 0, 0, 60)
mainPanel.BackgroundTransparency = 1
mainPanel.Parent = mf
local slotsPanel = Instance.new("Frame")
slotsPanel.Size = UDim2.new(1, 0, 1, -90)
slotsPanel.Position = UDim2.new(0, 0, 0, 60)
slotsPanel.BackgroundTransparency = 1
slotsPanel.Visible = false
slotsPanel.Parent = mf
local function mkBtn(parent, name, text, color, size, pos, cb)
local b = Instance.new("TextButton")
b.Name = "Btn" .. name
b.Size = size
b.Position = pos
b.BackgroundColor3 = color
b.BorderSizePixel = 0
b.Text = text
b.TextColor3 = Color3.fromRGB(255, 255, 255)
b.TextScaled = true
b.Font = Enum.Font.GothamBold
b.AutoButtonColor = false
b.Parent = parent
local c = Instance.new("UICorner") c.CornerRadius = UDim.new(0, 7) c.Parent = b
b.MouseButton1Click:Connect(function()
cb()
local targetColor = b.BackgroundColor3
local t1 = TweenService:Create(b, TweenInfo.new(0.08), {BackgroundColor3 = Color3.fromRGB(255,255,255)})
t1:Play()
task.wait(0.08)
local t2 = TweenService:Create(b, TweenInfo.new(0.12), {BackgroundColor3 = targetColor})
t2:Play()
end)
return b
end
local PAD = 6
local BW = (CFG.UI_WIDTH - PAD * 3) / 2
local BH = 28
local GAP = 4
local function gridPos(col, row)
local x = PAD + (col - 1) * (BW + GAP)
local y = (row - 1) * (BH + GAP)
return UDim2.new(0, x, 0, y), UDim2.new(0, BW, 0, BH)
end
-- Fila 1: ESP | OTS
local p1, s1 = gridPos(1, 1)
local btnESP = mkBtn(mainPanel, "ESP", "ESP", S.espOn and CFG.CLR_BTN_ACTIVE or CFG.CLR_BTN, s1, p1, function()
S.espOn = not S.espOn
btnESP.BackgroundColor3 = S.espOn and CFG.CLR_BTN_ACTIVE or CFG.CLR_BTN
end)
local p2, s2 = gridPos(2, 1)
local btnOTS = mkBtn(mainPanel, "OTS", "OTS", S.otsOn and CFG.CLR_BTN_ACTIVE or CFG.CLR_BTN, s2, p2, function()
toggleOTS()
btnOTS.BackgroundColor3 = S.otsOn and CFG.CLR_BTN_ACTIVE or CFG.CLR_BTN
end)
-- Fila 2: VM | SENS
local p3, s3 = gridPos(1, 2)
local btnVM = mkBtn(mainPanel, "VM", CFG.HIDE_VIEWMODEL and "VM:ON" or "VM:OFF", CFG.HIDE_VIEWMODEL and CFG.CLR_BTN_ACTIVE or CFG.CLR_BTN, s3, p3, function()
CFG.HIDE_VIEWMODEL = not CFG.HIDE_VIEWMODEL
btnVM.Text = CFG.HIDE_VIEWMODEL and "VM:ON" or "VM:OFF"
btnVM.BackgroundColor3 = CFG.HIDE_VIEWMODEL and CFG.CLR_BTN_ACTIVE or CFG.CLR_BTN
if not CFG.HIDE_VIEWMODEL then restoreViewmodels() end
end)
local pSens, sSens = gridPos(2, 2)
local sensFrame = Instance.new("Frame")
sensFrame.Size = sSens
sensFrame.Position = pSens
sensFrame.BackgroundColor3 = CFG.CLR_BTN_MOMENT
sensFrame.BorderSizePixel = 0
sensFrame.Parent = mainPanel
local sensCorner = Instance.new("UICorner") sensCorner.CornerRadius = UDim.new(0, 7) sensCorner.Parent = sensFrame
local sensMinus = Instance.new("TextButton")
sensMinus.Size = UDim2.new(0.5, 0, 1, 0)
sensMinus.BackgroundTransparency = 1
sensMinus.Text = "-"
sensMinus.TextColor3 = Color3.fromRGB(255, 255, 255)
sensMinus.TextSize = 16
sensMinus.Font = Enum.Font.GothamBold
sensMinus.AutoButtonColor = false
sensMinus.Parent = sensFrame
local sensPlus = Instance.new("TextButton")
sensPlus.Size = UDim2.new(0.5, 0, 1, 0)
sensPlus.Position = UDim2.new(0.5, 0, 0, 0)
sensPlus.BackgroundTransparency = 1
sensPlus.Text = "+"
sensPlus.TextColor3 = Color3.fromRGB(255, 255, 255)
sensPlus.TextSize = 16
sensPlus.Font = Enum.Font.GothamBold
sensPlus.AutoButtonColor = false
sensPlus.Parent = sensFrame
local sensDivider = Instance.new("Frame")
sensDivider.Size = UDim2.new(0, 1, 0.7, 0)
sensDivider.Position = UDim2.new(0.5, 0, 0.15, 0)
sensDivider.BackgroundColor3 = Color3.fromRGB(80, 80, 90)
sensDivider.BorderSizePixel = 0
sensDivider.Parent = sensFrame
sensMinus.MouseButton1Click:Connect(function()
CFG.OTS_SENS = math.max(CFG.OTS_SENS - 0.03, 0.05)
pcall(function()
StarterGui:SetCore("SendNotification", {Title = "Sens", Text = string.format("%.2f", CFG.OTS_SENS), Duration = 1})
end)
end)
sensPlus.MouseButton1Click:Connect(function()
CFG.OTS_SENS = math.min(CFG.OTS_SENS + 0.03, 0.6)
pcall(function()
StarterGui:SetCore("SendNotification", {Title = "Sens", Text = string.format("%.2f", CFG.OTS_SENS), Duration = 1})
end)
end)
-- Fila 3: ↑ | ↓
local p4, s4 = gridPos(1, 3)
mkBtn(mainPanel, "ArrowUp", "↑", CFG.CLR_BTN_ARROW, s4, p4, function()
adjustOffset("Y", CFG.OTS_STEP)
end)
local p5, s5 = gridPos(2, 3)
mkBtn(mainPanel, "ArrowDown", "↓", CFG.CLR_BTN_ARROW, s5, p5, function()
adjustOffset("Y", -CFG.OTS_STEP)
end)
-- Fila 4: ← | →
local p6, s6 = gridPos(1, 4)
mkBtn(mainPanel, "ArrowLeft", "←", CFG.CLR_BTN_ARROW, s6, p6, function()
adjustOffset("X", -CFG.OTS_STEP)
end)
local p7, s7 = gridPos(2, 4)
mkBtn(mainPanel, "ArrowRight", "→", CFG.CLR_BTN_ARROW, s7, p7, function()
adjustOffset("X", CFG.OTS_STEP)
end)
-- Fila 5: ADELANTE | ATRAS
local p8, s8 = gridPos(1, 5)
mkBtn(mainPanel, "Adelante", "ADELANTE", CFG.CLR_BTN_FWD, s8, p8, function()
adjustOffset("Z", -CFG.OTS_STEP)
end)
local p9, s9 = gridPos(2, 5)
mkBtn(mainPanel, "Atras", "ATRAS", CFG.CLR_BTN_BACK, s9, p9, function()
adjustOffset("Z", CFG.OTS_STEP)
end)
-- Fila 6: RESET | HIDE
local p10, s10 = gridPos(1, 6)
mkBtn(mainPanel, "Reset", "RESET", CFG.CLR_BTN_RESET, s10, p10, function()
resetOffset()
end)
local p11, s11 = gridPos(2, 6)
mkBtn(mainPanel, "Hide", "HIDE", CFG.CLR_BTN_MOMENT, s11, p11, function()
mf.Visible = false
local restoreBtn = Instance.new("TextButton")
restoreBtn.Name = "RestoreBtn"
restoreBtn.Size = UDim2.new(0, 50, 0, 50)
restoreBtn.Position = UDim2.new(0, 10, 0, 10)
restoreBtn.BackgroundColor3 = CFG.CLR_DARK
restoreBtn.BackgroundTransparency = 0.1
restoreBtn.BorderSizePixel = 0
restoreBtn.Text = ""
restoreBtn.AutoButtonColor = false
restoreBtn.Active = true
restoreBtn.Draggable = true
restoreBtn.Parent = sg
local rc = Instance.new("UICorner") rc.CornerRadius = UDim.new(0, 12) rc.Parent = restoreBtn
local rst = Instance.new("UIStroke")
rst.Color = CFG.CLR_PRIMARY
rst.Thickness = 1.5
rst.Transparency = 0.2
rst.Parent = restoreBtn
buildLogo(restoreBtn, 32, CFG.CLR_PRIMARY, CFG.CLR_SECONDARY)
task.spawn(function()
local pulse = true
while restoreBtn.Parent do
local goal = pulse and 0.4 or 0.15
local t = TweenService:Create(rst, TweenInfo.new(0.8), {Transparency = goal})
t:Play()
pulse = not pulse
task.wait(0.9)
end
end)
restoreBtn.MouseButton1Click:Connect(function()
mf.Visible = true
restoreBtn:Destroy()
end)
end)
-- Fila 7: X ancho completo
local closeBtn = Instance.new("TextButton")
closeBtn.Name = "BtnClose"
closeBtn.Size = UDim2.new(1, -PAD * 2, 0, BH)
closeBtn.Position = UDim2.new(0, PAD, 0, (7 - 1) * (BH + GAP))
closeBtn.BackgroundColor3 = CFG.CLR_BTN_CLOSE
closeBtn.BorderSizePixel = 0
closeBtn.Text = "X"
closeBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
closeBtn.TextScaled = true
closeBtn.Font = Enum.Font.GothamBold
closeBtn.AutoButtonColor = false
closeBtn.Parent = mainPanel
local cbc = Instance.new("UICorner") cbc.CornerRadius = UDim.new(0, 7) cbc.Parent = closeBtn
closeBtn.MouseButton1Click:Connect(function()
stopOTS()
teardownTouch()
if S.vmConn then S.vmConn:Disconnect() S.vmConn = nil end
restoreViewmodels()
for m, _ in pairs(S.highlights) do removeHighlight(m) end
sg:Destroy()
end)
-- SLOTS PANEL
local slotBtns = {}
local function refreshSlotButtons()
for i, btn in ipairs(slotBtns) do
if i == selectedSlot then
btn.BackgroundColor3 = CFG.CLR_PRIMARY
else
btn.BackgroundColor3 = CFG.CLR_BTN
end
local stroke = btn:FindFirstChildOfClass("UIStroke")
if not stroke then
stroke = Instance.new("UIStroke")
stroke.Parent = btn
end
if saveSlots[i] then
stroke.Color = CFG.CLR_SECONDARY
stroke.Thickness = 1.5
stroke.Transparency = 0
else
stroke.Color = Color3.fromRGB(50, 50, 55)
stroke.Thickness = 1
stroke.Transparency = 0.5
end
end
end
local slotW = (CFG.UI_WIDTH - PAD * 2 - GAP * 4) / 5
for i = 1, 5 do
local x = PAD + (i - 1) * (slotW + GAP)
local sb = Instance.new("TextButton")
sb.Name = "Slot" .. i
sb.Size = UDim2.new(0, slotW, 0, 40)
sb.Position = UDim2.new(0, x, 0, 0)
sb.BackgroundColor3 = CFG.CLR_BTN
sb.BorderSizePixel = 0
sb.Text = tostring(i)
sb.TextColor3 = Color3.fromRGB(255, 255, 255)
sb.TextSize = 16
sb.Font = Enum.Font.GothamBold
sb.AutoButtonColor = false
sb.Parent = slotsPanel
local c = Instance.new("UICorner") c.CornerRadius = UDim.new(0, 7) c.Parent = sb
table.insert(slotBtns, sb)
sb.MouseButton1Click:Connect(function()
selectedSlot = i
refreshSlotButtons()
pcall(function()
StarterGui:SetCore("SendNotification", {
Title = "Slot " .. i,
Text = saveSlots[i] and "Con datos" or "Vacío",
Duration = 1
})
end)
end)
end
mkBtn(slotsPanel, "Save", "SAVE",
CFG.CLR_BTN_SAVE,
UDim2.new(0.5, -PAD - GAP/2, 0, 40),
UDim2.new(0, PAD, 0, 48),
function()
saveSlots[selectedSlot] = {
X = CFG.OTS_OFFSET_X,
Y = CFG.OTS_OFFSET_Y,
Z = CFG.OTS_OFFSET_Z,
shoulder = S.shoulder,
}
persistSlots()
refreshSlotButtons()
pcall(function()
StarterGui:SetCore("SendNotification", {
Title = "Guardado",
Text = "Slot " .. selectedSlot,
Duration = 1.5
})
end)
end
)
mkBtn(slotsPanel, "Load", "LOAD",
CFG.CLR_BTN_LOAD,
UDim2.new(0.5, -PAD - GAP/2, 0, 40),
UDim2.new(0.5, GAP/2, 0, 48),
function()
local data = saveSlots[selectedSlot]
if not data then
pcall(function()
StarterGui:SetCore("SendNotification", {
Title = "Vacío",
Text = "Slot " .. selectedSlot .. " sin datos",
Duration = 1.5
})
end)
return
end
CFG.OTS_OFFSET_X = data.X
CFG.OTS_OFFSET_Y = data.Y
CFG.OTS_OFFSET_Z = data.Z
S.shoulder = data.shoulder
pcall(function()
StarterGui:SetCore("SendNotification", {
Title = "Cargado",
Text = "Slot " .. selectedSlot,
Duration = 1.5
})
end)
end
)
local infoLabel = Instance.new("TextLabel")
infoLabel.Size = UDim2.new(1, -PAD * 2, 0, 60)
infoLabel.Position = UDim2.new(0, PAD, 0, 96)
infoLabel.BackgroundColor3 = Color3.fromRGB(28, 28, 34)
infoLabel.BackgroundTransparency = 0.3
infoLabel.BorderSizePixel = 0
infoLabel.Text = ""
infoLabel.TextColor3 = Color3.fromRGB(200, 200, 200)
infoLabel.TextSize = 10
infoLabel.Font = Enum.Font.Code
infoLabel.TextXAlignment = Enum.TextXAlignment.Left
infoLabel.TextYAlignment = Enum.TextYAlignment.Top
infoLabel.RichText = true
infoLabel.Parent = slotsPanel
local ilc = Instance.new("UICorner") ilc.CornerRadius = UDim.new(0, 7) ilc.Parent = infoLabel
local ilp = Instance.new("UIPadding")
ilp.PaddingTop = UDim.new(0, 4)
ilp.PaddingLeft = UDim.new(0, 6)
ilp.PaddingRight = UDim.new(0, 6)
ilp.Parent = infoLabel
local function switchTab(tab)
if tab == "MAIN" then
mainPanel.Visible = true
slotsPanel.Visible = false
tabMainBtn.BackgroundColor3 = CFG.CLR_TAB_ACTIVE
tabMainBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
tabSlotsBtn.BackgroundColor3 = CFG.CLR_TAB_INACTIVE
tabSlotsBtn.TextColor3 = Color3.fromRGB(180, 180, 180)
else
mainPanel.Visible = false
slotsPanel.Visible = true
tabSlotsBtn.BackgroundColor3 = CFG.CLR_TAB_ACTIVE
tabSlotsBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
tabMainBtn.BackgroundColor3 = CFG.CLR_TAB_INACTIVE
tabMainBtn.TextColor3 = Color3.fromRGB(180, 180, 180)
refreshSlotButtons()
end
end
tabMainBtn.MouseButton1Click:Connect(function() switchTab("MAIN") end)
tabSlotsBtn.MouseButton1Click:Connect(function() switchTab("SLOTS") end)
local status = Instance.new("TextLabel")
status.Name = "Status"
status.Size = UDim2.new(1, -12, 0, 16)
status.Position = UDim2.new(0, 6, 1, -20)
status.BackgroundTransparency = 1
status.Text = "E:ON | O:OFF | SLOT 1"
status.TextColor3 = Color3.fromRGB(150, 150, 150)
status.TextSize = 10
status.Font = Enum.Font.GothamBold
status.Parent = mf
task.spawn(function()
while sg.Parent do
local dist = 0
local char = LP.Character
if char then
local head = char:FindFirstChild("Head")
if head then
dist = (Camera.CFrame.Position - head.Position).Magnitude
end
end
local danger = dist > 0 and S.otsOn and dist < 1.2
status.Text = string.format("E:%s O:%s S%d%s | d:%.1f",
S.espOn and "ON" or "OFF",
S.otsOn and "ON" or "OFF",
selectedSlot,
saveSlots[selectedSlot] and "*" or "",
dist)
status.TextColor3 = danger and Color3.fromRGB(255, 100, 100) or Color3.fromRGB(150, 150, 150)
infoLabel.Text = string.format(
"X: <b>%.2f</b>\nY: <b>%.2f</b>\nZ: <b>%.2f</b>\nHombro: <b>%s</b>\nDist: <b>%.2f</b>",
CFG.OTS_OFFSET_X,
CFG.OTS_OFFSET_Y,
CFG.OTS_OFFSET_Z,
S.shoulder == 1 and "DER" or "IZQ",
dist
)
task.wait(0.3)
end
end)
refreshSlotButtons()
S.guiRefs = {sg = sg, mf = mf, refreshSlots = refreshSlotButtons, switchTab = switchTab}
end
-- ============================================================
-- BOTÓN SWAP FLOTANTE
-- ============================================================
local function buildSwapButton()
local sg = S.guiRefs.sg
if not sg then return end
local btn = Instance.new("TextButton")
btn.Name = "SwapFloating"
btn.Size = UDim2.new(0, CFG.SWAP_BTN_SIZE, 0, CFG.SWAP_BTN_SIZE)
btn.Position = CFG.SWAP_BTN_POS
btn.AnchorPoint = Vector2.new(1, 1)
btn.BackgroundColor3 = CFG.CLR_DARK
btn.BackgroundTransparency = 0.1
btn.BorderSizePixel = 0
btn.Text = "R"
btn.TextColor3 = CFG.CLR_SECONDARY
btn.TextSize = 20
btn.Font = Enum.Font.GothamBold
btn.AutoButtonColor = false
btn.Active = true
btn.Draggable = true
btn.Parent = sg
local corner = Instance.new("UICorner")
corner.CornerRadius = UDim.new(1, 0)
corner.Parent = btn
local stroke = Instance.new("UIStroke")
stroke.Color = CFG.CLR_PRIMARY
stroke.Thickness = 2
stroke.Transparency = 0.15
stroke.Parent = btn
local label = Instance.new("TextLabel")
label.Size = UDim2.new(1, 0, 0, 12)
label.Position = UDim2.new(0, 0, 0, -14)
label.BackgroundTransparency = 1
label.Text = "SWAP"
label.TextColor3 = CFG.CLR_PRIMARY
label.TextSize = 10
label.Font = Enum.Font.GothamBold
label.Parent = btn
task.spawn(function()
local up = true
while btn.Parent do
local goal = up and 0.4 or 0.15
local t = TweenService:Create(stroke, TweenInfo.new(1.2), {Transparency = goal})
t:Play()
up = not up
task.wait(1.3)
end
end)
btn.MouseButton1Click:Connect(function()
swapShoulder()
btn.Text = S.shoulder == 1 and "R" or "L"
local flash = TweenService:Create(btn, TweenInfo.new(0.08), {BackgroundColor3 = Color3.fromRGB(255,255,255)})
flash:Play()
task.wait(0.08)
local restore = TweenService:Create(btn, TweenInfo.new(0.15), {BackgroundColor3 = CFG.CLR_DARK})
restore:Play()
end)
end
-- ============================================================
-- INICIALIZACIÓN
-- ============================================================
loadSlotsFromDisk()
setupTouch()
scanWorld()
buildMenu()
buildSwapButton()
startVMLoop()
RunService.RenderStepped:Connect(updateHighlights)
pcall(function()
StarterGui:SetCore("SendNotification", {
Title = "CORE-OPS",
Text = "Logo nuevo: monograma CO",
Duration = 3
})
end)
print("[CORE-OPS v1.4] Cargado.")Review the source before using it. Executions count successful copies, capped at 10 per user and network per script in 24 hours.


Your community, in one place