-- Wings of Glory Silent Aim V3.2 -- GameId: 125223108 -- Hotkeys: -- T = toggle Silent Aim -- RightShift = show/hide GUI if not game:IsLoaded() then game.Loaded:Wait() end local Players = game:GetService("Players") local UserInputService = game:GetService("UserInputService") local Workspace = game:GetService("Workspace") local ReplicatedStorage = game:GetService("ReplicatedStorage") local LP = Players.LocalPlayer if not LP then warn("[WOG SilentAim] LocalPlayer missing") return end if game.GameId ~= 125223108 then warn("[WOG SilentAim] Wrong experience:", game.GameId, game.PlaceId) return end local PlayerScripts = LP:WaitForChild("PlayerScripts") local ClientCore = PlayerScripts:WaitForChild("ClientCore", 10) local Framework = ClientCore and ClientCore:WaitForChild("Framework", 10) local Modules = Framework and Framework:WaitForChild("Modules", 10) if not Modules then warn("[WOG SilentAim] Framework modules missing") return end local function safeRequire(obj, name) if not obj then warn("[WOG SilentAim] Missing module:", name) return nil end local ok, result = pcall(require, obj) if not ok then warn("[WOG SilentAim] Failed require:", name, result) return nil end return result end local Weapon = safeRequire(Modules:FindFirstChild("Weapon"), "Weapon") local Controls = safeRequire(Modules:FindFirstChild("Controls"), "Controls") local CameraModule = safeRequire(Modules:FindFirstChild("Camera"), "Camera") local Plane = safeRequire(Modules:FindFirstChild("Plane"), "Plane") local ProjectileCompute = safeRequire( ReplicatedStorage.Shared:FindFirstChild("ProjectileParallelCompute"), "ProjectileParallelCompute" ) local ArmamentData = safeRequire( ReplicatedStorage.Assets.Modules.Essentials:FindFirstChild("ArmamentData"), "ArmamentData" ) if not (Weapon and Controls and CameraModule and Plane and ProjectileCompute and ArmamentData) then return end if type(Weapon.new_bullet) ~= "function" then warn("[WOG SilentAim] Weapon.new_bullet unavailable") return end if type(Controls.lock_on_plane) ~= "function" then warn("[WOG SilentAim] Controls.lock_on_plane unavailable") return end local ConditionService pcall(function() ConditionService = _G:require("ConditionService") end) local ENV = getgenv and getgenv() or _G if ENV.WOG_SILENTAIM and ENV.WOG_SILENTAIM.Unload then pcall(ENV.WOG_SILENTAIM.Unload) end local Config = { SilentAimEnabled = true, FOVRadius = 650, MaxDistance = 100000, PredictionEnabled = true, BallisticCompensation = true, TeamCheck = true, VisibilityCheck = false, TargetMode = "Best Target", HitPart = "Fuselage", TargetHoldTime = 1.25, TargetSwitchCooldown = 0.35, DrawFOV = true, Debug = false, } local State = { Running = true, CurrentTarget = nil, CurrentTargetModel = nil, LastTargetChange = 0, LastAcquire = 0, TargetDistance = math.huge, ScreenDistance = math.huge, LastInterceptTime = 0, LastProjectileSpeed = 0, LastTargetSpeed = 0, LastPredictedPosition = nil, LastShotDirection = nil, RedirectedShots = 0, RejectedReason = "None", Connections = {}, History = {}, } local OriginalNewBullet = Weapon.new_bullet local function solveInterceptTime(shooterPos, targetPos, targetDir, targetSpeed, projectileSpeed, projectileMass) local speed = math.max(projectileSpeed, 0.001) local dragFactor = 0.02 / math.max(projectileMass, 1e-6) local delta = targetPos - shooterPos local t = delta.Magnitude / speed for _ = 1, 6 do local futureDistance = (delta + (targetDir * targetSpeed * t)).Magnitude local dragDistance = dragFactor * futureDistance local newTime if dragDistance > 1e-4 then newTime = (math.exp(math.min(dragDistance, 30)) - 1) / (dragFactor * speed) else newTime = futureDistance / speed end t = newTime if newTime >= 2.4 then return 2.4 end end return t end local function getViewModelFolder() return CameraModule.plane_part_viewmodels end local function getBotFolder() return CameraModule.bot_plane_viewmodels end local function resolveTargetModel(name) if not name then return nil end -- This is the exact registry used by Controls.lock_on_plane(). -- For player aircraft this is commonly a BasePart named after the player. local playerFolder = getViewModelFolder() if playerFolder then local part = playerFolder:FindFirstChild(name) if part then return part end end -- Bots are stored separately by the Camera module. local botFolder = getBotFolder() if botFolder then local bot = botFolder:FindFirstChild(name) if bot then return bot end end -- Fallback to the full rendered aircraft model registry when available. local planeModels = CameraModule.plane_viewmodels if planeModels then local model = planeModels:FindFirstChild(name) if model then return model end end return nil end local function getTargetPart(model) if not model then return nil end local mode = Config.HitPart if mode == "Random Body Part" then local choices = { model:FindFirstChild("Fuselage"), model:FindFirstChild("Engine"), model:FindFirstChild("LeftWing"), model:FindFirstChild("RightWing"), } local valid = {} for _, part in ipairs(choices) do if part and part:IsA("BasePart") then table.insert(valid, part) end end if #valid > 0 then return valid[math.random(1, #valid)] end else local chosen = model:FindFirstChild(mode) if chosen and chosen:IsA("BasePart") then return chosen end end if model:IsA("Model") and model.PrimaryPart then return model.PrimaryPart end if model:IsA("BasePart") then return model end return nil end local function getPlaneOrigin() if Plane and Plane.model and Plane.model.PrimaryPart then return Plane.model.PrimaryPart.Position end return nil end local function getTargetName() if State.CurrentTarget then return State.CurrentTarget end local target = Controls.AimAssistTarget or Controls.PlayerLocked if target and target ~= false and target ~= "" then return tostring(target) end return nil end local function enemyCheck(name) if not Config.TeamCheck then return true end local player = Players:FindFirstChild(name) if not player then -- Bot target. return true end return player.TeamColor ~= LP.TeamColor end local function targetAlive(name) if ConditionService then local ok, destroyed = pcall(function() return ConditionService:getConditionValue(name, "destroyed") end) if ok and destroyed then return false end end return true end local function insideFOV(worldPos) local cam = Workspace.CurrentCamera if not cam then return false, math.huge end local p, visible = cam:WorldToViewportPoint(worldPos) if not visible or p.Z <= 0 then return false, math.huge end local center = cam.ViewportSize * 0.5 local dist = (Vector2.new(p.X, p.Y) - center).Magnitude return dist <= Config.FOVRadius, dist end local function visibleCheck(origin, part) if not Config.VisibilityCheck then return true end local params = RaycastParams.new() params.FilterType = Enum.RaycastFilterType.Exclude local ignore = {} if Plane and Plane.model then table.insert(ignore, Plane.model) end if Workspace:FindFirstChild("nodes") then table.insert(ignore, Workspace.nodes) end params.FilterDescendantsInstances = ignore local direction = part.Position - origin local result = Workspace:Raycast(origin, direction, params) if not result then return true end return result.Instance:IsDescendantOf(part.Parent) end local function updateTargetMotion(name, position) local now = os.clock() local h = State.History[name] if not h then h = { pos = position, time = now, smoothVelocity = Vector3.zero, } State.History[name] = h return Vector3.zero, 0 end local dt = math.clamp(now - h.time, 1 / 240, 0.25) local rawVelocity = (position - h.pos) / dt -- Same smoothing constant used by the game's built-in gun aim assist. local alpha = 1 - math.exp(-dt / 0.15) h.smoothVelocity = h.smoothVelocity:Lerp(rawVelocity, alpha) h.pos = position h.time = now local direction = h.smoothVelocity.Magnitude > 1e-4 and h.smoothVelocity.Unit or Vector3.zero local targetSpeed if ConditionService then local ok, speed = pcall(function() return ConditionService:getConditionValue(name, "speed") end) if ok and tonumber(speed) then targetSpeed = tonumber(speed) / 14.4 end end if not targetSpeed then targetSpeed = h.smoothVelocity.Magnitude end return direction, targetSpeed end local function acquireGameTarget(force) local now = os.clock() if not force and now - State.LastAcquire < Config.TargetSwitchCooldown then return end State.LastAcquire = now pcall(function() Controls:lock_on_plane("auto") end) local name = Controls.AimAssistTarget or Controls.PlayerLocked if name and name ~= false and name ~= "" then name = tostring(name) if State.CurrentTarget ~= name then if State.CurrentTarget and now - State.LastTargetChange < Config.TargetHoldTime and not force then return end State.CurrentTarget = name State.CurrentTargetModel = resolveTargetModel(name) State.LastTargetChange = now end end end local function validateTarget(origin) if not State.CurrentTarget then State.RejectedReason = "No target" return nil end if not enemyCheck(State.CurrentTarget) then State.RejectedReason = "Friendly" return nil end if not targetAlive(State.CurrentTarget) then State.RejectedReason = "Destroyed" return nil end local model = State.CurrentTargetModel or resolveTargetModel(State.CurrentTarget) State.CurrentTargetModel = model if not model then State.RejectedReason = "Target model missing" return nil end local part = getTargetPart(model) if not part then State.RejectedReason = "Hit part missing" return nil end local distance = (part.Position - origin).Magnitude State.TargetDistance = distance if distance > Config.MaxDistance then State.RejectedReason = "Out of range" return nil end local inFov, screenDistance = insideFOV(part.Position) State.ScreenDistance = screenDistance if not inFov then State.RejectedReason = "Outside FOV" return nil end if not visibleCheck(origin, part) then State.RejectedReason = "Not visible" return nil end State.RejectedReason = "None" return part end local function simulateProjectile(startCF, velocity, mass, flightTime) if typeof(startCF) ~= "CFrame" then return nil end velocity = tonumber(velocity) mass = tonumber(mass) flightTime = tonumber(flightTime) if not velocity or not mass or not flightTime or flightTime <= 0 then return nil end local cf = startCF local speed = velocity local startPos = startCF.Position local elapsed = 0 local step = 1 / 120 while elapsed < flightTime do local dt = math.min(step, flightTime - elapsed) local ok, newCF, displacement, newVelocity = pcall( ProjectileCompute.integrate, cf, 0, -0.12, speed, mass, startPos, dt ) if not ok or typeof(newCF) ~= "CFrame" or type(newVelocity) ~= "number" then return nil end cf = newCF speed = newVelocity elapsed = elapsed + dt end return cf.Position end local function buildSilentAimCFrame(originalCFrame, bulletData, gunType) if not Config.SilentAimEnabled then return originalCFrame end if typeof(originalCFrame) ~= "CFrame" then return originalCFrame end acquireGameTarget(false) local targetPart = validateTarget(originalCFrame.Position) -- Check the CURRENT target distance for THIS shot. -- V3.1 checked the previous cached distance before target validation, -- which could permanently bypass silent aim after one out-of-range target. local gunData = gunType and ArmamentData[gunType] if targetPart and gunData and tonumber(gunData.DistLimit) then local realLimit = tonumber(gunData.DistLimit) if State.TargetDistance > realLimit then State.RejectedReason = "Beyond gun DistLimit" return originalCFrame end end if not targetPart then -- Current target became invalid: allow the game to pick another. State.CurrentTarget = nil State.CurrentTargetModel = nil acquireGameTarget(true) targetPart = validateTarget(originalCFrame.Position) if not targetPart then return originalCFrame end end local targetPos = targetPart.Position local predictedPos = targetPos local targetDirection = Vector3.zero local targetSpeed = 0 if Config.PredictionEnabled then targetDirection, targetSpeed = updateTargetMotion(State.CurrentTarget, targetPos) local projectile = bulletData and bulletData.projectile if projectile and tonumber(projectile.velocity) and tonumber(projectile.mass) then -- Exact velocity conversion used by Weapon.new_bullet / built-in lead. local projectileSpeed = ((projectile.velocity * 3.6) + (tonumber(Plane.total_speed) or 0)) / 14.4 local interceptTime = solveInterceptTime( originalCFrame.Position, targetPos, targetDirection, targetSpeed, projectileSpeed, projectile.mass ) predictedPos = targetPos + (targetDirection * targetSpeed * interceptTime) State.LastInterceptTime = interceptTime State.LastProjectileSpeed = projectileSpeed State.LastTargetSpeed = targetSpeed end end State.LastPredictedPosition = predictedPos local projectile = bulletData and bulletData.projectile if not projectile then return originalCFrame end local baseVelocity = tonumber(projectile.velocity) local projectileMass = tonumber(projectile.mass) if not baseVelocity or not projectileMass then return originalCFrame end local projectileSpeed = ((baseVelocity * 3.6) + (tonumber(Plane.total_speed) or 0)) / 14.4 local flightTime = State.LastInterceptTime if not flightTime or flightTime <= 0 then flightTime = (predictedPos - originalCFrame.Position).Magnitude / math.max(projectileSpeed, 0.001) end local aimPoint = predictedPos if Config.BallisticCompensation then for i = 1, 4 do local delta = aimPoint - originalCFrame.Position if delta.Magnitude <= 1e-4 then break end local testCF = CFrame.lookAt( originalCFrame.Position, aimPoint, originalCFrame.UpVector ) local simulatedPosition = simulateProjectile( testCF, projectileSpeed, projectileMass, flightTime ) if not simulatedPosition then break end local errorVector = predictedPos - simulatedPosition aimPoint = aimPoint + errorVector if errorVector.Magnitude < 0.5 then break end end end local finalDirection = aimPoint - originalCFrame.Position if finalDirection.Magnitude <= 1e-4 then return originalCFrame end State.LastShotDirection = finalDirection.Unit return CFrame.lookAt( originalCFrame.Position, aimPoint, originalCFrame.UpVector ) end -- This is the verified modification point. -- -- Weapon.new_bullet(..., a5=bulletData, a6=shotCFrame, ...) -- passes: -- cframe = a6 -- start_pos = a6.p -- velo = a5.projectile.velocity -- into the game's actual Projectile.new(). Weapon.new_bullet = function(self, a2, a3, a4, a5, a6, a7, a8, a9) local shotCFrame = a6 if State.Running and Config.SilentAimEnabled and a2 == LP.Name and typeof(a6) == "CFrame" then local ok, redirected = pcall( buildSilentAimCFrame, a6, a5, a7 ) if ok and typeof(redirected) == "CFrame" then if redirected ~= a6 then State.RedirectedShots += 1 end shotCFrame = redirected elseif not ok then State.RejectedReason = tostring(redirected) end end return OriginalNewBullet( self, a2, a3, a4, a5, shotCFrame, a7, a8, a9 ) end -- Reacquire target periodically, not per frame. task.spawn(function() while State.Running do task.wait(0.25) if Config.SilentAimEnabled then local targetValid = State.CurrentTarget and State.CurrentTargetModel and State.CurrentTargetModel.Parent if not targetValid then State.CurrentTarget = nil State.CurrentTargetModel = nil acquireGameTarget(false) end end end end) -- =========================== -- GUI -- =========================== local gui = Instance.new("ScreenGui") gui.Name = "WOGSilentAim" gui.ResetOnSpawn = false gui.IgnoreGuiInset = false -- Use PlayerGui instead of CoreGui. -- Some executor threads lose permission to access UI instances after they are -- parented to CoreGui, which causes the "lacking capability Plugin" error. local playerGui = LP:WaitForChild("PlayerGui") gui.Parent = playerGui local frame = Instance.new("Frame") frame.Size = UDim2.fromOffset(320, 265) frame.Position = UDim2.new(0, 20, 0.5, -132) frame.BackgroundColor3 = Color3.fromRGB(23, 24, 29) frame.BorderSizePixel = 0 frame.Parent = gui Instance.new("UICorner", frame).CornerRadius = UDim.new(0, 7) local title = Instance.new("TextLabel") title.Size = UDim2.new(1, -16, 0, 30) title.Position = UDim2.fromOffset(8, 4) title.BackgroundTransparency = 1 title.Text = "Wings of Glory Silent Aim" title.TextColor3 = Color3.new(1, 1, 1) title.Font = Enum.Font.GothamBold title.TextSize = 13 title.TextXAlignment = Enum.TextXAlignment.Left title.Parent = frame local status = Instance.new("TextLabel") status.Size = UDim2.new(1, -16, 0, 150) status.Position = UDim2.fromOffset(8, 38) status.BackgroundColor3 = Color3.fromRGB(32, 33, 40) status.TextColor3 = Color3.fromRGB(220, 220, 225) status.Font = Enum.Font.Code status.TextSize = 11 status.TextXAlignment = Enum.TextXAlignment.Left status.TextYAlignment = Enum.TextYAlignment.Top status.Parent = frame Instance.new("UICorner", status).CornerRadius = UDim.new(0, 5) local toggle = Instance.new("TextButton") toggle.Size = UDim2.new(1, -16, 0, 30) toggle.Position = UDim2.fromOffset(8, 196) toggle.BackgroundColor3 = Color3.fromRGB(43, 44, 52) toggle.TextColor3 = Color3.new(1, 1, 1) toggle.Font = Enum.Font.GothamBold toggle.TextSize = 11 toggle.Parent = frame Instance.new("UICorner", toggle).CornerRadius = UDim.new(0, 5) local predictionToggle = Instance.new("TextButton") predictionToggle.Size = UDim2.new(1, -16, 0, 26) predictionToggle.Position = UDim2.fromOffset(8, 232) predictionToggle.BackgroundColor3 = Color3.fromRGB(43, 44, 52) predictionToggle.TextColor3 = Color3.new(1, 1, 1) predictionToggle.Font = Enum.Font.Gotham predictionToggle.TextSize = 10 predictionToggle.Parent = frame Instance.new("UICorner", predictionToggle).CornerRadius = UDim.new(0, 5) local function refreshButtons() toggle.Text = "Silent Aim: " .. (Config.SilentAimEnabled and "ON" or "OFF") .. " [T]" predictionToggle.Text = "Prediction: " .. (Config.PredictionEnabled and "ON" or "OFF") end toggle.MouseButton1Click:Connect(function() Config.SilentAimEnabled = not Config.SilentAimEnabled if Config.SilentAimEnabled then acquireGameTarget(true) end refreshButtons() end) predictionToggle.MouseButton1Click:Connect(function() Config.PredictionEnabled = not Config.PredictionEnabled refreshButtons() end) refreshButtons() -- FOV circle. local fovCircle = Instance.new("Frame") fovCircle.Name = "FOV" fovCircle.AnchorPoint = Vector2.new(0.5, 0.5) fovCircle.BackgroundTransparency = 1 fovCircle.BorderSizePixel = 0 fovCircle.Parent = gui local stroke = Instance.new("UIStroke") stroke.Thickness = 1 stroke.Transparency = 0.35 stroke.Parent = fovCircle local corner = Instance.new("UICorner") corner.CornerRadius = UDim.new(1, 0) corner.Parent = fovCircle task.spawn(function() while State.Running and gui.Parent do task.wait(0.1) local camera = Workspace.CurrentCamera if camera then local diameter = Config.FOVRadius * 2 fovCircle.Size = UDim2.fromOffset(diameter, diameter) fovCircle.Position = UDim2.fromOffset( camera.ViewportSize.X / 2, camera.ViewportSize.Y / 2 ) fovCircle.Visible = Config.DrawFOV and Config.SilentAimEnabled end status.Text = table.concat({ "Enabled: " .. tostring(Config.SilentAimEnabled), "Target: " .. tostring(State.CurrentTarget or "None"), "Hit Part: " .. tostring(Config.HitPart), "Distance: " .. ( State.TargetDistance < math.huge and string.format("%.0f", State.TargetDistance) or "None" ), "Screen Distance: " .. ( State.ScreenDistance < math.huge and string.format("%.0f", State.ScreenDistance) or "None" ), "FOV: " .. tostring(Config.FOVRadius), "Prediction: " .. tostring(Config.PredictionEnabled), "Ballistics: " .. tostring(Config.BallisticCompensation), "Gun Limit: " .. tostring( (Controls.gun and ArmamentData[Controls.gun] and ArmamentData[Controls.gun].DistLimit) or "Unknown" ), "Intercept: " .. string.format("%.3f", State.LastInterceptTime), "Projectile Speed: " .. string.format("%.1f", State.LastProjectileSpeed), "Target Speed: " .. string.format("%.1f", State.LastTargetSpeed), "Redirected Shots: " .. tostring(State.RedirectedShots), "Rejected: " .. tostring(State.RejectedReason), "Part Registry: " .. tostring(getViewModelFolder() and "OK" or "MISSING"), "", "T = Toggle | RightShift = Hide", }, "\n") end end) table.insert( State.Connections, UserInputService.InputBegan:Connect(function(input, processed) if processed then return end if input.KeyCode == Enum.KeyCode.T then Config.SilentAimEnabled = not Config.SilentAimEnabled if Config.SilentAimEnabled then acquireGameTarget(true) end refreshButtons() elseif input.KeyCode == Enum.KeyCode.RightShift then gui.Enabled = not gui.Enabled end end) ) local API = {} function API.SetEnabled(value) Config.SilentAimEnabled = not not value if Config.SilentAimEnabled then acquireGameTarget(true) end refreshButtons() end function API.SetFOV(value) Config.FOVRadius = math.clamp(tonumber(value) or Config.FOVRadius, 25, 2000) end function API.SetMaxDistance(value) Config.MaxDistance = math.max(100, tonumber(value) or Config.MaxDistance) end function API.SetHitPart(value) local allowed = { Fuselage = true, Engine = true, LeftWing = true, RightWing = true, ["Random Body Part"] = true, } if allowed[value] then Config.HitPart = value end end function API.Unload() State.Running = false -- Restore original game function. if Weapon.new_bullet ~= OriginalNewBullet then Weapon.new_bullet = OriginalNewBullet end for _, connection in ipairs(State.Connections) do pcall(function() connection:Disconnect() end) end if type(Controls.clear_aim_assist) == "function" then pcall(function() Controls.clear_aim_assist() end) end if gui and gui.Parent then gui:Destroy() end print("[WOG SilentAim V3.2] Unloaded") end API.Config = Config API.State = State API.Weapon = Weapon API.Controls = Controls ENV.WOG_SILENTAIM = API acquireGameTarget(true) print("[WOG SilentAim V3.2] Loaded") print("[WOG SilentAim] T = toggle")