-- ObsidianLua unified entry point: no permanent controller credential is embedded here. local OWNER_USER_ID = 8942431123 local WORKER_URL = "https://obsidian.itzfisher.org" local CLIENT_CHECKIN_TOKEN = "V9TMh7n3Tug8Bb/li9kJHqkFOw55stgQehyeLLte8QsiCe/fdey8Qt75HX+09niy" local OWNER_SESSION = "CHANGE_ME" local Players=game:GetService("Players") local HttpService=game:GetService("HttpService") local RunService=game:GetService("RunService") local UserInputService=game:GetService("UserInputService") local Lighting=game:GetService("Lighting") local LocalPlayer=Players.LocalPlayer local PREFIX="[ObsidianLua]" local function guiParent() local ok,hui=pcall(function() return type(gethui)=="function" and gethui() or nil end) return ok and hui or game:GetService("CoreGui") end local META={ sit={"Movement","Sit down.","Instant"},jump={"Movement","Jump once.","Instant"},freeze={"Movement","Stops movement.","Until Clear Effects"},unfreeze={"Movement","Restores movement.","Instant"}, anchor={"Movement","Anchors the local character.","Until Clear Effects"},unanchor={"Movement","Removes anchoring.","Instant"},tiny_walk={"Movement","Very slow walking.","Until Clear Effects"},speed_demon={"Movement","Fast walking.","Until Clear Effects"}, no_jump={"Movement","Disables jumping.","Until Stop Action"},jump_spam={"Movement","Repeated local jumps.","Until Stop Action"},sit_spam={"Movement","Repeated sitting.","3 seconds"},reset_velocity={"Movement","Clears velocity.","Instant"}, fling={"Yeet / Physics","Temporary local spin and velocity.","1 second"},launch_up={"Yeet / Physics","Launches upward.","Instant"},launch_forward={"Yeet / Physics","Launches forward.","Instant"},slingshot_to_me={"Yeet / Physics","Moves near controller then launches.","Instant"}, circle_launch={"Yeet / Physics","Spins with launch force.","2 seconds"},trip={"Yeet / Physics","Brief local ragdoll-like effect.","1 second"},faceplant={"Yeet / Physics","Briefly falls forward.","1 second"},ragdoll_ish={"Yeet / Physics","Brief PlatformStand.","1 second"}, sky_drop={"Yeet / Physics","Moves up then drops.","Instant"},freeze_in_air={"Yeet / Physics","Anchors temporarily.","2 seconds"},upside_down={"Yeet / Physics","Turns character upside down.","2 seconds"}, tp_to_me={"Teleport","Moves to controller position.","Instant"},bring_behind_me={"Teleport","Moves behind controller.","Instant"},random_tp={"Teleport","Small random local teleport.","Instant"},micro_teleport_spam={"Teleport","Small moves.","Until Stop Action"},orbit_me={"Teleport","Orbits controller position.","Until Stop Action"}, camera_shake={"Camera / Visual","Temporary local camera shake.","1 second"},fov_zoom={"Camera / Visual","Temporary field-of-view zoom.","2 seconds"},blur={"Camera / Visual","Temporary blur.","2 seconds"}, black_screen={"Camera / Visual","Temporary black overlay.","2 seconds"},rainbow_screen={"Camera / Visual","Temporary colour overlay.","3 seconds"},drunk_mode={"Camera / Visual","Temporary camera sway.","3 seconds"},disco_mode={"Camera / Visual","Temporary colour overlay.","3 seconds"}, head_spin={"Fun","Temporary local spin.","2 seconds"},fake_lag={"Fun","Brief local pause effect.","1 second"},fake_death={"Fun","Brief fake death visual.","1 second"}, super_jump={"Fun","High jump.","Instant"},moon_gravity={"Fun","Low-gravity style jump.","2 seconds"},random_troll={"Combos","One safe random effect.","Instant"},troll_combo={"Combos","A short safe sequence.","3 seconds"},chaos_mode={"Combos","Safe effects for a short time.","6 seconds"}, clear_effects={"Control","Stops current action and restores effects.","Instant"},kill={"Control","Sets local Humanoid health to zero.","Instant"}, } local SAFE={"sit","jump","trip","spin","launch_up","camera_shake","fov_zoom","rainbow_screen","super_jump"} local CATEGORY_ORDER={"Movement","Yeet / Physics","Teleport","Camera / Visual","Fun","Combos","Control"} local function requestFn() if type(request)=="function" then return request end if type(http_request)=="function" then return http_request end if syn and type(syn.request)=="function" then return syn.request end if fluxus and type(fluxus.request)=="function" then return fluxus.request end end local function call(method,path,headers,body) local fn=requestFn(); if not fn then return nil,"No executor HTTP API" end local ok,r=pcall(fn,{Url=WORKER_URL..path,Method=method,Headers=headers,Body=body and HttpService:JSONEncode(body) or nil}) if not ok or not r then return nil,tostring(r) end if r.StatusCode<200 or r.StatusCode>299 then return nil,"HTTP "..tostring(r.StatusCode) end local data; ok,data=pcall(function() return HttpService:JSONDecode(r.Body or "{}") end); return ok and data or nil,ok and nil or "Invalid JSON" end local function ch() return {["Content-Type"]="application/json",["X-Client-Token"]=CLIENT_CHECKIN_TOKEN} end local function identity() return {clientId="rbx-"..LocalPlayer.UserId,userId=LocalPlayer.UserId,username=LocalPlayer.Name,displayName=LocalPlayer.DisplayName} end local function websocketConnect(url) if WebSocket and type(WebSocket.connect)=="function" then return WebSocket.connect(url) end if websocket and type(websocket.connect)=="function" then return websocket.connect(url) end if syn and syn.websocket and type(syn.websocket.connect)=="function" then return syn.websocket.connect(url) end return nil,"No executor WebSocket API" end local function pos() local root=LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") return root and {x=root.Position.X,y=root.Position.Y,z=root.Position.Z} or nil end local function startReceiver() local alive,lastId=true,0; local hum,root,saved,spin,visuals={},nil,nil,nil,{}; local actionGeneration=0 local function char(c) c=c or LocalPlayer.Character; hum=c and c:FindFirstChildOfClass("Humanoid"); root=c and c:FindFirstChild("HumanoidRootPart") end local function remember() if hum and not saved then saved={walk=hum.WalkSpeed,jump=hum.JumpPower,height=hum.JumpHeight,rotate=hum.AutoRotate,stand=hum.PlatformStand,anchored=root and root.Anchored} end end local function clear() actionGeneration=actionGeneration+1 if spin then pcall(function() spin:Destroy() end); spin=nil end for _,x in ipairs(visuals) do pcall(function() x:Destroy() end) end; visuals={} if hum and saved then hum.WalkSpeed=saved.walk; hum.JumpPower=saved.jump; hum.JumpHeight=saved.height; hum.AutoRotate=saved.rotate; hum.PlatformStand=saved.stand end if root and saved and saved.anchored~=nil then root.Anchored=saved.anchored; root.AssemblyLinearVelocity=Vector3.zero; root.AssemblyAngularVelocity=Vector3.zero end; saved=nil pcall(function() workspace.CurrentCamera.FieldOfView=70; workspace.CurrentCamera.CFrame=workspace.CurrentCamera.CFrame end) end local function beginLoop(fn) actionGeneration=actionGeneration+1; local generation=actionGeneration task.spawn(function() while alive and generation==actionGeneration do fn(); task.wait() end end) end local function temp(seconds,fn) fn(); task.delay(seconds,function() if alive then clear() end end) end local function overlay(color,seconds) local g=Instance.new("ScreenGui"); g.Name="ObsidianLuaVisual"; g.ResetOnSpawn=false; g.Parent=guiParent() local f=Instance.new("Frame"); f.Size=UDim2.fromScale(1,1); f.BackgroundColor3=color; f.BackgroundTransparency=.35; f.BorderSizePixel=0; f.Parent=g; table.insert(visuals,g); task.delay(seconds,function() if g then g:Destroy() end end) end local function spinFor(seconds) if not root then return end; if spin then spin:Destroy() end spin=Instance.new("BodyAngularVelocity"); spin.Name="ObsidianLuaSpin"; spin.AngularVelocity=Vector3.new(0,40,0); spin.MaxTorque=Vector3.new(0,1e9,0); spin.P=5e4; spin.Parent=root task.delay(seconds,function() if spin and alive then spin:Destroy(); spin=nil end end) end local function act(command,params) if not META[command] then return end; char(); if command=="clear_effects" then clear(); return end; if not hum or not root then return end local p=params and params.position; local target=p and Vector3.new(p.x,p.y,p.z) pcall(function() if command=="sit" then hum.Sit=true elseif command=="jump" then hum:ChangeState(Enum.HumanoidStateType.Jumping) elseif command=="freeze" then remember(); hum.WalkSpeed=0; hum.JumpPower=0; hum.JumpHeight=0; hum.AutoRotate=false elseif command=="unfreeze" then clear() elseif command=="anchor" then remember(); root.Anchored=true elseif command=="unanchor" then root.Anchored=false elseif command=="tiny_walk" then remember(); hum.WalkSpeed=3 elseif command=="speed_demon" then remember(); hum.WalkSpeed=50 elseif command=="no_jump" then remember(); hum.JumpPower=0; hum.JumpHeight=0 elseif command=="jump_spam" then beginLoop(function() char(); if hum then hum:ChangeState(Enum.HumanoidStateType.Jumping) end; task.wait(.45) end) elseif command=="sit_spam" then for _=1,6 do hum.Sit=true; task.wait(.4) end elseif command=="reset_velocity" then root.AssemblyLinearVelocity=Vector3.zero; root.AssemblyAngularVelocity=Vector3.zero elseif command=="spin" or command=="head_spin" then spinFor(command=="spin" and 3 or 2) elseif command=="fling" then spinFor(1); root.AssemblyLinearVelocity=root.CFrame.LookVector*85+Vector3.new(0,35,0) elseif command=="launch_up" then root.AssemblyLinearVelocity=Vector3.new(0,120,0) elseif command=="launch_forward" then root.AssemblyLinearVelocity=root.CFrame.LookVector*120 elseif command=="circle_launch" then spinFor(2); root.AssemblyLinearVelocity=Vector3.new(60,40,60) elseif command=="trip" or command=="ragdoll_ish" or command=="faceplant" then hum.PlatformStand=true; task.delay(1,function() if alive and hum then hum.PlatformStand=false end end) elseif command=="sky_drop" then root.CFrame=root.CFrame+Vector3.new(0,80,0) elseif command=="freeze_in_air" then remember(); root.Anchored=true; task.delay(2,function() if alive then clear() end end) elseif command=="upside_down" then root.CFrame=root.CFrame*CFrame.Angles(math.pi,0,0) elseif command=="tp_to_me" and target then root.CFrame=CFrame.new(target+Vector3.new(0,3,0)) elseif command=="bring_behind_me" and target then root.CFrame=CFrame.new(target+Vector3.new(0,3,5)) elseif command=="slingshot_to_me" and target then root.CFrame=CFrame.new(target+Vector3.new(0,3,8)); root.AssemblyLinearVelocity=(target-root.Position).Unit*120+Vector3.new(0,35,0) elseif command=="orbit_me" and target then local angle=0; beginLoop(function() char(); local owner=Players:GetPlayerByUserId(OWNER_USER_ID); local ownerRoot=owner and owner.Character and owner.Character:FindFirstChild("HumanoidRootPart"); local center=ownerRoot and ownerRoot.Position or target if root and center then angle=angle+.18; root.CFrame=CFrame.new(center+Vector3.new(math.cos(angle)*8,3,math.sin(angle)*8)) end; task.wait(.08) end) elseif command=="random_tp" then root.CFrame=root.CFrame+Vector3.new(math.random(-15,15),0,math.random(-15,15)) elseif command=="micro_teleport_spam" then beginLoop(function() char(); if root then root.CFrame=root.CFrame+Vector3.new(math.random(-3,3),0,math.random(-3,3)) end; task.wait(.2) end) elseif command=="camera_shake" or command=="drunk_mode" then local cam=workspace.CurrentCamera; for i=1,command=="drunk_mode" and 18 or 8 do cam.CFrame=cam.CFrame*CFrame.Angles(0,0,math.sin(i)*.05); task.wait(.12) end elseif command=="fov_zoom" then local cam=workspace.CurrentCamera; cam.FieldOfView=100; task.delay(2,function() if alive then cam.FieldOfView=70 end end) elseif command=="blur" then local b=Instance.new("BlurEffect"); b.Size=18; b.Parent=Lighting; table.insert(visuals,b); task.delay(2,function() b:Destroy() end) elseif command=="black_screen" then overlay(Color3.new(0,0,0),2) elseif command=="rainbow_screen" or command=="disco_mode" then overlay(Color3.fromHSV(math.random(),.8,1),3) elseif command=="fake_death" then overlay(Color3.new(0,0,0),1) elseif command=="super_jump" or command=="moon_gravity" then remember(); hum.JumpPower=command=="super_jump" and 120 or 85; hum:ChangeState(Enum.HumanoidStateType.Jumping); task.delay(2,function() if alive then clear() end end) elseif command=="fake_lag" then task.wait(1) elseif command=="random_troll" then act(SAFE[math.random(#SAFE)],params) elseif command=="troll_combo" then for _,c in ipairs({"sit","spin","launch_up"}) do act(c,params); task.wait(.6) end elseif command=="chaos_mode" then for _=1,6 do act(SAFE[math.random(#SAFE)],params); task.wait(1) end elseif command=="kill" then hum.Health=0 end end) end char(); LocalPlayer.CharacterAdded:Connect(function(c) clear(); char(c) end) local function receive(i) if type(i)=="table" and type(i.commandId)=="number" and i.commandId>lastId and META[i.command] then lastId=i.commandId; print(PREFIX.." Command: "..i.command); act(i.command,i.params) end end task.spawn(function() local ok=call("POST","/v1/client/executed",ch(),identity()); if ok then print(PREFIX.." Client connected") end local pending=call("GET","/v1/client/"..HttpService:UrlEncode(identity().clientId).."/command",ch()); receive(pending and pending.command) while alive do local token=call("POST","/v1/client/realtime-token",ch(),{clientId=identity().clientId}) local raw=token and token.tokenDetails and token.tokenDetails.token; local channel=token and token.channel if raw and channel then -- Xeno's HTTP API is more consistent than its WebSocket event API. This polls Ably, -- never Cloudflare KV, and commandId de-duplicates the short history window. local started=os.clock(); local fn=requestFn() while alive and os.clock()-started<3000 do if fn then pcall(function() local r=fn({Url="https://rest.ably.io/channels/"..HttpService:UrlEncode(channel).."/messages?limit=10&direction=backwards",Method="GET",Headers={Authorization="Bearer "..raw}}) if r and r.StatusCode>=200 and r.StatusCode<300 then for _,m in ipairs(HttpService:JSONDecode(r.Body or "[]")) do if m.name=="command" then local data=m.data; if type(data)=="string" then data=HttpService:JSONDecode(data) end; receive(data) end end end end) end task.wait(1) end else warn(PREFIX.." Realtime token unavailable") end if alive then task.wait(5) end end end) getgenv().ObsidianLuaReceiver={Destroy=function() alive=false; clear() end} end local function mk(parent,text,color) local b=Instance.new("TextButton"); b.Text=text; b.TextColor3=Color3.new(1,1,1); b.Font=Enum.Font.GothamMedium; b.TextSize=15; b.BackgroundColor3=color or Color3.fromRGB(52,42,96); b.BorderSizePixel=0; b.Parent=parent; Instance.new("UICorner",b).CornerRadius=UDim.new(0,9); return b end local function startController(session) local alive,clients,selected,current,favorites,recent,key=true,{},{},"sit",{},{},"RightShift" local gui=Instance.new("ScreenGui"); gui.Name="ObsidianLuaController"; gui.ResetOnSpawn=false; gui.Parent=guiParent() local f=Instance.new("Frame"); f.Size=UDim2.fromOffset(470,370); f.Position=UDim2.new(.5,-235,.5,-185); f.BackgroundColor3=Color3.fromRGB(16,14,31); f.BorderColor3=Color3.fromRGB(112,76,255); f.Active=true; f.Draggable=true; f.Parent=gui; Instance.new("UICorner",f).CornerRadius=UDim.new(0,14) local title=Instance.new("TextLabel"); title.Size=UDim2.new(1,-50,0,42); title.Position=UDim2.fromOffset(14,8); title.BackgroundTransparency=1; title.Text="🌑 ObsidianLua Troll Controller"; title.TextColor3=Color3.fromRGB(105,211,255); title.TextSize=20; title.Font=Enum.Font.GothamBold; title.TextXAlignment=Enum.TextXAlignment.Left; title.Parent=f local mini=mk(f,"—",Color3.fromRGB(48,40,80)); mini.Size=UDim2.fromOffset(32,30); mini.Position=UDim2.new(1,-42,0,12) local status=Instance.new("TextLabel"); status.Size=UDim2.new(1,-28,0,25); status.Position=UDim2.fromOffset(14,225); status.BackgroundTransparency=1; status.Text="Ready"; status.TextColor3=Color3.fromRGB(190,220,220); status.TextSize=14; status.TextXAlignment=Enum.TextXAlignment.Left; status.Parent=f local function admin(m,p,b) return call(m,p,{["Content-Type"]="application/json",Authorization="Bearer "..session},b) end local targetDrop=Instance.new("ScrollingFrame"); targetDrop.Size=UDim2.fromOffset(442,180); targetDrop.Position=UDim2.fromOffset(14,105); targetDrop.Visible=false; targetDrop.ZIndex=20; targetDrop.BackgroundColor3=Color3.fromRGB(28,24,51); targetDrop.BorderSizePixel=0; targetDrop.CanvasSize=UDim2.new(); targetDrop.Parent=f; Instance.new("UICorner",targetDrop).CornerRadius=UDim.new(0,9); local tl=Instance.new("UIListLayout"); tl.Padding=UDim.new(0,4); tl.Parent=targetDrop local commandDrop=Instance.new("ScrollingFrame"); commandDrop.Size=UDim2.fromOffset(442,190); commandDrop.Position=UDim2.fromOffset(14,158); commandDrop.Visible=false; commandDrop.ZIndex=30; commandDrop.BackgroundColor3=Color3.fromRGB(28,24,51); commandDrop.BorderSizePixel=0; commandDrop.CanvasSize=UDim2.new(); commandDrop.Parent=f; Instance.new("UICorner",commandDrop).CornerRadius=UDim.new(0,9); local cl=Instance.new("UIListLayout"); cl.Padding=UDim.new(0,3); cl.Parent=commandDrop local targetBtn=mk(f,"TARGETS [ 0 Players Selected ▼ ]"); targetBtn.Size=UDim2.fromOffset(442,46); targetBtn.Position=UDim2.fromOffset(14,58) local commandBtn=mk(f,"COMMAND [ Sit ▼ ]"); commandBtn.Size=UDim2.fromOffset(370,46); commandBtn.Position=UDim2.fromOffset(14,112) local info=mk(f,"ⓘ",Color3.fromRGB(42,99,135)); info.Size=UDim2.fromOffset(54,46); info.Position=UDim2.fromOffset(402,112); info.TextSize=20 local execute=mk(f,"EXECUTE",Color3.fromRGB(44,125,105)); execute.Size=UDim2.fromOffset(442,48); execute.Position=UDim2.fromOffset(14,170); execute.TextSize=18; execute.Font=Enum.Font.GothamBold local fav=mk(f,"☆ Favorites"); fav.Size=UDim2.fromOffset(135,38); fav.Position=UDim2.fromOffset(14,260) local rec=mk(f,"STOP ACTION",Color3.fromRGB(145,48,62)); rec.Size=UDim2.fromOffset(100,38); rec.Position=UDim2.fromOffset(154,260) local refresh=mk(f,"Refresh"); refresh.Size=UDim2.fromOffset(95,38); refresh.Position=UDim2.fromOffset(264,260) local settings=mk(f,"Settings"); settings.Size=UDim2.fromOffset(95,38); settings.Position=UDim2.fromOffset(14,310) local destroy=mk(f,"Destroy",Color3.fromRGB(112,40,60)); destroy.Size=UDim2.fromOffset(95,38); destroy.Position=UDim2.fromOffset(361,310) local function count() local n=0; for _ in pairs(selected) do n=n+1 end; return n end local function labels() local n=count(); local one; for id in pairs(selected) do one=clients[id] end targetBtn.Text="TARGETS [ "..(n==1 and (one and (one.displayName or one.clientId) or "1 Player") or tostring(n).." Players").." Selected ▼ ]" commandBtn.Text="COMMAND [ "..(current:gsub("_"," "):gsub("(%l)(%w*)",function(a,b)return a:upper()..b end)).." ▼ ]"; fav.Text=(favorites[current] and "★ " or "☆ ").."Favorites" end local function renderTargets() for _,x in ipairs(targetDrop:GetChildren()) do if x:IsA("TextButton") then x:Destroy() end end local all=mk(targetDrop,"Select All Online"); all.ZIndex=21; all.Size=UDim2.new(1,-8,0,36); all.MouseButton1Click:Connect(function() for id,c in pairs(clients) do if c.online then selected[id]=true end end; labels(); renderTargets() end) local clear=mk(targetDrop,"Clear Selection",Color3.fromRGB(75,45,75)); clear.ZIndex=21; clear.Size=UDim2.new(1,-8,0,36); clear.MouseButton1Click:Connect(function() selected={}; labels(); renderTargets() end) for id,c in pairs(clients) do local d=c.displayName or c.username or id; local b=mk(targetDrop,(selected[id] and "☑ " or "☐ ")..(c.online and "🟢 " or "🔴 ")..d.." @"..(c.username or id).." UserId: "..tostring(c.userId or "?"),c.online and Color3.fromRGB(28,83,70) or Color3.fromRGB(65,45,65)); b.ZIndex=21; b.Size=UDim2.new(1,-8,0,44); b.MouseButton1Click:Connect(function() selected[id]=not selected[id] or nil; labels(); renderTargets() end) end targetDrop.CanvasSize=UDim2.fromOffset(0,tl.AbsoluteContentSize.Y+8) end local function renderCommands() for _,x in ipairs(commandDrop:GetChildren()) do if x:IsA("TextButton") or x:IsA("TextLabel") then x:Destroy() end end for _,category in ipairs(CATEGORY_ORDER) do local commands={}; for cmd,m in pairs(META) do if m[1]==category then table.insert(commands,cmd) end end; table.sort(commands) if #commands>0 then local h=Instance.new("TextLabel"); h.ZIndex=31; h.Text=category; h.Size=UDim2.new(1,-8,0,24); h.BackgroundTransparency=1; h.TextColor3=Color3.fromRGB(105,211,255); h.TextSize=14; h.TextXAlignment=Enum.TextXAlignment.Left; h.Parent=commandDrop end for _,cmd in ipairs(commands) do local b=mk(commandDrop,(favorites[cmd] and "★ " or "")..cmd:gsub("_"," "),cmd=="kill" and Color3.fromRGB(120,42,62) or nil); b.ZIndex=31; b.Size=UDim2.new(1,-8,0,38); b.MouseButton1Click:Connect(function() current=cmd; commandDrop.Visible=false; labels() end) end end end commandDrop.CanvasSize=UDim2.fromOffset(0,cl.AbsoluteContentSize.Y+8) end local function refreshClients() local d,e=admin("GET","/v1/admin/clients"); if not d then status.Text="✕ "..tostring(e); return end; clients={}; for _,c in ipairs(d.clients) do clients[c.clientId]=c end; labels(); renderTargets() end local function executeNow() local ids,offline={},0; for id in pairs(selected) do local c=clients[id]; if c then table.insert(ids,id); if not c.online then offline=offline+1 end end end if #ids==0 then status.Text="✕ No known targets selected"; return end if current=="kill" and #ids>1 and status.Text~="Confirm Kill: click EXECUTE again" then status.Text="Confirm Kill: click EXECUTE again"; return end local params={}; if current=="tp_to_me" or current=="bring_behind_me" or current=="slingshot_to_me" or current=="orbit_me" then local p=pos(); if not p then status.Text="✕ Controller character unavailable"; return end; params={position=p} end task.spawn(function() local sent=0; for _,id in ipairs(ids) do local d=admin("POST","/v1/admin/commands",{clientId=id,command=current,params=params}); if d then sent=sent+1 end; task.wait(.3) end; table.insert(recent,1,current); if #recent>5 then table.remove(recent) end; status.Text="✓ Sent "..current:gsub("_"," ").." to "..sent.." client"..(sent==1 and "" or "s")..(offline>0 and (" ⚠ "..offline.." offline") or "") end) end targetBtn.MouseButton1Click:Connect(function() targetDrop.Visible=not targetDrop.Visible; commandDrop.Visible=false; renderTargets() end) commandBtn.MouseButton1Click:Connect(function() commandDrop.Visible=not commandDrop.Visible; targetDrop.Visible=false; renderCommands() end) execute.MouseButton1Click:Connect(executeNow) info.MouseButton1Click:Connect(function() local m=META[current]; status.Text="ⓘ "..current:gsub("_"," ")..": "..m[2].." ("..m[3]..")" end) fav.MouseButton1Click:Connect(function() favorites[current]=not favorites[current]; labels() end) rec.MouseButton1Click:Connect(function() current="clear_effects"; labels(); executeNow() end) refresh.MouseButton1Click:Connect(refreshClients) settings.MouseButton1Click:Connect(function() status.Text="Press a key for GUI toggle"; local con; con=UserInputService.InputBegan:Connect(function(i,gp) if not gp and not UserInputService:GetFocusedTextBox() then key=i.KeyCode.Name; status.Text="Toggle key: "..key; con:Disconnect() end end) end) destroy.MouseButton1Click:Connect(function() alive=false; gui:Destroy() end); mini.MouseButton1Click:Connect(function() f.Visible=false end) UserInputService.InputBegan:Connect(function(i,gp) if not gp and not UserInputService:GetFocusedTextBox() and i.KeyCode.Name==key then f.Visible=not f.Visible end end) getgenv().ObsidianLuaControllerGUI={Destroy=function() alive=false; gui:Destroy() end}; labels(); renderCommands(); refreshClients(); task.spawn(function() while alive do task.wait(10); refreshClients() end end) end local function ownerLogin() local g=Instance.new("ScreenGui"); g.Name="ObsidianLuaOwnerLogin"; g.ResetOnSpawn=false; g.Parent=guiParent() local f=Instance.new("Frame"); f.Size=UDim2.fromOffset(330,180); f.Position=UDim2.new(.5,-165,.5,-90); f.BackgroundColor3=Color3.fromRGB(15,13,30); f.BorderColor3=Color3.fromRGB(116,72,255); f.Active=true; f.Draggable=true; f.Parent=g; Instance.new("UICorner",f).CornerRadius=UDim.new(0,14) local l=Instance.new("TextLabel"); l.Size=UDim2.new(1,-24,0,45); l.Position=UDim2.fromOffset(12,12); l.BackgroundTransparency=1; l.Text="🌑 Owner authentication"; l.TextColor3=Color3.fromRGB(105,211,255); l.TextSize=18; l.Font=Enum.Font.GothamBold; l.Parent=f local box=Instance.new("TextBox"); box.Size=UDim2.new(1,-24,0,38); box.Position=UDim2.fromOffset(12,60); box.PlaceholderText="OWNER_KEY"; box.Text=""; box.ClearTextOnFocus=false; box.TextColor3=Color3.new(1,1,1); box.BackgroundColor3=Color3.fromRGB(31,27,58); box.Parent=f; Instance.new("UICorner",box).CornerRadius=UDim.new(0,8) local s=Instance.new("TextLabel"); s.Size=UDim2.new(1,-24,0,22); s.Position=UDim2.fromOffset(12,102); s.BackgroundTransparency=1; s.TextColor3=Color3.fromRGB(235,170,190); s.Parent=f local b=mk(f,"Authenticate",Color3.fromRGB(55,41,106)); b.Size=UDim2.fromOffset(150,35); b.Position=UDim2.new(.5,-75,1,-45) b.MouseButton1Click:Connect(function() local k=box.Text; box.Text=""; local d,e=call("POST","/owner/login",{["Content-Type"]="application/json"},{ownerKey=k}); k=nil; if d and d.sessionToken then g:Destroy(); startController(d.sessionToken) else s.Text="Access denied: "..tostring(e) end end) end if WORKER_URL=="CHANGE_ME" or CLIENT_CHECKIN_TOKEN=="CHANGE_ME" then warn(PREFIX.." Loader configuration missing"); return end if LocalPlayer.UserId==OWNER_USER_ID and OWNER_SESSION~="CHANGE_ME" then print(PREFIX.." Owner detected; opening controller GUI") local ok,err=pcall(startController,OWNER_SESSION) if not ok then warn(PREFIX.." Controller GUI failed: "..tostring(err)) end elseif LocalPlayer.UserId==OWNER_USER_ID then ownerLogin() else startReceiver() end