Silent aim
Key Required

Silent aim

[v11.1 & EVENTS] Wings of Glory 🦅RNGPkRNGPk 1.1K views 1.7K executesUpdated Sep 18, 2026
5.0/ 5(1 votes)
10100% Positive
Lua Script•1011 lines (26293 chars)
-- 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")

Features & Information

-Silent Aim toggle -Team check -Visibility check
#wingsofglory#wog#silentaim

Community Comments (2)

GoyimWarriorGoyimWarriorSep 19, 2026(edited)

kinda mid icl, im using Real fyi idk how this is supposed to work but it just doesnt land shots at all, maybe its because im at tier 6+ but it still has autocannons

ppoo26892ppoo26892Sep 26, 2026

It works, but only within range.

More Scripts for [v11.1 & EVENTS] Wings of Glory 🦅