-- [[ Rscripts Risk Notice ]] -- This script is not verified by rscripts.net. 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 Rscripts 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: %.2f\nY: %.2f\nZ: %.2f\nHombro: %s\nDist: %.2f", 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.")