REDTIGER
Key RequiredUniversal Patched

REDTIGER

Universal Scriptaznohamaznoham 20 views 2 executesUpdated Aug 13, 2026
Unrated
00
Lua Script•18302 lines (184767 chars)
local Players = game:GetService("Players")




local RunService = game:GetService("RunService")




local ReplicatedStorage = game:GetService("ReplicatedStorage")




local UserInputService = game:GetService("UserInputService")




local Workspace = game:GetService("Workspace")




local VirtualUser = game:GetService("VirtualUser")
local TweenService = game:GetService("TweenService")


local _S = {}




local player = Players.LocalPlayer




local mouse = player:GetMouse()




local camera = Workspace.CurrentCamera




-- tat




_S.espEnabled = false




_S.speedEnabled = false




_S.flyEnabled = false




_S.spectatingPlayer = nil




_S.selectedPlayer = nil




_S.speedValue = 100




_S.flySpeed = 60




_S.flyVelocity = nil



_S.flyGyro = nil



_S.swimEnabled = false



_S.swimSpeed = 50



_S.swimVelocity = nil



_S.swimGyro = nil



local keys = {}




_S.espObjects = {}




_S.teleportToolEquipped = false




_S.noclipEnabled = false
_S.spinEnabled = false
_S.spinSpeed = 50




_S.afkEnabled = false




_S.afkStartTime = 0




_S.afkTimerGui = nil




_S.afkTimerLabel = nil




_S.lockAllEnabled = false




_S.lockSelectedEnabled = false




_S.lockEnemyEnabled = false




_S.lockRanges = { all = math.huge, sel = math.huge, enemy = math.huge }  -- range max en studs pour chaque lock




_S.lockProximityRange = 15 -- Auto-lock quand un joueur est très proche (en studs)




_S.damageAutoLockTarget = nil -- Joueur ciblé après avoir pris des dégâts




_S.damageAutoLockExpire = 0 -- Timestamp d'expiration du lock de dégâts




_S.infiniteJumpEnabled = false




_S.tpAllActive = false




_S.tpSavePosEnabled = false




_S.tpSaveSimpleEnabled = false




_S.tpSaveAutoPosition = nil




_S.tpSaveInterval = 1




_S.xrayEnabled = false




_S.xraySavedTransparency = {}




_S.nightVisionEnabled = false




_S.nightVisionSavedLighting = {}




_S.savedBillboards = {}




-- Tracking pour le script Omega




_S.omegaRenderStepNames = {}




_S.omegaConnections = {}




_S.omegaGuiSnapshot = {}




_S.omegaCoreGuiSnapshot = {}




_S.omegaCreatedInstances = {}




_S.omegaForceResetConn = nil

_S.rightMouseHeld = false




_S.omegaThreads = {}




_S.omegaKilled = false




_S.omegaCleanupGeneration = 0




_S.omegaHasExecuted = false




_S.omegaHiddenStates = {}




-- Forward declarations




local stopSpectate




local addBtnSound




local makeToggle




local spectateCharConn = nil




local updateVolLabel




local applySpeed




local updateScale




-- Helper: bouton styl




local function btn(parent, text, pos, size, color)




	local b = Instance.new("TextButton")




	b.Size = size or UDim2.new(0.245, -2, 0, 20)




	b.Position = pos




	b.BackgroundColor3 = _S.customBtnColor or Color3.fromRGB(120, 30, 30)

	_S.allButtons = _S.allButtons or {}

	table.insert(_S.allButtons, b)




	b.BackgroundTransparency = 0




	b.Text = text




	b.TextColor3 = Color3.fromRGB(255, 255, 255)




	b.Font = Enum.Font.SourceSans




	b.TextSize = 14




	b.TextTruncate = Enum.TextTruncate.AtEnd




	b.BorderSizePixel = 0




	b.Parent = parent




	Instance.new("UICorner", b).CornerRadius = UDim.new(0, 4)




	if addBtnSound then addBtnSound(b) end




	return b




end




-- === GUI ===




local gui = Instance.new("ScreenGui")




gui.Name = "REDTIGER"




gui.ResetOnSpawn = false




gui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling




gui.DisplayOrder = 999999




gui.Parent = player:WaitForChild("PlayerGui")




-- Sons UI (popup stylish)




local hoverSound = Instance.new("Sound")




hoverSound.SoundId = "rbxassetid://88442833509532"




hoverSound.Volume = 0.3




hoverSound.Parent = gui




local clickSound = Instance.new("Sound")




clickSound.SoundId = "rbxassetid://88442833509532"




clickSound.Volume = 0.6




clickSound.PlaybackSpeed = 1.4




clickSound.Parent = gui




-- AFK Timer display (top-left corner)




_S.afkTimerGui = Instance.new("ScreenGui")




_S.afkTimerGui.Name = "AFKTimer"




_S.afkTimerGui.ResetOnSpawn = false




_S.afkTimerGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling




_S.afkTimerGui.DisplayOrder = 999998




_S.afkTimerGui.Parent = player:WaitForChild("PlayerGui")




local afkTimerFrame = Instance.new("Frame")




afkTimerFrame.Size = UDim2.new(0, 260, 0, 80)




afkTimerFrame.Position = UDim2.new(0, 15, 0, 15)




afkTimerFrame.BackgroundColor3 = Color3.fromRGB(15, 15, 25)




afkTimerFrame.BackgroundTransparency = 0.05




afkTimerFrame.Visible = false




afkTimerFrame.Parent = _S.afkTimerGui




local afkTimerCorner = Instance.new("UICorner")




afkTimerCorner.CornerRadius = UDim.new(0, 12)




afkTimerCorner.Parent = afkTimerFrame




local afkTimerStroke = Instance.new("UIStroke")




afkTimerStroke.Color = Color3.fromRGB(100, 255, 130)




afkTimerStroke.Thickness = 2




afkTimerStroke.Transparency = 0.3




afkTimerStroke.Parent = afkTimerFrame




local afkTimerGrad = Instance.new("UIGradient")




afkTimerGrad.Color = ColorSequence.new(Color3.fromRGB(20, 30, 25), Color3.fromRGB(10, 15, 12))




afkTimerGrad.Rotation = 90




afkTimerGrad.Parent = afkTimerFrame




local afkTimerPad = Instance.new("UIPadding")




afkTimerPad.PaddingLeft = UDim.new(0, 12)




afkTimerPad.PaddingRight = UDim.new(0, 12)




afkTimerPad.PaddingTop = UDim.new(0, 8)




afkTimerPad.PaddingBottom = UDim.new(0, 8)




afkTimerPad.Parent = afkTimerFrame




local afkIconLabel = Instance.new("TextLabel")




afkIconLabel.Size = UDim2.new(0, 36, 0, 36)




afkIconLabel.Position = UDim2.new(0, 0, 0, 14)




afkIconLabel.BackgroundTransparency = 1




afkIconLabel.Text = "⏰"




afkIconLabel.TextColor3 = Color3.fromRGB(100, 255, 130)




afkIconLabel.Font = Enum.Font.SourceSansBold




afkIconLabel.TextSize = 28




afkIconLabel.TextXAlignment = Enum.TextXAlignment.Center




afkIconLabel.TextYAlignment = Enum.TextYAlignment.Center




afkIconLabel.Parent = afkTimerFrame




_S.afkTimerLabel = Instance.new("TextLabel")




_S.afkTimerLabel.Size = UDim2.new(1, -44, 0, 30)




_S.afkTimerLabel.Position = UDim2.new(0, 40, 0, 8)




_S.afkTimerLabel.BackgroundTransparency = 1




_S.afkTimerLabel.Text = "AFK: 00:00:00"




_S.afkTimerLabel.TextColor3 = Color3.fromRGB(100, 255, 130)




_S.afkTimerLabel.Font = Enum.Font.SourceSansBold




_S.afkTimerLabel.TextSize = 22




_S.afkTimerLabel.TextXAlignment = Enum.TextXAlignment.Left




_S.afkTimerLabel.TextYAlignment = Enum.TextYAlignment.Center




_S.afkTimerLabel.Parent = afkTimerFrame




local afkStatusLabel = Instance.new("TextLabel")




afkStatusLabel.Size = UDim2.new(1, -44, 0, 16)




afkStatusLabel.Position = UDim2.new(0, 40, 0, 42)




afkStatusLabel.BackgroundTransparency = 1




afkStatusLabel.Text = "Anti-Kick Active"




afkStatusLabel.TextColor3 = Color3.fromRGB(120, 120, 140)




afkStatusLabel.Font = Enum.Font.SourceSans




afkStatusLabel.TextSize = 13




afkStatusLabel.TextXAlignment = Enum.TextXAlignment.Left




afkStatusLabel.TextYAlignment = Enum.TextYAlignment.Center




afkStatusLabel.Parent = afkTimerFrame




addBtnSound = function(b)




	b.MouseEnter:Connect(function()




		hoverSound:Play()




	end)




	b.MouseButton1Click:Connect(function()




		clickSound:Play()




	end)




end




-- Indicateur toggle: carré avec croix (activé) / sans croix (désactivé)




makeToggle = function(button, label)




	button.Text = label




	local switchTrack = Instance.new("Frame")




	switchTrack.Size = UDim2.new(0, 32, 0, 16)




	switchTrack.Position = UDim2.new(1, -38, 0.5, -8)




	switchTrack.BackgroundColor3 = Color3.fromRGB(40, 40, 45)




	switchTrack.BorderSizePixel = 0




	switchTrack.Parent = button




	Instance.new("UICorner", switchTrack).CornerRadius = UDim.new(1, 0)




	local stroke = Instance.new("UIStroke")




	stroke.Color = Color3.fromRGB(80, 80, 90)




	stroke.Thickness = 1




	stroke.Parent = switchTrack




	local switchKnob = Instance.new("Frame")




	switchKnob.Size = UDim2.new(0, 12, 0, 12)




	switchKnob.Position = UDim2.new(0, 2, 0.5, -6)




	switchKnob.BackgroundColor3 = Color3.fromRGB(200, 200, 200)




	switchKnob.BorderSizePixel = 0




	switchKnob.Parent = switchTrack




	Instance.new("UICorner", switchKnob).CornerRadius = UDim.new(1, 0)




	local TweenService = game:GetService("TweenService")




	return function(enabled)




		if enabled then




			TweenService:Create(switchTrack, TweenInfo.new(0.15), {BackgroundColor3 = Color3.fromRGB(20, 120, 50)}):Play()




			TweenService:Create(switchKnob, TweenInfo.new(0.15), {Position = UDim2.new(1, -14, 0.5, -6), BackgroundColor3 = Color3.fromRGB(80, 220, 100)}):Play()




			stroke.Color = Color3.fromRGB(50, 200, 80)




		else




			TweenService:Create(switchTrack, TweenInfo.new(0.15), {BackgroundColor3 = Color3.fromRGB(40, 40, 45)}):Play()




			TweenService:Create(switchKnob, TweenInfo.new(0.15), {Position = UDim2.new(0, 2, 0.5, -6), BackgroundColor3 = Color3.fromRGB(200, 200, 200)}):Play()




			stroke.Color = Color3.fromRGB(80, 80, 90)




		end




	end




end




-- Panneau principal (opaque noir)




local panel = Instance.new("Frame")




panel.Size = UDim2.new(0, 340, 0, 350)




panel.Position = UDim2.new(0, 20, 0.5, -175)




panel.BackgroundColor3 = Color3.fromRGB(8, 8, 12)




panel.BackgroundTransparency = 0




panel.BorderSizePixel = 0




panel.Visible = false




panel.ClipsDescendants = true




panel.Parent = gui




Instance.new("UICorner", panel).CornerRadius = UDim.new(0, 10)




-- Barre de titre




local titleBar = Instance.new("Frame")




titleBar.Size = UDim2.new(1, 0, 0, 26)




titleBar.BackgroundColor3 = Color3.fromRGB(18, 18, 28)




titleBar.BackgroundTransparency = 0




titleBar.BorderSizePixel = 0




titleBar.Parent = panel




Instance.new("UICorner", titleBar).CornerRadius = UDim.new(0, 10)




do




	local title = Instance.new("TextLabel")




	title.Size = UDim2.new(1, -40, 1, 0)




	title.Position = UDim2.new(0, 10, 0, 0)




	title.BackgroundTransparency = 1




	title.Text = "REDTIGER"




	title.TextColor3 = Color3.fromRGB(255, 255, 255)




	title.Font = Enum.Font.SourceSansBold




	title.TextSize = 16




	title.TextXAlignment = Enum.TextXAlignment.Left




	title.Parent = titleBar




end




local closeBtn = Instance.new("TextButton")




closeBtn.Size = UDim2.new(0, 22, 0, 22)




closeBtn.Position = UDim2.new(1, -25, 0, 2)




closeBtn.BackgroundColor3 = Color3.fromRGB(180, 40, 40)




closeBtn.BackgroundTransparency = 0




closeBtn.Text = "X"




closeBtn.TextColor3 = Color3.fromRGB(255, 255, 255)




closeBtn.Font = Enum.Font.SourceSansBold




closeBtn.TextSize = 15




closeBtn.BorderSizePixel = 0




closeBtn.Parent = titleBar




Instance.new("UICorner", closeBtn).CornerRadius = UDim.new(0, 6)




addBtnSound(closeBtn)




-- Drag




local isResizing = false




local dragging, dragStart, startPos = false, nil, nil




titleBar.InputBegan:Connect(function(input)




	if input.UserInputType == Enum.UserInputType.MouseButton1 then




		dragging = true




		dragStart = input.Position




		startPos = panel.Position




	end




end)




titleBar.InputEnded:Connect(function(input)




	if input.UserInputType == Enum.UserInputType.MouseButton1 then dragging = false end




end)




UserInputService.InputChanged:Connect(function(input)




	if dragging and not isResizing and input.UserInputType == Enum.UserInputType.MouseMovement then




		local delta = input.Position - dragStart




		panel.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y)




	end




end)




-- Fermer / Touche K




closeBtn.MouseButton1Click:Connect(function()




	panel.Visible = false




	UserInputService.MouseBehavior = Enum.MouseBehavior.Default




end)




UserInputService.InputBegan:Connect(function(input, gp)




	if gp then return end




	if input.KeyCode == Enum.KeyCode.K then




		panel.Visible = not panel.Visible




		if panel.Visible then




			UserInputService.MouseBehavior = Enum.MouseBehavior.Default




		else




			UserInputService.MouseBehavior = Enum.MouseBehavior.Default




		end




	end




end)

-- === GESTION CLIC DROIT POUR CAMÉRA (quand panel ouvert) ===
UserInputService.InputBegan:Connect(function(input, gp)
	if gp then return end
	if panel.Visible and input.UserInputType == Enum.UserInputType.MouseButton2 then
		_S.rightMouseHeld = true
	end
end)

UserInputService.InputEnded:Connect(function(input)
	if input.UserInputType == Enum.UserInputType.MouseButton2 then
		_S.rightMouseHeld = false
		if panel.Visible then
			UserInputService.MouseBehavior = Enum.MouseBehavior.Default
			UserInputService.MouseIconEnabled = true
		end
	end
end)




-- === POIGNÉES DE REDIMENSIONNEMENT ===




do




	local minW, minH = 300, 290




	local resizeHandle = nil




	local resizeMouseStart = nil




	local resizePanelStart = nil




	local resizeSizeStart = nil




	local function makeResizeHandle(name, pos, size)




		local h = Instance.new("Frame")




		h.Name = name




		h.Size = size




		h.Position = pos




		h.BackgroundTransparency = 1




		h.BorderSizePixel = 0




		h.Active = true




		h.ZIndex = 10




		h.Parent = panel




		h.MouseEnter:Connect(function()




			h.BackgroundTransparency = 0.7




			h.BackgroundColor3 = Color3.fromRGB(100, 150, 255)




		end)




		h.MouseLeave:Connect(function()




			if not resizeHandle or resizeHandle ~= name then




				h.BackgroundTransparency = 1




			end




		end)




		h.InputBegan:Connect(function(input)




			if input.UserInputType == Enum.UserInputType.MouseButton1 then




				resizeHandle = name




				isResizing = true




				resizeMouseStart = input.Position




				resizePanelStart = panel.Position




				resizeSizeStart = panel.Size




				h.BackgroundTransparency = 0.4




			end




		end)




		h.InputEnded:Connect(function(input)




			if input.UserInputType == Enum.UserInputType.MouseButton1 then




				resizeHandle = nil




				isResizing = false




				h.BackgroundTransparency = 1




			end




		end)




		return h




	end




	makeResizeHandle("hLeft",   UDim2.new(0, -3, 0, 10),  UDim2.new(0, 6, 1, -20))




	makeResizeHandle("hRight",  UDim2.new(1, -3, 0, 10),   UDim2.new(0, 6, 1, -20))




	makeResizeHandle("hTop",    UDim2.new(0, 10, 0, -3),   UDim2.new(1, -20, 0, 6))




	makeResizeHandle("hBottom", UDim2.new(0, 10, 1, -3),   UDim2.new(1, -20, 0, 6))




	makeResizeHandle("hTL",     UDim2.new(0, -4, 0, -4),   UDim2.new(0, 10, 0, 10))




	makeResizeHandle("hTR",     UDim2.new(1, -6, 0, -4),   UDim2.new(0, 10, 0, 10))




	makeResizeHandle("hBL",     UDim2.new(0, -4, 1, -6),   UDim2.new(0, 10, 0, 10))




	makeResizeHandle("hBR",     UDim2.new(1, -6, 1, -6),   UDim2.new(0, 10, 0, 10))




	UserInputService.InputChanged:Connect(function(input)




		if resizeHandle and input.UserInputType == Enum.UserInputType.MouseMovement then




			local delta = input.Position - resizeMouseStart




			local dX, dY = delta.X, delta.Y




			local startW = resizeSizeStart.X.Offset




			local startH = resizeSizeStart.Y.Offset




			local startX = resizePanelStart.X.Offset




			local startY = resizePanelStart.Y.Offset




			local newW, newH, newX, newY = startW, startH, startX, startY




			local isLeft = resizeHandle:find("Left") or resizeHandle:find("TL") or resizeHandle:find("BL")




			local isRight = resizeHandle:find("Right") or resizeHandle:find("TR") or resizeHandle:find("BR")




			local isTop = resizeHandle:find("Top") or resizeHandle:find("TL") or resizeHandle:find("TR")




			local isBottom = resizeHandle:find("Bottom") or resizeHandle:find("BL") or resizeHandle:find("BR")




			if isLeft then




				newW = math.max(minW, startW - dX)




				newX = startX + (startW - newW)




			end




			if isRight then




				newW = math.max(minW, startW + dX)




			end




			if isTop then




				newH = math.max(minH, startH - dY)




				newY = startY + (startH - newH)




			end




			if isBottom then




				newH = math.max(minH, startH + dY)




			end




			panel.Size = UDim2.new(0, newW, 0, newH)




			panel.Position = UDim2.new(resizePanelStart.X.Scale, newX, resizePanelStart.Y.Scale, newY)




			if updateScale then updateScale() end




		end




	end)




end




-- Conteneur principal (nav gauche + contenu droite)




local mainContainer = Instance.new("Frame")




mainContainer.Name = "MainContainer"




mainContainer.Size = UDim2.new(1, -6, 1, -29)




mainContainer.Position = UDim2.new(0, 3, 0, 26)




mainContainer.BackgroundTransparency = 1




mainContainer.BorderSizePixel = 0




mainContainer.Parent = panel




-- UIScale dynamique: adapte proportionnellement tout le contenu à la taille du panel




local mainScale = Instance.new("UIScale")




mainScale.Parent = mainContainer




-- Taille de design de reference (taille originale du panel)




local DESIGN_W = 340




local DESIGN_H = 350




updateScale = function()




	local pw = panel.Size.X.Offset




	local ph = panel.Size.Y.Offset




	local s = math.min(pw / DESIGN_W, ph / DESIGN_H)




	s = math.max(s, 0.1) -- empeche une echelle zero




	mainScale.Scale = s




	-- Compense la taille du mainContainer pour que le contenu mis a l'echelle remplisse le panel




	mainContainer.Size = UDim2.new(1 / s, -6 / s, 1 / s, -29 / s)




end




updateScale()




-- Layout entièrement relatif: pas de UIScale, tout s'adapte à la taille du panel




-- Barre de navigation gauche (grille de catégories)




local navBar = Instance.new("ScrollingFrame")




navBar.Name = "NavBar"




navBar.Size = UDim2.new(0.245, 0, 1, -74)




navBar.Position = UDim2.new(0, 0, 0, 0)




navBar.BackgroundColor3 = Color3.fromRGB(14, 14, 22)




navBar.BackgroundTransparency = 0.1




navBar.BorderSizePixel = 0




navBar.ScrollBarThickness = 4




navBar.ScrollBarImageColor3 = Color3.fromRGB(100, 100, 120)




navBar.AutomaticCanvasSize = Enum.AutomaticSize.Y




navBar.CanvasSize = UDim2.new(0, 0, 0, 0)




navBar.ScrollingDirection = Enum.ScrollingDirection.Y




navBar.Parent = mainContainer




Instance.new("UICorner", navBar).CornerRadius = UDim.new(0, 6)




local navList = Instance.new("UIListLayout")




navList.Padding = UDim.new(0, 3)




navList.HorizontalAlignment = Enum.HorizontalAlignment.Center




navList.SortOrder = Enum.SortOrder.LayoutOrder




navList.Parent = navBar




-- Zone de contenu droite (scrolling frame pour les pages)




local contentScroll = Instance.new("ScrollingFrame")




contentScroll.Name = "ContentScroll"




contentScroll.Size = UDim2.new(0.755, -6, 1, 0)




contentScroll.Position = UDim2.new(0.245, 3, 0, 0)




contentScroll.BackgroundColor3 = Color3.fromRGB(8, 8, 12)




contentScroll.BackgroundTransparency = 1




contentScroll.BorderSizePixel = 0




contentScroll.ScrollBarThickness = 6




contentScroll.ScrollBarImageColor3 = Color3.fromRGB(100, 100, 120)




contentScroll.AutomaticCanvasSize = Enum.AutomaticSize.Y




contentScroll.CanvasSize = UDim2.new(0, 0, 0, 0)




contentScroll.ScrollingDirection = Enum.ScrollingDirection.Y




contentScroll.Parent = mainContainer




-- Système de navigation par pages




local pages = {}




local navButtons = {}




local currentPage = nil




local function switchPage(pageName)




	if currentPage and pages[currentPage] then




		pages[currentPage].Visible = false




	end




	if currentPage and navButtons[currentPage] then




		navButtons[currentPage].BackgroundColor3 = _S.customNavColor or Color3.fromRGB(60, 60, 65)




	end




	currentPage = pageName




	if pages[pageName] then




		pages[pageName].Visible = true




		-- AutomaticCanvasSize gere automatiquement la taille du canvas




	end




	if navButtons[pageName] then




		navButtons[pageName].BackgroundColor3 = _S.customNavActiveColor or Color3.fromRGB(100, 100, 110)




	end




end




local function makeNavButton(name, label, order)




	local b = Instance.new("TextButton")




	b.Size = UDim2.new(1, -6, 0, 26)




	b.BackgroundColor3 = _S.customNavColor or Color3.fromRGB(60, 60, 65)




	b.BackgroundTransparency = 0




	b.Text = label




	b.TextColor3 = Color3.fromRGB(255, 255, 255)




	b.Font = Enum.Font.SourceSansBold




	b.TextSize = 13




	b.TextTruncate = Enum.TextTruncate.AtEnd




	b.BorderSizePixel = 0




	b.LayoutOrder = order or 0




	b.Parent = navBar




	Instance.new("UICorner", b).CornerRadius = UDim.new(0, 4)




	addBtnSound(b)




	navButtons[name] = b




	b.MouseButton1Click:Connect(function()




		switchPage(name)




	end)




	return b




end




local function registerPage(name, frame)




	pages[name] = frame




	frame.Visible = false




end




-- Créer les boutons de navigation




makeNavButton("Joueurs", "Joueurs", 1)




makeNavButton("Deplacement", "Déplacement", 2)




makeNavButton("Actions", "Actions", 3)




makeNavButton("Position", "Position", 4)




makeNavButton("Voice", "Voice", 5)




makeNavButton("Auto", "Auto", 6)




makeNavButton("Lock", "Lock", 7)




makeNavButton("Infos", "Infos", 8)




makeNavButton("Omega", "Omega", 9)




makeNavButton("Parametres", "Paramètres", 10)




-- === Carte de profil en bas de la barre de navigation ===




local profileCard = Instance.new("Frame")




profileCard.Name = "ProfileCard"




profileCard.Size = UDim2.new(0.245, 0, 0, 70)




profileCard.Position = UDim2.new(0, 0, 1, -70)




profileCard.BackgroundColor3 = Color3.fromRGB(14, 14, 22)




profileCard.BackgroundTransparency = 0.1




profileCard.BorderSizePixel = 0




profileCard.Parent = mainContainer




-- Ligne de separation en haut de la carte profil




local profileSep = Instance.new("Frame")




profileSep.Size = UDim2.new(1, -10, 0, 1)




profileSep.Position = UDim2.new(0, 5, 0, 0)




profileSep.BackgroundColor3 = Color3.fromRGB(40, 40, 55)




profileSep.BorderSizePixel = 0




profileSep.Parent = profileCard




-- Avatar (image circulaire avec fond)




local avatarBg = Instance.new("Frame")




avatarBg.Size = UDim2.new(0, 44, 0, 44)




avatarBg.Position = UDim2.new(0, 8, 0.5, -22)




avatarBg.BackgroundColor3 = Color3.fromRGB(40, 40, 55)




avatarBg.BorderSizePixel = 0




avatarBg.Parent = profileCard




Instance.new("UICorner", avatarBg).CornerRadius = UDim.new(1, 0)




local avatar = Instance.new("ImageLabel")




avatar.Size = UDim2.new(1, -4, 1, -4)




avatar.Position = UDim2.new(0, 2, 0, 2)




avatar.BackgroundColor3 = Color3.fromRGB(30, 30, 40)




avatar.BorderSizePixel = 0




avatar.Image = ""




avatar.Parent = avatarBg




Instance.new("UICorner", avatar).CornerRadius = UDim.new(1, 0)




-- Nom du joueur (pseudo Roblox)




local profileName = Instance.new("TextLabel")




profileName.Size = UDim2.new(1, -62, 0, 22)




profileName.Position = UDim2.new(0, 58, 0, 12)




profileName.BackgroundTransparency = 1




profileName.Text = player.Name




profileName.TextColor3 = Color3.fromRGB(255, 255, 255)




profileName.Font = Enum.Font.SourceSansBold




profileName.TextSize = 13




profileName.TextXAlignment = Enum.TextXAlignment.Left




profileName.TextTruncate = Enum.TextTruncate.AtEnd




profileName.Parent = profileCard




-- Role du joueur




local profileRole = Instance.new("TextLabel")




profileRole.Size = UDim2.new(1, -62, 0, 16)




profileRole.Position = UDim2.new(0, 58, 0, 36)




profileRole.BackgroundTransparency = 1




local function updateProfileRole()




	local team = player.Team




	if team then




		profileRole.Text = team.Name




		local teamColor = team.TeamColor




		if teamColor then




			profileRole.TextColor3 = teamColor.Color




		end




	else




		profileRole.Text = "Aucune équipe"




		profileRole.TextColor3 = Color3.fromRGB(180, 180, 180)




	end




end




updateProfileRole()




player:GetPropertyChangedSignal("Team"):Connect(updateProfileRole)




profileRole.Font = Enum.Font.SourceSans




profileRole.TextSize = 12




profileRole.TextXAlignment = Enum.TextXAlignment.Left




profileRole.TextTruncate = Enum.TextTruncate.AtEnd




profileRole.Parent = profileCard




-- Charger l'avatar Roblox du joueur en arriere-plan




task.spawn(function()




	local userId = player.UserId




	local success, result = pcall(function()




		return Players:GetUserThumbnailAsync(userId, Enum.ThumbnailType.HeadShot, Enum.ThumbnailSize.Size420x420)




	end)




	if success and result and avatar and avatar.Parent then




		avatar.Image = result




	end




end)




-- === Section Joueurs ===




local pSection = Instance.new("Frame")




pSection.Size = UDim2.new(1, -10, 0, 368)




pSection.Position = UDim2.new(0, 5, 0, 5)




pSection.BackgroundTransparency = 1




pSection.Parent = contentScroll




do




	local pHeader = Instance.new("TextLabel")




	pHeader.Size = UDim2.new(1, 0, 0, 18)




	pHeader.BackgroundTransparency = 1




	pHeader.Text = "Joueurs"




	pHeader.TextColor3 = Color3.fromRGB(255, 255, 255)




	pHeader.Font = Enum.Font.SourceSansBold




	pHeader.TextSize = 14




	pHeader.TextXAlignment = Enum.TextXAlignment.Left




	pHeader.Parent = pSection




end




do




	local pDesc = Instance.new("TextLabel")




	pDesc.Size = UDim2.new(1, 0, 0, 28)




	pDesc.Position = UDim2.new(0, 0, 0, 18)




	pDesc.BackgroundTransparency = 1




	pDesc.Text = "Cliquez sur un joueur dans la liste pour le sélectionner. Utilisez la barre de recherche pour filtrer les joueurs par nom. Le joueur sélectionné sera utilisé par les autres catégories (TP Joueur, Lock Select, Voice, etc.)."




	pDesc.TextColor3 = Color3.fromRGB(255, 255, 255)




	pDesc.Font = Enum.Font.SourceSans




	pDesc.TextSize = 12




	pDesc.TextWrapped = true




	pDesc.TextTruncate = Enum.TextTruncate.AtEnd




	pDesc.TextXAlignment = Enum.TextXAlignment.Left




	pDesc.TextYAlignment = Enum.TextYAlignment.Top




	pDesc.Parent = pSection




end




-- Barre de recherche




local searchBox = Instance.new("TextBox")




searchBox.Size = UDim2.new(1, 0, 0, 22)




searchBox.Position = UDim2.new(0, 0, 0, 48)




searchBox.BackgroundColor3 = Color3.fromRGB(30, 30, 45)




searchBox.BackgroundTransparency = 0




searchBox.Text = ""




searchBox.PlaceholderText = "Rechercher un joueur..."




searchBox.TextColor3 = Color3.fromRGB(255, 255, 255)




searchBox.Font = Enum.Font.SourceSans




searchBox.TextSize = 14




searchBox.BorderSizePixel = 0




searchBox.Parent = pSection




Instance.new("UICorner", searchBox).CornerRadius = UDim.new(0, 4)Instance.new("UICorner", searchBox).CornerRadius = UDim.new(0, 4)




-- === Boutons Spectate ===




local spectateBtnRow = Instance.new("Frame")




spectateBtnRow.Size = UDim2.new(1, 0, 0, 26)




spectateBtnRow.Position = UDim2.new(0, 0, 0, 74)




spectateBtnRow.BackgroundTransparency = 1




spectateBtnRow.Parent = pSection




local spectateBtn = btn(spectateBtnRow, "Spectate", UDim2.new(0, 0, 0, 0), UDim2.new(0.5, -3, 0, 24), Color3.fromRGB(40, 60, 100))




spectateBtn.Parent = spectateBtnRow




local stopSpectateBtn = btn(spectateBtnRow, "Stop Spectate", UDim2.new(0.5, 3, 0, 0), UDim2.new(0.5, -3, 0, 24), Color3.fromRGB(100, 40, 40))




stopSpectateBtn.Parent = spectateBtnRow




local spectateNavRow = Instance.new("Frame")




spectateNavRow.Size = UDim2.new(1, 0, 0, 24)




spectateNavRow.Position = UDim2.new(0, 0, 0, 100)




spectateNavRow.BackgroundTransparency = 1




spectateNavRow.Parent = pSection




local prevSpectateBtn = btn(spectateNavRow, "Joueur Precedent", UDim2.new(0, 0, 0, 0), UDim2.new(0.5, -3, 0, 22), Color3.fromRGB(50, 45, 60))




prevSpectateBtn.Parent = spectateNavRow




local nextSpectateBtn = btn(spectateNavRow, "Joueur Suivant", UDim2.new(0.5, 3, 0, 0), UDim2.new(0.5, -3, 0, 22), Color3.fromRGB(50, 45, 60))




nextSpectateBtn.Parent = spectateNavRow




-- Scroll liste joueurs




local pScroll = Instance.new("ScrollingFrame")




pScroll.Size = UDim2.new(1, 0, 1, -128)




pScroll.Position = UDim2.new(0, 0, 0, 128)




pScroll.BackgroundColor3 = Color3.fromRGB(12, 12, 18)




pScroll.BackgroundTransparency = 0




pScroll.BorderSizePixel = 0




pScroll.ScrollBarThickness = 4




pScroll.AutomaticCanvasSize = Enum.AutomaticSize.Y




pScroll.CanvasSize = UDim2.new(0, 0, 0, 0)




pScroll.Parent = pSection




Instance.new("UICorner", pScroll).CornerRadius = UDim.new(0, 4)




Instance.new("UIListLayout", pScroll).Padding = UDim.new(0, 2)




-- === Section Déplacement ===




local mSection = Instance.new("Frame")




mSection.Size = UDim2.new(1, -10, 0, 322)




mSection.Position = UDim2.new(0, 5, 0, 5)




mSection.BackgroundTransparency = 1




mSection.Parent = contentScroll




do




	local mHeader = Instance.new("TextLabel")




	mHeader.Size = UDim2.new(1, 0, 0, 18)




	mHeader.BackgroundTransparency = 1




	mHeader.Text = "Déplacement"




	mHeader.TextColor3 = Color3.fromRGB(255, 255, 255)




	mHeader.Font = Enum.Font.SourceSansBold




	mHeader.TextSize = 14




	mHeader.TextXAlignment = Enum.TextXAlignment.Left




	mHeader.Parent = mSection




end




do




	local mDesc = Instance.new("TextLabel")




	mDesc.Size = UDim2.new(1, 0, 0, 28)




	mDesc.Position = UDim2.new(0, 0, 0, 18)




	mDesc.BackgroundTransparency = 1




	mDesc.Text = "Vitesse: modifie votre vitesse de marche (WalkSpeed). Fly: active/désactive le vol. Nager: nage dans l'air. Utilisez les sliders pour ajuster WalkSpeed, FlySpeed et SwimSpeed. Cliquez sur les boutons pour les activer ou les désactiver."




	mDesc.TextColor3 = Color3.fromRGB(255, 255, 255)




	mDesc.Font = Enum.Font.SourceSans




	mDesc.TextSize = 12




	mDesc.TextWrapped = true




	mDesc.TextTruncate = Enum.TextTruncate.AtEnd




	mDesc.TextXAlignment = Enum.TextXAlignment.Left




	mDesc.TextYAlignment = Enum.TextYAlignment.Top




	mDesc.Parent = mSection




end




local speedBtn = btn(mSection, "Vitesse", UDim2.new(0, 0, 0, 48), UDim2.new(1, -2, 0, 24), Color3.fromRGB(50, 40, 30))




speedBtn.Font = Enum.Font.SourceSansBold




speedBtn.TextSize = 15




local setSpeedToggle = makeToggle(speedBtn, "Vitesse")




local flyBtn = btn(mSection, "Fly", UDim2.new(0, 0, 0, 140), UDim2.new(1, -2, 0, 24), Color3.fromRGB(30, 40, 50))




flyBtn.Font = Enum.Font.SourceSansBold




flyBtn.TextSize = 15




local setFlyToggle = makeToggle(flyBtn, "Fly")




-- Walk speed: modern slider card
local walkCard = Instance.new("Frame")
walkCard.Size = UDim2.new(1, -2, 0, 44)
walkCard.Position = UDim2.new(0, 0, 0, 84)
walkCard.BackgroundColor3 = Color3.fromRGB(22, 22, 28)
walkCard.BackgroundTransparency = 0
walkCard.BorderSizePixel = 0
walkCard.Parent = mSection
Instance.new("UICorner", walkCard).CornerRadius = UDim.new(0, 8)
do
	local walkStroke = Instance.new("UIStroke")
	walkStroke.Color = Color3.fromRGB(50, 50, 55)
	walkStroke.Thickness = 1
	walkStroke.Transparency = 0.3
	walkStroke.Parent = walkCard
end
do
	local walkLabel = Instance.new("TextLabel")
	walkLabel.Size = UDim2.new(0, 80, 0, 16)
	walkLabel.Position = UDim2.new(0, 8, 0, 5)
	walkLabel.BackgroundTransparency = 1
	walkLabel.Text = "Walk Speed"
	walkLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
	walkLabel.Font = Enum.Font.SourceSansBold
	walkLabel.TextSize = 13
	walkLabel.TextXAlignment = Enum.TextXAlignment.Left
	walkLabel.Parent = walkCard
end
local speedValueLabel = Instance.new("TextBox")
speedValueLabel.Size = UDim2.new(0, 50, 0, 16)
speedValueLabel.Position = UDim2.new(1, -58, 0, 5)
speedValueLabel.BackgroundColor3 = Color3.fromRGB(22, 22, 28)
speedValueLabel.BackgroundTransparency = 1
speedValueLabel.Text = tostring(_S.speedValue)
speedValueLabel.TextColor3 = Color3.fromRGB(255, 60, 60)
speedValueLabel.Font = Enum.Font.SourceSansBold
speedValueLabel.TextSize = 13
speedValueLabel.BorderSizePixel = 0
speedValueLabel.ClearTextOnFocus = false
speedValueLabel.TextXAlignment = Enum.TextXAlignment.Right
speedValueLabel.Parent = walkCard
local walkTrack = Instance.new("Frame")
walkTrack.Size = UDim2.new(1, -16, 0, 4)
walkTrack.Position = UDim2.new(0, 8, 0, 30)
walkTrack.BackgroundColor3 = Color3.fromRGB(12, 12, 16)
walkTrack.BorderSizePixel = 0
walkTrack.Parent = walkCard
Instance.new("UICorner", walkTrack).CornerRadius = UDim.new(1, 0)
local walkFill = Instance.new("Frame")
walkFill.Size = UDim2.new(0, 0, 1, 0)
walkFill.BackgroundColor3 = Color3.fromRGB(220, 50, 50)
walkFill.BorderSizePixel = 0
walkFill.Parent = walkTrack
Instance.new("UICorner", walkFill).CornerRadius = UDim.new(1, 0)
local walkThumb = Instance.new("Frame")
walkThumb.Size = UDim2.new(0, 14, 0, 14)
walkThumb.AnchorPoint = Vector2.new(0.5, 0.5)
walkThumb.Position = UDim2.new(0, 0, 0.5, 0)
walkThumb.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
walkThumb.BorderSizePixel = 0
walkThumb.Parent = walkTrack
Instance.new("UICorner", walkThumb).CornerRadius = UDim.new(1, 0)
do
	local walkThumbShadow = Instance.new("UIStroke")
	walkThumbShadow.Color = Color3.fromRGB(0, 0, 0)
	walkThumbShadow.Thickness = 1
	walkThumbShadow.Transparency = 0.5
	walkThumbShadow.Parent = walkThumb
end
local speedDownBtn = Instance.new("TextButton")
speedDownBtn.Visible = false
speedDownBtn.Parent = walkCard
addBtnSound(speedDownBtn)
local speedUpBtn = Instance.new("TextButton")
speedUpBtn.Visible = false
speedUpBtn.Parent = walkCard
addBtnSound(speedUpBtn)
local WALK_MIN = 1
local WALK_MAX = 500
local function walkUpdateSlider(animate)
	local pct = math.clamp((_S.speedValue - WALK_MIN) / (WALK_MAX - WALK_MIN), 0, 1)
	if animate then
		TweenService:Create(walkFill, TweenInfo.new(0.15), {Size = UDim2.new(pct, 0, 1, 0)}):Play()
		TweenService:Create(walkThumb, TweenInfo.new(0.15), {Position = UDim2.new(pct, 0, 0.5, 0)}):Play()
	else
		walkFill.Size = UDim2.new(pct, 0, 1, 0)
		walkThumb.Position = UDim2.new(pct, 0, 0.5, 0)
	end
end
local walkDragging = false
walkTrack.InputBegan:Connect(function(input)
	if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
		walkDragging = true
		local tp = walkTrack.AbsolutePosition.X
		local ts = walkTrack.AbsoluteSize.X
		local pct = math.clamp((input.Position.X - tp) / ts, 0, 1)
		_S.speedValue = math.max(1, math.floor(WALK_MIN + pct * (WALK_MAX - WALK_MIN)))
		speedValueLabel.Text = tostring(_S.speedValue)
		walkUpdateSlider(true)
		if _S.speedEnabled then applySpeed() end
	end
end)
walkThumb.InputBegan:Connect(function(input)
	if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
		walkDragging = true
	end
end)
UserInputService.InputEnded:Connect(function(input)
	if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
		walkDragging = false
	end
end)
UserInputService.InputChanged:Connect(function(input)
	if walkDragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then
		local tp = walkTrack.AbsolutePosition.X
		local ts = walkTrack.AbsoluteSize.X
		local pct = math.clamp((input.Position.X - tp) / ts, 0, 1)
		_S.speedValue = math.max(1, math.floor(WALK_MIN + pct * (WALK_MAX - WALK_MIN)))
		speedValueLabel.Text = tostring(_S.speedValue)
		walkUpdateSlider(true)
		if _S.speedEnabled then applySpeed() end
	end
end)
speedValueLabel:GetPropertyChangedSignal("Text"):Connect(function()
	if not walkDragging then
		local num = tonumber(speedValueLabel.Text)
		if num then
			local pct = math.clamp((num - WALK_MIN) / (WALK_MAX - WALK_MIN), 0, 1)
			TweenService:Create(walkFill, TweenInfo.new(0.15), {Size = UDim2.new(pct, 0, 1, 0)}):Play()
			TweenService:Create(walkThumb, TweenInfo.new(0.15), {Position = UDim2.new(pct, 0, 0.5, 0)}):Play()
		end
	end
end)
walkUpdateSlider(false)
speedValueLabel.FocusLost:Connect(function()
	local num = tonumber(speedValueLabel.Text)
	if num then
		_S.speedValue = math.max(1, math.floor(num))
		speedValueLabel.Text = tostring(_S.speedValue)
		walkUpdateSlider(true)
		if _S.speedEnabled then applySpeed() end
	else
		speedValueLabel.Text = tostring(_S.speedValue)
		walkUpdateSlider(true)
	end
end)





-- Fly speed: modern slider card
local flySpeedCard = Instance.new("Frame")
flySpeedCard.Size = UDim2.new(1, -2, 0, 44)
flySpeedCard.Position = UDim2.new(0, 0, 0, 176)
flySpeedCard.BackgroundColor3 = Color3.fromRGB(22, 22, 28)
flySpeedCard.BackgroundTransparency = 0
flySpeedCard.BorderSizePixel = 0
flySpeedCard.Parent = mSection
Instance.new("UICorner", flySpeedCard).CornerRadius = UDim.new(0, 8)
do
	local flySpeedStroke = Instance.new("UIStroke")
	flySpeedStroke.Color = Color3.fromRGB(50, 50, 55)
	flySpeedStroke.Thickness = 1
	flySpeedStroke.Transparency = 0.3
	flySpeedStroke.Parent = flySpeedCard
end
do
	local flyLabel = Instance.new("TextLabel")
	flyLabel.Size = UDim2.new(0, 80, 0, 16)
	flyLabel.Position = UDim2.new(0, 8, 0, 5)
	flyLabel.BackgroundTransparency = 1
	flyLabel.Text = "Fly Speed"
	flyLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
	flyLabel.Font = Enum.Font.SourceSansBold
	flyLabel.TextSize = 13
	flyLabel.TextXAlignment = Enum.TextXAlignment.Left
	flyLabel.Parent = flySpeedCard
end
local flySpeedValueLabel = Instance.new("TextBox")
flySpeedValueLabel.Size = UDim2.new(0, 50, 0, 16)
flySpeedValueLabel.Position = UDim2.new(1, -58, 0, 5)
flySpeedValueLabel.BackgroundColor3 = Color3.fromRGB(22, 22, 28)
flySpeedValueLabel.BackgroundTransparency = 1
flySpeedValueLabel.Text = tostring(_S.flySpeed)
flySpeedValueLabel.TextColor3 = Color3.fromRGB(255, 60, 60)
flySpeedValueLabel.Font = Enum.Font.SourceSansBold
flySpeedValueLabel.TextSize = 13
flySpeedValueLabel.BorderSizePixel = 0
flySpeedValueLabel.ClearTextOnFocus = false
flySpeedValueLabel.TextXAlignment = Enum.TextXAlignment.Right
flySpeedValueLabel.Parent = flySpeedCard
local flyTrack = Instance.new("Frame")
flyTrack.Size = UDim2.new(1, -16, 0, 4)
flyTrack.Position = UDim2.new(0, 8, 0, 30)
flyTrack.BackgroundColor3 = Color3.fromRGB(12, 12, 16)
flyTrack.BorderSizePixel = 0
flyTrack.Parent = flySpeedCard
Instance.new("UICorner", flyTrack).CornerRadius = UDim.new(1, 0)
local flyFill = Instance.new("Frame")
flyFill.Size = UDim2.new(0, 0, 1, 0)
flyFill.BackgroundColor3 = Color3.fromRGB(220, 50, 50)
flyFill.BorderSizePixel = 0
flyFill.Parent = flyTrack
Instance.new("UICorner", flyFill).CornerRadius = UDim.new(1, 0)
local flyThumb = Instance.new("Frame")
flyThumb.Size = UDim2.new(0, 14, 0, 14)
flyThumb.AnchorPoint = Vector2.new(0.5, 0.5)
flyThumb.Position = UDim2.new(0, 0, 0.5, 0)
flyThumb.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
flyThumb.BorderSizePixel = 0
flyThumb.Parent = flyTrack
Instance.new("UICorner", flyThumb).CornerRadius = UDim.new(1, 0)
do
	local flyThumbShadow = Instance.new("UIStroke")
	flyThumbShadow.Color = Color3.fromRGB(0, 0, 0)
	flyThumbShadow.Thickness = 1
	flyThumbShadow.Transparency = 0.5
	flyThumbShadow.Parent = flyThumb
end
local flySpeedDownBtn = Instance.new("TextButton")
flySpeedDownBtn.Visible = false
flySpeedDownBtn.Parent = flySpeedCard
addBtnSound(flySpeedDownBtn)
local flySpeedUpBtn = Instance.new("TextButton")
flySpeedUpBtn.Visible = false
flySpeedUpBtn.Parent = flySpeedCard
addBtnSound(flySpeedUpBtn)
local FLY_MIN = 1
local FLY_MAX = 500
local function flyUpdateSlider(animate)
	local pct = math.clamp((_S.flySpeed - FLY_MIN) / (FLY_MAX - FLY_MIN), 0, 1)
	if animate then
		TweenService:Create(flyFill, TweenInfo.new(0.15), {Size = UDim2.new(pct, 0, 1, 0)}):Play()
		TweenService:Create(flyThumb, TweenInfo.new(0.15), {Position = UDim2.new(pct, 0, 0.5, 0)}):Play()
	else
		flyFill.Size = UDim2.new(pct, 0, 1, 0)
		flyThumb.Position = UDim2.new(pct, 0, 0.5, 0)
	end
end
local flyDragging = false
flyTrack.InputBegan:Connect(function(input)
	if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
		flyDragging = true
		local tp = flyTrack.AbsolutePosition.X
		local ts = flyTrack.AbsoluteSize.X
		local pct = math.clamp((input.Position.X - tp) / ts, 0, 1)
		_S.flySpeed = math.max(1, math.floor(FLY_MIN + pct * (FLY_MAX - FLY_MIN)))
		flySpeedValueLabel.Text = tostring(_S.flySpeed)
		flyUpdateSlider(true)
	end
end)
flyThumb.InputBegan:Connect(function(input)
	if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
		flyDragging = true
	end
end)
UserInputService.InputEnded:Connect(function(input)
	if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
		flyDragging = false
	end
end)
UserInputService.InputChanged:Connect(function(input)
	if flyDragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then
		local tp = flyTrack.AbsolutePosition.X
		local ts = flyTrack.AbsoluteSize.X
		local pct = math.clamp((input.Position.X - tp) / ts, 0, 1)
		_S.flySpeed = math.max(1, math.floor(FLY_MIN + pct * (FLY_MAX - FLY_MIN)))
		flySpeedValueLabel.Text = tostring(_S.flySpeed)
		flyUpdateSlider(true)
	end
end)
flySpeedValueLabel:GetPropertyChangedSignal("Text"):Connect(function()
	if not flyDragging then
		local num = tonumber(flySpeedValueLabel.Text)
		if num then
			local pct = math.clamp((num - FLY_MIN) / (FLY_MAX - FLY_MIN), 0, 1)
			TweenService:Create(flyFill, TweenInfo.new(0.15), {Size = UDim2.new(pct, 0, 1, 0)}):Play()
			TweenService:Create(flyThumb, TweenInfo.new(0.15), {Position = UDim2.new(pct, 0, 0.5, 0)}):Play()
		end
	end
end)
flyUpdateSlider(false)
flySpeedValueLabel.FocusLost:Connect(function()
	local num = tonumber(flySpeedValueLabel.Text)
	if num then
		_S.flySpeed = math.max(1, math.floor(num))
		flySpeedValueLabel.Text = tostring(_S.flySpeed)
	else
		flySpeedValueLabel.Text = tostring(_S.flySpeed)
	end
end)

-- Swim button (Nager dans l'air)
do
	local swimBtn = btn(mSection, "Nager", UDim2.new(0, 0, 0, 232), UDim2.new(1, -2, 0, 24), Color3.fromRGB(30, 50, 40))
	swimBtn.Font = Enum.Font.SourceSansBold
	swimBtn.TextSize = 15
	_S.setSwimToggle = makeToggle(swimBtn, "Nager")
	_S.swimBtn = swimBtn

	-- Swim speed: modern slider card
	local swimCard = Instance.new("Frame")
	swimCard.Size = UDim2.new(1, -2, 0, 44)
	swimCard.Position = UDim2.new(0, 0, 0, 268)
	swimCard.BackgroundColor3 = Color3.fromRGB(22, 22, 28)
	swimCard.BackgroundTransparency = 0
	swimCard.BorderSizePixel = 0
	swimCard.Parent = mSection
	Instance.new("UICorner", swimCard).CornerRadius = UDim.new(0, 8)
	do
		local swimStroke = Instance.new("UIStroke")
		swimStroke.Color = Color3.fromRGB(50, 50, 55)
		swimStroke.Thickness = 1
		swimStroke.Transparency = 0.3
		swimStroke.Parent = swimCard
	end
	do
		local swimLabel = Instance.new("TextLabel")
		swimLabel.Size = UDim2.new(0, 80, 0, 16)
		swimLabel.Position = UDim2.new(0, 8, 0, 5)
		swimLabel.BackgroundTransparency = 1
		swimLabel.Text = "Swim Speed"
		swimLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
		swimLabel.Font = Enum.Font.SourceSansBold
		swimLabel.TextSize = 13
		swimLabel.TextXAlignment = Enum.TextXAlignment.Left
		swimLabel.Parent = swimCard
	end
	local swimSpeedValueLabel = Instance.new("TextBox")
	swimSpeedValueLabel.Size = UDim2.new(0, 50, 0, 16)
	swimSpeedValueLabel.Position = UDim2.new(1, -58, 0, 5)
	swimSpeedValueLabel.BackgroundColor3 = Color3.fromRGB(22, 22, 28)
	swimSpeedValueLabel.BackgroundTransparency = 1
	swimSpeedValueLabel.Text = tostring(_S.swimSpeed)
	swimSpeedValueLabel.TextColor3 = Color3.fromRGB(255, 60, 60)
	swimSpeedValueLabel.Font = Enum.Font.SourceSansBold
	swimSpeedValueLabel.TextSize = 13
	swimSpeedValueLabel.BorderSizePixel = 0
	swimSpeedValueLabel.ClearTextOnFocus = false
	swimSpeedValueLabel.TextXAlignment = Enum.TextXAlignment.Right
	swimSpeedValueLabel.Parent = swimCard
	_S.swimSpeedValueLabel = swimSpeedValueLabel

	local swimTrack = Instance.new("Frame")
	swimTrack.Size = UDim2.new(1, -16, 0, 4)
	swimTrack.Position = UDim2.new(0, 8, 0, 30)
	swimTrack.BackgroundColor3 = Color3.fromRGB(12, 12, 16)
	swimTrack.BorderSizePixel = 0
	swimTrack.Parent = swimCard
	Instance.new("UICorner", swimTrack).CornerRadius = UDim.new(1, 0)
	local swimFill = Instance.new("Frame")
	swimFill.Size = UDim2.new(0, 0, 1, 0)
	swimFill.BackgroundColor3 = Color3.fromRGB(220, 50, 50)
	swimFill.BorderSizePixel = 0
	swimFill.Parent = swimTrack
	Instance.new("UICorner", swimFill).CornerRadius = UDim.new(1, 0)
	local swimThumb = Instance.new("Frame")
	swimThumb.Size = UDim2.new(0, 14, 0, 14)
	swimThumb.AnchorPoint = Vector2.new(0.5, 0.5)
	swimThumb.Position = UDim2.new(0, 0, 0.5, 0)
	swimThumb.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
	swimThumb.BorderSizePixel = 0
	swimThumb.Parent = swimTrack
	Instance.new("UICorner", swimThumb).CornerRadius = UDim.new(1, 0)
	do
		local swimThumbShadow = Instance.new("UIStroke")
		swimThumbShadow.Color = Color3.fromRGB(0, 0, 0)
		swimThumbShadow.Thickness = 1
		swimThumbShadow.Transparency = 0.5
		swimThumbShadow.Parent = swimThumb
	end

	local swimSpeedDownBtn = Instance.new("TextButton")
	swimSpeedDownBtn.Visible = false
	swimSpeedDownBtn.Parent = swimCard
	addBtnSound(swimSpeedDownBtn)
	_S.swimSpeedDownBtn = swimSpeedDownBtn

	local swimSpeedUpBtn = Instance.new("TextButton")
	swimSpeedUpBtn.Visible = false
	swimSpeedUpBtn.Parent = swimCard
	addBtnSound(swimSpeedUpBtn)
	_S.swimSpeedUpBtn = swimSpeedUpBtn

	local SWIM_MIN = 1
	local SWIM_MAX = 500
	local function swimUpdateSlider(animate)
		local pct = math.clamp((_S.swimSpeed - SWIM_MIN) / (SWIM_MAX - SWIM_MIN), 0, 1)
		if animate then
			TweenService:Create(swimFill, TweenInfo.new(0.15), {Size = UDim2.new(pct, 0, 1, 0)}):Play()
			TweenService:Create(swimThumb, TweenInfo.new(0.15), {Position = UDim2.new(pct, 0, 0.5, 0)}):Play()
		else
			swimFill.Size = UDim2.new(pct, 0, 1, 0)
			swimThumb.Position = UDim2.new(pct, 0, 0.5, 0)
		end
	end
	_S.swimUpdateSlider = swimUpdateSlider

	local swimDragging = false
	swimTrack.InputBegan:Connect(function(input)
		if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
			swimDragging = true
			local tp = swimTrack.AbsolutePosition.X
			local ts = swimTrack.AbsoluteSize.X
			local pct = math.clamp((input.Position.X - tp) / ts, 0, 1)
			_S.swimSpeed = math.max(1, math.floor(SWIM_MIN + pct * (SWIM_MAX - SWIM_MIN)))
			swimSpeedValueLabel.Text = tostring(_S.swimSpeed)
			swimUpdateSlider(true)
		end
	end)
	swimThumb.InputBegan:Connect(function(input)
		if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
			swimDragging = true
		end
	end)
	UserInputService.InputEnded:Connect(function(input)
		if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
			swimDragging = false
		end
	end)
	UserInputService.InputChanged:Connect(function(input)
		if swimDragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then
			local tp = swimTrack.AbsolutePosition.X
			local ts = swimTrack.AbsoluteSize.X
			local pct = math.clamp((input.Position.X - tp) / ts, 0, 1)
			_S.swimSpeed = math.max(1, math.floor(SWIM_MIN + pct * (SWIM_MAX - SWIM_MIN)))
			swimSpeedValueLabel.Text = tostring(_S.swimSpeed)
			swimUpdateSlider(true)
		end
	end)
	swimSpeedValueLabel:GetPropertyChangedSignal("Text"):Connect(function()
		if not swimDragging then
			local num = tonumber(swimSpeedValueLabel.Text)
			if num then
				local pct = math.clamp((num - SWIM_MIN) / (SWIM_MAX - SWIM_MIN), 0, 1)
				TweenService:Create(swimFill, TweenInfo.new(0.15), {Size = UDim2.new(pct, 0, 1, 0)}):Play()
				TweenService:Create(swimThumb, TweenInfo.new(0.15), {Position = UDim2.new(pct, 0, 0.5, 0)}):Play()
			end
		end
	end)
	swimUpdateSlider(false)
	swimSpeedValueLabel.FocusLost:Connect(function()
		local num = tonumber(swimSpeedValueLabel.Text)
		if num then
			_S.swimSpeed = math.max(1, math.floor(num))
			swimSpeedValueLabel.Text = tostring(_S.swimSpeed)
		else
			swimSpeedValueLabel.Text = tostring(_S.swimSpeed)
		end
	end)
end

-- === Section Actions ===




local aSection = Instance.new("Frame")




aSection.Size = UDim2.new(1, -10, 0, 478)




aSection.Position = UDim2.new(0, 5, 0, 5)




aSection.BackgroundTransparency = 1




aSection.Parent = contentScroll




do




	local aHeader = Instance.new("TextLabel")




	aHeader.Size = UDim2.new(1, 0, 0, 18)




	aHeader.BackgroundTransparency = 1




	aHeader.Text = "Actions"




	aHeader.TextColor3 = Color3.fromRGB(255, 255, 255)




	aHeader.Font = Enum.Font.SourceSansBold




	aHeader.TextSize = 14




	aHeader.TextXAlignment = Enum.TextXAlignment.Left




	aHeader.Parent = aSection




end




do




	local aDesc = Instance.new("TextLabel")




	aDesc.Size = UDim2.new(1, 0, 0, 28)




	aDesc.Position = UDim2.new(0, 0, 0, 18)




	aDesc.BackgroundTransparency = 1




	aDesc.Text = "ESP: affiche les joueurs à travers les murs. Noclip: traverse les murs. Xray: voir à travers les blocs. Voir dans le noir: éclaire l'écran. TP Joueur: téléporte un joueur (sélectionnez-le d'abord dans Joueurs). Tool Téléport.: téléporte avec un outil. Give All Tools: donne tous les outils. Réapparaitre: recommence. TP All: téléporte tous les joueurs vers vous. Spin: fait tourner votre personnage sur lui-même. Spin Speed: ajuste la vitesse de rotation."




	aDesc.TextColor3 = Color3.fromRGB(255, 255, 255)




	aDesc.Font = Enum.Font.SourceSans




	aDesc.TextSize = 12




	aDesc.TextWrapped = true




	aDesc.TextTruncate = Enum.TextTruncate.AtEnd




	aDesc.TextXAlignment = Enum.TextXAlignment.Left




	aDesc.TextYAlignment = Enum.TextYAlignment.Top




	aDesc.Parent = aSection




end




local espBtn = btn(aSection, "ESP", UDim2.new(0, 0, 0, 48), UDim2.new(1, -2, 0, 24), Color3.fromRGB(50, 30, 50))




local setESPToggle = makeToggle(espBtn, "ESP")




local noclipBtn = btn(aSection, "Noclip", UDim2.new(0, 0, 0, 84), UDim2.new(1, -2, 0, 24), Color3.fromRGB(40, 30, 30))




local setNoclipToggle = makeToggle(noclipBtn, "Noclip")




local tpPlayerBtn = btn(aSection, "TP Joueur", UDim2.new(0, 0, 0, 120), UDim2.new(1, -2, 0, 24), Color3.fromRGB(30, 40, 50))




local tpToolBtn = btn(aSection, "Tool Téléport.", UDim2.new(0, 0, 0, 156), UDim2.new(1, -2, 0, 24), Color3.fromRGB(40, 30, 60))




local giveToolsBtn = btn(aSection, "Give All Tools", UDim2.new(0, 0, 0, 192), UDim2.new(1, -2, 0, 24), Color3.fromRGB(30, 60, 40))




local respawnBtn = btn(aSection, "Réapparaitre", UDim2.new(0, 0, 0, 228), UDim2.new(1, -2, 0, 24), Color3.fromRGB(60, 40, 30))




local tpAllBtn = btn(aSection, "TP All", UDim2.new(0, 0, 0, 264), UDim2.new(1, -2, 0, 24), Color3.fromRGB(30, 100, 40))




local setTpAllToggle = makeToggle(tpAllBtn, "TP All")




local xrayBtn = btn(aSection, "Xray", UDim2.new(0, 0, 0, 300), UDim2.new(1, -2, 0, 24), Color3.fromRGB(30, 30, 50))




local setXrayToggle = makeToggle(xrayBtn, "Xray")




local nightVisionBtn = btn(aSection, "Voir dans le noir", UDim2.new(0, 0, 0, 336), UDim2.new(1, -2, 0, 24), Color3.fromRGB(20, 35, 25))




local setNightVisionToggle = makeToggle(nightVisionBtn, "Voir dans le noir")

-- Spin toggle button
local spinBtn = btn(aSection, "Spin", UDim2.new(0, 0, 0, 372), UDim2.new(1, -2, 0, 24), Color3.fromRGB(30, 50, 60))
local setSpinToggle = makeToggle(spinBtn, "Spin")

-- Spin Speed slider (same style as Fly Speed)
local spinSpeedCard = Instance.new("Frame")
spinSpeedCard.Size = UDim2.new(1, -2, 0, 44)
spinSpeedCard.Position = UDim2.new(0, 0, 0, 398)
spinSpeedCard.BackgroundColor3 = Color3.fromRGB(22, 22, 28)
spinSpeedCard.BackgroundTransparency = 0
spinSpeedCard.BorderSizePixel = 0
spinSpeedCard.Parent = aSection
Instance.new("UICorner", spinSpeedCard).CornerRadius = UDim.new(0, 8)
do
	local spinStroke = Instance.new("UIStroke")
	spinStroke.Color = Color3.fromRGB(50, 50, 55)
	spinStroke.Thickness = 1
	spinStroke.Transparency = 0.3
	spinStroke.Parent = spinSpeedCard
end
do
	local spinLabel = Instance.new("TextLabel")
	spinLabel.Size = UDim2.new(0, 80, 0, 16)
	spinLabel.Position = UDim2.new(0, 8, 0, 5)
	spinLabel.BackgroundTransparency = 1
	spinLabel.Text = "Spin Speed"
	spinLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
	spinLabel.Font = Enum.Font.SourceSansBold
	spinLabel.TextSize = 13
	spinLabel.TextXAlignment = Enum.TextXAlignment.Left
	spinLabel.Parent = spinSpeedCard
end
local spinSpeedValueLabel = Instance.new("TextBox")
spinSpeedValueLabel.Size = UDim2.new(0, 50, 0, 16)
spinSpeedValueLabel.Position = UDim2.new(1, -58, 0, 5)
spinSpeedValueLabel.BackgroundColor3 = Color3.fromRGB(22, 22, 28)
spinSpeedValueLabel.BackgroundTransparency = 1
spinSpeedValueLabel.Text = tostring(_S.spinSpeed)
spinSpeedValueLabel.TextColor3 = Color3.fromRGB(100, 200, 255)
spinSpeedValueLabel.Font = Enum.Font.SourceSansBold
spinSpeedValueLabel.TextSize = 13
spinSpeedValueLabel.BorderSizePixel = 0
spinSpeedValueLabel.ClearTextOnFocus = false
spinSpeedValueLabel.TextXAlignment = Enum.TextXAlignment.Right
spinSpeedValueLabel.Parent = spinSpeedCard
local spinTrack = Instance.new("Frame")
spinTrack.Size = UDim2.new(1, -16, 0, 4)
spinTrack.Position = UDim2.new(0, 8, 0, 30)
spinTrack.BackgroundColor3 = Color3.fromRGB(12, 12, 16)
spinTrack.BorderSizePixel = 0
spinTrack.Parent = spinSpeedCard
Instance.new("UICorner", spinTrack).CornerRadius = UDim.new(1, 0)
local spinFill = Instance.new("Frame")
spinFill.Size = UDim2.new(0, 0, 1, 0)
spinFill.BackgroundColor3 = Color3.fromRGB(50, 150, 200)
spinFill.BorderSizePixel = 0
spinFill.Parent = spinTrack
Instance.new("UICorner", spinFill).CornerRadius = UDim.new(1, 0)
local spinThumb = Instance.new("Frame")
spinThumb.Size = UDim2.new(0, 14, 0, 14)
spinThumb.AnchorPoint = Vector2.new(0.5, 0.5)
spinThumb.Position = UDim2.new(0, 0, 0.5, 0)
spinThumb.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
spinThumb.BorderSizePixel = 0
spinThumb.Parent = spinTrack
Instance.new("UICorner", spinThumb).CornerRadius = UDim.new(1, 0)
do
	local spinThumbShadow = Instance.new("UIStroke")
	spinThumbShadow.Color = Color3.fromRGB(0, 0, 0)
	spinThumbShadow.Thickness = 1
	spinThumbShadow.Transparency = 0.5
	spinThumbShadow.Parent = spinThumb
end
local SPIN_MIN = 1
local SPIN_MAX = 500
local function spinUpdateSlider(animate)
	local pct = math.clamp((_S.spinSpeed - SPIN_MIN) / (SPIN_MAX - SPIN_MIN), 0, 1)
	if animate then
		TweenService:Create(spinFill, TweenInfo.new(0.15), {Size = UDim2.new(pct, 0, 1, 0)}):Play()
		TweenService:Create(spinThumb, TweenInfo.new(0.15), {Position = UDim2.new(pct, 0, 0.5, 0)}):Play()
	else
		spinFill.Size = UDim2.new(pct, 0, 1, 0)
		spinThumb.Position = UDim2.new(pct, 0, 0.5, 0)
	end
end
local spinDragging = false
spinTrack.InputBegan:Connect(function(input)
	if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
		spinDragging = true
		local tp = spinTrack.AbsolutePosition.X
		local ts = spinTrack.AbsoluteSize.X
		local pct = math.clamp((input.Position.X - tp) / ts, 0, 1)
		_S.spinSpeed = math.max(1, math.floor(SPIN_MIN + pct * (SPIN_MAX - SPIN_MIN)))
		spinSpeedValueLabel.Text = tostring(_S.spinSpeed)
		spinUpdateSlider(true)
	end
end)
spinThumb.InputBegan:Connect(function(input)
	if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
		spinDragging = true
	end
end)
UserInputService.InputEnded:Connect(function(input)
	if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
		spinDragging = false
	end
end)
UserInputService.InputChanged:Connect(function(input)
	if spinDragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then
		local tp = spinTrack.AbsolutePosition.X
		local ts = spinTrack.AbsoluteSize.X
		local pct = math.clamp((input.Position.X - tp) / ts, 0, 1)
		_S.spinSpeed = math.max(1, math.floor(SPIN_MIN + pct * (SPIN_MAX - SPIN_MIN)))
		spinSpeedValueLabel.Text = tostring(_S.spinSpeed)
		spinUpdateSlider(true)
	end
end)
spinSpeedValueLabel:GetPropertyChangedSignal("Text"):Connect(function()
	if not spinDragging then
		local num = tonumber(spinSpeedValueLabel.Text)
		if num then
			local pct = math.clamp((num - SPIN_MIN) / (SPIN_MAX - SPIN_MIN), 0, 1)
			TweenService:Create(spinFill, TweenInfo.new(0.15), {Size = UDim2.new(pct, 0, 1, 0)}):Play()
			TweenService:Create(spinThumb, TweenInfo.new(0.15), {Position = UDim2.new(pct, 0, 0.5, 0)}):Play()
		end
	end
end)
spinUpdateSlider(false)
spinSpeedValueLabel.FocusLost:Connect(function()
	local num = tonumber(spinSpeedValueLabel.Text)
	if num then
		_S.spinSpeed = math.max(1, math.floor(num))
		spinSpeedValueLabel.Text = tostring(_S.spinSpeed)
	else
		spinSpeedValueLabel.Text = tostring(_S.spinSpeed)
	end
end)

-- BR toggle: right arm toward crotch, up-down rotation
_S.brEnabled = false
_S.brConn = nil
_S.brCons = {}
_S.brRUA = nil
local brBtn = btn(aSection, "BR", UDim2.new(0, 0, 0, 448), UDim2.new(1, -2, 0, 24), Color3.fromRGB(50, 30, 60))
local setBRToggle = makeToggle(brBtn, "BR")
brBtn.MouseButton1Click:Connect(function()
	_S.brEnabled = not _S.brEnabled
	setBRToggle(_S.brEnabled)
	local char = player.Character
	if not char then return end
	if _S.brEnabled then
		local hum = char:FindFirstChildOfClass("Humanoid")
		local anim = hum and hum:FindFirstChildOfClass("Animator")
		if anim then
			for _, tr in ipairs(anim:GetPlayingAnimationTracks()) do tr:Stop(0) end
		end
		local as = char:FindFirstChild("Animate")
		if as then as.Disabled = true end
		local lt = char:FindFirstChild("LowerTorso")
		_S.brRUA = char:FindFirstChild("RightUpperArm")
		if lt and _S.brRUA then
			_S.brCons = {}
			local ac = _S.brRUA:FindFirstChild("RightShoulder")
			local bs = _S.brRUA:FindFirstChild("RightShoulderBallSocket")
			if ac and ac:IsA("AnimationConstraint") then ac.Enabled = false; table.insert(_S.brCons, ac) end
			if bs and bs:IsA("BallSocketConstraint") then bs.Enabled = false; table.insert(_S.brCons, bs) end
			_S.brRUA.Anchored = true
			_S.brConn = RunService.RenderStepped:Connect(function()
				if not _S.brEnabled or not _S.brRUA or not _S.brRUA.Parent then return end
				local lt2 = player.Character and player.Character:FindFirstChild("LowerTorso")
				if not lt2 then return end
				local bob = math.sin(tick() * 8) * 0.15
				_S.brRUA.CFrame = lt2.CFrame * CFrame.new(0, -0.3 + bob, -0.5)
			end)
		end
	else
		if _S.brConn then _S.brConn:Disconnect(); _S.brConn = nil end
		if _S.brRUA and _S.brRUA.Parent then _S.brRUA.Anchored = false end
		_S.brRUA = nil
		for _, c in ipairs(_S.brCons) do c.Enabled = true end
		_S.brCons = {}
		local as = char:FindFirstChild("Animate")
		if as then as.Disabled = false end
	end
end)
player.CharacterAdded:Connect(function()
	if _S.brEnabled then task.wait(1) end
end)





_S.savedPosition = nil




_S.savedPlayerPosition = nil




-- === Section Position ===




local posSection = Instance.new("Frame")




posSection.Size = UDim2.new(1, -10, 0, 280)




posSection.Position = UDim2.new(0, 5, 0, 5)




posSection.BackgroundTransparency = 1




posSection.Parent = contentScroll




do




	local posHeader = Instance.new("TextLabel")




	posHeader.Size = UDim2.new(1, 0, 0, 18)




	posHeader.BackgroundTransparency = 1




	posHeader.Text = "Position"




	posHeader.TextColor3 = Color3.fromRGB(255, 255, 255)




	posHeader.Font = Enum.Font.SourceSansBold




	posHeader.TextSize = 14




	posHeader.TextXAlignment = Enum.TextXAlignment.Left




	posHeader.Parent = posSection




end




do




	local posDesc = Instance.new("TextLabel")




	posDesc.Size = UDim2.new(1, 0, 0, 28)




	posDesc.Position = UDim2.new(0, 0, 0, 18)




	posDesc.BackgroundTransparency = 1




	posDesc.Text = "Save Position: sauvegarde votre position actuelle. Save Pos Joueur Select: sauvegarde la position du joueur sélectionné dans Joueurs. TP Position: téléporte à la position sauvegardée (joueur sélectionné en priorité). TP SAVE AUTO ALT: téléporte automatiquement après la mort (méthode alternative). TP SAVE AUTO SIMPLE: téléporte automatiquement après la mort (méthode simple)."




	posDesc.TextColor3 = Color3.fromRGB(255, 255, 255)




	posDesc.Font = Enum.Font.SourceSans




	posDesc.TextSize = 12




	posDesc.TextWrapped = true




	posDesc.TextTruncate = Enum.TextTruncate.AtEnd




	posDesc.TextXAlignment = Enum.TextXAlignment.Left




	posDesc.TextYAlignment = Enum.TextYAlignment.Top




	posDesc.Parent = posSection




end




local savePosBtn = btn(posSection, "Save Position", UDim2.new(0, 0, 0, 48), UDim2.new(1, -2, 0, 24), Color3.fromRGB(45, 35, 55))




local tpPosBtn = btn(posSection, "TP Position", UDim2.new(0, 0, 0, 84), UDim2.new(1, -2, 0, 24), Color3.fromRGB(35, 45, 55))




local tpSavePosBtn = btn(posSection, "TP SAVE AUTO ALT", UDim2.new(0, 0, 0, 120), UDim2.new(1, -2, 0, 24), Color3.fromRGB(35, 55, 45))




local setTpSavePosToggle = makeToggle(tpSavePosBtn, "TP SAVE AUTO ALT")




local tpSaveSimpleBtn = btn(posSection, "TP SAVE AUTO SIMPLE", UDim2.new(0, 0, 0, 156), UDim2.new(1, -2, 0, 24), Color3.fromRGB(45, 55, 35))




local setTpSaveSimpleToggle = makeToggle(tpSaveSimpleBtn, "TP SAVE AUTO SIMPLE")




local savePlayerPosBtn = btn(posSection, "Save Pos Joueur Select", UDim2.new(0, 0, 0, 192), UDim2.new(1, -2, 0, 24), Color3.fromRGB(45, 35, 55))




local intervalCard = Instance.new("Frame")
intervalCard.Size = UDim2.new(1, -2, 0, 44)
intervalCard.Position = UDim2.new(0, 0, 0, 228)
intervalCard.BackgroundColor3 = Color3.fromRGB(22, 22, 28)
intervalCard.BackgroundTransparency = 0
intervalCard.BorderSizePixel = 0
intervalCard.Parent = posSection
Instance.new("UICorner", intervalCard).CornerRadius = UDim.new(0, 8)
do
	local intervalStroke = Instance.new("UIStroke")
	intervalStroke.Color = Color3.fromRGB(50, 50, 55)
	intervalStroke.Thickness = 1
	intervalStroke.Transparency = 0.3
	intervalStroke.Parent = intervalCard
end
do
	local intervalLabel = Instance.new("TextLabel")
	intervalLabel.Size = UDim2.new(0, 80, 0, 16)
	intervalLabel.Position = UDim2.new(0, 8, 0, 5)
	intervalLabel.BackgroundTransparency = 1
	intervalLabel.Text = "Interval"
	intervalLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
	intervalLabel.Font = Enum.Font.SourceSansBold
	intervalLabel.TextSize = 13
	intervalLabel.TextXAlignment = Enum.TextXAlignment.Left
	intervalLabel.Parent = intervalCard
end
local intervalValueLabel = Instance.new("TextBox")
intervalValueLabel.Size = UDim2.new(0, 50, 0, 16)
intervalValueLabel.Position = UDim2.new(1, -58, 0, 5)
intervalValueLabel.BackgroundColor3 = Color3.fromRGB(22, 22, 28)
intervalValueLabel.BackgroundTransparency = 1
intervalValueLabel.Text = tostring(_S.tpSaveInterval)
intervalValueLabel.TextColor3 = Color3.fromRGB(255, 60, 60)
intervalValueLabel.Font = Enum.Font.SourceSansBold
intervalValueLabel.TextSize = 13
intervalValueLabel.BorderSizePixel = 0
intervalValueLabel.ClearTextOnFocus = false
intervalValueLabel.TextXAlignment = Enum.TextXAlignment.Right
intervalValueLabel.Parent = intervalCard
local intervalTrack = Instance.new("Frame")
intervalTrack.Size = UDim2.new(1, -16, 0, 4)
intervalTrack.Position = UDim2.new(0, 8, 0, 30)
intervalTrack.BackgroundColor3 = Color3.fromRGB(12, 12, 16)
intervalTrack.BorderSizePixel = 0
intervalTrack.Parent = intervalCard
Instance.new("UICorner", intervalTrack).CornerRadius = UDim.new(1, 0)
local intervalFill = Instance.new("Frame")
intervalFill.Size = UDim2.new(0, 0, 1, 0)
intervalFill.BackgroundColor3 = Color3.fromRGB(220, 50, 50)
intervalFill.BorderSizePixel = 0
intervalFill.Parent = intervalTrack
Instance.new("UICorner", intervalFill).CornerRadius = UDim.new(1, 0)
local intervalThumb = Instance.new("Frame")
intervalThumb.Size = UDim2.new(0, 14, 0, 14)
intervalThumb.AnchorPoint = Vector2.new(0.5, 0.5)
intervalThumb.Position = UDim2.new(0, 0, 0.5, 0)
intervalThumb.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
intervalThumb.BorderSizePixel = 0
intervalThumb.Parent = intervalTrack
Instance.new("UICorner", intervalThumb).CornerRadius = UDim.new(1, 0)
do
	local intervalThumbShadow = Instance.new("UIStroke")
	intervalThumbShadow.Color = Color3.fromRGB(0, 0, 0)
	intervalThumbShadow.Thickness = 1
	intervalThumbShadow.Transparency = 0.5
	intervalThumbShadow.Parent = intervalThumb
end
local intervalDownBtn = Instance.new("TextButton")
intervalDownBtn.Visible = false
intervalDownBtn.Parent = intervalCard
local intervalUpBtn = Instance.new("TextButton")
intervalUpBtn.Visible = false
intervalUpBtn.Parent = intervalCard
local INTERVAL_MIN = 0.1
local INTERVAL_MAX = 10
local function intervalUpdateSlider(animate)
	local pct = math.clamp((_S.tpSaveInterval - INTERVAL_MIN) / (INTERVAL_MAX - INTERVAL_MIN), 0, 1)
	if animate then
		TweenService:Create(intervalFill, TweenInfo.new(0.15), {Size = UDim2.new(pct, 0, 1, 0)}):Play()
		TweenService:Create(intervalThumb, TweenInfo.new(0.15), {Position = UDim2.new(pct, 0, 0.5, 0)}):Play()
	else
		intervalFill.Size = UDim2.new(pct, 0, 1, 0)
		intervalThumb.Position = UDim2.new(pct, 0, 0.5, 0)
	end
end
local intervalDragging = false
intervalTrack.InputBegan:Connect(function(input)
	if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
		intervalDragging = true
		local tp = intervalTrack.AbsolutePosition.X
		local ts = intervalTrack.AbsoluteSize.X
		local pct = math.clamp((input.Position.X - tp) / ts, 0, 1)
		_S.tpSaveInterval = math.max(0.1, INTERVAL_MIN + pct * (INTERVAL_MAX - INTERVAL_MIN))
		intervalValueLabel.Text = tostring(_S.tpSaveInterval)
		intervalUpdateSlider(true)
	end
end)
intervalThumb.InputBegan:Connect(function(input)
	if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
		intervalDragging = true
	end
end)
UserInputService.InputEnded:Connect(function(input)
	if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
		intervalDragging = false
	end
end)
UserInputService.InputChanged:Connect(function(input)
	if intervalDragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then
		local tp = intervalTrack.AbsolutePosition.X
		local ts = intervalTrack.AbsoluteSize.X
		local pct = math.clamp((input.Position.X - tp) / ts, 0, 1)
		_S.tpSaveInterval = math.max(0.1, INTERVAL_MIN + pct * (INTERVAL_MAX - INTERVAL_MIN))
		intervalValueLabel.Text = tostring(_S.tpSaveInterval)
		intervalUpdateSlider(true)
	end
end)
intervalValueLabel:GetPropertyChangedSignal("Text"):Connect(function()
	if not intervalDragging then
		local num = tonumber(intervalValueLabel.Text)
		if num then
			local pct = math.clamp((num - INTERVAL_MIN) / (INTERVAL_MAX - INTERVAL_MIN), 0, 1)
			TweenService:Create(intervalFill, TweenInfo.new(0.15), {Size = UDim2.new(pct, 0, 1, 0)}):Play()
			TweenService:Create(intervalThumb, TweenInfo.new(0.15), {Position = UDim2.new(pct, 0, 0.5, 0)}):Play()
		end
	end
end)
intervalUpdateSlider(false)
intervalValueLabel.FocusLost:Connect(function()
	local num = tonumber(intervalValueLabel.Text)
	if num then
		_S.tpSaveInterval = math.max(0.1, num)
		intervalValueLabel.Text = tostring(_S.tpSaveInterval)
		intervalUpdateSlider(true)
	else
		intervalValueLabel.Text = tostring(_S.tpSaveInterval)
		intervalUpdateSlider(true)
	end
end)





-- === Section Voice Chat ===




local vSection = Instance.new("Frame")




vSection.Size = UDim2.new(1, -10, 0, 80)




vSection.Position = UDim2.new(0, 5, 0, 5)




vSection.BackgroundTransparency = 1




vSection.Parent = contentScroll




do




	local vHeader = Instance.new("TextLabel")




	vHeader.Size = UDim2.new(1, 0, 0, 18)




	vHeader.BackgroundTransparency = 1




	vHeader.Text = "Voice Chat"




	vHeader.TextColor3 = Color3.fromRGB(255, 255, 255)




	vHeader.Font = Enum.Font.SourceSansBold




	vHeader.TextSize = 14




	vHeader.TextXAlignment = Enum.TextXAlignment.Left




	vHeader.Parent = vSection




end




do




	local vDesc = Instance.new("TextLabel")




	vDesc.Size = UDim2.new(1, 0, 0, 28)




	vDesc.Position = UDim2.new(0, 0, 0, 18)




	vDesc.BackgroundTransparency = 1




	vDesc.Text = "Sélectionnez d'abord un joueur dans la catégorie Joueurs, puis utilisez Vol - et Vol + pour réduire ou augmenter son volume vocal. Le volume actuel est affiché entre les deux boutons."




	vDesc.TextColor3 = Color3.fromRGB(255, 255, 255)




	vDesc.Font = Enum.Font.SourceSans




	vDesc.TextSize = 12




	vDesc.TextWrapped = true




	vDesc.TextTruncate = Enum.TextTruncate.AtEnd




	vDesc.TextXAlignment = Enum.TextXAlignment.Left




	vDesc.TextYAlignment = Enum.TextYAlignment.Top




	vDesc.Parent = vSection




end




local volDownBtn = btn(vSection, "Vol -", UDim2.new(0, 0, 0, 48), UDim2.new(0.18, -2, 0, 24), Color3.fromRGB(40, 30, 50))




local volLabel = Instance.new("TextBox")




volLabel.Size = UDim2.new(0.58, -2, 0, 24)




volLabel.Position = UDim2.new(0.22, 0, 0, 48)




volLabel.BackgroundColor3 = Color3.fromRGB(30, 30, 45)




volLabel.BackgroundTransparency = 0




volLabel.Text = "Vol: 100%"




volLabel.TextColor3 = Color3.fromRGB(255, 255, 255)




volLabel.Font = Enum.Font.SourceSans




volLabel.TextSize = 14




volLabel.BorderSizePixel = 0




volLabel.ClearTextOnFocus = false




volLabel.Parent = vSection




Instance.new("UICorner", volLabel).CornerRadius = UDim.new(0, 4)




local volUpBtn = btn(vSection, "Vol +", UDim2.new(0.82, 0, 0, 48), UDim2.new(0.18, -2, 0, 24), Color3.fromRGB(40, 30, 50))




-- === Section Auto ===




local auSection = Instance.new("Frame")




auSection.Size = UDim2.new(1, -10, 0, 176)




auSection.Position = UDim2.new(0, 5, 0, 5)




auSection.BackgroundTransparency = 1




auSection.Parent = contentScroll




do




	local auHeader = Instance.new("TextLabel")




	auHeader.Size = UDim2.new(1, 0, 0, 18)




	auHeader.BackgroundTransparency = 1




	auHeader.Text = "Auto"




	auHeader.TextColor3 = Color3.fromRGB(255, 255, 255)




	auHeader.Font = Enum.Font.SourceSansBold




	auHeader.TextSize = 14




	auHeader.TextXAlignment = Enum.TextXAlignment.Left




	auHeader.Parent = auSection




end




do




	local auDesc = Instance.new("TextLabel")




	auDesc.Size = UDim2.new(1, 0, 0, 28)




	auDesc.Position = UDim2.new(0, 0, 0, 18)




	auDesc.BackgroundTransparency = 1




	auDesc.Text = "AFK: active le mode anti-AFK (empêche d'être kické pour inactivité). Jump Infini: permet de sauter indéfiniment en maintenant la barre espace. Auto Rejoin: relance automatiquement le jeu si vous êtes déconnecté. Cliquez sur chaque bouton pour activer/désactiver."




	auDesc.TextColor3 = Color3.fromRGB(255, 255, 255)




	auDesc.Font = Enum.Font.SourceSans




	auDesc.TextSize = 12




	auDesc.TextWrapped = true




	auDesc.TextTruncate = Enum.TextTruncate.AtEnd




	auDesc.TextXAlignment = Enum.TextXAlignment.Left




	auDesc.TextYAlignment = Enum.TextYAlignment.Top




	auDesc.Parent = auSection




end




local afkBtn = btn(auSection, "AFK", UDim2.new(0, 0, 0, 48), UDim2.new(1, -2, 0, 24), Color3.fromRGB(30, 50, 50))




local setAfkToggle = makeToggle(afkBtn, "AFK")




local autoRejoinBtn = btn(auSection, "Auto Rejoin", UDim2.new(0, 0, 0, 84), UDim2.new(1, -2, 0, 24), Color3.fromRGB(50, 40, 30))




local jumpInfiniteBtn = btn(auSection, "Jump Infini", UDim2.new(0, 0, 0, 120), UDim2.new(1, -2, 0, 24), Color3.fromRGB(40, 50, 30))




local setJumpInfiniteToggle = makeToggle(jumpInfiniteBtn, "Jump Infini")




-- === Section Lock ===




local lockSection = Instance.new("Frame")




lockSection.Size = UDim2.new(1, -10, 0, 315)




lockSection.Position = UDim2.new(0, 5, 0, 5)




lockSection.BackgroundTransparency = 1




lockSection.Parent = contentScroll




do




	local lockHeader = Instance.new("TextLabel")




	lockHeader.Size = UDim2.new(1, 0, 0, 18)




	lockHeader.BackgroundTransparency = 1




	lockHeader.Text = "Lock"




	lockHeader.TextColor3 = Color3.fromRGB(255, 255, 255)




	lockHeader.Font = Enum.Font.SourceSansBold




	lockHeader.TextSize = 14




	lockHeader.TextXAlignment = Enum.TextXAlignment.Left




	lockHeader.Parent = lockSection




end




do




	local lockDesc = Instance.new("TextLabel")




	lockDesc.Size = UDim2.new(1, 0, 0, 28)




	lockDesc.Position = UDim2.new(0, 0, 0, 18)




	lockDesc.BackgroundTransparency = 1




	lockDesc.Text = "Lock Joueur: verrouille la caméra sur tous les joueurs. Lock Select: verrouille sur le joueur sélectionné dans Joueurs. Lock Equipe Adverse: verrouille sur l'équipe adverse. Utilisez les sliders - et + pour ajuster la portée de verrouillage (Infini = portée illimitée)."




	lockDesc.TextColor3 = Color3.fromRGB(255, 255, 255)




	lockDesc.Font = Enum.Font.SourceSans




	lockDesc.TextSize = 12




	lockDesc.TextWrapped = true




	lockDesc.TextTruncate = Enum.TextTruncate.AtEnd




	lockDesc.TextXAlignment = Enum.TextXAlignment.Left




	lockDesc.TextYAlignment = Enum.TextYAlignment.Top




	lockDesc.Parent = lockSection




end




local lockAllBtn = btn(lockSection, "Lock Joueur", UDim2.new(0, 0, 0, 48), UDim2.new(1, -2, 0, 24), Color3.fromRGB(50, 30, 30))




local setLockAllToggle = makeToggle(lockAllBtn, "Lock Joueur")




local lockSelBtn = btn(lockSection, "Lock Select", UDim2.new(0, 0, 0, 84), UDim2.new(1, -2, 0, 24), Color3.fromRGB(50, 30, 30))




local setLockSelToggle = makeToggle(lockSelBtn, "Lock Select")




local lockEnemyBtn = btn(lockSection, "Lock Equipe Adverse", UDim2.new(0, 0, 0, 120), UDim2.new(1, -2, 0, 24), Color3.fromRGB(50, 30, 30))




local setLockEnemyToggle = makeToggle(lockEnemyBtn, "Lock Equipe Adverse")




-- Slider control for lock range
local function makeRangeControl(parent, posY, size, label, rangeKey)
	local card = Instance.new("Frame")
	card.Size = size
	card.Position = posY
	card.BackgroundColor3 = Color3.fromRGB(22, 22, 28)
	card.BackgroundTransparency = 0
	card.BorderSizePixel = 0
	card.Parent = parent
	Instance.new("UICorner", card).CornerRadius = UDim.new(0, 8)
	do
		local cardStroke = Instance.new("UIStroke")
		cardStroke.Color = Color3.fromRGB(50, 50, 55)
		cardStroke.Thickness = 1
		cardStroke.Transparency = 0.3
		cardStroke.Parent = card
	end
	local lbl = Instance.new("TextLabel")
	lbl.Size = UDim2.new(0, 100, 0, 16)
	lbl.Position = UDim2.new(0, 8, 0, 5)
	lbl.BackgroundTransparency = 1
	lbl.Text = label
	lbl.TextColor3 = Color3.fromRGB(255, 255, 255)
	lbl.Font = Enum.Font.SourceSansBold
	lbl.TextSize = 13
	lbl.TextXAlignment = Enum.TextXAlignment.Left
	lbl.Parent = card
	local valBox = Instance.new("TextBox")
	valBox.Size = UDim2.new(0, 60, 0, 16)
	valBox.Position = UDim2.new(1, -68, 0, 5)
	valBox.BackgroundColor3 = Color3.fromRGB(22, 22, 28)
	valBox.BackgroundTransparency = 1
	valBox.Text = _S.lockRanges[rangeKey] == math.huge and "Infini" or tostring(_S.lockRanges[rangeKey])
	valBox.TextColor3 = Color3.fromRGB(255, 60, 60)
	valBox.Font = Enum.Font.SourceSansBold
	valBox.TextSize = 13
	valBox.BorderSizePixel = 0
	valBox.ClearTextOnFocus = false
	valBox.TextXAlignment = Enum.TextXAlignment.Right
	valBox.Parent = card
	local track = Instance.new("Frame")
	track.Size = UDim2.new(1, -16, 0, 4)
	track.Position = UDim2.new(0, 8, 0, 30)
	track.BackgroundColor3 = Color3.fromRGB(12, 12, 16)
	track.BorderSizePixel = 0
	track.Parent = card
	Instance.new("UICorner", track).CornerRadius = UDim.new(1, 0)
	local fill = Instance.new("Frame")
	fill.Size = UDim2.new(0, 0, 1, 0)
	fill.BackgroundColor3 = Color3.fromRGB(220, 50, 50)
	fill.BorderSizePixel = 0
	fill.Parent = track
	Instance.new("UICorner", fill).CornerRadius = UDim.new(1, 0)
	local thumb = Instance.new("Frame")
	thumb.Size = UDim2.new(0, 14, 0, 14)
	thumb.AnchorPoint = Vector2.new(0.5, 0.5)
	thumb.Position = UDim2.new(0, 0, 0.5, 0)
	thumb.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
	thumb.BorderSizePixel = 0
	thumb.Parent = track
	Instance.new("UICorner", thumb).CornerRadius = UDim.new(1, 0)
	do
		local thumbShadow = Instance.new("UIStroke")
		thumbShadow.Color = Color3.fromRGB(0, 0, 0)
		thumbShadow.Thickness = 1
		thumbShadow.Transparency = 0.5
		thumbShadow.Parent = thumb
	end
	local downBtn = Instance.new("TextButton")
	downBtn.Visible = false
	downBtn.Parent = card
	addBtnSound(downBtn)
	local upBtn = Instance.new("TextButton")
	upBtn.Visible = false
	upBtn.Parent = card
	addBtnSound(upBtn)
	local RANGE_MIN = 10
	local RANGE_MAX = 1000
	local function updateLabel()
		valBox.Text = _S.lockRanges[rangeKey] == math.huge and "Infini" or tostring(_S.lockRanges[rangeKey])
	end
	local function updateSlider(animate)
		local val = _S.lockRanges[rangeKey]
		local pct
		if val == math.huge then
			pct = 1
		else
			pct = math.clamp((val - RANGE_MIN) / (RANGE_MAX - RANGE_MIN), 0, 1)
		end
		if animate then
			TweenService:Create(fill, TweenInfo.new(0.15), {Size = UDim2.new(pct, 0, 1, 0)}):Play()
			TweenService:Create(thumb, TweenInfo.new(0.15), {Position = UDim2.new(pct, 0, 0.5, 0)}):Play()
		else
			fill.Size = UDim2.new(pct, 0, 1, 0)
			thumb.Position = UDim2.new(pct, 0, 0.5, 0)
		end
	end
	local dragging = false
	track.InputBegan:Connect(function(input)
		if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
			dragging = true
			local tp = track.AbsolutePosition.X
			local ts = track.AbsoluteSize.X
			local pct = math.clamp((input.Position.X - tp) / ts, 0, 1)
			if pct >= 0.99 then
				_S.lockRanges[rangeKey] = math.huge
			else
				_S.lockRanges[rangeKey] = math.max(RANGE_MIN, math.floor(RANGE_MIN + pct * (RANGE_MAX - RANGE_MIN)))
			end
			updateLabel()
			updateSlider(true)
		end
	end)
	thumb.InputBegan:Connect(function(input)
		if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
			dragging = true
		end
	end)
	UserInputService.InputEnded:Connect(function(input)
		if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
			dragging = false
		end
	end)
	UserInputService.InputChanged:Connect(function(input)
		if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then
			local tp = track.AbsolutePosition.X
			local ts = track.AbsoluteSize.X
			local pct = math.clamp((input.Position.X - tp) / ts, 0, 1)
			if pct >= 0.99 then
				_S.lockRanges[rangeKey] = math.huge
			else
				_S.lockRanges[rangeKey] = math.max(RANGE_MIN, math.floor(RANGE_MIN + pct * (RANGE_MAX - RANGE_MIN)))
			end
			updateLabel()
			updateSlider(true)
		end
	end)
	valBox:GetPropertyChangedSignal("Text"):Connect(function()
		if not dragging then
			local val = _S.lockRanges[rangeKey]
			local pct
			if val == math.huge then
				pct = 1
			else
				pct = math.clamp((val - RANGE_MIN) / (RANGE_MAX - RANGE_MIN), 0, 1)
			end
			TweenService:Create(fill, TweenInfo.new(0.15), {Size = UDim2.new(pct, 0, 1, 0)}):Play()
			TweenService:Create(thumb, TweenInfo.new(0.15), {Position = UDim2.new(pct, 0, 0.5, 0)}):Play()
		end
	end)
	downBtn.MouseButton1Click:Connect(function()
		local r = _S.lockRanges[rangeKey]
		if r == math.huge then
			_S.lockRanges[rangeKey] = 500
		elseif r > 50 then
			_S.lockRanges[rangeKey] = r - 50
		else
			_S.lockRanges[rangeKey] = 10
		end
		updateLabel()
	end)
	upBtn.MouseButton1Click:Connect(function()
		local r = _S.lockRanges[rangeKey]
		if r == math.huge then
			return
		elseif r >= 500 then
			_S.lockRanges[rangeKey] = math.huge
		else
			_S.lockRanges[rangeKey] = r + 50
		end
		updateLabel()
	end)
	valBox.FocusLost:Connect(function()
		local txt = valBox.Text:lower()
		if txt == "infini" or txt == "inf" or txt == "infinite" then
			_S.lockRanges[rangeKey] = math.huge
		else
			local num = tonumber(txt)
			if num then
				_S.lockRanges[rangeKey] = math.max(10, math.floor(num))
			end
		end
		updateLabel()
	end)
	updateSlider(false)
end





-- Range controls pour chaque lock
do
	makeRangeControl(lockSection, UDim2.new(0, 0, 0, 156), UDim2.new(1, -2, 0, 44), "R:Joueur", "all")
	makeRangeControl(lockSection, UDim2.new(0, 0, 0, 208), UDim2.new(1, -2, 0, 44), "R:Select", "sel")
	makeRangeControl(lockSection, UDim2.new(0, 0, 0, 260), UDim2.new(1, -2, 0, 44), "R:Equipe Adv.", "enemy")
end

-- === Section Infos ===




local iSection = Instance.new("Frame")




iSection.Size = UDim2.new(1, -10, 0, 348)




iSection.Position = UDim2.new(0, 5, 0, 5)




iSection.BackgroundTransparency = 1




iSection.Parent = contentScroll




do




	local iHeader = Instance.new("TextLabel")




	iHeader.Size = UDim2.new(1, 0, 0, 18)




	iHeader.BackgroundTransparency = 1




	iHeader.Text = "Infos"




	iHeader.TextColor3 = Color3.fromRGB(255, 255, 255)




	iHeader.Font = Enum.Font.SourceSansBold




	iHeader.TextSize = 14




	iHeader.TextXAlignment = Enum.TextXAlignment.Left




	iHeader.Parent = iSection




end




do




	local iDesc = Instance.new("TextLabel")




	iDesc.Size = UDim2.new(1, 0, 0, 28)




	iDesc.Position = UDim2.new(0, 0, 0, 18)




	iDesc.BackgroundTransparency = 1




	iDesc.Text = "Voir mon sac: affiche tous les outils que vous possédez actuellement. Profil joueur: affiche les informations détaillées d'un joueur (sélectionnez-le d'abord dans la catégorie Joueurs)."




	iDesc.TextColor3 = Color3.fromRGB(255, 255, 255)




	iDesc.Font = Enum.Font.SourceSans




	iDesc.TextSize = 12




	iDesc.TextWrapped = true




	iDesc.TextTruncate = Enum.TextTruncate.AtEnd




	iDesc.TextXAlignment = Enum.TextXAlignment.Left




	iDesc.TextYAlignment = Enum.TextYAlignment.Top




	iDesc.Parent = iSection




end




local bagBtn = btn(iSection, "Voir mon sac", UDim2.new(0, 0, 0, 48), UDim2.new(1, -2, 0, 24), Color3.fromRGB(30, 50, 50))




local profileBtn = btn(iSection, "Profil joueur", UDim2.new(0, 0, 0, 84), UDim2.new(1, -2, 0, 24), Color3.fromRGB(50, 40, 60))




-- === Section Paramètres ===




local paramSection = Instance.new("Frame")




paramSection.Size = UDim2.new(1, -10, 0, 280)




paramSection.Position = UDim2.new(0, 5, 0, 5)




paramSection.BackgroundTransparency = 1




paramSection.Parent = contentScroll




do




	local paramHeader = Instance.new("TextLabel")




	paramHeader.Size = UDim2.new(1, 0, 0, 18)




	paramHeader.BackgroundTransparency = 1




	paramHeader.Text = "Paramètres"




	paramHeader.TextColor3 = Color3.fromRGB(255, 255, 255)




	paramHeader.Font = Enum.Font.SourceSansBold




	paramHeader.TextSize = 14




	paramHeader.TextXAlignment = Enum.TextXAlignment.Left




	paramHeader.Parent = paramSection




end




do




	local paramDesc = Instance.new("TextLabel")




	paramDesc.Size = UDim2.new(1, 0, 0, 28)




	paramDesc.Position = UDim2.new(0, 0, 0, 18)




	paramDesc.BackgroundTransparency = 1




	paramDesc.Text = "Personnalisez le panel: changez la couleur du panel, des boutons et des catégories. Choisissez un son de clic parmi Original, Click, Pop, Modern ou Aucun. Réinitialiser: restaure tous les réglages par défaut. Supprimer le panel: désactive toutes les fonctionnalités, tue Omega et supprime complètement le panel REDTIGER."




	paramDesc.TextColor3 = Color3.fromRGB(255, 255, 255)




	paramDesc.Font = Enum.Font.SourceSans




	paramDesc.TextSize = 12




	paramDesc.TextWrapped = true




	paramDesc.TextTruncate = Enum.TextTruncate.AtEnd




	paramDesc.TextXAlignment = Enum.TextXAlignment.Left




	paramDesc.TextYAlignment = Enum.TextYAlignment.Top




	paramDesc.Parent = paramSection




end




-- === Personnalisation du Panel ===

-- Valeurs originales pour le reset
local originalColors = {
	panel = Color3.fromRGB(8, 8, 12),
	titleBar = Color3.fromRGB(18, 18, 28),
	navBar = Color3.fromRGB(14, 14, 22),
	contentScroll = Color3.fromRGB(8, 8, 12),
	profileCard = Color3.fromRGB(14, 14, 22),
	btnDefault = Color3.fromRGB(120, 30, 30),
	navColor = Color3.fromRGB(60, 60, 65),
	navActiveColor = Color3.fromRGB(100, 100, 110),
}

local originalSoundId = "rbxassetid://88442833509532"

-- Helper: creer un echantillon de couleur
local function makeColorSwatch(parent, color, posY, posX, onClick)
	local swatch = Instance.new("TextButton")
	swatch.Size = UDim2.new(0, 22, 0, 22)
	swatch.Position = UDim2.new(0, posX, 0, posY)
	swatch.BackgroundColor3 = color
	swatch.Text = ""
	swatch.BorderSizePixel = 1
	swatch.BorderColor3 = Color3.fromRGB(80, 80, 90)
	swatch.Parent = parent
	Instance.new("UICorner", swatch).CornerRadius = UDim.new(0, 4)
	addBtnSound(swatch)
	swatch.MouseButton1Click:Connect(function()
		onClick(color)
	end)
	return swatch
end

-- Appliquer la couleur du panel
local function applyPanelColor(c)
	panel.BackgroundColor3 = c
	titleBar.BackgroundColor3 = Color3.new(
		math.min(c.R + 0.04, 1),
		math.min(c.G + 0.04, 1),
		math.min(c.B + 0.04, 1)
	)
	navBar.BackgroundColor3 = Color3.new(
		math.min(c.R + 0.03, 1),
		math.min(c.G + 0.03, 1),
		math.min(c.B + 0.03, 1)
	)
	contentScroll.BackgroundColor3 = c
	profileCard.BackgroundColor3 = Color3.new(
		math.min(c.R + 0.03, 1),
		math.min(c.G + 0.03, 1),
		math.min(c.B + 0.03, 1)
	)
end

-- Appliquer la couleur des boutons
local function applyButtonColor(c)
	_S.customBtnColor = c
	if _S.allButtons then
		for _, b in ipairs(_S.allButtons) do
			pcall(function()
				b.BackgroundColor3 = c
			end)
		end
	end
	for name, navBtn in pairs(navButtons) do
		pcall(function()
			if name == currentPage then
				navBtn.BackgroundColor3 = _S.customNavActiveColor or Color3.fromRGB(100, 100, 110)
			else
				navBtn.BackgroundColor3 = _S.customNavColor or Color3.fromRGB(60, 60, 65)
			end
		end)
	end
end

local function applyNavColor(c, isActive)
	if isActive then
		_S.customNavActiveColor = c
	else
		_S.customNavColor = c
	end
	for name, navBtn in pairs(navButtons) do
		pcall(function()
			if name == currentPage then
				navBtn.BackgroundColor3 = _S.customNavActiveColor or Color3.fromRGB(100, 100, 110)
			else
				navBtn.BackgroundColor3 = _S.customNavColor or Color3.fromRGB(60, 60, 65)
			end
		end)
	end
end

-- Appliquer le son des boutons
local ContentProvider = game:GetService("ContentProvider")
local function applySound(soundId)
	if soundId and soundId ~= "" then
		hoverSound.SoundId = soundId
		clickSound.SoundId = soundId
		task.spawn(function()
			ContentProvider:PreloadAsync({hoverSound, clickSound})
		end)
	else
		hoverSound.SoundId = ""
		clickSound.SoundId = ""
	end
end

-- === UI: Couleur du Panel ===
do
	local lbl = Instance.new("TextLabel")
	lbl.Size = UDim2.new(1, 0, 0, 14)
	lbl.Position = UDim2.new(0, 0, 0, 50)
	lbl.BackgroundTransparency = 1
	lbl.Text = "Couleur du Panel"
	lbl.TextColor3 = Color3.fromRGB(255, 255, 255)
	lbl.Font = Enum.Font.SourceSansBold
	lbl.TextSize = 13
	lbl.TextXAlignment = Enum.TextXAlignment.Left
	lbl.Parent = paramSection

	local panelColors = {
		Color3.fromRGB(8, 8, 12),
		Color3.fromRGB(8, 12, 30),
		Color3.fromRGB(8, 30, 12),
		Color3.fromRGB(20, 8, 30),
		Color3.fromRGB(30, 8, 8),
		Color3.fromRGB(30, 25, 10),
		Color3.fromRGB(10, 10, 10),
		Color3.fromRGB(25, 20, 30),
	}

	for i, c in ipairs(panelColors) do
		makeColorSwatch(paramSection, c, 68, (i - 1) * 26, applyPanelColor)
	end
end

-- === UI: Couleur des Boutons ===
do
	local lbl = Instance.new("TextLabel")
	lbl.Size = UDim2.new(1, 0, 0, 14)
	lbl.Position = UDim2.new(0, 0, 0, 96)
	lbl.BackgroundTransparency = 1
	lbl.Text = "Couleur des Boutons"
	lbl.TextColor3 = Color3.fromRGB(255, 255, 255)
	lbl.Font = Enum.Font.SourceSansBold
	lbl.TextSize = 13
	lbl.TextXAlignment = Enum.TextXAlignment.Left
	lbl.Parent = paramSection

	local btnColors = {
		Color3.fromRGB(120, 30, 30),
		Color3.fromRGB(30, 60, 120),
		Color3.fromRGB(30, 120, 50),
		Color3.fromRGB(80, 30, 120),
		Color3.fromRGB(150, 80, 30),
		Color3.fromRGB(50, 50, 60),
		Color3.fromRGB(120, 100, 30),
		Color3.fromRGB(30, 100, 100),
	}

	for i, c in ipairs(btnColors) do
		makeColorSwatch(paramSection, c, 114, (i - 1) * 26, applyButtonColor)
	end
end

-- === UI: Couleur des Categories ===
do
	local lbl = Instance.new("TextLabel")
	lbl.Size = UDim2.new(1, 0, 0, 14)
	lbl.Position = UDim2.new(0, 0, 0, 142)
	lbl.BackgroundTransparency = 1
	lbl.Text = "Couleur des Categories"
	lbl.TextColor3 = Color3.fromRGB(255, 255, 255)
	lbl.Font = Enum.Font.SourceSansBold
	lbl.TextSize = 13
	lbl.TextXAlignment = Enum.TextXAlignment.Left
	lbl.Parent = paramSection

	local navColors = {
		Color3.fromRGB(60, 60, 65),
		Color3.fromRGB(30, 50, 80),
		Color3.fromRGB(50, 30, 80),
		Color3.fromRGB(30, 70, 50),
		Color3.fromRGB(80, 60, 30),
		Color3.fromRGB(70, 30, 60),
		Color3.fromRGB(40, 40, 80),
		Color3.fromRGB(80, 50, 50),
	}

	for i, c in ipairs(navColors) do
		makeColorSwatch(paramSection, c, 160, (i - 1) * 26, function(color)
			applyNavColor(color, false)
		end)
	end
end

-- === UI: Son des Boutons ===
do
	local lbl = Instance.new("TextLabel")
	lbl.Size = UDim2.new(1, 0, 0, 14)
	lbl.Position = UDim2.new(0, 0, 0, 188)
	lbl.BackgroundTransparency = 1
	lbl.Text = "Son des Boutons"
	lbl.TextColor3 = Color3.fromRGB(255, 255, 255)
	lbl.Font = Enum.Font.SourceSansBold
	lbl.TextSize = 13
	lbl.TextXAlignment = Enum.TextXAlignment.Left
	lbl.Parent = paramSection

	local soundOptions = {
		{name = "Original", id = "rbxassetid://88442833509532"},
		{name = "Click", id = "rbxassetid://9065073444"},
		{name = "Pop", id = "rbxassetid://72264591133889"},
		{name = "Modern", id = "rbxassetid://119393948345399"},
		{name = "Aucun", id = ""},
	}

	for i, opt in ipairs(soundOptions) do
		local soundBtn = btn(paramSection, opt.name, UDim2.new(0, (i - 1) * 48, 0, 204), UDim2.new(0, 44, 0, 20))
		soundBtn.TextSize = 12
		soundBtn.MouseButton1Click:Connect(function()
			applySound(opt.id)
			if opt.id and opt.id ~= "" then
				task.wait(0.1)
				clickSound:Play()
			end
		end)
	end
end

-- === UI: Reinitialiser ===
do
	local resetBtn = btn(paramSection, "Reinitialiser", UDim2.new(0, 0, 0, 230), UDim2.new(1, -2, 0, 22), Color3.fromRGB(50, 50, 60))
	resetBtn.Font = Enum.Font.SourceSansBold
	resetBtn.TextSize = 14
	resetBtn.MouseButton1Click:Connect(function()
		applyPanelColor(originalColors.panel)
		applyButtonColor(originalColors.btnDefault)
		_S.customBtnColor = nil
		_S.customNavColor = nil
		_S.customNavActiveColor = nil
		applyNavColor(originalColors.navColor, false)
		applyNavColor(originalColors.navActiveColor, true)
		applySound(originalSoundId)
	end)
end

local killPanelBtn = btn(paramSection, "Supprimer le panel", UDim2.new(0, 0, 0, 256), UDim2.new(1, -2, 0, 24), Color3.fromRGB(150, 30, 30))




killPanelBtn.Font = Enum.Font.SourceSansBold




killPanelBtn.TextSize = 15




-- Enregistrer les pages dans le système de navigation




registerPage("Joueurs", pSection)




registerPage("Deplacement", mSection)




registerPage("Actions", aSection)




registerPage("Position", posSection)




registerPage("Voice", vSection)




registerPage("Auto", auSection)




registerPage("Lock", lockSection)




registerPage("Infos", iSection)




registerPage("Parametres", paramSection)




-- Afficher la première page par défaut




switchPage("Joueurs")




local bagFrame, profileFrame




do




	-- === Page 2 (Omega) ===




	local page2 = Instance.new("Frame")




	page2.Size = UDim2.new(1, -10, 0, 200)




	page2.Position = UDim2.new(0, 5, 0, 5)




	page2.BackgroundColor3 = Color3.fromRGB(8, 8, 12)




	page2.BackgroundTransparency = 1




	page2.BorderSizePixel = 0




	page2.Visible = false




	page2.Parent = contentScroll




	Instance.new("UICorner", page2).CornerRadius = UDim.new(0, 10)




	-- Omega header




	local omegaHeader = Instance.new("TextLabel")




	omegaHeader.Size = UDim2.new(1, -20, 0, 18)




	omegaHeader.Position = UDim2.new(0, 10, 0, 10)




	omegaHeader.BackgroundTransparency = 1




	omegaHeader.Text = "Omega"




	omegaHeader.TextColor3 = Color3.fromRGB(255, 255, 255)




	omegaHeader.Font = Enum.Font.SourceSansBold




	omegaHeader.TextSize = 14




	omegaHeader.TextXAlignment = Enum.TextXAlignment.Left




	omegaHeader.Parent = page2




	do




		local oDesc = Instance.new("TextLabel")




		oDesc.Size = UDim2.new(1, -20, 0, 28)




		oDesc.Position = UDim2.new(0, 10, 0, 28)




		oDesc.BackgroundTransparency = 1




		oDesc.Text = "Executer Omega: lance le script Omega. Cacher Omega: masque l'interface Omega. Afficher Omega: réaffiche l'interface Omega. Kill Omega: arrête complètement Omega et libère les ressources."




		oDesc.TextColor3 = Color3.fromRGB(255, 255, 255)




		oDesc.Font = Enum.Font.SourceSans




		oDesc.TextSize = 12




		oDesc.TextWrapped = true




		oDesc.TextTruncate = Enum.TextTruncate.AtEnd




		oDesc.TextXAlignment = Enum.TextXAlignment.Left




		oDesc.TextYAlignment = Enum.TextYAlignment.Top




		oDesc.Parent = page2




	end




	local executeOmegaBtn = btn(page2, "Executer Omega", UDim2.new(0, 10, 0, 60), UDim2.new(1, -20, 0, 25), Color3.fromRGB(100, 30, 120))




	local hideOmegaBtn = btn(page2, "Cacher Omega", UDim2.new(0, 10, 0, 96), UDim2.new(1, -20, 0, 25), Color3.fromRGB(180, 100, 30))




	local setHideOmegaToggle = makeToggle(hideOmegaBtn, "Cacher Omega")




	local showOmegaBtn = btn(page2, "Afficher Omega", UDim2.new(0, 10, 0, 132), UDim2.new(1, -20, 0, 25), Color3.fromRGB(30, 130, 50))




	local setShowOmegaToggle = makeToggle(showOmegaBtn, "Afficher Omega")




	local killOmegaBtn = btn(page2, "Kill Omega", UDim2.new(0, 10, 0, 168), UDim2.new(1, -20, 0, 25), Color3.fromRGB(180, 40, 40))




	-- Initially disable Hide/Show buttons until Omega is executed




	hideOmegaBtn.Active = false




	hideOmegaBtn.AutoButtonColor = false




	hideOmegaBtn.TextColor3 = Color3.fromRGB(255, 255, 255)




	showOmegaBtn.Active = false




	showOmegaBtn.AutoButtonColor = false




	showOmegaBtn.TextColor3 = Color3.fromRGB(255, 255, 255)




	killOmegaBtn.Active = false




	killOmegaBtn.AutoButtonColor = false




	killOmegaBtn.TextColor3 = Color3.fromRGB(255, 255, 255)




	registerPage("Omega", page2)




	-- Sac (backpack viewer - items cliquables)




	bagFrame = Instance.new("ScrollingFrame")




	bagFrame.Size = UDim2.new(1, 0, 0, 200)




	bagFrame.Position = UDim2.new(0, 0, 0, 140)




	bagFrame.BackgroundColor3 = Color3.fromRGB(20, 20, 30)




	bagFrame.BackgroundTransparency = 0




	bagFrame.BorderSizePixel = 0




	bagFrame.ScrollBarThickness = 4




	bagFrame.AutomaticCanvasSize = Enum.AutomaticSize.Y




	bagFrame.CanvasSize = UDim2.new(0, 0, 0, 0)




	bagFrame.Visible = false




	bagFrame.Parent = iSection




	Instance.new("UICorner", bagFrame).CornerRadius = UDim.new(0, 4)




	Instance.new("UIListLayout", bagFrame).Padding = UDim.new(0, 1)




	-- Profil frame




	profileFrame = Instance.new("ScrollingFrame")




	profileFrame.Size = UDim2.new(1, 0, 0, 200)




	profileFrame.Position = UDim2.new(0, 0, 0, 140)




	profileFrame.BackgroundColor3 = Color3.fromRGB(20, 20, 30)




	profileFrame.BackgroundTransparency = 0




	profileFrame.BorderSizePixel = 0




	profileFrame.ScrollBarThickness = 4




	profileFrame.AutomaticCanvasSize = Enum.AutomaticSize.Y




	profileFrame.CanvasSize = UDim2.new(0, 0, 0, 0)




	profileFrame.Visible = false




	profileFrame.Parent = iSection




	Instance.new("UICorner", profileFrame).CornerRadius = UDim.new(0, 4)




	Instance.new("UIListLayout", profileFrame).Padding = UDim.new(0, 2)




	-- EXECUTE SCRIPT




	local function createFakeRunService()




		return setmetatable({}, {




			__index = function(t, k)




				if _S.omegaKilled then




					if k == "BindToRenderStep" or k == "UnbindFromRenderStep" then




						return function() end




					end




					if k == "RenderStepped" or k == "Heartbeat" or k == "Stepped" then




						return setmetatable({}, {




							__index = function(_, key)




								if key == "Connect" or key == "ConnectParallel" then




									return function() return {Disconnect = function() end} end




								end




								if key == "Wait" then




									return function() error("Omega killed") end




								end




								return function() end




							end




						})




					end




					return function() end




				end




				local val = RunService[k]




				if k == "BindToRenderStep" then




					return function(_, name, priority, func)




						table.insert(_S.omegaRenderStepNames, name)




						return RunService:BindToRenderStep(name, priority, func)




					end




				end




				if k == "UnbindFromRenderStep" then




					return function(_, name)




						for i, n in ipairs(_S.omegaRenderStepNames) do




							if n == name then table.remove(_S.omegaRenderStepNames, i) break end




						end




						return RunService:UnbindFromRenderStep(name)




					end




				end




				if k == "RenderStepped" or k == "Heartbeat" or k == "Stepped" then




					local signal = val




					return setmetatable({}, {




						__index = function(_, key)




							if key == "Connect" then




								return function(_, func)




									local conn = signal:Connect(func)




									table.insert(_S.omegaConnections, conn)




									return conn




								end




							end




							if key == "ConnectParallel" then




								return function(_, func)




									local conn = signal:ConnectParallel(func)




									table.insert(_S.omegaConnections, conn)




									return conn




								end




							end




							if key == "Wait" then




								return function(_, ...) return signal:Wait(...) end




							end




							return signal[key]




						end,




						__tostring = function() return tostring(signal) end




					})




				end




				if type(val) == "function" then




					return function(_, ...) return val(RunService, ...) end




				end




				return val




			end




		})




	end




	local function createFakeGame()




		local fakeGame = setmetatable({}, {




			__index = function(t, k)




				local val = game[k]




				if k == "GetService" then




					return function(_, serviceName)




						local service = game:GetService(serviceName)




						if serviceName == "RunService" then




							return createFakeRunService()




						end




						if serviceName == "UserInputService" then




							return setmetatable({}, {




								__index = function(_, key)




									if _S.omegaKilled then




										if key == "InputBegan" or key == "InputEnded" or key == "InputChanged" then




											return setmetatable({}, {




												__index = function(_, skey)




													if skey == "Connect" or skey == "ConnectParallel" then




														return function() return {Disconnect = function() end} end




													end




													return function() end




												end




											})




										end




									end




									local sval = service[key]




									if key == "InputBegan" or key == "InputEnded" or key == "InputChanged" then




										return setmetatable({}, {




											__index = function(_, skey)




												if skey == "Connect" then




													return function(_, func)




														local conn = sval:Connect(func)




														table.insert(_S.omegaConnections, conn)




														return conn




													end




												end




												if skey == "ConnectParallel" then




													return function(_, func)




														local conn = sval:ConnectParallel(func)




														table.insert(_S.omegaConnections, conn)




														return conn




													end




												end




												if skey == "Wait" then




													return function(_, ...) return sval:Wait(...) end




												end




												return sval[skey]




											end,




											__tostring = function() return tostring(sval) end




										})




									end




									if type(sval) == "function" then




										return function(_, ...) return sval(service, ...) end




									end




									return sval




								end,




								__newindex = function(_, key, value)




									service[key] = value




								end,




								__tostring = function() return tostring(service) end




							})




						end




						return service




					end




				end




				if type(val) == "function" then




					return function(_, ...) return val(game, ...) end




				end




				return val




			end,




			__tostring = function() return tostring(game) end




		})




		return fakeGame




	end




	executeOmegaBtn.MouseButton1Click:Connect(function()




		if _S.omegaHasExecuted then return end




		_S.omegaHasExecuted = true




		executeOmegaBtn.Active = false




		executeOmegaBtn.Text = "Execution..."




		executeOmegaBtn.BackgroundColor3 = Color3.fromRGB(40, 150, 50)




		-- Arrêter tout nettoyage précédent (pour permettre l'exécution à l'infini)




		_S.omegaCleanupGeneration = _S.omegaCleanupGeneration + 1




		if _S.omegaForceResetConn then




			pcall(function() _S.omegaForceResetConn:Disconnect() end)




			_S.omegaForceResetConn = nil




		end




		-- Déconnecter les anciennes connexions et débind les anciens RenderStep




		for _, conn in ipairs(_S.omegaConnections) do




			pcall(function() conn:Disconnect() end)




		end




		for _, name in ipairs(_S.omegaRenderStepNames) do




			pcall(function() RunService:UnbindFromRenderStep(name) end)




		end




		-- Annuler les anciens threads




		for _, thread in ipairs(_S.omegaThreads) do




			pcall(function() task.cancel(thread) end)




		end




		-- Détruire les anciennes instances




		for _, inst in ipairs(_S.omegaCreatedInstances) do




			pcall(function()




				if inst and inst.Parent then inst:Destroy() end




			end)




		end




		local playerGui = player:FindFirstChildOfClass("PlayerGui")




		if playerGui then




			_S.omegaGuiSnapshot = {}




			for _, child in playerGui:GetChildren() do




				_S.omegaGuiSnapshot[child] = true




			end




		end




		-- Snapshot CoreGui aussi (le script Omega peut créer des GUIs là)




		_S.omegaCoreGuiSnapshot = {}




		pcall(function()




			local coreGui = game:GetService("CoreGui")




			if coreGui then




				for _, child in coreGui:GetChildren() do




					_S.omegaCoreGuiSnapshot[child] = true




				end




			end




		end)




		_S.omegaRenderStepNames = {}




		_S.omegaConnections = {}




		_S.omegaCreatedInstances = {}




		_S.omegaKilled = false




		_S.omegaThreads = {}




		_S.omegaHiddenStates = {}




		local fakeRS = createFakeRunService()




		local fakeG = createFakeGame()




		local fakeInstance = setmetatable({}, {




			__index = function(_, key)




				if key == "new" then




					return function(className, parent)




						if _S.omegaKilled then return nil end




						local inst = Instance.new(className, parent)




						table.insert(_S.omegaCreatedInstances, inst)




						return inst




					end




				end




				return Instance[key]




			end,




			__tostring = function() return tostring(Instance) end




		})




		local fakeTask = setmetatable({}, {




			__index = function(_, k)




				local val = task[k]




				if _S.omegaKilled then




					if k == "spawn" or k == "delay" or k == "defer" then




						return function() end




					end




					if k == "wait" then




						return function() error("Omega killed") end




					end




				end




				if k == "spawn" then




					return function(f, ...)




						local thread = task.spawn(f, ...)




						table.insert(_S.omegaThreads, thread)




						return thread




					end




				end




				if k == "delay" then




					return function(d, f, ...)




						local thread = task.delay(d, f, ...)




						table.insert(_S.omegaThreads, thread)




						return thread




					end




				end




				if k == "defer" then




					return function(f, ...)




						local thread = task.defer(f, ...)




						table.insert(_S.omegaThreads, thread)




						return thread




					end




				end




				if type(val) == "function" then




					return function(_, ...) return val(...) end




				end




				return val




			end




		})




		local fakeCoroutine = setmetatable({}, {




			__index = function(_, k)




				if _S.omegaKilled then




					if k == "create" then




						return function() return coroutine.create(function() end) end




					end




					if k == "wrap" then




						return function() return function() end end




					end




					if k == "resume" then




						return function() return false, "killed" end




					end




				end




				local val = coroutine[k]




				if k == "create" then




					return function(f)




						local co = coroutine.create(f)




						table.insert(_S.omegaThreads, co)




						return co




					end




				end




				if k == "wrap" then




					return function(f)




						local co = coroutine.create(f)




						table.insert(_S.omegaThreads, co)




						return function(...)




							return coroutine.resume(co, ...)




						end




					end




				end




				if type(val) == "function" then




					return function(_, ...) return val(...) end




				end




				return val




			end




		})




		local omegaEnv = setmetatable({}, {




			__index = function(t, k)




				if k == "RunService" then return fakeRS end




				if k == "game" then return fakeG end




				if k == "Instance" then return fakeInstance end




				if k == "task" then return fakeTask end




				if k == "coroutine" then return fakeCoroutine end




				if k == "wait" then




					if _S.omegaKilled then return function() error("Omega killed") end end




					return task.wait




				end




				if k == "spawn" then




					if _S.omegaKilled then return function() end end




					return function(f, ...)




						local thread = task.spawn(f, ...)




						table.insert(_S.omegaThreads, thread)




						return thread




					end




				end




				if k == "delay" then




					if _S.omegaKilled then return function() end end




					return function(d, f, ...)




						local thread = task.delay(d, f, ...)




						table.insert(_S.omegaThreads, thread)




						return thread




					end




				end




				return getfenv()[k]




			end




		})




		local success, result = pcall(function()




			local func = loadstring(game:HttpGet("https://rawscripts.net/raw/School-RP-V3-FR-School-rp-fr-omega-219467"))




			if func then




				setfenv(func, omegaEnv)




				return func()




			end




		end)




		if success then




			executeOmegaBtn.Text = "Omega executé"




			executeOmegaBtn.BackgroundColor3 = Color3.fromRGB(40, 150, 50)




			-- Enable Hide button (Omega is visible by default, so Show stays disabled)




			hideOmegaBtn.Active = true




			hideOmegaBtn.AutoButtonColor = true




			hideOmegaBtn.TextColor3 = Color3.fromRGB(255, 255, 255)




			showOmegaBtn.Active = false




			showOmegaBtn.AutoButtonColor = false




			showOmegaBtn.TextColor3 = Color3.fromRGB(255, 255, 255)




			killOmegaBtn.Active = true




			killOmegaBtn.AutoButtonColor = true




			killOmegaBtn.TextColor3 = Color3.fromRGB(255, 255, 255)




		else




			executeOmegaBtn.Text = "Erreur Omega"




			executeOmegaBtn.BackgroundColor3 = _S.customBtnColor or Color3.fromRGB(120, 30, 30)




			executeOmegaBtn.Active = true




			_S.omegaHasExecuted = false




			killOmegaBtn.Active = false




			killOmegaBtn.AutoButtonColor = false




			killOmegaBtn.TextColor3 = Color3.fromRGB(255, 255, 255)




		end




	end)




	-- CACHER OMEGA




	hideOmegaBtn.MouseButton1Click:Connect(function()




		if not _S.omegaHasExecuted or _S.omegaKilled then return end




		_S.omegaHiddenStates = {}




		-- Cacher les instances tracées en sauvegardant leur état original




		for _, inst in ipairs(_S.omegaCreatedInstances) do




			pcall(function()




				if inst and inst.Parent then




					if inst:IsA("ScreenGui") then




						_S.omegaHiddenStates[inst] = {enabled = inst.Enabled}




						inst.Enabled = false




					elseif inst:IsA("BasePart") then




						_S.omegaHiddenStates[inst] = {transparency = inst.Transparency, canCollide = inst.CanCollide}




						inst.Transparency = 1




						inst.CanCollide = false




					elseif inst:IsA("Decal") or inst:IsA("Texture") then




						_S.omegaHiddenStates[inst] = {transparency = inst.Transparency}




						inst.Transparency = 1




					elseif inst:IsA("Sound") then




						_S.omegaHiddenStates[inst] = {volume = inst.Volume}




						inst.Volume = 0




					elseif inst:IsA("BillboardGui") or inst:IsA("SurfaceGui") then




						_S.omegaHiddenStates[inst] = {enabled = inst.Enabled}




						inst.Enabled = false




					elseif inst:IsA("ParticleEmitter") or inst:IsA("Trail") or inst:IsA("Beam") or inst:IsA("Fire") or inst:IsA("Smoke") or inst:IsA("Sparkles") then




						_S.omegaHiddenStates[inst] = {enabled = inst.Enabled}




						inst.Enabled = false




					end




				end




			end)




		end




		-- Cacher aussi les GUIs dans PlayerGui qui n'etaient pas la avant Omega




		local playerGui = player:FindFirstChildOfClass("PlayerGui")




		if playerGui then




			for _, child in playerGui:GetChildren() do




				if not _S.omegaGuiSnapshot[child] and child.Name ~= "AdminPanel" then




					pcall(function()




						if child:IsA("ScreenGui") then




							_S.omegaHiddenStates[child] = {enabled = child.Enabled}




							child.Enabled = false




						elseif child:IsA("Folder") then




							for _, desc in child:GetDescendants() do




								if desc:IsA("ScreenGui") then




									_S.omegaHiddenStates[desc] = {enabled = desc.Enabled}




									desc.Enabled = false




								elseif desc:IsA("GuiObject") then




									_S.omegaHiddenStates[desc] = {visible = desc.Visible}




									desc.Visible = false




								end




							end




						end




					end)




				end




			end




		end




		-- Cacher aussi les GUIs dans CoreGui qui n'etaient pas la avant Omega




		local coreGui = game:GetService("CoreGui")




		for _, child in coreGui:GetChildren() do




			if not _S.omegaCoreGuiSnapshot[child] then




				pcall(function()




					if child:IsA("ScreenGui") then




						_S.omegaHiddenStates[child] = {enabled = child.Enabled}




						child.Enabled = false




					end




				end)




			end




		end












		setHideOmegaToggle(true)




		setShowOmegaToggle(false)




		-- Disable Hide (already hidden), enable Show




		hideOmegaBtn.Active = false




		hideOmegaBtn.AutoButtonColor = false




		hideOmegaBtn.TextColor3 = Color3.fromRGB(255, 255, 255)




		showOmegaBtn.Active = true




		showOmegaBtn.AutoButtonColor = true




		showOmegaBtn.TextColor3 = Color3.fromRGB(255, 255, 255)




	end)




	-- AFFICHER OMEGA




	showOmegaBtn.MouseButton1Click:Connect(function()




		if not _S.omegaHasExecuted or _S.omegaKilled then return end




		-- Afficher les instances tracées en restaurant leur état original




		for _, inst in ipairs(_S.omegaCreatedInstances) do




			pcall(function()




				if inst and inst.Parent then




					local saved = _S.omegaHiddenStates[inst]




					if inst:IsA("ScreenGui") then




						inst.Enabled = (saved and saved.enabled ~= nil) and saved.enabled or true




					elseif inst:IsA("BasePart") then




						inst.Transparency = (saved and saved.transparency ~= nil) and saved.transparency or 0




						inst.CanCollide = (saved and saved.canCollide ~= nil) and saved.canCollide or true




					elseif inst:IsA("Decal") or inst:IsA("Texture") then




						inst.Transparency = (saved and saved.transparency ~= nil) and saved.transparency or 0




					elseif inst:IsA("Sound") then




						inst.Volume = (saved and saved.volume ~= nil) and saved.volume or 1




					elseif inst:IsA("BillboardGui") or inst:IsA("SurfaceGui") then




						inst.Enabled = (saved and saved.enabled ~= nil) and saved.enabled or true




					elseif inst:IsA("ParticleEmitter") or inst:IsA("Trail") or inst:IsA("Beam") or inst:IsA("Fire") or inst:IsA("Smoke") or inst:IsA("Sparkles") then




						inst.Enabled = (saved and saved.enabled ~= nil) and saved.enabled or true




					end




				end




			end)




		end




		-- Afficher aussi les GUIs dans PlayerGui qui n'etaient pas la avant Omega




		local playerGui = player:FindFirstChildOfClass("PlayerGui")




		if playerGui then




			for _, child in playerGui:GetChildren() do




				if not _S.omegaGuiSnapshot[child] and child.Name ~= "AdminPanel" then




					pcall(function()




						if child:IsA("ScreenGui") then




							local saved = _S.omegaHiddenStates[child]




							child.Enabled = (saved and saved.enabled ~= nil) and saved.enabled or true




						elseif child:IsA("Folder") then




							for _, desc in child:GetDescendants() do




								local saved = _S.omegaHiddenStates[desc]




								if desc:IsA("ScreenGui") then




									desc.Enabled = (saved and saved.enabled ~= nil) and saved.enabled or true




								elseif desc:IsA("GuiObject") then




									desc.Visible = (saved and saved.visible ~= nil) and saved.visible or true




								end




							end




						end




					end)




				end




			end




		end




		-- Afficher aussi les GUIs dans CoreGui qui n'etaient pas la avant Omega




		local coreGui = game:GetService("CoreGui")




		for _, child in coreGui:GetChildren() do




			if not _S.omegaCoreGuiSnapshot[child] then




				pcall(function()




					if child:IsA("ScreenGui") then




						local saved = _S.omegaHiddenStates[child]




						child.Enabled = (saved and saved.enabled ~= nil) and saved.enabled or true




					end




				end)




			end




		end




		_S.omegaHiddenStates = {}












		setShowOmegaToggle(true)




		setHideOmegaToggle(false)




		-- Disable Show (already shown), enable Hide




		showOmegaBtn.Active = false




		showOmegaBtn.AutoButtonColor = false




		showOmegaBtn.TextColor3 = Color3.fromRGB(255, 255, 255)




		hideOmegaBtn.Active = true




		hideOmegaBtn.AutoButtonColor = true




		hideOmegaBtn.TextColor3 = Color3.fromRGB(255, 255, 255)




	end)




	-- KILL OMEGA (ne peut etre relancé qu'en quittant et revenant)




	killOmegaBtn.MouseButton1Click:Connect(function()




		if not _S.omegaHasExecuted or _S.omegaKilled then return end




		_S.omegaKilled = true




		-- Déconnecter toutes les connexions




		for _, conn in ipairs(_S.omegaConnections) do




			pcall(function() conn:Disconnect() end)




		end



		_S.omegaConnections = {}




		-- Débind tous les RenderStep




		for _, name in ipairs(_S.omegaRenderStepNames) do




			pcall(function() RunService:UnbindFromRenderStep(name) end)




		end




		_S.omegaRenderStepNames = {}




		-- Annuler tous les threads




		for _, thread in ipairs(_S.omegaThreads) do




			pcall(function() task.cancel(thread) end)




		end




		_S.omegaThreads = {}




		-- Détruire toutes les instances créées par Omega




		for _, inst in ipairs(_S.omegaCreatedInstances) do




			pcall(function()




				if inst and inst.Parent then inst:Destroy() end




			end)




		end




		_S.omegaCreatedInstances = {}




		-- Réinitialiser les snapshots et états




		_S.omegaGuiSnapshot = {}




		_S.omegaCoreGuiSnapshot = {}




		_S.omegaHiddenStates = {}




		-- Le bouton Execute reste désactivé — Omega ne peut etre relancé qu'en quittant et revenant




		executeOmegaBtn.Active = false




		executeOmegaBtn.AutoButtonColor = false




		executeOmegaBtn.Text = "Omega Killed (quittez & revenez)"




		executeOmegaBtn.BackgroundColor3 = Color3.fromRGB(40, 150, 50)




		executeOmegaBtn.TextColor3 = Color3.fromRGB(255, 255, 255)




		-- Désactiver tous les boutons de la Page 2 sauf le bouton Retour




		hideOmegaBtn.Active = false




		hideOmegaBtn.AutoButtonColor = false




		hideOmegaBtn.TextColor3 = Color3.fromRGB(255, 255, 255)








		showOmegaBtn.Active = false




		showOmegaBtn.AutoButtonColor = false




		showOmegaBtn.TextColor3 = Color3.fromRGB(255, 255, 255)








		setHideOmegaToggle(false)




		setShowOmegaToggle(false)




		killOmegaBtn.Active = false




		killOmegaBtn.AutoButtonColor = false




		killOmegaBtn.TextColor3 = Color3.fromRGB(255, 255, 255)




		-- Feedback visuel sur le bouton Kill




		killOmegaBtn.BackgroundColor3 = _S.customBtnColor or Color3.fromRGB(120, 30, 30)




		killOmegaBtn.Text = "Omega Killed!"




		task.wait(1)




		killOmegaBtn.Text = "Omega Killed (quittez & revenez)"




		killOmegaBtn.BackgroundColor3 = Color3.fromRGB(40, 150, 50)




	end)




end




-- === FONCTIONS ===




-- SPECTATE




function startSpectate(targetPlayer)




	if not targetPlayer or not targetPlayer.Parent then




		return false




	end




	if _S.spectatingPlayer == targetPlayer then




		return false




	end




	stopSpectate()




	_S.spectatingPlayer = targetPlayer




	local function onCharAdded(char)




		local hum = char:FindFirstChildOfClass("Humanoid")




		if hum then




			-- CameraType not forced to avoid sync errors with custom camera games




			camera.CameraSubject = hum




		end




	end




	if targetPlayer.Character then




		onCharAdded(targetPlayer.Character)




	end




	spectateCharConn = targetPlayer.CharacterAdded:Connect(onCharAdded)




	return true




end




function stopSpectate()




	_S.spectatingPlayer = nil




	if spectateCharConn then




		spectateCharConn:Disconnect()




		spectateCharConn = nil




	end









	local char = player.Character




	if char then




		local hum = char:FindFirstChildOfClass("Humanoid")




		if hum then




			-- CameraType not forced to avoid sync errors with custom camera games




			camera.CameraSubject = hum




		end




	end




end
-- Non-aggressive spectate camera guard: only re-applies CameraSubject when changed by other scripts




local spectateCameraGuardConn




local function refreshSpectateCameraGuard()




	if spectateCameraGuardConn then




		spectateCameraGuardConn:Disconnect()




		spectateCameraGuardConn = nil




	end




	spectateCameraGuardConn = camera:GetPropertyChangedSignal("CameraSubject"):Connect(function()




		if _S.spectatingPlayer and _S.spectatingPlayer.Parent and _S.spectatingPlayer.Character then




			local hum = _S.spectatingPlayer.Character:FindFirstChildOfClass("Humanoid")




			if hum and camera.CameraSubject ~= hum then




				camera.CameraSubject = hum




			end




		end




	end)




end




refreshSpectateCameraGuard()




-- ESP




local function getESPColor(p)




	local team = p.Team




	if team and team.TeamColor then




		return team.TeamColor.Color




	end




	return Color3.fromRGB(255, 255, 0)




end




local function applyESP(p)




	if not p or not p.Character then return end




	local char = p.Character




	local espColor = getESPColor(p)




	local hl = Instance.new("Highlight")




	hl.Name = "ESP_HL"




	hl.FillColor = espColor




	hl.FillTransparency = 0.5




	hl.OutlineColor = Color3.fromRGB(255, 255, 255)




	hl.OutlineTransparency = 0




	hl.Parent = char




	local bb = Instance.new("BillboardGui")




	bb.Name = "ESP_BB"




	bb.Size = UDim2.new(0, 200, 0, 60)




	bb.StudsOffset = Vector3.new(0, 4, 0)




	bb.AlwaysOnTop = true




	bb.Parent = char




	local lbl = Instance.new("TextLabel")




	lbl.Size = UDim2.new(1, 0, 0, 20)




	lbl.BackgroundTransparency = 1




	lbl.Text = p.Name




	lbl.TextColor3 = espColor




	lbl.Font = Enum.Font.SourceSansBold




	lbl.TextSize = 16




	lbl.Parent = bb




	local roleLbl = Instance.new("TextLabel")




	roleLbl.Name = "RoleLabel"




	roleLbl.Size = UDim2.new(1, 0, 0, 20)




	roleLbl.Position = UDim2.new(0, 0, 0, 20)




	roleLbl.BackgroundTransparency = 1




	local team = p.Team




	if team then




		roleLbl.Text = team.Name




		local tc = team.TeamColor




		if tc then roleLbl.TextColor3 = tc.Color else roleLbl.TextColor3 = espColor end




	else




		roleLbl.Text = "Aucune équipe"




		roleLbl.TextColor3 = Color3.fromRGB(255, 255, 0)




	end




	roleLbl.Font = Enum.Font.SourceSans




	roleLbl.TextSize = 13




	roleLbl.Parent = bb




	local hpLbl = Instance.new("TextLabel")




	hpLbl.Name = "HPLabel"




	hpLbl.Size = UDim2.new(1, 0, 0, 20)




	hpLbl.Position = UDim2.new(0, 0, 0, 40)




	hpLbl.BackgroundTransparency = 1




	hpLbl.Text = ""




	hpLbl.TextColor3 = Color3.fromRGB(255, 255, 255)




	hpLbl.Font = Enum.Font.SourceSansBold




	hpLbl.TextSize = 14




	hpLbl.Visible = false




	hpLbl.Parent = bb




	_S.espObjects[p] = {hl = hl, bb = bb}




end




local function removeESP(p)




	if _S.espObjects[p] then




		if _S.espObjects[p].hl then _S.espObjects[p].hl:Destroy() end




		if _S.espObjects[p].bb then _S.espObjects[p].bb:Destroy() end




		_S.espObjects[p] = nil




	end




end




local function refreshESP()




	for _, p in Players:GetPlayers() do




		if p ~= player then




			if _S.espEnabled then




				-- Only apply if not already applied or if character changed




				if not _S.espObjects[p] or not _S.espObjects[p].hl or not _S.espObjects[p].hl.Parent then




					removeESP(p)




					applyESP(p)




				else




					-- Mettre à jour la couleur si l'équipe a changé




					local espColor = getESPColor(p)




					if _S.espObjects[p].hl then




						_S.espObjects[p].hl.FillColor = espColor




					end




					if _S.espObjects[p].bb then




						local lbl = _S.espObjects[p].bb:FindFirstChildOfClass("TextLabel")




						if lbl then




							lbl.TextColor3 = espColor




						end




						local roleLbl = _S.espObjects[p].bb:FindFirstChild("RoleLabel")




						if roleLbl then




							local team = p.Team




							if team then




								roleLbl.Text = team.Name




								local tc = team.TeamColor




								if tc then roleLbl.TextColor3 = tc.Color else roleLbl.TextColor3 = espColor end




							else




								roleLbl.Text = "Aucune équipe"




								roleLbl.TextColor3 = Color3.fromRGB(255, 255, 0)




							end




						end




					end




				end




			else




				removeESP(p)




			end




		end




	end




end




-- VITESSE




applySpeed = function()




	local char = player.Character




	if char then




		local hum = char:FindFirstChildOfClass("Humanoid")




		if hum then hum.WalkSpeed = _S.speedEnabled and _S.speedValue or 16 end




	end




end




-- FLY




local function setupFly()


	local char = player.Character


	if not char then return end


	local hrp = char:FindFirstChild("HumanoidRootPart")


	local hum = char:FindFirstChildOfClass("Humanoid")


	if not hrp or not hum then return end


	if _S.flyVelocity then _S.flyVelocity:Destroy() end


	if _S.flyGyro then _S.flyGyro:Destroy() end


	_S.flyVelocity = Instance.new("BodyVelocity")


	_S.flyVelocity.MaxForce = Vector3.new(400000, 400000, 400000)


	_S.flyVelocity.Velocity = Vector3.new(0, 0, 0)


	_S.flyVelocity.Parent = hrp


	_S.flyGyro = Instance.new("BodyGyro")


	_S.flyGyro.MaxTorque = Vector3.new(math.huge, math.huge, math.huge)


	_S.flyGyro.P = 50000


	_S.flyGyro.D = 400


	_S.flyGyro.CFrame = hrp.CFrame


	_S.flyGyro.Parent = hrp


	hum.PlatformStand = true



















end




local function disableFly()


	if _S.flyVelocity then _S.flyVelocity:Destroy() _S.flyVelocity = nil end


	if _S.flyGyro then _S.flyGyro:Destroy() _S.flyGyro = nil end


	local char = player.Character


	if char then


		local hum = char:FindFirstChildOfClass("Humanoid")


		if hum then hum.PlatformStand = false end


	end















end




-- === SWIM (Nager dans l'air) ===
local function setupSwim()
	local char = player.Character
	if not char then return end
	local hrp = char:FindFirstChild("HumanoidRootPart")
	local hum = char:FindFirstChildOfClass("Humanoid")
	if not hrp or not hum then return end
	if _S.swimVelocity then _S.swimVelocity:Destroy() end
	if _S.swimGyro then _S.swimGyro:Destroy() end
	_S.swimVelocity = Instance.new("BodyVelocity")
	_S.swimVelocity.MaxForce = Vector3.new(400000, 400000, 400000)
	_S.swimVelocity.Velocity = Vector3.new(0, 0, 0)
	_S.swimVelocity.Parent = hrp
	_S.swimGyro = Instance.new("BodyGyro")
	_S.swimGyro.MaxTorque = Vector3.new(math.huge, math.huge, math.huge)
	_S.swimGyro.P = 50000
	_S.swimGyro.D = 400
	_S.swimGyro.CFrame = hrp.CFrame
	_S.swimGyro.Parent = hrp
	hum:SetStateEnabled(Enum.HumanoidStateType.Freefall, false)
	hum:ChangeState(Enum.HumanoidStateType.Swimming)
end

local function disableSwim()
	if _S.swimVelocity then _S.swimVelocity:Destroy() _S.swimVelocity = nil end
	if _S.swimGyro then _S.swimGyro:Destroy() _S.swimGyro = nil end
	local char = player.Character
	if char then
		local hum = char:FindFirstChildOfClass("Humanoid")
		if hum then
			hum:SetStateEnabled(Enum.HumanoidStateType.Freefall, true)
		end
	end
end

-- === LISTE DES JOUEURS ===




local entries = {}




local searchText = ""




-- Refresh sans flicker: met à jour en place, crée/supprime seulement si nécessaire




local function refreshList()




	local seen = {}




	for _, p in Players:GetPlayers() do




		seen[p] = true




		local teamName = p.Team and p.Team.Name or "Aucune"




		local text = string.format("%s (%s) | ID: %d | %s", p.Name, p.DisplayName, p.UserId, teamName)




		if entries[p] then




			-- Entrée existe: juste mettre à jour le texte et la couleur




			local e = entries[p]




			local lbl = e:FindFirstChildOfClass("TextLabel")




			if lbl and lbl.Text ~= text then lbl.Text = text end




			local newColor = (p == _S.selectedPlayer) and Color3.fromRGB(55, 75, 115) or Color3.fromRGB(30, 30, 45)




			if e.BackgroundColor3 ~= newColor then e.BackgroundColor3 = newColor end




		else




			-- Nouvelle entrée




			local e = Instance.new("TextButton")




			e.Name = p.Name




			e.Size = UDim2.new(1, -6, 0, 26)




			e.BackgroundColor3 = (p == _S.selectedPlayer) and Color3.fromRGB(55, 75, 115) or Color3.fromRGB(30, 30, 45)




			e.BackgroundTransparency = 0.12




			e.Text = ""




			e.BorderSizePixel = 0




			e.Parent = pScroll




			Instance.new("UICorner", e).CornerRadius = UDim.new(0, 4)




			-- Avatar du joueur




			local avBg = Instance.new("Frame")




			avBg.Size = UDim2.new(0, 22, 0, 22)




			avBg.Position = UDim2.new(0, 4, 0.5, -11)




			avBg.BackgroundColor3 = Color3.fromRGB(40, 40, 55)




			avBg.BorderSizePixel = 0




			avBg.Parent = e




			Instance.new("UICorner", avBg).CornerRadius = UDim.new(1, 0)




			local avImg = Instance.new("ImageLabel")




			avImg.Size = UDim2.new(1, -2, 1, -2)




			avImg.Position = UDim2.new(0, 1, 0, 1)




			avImg.BackgroundColor3 = Color3.fromRGB(30, 30, 40)




			avImg.BorderSizePixel = 0




			avImg.Image = ""




			avImg.Parent = avBg




			Instance.new("UICorner", avImg).CornerRadius = UDim.new(1, 0)




			local lbl = Instance.new("TextLabel")




			lbl.Size = UDim2.new(1, -36, 1, 0)




			lbl.Position = UDim2.new(0, 32, 0, 0)




			lbl.BackgroundTransparency = 1




			lbl.Text = text




			lbl.TextColor3 = Color3.fromRGB(255, 255, 255)




			lbl.Font = Enum.Font.SourceSans




			lbl.TextSize = 14




			lbl.TextXAlignment = Enum.TextXAlignment.Left




			lbl.TextTruncate = Enum.TextTruncate.AtEnd




			lbl.Parent = e




			-- Charger l'avatar du joueur




			task.spawn(function()




				local success, result = pcall(function()




					return Players:GetUserThumbnailAsync(p.UserId, Enum.ThumbnailType.HeadShot, Enum.ThumbnailSize.Size420x420)




				end)




				if success and result and avImg and avImg.Parent then




					avImg.Image = result




				end




			end)




			e.MouseButton1Click:Connect(function()




				clickSound:Play()




				_S.selectedPlayer = p




				refreshList()




				if updateVolLabel then updateVolLabel() end




			end)




			entries[p] = e




		end




	end




	-- Supprimer seulement les entrées des joueurs partis




	for p, e in pairs(entries) do




		if not seen[p] then




			if e and e.Parent then e:Destroy() end




			entries[p] = nil




		end




	end




	-- Filtrer par recherche




	local search = string.lower(searchText)




	for p, e in pairs(entries) do




		local match = search == "" or




			string.find(string.lower(p.Name), search, 1, true) or




			string.find(string.lower(p.DisplayName), search, 1, true)




		e.Visible = match and true or false




	end




end




refreshList()




searchBox:GetPropertyChangedSignal("Text"):Connect(function()




	searchText = searchBox.Text




	refreshList()




end)




Players.PlayerAdded:Connect(refreshList)




Players.PlayerRemoving:Connect(function(p)




	if p == _S.selectedPlayer then _S.selectedPlayer = nil end




	if p == _S.spectatingPlayer then stopSpectate() end




	refreshList()




end)




-- Refresh continu invisible (met à jour les équipes etc. sans recréer)




task.spawn(function()




	while task.wait(2) do




		refreshList()




	end




end)




-- === CONNEXIONS BOUTONS ===




-- ESP




local function setupESPChar(p)




	if p == player then return end -- Ne pas mettre l'ESP sur soi-mme




	p.CharacterAdded:Connect(function(char)




		if _S.espEnabled then




			-- Wait for character to be fully loaded




			task.wait(0.5)




			if p.Character and p.Character.Parent then




				removeESP(p)




				applyESP(p)




			end




		end




	end)




end




for _, p in Players:GetPlayers() do setupESPChar(p) end




Players.PlayerAdded:Connect(function(p)




	setupESPChar(p)




	refreshList()




	if _S.espEnabled then




		-- Wait for the new player's character to spawn




		task.spawn(function()




			-- Wait for character




			local waited = 0




			while not p.Character and waited < 10 do




				task.wait(0.5)




				waited = waited + 0.5




			end




			if p.Character and _S.espEnabled then




				removeESP(p)




				applyESP(p)




			end




		end)




	end




end)




Players.PlayerRemoving:Connect(function(p) removeESP(p) end)




-- Continuous ESP monitor: ensures ESP stays active on all players




task.spawn(function()




	while task.wait(0.5) do




		if _S.espEnabled then




			-- Nettoyer l'ESP sur soi-mme si prsent




			removeESP(player)




			for _, p in Players:GetPlayers() do




				if p ~= player then




					local needsESP = false




					if not _S.espObjects[p] then




						needsESP = true




					elseif not _S.espObjects[p].hl or not _S.espObjects[p].hl.Parent then




						needsESP = true




					elseif not _S.espObjects[p].bb or not _S.espObjects[p].bb.Parent then




						needsESP = true




					end




					if needsESP then




						if p.Character and p.Character.Parent then




							removeESP(p)




							applyESP(p)




						end




					end




				end




			end




		end




	end




end)




espBtn.MouseButton1Click:Connect(function()




	_S.espEnabled = not _S.espEnabled




	setESPToggle(_S.espEnabled)




	if _S.espEnabled then








	else








	end




	refreshESP()




end)




-- Vitesse




speedBtn.MouseButton1Click:Connect(function()




	_S.speedEnabled = not _S.speedEnabled




	setSpeedToggle(_S.speedEnabled)




	if _S.speedEnabled then








	else








	end




	applySpeed()




end)




speedDownBtn.MouseButton1Click:Connect(function()
	_S.speedValue = math.max(1, _S.speedValue - 10)
	speedValueLabel.Text = tostring(_S.speedValue)
	walkUpdateSlider(true)
	if _S.speedEnabled then
		applySpeed()
	end
end)
speedUpBtn.MouseButton1Click:Connect(function()
	_S.speedValue = _S.speedValue + 10
	speedValueLabel.Text = tostring(_S.speedValue)
	walkUpdateSlider(true)
	if _S.speedEnabled then
		applySpeed()
	end
end)





-- Fly speed +/- controls




flySpeedDownBtn.MouseButton1Click:Connect(function()




	_S.flySpeed = math.max(1, _S.flySpeed - 10)




	flySpeedValueLabel.Text = tostring(_S.flySpeed)




end)




flySpeedUpBtn.MouseButton1Click:Connect(function()




	_S.flySpeed = _S.flySpeed + 10




	flySpeedValueLabel.Text = tostring(_S.flySpeed)




end)




-- Fly




flyBtn.MouseButton1Click:Connect(function()




	_S.flyEnabled = not _S.flyEnabled




	setFlyToggle(_S.flyEnabled)




	if _S.flyEnabled then








		setupFly()




	else








		disableFly()




	end




end)




-- Swim (Nager dans l'air)
_S.swimBtn.MouseButton1Click:Connect(function()
	_S.swimEnabled = not _S.swimEnabled
	_S.setSwimToggle(_S.swimEnabled)
	if _S.swimEnabled then
		setupSwim()
	else
		disableSwim()
	end
end)

_S.swimSpeedDownBtn.MouseButton1Click:Connect(function()
	_S.swimSpeed = math.max(1, _S.swimSpeed - 10)
	_S.swimSpeedValueLabel.Text = tostring(_S.swimSpeed)
	_S.swimUpdateSlider(true)
end)

_S.swimSpeedUpBtn.MouseButton1Click:Connect(function()
	_S.swimSpeed = _S.swimSpeed + 10
	_S.swimSpeedValueLabel.Text = tostring(_S.swimSpeed)
	_S.swimUpdateSlider(true)
end)

-- Boucle de surveillance: réapplique Walk et Fly en permanence s'ils sont activés




-- Empêche d'autres scripts ou Roblox de réinitialiser la vitesse sans cliquer sur le bouton




task.spawn(function()




	while task.wait(0.3) do




		local char = player.Character




		if char then




			local hum = char:FindFirstChildOfClass("Humanoid")




			local hrp = char:FindFirstChild("HumanoidRootPart")




			-- Réappliquer la Walk Speed si activée et si elle a été changée




			if _S.speedEnabled and hum and hum.WalkSpeed ~= _S.speedValue then




				hum.WalkSpeed = _S.speedValue




			end




			-- Réappliquer le Fly si activé et si le BodyVelocity/BodyGyro a été supprimé


			if _S.flyEnabled and hrp then

				if not _S.flyVelocity or not _S.flyVelocity.Parent then

					_S.flyVelocity = Instance.new("BodyVelocity")

					_S.flyVelocity.MaxForce = Vector3.new(400000, 400000, 400000)

					_S.flyVelocity.Velocity = Vector3.new(0, 0, 0)

					_S.flyVelocity.Parent = hrp

				end

				if not _S.flyGyro or not _S.flyGyro.Parent then

					_S.flyGyro = Instance.new("BodyGyro")

					_S.flyGyro.MaxTorque = Vector3.new(math.huge, math.huge, math.huge)

					_S.flyGyro.P = 50000

					_S.flyGyro.D = 400

					_S.flyGyro.CFrame = hrp.CFrame

					_S.flyGyro.Parent = hrp

				end

				if hum then

					hum.PlatformStand = true

				end

			end




























		end




	end




end)




-- NOCLIP




noclipBtn.MouseButton1Click:Connect(function()




	_S.noclipEnabled = not _S.noclipEnabled




	setNoclipToggle(_S.noclipEnabled)




	if _S.noclipEnabled then








	else








		-- Restaurer les collisions (sauf HumanoidRootPart)




		local char = player.Character




		if char then




			for _, part in char:GetDescendants() do




				if part:IsA("BasePart") and part.Name ~= "HumanoidRootPart" then




					part.CanCollide = true




				end




			end




		end




	end




end)




task.spawn(function()




	while task.wait(0.1) do




		if _S.noclipEnabled then




			local char = player.Character




			if char then




				for _, part in char:GetDescendants() do




					if part:IsA("BasePart") then




						part.CanCollide = false




					end




				end




			end




		end




	end




end)




-- Swim reapplication loop
task.spawn(function()
	while task.wait(0.3) do
		local char = player.Character
		if char then
			local hum = char:FindFirstChildOfClass("Humanoid")
			local hrp = char:FindFirstChild("HumanoidRootPart")
			if _S.swimEnabled and hrp then
				if not _S.swimVelocity or not _S.swimVelocity.Parent then
					_S.swimVelocity = Instance.new("BodyVelocity")
					_S.swimVelocity.MaxForce = Vector3.new(400000, 400000, 400000)
					_S.swimVelocity.Velocity = Vector3.new(0, 0, 0)
					_S.swimVelocity.Parent = hrp
				end
				if not _S.swimGyro or not _S.swimGyro.Parent then
					_S.swimGyro = Instance.new("BodyGyro")
					_S.swimGyro.MaxTorque = Vector3.new(math.huge, math.huge, math.huge)
					_S.swimGyro.P = 50000
					_S.swimGyro.D = 400
					_S.swimGyro.CFrame = hrp.CFrame
					_S.swimGyro.Parent = hrp
				end
				if hum then
					hum:SetStateEnabled(Enum.HumanoidStateType.Freefall, false)
					hum:ChangeState(Enum.HumanoidStateType.Swimming)
				end
			end
		end
	end
end)

-- Swim movement (RenderStepped)
RunService.RenderStepped:Connect(function()
	if not _S.swimEnabled or not _S.swimVelocity then return end
	local char = player.Character
	if not char then return end
	local hrp = char:FindFirstChild("HumanoidRootPart")
	if not hrp then return end
	local hum = char:FindFirstChildOfClass("Humanoid")
	local cam = Workspace.CurrentCamera
	local fwd = cam.CFrame.LookVector
	local right = cam.CFrame.RightVector
	local up = Vector3.new(0, 1, 0)
	local move = Vector3.new(0, 0, 0)
	if keys[Enum.KeyCode.W] then move = move + fwd end
	if keys[Enum.KeyCode.S] then move = move - fwd end
	if keys[Enum.KeyCode.A] then move = move - right end
	if keys[Enum.KeyCode.D] then move = move + right end
	if keys[Enum.KeyCode.Space] then move = move + up end
	if keys[Enum.KeyCode.LeftShift] then move = move - up end
	if move.Magnitude > 0 then move = move.Unit * _S.swimSpeed end
	_S.swimVelocity.Velocity = move
	if hum then
		hum:ChangeState(Enum.HumanoidStateType.Swimming)
	end
	if _S.swimGyro and _S.swimGyro.Parent then
		local lookDir = Vector3.new(fwd.X, 0, fwd.Z)
		if lookDir.Magnitude > 0.01 then
			lookDir = lookDir.Unit
			_S.swimGyro.CFrame = CFrame.lookAt(Vector3.new(0, 0, 0), lookDir)
		end
	end
	hrp.AssemblyAngularVelocity = Vector3.new(0, 0, 0)
end)

-- TP JOUEUR




tpPlayerBtn.MouseButton1Click:Connect(function()




	if _S.selectedPlayer and _S.selectedPlayer.Character then




		local targetHRP = _S.selectedPlayer.Character:FindFirstChild("HumanoidRootPart")




		local myChar = player.Character




		local myHRP = myChar and myChar:FindFirstChild("HumanoidRootPart")




		if targetHRP and myHRP then




			myHRP.CFrame = targetHRP.CFrame * CFrame.new(0, 0, 5)




		end




	end




end)




-- SAVE POSITION




savePosBtn.MouseButton1Click:Connect(function()




	local char = player.Character




	if char then




		local hrp = char:FindFirstChild("HumanoidRootPart")




		if hrp then




			_S.savedPosition = hrp.CFrame




			savePosBtn.BackgroundColor3 = Color3.fromRGB(40, 150, 50)




			task.delay(0.3, function()




				savePosBtn.BackgroundColor3 = _S.customBtnColor or Color3.fromRGB(120, 30, 30)




			end)




		end




	end




end)




-- SAVE POSITION JOUEUR SELECT




savePlayerPosBtn.MouseButton1Click:Connect(function()




	if _S.selectedPlayer and _S.selectedPlayer.Character then




		local targetHRP = _S.selectedPlayer.Character:FindFirstChild("HumanoidRootPart")




		if targetHRP then




			_S.savedPlayerPosition = targetHRP.CFrame




			savePlayerPosBtn.BackgroundColor3 = Color3.fromRGB(40, 150, 50)




			task.delay(0.3, function()




				savePlayerPosBtn.BackgroundColor3 = _S.customBtnColor or Color3.fromRGB(120, 30, 30)




			end)




		end




	else




		savePlayerPosBtn.Text = "Aucun joueur"




		savePlayerPosBtn.BackgroundColor3 = Color3.fromRGB(150, 50, 50)




		task.delay(1.5, function()




			savePlayerPosBtn.Text = "Save Pos Joueur Select"




			savePlayerPosBtn.BackgroundColor3 = _S.customBtnColor or Color3.fromRGB(120, 30, 30)




		end)




	end




end)




-- TP POSITION




tpPosBtn.MouseButton1Click:Connect(function()




	local targetPos = _S.savedPlayerPosition or _S.savedPosition




	if targetPos then




		local char = player.Character




		if char then




			local hrp = char:FindFirstChild("HumanoidRootPart")




			if hrp then




				hrp.CFrame = targetPos




				tpPosBtn.BackgroundColor3 = Color3.fromRGB(40, 150, 50)




				task.delay(0.3, function()




					tpPosBtn.BackgroundColor3 = _S.customBtnColor or Color3.fromRGB(120, 30, 30)




				end)




			end




		end




	else




		tpPosBtn.Text = "Aucune save"




		tpPosBtn.BackgroundColor3 = Color3.fromRGB(150, 50, 50)




		task.delay(1, function()




			tpPosBtn.Text = "TP Position"




			tpPosBtn.BackgroundColor3 = _S.customBtnColor or Color3.fromRGB(120, 30, 30)




		end)




	end




end)




-- TP SAVE AUTO (teleporte le joueur a la position sauvegardee par Save Position, en boucle)




tpSavePosBtn.MouseButton1Click:Connect(function()




	_S.tpSavePosEnabled = not _S.tpSavePosEnabled




	setTpSavePosToggle(_S.tpSavePosEnabled)




	if _S.tpSavePosEnabled then








		-- Deuxième save: sauvegarder la position actuelle automatiquement




		local char = player.Character




		if char then




			local hrp = char:FindFirstChild("HumanoidRootPart")




			if hrp then




				_S.tpSaveAutoPosition = hrp.CFrame




			end




		end




	else








		_S.tpSaveAutoPosition = nil




	end




end)




-- TP SAVE AUTO: alterne entre la position sauvegardée (Save Position / Save Pos Joueur)




-- et la deuxième position (_S.tpSaveAutoPosition = position quand le toggle a été activé)




task.spawn(function()




	local toggle = false




	while task.wait(0.1) do




		if _S.tpSavePosEnabled and _S.tpSaveAutoPosition and (_S.savedPlayerPosition or _S.savedPosition) then




			local char = player.Character




			if char then




				local hrp = char:FindFirstChild("HumanoidRootPart")




				local humanoid = char:FindFirstChildOfClass("Humanoid")




				-- Teleporter seulement si le joueur est vivant




				if hrp and humanoid and humanoid.Health > 0 then




					toggle = not toggle




					if toggle then




						hrp.CFrame = _S.savedPlayerPosition or _S.savedPosition




					else




						hrp.CFrame = _S.tpSaveAutoPosition




					end




				end




			end




			task.wait(_S.tpSaveInterval)




		end




	end




end)




-- TP SAVE AUTO SIMPLE (teleporte le joueur a la position sauvegardee en boucle, sans alternance)




tpSaveSimpleBtn.MouseButton1Click:Connect(function()




	_S.tpSaveSimpleEnabled = not _S.tpSaveSimpleEnabled




	setTpSaveSimpleToggle(_S.tpSaveSimpleEnabled)




	if _S.tpSaveSimpleEnabled then








	else








	end




end)




task.spawn(function()




	while task.wait(0.1) do




		if _S.tpSaveSimpleEnabled and (_S.savedPlayerPosition or _S.savedPosition) then




			local char = player.Character




			if char then




				local hrp = char:FindFirstChild("HumanoidRootPart")




				local humanoid = char:FindFirstChildOfClass("Humanoid")




				if hrp and humanoid and humanoid.Health > 0 then




					hrp.CFrame = _S.savedPlayerPosition or _S.savedPosition




				end




			end




			task.wait(_S.tpSaveInterval)




		end




	end




end)




-- Interval controls
local function updateIntervalLabel()
	intervalValueLabel.Text = tostring(_S.tpSaveInterval)
	intervalUpdateSlider(true)
end
intervalDownBtn.MouseButton1Click:Connect(function()
	_S.tpSaveInterval = math.max(0.1, _S.tpSaveInterval - 0.5)
	updateIntervalLabel()
end)
intervalUpBtn.MouseButton1Click:Connect(function()
	_S.tpSaveInterval = _S.tpSaveInterval + 0.5
	updateIntervalLabel()
end)





-- TP ALL (téléporte à chaque joueur pendant 1 seconde en cycle)




tpAllBtn.MouseButton1Click:Connect(function()




	if _S.tpAllActive then




		-- Arrêter le cycle




		_S.tpAllActive = false




		return




	end




	-- Vérifier s'il y a d'autres joueurs




	local playersList = {}




	for _, p in Players:GetPlayers() do




		if p ~= player then




			table.insert(playersList, p)




		end




	end




	if #playersList == 0 then




		-- Aucun autre joueur - feedback visuel




		tpAllBtn.Text = "Aucun joueur"




		tpAllBtn.BackgroundColor3 = Color3.fromRGB(150, 50, 50)




		task.delay(1.5, function()




			tpAllBtn.Text = "TP All"








		end)




		return




	end




	_S.tpAllActive = true




	tpAllBtn.Text = "Arrêter"




	setTpAllToggle(true)








	task.spawn(function()




		while _S.tpAllActive do




			playersList = {}




			for _, p in Players:GetPlayers() do




				if p ~= player then




					table.insert(playersList, p)




				end




			end




			if #playersList == 0 then break end




			for _, targetP in ipairs(playersList) do




				if not _S.tpAllActive then break end




				if targetP.Character and targetP.Character:FindFirstChild("HumanoidRootPart") then




					local targetHRP = targetP.Character.HumanoidRootPart




					local myChar = player.Character




					local myHRP = myChar and myChar:FindFirstChild("HumanoidRootPart")




					if myHRP then




						myHRP.CFrame = targetHRP.CFrame * CFrame.new(0, 0, 5)




					end




				end




				-- Attendre 1 seconde, vérifier l'arrêt toutes les 0.1s




				local waited = 0




				while waited < 1 and _S.tpAllActive do




					task.wait(0.1)




					waited = waited + 0.1




				end




			end




		end




		-- Réinitialiser le bouton en TP All




		_S.tpAllActive = false




		tpAllBtn.Text = "TP All"




		setTpAllToggle(false)








	end)




end)




-- XRAY (voir à travers les murs) - optimisé pour éviter les bugs avec beaucoup de builds




do




	local xrayConn = nil




	local xrayRemovingConn = nil




	local function isCharacterPart(part)




		local ancestor = part.Parent




		while ancestor and ancestor ~= workspace do




			if ancestor:FindFirstChildOfClass("Humanoid") then return true end




			ancestor = ancestor.Parent




		end




		return false




	end




	local function applyXrayToPart(part)




		if not part:IsA("BasePart") then return end




		if part.Transparency >= 0.5 then return end




		if isCharacterPart(part) then return end




		_S.xraySavedTransparency[part] = part.Transparency




		part.Transparency = 0.7




	end




	xrayBtn.MouseButton1Click:Connect(function()




		_S.xrayEnabled = not _S.xrayEnabled




		setXrayToggle(_S.xrayEnabled)




		if _S.xrayEnabled then




			xrayBtn.Text = "Enlever Xray"








			-- Collecter les parts des personnages joueurs à ne pas rendre transparentes




			local charParts = {}




			for _, p in Players:GetPlayers() do




				if p.Character then




					for _, part in p.Character:GetDescendants() do




						if part:IsA("BasePart") then




							charParts[part] = true




						end




					end




				end




			end




			-- Appliquer Xray en LOTS (chunked) pour éviter de freezer le jeu avec beaucoup de builds




			task.spawn(function()




				local count = 0




				for _, desc in workspace:GetDescendants() do




					if desc:IsA("BasePart") and desc.Transparency < 0.5 and not charParts[desc] then




						_S.xraySavedTransparency[desc] = desc.Transparency




						desc.Transparency = 0.7




					end




					count = count + 1




					if count >= 500 then




						count = 0




						task.wait() -- Laisser le jeu respirer entre les lots




					end




				end




			end)




			-- Gérer les nouvelles parts via événement (pas de polling)




			xrayConn = workspace.DescendantAdded:Connect(function(desc)




				if not _S.xrayEnabled then return end




				applyXrayToPart(desc)




			end)




			-- Nettoyer la table quand des parts sont supprimées (évite fuite mémoire)




			xrayRemovingConn = workspace.DescendantRemoving:Connect(function(desc)




				_S.xraySavedTransparency[desc] = nil




			end)




		else




			xrayBtn.Text = "Xray"








			-- Déconnecter les handlers




			if xrayConn then




				xrayConn:Disconnect()




				xrayConn = nil




			end




			if xrayRemovingConn then




				xrayRemovingConn:Disconnect()




				xrayRemovingConn = nil




			end




			-- Restaurer la transparence en lots aussi (évite de freezer à la désactivation)




			task.spawn(function()




				local count = 0




				for part, transp in pairs(_S.xraySavedTransparency) do




					if part.Parent then




						pcall(function() part.Transparency = transp end)




					end




					count = count + 1




					if count >= 500 then




						count = 0




						task.wait()




					end




				end




				_S.xraySavedTransparency = {}




			end)




		end




	end)




end




-- VOIR DANS LE NOIR (Night Vision)




nightVisionBtn.MouseButton1Click:Connect(function()




	_S.nightVisionEnabled = not _S.nightVisionEnabled




	setNightVisionToggle(_S.nightVisionEnabled)




	if _S.nightVisionEnabled then




		nightVisionBtn.Text = "Ne plus voir dans le noir"








		-- Sauvegarder les valeurs d'éclairage d'origine




		local lighting = game:GetService("Lighting")




		_S.nightVisionSavedLighting.Brightness = lighting.Brightness




		_S.nightVisionSavedLighting.Ambient = lighting.Ambient




		_S.nightVisionSavedLighting.OutdoorAmbient = lighting.OutdoorAmbient




		_S.nightVisionSavedLighting.ExposureCompensation = lighting.ExposureCompensation




		-- Appliquer la vision nocturne




		lighting.Brightness = 3




		lighting.Ambient = Color3.fromRGB(128, 128, 128)




		lighting.OutdoorAmbient = Color3.fromRGB(128, 128, 128)




		lighting.ExposureCompensation = 2




	else




		nightVisionBtn.Text = "Voir dans le noir"








		-- Restaurer les valeurs d'éclairage d'origine




		local lighting = game:GetService("Lighting")




		lighting.Brightness = _S.nightVisionSavedLighting.Brightness or 2




		lighting.Ambient = _S.nightVisionSavedLighting.Ambient or Color3.fromRGB(0, 0, 0)




		lighting.OutdoorAmbient = _S.nightVisionSavedLighting.OutdoorAmbient or Color3.fromRGB(128, 128, 128)




		lighting.ExposureCompensation = _S.nightVisionSavedLighting.ExposureCompensation or 0




		_S.nightVisionSavedLighting = {}




	end




end)

-- Spin toggle click handler
spinBtn.MouseButton1Click:Connect(function()
	_S.spinEnabled = not _S.spinEnabled
	setSpinToggle(_S.spinEnabled)
end)

-- Spin RenderStepped: rotate character each frame
RunService.RenderStepped:Connect(function(dt)
	if not _S.spinEnabled then return end
	local char = player.Character
	if not char then return end
	local hrp = char:FindFirstChild("HumanoidRootPart")
	if not hrp then return end
	hrp.CFrame = hrp.CFrame * CFrame.Angles(0, math.rad(_S.spinSpeed) * dt, 0)
end)

-- AFK ANTI-KICK




local function formatAfkTime(seconds)




	local h = math.floor(seconds / 3600)




	local m = math.floor((seconds % 3600) / 60)




	local s = math.floor(seconds % 60)




	return string.format("AFK: %02d:%02d:%02d", h, m, s)




end




afkBtn.MouseButton1Click:Connect(function()




	_S.afkEnabled = not _S.afkEnabled




	setAfkToggle(_S.afkEnabled)




	if _S.afkEnabled then








		_S.afkStartTime = os.time()




		if _S.afkTimerLabel then




			_S.afkTimerLabel.Text = formatAfkTime(0)




		end




		if _S.afkTimerGui and _S.afkTimerGui:FindFirstChild("Frame") then




			_S.afkTimerGui.Frame.Visible = true




		end




	else








		if _S.afkTimerGui and _S.afkTimerGui:FindFirstChild("Frame") then




			_S.afkTimerGui.Frame.Visible = false




		end




	end




end)




task.spawn(function()




	while task.wait(1) do




		if _S.afkEnabled and _S.afkTimerLabel then




			_S.afkTimerLabel.Text = formatAfkTime(os.time() - _S.afkStartTime)




		end




	end




end)








-- === SPECTATE BUTTONS LOGIC ===




local function getSortedPlayers()




	local list = {}




	for _, p in ipairs(Players:GetPlayers()) do




		if p ~= player then




			table.insert(list, p)




		end




	end




	return list




end




local function spectateNextPlayer()




	local list = getSortedPlayers()




	if #list == 0 then return end




	local currentIdx = 0




	for i, p in ipairs(list) do




		if p == _S.spectatingPlayer then




			currentIdx = i




			break




		end




	end




	local nextIdx = currentIdx + 1




	if nextIdx > #list then nextIdx = 1 end




	startSpectate(list[nextIdx])




	_S.selectedPlayer = list[nextIdx]




	refreshList()




	if updateVolLabel then updateVolLabel() end




end




local function spectatePrevPlayer()




	local list = getSortedPlayers()




	if #list == 0 then return end




	local currentIdx = 0




	for i, p in ipairs(list) do




		if p == _S.spectatingPlayer then




			currentIdx = i




			break




		end




	end




	local prevIdx = currentIdx - 1




	if prevIdx < 1 then prevIdx = #list end




	startSpectate(list[prevIdx])




	_S.selectedPlayer = list[prevIdx]




	refreshList()




	if updateVolLabel then updateVolLabel() end




end




spectateBtn.MouseButton1Click:Connect(function()




	clickSound:Play()




	if _S.selectedPlayer and _S.selectedPlayer.Parent then




		startSpectate(_S.selectedPlayer)




	else




		local list = getSortedPlayers()




		if #list > 0 then




			startSpectate(list[1])




			_S.selectedPlayer = list[1]




			refreshList()




			if updateVolLabel then updateVolLabel() end




		end




	end




end)




stopSpectateBtn.MouseButton1Click:Connect(function()




	clickSound:Play()




	stopSpectate()




end)




prevSpectateBtn.MouseButton1Click:Connect(function()




	clickSound:Play()




	spectatePrevPlayer()




end)




nextSpectateBtn.MouseButton1Click:Connect(function()




	clickSound:Play()




	spectateNextPlayer()




end)




task.spawn(function()




	while task.wait(120) do




		if _S.afkEnabled then




			VirtualUser:CaptureController()




			VirtualUser:ClickButton1(Vector2.new())




		end




	end




end)




RunService:BindToRenderStep("REDTIGERMouse", 999999, function()




	-- Ne forcer la souris en mode Default que quand le panel est visible




	-- Quand le panel est ferm, on laisse Roblox grer normalement (Shift Lock, etc.)




	if panel.Visible then




		if _S.rightMouseHeld then
			UserInputService.MouseBehavior = Enum.MouseBehavior.LockCenter
			UserInputService.MouseIconEnabled = false
		else
			UserInputService.MouseBehavior = Enum.MouseBehavior.Default
			UserInputService.MouseIconEnabled = true
		end









	end




end)




-- Backup 1: RenderStepped connection (runs after most BindToRenderStep calls)




RunService.RenderStepped:Connect(function()




	if panel.Visible then




		if _S.rightMouseHeld then
			UserInputService.MouseBehavior = Enum.MouseBehavior.LockCenter
			UserInputService.MouseIconEnabled = false
		else
			UserInputService.MouseBehavior = Enum.MouseBehavior.Default
			UserInputService.MouseIconEnabled = true
		end









	end




end)




-- Backup 2: Property change signal (detect and override any lock attempt)




UserInputService:GetPropertyChangedSignal("MouseBehavior"):Connect(function()




	if panel.Visible and not _S.rightMouseHeld and UserInputService.MouseBehavior ~= Enum.MouseBehavior.Default then




		UserInputService.MouseBehavior = Enum.MouseBehavior.Default




	end




end)




RunService.RenderStepped:Connect(function()




	-- Spectate camera management moved to GetPropertyChangedSignal (avoids sync errors)




	if not _S.flyEnabled or not _S.flyVelocity then return end




	local char = player.Character




	if not char then return end




	local hrp = char:FindFirstChild("HumanoidRootPart")




	if not hrp then return end




	local cam = Workspace.CurrentCamera




	local fwd = cam.CFrame.LookVector




	local right = cam.CFrame.RightVector




	local up = Vector3.new(0, 1, 0)




	local move = Vector3.new(0, 0, 0)




	if keys[Enum.KeyCode.W] then move = move + fwd end




	if keys[Enum.KeyCode.S] then move = move - fwd end




	if keys[Enum.KeyCode.A] then move = move - right end




	if keys[Enum.KeyCode.D] then move = move + right end




	if keys[Enum.KeyCode.Space] then move = move + up end




	if keys[Enum.KeyCode.LeftShift] then move = move - up end




	if move.Magnitude > 0 then move = move.Unit * _S.flySpeed end




	_S.flyVelocity.Velocity = move




	-- Garder le personnage droit avec le BodyGyro (empeche de tournoyer contre les murs)



	if _S.flyGyro and _S.flyGyro.Parent then
		local lookDir = Vector3.new(fwd.X, 0, fwd.Z)
		if lookDir.Magnitude > 0.01 then
			lookDir = lookDir.Unit
			_S.flyGyro.CFrame = CFrame.lookAt(Vector3.new(0, 0, 0), lookDir)
		end
	end

	hrp.AssemblyAngularVelocity = Vector3.new(0, 0, 0)




end)




UserInputService.InputBegan:Connect(function(input, gp)




	if gp then return end




	keys[input.KeyCode] = true




end)




UserInputService.InputEnded:Connect(function(input)




	keys[input.KeyCode] = nil




end)




-- AUTO REJOIN




local TeleportService = game:GetService("TeleportService")




autoRejoinBtn.MouseButton1Click:Connect(function()




	autoRejoinBtn.Text = "Rejoin..."




	autoRejoinBtn.BackgroundColor3 = Color3.fromRGB(40, 150, 50)




	local jobId = game.JobId




	local placeId = game.PlaceId




	if jobId ~= "" then




		TeleportService:TeleportToPlaceInstance(placeId, jobId, player)




	else




		TeleportService:Teleport(placeId, player)




	end




end)




-- LOCK JOUEUR (verrouille la camera sur la tete du joueur le plus proche)




lockAllBtn.MouseButton1Click:Connect(function()




	_S.lockAllEnabled = not _S.lockAllEnabled




	setLockAllToggle(_S.lockAllEnabled)




	if _S.lockAllEnabled then




		_S.lockSelectedEnabled = false




		setLockSelToggle(false)








		_S.lockEnemyEnabled = false




		setLockEnemyToggle(false)












	else








	end




end)




-- LOCK SELECT (verrouille la camera sur le joueur selectionne)




lockSelBtn.MouseButton1Click:Connect(function()




	_S.lockSelectedEnabled = not _S.lockSelectedEnabled




	setLockSelToggle(_S.lockSelectedEnabled)




	if _S.lockSelectedEnabled then




		_S.lockAllEnabled = false




		setLockAllToggle(false)








		_S.lockEnemyEnabled = false




		setLockEnemyToggle(false)












	else








	end




end)




-- LOCK EQUIPE ADVERSE (verrouille la camera sur le joueur ennemi le plus proche)




lockEnemyBtn.MouseButton1Click:Connect(function()




	_S.lockEnemyEnabled = not _S.lockEnemyEnabled




	setLockEnemyToggle(_S.lockEnemyEnabled)




	if _S.lockEnemyEnabled then




		_S.lockAllEnabled = false




		setLockAllToggle(false)








		_S.lockSelectedEnabled = false




		setLockSelToggle(false)












	else








	end




end)




-- LOGIQUE LOCK AIM (RenderStep apres la camera Roblox)




do




	local function isAlive(p)




		if not p or not p.Parent then return false end




		local char = p.Character




		if not char then return false end




		local hum = char:FindFirstChildOfClass("Humanoid")




		return hum ~= nil




	end




	-- Le highlight de lock a été supprimé: on garde uniquement l'ESP + HP




	-- Indicateur HP pour le joueur verrouille (affiche les PV sur l'ESP)




	local lockHPBillboard = nil




	local lastLockedChar = nil




	local function hideAllHPLabels()




		for _, p in Players:GetPlayers() do




			if _S.espObjects[p] and _S.espObjects[p].bb then




				local hpLbl = _S.espObjects[p].bb:FindFirstChild("HPLabel")




				if hpLbl then hpLbl.Visible = false end




			end




		end




	end




	local function removeLockHPIndicator()




		hideAllHPLabels()




		if lockHPBillboard then




			pcall(function() lockHPBillboard:Destroy() end)




			lockHPBillboard = nil




		end




		lastLockedChar = nil




	end




	local function updateLockHPIndicator(char)




		if not char then removeLockHPIndicator() return end




		-- Si la cible a change, cacher les anciens labels




		if lastLockedChar ~= char then




			hideAllHPLabels()




			if lockHPBillboard then




				pcall(function() lockHPBillboard:Destroy() end)




				lockHPBillboard = nil




			end




			lastLockedChar = char




		end




		local targetPlayer = nil




		for _, p in Players:GetPlayers() do




			if p.Character == char then




				targetPlayer = p




				break




			end




		end




		local hum = char:FindFirstChildOfClass("Humanoid")




		if not hum then return end




		local hpText = "\u{2764} " .. math.floor(hum.Health) .. "/" .. tostring(hum.MaxHealth)




		local hpPct = hum.Health / hum.MaxHealth




		local hpColor




		if hpPct > 0.5 then




			hpColor = Color3.fromRGB(0, 255, 0)




		elseif hpPct > 0.25 then




			hpColor = Color3.fromRGB(255, 255, 0)




		else




			hpColor = Color3.fromRGB(255, 0, 0)




		end




		-- Utiliser l'ESP BillboardGui existant si disponible




		if targetPlayer and _S.espObjects[targetPlayer] and _S.espObjects[targetPlayer].bb and _S.espObjects[targetPlayer].bb.Parent then




			local bb = _S.espObjects[targetPlayer].bb




			local hpLbl = bb:FindFirstChild("HPLabel")




			if hpLbl then




				hpLbl.Visible = true




				hpLbl.Text = hpText




				hpLbl.TextColor3 = hpColor




			end




			if lockHPBillboard then




				pcall(function() lockHPBillboard:Destroy() end)




				lockHPBillboard = nil




			end




		else




			-- ESP inactif: creer un BillboardGui dedie pour les HP




			if not lockHPBillboard or not lockHPBillboard.Parent or lockHPBillboard.Parent ~= char then




				if lockHPBillboard then




					pcall(function() lockHPBillboard:Destroy() end)




				end




				lockHPBillboard = Instance.new("BillboardGui")




				lockHPBillboard.Name = "LockHP"




				lockHPBillboard.Size = UDim2.new(0, 200, 0, 20)




				lockHPBillboard.StudsOffset = Vector3.new(0, 4, 0)




				lockHPBillboard.AlwaysOnTop = true




				lockHPBillboard.Parent = char




				local hpLbl = Instance.new("TextLabel")




				hpLbl.Size = UDim2.new(1, 0, 1, 0)




				hpLbl.BackgroundTransparency = 1




				hpLbl.Text = ""




				hpLbl.Font = Enum.Font.SourceSansBold




				hpLbl.TextSize = 16




				hpLbl.Parent = lockHPBillboard




			end




			local hpLbl = lockHPBillboard:FindFirstChildOfClass("TextLabel")




			if hpLbl then




				hpLbl.Text = hpText




				hpLbl.TextColor3 = hpColor




			end




		end




	end




	RunService:BindToRenderStep("LockAim", Enum.RenderPriority.Camera.Value + 1, function()




		-- LOCK AIM: verrouille la camera sur la tete d'un joueur




		if (_S.lockAllEnabled or _S.lockSelectedEnabled or _S.lockEnemyEnabled) then




			local char = player.Character




			if char then




				local hrp = char:FindFirstChild("HumanoidRootPart")




				if hrp then




					local targetHead = nil




					local curRange




					if _S.lockSelectedEnabled then




						curRange = _S.lockRanges.sel




					elseif _S.lockAllEnabled then




						curRange = _S.lockRanges.all




					else




						curRange = _S.lockRanges.enemy




					end




					-- Auto-lock par dégâts: si on a pris des dégâts récemment, cibler l'attaquant




					if _S.damageAutoLockTarget and tick() < _S.damageAutoLockExpire then




						if isAlive(_S.damageAutoLockTarget) then




							local head = _S.damageAutoLockTarget.Character:FindFirstChild("Head")




							if head and head.Parent then




								local dist = (head.Position - hrp.Position).Magnitude




								if curRange == math.huge or dist <= curRange then




									targetHead = head




								end




							end




						end




					end




					-- Auto-lock de proximité: si un joueur est très proche, le cibler directement




					if not targetHead then




						local proxNearest = _S.lockProximityRange




						for _, p in Players:GetPlayers() do




							if p ~= player and isAlive(p) then




								if _S.lockEnemyEnabled and p.Team == player.Team then




									continue




								end




								local head = p.Character:FindFirstChild("Head")




								if head and head.Parent then




									local dist = (head.Position - hrp.Position).Magnitude




									if dist < proxNearest then




										proxNearest = dist




										targetHead = head




									end




								end




							end




						end




					end




					if not targetHead then




						if _S.lockSelectedEnabled then




							-- Lock Select: on verrouille uniquement le joueur selectionne s'il est vivant et dans la range




							if _S.selectedPlayer and isAlive(_S.selectedPlayer) then




								local head = _S.selectedPlayer.Character:FindFirstChild("Head")




								if head and head.Parent then




									local dist = (head.Position - hrp.Position).Magnitude




									if curRange == math.huge or dist <= curRange then




										targetHead = head




									end




								end




							end




						elseif _S.lockAllEnabled then




							local nearestDist = math.huge




							for _, p in Players:GetPlayers() do




								if p ~= player and isAlive(p) then




									local head = p.Character:FindFirstChild("Head")




									if head and head.Parent then




										local dist = (head.Position - hrp.Position).Magnitude




										if dist < nearestDist and (curRange == math.huge or dist <= curRange) then




											nearestDist = dist




											targetHead = head




										end




									end




								end




							end




						elseif _S.lockEnemyEnabled then




							local myTeam = player.Team




							local nearestDist = math.huge




							for _, p in Players:GetPlayers() do




								if p ~= player and p.Team ~= myTeam and isAlive(p) then




									local head = p.Character:FindFirstChild("Head")




									if head and head.Parent then




										local dist = (head.Position - hrp.Position).Magnitude




										if dist < nearestDist and (curRange == math.huge or dist <= curRange) then




											nearestDist = dist




											targetHead = head




										end




									end




								end




							end




						end




					end




					if targetHead then




						local camPos = camera.CFrame.Position




						camera.CFrame = CFrame.lookAt(camPos, targetHead.Position)




						-- Mettre a jour l'indicateur HP sur la cible verrouillee (affiche les PV sur l'ESP)




						updateLockHPIndicator(targetHead.Parent)




					else




						removeLockHPIndicator()




					end




				end




			end




		else




			removeLockHPIndicator()




		end




	end)




end




-- Détection de dégâts: auto-lock quand on se fait tirer dessus




task.spawn(function()




	local lastHealth = nil




	while task.wait(0.1) do




		local char = player.Character




		if char then




			local hum = char:FindFirstChildOfClass("Humanoid")




			if hum then




				if lastHealth and hum.Health < lastHealth - 5 then




					-- On a pris des dégâts: trouver l'attaquant le plus proche




					local hrp = char:FindFirstChild("HumanoidRootPart")




					if hrp then




						local nearestDist = math.huge




						local nearestPlayer = nil




						for _, p in Players:GetPlayers() do




							if p ~= player and p.Character then




								local pHum = p.Character:FindFirstChildOfClass("Humanoid")




								if pHum then




									local pHead = p.Character:FindFirstChild("Head")




									if pHead then




										local dist = (pHead.Position - hrp.Position).Magnitude




										if dist < nearestDist then




											nearestDist = dist




											nearestPlayer = p




										end




									end




								end




							end




						end




						if nearestPlayer then




							_S.damageAutoLockTarget = nearestPlayer




							_S.damageAutoLockExpire = tick() + 5 -- Lock pendant 5 secondes




						end




					end




				end




				lastHealth = hum.Health




			else




				lastHealth = nil




			end




		else




			lastHealth = nil




		end




	end




end)




-- JUMP INFINI




jumpInfiniteBtn.MouseButton1Click:Connect(function()




	_S.infiniteJumpEnabled = not _S.infiniteJumpEnabled




	setJumpInfiniteToggle(_S.infiniteJumpEnabled)




	if _S.infiniteJumpEnabled then








	else








	end




end)




UserInputService.JumpRequest:Connect(function()




	if _S.infiniteJumpEnabled then




		local char = player.Character




		if char then




			local hum = char:FindFirstChildOfClass("Humanoid")




			if hum then




				hum:ChangeState(Enum.HumanoidStateType.Jumping)




			end




		end




	end




end)




-- VOICE CHAT VOLUME




do




	local voiceVolume = 1.0




	local function applyVoiceVolume(targetPlayer)




		if not targetPlayer or not targetPlayer.Parent then return end




		local adi = targetPlayer:FindFirstChildOfClass("AudioDeviceInput")




		if adi then




			pcall(function() adi.Volume = voiceVolume end)




		end




		if targetPlayer.Character then




			for _, d in targetPlayer.Character:GetDescendants() do




				if d:IsA("AudioEmitter") then




					pcall(function()




						d:SetDistanceAttenuation({[0] = voiceVolume, [10000] = voiceVolume})




					end)




				end




			end




		end




	end




	function updateVolLabel()




		volLabel.Text = "Vol: " .. math.floor(voiceVolume * 100) .. "%"




	end




	volDownBtn.MouseButton1Click:Connect(function()




		voiceVolume = math.max(0, voiceVolume - 0.1)




		updateVolLabel()




		if _S.selectedPlayer then




			applyVoiceVolume(_S.selectedPlayer)




		end




	end)




	volUpBtn.MouseButton1Click:Connect(function()




		voiceVolume = math.min(10, voiceVolume + 0.1)




		updateVolLabel()




		if _S.selectedPlayer then




			applyVoiceVolume(_S.selectedPlayer)




		end




	end)




	volLabel.FocusLost:Connect(function()




		local text = volLabel.Text




		local num = tonumber(text)




		if not num then




			local pct = string.match(text, "%d+")




			num = pct and tonumber(pct)




		end




		if num then




			voiceVolume = math.clamp(num / 100, 0, 10)




			updateVolLabel()




			if _S.selectedPlayer then




				applyVoiceVolume(_S.selectedPlayer)




			end




		else




			updateVolLabel()




		end




	end)




	task.spawn(function()




		while task.wait(1) do




			if voiceVolume ~= 1.0 and _S.selectedPlayer then




				applyVoiceVolume(_S.selectedPlayer)




			end




		end




	end)




end




-- GIVE ALL TOOLS (cherche dans ReplicatedStorage + Workspace ctclient)




giveToolsBtn.MouseButton1Click:Connect(function()




	local backpack = player:FindFirstChildOfClass("Backpack")




	if not backpack then return end




	local seen = {}




	local function search(container)




		for _, d in container:GetDescendants() do




			if d:IsA("Tool") and not seen[d] then




				seen[d] = true




				pcall(function()




					d:Clone().Parent = backpack




				end)




			end




		end




	end




	pcall(search, ReplicatedStorage)




	pcall(search, Workspace)




end)




-- RESPAWN




respawnBtn.MouseButton1Click:Connect(function()




	local char = player.Character




	if char then




		local hum = char:FindFirstChildOfClass("Humanoid")




		if hum and hum.Health > 0 then




			hum.Health = 0




		end




	end




end)




-- TOOL TÉLÉPORTATION




tpToolBtn.MouseButton1Click:Connect(function()




	local backpack = player:FindFirstChildOfClass("Backpack")




	if not backpack then return end




	for _, c in backpack:GetChildren() do




		if c.Name == "TeleportTool" then c:Destroy() end




	end




	if player.Character then




		for _, c in player.Character:GetChildren() do




			if c.Name == "TeleportTool" then c:Destroy() end




		end




	end




	local tool = Instance.new("Tool")




	tool.Name = "TeleportTool"




	tool.RequiresHandle = false




	tool.ToolTip = "Cliquez pour téléporter"




	tool.Parent = backpack




end)




task.spawn(function()




	while task.wait(0.3) do




		_S.teleportToolEquipped = false




		local char = player.Character




		if char then




			for _, c in char:GetChildren() do




				if c:IsA("Tool") and c.Name == "TeleportTool" then




					_S.teleportToolEquipped = true




					break




				end




			end




		end




	end




end)




mouse.Button1Down:Connect(function()




	if _S.teleportToolEquipped and mouse.Hit then




		local char = player.Character




		if char then




			local hrp = char:FindFirstChild("HumanoidRootPart")




			if hrp then




				hrp.CFrame = CFrame.new(mouse.Hit.Position + Vector3.new(0, 3, 0))




			end




		end




	end




end)




-- VOIR MON SAC (items cliquables pour équiper / déséquiper)




local bagVisible = false




local profileVisible = false




do




	bagBtn.MouseButton1Click:Connect(function()




		bagVisible = not bagVisible




		bagFrame.Visible = bagVisible




		if profileFrame.Visible then profileFrame.Visible = false profileVisible = false end




	end)




	-- Sac: refresh sans flicker (met à jour en place)




	local bagButtons = {}  -- tool -> TextButton




	task.spawn(function()




		while task.wait(0.5) do




			if bagVisible then




				local currentTools = {}




				-- Collecter les tools actuels




				local backpack = player:FindFirstChildOfClass("Backpack")




				if backpack then




					for _, item in backpack:GetChildren() do




						if item:IsA("Tool") then




							currentTools[item] = false  -- non équipé




						end




					end




				end




				local char = player.Character




				if char then




					for _, item in char:GetChildren() do




						if item:IsA("Tool") then




							currentTools[item] = true  -- équipé




						end




					end




				end




				-- Supprimer les boutons des tools qui n'existent plus




				for tool, button in pairs(bagButtons) do




					if not currentTools[tool] or not tool.Parent then




						if button and button.Parent then button:Destroy() end




						bagButtons[tool] = nil




					end




				end




				-- Créer ou mettre à jour les boutons




				for tool, isEquipped in pairs(currentTools) do




					if not bagButtons[tool] then




						-- Créer nouveau bouton




						local item = Instance.new("TextButton")




						item.Size = UDim2.new(1, -8, 0, 22)




						item.BackgroundTransparency = 0.2




						item.Font = Enum.Font.SourceSans




						item.TextSize = 14




						item.TextXAlignment = Enum.TextXAlignment.Left




						item.TextTruncate = Enum.TextTruncate.AtEnd




						item.BorderSizePixel = 0




						item.Parent = bagFrame




						Instance.new("UICorner", item).CornerRadius = UDim.new(0, 3)




						item.MouseButton1Click:Connect(function()




							clickSound:Play()




							local c = player.Character




							if c then




								local hum = c:FindFirstChildOfClass("Humanoid")




								if hum then




									if tool.Parent == c then




										hum:UnequipTools()




									else




										local bp = player:FindFirstChildOfClass("Backpack")




										if bp and tool.Parent == bp then




											hum:EquipTool(tool)




										end




									end




								end




							end




						end)




						bagButtons[tool] = item




					end




					-- Mettre à jour le texte et la couleur en place




					local button = bagButtons[tool]




					local newText = "  " .. tool.Name .. (isEquipped and " (main)" or "")




					local newColor = isEquipped and Color3.fromRGB(40, 150, 50) or (_S.customBtnColor or Color3.fromRGB(120, 30, 30))




					local newTextColor = isEquipped and Color3.fromRGB(255, 255, 255) or Color3.fromRGB(255, 255, 255)




					if button.Text ~= newText then button.Text = newText end




					if button.BackgroundColor3 ~= newColor then button.BackgroundColor3 = newColor end




					if button.TextColor3 ~= newTextColor then button.TextColor3 = newTextColor end




				end




			end




		end




	end)




end




-- PROFIL JOUEUR (refresh en temps réel sans flicker)




do




	local profileLabels = {}




	local profileBuilt = false




	local function buildProfileLabels()




		if profileBuilt then return end




		profileBuilt = true




		local fields = {"Pseudo", "Affichage", "ID", "Équipe", "Âge", "Vie", "Vitesse", "Position", "Tools", "Perso"}




		for _, field in ipairs(fields) do




			local lbl = Instance.new("TextLabel")




			lbl.Size = UDim2.new(1, -8, 0, 20)




			lbl.BackgroundTransparency = 0.3




			lbl.BackgroundColor3 = Color3.fromRGB(25, 25, 40)




			lbl.Text = ""




			lbl.TextColor3 = Color3.fromRGB(255, 255, 255)




			lbl.Font = Enum.Font.SourceSans




			lbl.TextSize = 14




			lbl.TextXAlignment = Enum.TextXAlignment.Left




			lbl.TextTruncate = Enum.TextTruncate.AtEnd




			lbl.BorderSizePixel = 0




			lbl.Parent = profileFrame




			Instance.new("UICorner", lbl).CornerRadius = UDim.new(0, 3)




			profileLabels[field] = lbl




		end




	end




	profileBtn.MouseButton1Click:Connect(function()




		profileVisible = not profileVisible




		profileFrame.Visible = profileVisible




		if bagFrame.Visible then bagFrame.Visible = false bagVisible = false end




		if profileVisible then




			buildProfileLabels()




		end




	end)




	-- Mise à jour profil en temps réel (invisible)




	task.spawn(function()




		while task.wait(0.5) do




			if profileVisible then




				local target = _S.selectedPlayer or player




				if not target or not target.Parent then




					for _, lbl in pairs(profileLabels) do lbl.Text = "" end




				else




					profileLabels["Pseudo"].Text = "  Pseudo: " .. target.Name




					profileLabels["Affichage"].Text = "  Affichage: " .. target.DisplayName




					profileLabels["ID"].Text = "  ID: " .. tostring(target.UserId)




					profileLabels["Équipe"].Text = "  Équipe: " .. (target.Team and target.Team.Name or "Aucune")




					profileLabels["Âge"].Text = "  Âge compte: " .. tostring(target.AccountAge) .. " jours"




					if target.Character then




						local hum = target.Character:FindFirstChildOfClass("Humanoid")




						if hum then




							profileLabels["Vie"].Text = "  Vie: " .. math.floor(hum.Health) .. "/" .. tostring(hum.MaxHealth)




							profileLabels["Vitesse"].Text = "  Vitesse: " .. tostring(hum.WalkSpeed)




						else




							profileLabels["Vie"].Text = "  Vie: N/A"




							profileLabels["Vitesse"].Text = "  Vitesse: N/A"




						end




						local hrp = target.Character:FindFirstChild("HumanoidRootPart")




						if hrp then




							local pos = hrp.Position




							profileLabels["Position"].Text = string.format("  Pos: %.0f, %.0f, %.0f", pos.X, pos.Y, pos.Z)




						else




							profileLabels["Position"].Text = "  Position: N/A"




						end




						local toolCount = 0




						for _, c in target.Character:GetChildren() do




							if c:IsA("Tool") then toolCount = toolCount + 1 end




						end




						local bp = target:FindFirstChildOfClass("Backpack")




						if bp then




							for _, c in bp:GetChildren() do




								if c:IsA("Tool") then toolCount = toolCount + 1 end




							end




						end




						profileLabels["Tools"].Text = "  Tools: " .. tostring(toolCount)




						profileLabels["Perso"].Text = "  Personnage: présent"




					else




						profileLabels["Vie"].Text = ""




						profileLabels["Vitesse"].Text = ""




						profileLabels["Position"].Text = ""




						profileLabels["Tools"].Text = ""




						profileLabels["Perso"].Text = "  Personnage: absent"




					end




				end




			end




		end




	end)




end




-- Réapplication après respawn




player.CharacterAdded:Connect(function()




	-- Libérer la souris immédiatement après le respawn




	UserInputService.MouseBehavior = Enum.MouseBehavior.Default




	UserInputService.MouseIconEnabled = true




	-- Nettoyer l'ancien _S.flyVelocity (lié au personnage mort)




	if _S.flyVelocity then _S.flyVelocity = nil end




	if _S.flyGyro then _S.flyGyro = nil end



	task.wait(0.5)




	if _S.speedEnabled then applySpeed() end




	if _S.flyEnabled then setupFly() end

	if _S.swimEnabled then setupSwim() end




	-- TP SAVE AUTO: teleporter le joueur a la position sauvegardee apres la mort (ALT ou SIMPLE)




	if (_S.tpSavePosEnabled or _S.tpSaveSimpleEnabled) and (_S.savedPlayerPosition or _S.savedPosition) then




		task.spawn(function()




			-- Attendre que le personnage soit bien charge (sans bloquer sur CharacterAdded:Wait)




			local char = player.Character




			if not char then




				for i = 1, 10 do




					task.wait(0.1)




					char = player.Character




					if char then break end




				end




			end




			if not char then return end




			-- Attendre le HumanoidRootPart




			local hrp = char:WaitForChild("HumanoidRootPart", 5)




			if hrp then




				-- Teleporter avec retries (le jeu peut override la position au spawn)




				for i = 1, 10 do




					local c = player.Character




					if c then




						local h = c:FindFirstChild("HumanoidRootPart")




						if h then




							h.CFrame = _S.savedPlayerPosition or _S.savedPosition




						end




					end




					task.wait(0.1)




				end




			end




		end)




	end




	-- AFK: re-capturer le contrôleur immédiatement après le respawn pour rester actif




	if _S.afkEnabled then




		task.spawn(function()




			task.wait(1)




			pcall(function()




				VirtualUser:CaptureController()




				VirtualUser:ClickButton1(Vector2.new())




			end)




		end)




	end




end)




-- SUPPRIMER LE PANEL (kill switch global)




killPanelBtn.MouseButton1Click:Connect(function()




	-- Desactiver toutes les fonctionnalites




	_S.espEnabled = false




	_S.speedEnabled = false




	_S.flyEnabled = false




	_S.noclipEnabled = false




	_S.afkEnabled = false




	_S.infiniteJumpEnabled = false




	_S.xrayEnabled = false




	_S.nightVisionEnabled = false




	_S.lockAllEnabled = false




	_S.lockSelectedEnabled = false




	_S.lockEnemyEnabled = false




	_S.tpAllActive = false




	_S.tpSavePosEnabled = false




	-- Restaurer la vitesse normale




	applySpeed()




	-- Desactiver le fly




	disableFly()

	disableSwim()



	-- Restaurer les collisions (noclip off)




	local char = player.Character




	if char then




		for _, part in char:GetDescendants() do




			if part:IsA("BasePart") and part.Name ~= "HumanoidRootPart" then




				part.CanCollide = true




			end




		end




	end




	-- Restaurer l'eclairage (night vision off)




	local lighting = game:GetService("Lighting")




	lighting.Brightness = _S.nightVisionSavedLighting.Brightness or 2




	lighting.Ambient = _S.nightVisionSavedLighting.Ambient or Color3.fromRGB(0, 0, 0)




	lighting.OutdoorAmbient = _S.nightVisionSavedLighting.OutdoorAmbient or Color3.fromRGB(128, 128, 128)




	lighting.ExposureCompensation = _S.nightVisionSavedLighting.ExposureCompensation or 0




	_S.nightVisionSavedLighting = {}




	-- Restaurer la transparence (xray off)




	task.spawn(function()




		local count = 0




		for part, transp in pairs(_S.xraySavedTransparency) do




			if part.Parent then




				pcall(function() part.Transparency = transp end)




			end




			count = count + 1




			if count >= 500 then




				count = 0




				task.wait()




			end




		end




		_S.xraySavedTransparency = {}




	end)




	-- Supprimer l'ESP sur tous les joueurs




	for _, p in Players:GetPlayers() do




		removeESP(p)




	end




	-- Restaurer la camera




	-- CameraType not forced to avoid sync errors with custom camera games




	if char then




		local hum = char:FindFirstChildOfClass("Humanoid")




		if hum then




			camera.CameraSubject = hum




		end




	end




	stopSpectate()




	-- Tuer Omega si actif




	if _S.omegaHasExecuted and not _S.omegaKilled then




		_S.omegaKilled = true




		for _, conn in ipairs(_S.omegaConnections) do




			pcall(function() conn:Disconnect() end)




		end




		_S.omegaConnections = {}




		for _, name in ipairs(_S.omegaRenderStepNames) do




			pcall(function() RunService:UnbindFromRenderStep(name) end)




		end




		_S.omegaRenderStepNames = {}




		for _, thread in ipairs(_S.omegaThreads) do




			pcall(function() task.cancel(thread) end)




		end




		_S.omegaThreads = {}




		for _, inst in ipairs(_S.omegaCreatedInstances) do




			pcall(function()




				if inst and inst.Parent then inst:Destroy() end




			end)




		end




		_S.omegaCreatedInstances = {}




	end




	-- Supprimer uniquement les GUI Omega restants (seulement si Omega a ete execute)




	if _S.omegaHasExecuted then




		local playerGui = player:FindFirstChildOfClass("PlayerGui")




		if playerGui then




			for _, child in playerGui:GetChildren() do




				if child.Name ~= "REDTIGER" and child.Name ~= "AFKTimer" and not _S.omegaGuiSnapshot[child] then




					pcall(function() child:Destroy() end)




				end




			end




		end




		pcall(function()




			local coreGui = game:GetService("CoreGui")




			if coreGui then




				for _, child in coreGui:GetChildren() do




					if child.Name ~= "REDTIGER" and child.Name ~= "AFKTimer" and not _S.omegaCoreGuiSnapshot[child] then




						pcall(function() child:Destroy() end)




					end




				end




			end




		end)




	end




	-- Debind les RenderStep de REDTIGER




	pcall(function() RunService:UnbindFromRenderStep("REDTIGERMouse") end)




	pcall(function() RunService:UnbindFromRenderStep("LockAim") end)




	-- Restaurer le comportement de la souris




	UserInputService.MouseBehavior = Enum.MouseBehavior.Default




	UserInputService.MouseIconEnabled = true




	-- Supprimer les GUI REDTIGER




	if _S.afkTimerGui then




		pcall(function() _S.afkTimerGui:Destroy() end)




	end




	if gui then




		gui:Destroy()




	end




end)




print("[REDTIGER] Chargé - " .. player.Name .. " (ID: " .. player.UserId .. ")")




print("[REDTIGER] Appuyez sur K pour ouvrir/fermer le panel")

Features & Information

REDTIGER

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts