-- [[ Rscripts Risk Notice ]] -- This script is not verified by rscripts.net. Deal with caution. -- -- Stay safe: -- • Never log in on unofficial Roblox sites or lookalike domains. -- • Real Roblox links use roblox.com (check the .com ending). -- • Treat fake Roblox login / "claim reward" pages as phishing. -- [[ End Rscripts Risk Notice ]] local repo = "https://raw.githubusercontent.com/violin-suzutsuki/LinoriaLib/main/" local Library = loadstring(game:HttpGet(repo .. "Library.lua"))() local ThemeManager = loadstring(game:HttpGet(repo .. "addons/ThemeManager.lua"))() local SaveManager = loadstring(game:HttpGet(repo .. "addons/SaveManager.lua"))() local Players = game:GetService("Players") local RunService = game:GetService("RunService") local ReplicatedStorage = game:GetService("ReplicatedStorage") local CollectionService = game:GetService("CollectionService") local LocalPlayer = Players.LocalPlayer local Window = Library:CreateWindow({ Title = "Deagle Duels https://discord.gg/PZRvrEVdFF", Center = true, AutoShow = true, TabPadding = 8, MenuFadeTime = 0.2, }) local Tabs = { Combat = Window:AddTab("rage"), ["UI Settings"] = Window:AddTab("UI Settings"), } local Main = Tabs.Combat:AddLeftGroupbox("Auto Shoot") local Target = Tabs.Combat:AddRightGroupbox("Target") local Status = Tabs.Combat:AddRightGroupbox("Status") local StatusLabel = Status:AddLabel("Idle") local AutoShootToggle = Main:AddToggle("AutoShoot", { Text = "Auto Shoot", Default = false, Tooltip = "Автоматически отправляет remote выстрела по выбранному хитбоксу", }) AutoShootToggle:AddKeyPicker("AutoShootKey", { Default = "E", SyncToggleState = true, Mode = "Toggle", Text = "Auto Shoot", NoUI = true, }) Main:AddDivider() Main:AddToggle("VisibleCheck", { Text = "Visible Check (Raycast)", Default = true, Tooltip = "Стрелять только если хитбокс виден (raycast не упирается в стену)", }) Main:AddToggle("Wallbang", { Text = "Wallbang", Default = false, Tooltip = "Стрелять сквозь стены: игнорирует блокировку видимости. Сначала ищет видимую часть тела, если нет — шлёт хит по выбранному хитбоксу сквозь укрытие", }) Main:AddToggle("TeamCheck", { Text = "Team Check", Default = true, Tooltip = "Пропускать игроков из своей команды", }) Main:AddToggle("AutoReload", { Text = "Auto Reload", Default = true, Tooltip = "Перезаряжать через remote Reload, когда патроны кончились", }) Main:AddToggle("AutoEquip", { Text = "Auto Equip", Default = true, Tooltip = "Достать бластер, если он лежит в Backpack", }) Main:AddToggle("InstantReload", { Text = "Instant Reload", Default = false, Tooltip = "Мгновенная перезарядка: reloadTime = 0 и стрельба не блокируется на время перезарядки", }) Main:AddToggle("AutomaticGun", { Text = "Automatic Gun", Default = false, Tooltip = "Переводит оружие в авто-режим (fireMode = Auto)", }) Main:AddToggle("InfiniteAmmo", { Text = "Infinite Ammo", Default = false, Tooltip = "Держит _ammo на полной обойме и не даёт перезарядке блокировать стрельбу", }) Main:AddDivider() Main:AddSlider("MinDelay", { Text = "Минимальная задержка", Default = 0.02, Min = 0, Max = 0.5, Rounding = 2, Suffix = "s", Tooltip = "Пауза между выстрелами (в дополнение к rateOfFire оружия)", }) Main:AddToggle("FireRateChanger", { Text = "Fire Rate Changer", Default = false, Tooltip = "Переопределяет атрибут rateOfFire оружия (влияет и на родную стрельбу, и на auto shoot)", }) Main:AddSlider("FireRate", { Text = "Firerate", Default = 600, Min = 30, Max = 3000, Rounding = 0, Suffix = " rpm", Tooltip = "Скорострельность в выстрелах в минуту", }) Target:AddDropdown("Hitbox", { Values = { "Head", "UpperTorso", "Torso", "LowerTorso", "HumanoidRootPart", "LeftUpperArm", "RightUpperArm", "LeftUpperLeg", "RightUpperLeg", "Random", }, Default = "Head", Multi = false, Text = "Hitbox", Tooltip = "Часть тела, в которую целиться (с фолбэком R15 -> R6)", }) Target:AddSlider("FOV", { Text = "FOV", Default = 25, Min = 1, Max = 360, Rounding = 0, Suffix = "°", Tooltip = "Полный угол поля зрения от центра экрана", }) Target:AddSlider("MaxDistance", { Text = "Max Distance", Default = 500, Min = 10, Max = 2000, Rounding = 0, Tooltip = "Максимальная дистанция до цели", }) Target:AddDivider() Target:AddToggle("ShowFOV", { Text = "Show FOV Circle", Default = true, Tooltip = "Рисовать круг FOV", }) Target:AddToggle("ShowTarget", { Text = "Highlight Target", Default = true, Tooltip = "Подсвечивать выбранный хитбокс", }) local ESP = Tabs.Combat:AddRightGroupbox("Highlight ESP") ESP:AddToggle("HighlightESP", { Text = "Highlight ESP", Default = false, Tooltip = "Полная подсветка персонажей (Highlight: заливка + обводка)", }) ESP:AddToggle("ESPTeam", { Text = "Hide Teammates", Default = true, Tooltip = "Не рисовать ESP на тиммейтах", }) ESP:AddToggle("ESPThroughWalls", { Text = "Through Walls", Default = true, Tooltip = "Видно сквозь стены (AlwaysOnTop) или только в прямой видимости (Occluded)", }) ESP:AddSlider("ESPMaxDistance", { Text = "ESP Max Distance", Default = 1000, Min = 50, Max = 5000, Rounding = 0, Tooltip = "Максимальная дистанция отрисовки ESP", }) ESP:AddLabel("Enemy Fill"):AddColorPicker("EnemyFill", { Default = Color3.fromRGB(255, 60, 60), Transparency = 0.5, Title = "Enemy Fill", }) ESP:AddLabel("Enemy Outline"):AddColorPicker("EnemyOutline", { Default = Color3.fromRGB(255, 0, 0), Transparency = 0, Title = "Enemy Outline", }) -- ============================ CORE ============================ local Remotes = ReplicatedStorage:WaitForChild("Blaster", 60) Remotes = Remotes and Remotes:WaitForChild("Remotes", 60) local ShootRemote = Remotes and Remotes:WaitForChild("Shoot", 60) local ReloadRemote = Remotes and Remotes:WaitForChild("Reload", 60) if not ShootRemote then warn("[AutoShoot] Не найден ReplicatedStorage.Blaster.Remotes.Shoot") end local RANDOM_POOL = { "Head", "UpperTorso", "LowerTorso", "Torso", "HumanoidRootPart", "LeftUpperArm", "RightUpperArm", "LeftUpperLeg", "RightUpperLeg", } local function isBlaster(tool) if not (tool and tool:IsA("Tool")) then return false end return tool:GetAttribute("viewModel") ~= nil end local function getBlaster() local character = LocalPlayer.Character if not character then return nil end for _, child in ipairs(character:GetChildren()) do if isBlaster(child) then return child end end return nil end local function getBackpackBlaster() local backpack = LocalPlayer:FindFirstChild("Backpack") if not backpack then return nil end for _, child in ipairs(backpack:GetChildren()) do if isBlaster(child) then return child end end return nil end local function resolvePart(character, name) if name == "Random" then local list = {} for _, partName in ipairs(RANDOM_POOL) do local part = character:FindFirstChild(partName) if part and part:IsA("BasePart") then table.insert(list, part) end end if #list > 0 then return list[math.random(#list)] end return character:FindFirstChild("HumanoidRootPart") or character:FindFirstChildWhichIsA("BasePart") end local part = character:FindFirstChild(name) if part and part:IsA("BasePart") then return part end if name == "UpperTorso" or name == "LowerTorso" then part = character:FindFirstChild("Torso") elseif name == "Torso" then part = character:FindFirstChild("UpperTorso") or character:FindFirstChild("LowerTorso") elseif string.find(name, "Arm") or string.find(name, "Hand") or string.find(name, "Leg") or string.find(name, "Foot") then part = character:FindFirstChild("HumanoidRootPart") end return part or character:FindFirstChild("HumanoidRootPart") or character:FindFirstChildWhichIsA("BasePart") end local function makeRaycastParams() local params = RaycastParams.new() params.FilterType = Enum.RaycastFilterType.Exclude params.IgnoreWater = true local ignore = {} local ownCharacter = LocalPlayer.Character if ownCharacter then table.insert(ignore, ownCharacter) end for _, instance in ipairs(CollectionService:GetTagged("RayExclude")) do if instance then table.insert(ignore, instance) end end params.FilterDescendantsInstances = ignore return params end local function partSamplePoints(part) local halfSize = part.Size / 2 local cframe = part.CFrame local points = { cframe.Position } local offsets = { Vector3.new(halfSize.X, 0, 0), Vector3.new(-halfSize.X, 0, 0), Vector3.new(0, halfSize.Y, 0), Vector3.new(0, -halfSize.Y, 0), Vector3.new(0, 0, halfSize.Z), Vector3.new(0, 0, -halfSize.Z), } for _, offset in ipairs(offsets) do table.insert(points, (cframe * CFrame.new(offset)).Position) end return points end local function testPartVisible(origin, part, character, params) params = params or makeRaycastParams() for _, point in ipairs(partSamplePoints(part)) do local result = workspace:Raycast(origin, point - origin, params) if result and (result.Instance == part or result.Instance:IsDescendantOf(character)) then return result.Instance, result.Position end end return nil end local function raycastVisible(origin, part, character) local hitInstance, hitPosition = testPartVisible(origin, part, character) if hitInstance then return true, hitInstance, hitPosition end return false, nil, nil end local function findVisiblePart(character, origin, preferredPart) local params = makeRaycastParams() if preferredPart then local hitInstance, hitPosition = testPartVisible(origin, preferredPart, character, params) if hitInstance then return hitInstance, hitPosition end end for _, descendant in ipairs(character:GetDescendants()) do if descendant:IsA("BasePart") and descendant ~= preferredPart then local hitInstance, hitPosition = testPartVisible(origin, descendant, character, params) if hitInstance then return hitInstance, hitPosition end end end return nil end local function isTeammate(player) if not player or player == LocalPlayer then return false end local myTeam = LocalPlayer.Team local theirTeam = player.Team if myTeam and theirTeam and myTeam == theirTeam then return true end local myAttr = LocalPlayer:GetAttribute("CurrentTeam") or LocalPlayer:GetAttribute("Team") local theirAttr = player:GetAttribute("CurrentTeam") or player:GetAttribute("Team") if myAttr ~= nil and theirAttr ~= nil and myAttr == theirAttr then return true end return false end local function getTarget() local camera = workspace.CurrentCamera local character = LocalPlayer.Character if not (camera and character) then return nil end local origin = camera.CFrame.Position local look = camera.CFrame.LookVector local maxAngle = Options.FOV.Value / 2 local maxDist = Options.MaxDistance.Value local hitbox = Options.Hitbox.Value local teamCheck = Toggles.TeamCheck.Value local visibleCheck = Toggles.VisibleCheck.Value local wallbang = Toggles.Wallbang.Value local bestVisible, bestVisibleAngle = nil, maxAngle local bestBlocked, bestBlockedAngle = nil, maxAngle for _, player in ipairs(Players:GetPlayers()) do if player ~= LocalPlayer then local skip = teamCheck and isTeammate(player) local targetCharacter = player.Character local humanoid = targetCharacter and targetCharacter:FindFirstChildOfClass("Humanoid") if not skip and targetCharacter and humanoid and humanoid.Health > 0 then local part = resolvePart(targetCharacter, hitbox) if part then local pos = part.Position local dist = (pos - origin).Magnitude if dist <= maxDist then local dir = (pos - origin).Unit local angle = math.deg(math.acos(math.clamp(look:Dot(dir), -1, 1))) if angle <= maxAngle then local visible, hitInstance, hitPosition if visibleCheck then visible, hitInstance, hitPosition = raycastVisible(origin, part, targetCharacter) else visible, hitInstance, hitPosition = true, part, pos end local candidate = { player = player, character = targetCharacter, humanoid = humanoid, part = part, position = pos, hitInstance = hitInstance or part, hitPosition = hitPosition or pos, distance = dist, angle = angle, throughWall = false, } if visible then if angle < bestVisibleAngle then bestVisible = candidate bestVisibleAngle = angle end elseif wallbang then local visPart, visPos = findVisiblePart(targetCharacter, origin, part) if visPart then candidate.hitInstance = visPart candidate.hitPosition = visPos else candidate.throughWall = true end if angle < bestBlockedAngle then bestBlocked = candidate bestBlockedAngle = angle end end end end end end end end if bestVisible and bestBlocked then return (bestBlocked.angle < bestVisible.angle) and bestBlocked or bestVisible end return bestVisible or bestBlocked end local lastShot = 0 local fireInterval = 0.1 local originalRateOfFire = {} local function applyFireRateChanger(blaster) if not blaster then return end if Toggles.FireRateChanger.Value then if originalRateOfFire[blaster] == nil then originalRateOfFire[blaster] = blaster:GetAttribute("rateOfFire") end blaster:SetAttribute("rateOfFire", Options.FireRate.Value) elseif originalRateOfFire[blaster] ~= nil then blaster:SetAttribute("rateOfFire", originalRateOfFire[blaster]) originalRateOfFire[blaster] = nil end end local originalReloadTime = {} local originalFireMode = {} local originalAmmo = {} local function applyInfiniteAmmo(blaster) if not blaster then return end if Toggles.InfiniteAmmo.Value then local magazine = blaster:GetAttribute("magazineSize") or 999 if originalAmmo[blaster] == nil then originalAmmo[blaster] = blaster:GetAttribute("_ammo") end local current = blaster:GetAttribute("_ammo") if current == nil or current < magazine then blaster:SetAttribute("_ammo", magazine) end elseif originalAmmo[blaster] ~= nil then blaster:SetAttribute("_ammo", originalAmmo[blaster]) originalAmmo[blaster] = nil end end local function applyWeaponOverrides(blaster) if not blaster then return end if Toggles.InstantReload.Value then if originalReloadTime[blaster] == nil then originalReloadTime[blaster] = blaster:GetAttribute("reloadTime") end blaster:SetAttribute("reloadTime", 0) elseif originalReloadTime[blaster] ~= nil then blaster:SetAttribute("reloadTime", originalReloadTime[blaster]) originalReloadTime[blaster] = nil end if Toggles.AutomaticGun.Value then if originalFireMode[blaster] == nil then originalFireMode[blaster] = blaster:GetAttribute("fireMode") end blaster:SetAttribute("fireMode", "Auto") elseif originalFireMode[blaster] ~= nil then blaster:SetAttribute("fireMode", originalFireMode[blaster]) originalFireMode[blaster] = nil end end local function updateFireInterval(blaster) local rof = blaster:GetAttribute("rateOfFire") or 600 local interval = 60 / math.max(rof, 1) fireInterval = math.max(interval, Options.MinDelay.Value) end local function fireAt(blaster, target) local camera = workspace.CurrentCamera if not camera then return end local origin = camera.CFrame.Position local aimCFrame = CFrame.lookAt(origin, target.position) local key = "1" local humanoids = { [key] = target.humanoid } local hits = { [key] = { instance = target.hitInstance, position = target.hitPosition } } ShootRemote:FireServer(workspace:GetServerTimeNow(), blaster, aimCFrame, humanoids, hits) end local function tryReload(blaster) if not Toggles.AutoReload.Value or Toggles.InfiniteAmmo.Value then return false end local ammo = blaster:GetAttribute("_ammo") if ammo ~= nil and ammo > 0 then return false end local instant = Toggles.InstantReload.Value if blaster:GetAttribute("_reloading") == true and not instant then return true end if ReloadRemote then ReloadRemote:FireServer(blaster) return not instant end return false end -- ============================ VISUALS ============================ local espObjects = {} local function clearESP() for player, highlight in pairs(espObjects) do pcall(function() highlight:Destroy() end) espObjects[player] = nil end end local function updateESP() if not Toggles.HighlightESP.Value then if next(espObjects) then clearESP() end return end local camera = workspace.CurrentCamera local origin = camera and camera.CFrame.Position local maxDist = Options.ESPMaxDistance.Value local hideTeammates = Toggles.ESPTeam.Value local depth = Toggles.ESPThroughWalls.Value and Enum.HighlightDepthMode.AlwaysOnTop or Enum.HighlightDepthMode.Occluded local fillColor = Options.EnemyFill.Value local outlineColor = Options.EnemyOutline.Value local fillTransparency = Options.EnemyFill.Transparency or 0.5 local outlineTransparency = Options.EnemyOutline.Transparency or 0 for _, player in ipairs(Players:GetPlayers()) do if player ~= LocalPlayer then local character = player.Character local humanoid = character and character:FindFirstChildOfClass("Humanoid") local valid = character and humanoid and humanoid.Health > 0 if valid and hideTeammates and isTeammate(player) then valid = false end if valid and origin then local root = character:FindFirstChild("HumanoidRootPart") or character.PrimaryPart if root and (root.Position - origin).Magnitude > maxDist then valid = false end end local highlight = espObjects[player] if valid then if not highlight or highlight.Parent ~= character then if highlight then pcall(function() highlight:Destroy() end) end highlight = Instance.new("Highlight") highlight.Name = "AutoShootESP" highlight.Adornee = character highlight.Parent = character espObjects[player] = highlight end highlight.FillColor = fillColor highlight.FillTransparency = fillTransparency highlight.OutlineColor = outlineColor highlight.OutlineTransparency = outlineTransparency highlight.DepthMode = depth elseif highlight then pcall(function() highlight:Destroy() end) espObjects[player] = nil end end end for player, highlight in pairs(espObjects) do if not player.Parent then pcall(function() highlight:Destroy() end) espObjects[player] = nil end end end local fovCircle if Drawing then fovCircle = Drawing.new("Circle") fovCircle.Thickness = 1 fovCircle.NumSides = 60 fovCircle.Filled = false fovCircle.Transparency = 1 fovCircle.Color = Color3.fromRGB(0, 255, 140) fovCircle.Visible = false end local highlightBox local highlightedInstance local function updateHighlight(target) if highlightBox and (not target or target.part ~= highlightedInstance) then pcall(function() highlightBox:Destroy() end) highlightBox = nil highlightedInstance = nil end if not target or not Toggles.ShowTarget.Value then return end if not highlightBox and target.part then highlightedInstance = target.part local ok, box = pcall(function() local adornment = Instance.new("BoxHandleAdornment") adornment.Adornee = target.part adornment.AlwaysOnTop = true adornment.ZIndex = 5 adornment.Size = target.part.Size + Vector3.new(0.1, 0.1, 0.1) adornment.Color3 = Color3.fromRGB(255, 60, 60) adornment.Transparency = 0.5 adornment.Parent = (gethui and gethui()) or game:GetService("CoreGui") return adornment end) if ok then highlightBox = box else highlightedInstance = nil end end end local function updateFOVCircle() if not fovCircle then return end if not Toggles.ShowFOV.Value then fovCircle.Visible = false return end local camera = workspace.CurrentCamera if not camera then fovCircle.Visible = false return end local viewport = camera.ViewportSize local center = Vector2.new(viewport.X / 2, viewport.Y / 2) local radius = (math.tan(math.rad(Options.FOV.Value / 2)) / math.tan(math.rad(camera.FieldOfView / 2))) * (viewport.Y / 2) fovCircle.Position = center fovCircle.Radius = radius fovCircle.Visible = true end RunService.Heartbeat:Connect(function() updateFOVCircle() updateESP() local blaster = getBlaster() if not blaster and Toggles.AutoShoot.Value and Toggles.AutoEquip.Value then local backpackBlaster = getBackpackBlaster() local character = LocalPlayer.Character local humanoid = character and character:FindFirstChildOfClass("Humanoid") if backpackBlaster and humanoid then pcall(function() humanoid:EquipTool(backpackBlaster) end) blaster = backpackBlaster end end applyFireRateChanger(blaster) applyWeaponOverrides(blaster) applyInfiniteAmmo(blaster) if not Toggles.AutoShoot.Value or not ShootRemote then updateHighlight(nil) StatusLabel:SetText("Idle") return end if LocalPlayer:GetAttribute("RoundCountdownActive") == true then StatusLabel:SetText("Countdown...") return end if not blaster or blaster.Parent ~= LocalPlayer.Character then StatusLabel:SetText("Нет бластера в руках") updateHighlight(nil) return end if tryReload(blaster) then StatusLabel:SetText("Reloading...") updateHighlight(nil) return end updateFireInterval(blaster) local now = os.clock() if now - lastShot < fireInterval then return end local target = getTarget() if not target then StatusLabel:SetText("Нет цели") updateHighlight(nil) return end updateHighlight(target) StatusLabel:SetText(string.format("Цель: %s | %.0fm%s", target.player.Name, target.distance, target.throughWall and " | WALLBANG" or "")) fireAt(blaster, target) lastShot = now end) local MenuGroup = Tabs["UI Settings"]:AddLeftGroupbox("Menu") MenuGroup:AddButton("Unload", function() Library:Unload() end) MenuGroup:AddLabel("Menu bind"):AddKeyPicker("MenuKeybind", { Default = "End", NoUI = true, Text = "Menu keybind" }) Library.ToggleKeybind = Options.MenuKeybind ThemeManager:SetLibrary(Library) SaveManager:SetLibrary(Library) SaveManager:IgnoreThemeSettings() SaveManager:SetIgnoreIndexes({ "MenuKeybind" }) ThemeManager:SetFolder("DeagleDuels") SaveManager:SetFolder("DeagleDuels/autoshoot") SaveManager:BuildConfigSection(Tabs["UI Settings"]) ThemeManager:ApplyToTab(Tabs["UI Settings"]) Library:OnUnload(function() if fovCircle then pcall(function() fovCircle:Remove() end) end if highlightBox then pcall(function() highlightBox:Destroy() end) end clearESP() print("[AutoShoot] unloaded") end) SaveManager:LoadAutoloadConfig() if Library.Notify then Library:Notify("Auto Shoot загружен. Клавиша E.", 4) end print("[AutoShoot] loaded")