Aller au contenu
Fonctionnel

Project Remix - Silent Aim

CLclarkdevlinorg0 vuesUniversal26 juil. 2026
Partager
Project Remix - Silent Aim

Code du script

Lua
-- init
if not game:IsLoaded() then
    game.Loaded:Wait()
end

if not syn or not protectgui then
    getgenv().protectgui = function() end
end

--[[
    Universal Silent Aim -> adapted for "Project Remix [Gun Game]" (place 15073271237)
    Executor target: Volt (docs.voltbz.net)

    Why this differs from the generic Universal Silent Aim:
      * Project Remix guns are HITSCAN via the game's own DamageService:Bulletcast /
        :PierceBulletcast (main-thread), NOT workspace:Raycast / FindPartOnRay / Mouse.Hit.
      * Projectile weapons (rockets / thrown / katana) fire via ProjectileService.NewProjectile.
      * Hit registration is CLIENT-AUTHORITATIVE: the weapon resolves the hit part with
        DamageService:GetHitTarget and applies damage with DamageService:Damage itself,
        so bending the cast direction (or projectile velocity) toward a target lands the hit.
      * The generic build hooked game.__namecall / Mouse.__index, which never intercept the
        game's custom cast methods (and the bullet SIMULATION runs inside a parallel Actor VM
        that main-thread hooks can't reach) -- so it did nothing here. This build hooks the
        real chokepoints instead.
]]

local SilentAimSettings = {
    Enabled = false,

    ClassName = "Project Remix Silent Aim - Averiias, Stefanuk12, xaxa (Bulletcast port)",
    ToggleKey = "RightAlt",

    TeamCheck = false,
    VisibleCheck = false,
    Wallbang = false,
    TargetPart = "HumanoidRootPart",

    FOVRadius = 130,
    FOVVisible = false,
    ShowSilentAimTarget = false,

    ProjectilePrediction = false,
    ProjectilePredictionAmount = 0.165,
    HitChance = 100
}

-- variables
getgenv().SilentAimSettings = SilentAimSettings
local MainFileName = "UniversalSilentAim"
local FileToSave = ""

local Camera = workspace.CurrentCamera
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local GuiService = game:GetService("GuiService")
local UserInputService = game:GetService("UserInputService")
local HttpService = game:GetService("HttpService")

local LocalPlayer = Players.LocalPlayer

local GetPlayers = Players.GetPlayers
local WorldToViewportPoint = Camera.WorldToViewportPoint
local GetPartsObscuringTarget = Camera.GetPartsObscuringTarget
local FindFirstChild = game.FindFirstChild
local RenderStepped = RunService.RenderStepped
local GetMouseLocation = UserInputService.GetMouseLocation

local resume = coroutine.resume
local create = coroutine.create

local ValidTargetParts = {"Head", "HumanoidRootPart"}
local PredictionAmount = 0.165

local mouse_box = Drawing.new("Square")
mouse_box.Visible = false
mouse_box.ZIndex = 999
mouse_box.Color = Color3.fromRGB(54, 57, 241)
mouse_box.Thickness = 20
mouse_box.Size = Vector2.new(20, 20)
mouse_box.Filled = true

local fov_circle = Drawing.new("Circle")
fov_circle.Thickness = 1
fov_circle.NumSides = 100
fov_circle.Radius = 180
fov_circle.Filled = false
fov_circle.Visible = false
fov_circle.ZIndex = 999
fov_circle.Transparency = 1
fov_circle.Color = Color3.fromRGB(54, 57, 241)

-- resolve the game's framework services (Volt: getrenv exposes the game's real _G)
local GameGlobal = getrenv()._G
local DamageService, ProjectileService
do
    local ok = pcall(function()
        DamageService = GameGlobal:GetService("DamageService")
        ProjectileService = GameGlobal:GetService("ProjectileService")
    end)
    if not ok or not DamageService then
        warn("[SilentAim] Could not resolve DamageService/ProjectileService -- game framework changed?")
    end
end

function CalculateChance(Percentage)
    -- // Floor the percentage
    Percentage = math.floor(Percentage)

    -- // Get the chance
    local chance = math.floor(Random.new():NextNumber(0, 1) * 100) / 100

    -- // Return
    return chance <= Percentage / 100
end

--[[file handling]] do
    if not isfolder(MainFileName) then
        makefolder(MainFileName)
    end

    if not isfolder(string.format("%s/%s", MainFileName, tostring(game.PlaceId))) then
        makefolder(string.format("%s/%s", MainFileName, tostring(game.PlaceId)))
    end
end

-- functions
local function GetFiles() -- credits to the linoria lib for this function, listfiles returns the files full path and its annoying
    local out = {}
    local Files = listfiles(string.format("%s/%s", MainFileName, tostring(game.PlaceId)))
    for i = 1, #Files do
        local file = Files[i]
        if file:sub(-4) == '.lua' then
            local pos = file:find('.lua', 1, true)
            local start = pos

            local char = file:sub(pos, pos)
            while char ~= '/' and char ~= '\\' and char ~= '' do
                pos = pos - 1
                char = file:sub(pos, pos)
            end

            if char == '/' or char == '\\' then
                table.insert(out, file:sub(pos + 1, start - 1))
            end
        end
    end

    return out
end

local function UpdateFile(FileName)
    assert(FileName and FileName ~= "", "oopsies")
    writefile(string.format("%s/%s/%s.lua", MainFileName, tostring(game.PlaceId), FileName), HttpService:JSONEncode(SilentAimSettings))
end

local function LoadFile(FileName)
    assert(FileName and FileName ~= "", "oopsies")

    local File = string.format("%s/%s/%s.lua", MainFileName, tostring(game.PlaceId), FileName)
    local ConfigData = HttpService:JSONDecode(readfile(File))
    for Index, Value in next, ConfigData do
        SilentAimSettings[Index] = Value
    end
end

local function getPositionOnScreen(Vector)
    -- WorldToViewportPoint matches UserInputService:GetMouseLocation (both include the GUI inset)
    local Vec3, OnScreen = WorldToViewportPoint(Camera, Vector)
    return Vector2.new(Vec3.X, Vec3.Y), OnScreen
end

local function getMousePosition()
    return GetMouseLocation(UserInputService)
end

-- Project Remix characters live in workspace.Characters. The authoritative root is a
-- top-level HumanoidRootPart (CollisionGroup "PlayerRoot"); the visible/hittable R15 limbs
-- (CollisionGroup "Hitbox") sit under a "Playermodel" submodel, with the head as "HeadHitbox".
local function isDead(Character)
    local health = Character:GetAttribute("Health")
    if health ~= nil then
        return health <= 0
    end
    local humanoid = Character:FindFirstChildOfClass("Humanoid")
    if humanoid then
        return humanoid.Health <= 0
    end
    return false
end

local function resolvePart(Character, partName)
    if partName == "Head" then
        local playermodel = FindFirstChild(Character, "Playermodel")
        if playermodel then
            return FindFirstChild(playermodel, "HeadHitbox")
                or FindFirstChild(playermodel, "Head")
                or FindFirstChild(playermodel, "UpperTorso")
                or FindFirstChild(Character, "HumanoidRootPart")
        end
        return FindFirstChild(Character, "HumanoidRootPart")
    end
    -- default / HumanoidRootPart
    return FindFirstChild(Character, "HumanoidRootPart")
        or (FindFirstChild(Character, "Playermodel") and FindFirstChild(FindFirstChild(Character, "Playermodel"), "UpperTorso"))
end

local function getAimPart(Character)
    local target = Options and Options.TargetPart.Value or SilentAimSettings.TargetPart
    if target == "Random" then
        target = ValidTargetParts[math.random(1, #ValidTargetParts)]
    end
    return resolvePart(Character, target)
end

-- Project Remix does NOT use Roblox's native Player.Team (always nil). Teams are a player
-- attribute "Team" (integer), only meaningful when workspace attribute "TeamsEnabled" is true
-- (FFA modes leave it false, so every player is a valid target regardless of Team).
local function isSameTeam(Player)
    if not workspace:GetAttribute("TeamsEnabled") then return false end
    local myTeam = LocalPlayer:GetAttribute("Team")
    local theirTeam = Player:GetAttribute("Team")
    return myTeam ~= nil and theirTeam ~= nil and myTeam == theirTeam
end

local function IsCharacterVisible(Character, Root)
    local LocalCharacter = LocalPlayer.Character
    if not LocalCharacter then return true end

    local CastPoints = {Root.Position, LocalCharacter, Character}
    local IgnoreList = {LocalCharacter, Character}
    local Obscuring = #GetPartsObscuringTarget(Camera, CastPoints, IgnoreList)
    return Obscuring == 0
end

-- returns the BasePart to aim at (respecting FOV / team / visible / health checks)
local function getTarget()
    local mousePosition = getMousePosition()
    local radius = (Options and Options.Radius.Value) or SilentAimSettings.FOVRadius or 2000

    local closestPart
    local closestCharacter
    local closestDistance

    for _, Player in next, GetPlayers(Players) do
        if Player == LocalPlayer then continue end
        if Options and Toggles.TeamCheck.Value and isSameTeam(Player) then continue end

        local Character = Player.Character
        if not Character then continue end
        if isDead(Character) then continue end

        local Root = FindFirstChild(Character, "HumanoidRootPart")
        if not Root then continue end

        -- Wallbang bypasses the line-of-sight requirement (the cast is redirected to ignore geometry)
        if Options and Toggles.VisibleCheck.Value and not (Toggles.Wallbang and Toggles.Wallbang.Value)
            and not IsCharacterVisible(Character, Root) then continue end

        local ScreenPosition, OnScreen = getPositionOnScreen(Root.Position)
        if not OnScreen then continue end

        local Distance = (mousePosition - ScreenPosition).Magnitude
        if Distance <= radius and (not closestDistance or Distance < closestDistance) then
            local aimPart = getAimPart(Character)
            if aimPart then
                closestDistance = Distance
                closestPart = aimPart
                closestCharacter = Character
            end
        end
    end

    return closestPart, closestCharacter
end

-- ui creating & handling
local Library = loadstring(game:HttpGet("https://raw.githubusercontent.com/violin-suzutsuki/LinoriaLib/main/Library.lua"))()
Library:SetWatermark("github.com/Averiias")

local Window = Library:CreateWindow({Title = 'Project Remix Silent Aim', Center = true, AutoShow = true, TabPadding = 8, MenuFadeTime = 0.2})
local GeneralTab = Window:AddTab("General")
local MainBOX = GeneralTab:AddLeftTabbox("Main") do
    local Main = MainBOX:AddTab("Main")

    Main:AddToggle("aim_Enabled", {Text = "Enabled"}):AddKeyPicker("aim_Enabled_KeyPicker", {Default = "RightAlt", SyncToggleState = true, Mode = "Toggle", Text = "Enabled", NoUI = false})
    Options.aim_Enabled_KeyPicker:OnClick(function()
        SilentAimSettings.Enabled = not SilentAimSettings.Enabled

        Toggles.aim_Enabled.Value = SilentAimSettings.Enabled
        Toggles.aim_Enabled:SetValue(SilentAimSettings.Enabled)

        mouse_box.Visible = SilentAimSettings.Enabled and Toggles.MousePosition.Value
    end)

    Main:AddToggle("TeamCheck", {Text = "Team Check", Default = SilentAimSettings.TeamCheck}):OnChanged(function()
        SilentAimSettings.TeamCheck = Toggles.TeamCheck.Value
    end)
    Main:AddToggle("VisibleCheck", {Text = "Visible Check", Default = SilentAimSettings.VisibleCheck}):OnChanged(function()
        SilentAimSettings.VisibleCheck = Toggles.VisibleCheck.Value
    end)
    Main:AddToggle("Wallbang", {Text = "Wallbang", Tooltip = "Redirects the shot to ignore geometry so it hits the target through walls (hitscan guns).", Default = SilentAimSettings.Wallbang}):OnChanged(function()
        SilentAimSettings.Wallbang = Toggles.Wallbang.Value
    end)
    Main:AddDropdown("TargetPart", {AllowNull = true, Text = "Target Part", Default = SilentAimSettings.TargetPart, Values = {"Head", "HumanoidRootPart", "Random"}}):OnChanged(function()
        SilentAimSettings.TargetPart = Options.TargetPart.Value
    end)
    Main:AddSlider('HitChance', {
        Text = 'Hit chance',
        Default = 100,
        Min = 0,
        Max = 100,
        Rounding = 1,

        Compact = false,
    })
    Options.HitChance:OnChanged(function()
        SilentAimSettings.HitChance = Options.HitChance.Value
    end)
end

local MiscellaneousBOX = GeneralTab:AddLeftTabbox("Miscellaneous")
local FieldOfViewBOX = GeneralTab:AddLeftTabbox("Field Of View") do
    local Main = FieldOfViewBOX:AddTab("Visuals")

    Main:AddToggle("Visible", {Text = "Show FOV Circle"}):AddColorPicker("Color", {Default = Color3.fromRGB(54, 57, 241)}):OnChanged(function()
        fov_circle.Visible = Toggles.Visible.Value
        SilentAimSettings.FOVVisible = Toggles.Visible.Value
    end)
    Main:AddSlider("Radius", {Text = "FOV Circle Radius", Min = 0, Max = 360, Default = 130, Rounding = 0}):OnChanged(function()
        fov_circle.Radius = Options.Radius.Value
        SilentAimSettings.FOVRadius = Options.Radius.Value
    end)
    Main:AddToggle("MousePosition", {Text = "Show Silent Aim Target"}):AddColorPicker("MouseVisualizeColor", {Default = Color3.fromRGB(54, 57, 241)}):OnChanged(function()
        mouse_box.Visible = Toggles.MousePosition.Value and Toggles.aim_Enabled.Value
        mouse_box.Color = Options.MouseVisualizeColor.Value
        SilentAimSettings.ShowSilentAimTarget = Toggles.MousePosition.Value
    end)
    local PredictionTab = MiscellaneousBOX:AddTab("Prediction")
    PredictionTab:AddToggle("Prediction", {Text = "Projectile Lead Prediction", Tooltip = "Only affects projectile weapons (rockets / thrown). Hitscan guns are instant and need no lead."}):OnChanged(function()
        SilentAimSettings.ProjectilePrediction = Toggles.Prediction.Value
    end)
    PredictionTab:AddSlider("Amount", {Text = "Prediction Amount", Min = 0.165, Max = 1, Default = 0.165, Rounding = 3}):OnChanged(function()
        PredictionAmount = Options.Amount.Value
        SilentAimSettings.ProjectilePredictionAmount = Options.Amount.Value
    end)
end

local CreateConfigurationBOX = GeneralTab:AddRightTabbox("Create Configuration") do
    local Main = CreateConfigurationBOX:AddTab("Create Configuration")

    Main:AddInput("CreateConfigTextBox", {Default = "", Numeric = false, Finished = false, Text = "Create Configuration to Create", Tooltip = "Creates a configuration file containing settings you can save and load", Placeholder = "File Name here"}):OnChanged(function()
        if Options.CreateConfigTextBox.Value and string.len(Options.CreateConfigTextBox.Value) ~= 0 then
            FileToSave = Options.CreateConfigTextBox.Value
        end
    end)

    Main:AddButton("Create Configuration File", function()
        if FileToSave ~= "" and FileToSave ~= nil then
            UpdateFile(FileToSave)
        end
    end)
end

local SaveConfigurationBOX = GeneralTab:AddRightTabbox("Save Configuration") do
    local Main = SaveConfigurationBOX:AddTab("Save Configuration")
    Main:AddDropdown("SaveConfigurationDropdown", {AllowNull = true, Values = GetFiles(), Text = "Choose Configuration to Save"})
    Main:AddButton("Save Configuration", function()
        if Options.SaveConfigurationDropdown.Value then
            UpdateFile(Options.SaveConfigurationDropdown.Value)
        end
    end)
end

local LoadConfigurationBOX = GeneralTab:AddRightTabbox("Load Configuration") do
    local Main = LoadConfigurationBOX:AddTab("Load Configuration")

    Main:AddDropdown("LoadConfigurationDropdown", {AllowNull = true, Values = GetFiles(), Text = "Choose Configuration to Load"})
    Main:AddButton("Load Configuration", function()
        if table.find(GetFiles(), Options.LoadConfigurationDropdown.Value) then
            LoadFile(Options.LoadConfigurationDropdown.Value)

            Toggles.TeamCheck:SetValue(SilentAimSettings.TeamCheck)
            Toggles.VisibleCheck:SetValue(SilentAimSettings.VisibleCheck)
            Toggles.Wallbang:SetValue(SilentAimSettings.Wallbang)
            Options.TargetPart:SetValue(SilentAimSettings.TargetPart)
            Toggles.Visible:SetValue(SilentAimSettings.FOVVisible)
            Options.Radius:SetValue(SilentAimSettings.FOVRadius)
            Toggles.MousePosition:SetValue(SilentAimSettings.ShowSilentAimTarget)
            Toggles.Prediction:SetValue(SilentAimSettings.ProjectilePrediction)
            Options.Amount:SetValue(SilentAimSettings.ProjectilePredictionAmount)
            Options.HitChance:SetValue(SilentAimSettings.HitChance)
        end
    end)
end

resume(create(function()
    RenderStepped:Connect(function()
        if Toggles.MousePosition.Value and Toggles.aim_Enabled.Value then
            local part = getTarget()
            if part then
                local root = (part.Parent and part.Parent:IsA("Model") and part.Parent.PrimaryPart) or part
                local ViewportPoint, IsOnScreen = WorldToViewportPoint(Camera, root.Position)

                mouse_box.Visible = IsOnScreen
                mouse_box.Position = Vector2.new(ViewportPoint.X, ViewportPoint.Y)
            else
                mouse_box.Visible = false
                mouse_box.Position = Vector2.new()
            end
        end

        if Toggles.Visible.Value then
            fov_circle.Visible = Toggles.Visible.Value
            fov_circle.Color = Options.Color.Value
            fov_circle.Position = getMousePosition()
        end
    end)
end))

-- hooks
-- Guns are hitscan: DamageService:Bulletcast(self, origin, radius, direction, params, name)
-- and :PierceBulletcast(self, origin, radius, direction, params). We bend `direction` toward
-- the target (preserving its magnitude = weapon range). The cast then returns the target's
-- hitbox, the weapon resolves the player with GetHitTarget and applies damage itself.
--
-- Wallbang: bending the direction alone still lets the cast stop on a wall between the muzzle
-- and the target. When Wallbang is on we swap in a RaycastParams that ONLY includes the target
-- character (Include filter), so the ray ignores all geometry and lands on the target's hitbox.
-- Body damage is applied client-side, so this registers through walls.
local function wallbangParams(character)
    local params = RaycastParams.new()
    params.FilterType = Enum.RaycastFilterType.Include
    params.FilterDescendantsInstances = { character }
    params.RespectCanCollide = false
    params.IgnoreWater = true
    return params
end

-- redirects a hitscan cast at the current target; returns (direction, params) to pass through
local function aimCast(origin, direction, params)
    if typeof(origin) ~= "Vector3" or typeof(direction) ~= "Vector3" or direction.Magnitude == 0 then
        return direction, params
    end
    local part, character = getTarget()
    if not part then return direction, params end

    direction = (part.Position - origin).Unit * direction.Magnitude
    if Toggles.Wallbang and Toggles.Wallbang.Value and character then
        params = wallbangParams(character)
    end
    return direction, params
end

local shouldAim = function()
    return Toggles.aim_Enabled.Value and not checkcaller() and CalculateChance(SilentAimSettings.HitChance)
end

if DamageService then
    local oldBulletcast
    oldBulletcast = hookfunction(DamageService.Bulletcast, newcclosure(function(self, origin, radius, direction, params, name)
        if shouldAim() then
            direction, params = aimCast(origin, direction, params)
        end
        return oldBulletcast(self, origin, radius, direction, params, name)
    end))

    local oldPierce
    oldPierce = hookfunction(DamageService.PierceBulletcast, newcclosure(function(self, origin, radius, direction, params)
        if shouldAim() then
            direction, params = aimCast(origin, direction, params)
        end
        return oldPierce(self, origin, radius, direction, params)
    end))
end

-- Projectile weapons: ProjectileService.NewProjectile(Player, Type, Position, Velocity, ...)
-- Bend the initial Velocity toward the target (preserving speed). Optional linear lead
-- prediction accounts for projectile travel time.
if ProjectileService then
    local oldNewProjectile
    oldNewProjectile = hookfunction(ProjectileService.NewProjectile, newcclosure(function(player, projectileType, position, velocity, ...)
        if shouldAim() and typeof(position) == "Vector3" and typeof(velocity) == "Vector3" and velocity.Magnitude > 0 then
            local part = getTarget()
            if part then
                local aimPoint = part.Position
                if Toggles.Prediction.Value then
                    local targetVelocity = part.AssemblyLinearVelocity
                    local speed = velocity.Magnitude
                    if speed > 0 then
                        local travelTime = (aimPoint - position).Magnitude / speed
                        aimPoint = aimPoint + targetVelocity * (travelTime + PredictionAmount)
                    end
                end
                velocity = (aimPoint - position).Unit * velocity.Magnitude
            end
        end
        return oldNewProjectile(player, projectileType, position, velocity, ...)
    end))
end

Description

Silent Aim for Project Remix, based on Averiias's Universal Silent Aim script on [GitHub](https://github.com/Averiias/Universal-SilentAim).

Commentaires (0)

Connectez-vous pour participer à la conversation

  • Soyez le premier à commenter.

Questions fréquentes

Comment utiliser le script Project Remix - Silent Aim ?
Copiez le code ci-dessus, ouvrez votre exécuteur Roblox, collez le code et appuyez sur exécuter pendant que vous êtes dans le jeu. Les fonctionnalités s'activent instantanément une fois le script lancé.
Le script Project Remix - Silent Aim est-il gratuit ?
Oui. Ce script est gratuit à copier et utiliser. S'il utilise un système de clé, suivez le lien « Obtenir la clé » pour le débloquer gratuitement.
Le script Project Remix - Silent Aim est-il sûr à utiliser ?
Le code source complet est affiché sur cette page pour que vous puissiez lire exactement ce qu'il fait avant de l'exécuter. Utilisez toujours un exécuteur de confiance, et n'oubliez pas que l'utilisation de scripts est contraire aux conditions d'utilisation de Roblox — utilisez-les à vos propres risques.
Quel exécuteur fonctionne avec Project Remix - Silent Aim ?
Ce script fonctionne avec la plupart des exécuteurs Roblox populaires. Consultez notre page d'exécuteurs pour trouver un exécuteur gratuit ou payant fiable pour votre appareil.
Project Remix - Silent Aim | BloxScripter