
Keyless

-- 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")
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
It works, but only within range.