Update main.lua

This commit is contained in:
2026-02-24 15:03:10 +00:00
parent b2193cc038
commit e3f8291d75

159
main.lua
View File

@@ -106,6 +106,7 @@ local DEFAULT_SETTINGS = {
espRefreshMs = 150, espRefreshMs = 150,
espMaxDistance = 1500, espMaxDistance = 1500,
espInactiveDetection = false, espInactiveDetection = false,
multiSelectMode = false,
teleportViewKey = "V", teleportViewKey = "V",
teleportPointKey = "Equals", teleportPointKey = "Equals",
@@ -238,6 +239,7 @@ local function loadSettings()
settings.espRefreshMs = math.floor(clampNumber(parsed.espRefreshMs, 33, 500, settings.espRefreshMs) + 0.5) 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.espMaxDistance = math.floor(clampNumber(parsed.espMaxDistance, 50, 10000, settings.espMaxDistance) + 0.5)
settings.espInactiveDetection = readBoolean(parsed.espInactiveDetection, settings.espInactiveDetection) settings.espInactiveDetection = readBoolean(parsed.espInactiveDetection, settings.espInactiveDetection)
settings.multiSelectMode = readBoolean(parsed.multiSelectMode, settings.multiSelectMode)
settings.teleportViewKey = normaliseKeyName(parsed.teleportViewKey, settings.teleportViewKey) settings.teleportViewKey = normaliseKeyName(parsed.teleportViewKey, settings.teleportViewKey)
settings.teleportPointKey = normaliseKeyName(parsed.teleportPointKey, settings.teleportPointKey) settings.teleportPointKey = normaliseKeyName(parsed.teleportPointKey, settings.teleportPointKey)
@@ -727,6 +729,7 @@ refreshKeyObjects()
local trackedPlayers = {} local trackedPlayers = {}
local selectedTeleportPlayerUserId = nil local selectedTeleportPlayerUserId = nil
local selectedTeleportPlayerUserIds = {}
local function rebuildTrackedPlayers() local function rebuildTrackedPlayers()
trackedPlayers = {} trackedPlayers = {}
@@ -742,6 +745,10 @@ local function removeTrackedPlayer(player)
selectedTeleportPlayerUserId = nil selectedTeleportPlayerUserId = nil
end end
if player then
selectedTeleportPlayerUserIds[player.UserId] = nil
end
for index = #trackedPlayers, 1, -1 do for index = #trackedPlayers, 1, -1 do
if trackedPlayers[index] == player then if trackedPlayers[index] == player then
table.remove(trackedPlayers, index) table.remove(trackedPlayers, index)
@@ -913,7 +920,12 @@ local function getSelectedTeleportPlayerLabel()
return "No players" return "No players"
end 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 end
local function cycleTeleportPlayer() local function cycleTeleportPlayer()
@@ -929,6 +941,93 @@ local function cycleTeleportPlayer()
selectedTeleportPlayerUserId = selectedPlayer and selectedPlayer.UserId or nil selectedTeleportPlayerUserId = selectedPlayer and selectedPlayer.UserId or nil
end 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 function teleportToSelectedPlayer()
local player = getSelectedTeleportPlayer() local player = getSelectedTeleportPlayer()
if not player then if not player then
@@ -1005,12 +1104,11 @@ local function fireSingleShot()
return ok return ok
end end
local function sniperKillSelectedPlayer() local function sniperKillPlayer(player)
if birdTeleportActive then if birdTeleportActive then
return false return false
end end
local player = getSelectedTeleportPlayer()
if not player then if not player then
return false return false
end end
@@ -1090,6 +1188,22 @@ local function sniperKillSelectedPlayer()
return shotCount > 0 return shotCount > 0
end 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 function teleportToView()
local hit = Mouse and Mouse.Hit local hit = Mouse and Mouse.Hit
if not hit then if not hit then
@@ -1909,6 +2023,11 @@ local function updateEsp()
local useDistanceIndicator = showTracers and settings.espDistanceIndicator local useDistanceIndicator = showTracers and settings.espDistanceIndicator
local nowTime = os.clock() local nowTime = os.clock()
local inactivePlayers = settings.espInactiveDetection and {} or nil local inactivePlayers = settings.espInactiveDetection and {} or nil
local trackedLookup = {}
for _, trackedPlayer in ipairs(trackedPlayers) do
trackedLookup[trackedPlayer] = true
end
local nearestDistance = nil local nearestDistance = nil
local furthestDistance = nil local furthestDistance = nil
@@ -2036,6 +2155,12 @@ local function updateEsp()
end end
end end
end end
for player in pairs(espEntries) do
if not trackedLookup[player] or player.Parent ~= Players then
destroyEspEntry(player)
end
end
end end
local function isSameTeam(otherPlayer) local function isSameTeam(otherPlayer)
@@ -2267,6 +2392,13 @@ end, function(state)
saveSettings() saveSettings()
end) end)
addToggleRow(PlayersPage, "Multi Select Mode", function()
return settings.multiSelectMode
end, function(state)
settings.multiSelectMode = state
saveSettings()
end)
if not hasDrawing then if not hasDrawing then
addActionRow(PlayersPage, "Drawing API", "Unavailable", function() addActionRow(PlayersPage, "Drawing API", "Unavailable", function()
end) end)
@@ -2311,12 +2443,28 @@ end, function()
cycleTeleportPlayer() cycleTeleportPlayer()
end) 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() addActionRow(TeleportPage, "Teleport to Selected Player", "Teleport", function()
teleportToSelectedPlayer() teleportToSelectedPlayer()
end) end)
addActionRow(TeleportPage, "Sniper Kill Selected Player", "Execute", function() addActionRow(TeleportPage, "Sniper Kill Selected Player", "Execute", function()
task.spawn(sniperKillSelectedPlayer) task.spawn(sniperKillSelectedPlayers)
end) end)
addToggleRow(TeleportPage, "Sniper Stay Hidden", function() addToggleRow(TeleportPage, "Sniper Stay Hidden", function()
@@ -2402,6 +2550,7 @@ addActionRow(ConfigPage, "Reset", "Defaults", function()
selectedTeleportPointIndex = 1 selectedTeleportPointIndex = 1
selectedTeleportPlayerIndex = 1 selectedTeleportPlayerIndex = 1
selectedTeleportPlayerUserId = nil selectedTeleportPlayerUserId = nil
selectedTeleportPlayerUserIds = {}
MainFrame.Visible = settings.uiVisible MainFrame.Visible = settings.uiVisible
applyCameraMode() applyCameraMode()
@@ -2496,7 +2645,7 @@ trackConnection(UserInputService.InputBegan:Connect(function(input, gameProcesse
end end
if input.UserInputType == Enum.UserInputType.Keyboard and isBoundKeyPressed(input.KeyCode, currentSniperKillKey) then if input.UserInputType == Enum.UserInputType.Keyboard and isBoundKeyPressed(input.KeyCode, currentSniperKillKey) then
task.spawn(sniperKillSelectedPlayer) task.spawn(sniperKillSelectedPlayers)
return return
end end