From e3f8291d75203be859b2dbc1b2bd7c4ceea42715 Mon Sep 17 00:00:00 2001 From: admin Date: Tue, 24 Feb 2026 15:03:10 +0000 Subject: [PATCH] Update main.lua --- main.lua | 159 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 154 insertions(+), 5 deletions(-) diff --git a/main.lua b/main.lua index 8c68134..9397fc3 100644 --- a/main.lua +++ b/main.lua @@ -106,6 +106,7 @@ local DEFAULT_SETTINGS = { espRefreshMs = 150, espMaxDistance = 1500, espInactiveDetection = false, + multiSelectMode = false, teleportViewKey = "V", teleportPointKey = "Equals", @@ -238,6 +239,7 @@ local function loadSettings() settings.espRefreshMs = math.floor(clampNumber(parsed.espRefreshMs, 33, 500, settings.espRefreshMs) + 0.5) settings.espMaxDistance = math.floor(clampNumber(parsed.espMaxDistance, 50, 10000, settings.espMaxDistance) + 0.5) settings.espInactiveDetection = readBoolean(parsed.espInactiveDetection, settings.espInactiveDetection) + settings.multiSelectMode = readBoolean(parsed.multiSelectMode, settings.multiSelectMode) settings.teleportViewKey = normaliseKeyName(parsed.teleportViewKey, settings.teleportViewKey) settings.teleportPointKey = normaliseKeyName(parsed.teleportPointKey, settings.teleportPointKey) @@ -727,6 +729,7 @@ refreshKeyObjects() local trackedPlayers = {} local selectedTeleportPlayerUserId = nil +local selectedTeleportPlayerUserIds = {} local function rebuildTrackedPlayers() trackedPlayers = {} @@ -742,6 +745,10 @@ local function removeTrackedPlayer(player) selectedTeleportPlayerUserId = nil end + if player then + selectedTeleportPlayerUserIds[player.UserId] = nil + end + for index = #trackedPlayers, 1, -1 do if trackedPlayers[index] == player then table.remove(trackedPlayers, index) @@ -913,7 +920,12 @@ local function getSelectedTeleportPlayerLabel() return "No players" end - return string.format("%d/%d %s", index, #trackedPlayers, player.Name) + local suffix = "" + if settings.multiSelectMode and selectedTeleportPlayerUserIds[player.UserId] then + suffix = " [Selected]" + end + + return string.format("%d/%d %s%s", index, #trackedPlayers, player.Name, suffix) end local function cycleTeleportPlayer() @@ -929,6 +941,93 @@ local function cycleTeleportPlayer() selectedTeleportPlayerUserId = selectedPlayer and selectedPlayer.UserId or nil end +local function isTeleportPlayerInSelection(player) + if not player then + return false + end + + return selectedTeleportPlayerUserIds[player.UserId] == true +end + +local function toggleSelectedTeleportPlayerInSelection() + local player = getSelectedTeleportPlayer() + if not player then + return false + end + + local userId = player.UserId + if selectedTeleportPlayerUserIds[userId] then + selectedTeleportPlayerUserIds[userId] = nil + else + selectedTeleportPlayerUserIds[userId] = true + end + + return true +end + +local function clearTeleportPlayerSelection() + selectedTeleportPlayerUserIds = {} +end + +local function getMultiSelectedTeleportPlayers() + local selectedPlayers = {} + + for _, player in ipairs(trackedPlayers) do + if selectedTeleportPlayerUserIds[player.UserId] then + selectedPlayers[#selectedPlayers + 1] = player + end + end + + return selectedPlayers +end + +local function getMultiSelectedTeleportPlayersLabel() + if not settings.multiSelectMode then + return "Mode Off" + end + + local selectedPlayers = getMultiSelectedTeleportPlayers() + if #selectedPlayers < 1 then + return "None" + end + + if #selectedPlayers == 1 then + return selectedPlayers[1].Name + end + + return tostring(#selectedPlayers) .. " players" +end + +local function getCurrentSelectionActionLabel() + if not settings.multiSelectMode then + return "Mode Off" + end + + local player = getSelectedTeleportPlayer() + if not player then + return "No players" + end + + if isTeleportPlayerInSelection(player) then + return "Remove" + end + + return "Add" +end + +local function getSniperTargetPlayers() + if settings.multiSelectMode then + return getMultiSelectedTeleportPlayers() + end + + local selectedPlayer = getSelectedTeleportPlayer() + if selectedPlayer then + return {selectedPlayer} + end + + return {} +end + local function teleportToSelectedPlayer() local player = getSelectedTeleportPlayer() if not player then @@ -1005,12 +1104,11 @@ local function fireSingleShot() return ok end -local function sniperKillSelectedPlayer() +local function sniperKillPlayer(player) if birdTeleportActive then return false end - local player = getSelectedTeleportPlayer() if not player then return false end @@ -1090,6 +1188,22 @@ local function sniperKillSelectedPlayer() return shotCount > 0 end +local function sniperKillSelectedPlayers() + local targetPlayers = getSniperTargetPlayers() + if #targetPlayers < 1 then + return false + end + + local didAny = false + for _, player in ipairs(targetPlayers) do + if sniperKillPlayer(player) then + didAny = true + end + end + + return didAny +end + local function teleportToView() local hit = Mouse and Mouse.Hit if not hit then @@ -1909,6 +2023,11 @@ local function updateEsp() local useDistanceIndicator = showTracers and settings.espDistanceIndicator local nowTime = os.clock() local inactivePlayers = settings.espInactiveDetection and {} or nil + local trackedLookup = {} + + for _, trackedPlayer in ipairs(trackedPlayers) do + trackedLookup[trackedPlayer] = true + end local nearestDistance = nil local furthestDistance = nil @@ -2036,6 +2155,12 @@ local function updateEsp() end end end + + for player in pairs(espEntries) do + if not trackedLookup[player] or player.Parent ~= Players then + destroyEspEntry(player) + end + end end local function isSameTeam(otherPlayer) @@ -2267,6 +2392,13 @@ end, function(state) saveSettings() end) +addToggleRow(PlayersPage, "Multi Select Mode", function() + return settings.multiSelectMode +end, function(state) + settings.multiSelectMode = state + saveSettings() +end) + if not hasDrawing then addActionRow(PlayersPage, "Drawing API", "Unavailable", function() end) @@ -2311,12 +2443,28 @@ end, function() cycleTeleportPlayer() end) +addDynamicActionRow(TeleportPage, "Selection Action", function() + return getCurrentSelectionActionLabel() +end, function() + if settings.multiSelectMode then + toggleSelectedTeleportPlayerInSelection() + end +end) + +addDynamicActionRow(TeleportPage, "Selected Players", function() + return getMultiSelectedTeleportPlayersLabel() +end, function() + if settings.multiSelectMode then + clearTeleportPlayerSelection() + end +end) + addActionRow(TeleportPage, "Teleport to Selected Player", "Teleport", function() teleportToSelectedPlayer() end) addActionRow(TeleportPage, "Sniper Kill Selected Player", "Execute", function() - task.spawn(sniperKillSelectedPlayer) + task.spawn(sniperKillSelectedPlayers) end) addToggleRow(TeleportPage, "Sniper Stay Hidden", function() @@ -2402,6 +2550,7 @@ addActionRow(ConfigPage, "Reset", "Defaults", function() selectedTeleportPointIndex = 1 selectedTeleportPlayerIndex = 1 selectedTeleportPlayerUserId = nil + selectedTeleportPlayerUserIds = {} MainFrame.Visible = settings.uiVisible applyCameraMode() @@ -2496,7 +2645,7 @@ trackConnection(UserInputService.InputBegan:Connect(function(input, gameProcesse end if input.UserInputType == Enum.UserInputType.Keyboard and isBoundKeyPressed(input.KeyCode, currentSniperKillKey) then - task.spawn(sniperKillSelectedPlayer) + task.spawn(sniperKillSelectedPlayers) return end