
Key RequiredUniversal

-- FPV 3D ACRO DRONE (FIXED SLIDERS + TESTA INVISIBILE)
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local GuiService = game:GetService("GuiService")
local player = Players.LocalPlayer
local camera = workspace.CurrentCamera
-- CONFIGURAZIONE ACRO
local STICK_SENSITIVITY = 300
local ROLL_MULTIPLIER = 1.5
local EXPO = 1.2
local THROTTLE_MAX_POWER = 130
-- FISICA
local DRAG = 0.992
local GRAVITY_FORCE = 45
local CAMERA_TILT = 30
local DEADZONE = 0.15
local BOUNCE_ELASTICITY = 0.3
-- STATO
local active = false
local unarmed = true
local velocity = Vector3.new()
local currentPos = camera.CFrame.Position
local droneRotation = CFrame.new()
-- GUI SETUP
local screenGui = Instance.new("ScreenGui", player:WaitForChild("PlayerGui"))
screenGui.Name = "DroneGuiAcro3D"
screenGui.ResetOnSpawn = false
local toggleBtn = Instance.new("TextButton", screenGui)
toggleBtn.Size = UDim2.new(0, 160, 0, 40)
toggleBtn.Position = UDim2.new(1, -180, 0, 20)
toggleBtn.Text = "DRONE: OFF (Y)"
toggleBtn.BackgroundColor3 = Color3.fromRGB(30, 30, 30)
toggleBtn.TextColor3 = Color3.new(1, 1, 1)
toggleBtn.Font = Enum.Font.SourceSansBold
toggleBtn.TextSize = 14
Instance.new("UICorner", toggleBtn)
-- SLIDER SPEED
local sliderFrame = Instance.new("Frame", screenGui)
sliderFrame.Size = UDim2.new(0, 160, 0, 25)
sliderFrame.Position = UDim2.new(1, -180, 0, 65)
sliderFrame.BackgroundColor3 = Color3.fromRGB(40, 40, 40)
Instance.new("UICorner", sliderFrame)
local sliderBar = Instance.new("Frame", sliderFrame)
sliderBar.Size = UDim2.new(THROTTLE_MAX_POWER/500, 0, 1, 0)
sliderBar.BackgroundColor3 = Color3.fromRGB(0, 180, 100)
Instance.new("UICorner", sliderBar)
local sliderLabel = Instance.new("TextLabel", sliderFrame)
sliderLabel.Size = UDim2.new(1, 0, 1, 0)
sliderLabel.BackgroundTransparency = 1
sliderLabel.Text = "SPEED: " .. math.floor(THROTTLE_MAX_POWER)
sliderLabel.TextColor3 = Color3.new(1, 1, 1)
sliderLabel.Font = Enum.Font.SourceSansBold
sliderLabel.TextSize = 14
sliderLabel.ZIndex = 3
-- SLIDER TILT
local tiltFrame = Instance.new("Frame", screenGui)
tiltFrame.Size = UDim2.new(0, 160, 0, 25)
tiltFrame.Position = UDim2.new(1, -180, 0, 95)
tiltFrame.BackgroundColor3 = Color3.fromRGB(40, 40, 40)
Instance.new("UICorner", tiltFrame)
local tiltBar = Instance.new("Frame", tiltFrame)
tiltBar.Size = UDim2.new(CAMERA_TILT/60, 0, 1, 0)
tiltBar.BackgroundColor3 = Color3.fromRGB(0, 120, 220)
Instance.new("UICorner", tiltBar)
local tiltLabel = Instance.new("TextLabel", tiltFrame)
tiltLabel.Size = UDim2.new(1, 0, 1, 0)
tiltLabel.BackgroundTransparency = 1
tiltLabel.Text = "TILT: " .. math.floor(CAMERA_TILT) .. "°"
tiltLabel.TextColor3 = Color3.new(1, 1, 1)
tiltLabel.Font = Enum.Font.SourceSansBold
tiltLabel.TextSize = 14
tiltLabel.ZIndex = 3
local unarmedLabel = Instance.new("TextLabel", screenGui)
unarmedLabel.Size = UDim2.new(0, 160, 0, 25)
unarmedLabel.Position = UDim2.new(1, -180, 0, 130)
unarmedLabel.Text = "DISARMED (B)"
unarmedLabel.BackgroundColor3 = Color3.fromRGB(200, 50, 50)
unarmedLabel.TextColor3 = Color3.new(1, 1, 1)
unarmedLabel.Font = Enum.Font.SourceSansBold
unarmedLabel.TextSize = 14
Instance.new("UICorner", unarmedLabel)
-- LOGICA SLIDERS MIGLIORATA
local isDraggingSpeed = false
local isDraggingTilt = false
local function updateSliders()
local mouseLocation = UserInputService:GetMouseLocation()
local inset = GuiService:GetGuiInset()
local adjustedMouseX = mouseLocation.X - inset.X
if isDraggingSpeed then
local relativeX = math.clamp((adjustedMouseX - sliderFrame.AbsolutePosition.X) / sliderFrame.AbsoluteSize.X, 0, 1)
sliderBar.Size = UDim2.new(relativeX, 0, 1, 0)
THROTTLE_MAX_POWER = relativeX * 500
sliderLabel.Text = "SPEED: " .. math.floor(THROTTLE_MAX_POWER)
end
if isDraggingTilt then
local relativeX = math.clamp((adjustedMouseX - tiltFrame.AbsolutePosition.X) / tiltFrame.AbsoluteSize.X, 0, 1)
tiltBar.Size = UDim2.new(relativeX, 0, 1, 0)
CAMERA_TILT = relativeX * 60
tiltLabel.Text = "TILT: " .. math.floor(CAMERA_TILT) .. "°"
end
end
-- Input Iniziale
sliderFrame.InputBegan:Connect(function(i)
if i.UserInputType == Enum.UserInputType.MouseButton1 or i.UserInputType == Enum.UserInputType.Touch then isDraggingSpeed = true end
end)
tiltFrame.InputBegan:Connect(function(i)
if i.UserInputType == Enum.UserInputType.MouseButton1 or i.UserInputType == Enum.UserInputType.Touch then isDraggingTilt = true end
end)
-- Rilascio (Globale per evitare blocchi)
UserInputService.InputEnded:Connect(function(i)
if i.UserInputType == Enum.UserInputType.MouseButton1 or i.UserInputType == Enum.UserInputType.Touch then
isDraggingSpeed = false
isDraggingTilt = false
end
end)
-- LOGICA ARM/DISARM
local function toggleArm()
unarmed = not unarmed
unarmedLabel.Text = unarmed and "DISARMED (B)" or "ARMED"
unarmedLabel.BackgroundColor3 = unarmed and Color3.fromRGB(200, 50, 50) or Color3.fromRGB(50, 200, 50)
end
-- LOGICA ATTIVAZIONE
local function toggle()
active = not active
local char = player.Character
local hum = char and char:FindFirstChildOfClass("Humanoid")
if active then
if char and char.PrimaryPart then
currentPos = char.PrimaryPart.Position + Vector3.new(0, 5, 0)
hum.PlatformStand = true
hum:SetStateEnabled(Enum.HumanoidStateType.Dead, false)
end
velocity = Vector3.new()
droneRotation = camera.CFrame * CFrame.Angles(math.rad(-CAMERA_TILT), 0, 0)
droneRotation = droneRotation - droneRotation.Position
camera.CameraType = Enum.CameraType.Scriptable
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCenter
toggleBtn.Text = "DRONE: ON"
toggleBtn.BackgroundColor3 = Color3.fromRGB(200, 50, 50)
else
if hum then
hum.PlatformStand = false
hum:SetStateEnabled(Enum.HumanoidStateType.Dead, true)
end
camera.CameraType = Enum.CameraType.Custom
toggleBtn.Text = "DRONE: OFF (Y)"
toggleBtn.BackgroundColor3 = Color3.fromRGB(30, 30, 30)
UserInputService.MouseBehavior = Enum.MouseBehavior.Default
end
end
-- FISICA RAYCAST
local raycastParams = RaycastParams.new()
raycastParams.FilterType = Enum.RaycastFilterType.Exclude
local function updateFilter(char) if char then raycastParams.FilterDescendantsInstances = {char} end end
updateFilter(player.Character or player.CharacterAdded:Wait())
local function applyExpo(value)
return (value > 0 and 1 or -1) * (math.abs(value) ^ EXPO)
end
-- LOOP PRINCIPALE
RunService.Heartbeat:Connect(function(dt)
updateSliders() -- Chiamata fissa per fluidità
if not active then return end
local pitch, roll, yaw, throttleInput = 0, 0, 0, 0
local gpts = UserInputService:GetGamepadState(Enum.UserInputType.Gamepad1)
for _, input in pairs(gpts) do
local pos = input.Position
if input.KeyCode == Enum.KeyCode.Thumbstick1 then
if math.abs(pos.X) > DEADZONE then yaw = applyExpo(-pos.X) end
throttleInput = pos.Y
elseif input.KeyCode == Enum.KeyCode.Thumbstick2 then
if math.abs(pos.Y) > DEADZONE then pitch = applyExpo(-pos.Y) end
if math.abs(pos.X) > DEADZONE then roll = applyExpo(pos.X) end
end
end
local thrust = not unarmed and (droneRotation.UpVector * (throttleInput * THROTTLE_MAX_POWER)) or Vector3.new()
velocity = (velocity + (thrust * dt) + (Vector3.new(0, -GRAVITY_FORCE, 0) * dt)) * math.pow(DRAG, dt * 60)
local move = velocity * dt
local hit = workspace:Raycast(currentPos, move + (move.Unit * 1.5), raycastParams)
if hit then
velocity = (velocity - 2 * velocity:Dot(hit.Normal) * hit.Normal) * BOUNCE_ELASTICITY
currentPos = hit.Position + hit.Normal * 0.5
end
droneRotation = droneRotation * CFrame.Angles(math.rad(pitch * STICK_SENSITIVITY * dt), math.rad(yaw * STICK_SENSITIVITY * dt), math.rad(-roll * (STICK_SENSITIVITY * ROLL_MULTIPLIER) * dt))
currentPos = currentPos + velocity * dt
local finalCF = CFrame.new(currentPos) * droneRotation * CFrame.Angles(math.rad(CAMERA_TILT), 0, 0)
camera.CFrame = finalCF
if player.Character then
for _, part in ipairs(player.Character:GetChildren()) do
if part:IsA("BasePart") then
part.CFrame = finalCF
part.AssemblyLinearVelocity = velocity
if part.Name == "Head" then
part.LocalTransparencyModifier = 1
else
part.LocalTransparencyModifier = 0
end
end
end
end
end)
UserInputService.InputBegan:Connect(function(input, processed)
if not processed then
if input.KeyCode == Enum.KeyCode.ButtonY or input.KeyCode == Enum.KeyCode.Y then toggle()
elseif input.KeyCode == Enum.KeyCode.ButtonB or input.KeyCode == Enum.KeyCode.B then toggleArm() end
end
end)
toggleBtn.MouseButton1Click:Connect(toggle)No comments yet for this script.



