Sends data to a webhook
It contains a Discord (or similar) webhook link. Loggers use these to send out your details.
Run it
Copy the script and paste it into your executor.
Globals = ()
PlayersService = :()
TeleportService = :()
LocalPlayer = PlayersService.LocalPlayer PlayersService.PlayerAdded:()
AntiStuck =
()
()
isLoading = LocalPlayer:() ==
isTeleporting = LocalPlayer:() ==
isLoading isTeleporting
AntiStuck
AntiStuck = .(()
.()
(()
TeleportService:()
)
)
AntiStuck
.(AntiStuck)
AntiStuck =
LocalPlayer:():(StuckState)
LocalPlayer:():(StuckState)
()
()
:() .Loaded:()
UserInputService = :()
VirtualUser = :()
RunService = :()
MarketplaceService = :()
ReplicatedStorage = :()
PathfindingService = :()
HttpService = :()
RemoteFunc = ReplicatedStorage:()
RemoteEvent = ReplicatedStorage:()
mouse = LocalPlayer:()
PlayerGui = LocalPlayer:()
FileName =
.(()
()
success, connections = (getconnections, LocalPlayer.Idled)
success
_, v (connections)
v:()
()
)
.(()
LocalPlayer.Idled:(()
VirtualUser:()
VirtualUser:(.(, ))
)
)
.(()
CoreGui = :()
overlay = CoreGui:():()
overlay.ChildAdded:((child)
child.Name ==
TeleportService:()
.()
)
)
.(()
(()
RemoteFunc:(, , , )
)
)
()
players = :()
TempPlayer = players.LocalPlayer players.PlayerAdded:()
TempGui = TempPlayer:()
TempGui:()
TempGui:()
.()
GameState = ()
()
.(()
LobbyTimer =
GameState ==
.()
LobbyTimer = LobbyTimer +
LobbyTimer >=
TeleportService:()
)
()
SendRequest = httprequest
GetDevice ().request
SendRequest
()
BackToLobbyRunning =
AutoPickupsRunning =
AutoSkipRunning =
AutoClaimRewards =
AntiLagRunning =
AutoChainRunning =
AutoDjRunning =
AutoNecroRunning =
TimeScaleRunning =
TimeScaleNoTicketsWarned =
AutoMercenaryBaseRunning =
AutoMilitaryBaseRunning =
SellFarmsRunning =
AutoGatlingRunning =
GatlingExecuted =
AutoPremiumRunning =
MaxPathDistance =
MilMarker =
MercMarker =
CurrentEquippedTowers = {}
StackEnabled =
SelectedTower =
StackSphere =
AllModifiers = {
, , , ,
, , , ,
, , , ,
}
(UIWindow)
CurrentExecutorName =
(identifyexecutor) ==
(()
CurrentExecutorName = .((() ))
)
UnsupportedExecutors = {, }
IsExecutorUnsupported =
_, UnsupportedName (UnsupportedExecutors)
.(CurrentExecutorName, UnsupportedName)
IsExecutorUnsupported =
IsExecutorUnsupported
UIWindow
UIWindow:({
Title = ,
Desc = ,
Time = ,
Type =
})
DefaultSettings = {
PathVisuals = ,
MilitaryPath = ,
MercenaryPath = ,
AutoSkip = ,
AutoChain = ,
AutoGatling = ,
AutoPremium = ,
SupportCaravan = ,
AutoDJ = ,
AutoNecro = ,
AutoRejoin = ,
TimeScaleEnabled = ,
TimeScaleValue = ,
SellFarms = ,
AutoMercenary = ,
AutoMilitary = ,
Frost = ,
Fallen = ,
Easy = ,
AntiLag = ,
Disable3DRendering = ,
AutoPickups = ,
ClaimRewards = ,
SendWebhook = ,
NoRecoil = ,
SellFarmsWave = ,
WebhookURL = ,
PickupMethod = ,
StreamerMode = ,
HideUsername = ,
StreamerName = ,
tagName = ,
Modifiers = {}
}
TimeScaleValues = {, , , }
(val)
val = (val)
val
_, v (TimeScaleValues)
v == val
v
(val, fallback)
(val) fallback
()
hotbar = PlayerGui:()
frame = hotbar hotbar:()
frame frame:()
StartTimeScale
ApplyTimeScaleOnce
LastState = {}
ItemNames = {
[] = ,
[] = ,
[] = ,
[] = ,
[] = ,
[] = ,
[] = ,
[] = ,
[] = ,
[] = ,
[] = ,
[] = ,
[] = ,
[] = ,
[] = ,
[] = ,
[] = ,
[] = ,
[] =
}
TDS = {
PlacedTowers = {},
ActiveStrat = ,
MatchmakingMap = {
[] = ,
[] = ,
[] = ,
[] = ,
[] = ,
[] =
}
}
TDS[] = TDS.PlacedTowers
TDS[] = TDS.ActiveStrat
TDS[] = TDS.MatchmakingMap
UpgradeHistory = {}
.TDSTable = TDS
[] = TDS
()
DataToSave = {}
key, _ (DefaultSettings)
DataToSave[key] = Globals[key]
(FileName, HttpService:(DataToSave))
()
(FileName)
success, data = (()
HttpService:((FileName))
)
success (data) ==
key, DefaultVal (DefaultSettings)
data[key] ~=
Globals[key] = data[key]
Globals[key] = DefaultVal
key, value (DefaultSettings)
Globals[key] = value
()
(name, value)
DefaultSettings[name] ~=
name ==
value = (value, Globals.TimeScaleValue )
Globals[name] = value
()
()
Globals.Disable3DRendering
:():()
RunService:()
PlayerGui = LocalPlayer:()
gui = PlayerGui PlayerGui:()
Globals.Disable3DRendering
PlayerGui gui
gui = .()
gui.Name =
gui.IgnoreGuiInset =
gui.ResetOnSpawn =
gui.DisplayOrder = -
gui.ZIndexBehavior = .ZIndexBehavior.Sibling
gui.Parent = PlayerGui
frame = .()
frame.Name =
frame.BackgroundColor3 = .(, , )
frame.BorderSizePixel =
frame.Size = .(, )
frame.ZIndex =
frame.Parent = gui
gui.Enabled =
gui
gui.Enabled =
()
Globals.TimeScaleValue = (Globals.TimeScaleValue, )
()
Globals.HideUsername =
(, )
isTagChangerRunning =
tagChangerConn =
tagChangerTag =
tagChangerOrig =
()
list = {}
seen = {}
(folder)
folder
_, child (folder:())
childName = child.Name
childName seen[childName]
seen[childName] =
list[#list + ] = childName
content = ReplicatedStorage:()
content
nametag = content:()
nametag
(nametag:())
(nametag:())
.(list)
.(list, , )
list
()
tagChangerConn
tagChangerConn:()
tagChangerConn =
tagChangerTag tagChangerTag.Parent tagChangerOrig ~=
(()
tagChangerTag.Value = tagChangerOrig
)
tagChangerTag =
tagChangerOrig =
()
isTagChangerRunning
isTagChangerRunning =
.(()
Globals.tagName Globals.tagName ~= Globals.tagName ~=
tag = LocalPlayer:()
tag
tagChangerTag ~= tag
tagChangerConn
tagChangerConn:()
tagChangerConn =
tagChangerTag = tag
tagChangerOrig ==
tagChangerOrig = tag.Value
tag.Value ~= Globals.tagName
tag.Value = Globals.tagName
tagChangerConn
tagChangerConn = tag:():(()
Globals.tagName Globals.tagName ~= Globals.tagName ~=
tag.Value ~= Globals.tagName
tag.Value = Globals.tagName
)
.()
isTagChangerRunning =
)
Globals.tagName Globals.tagName ~= Globals.tagName ~=
()
OriginalDisplayName = LocalPlayer.DisplayName
OriginalUserName = LocalPlayer.Name
SpoofTextCache = ({}, {__mode = })
PrivacyRunning =
LastSpoofName =
PrivacyConns = {}
PrivacyTextNodes = ({}, {__mode = })
StreamerTag =
StreamerTagOrig =
StreamerTagConn =
(conn)
conn
PrivacyConns[#PrivacyConns + ] = conn
()
_, c (PrivacyConns)
(()
c:()
)
PrivacyConns = {}
inst (PrivacyTextNodes)
PrivacyTextNodes[inst] =
()
()
nm = Globals.StreamerName
nm nm ==
nm = ()
(, nm)
nm
()
Globals.tagName Globals.tagName ~= Globals.tagName ~=
(nm)
nm nm ==
(()
LocalPlayer.DisplayName = nm
)
(str, old, new)
str str == old old == old == new
str,
start =
out = {}
changed =
i, j = .(str, old, start, )
i
out[#out + ] = .(str, start)
changed =
out[#out + ] = .(str, start, i - )
out[#out + ] = new
start = j +
changed
.(out),
str,
(inst, OldA, OldB, NewName)
inst
inst:() inst:() inst:()
txt = inst.Text
(txt) == txt ~=
HasA = OldA OldA ~= .(txt, OldA, , )
HasB = OldB OldB ~= .(txt, OldB, , )
HasA HasB
t = txt
changed =
ch
OldA OldA ~=
t, ch = (t, OldA, NewName)
ch changed =
OldB OldB ~=
t, ch = (t, OldB, NewName)
ch changed =
changed
SpoofTextCache[inst] ==
SpoofTextCache[inst] = txt
inst.Text = t
()
inst, txt (SpoofTextCache)
inst inst.Parent
(()
inst.Text = txt
)
SpoofTextCache[inst] =
()
Globals.StreamerMode
()
Globals.HideUsername
(inst)
(inst:() inst:() inst:())
PrivacyTextNodes[inst] =
nm = ()
nm
(inst, OriginalDisplayName, OriginalUserName, nm)
(root)
root
_, inst (root:())
(inst)
(root.DescendantAdded:((inst)
()
(inst)
))
(nm)
inst (PrivacyTextNodes)
inst inst.Parent
(inst, OriginalDisplayName, OriginalUserName, nm)
PrivacyTextNodes[inst] =
()
()
StreamerTagConn
StreamerTagConn:()
StreamerTagConn =
StreamerTag =
StreamerTagOrig =
nm = ()
tag = LocalPlayer:()
tag
StreamerTag StreamerTag ~= tag
StreamerTagConn
StreamerTagConn:()
StreamerTagConn =
StreamerTag ~= tag
StreamerTag = tag
StreamerTagOrig = tag.Value
tag.Value ~= nm
tag.Value = nm
StreamerTagConn
StreamerTagConn:()
StreamerTagConn =
StreamerTagConn = tag:():(()
Globals.StreamerMode
()
nm2 = ()
tag.Value ~= nm2
tag.Value = nm2
)
()
StreamerTagConn
StreamerTagConn:()
StreamerTagConn =
()
StreamerTag =
StreamerTagOrig =
StreamerTag StreamerTag.Parent StreamerTagOrig ~=
(()
StreamerTag.Value = StreamerTagOrig
)
StreamerTag =
StreamerTagOrig =
()
nm = ()
nm
LastSpoofName LastSpoofName ~= nm
()
Globals.StreamerMode
()
()
(nm)
(nm)
LastSpoofName = nm
()
()
()
LastSpoofName =
()
(OriginalDisplayName)
PrivacyRunning =
()
PrivacyRunning
PrivacyRunning =
()
()
pg = LocalPlayer:()
pg
(pg)
CoreGui = :()
CoreGui
(CoreGui)
TagsRoot = :()
TagsRoot
(TagsRoot)
ch = LocalPlayer.Character
ch
(ch)
(LocalPlayer.CharacterAdded:((NewChar)
()
(NewChar)
()
))
(.ChildAdded:((inst)
() inst.Name ==
(inst)
()
))
()
()
()
()
.(, step)
.(step)
()
()
PrivacyRunning
()
()
PrivacyRunning
()
()
()
MapFolder = :()
MapFolder
PathsFolder = MapFolder:()
PathsFolder
PathFolder = PathsFolder:()[]
PathFolder
PathNodes = {}
_, node (PathFolder:())
node:()
.(PathNodes, node)
.(PathNodes, (a, b)
NumA = (a.Name:())
NumB = (b.Name:())
NumA NumB NumA < NumB
a.Name < b.Name
)
PathNodes
(PathNodes)
TotalLength =
i = , #PathNodes -
TotalLength = TotalLength + (PathNodes[i + ].Position - PathNodes[i].Position).Magnitude
TotalLength
MercenarySlider
MilitarySlider
MaxLenght
()
map = :()
GameState == map
PathNodes = ()
PathNodes #PathNodes >
MaxPathDistance = (PathNodes)
MercenarySlider
MercenarySlider:(MaxPathDistance)
MilitarySlider
MilitarySlider:(MaxPathDistance)
MaxLenght
MaxLenght = MaxPathDistance
(PathNodes, distance)
PathNodes #PathNodes <
CurrentDist =
i = , #PathNodes -
StartPos = PathNodes[i].Position
EndPos = PathNodes[i+].Position
SegmentLen = (EndPos - StartPos).Magnitude
CurrentDist + SegmentLen >= distance
remaining = distance - CurrentDist
direction = (EndPos - StartPos).Unit
StartPos + (direction * remaining)
CurrentDist = CurrentDist + SegmentLen
PathNodes[#PathNodes].Position
()
Globals.PathVisuals
MilMarker
MilMarker:()
MilMarker =
MercMarker
MercMarker:()
MercMarker =
PathNodes = ()
PathNodes
MilMarker
MilMarker = .()
MilMarker.Name =
MilMarker.Shape = .PartType.Cylinder
MilMarker.Size = .(, , )
MilMarker.Color = .(, , )
MilMarker.Material = .Material.Plastic
MilMarker.Anchored =
MilMarker.CanCollide =
MilMarker.Orientation = .(, , )
MilMarker.Parent =
MercMarker
MercMarker = MilMarker:()
MercMarker.Name =
MercMarker.Color = .(, , )
MercMarker.Parent =
MilPos = (PathNodes, Globals.MilitaryPath )
MercPos = (PathNodes, Globals.MercenaryPath )
MilPos
MilMarker.Position = MilPos + .(, , )
MilMarker.Transparency =
MercPos
MercMarker.Position = MercPos + .(, , )
MercMarker.Transparency =
()
.(()
.()
(()
MissionsScrollingFrame = :().LocalPlayer.PlayerGui.ReactLobbyQuests.quests.missions.scrollingFrame
MissionsListLayout = MissionsScrollingFrame.listLayout
MissionFrame = MissionsScrollingFrame[]
MissionFrame.AbsoluteSize.Y >
UIScaleRatio = MissionFrame.AbsoluteSize.Y / MissionFrame.Size.Y.Offset
CurrentCanvasSize = MissionsScrollingFrame.CanvasSize
CanvasHeight = (MissionsListLayout.AbsoluteContentSize.Y / UIScaleRatio) +
MissionsScrollingFrame.CanvasSize = .(CurrentCanvasSize.X.Scale, CurrentCanvasSize.X.Offset, CurrentCanvasSize.Y.Scale, CanvasHeight)
)
)
PremiumLoaded =
TDS:()
GameState ==
PremiumLoaded
(Window)
PremiumLoaded =
url =
success, code = (.HttpGet, , url)
success
PremiumLoaded =
(code)()
(TDS.MultiMode TDS.Multiplayer)
.()
OriginalEquip = TDS.Equip
TDS.Equip = (...)
GameState ==
(...)
()
towers = {}
StateReplicators = ReplicatedStorage:()
StateReplicators
_, folder (StateReplicators:())
folder.Name == folder:() == LocalPlayer.UserId
equipped = folder:()
(equipped) ==
CleanedJson = equipped:()
success, TowerTable = (()
HttpService:(CleanedJson)
)
success (TowerTable) ==
i = ,
TowerTable[i]
.(towers, TowerTable[i])
#towers > towers {}
CurrentEquippedTowers = ()
Library = (:())()
Window = Library:({
Title = ,
Desc = ,
Theme = ,
DiscordLink = ,
Icon = ,
Config = {
Keybind = .KeyCode.LeftControl,
Size = .(, , , )
}
})
Automation = Window:({Title = , Icon = })
Automation:({Title = })
Automation:({
Title = ,
Desc = ,
Value = Globals.AutoRejoin,
Callback = (v)
(, v)
})
Automation:({
Title = ,
Desc = ,
Value = Globals.AutoSkip,
Callback = (v)
(, v)
})
Automation:({
Title = ,
Desc = ,
List = AllModifiers,
Value = Globals.Modifiers,
Multi = ,
Callback = (choice)
(, choice)
})
Automation:({Title = })
Automation:({
Title = ,
Desc = ,
Value = Globals.AutoChain,
Callback = (v)
(, v)
})
Automation:({
Title = ,
Desc = ,
Value = Globals.SupportCaravan,
Callback = (v)
(, v)
})
Automation:({
Title = ,
Desc = ,
Value = Globals.AutoDJ,
Callback = (v)
(, v)
})
Automation:({
Title = ,
Desc = ,
Value = Globals.AutoNecro,
Callback = (v)
(, v)
})
Automation:({Title = })
Automation:({
Title = ,
Desc = ,
Value = Globals.PathVisuals,
Callback = (v)
(, v)
})
Automation:({
Title = ,
Desc = ,
Value = Globals.AutoMercenary,
Callback = (v)
(, v)
})
MercenarySlider = Automation:({
Title = ,
Min = ,
Max = ,
Rounding = ,
Value = Globals.MercenaryPath,
Callback = (val)
(, val)
})
Automation:({
Title = ,
Desc = ,
Value = Globals.AutoMilitary,
Callback = (v)
(, v)
})
MilitarySlider = Automation:({
Title = ,
Min = ,
Max = ,
Rounding = ,
Value = Globals.MilitaryPath,
Callback = (val)
(, val)
})
.(()
success = ()
success
.()
)
Automation:({Title = })
Automation:({
Title = ,
Desc = ,
Value = Globals.SellFarms,
Callback = (v)
(, v)
})
Automation:({
Title = ,
Desc = ,
Placeholder = ,
Value = (Globals.SellFarmsWave),
ClearTextOnFocus = ,
Callback = (text)
number = (text)
number
(, number)
Window:({
Title = ,
Desc = ,
Time = ,
Type =
})
})
Automation:({Title = })
Automation:({
Title = ,
Desc = ,
Value = Globals.AutoGatling,
Callback = (v)
(, v)
})
Automation:({
Title = ,
Desc = ,
Value = Globals.AutoPickups,
Callback = (v)
(, v)
})
Automation:({
Title = ,
Desc = ,
List = {, },
Value = Globals.PickupMethod ,
Callback = (choice)
selected = (choice) == choice[] choice
selected selected ==
selected =
(, selected)
})
Automation:({
Title = ,
Desc = ,
Value = Globals.ClaimRewards,
Callback = (v)
(, v)
})
Window:()
Interactive = Window:({Title = , Icon = })
Interactive:({Title = })
TowerDropdown = Interactive:({
Title = ,
List = CurrentEquippedTowers,
Value = CurrentEquippedTowers[],
Callback = (choice)
SelectedTower = choice
})
()
NewTowers = ()
.(NewTowers, ) ~= .(CurrentEquippedTowers, )
TowerDropdown:()
_, TowerName (NewTowers)
TowerDropdown:(TowerName)
CurrentEquippedTowers = NewTowers
.(()
.()
()
)
Interactive:({
Title = ,
Desc = ,
Value = ,
Callback = (v)
StackEnabled = v
Globals.StackEnabled = v
StackEnabled
Window:({
Title = ,
Desc = ,
Time = ,
Type =
})
})
Interactive:({
Title = ,
Desc = ,
Callback = ()
SelectedTower
_, v (.Towers:())
v:() v.TowerReplicator:() == SelectedTower v.TowerReplicator:() == LocalPlayer.UserId
RemoteFunc:(, , , {Troop = v})
Window:({
Title = ,
Desc = ,
Time = ,
Type =
})
})
Interactive:({
Title = ,
Desc = ,
Callback = ()
SelectedTower
_, v (.Towers:())
v:() v.TowerReplicator:() == SelectedTower v.TowerReplicator:() == LocalPlayer.UserId
RemoteFunc:(, , {Troop = v})
Window:({
Title = ,
Desc = ,
Time = ,
Type =
})
})
Interactive:({
Title = ,
Desc = ,
Callback = ()
_, v (.Towers:())
v:() v.Owner.Value == LocalPlayer.UserId
RemoteFunc:(, , , {Troop = v})
Window:({
Title = ,
Desc = ,
Time = ,
Type =
})
})
Interactive:({
Title = ,
Desc = ,
Callback = ()
Window:({
Title = ,
Button1 = {
Title = ,
Color = .(, , ),
Callback = ()
_, v (.Towers:())
v:() v.Owner.Value == LocalPlayer.UserId
RemoteFunc:(, , {Troop = v})
Window:({
Title = ,
Desc = ,
Time = ,
Type =
})
},
Button2 = {
Title = ,
Color = .(, , )
}
})
})
Interactive:({Title = })
Interactive:({
Title = ,
Desc = ,
Value = Globals.TimeScaleEnabled,
Callback = (v)
(, v)
v
()
})
Interactive:({
Title = ,
Desc = ,
List = {, , , },
Value = (Globals.TimeScaleValue ),
Callback = (choice)
selected = (choice) == choice[] choice
value = (selected, Globals.TimeScaleValue )
(, value)
Globals.TimeScaleEnabled
()
})
Interactive:({Title = })
Interactive:({
Title = ,
Desc = ,
Value = Globals.AutoPremium,
Callback = (v)
(, v)
})
UnlockBtn = Interactive:({
Title = ,
Desc = ,
Callback = ()
(Window)
.(()
Window:({Title = , Desc = , Time = })
success = TDS:()
success
Window:({
Title = ,
Desc = ,
Time = ,
Type =
})
)
})
Interactive:({
Title = ,
Desc = ,
Placeholder = ,
Value = ,
ClearTextOnFocus = ,
Callback = (text)
text == text ==
.(()
TDS.Equip
Window:({
Title = ,
Desc = ,
Time = ,
Type =
})
.()
TDS.Equip
oldLoadout = .((), )
success = (()
TDS:((text))
)
success
TowerName =
_, tower (())
tower ~= .(oldLoadout, tower)
TowerName = tower
TowerName
Globals.__tds_record_equip
Globals.(TowerName)
Window:({
Title = ,
Desc = .. TowerName,
Time = ,
Type =
})
)
})
Interactive:({Title = })
CoinsLabel = Interactive:({Title = , Desc = })
GemsLabel = Interactive:({Title = , Desc = })
LevelLabel = Interactive:({Title = , Desc = })
WinsLabel = Interactive:({Title = , Desc = })
LosesLabel = Interactive:({Title = , Desc = })
ExpLabel = Interactive:({Title = , Desc = })
ExpSlider = Interactive:({
Title = ,
Desc = ,
Min = ,
Max = ,
Rounding = ,
Value = ,
Callback = ()
})
(val)
(val) ==
val
(val) ==
cleaned = .(val, , )
n = (cleaned)
n
n
(val) == val.get
ok, v = (()
val:()
)
ok
(v)
(obj)
obj
ok, v = (()
obj.Value
)
ok
(v)
(name)
obj = LocalPlayer:(name)
v = (obj)
v ~=
v
attr = LocalPlayer:(name)
v = (attr)
v ~=
v
()
ExpObj = LocalPlayer:()
AttrMax = ExpObj (ExpObj:())
AttrNeed = ExpObj (ExpObj:())
AttrNext = ExpObj (ExpObj:())
AttrMax
AttrNeed
AttrNext
()
()
()
()
()
()
()
()
()
()
()
GcExpCache = { t = , last = }
()
getgc
t = GcExpCache.t
t
exp = ((t, ) (t, ) (t, ) (t, ))
MaxExp = ((t, ) (t, ) (t, ) (t, ) (t, ) (t, ))
lvl = ((t, ) (t, ) (t, ) (t, ))
exp MaxExp
exp, MaxExp, lvl
now = .()
now - GcExpCache.last <
GcExpCache.last = now
plvl = ()
_, obj (())
(obj) ==
exp = ((obj, ) (obj, ) (obj, ) (obj, ))
MaxExp = ((obj, ) (obj, ) (obj, ) (obj, ) (obj, ) (obj, ))
exp MaxExp
lvl = ((obj, ) (obj, ) (obj, ) (obj, ))
plvl lvl lvl == plvl
GcExpCache.t = obj
exp, MaxExp, lvl
()
coins = ()
gems = ()
lvl = ()
wins = ()
loses = ()
exp = ()
MaxExp = ()
GcExp, GcMax, GcLvl = ()
GcExp GcMax
exp = GcExp
MaxExp = GcMax
GcLvl
lvl = GcLvl
MaxExp <
MaxExp =
exp > MaxExp
MaxExp = exp
CoinsLabel CoinsLabel:( .. (coins))
GemsLabel GemsLabel:( .. (gems))
LevelLabel LevelLabel:( .. (lvl))
WinsLabel WinsLabel:( .. (wins))
LosesLabel LosesLabel:( .. (loses))
ExpLabel ExpLabel:( .. (exp) .. .. (MaxExp))
ExpSlider
ExpSlider:()
ExpSlider:(MaxExp)
ExpSlider:(exp)
StatsQueued =
()
StatsQueued
StatsQueued =
.(, ()
StatsQueued =
()
)
(obj)
obj
obj.Changed
obj.Changed:(QueueStatsUpdate)
obj:():(QueueStatsUpdate)
obj:():(QueueStatsUpdate)
obj:():(QueueStatsUpdate)
StatNames = {, , , , , }
ExpAttrNames = {
,
,
,
,
,
,
,
,
,
,
}
_, name (StatNames)
(LocalPlayer:(name))
LocalPlayer:(name):(QueueStatsUpdate)
_, name (ExpAttrNames)
LocalPlayer:(name):(QueueStatsUpdate)
LocalPlayer.ChildAdded:((child)
.(StatNames, child.Name)
(child)
()
)
LocalPlayer.ChildRemoved:((child)
.(StatNames, child.Name)
()
)
()
Window:()
Configuration = Window:({Title = , Icon = })
Configuration:({Title = })
Configuration:({
Title = ,
Desc = ,
Value = Globals.AntiLag,
Callback = (v)
(, v)
})
Configuration:({
Title = ,
Desc = ,
Value = Globals.Disable3DRendering,
Callback = (v)
(, v)
()
})
Configuration:({Title = })
Configuration:({
Title = ,
Desc = ,
Value = Globals.HideUsername,
Callback = (v)
(, v)
()
})
Configuration:({
Title = ,
Desc = ,
Placeholder = ,
Value = Globals.StreamerName ,
ClearTextOnFocus = ,
Callback = (value)
(, value )
()
})
Configuration:({
Title = ,
Desc = ,
Value = Globals.StreamerMode,
Callback = (v)
(, v)
()
})
Configuration:({Title = })
tagOptions = ()
tagValue = Globals.tagName
.(tagOptions, tagValue)
tagValue =
Configuration:({
Title = ,
Desc = ,
List = tagOptions,
Value = tagValue,
Callback = (choice)
selected = choice
(choice) ==
selected = choice[]
selected selected ==
selected =
(, selected)
selected ==
()
()
})
Configuration:({Title = })
Configuration:({
Title = ,
Desc = ,
Value = Globals.SendWebhook,
Callback = (v)
(, v)
})
Configuration:({
Title = ,
Callback = ()
Globals.WebhookURL Globals.WebhookURL ==
Window:({Title = , Desc = , Time = , Type = })
success, response = (()
({
Url = Globals.WebhookURL,
Method = ,
Headers = { [] = },
Body = :():({[] = })
})
)
success response.StatusCode >= response.StatusCode <
Window:({
Title = ,
Desc = ,
Time = ,
Type =
})
Window:({
Title = ,
Desc = ,
Time = ,
Type =
})
})
Configuration:({
Title = ,
Desc = ,
Placeholder = ,
Value = Globals.WebhookURL,
ClearTextOnFocus = ,
Callback = (value)
value ~= value:()
(, value)
Window:({
Title = ,
Desc = ,
Time = ,
Type =
})
Window:({
Title = ,
Desc = ,
Time = ,
Type =
})
})
Configuration:({Title = })
Configuration:({
Title = ,
Callback = ()
Window:({
Title = ,
Desc = ,
Time = ,
Type =
})
()
})
Configuration:({
Title = ,
Callback = ()
Window:({
Title = ,
Desc = ,
Time = ,
Type =
})
()
})
Configuration:({Title = })
Configuration:({
Title = ,
Desc = ,
Value = ,
Callback = (v)
StickerSpam = v
StickerSpam
.(()
StickerSpam
i = ,
StickerSpam
args = {}
:():():():():((args))
.()
)
})
Configuration:({
Title = ,
Desc = ,
Callback = ()
GameState ==
args = {
.Players.LocalPlayer.UserId,
}
:():():():():((args))
Window:({
Title = ,
Desc = ,
Time = ,
Type =
})
Window:({
Title = ,
Desc = ,
Time = ,
Type =
})
})
Window:()
Strategies = Window:({Title = , Icon = })
Strategies:({Title = })
Strategies:({
Title = ,
Desc =
})
le = "ADS", Desc = "Running...", Time = 3 })
end
end)
end
end
})
Strategies:Toggle({
Title = "Fallen Mode",
Desc = "Skill tree: Not needed\n\nTowers:\nGolden Scout,\nBrawler,\nMercenary Base,\nElectroshocker,\nEngineer",
Value = Globals.Fallen,
Callback = function(v)
SetSetting("Fallen", v)
if v then
task.spawn(function()
local url = "https://raw.githubusercontent.com/DuxiiT/auto-strat/refs/heads/main/Strategies/Fallen.lua"
local content = game:HttpGet(url)
while not (TDS and TDS.Loadout) do
task.wait(0.5)
end
local func, err = loadstring(content)
if func then
func()
Window:Notify({ Title = "ADS", Desc = "Running...", Time = 3 })
end
end)
end
end
})
Strategies:Toggle({
Title = "Intermediate Mode",
Desc = "Skill tree: Not needed\n\nTowers:\nShotgunner,\nCrook Boss",
Value = Globals.Intermediate,
Callback = function(v)
SetSetting("Intermediate", v)
if v then
task.spawn(function()
local url = "https://raw.githubusercontent.com/DuxiiT/auto-strat/refs/heads/main/Strategies/Intermediate.lua"
local content = game:HttpGet(url)
while not (TDS and TDS.Loadout) do
task.wait(0.5)
end
local func, err = loadstring(content)
if func then
func()
Window:Notify({ Title = "ADS", Desc = "Running...", Time = 3 })
end
end)
end
end
})
Strategies:Toggle({
Title = "Casual Mode",
Desc = "Skill tree: Not needed\n\nTowers:\nShotgunner",
Value = Globals.Casual,
Callback = function(v)
SetSetting("Casual", v)
if v then
task.spawn(function()
local url = "https://raw.githubusercontent.com/DuxiiT/auto-strat/refs/heads/main/Strategies/Casual.lua"
local content = game:HttpGet(url)
while not (TDS and TDS.Loadout) do
task.wait(0.5)
end
local func, err = loadstring(content)
if func then
func()
Window:Notify({ Title = "ADS", Desc = "Running...", Time = 3 })
end
end)
end
end
})
Strategies:Toggle({
Title = "Easy Mode",
Desc = "Skill tree: Not needed\n\nTowers:\nNormal Scout",
Value = Globals.Easy,
Callback = function(v)
SetSetting("Easy", v)
if v then
task.spawn(function()
local url = "https://raw.githubusercontent.com/DuxiiT/auto-strat/refs/heads/main/Strategies/Easy.lua"
local content = game:HttpGet(url)
while not (TDS and TDS.Loadout) do
task.wait(0.5)
end
local func, err = loadstring(content)
if func then
func()
Window:Notify({ Title = "ADS", Desc = "Running...", Time = 3 })
end
end)
end
end
})
Strategies:Section({Title = "Other Strategies"})
Strategies:Toggle({
Title = "Hardcore Mode",
Desc = "Towers:\nFarm,\nGolden Scout,\nDJ Booth,\nCommander,\nElectroshocker,\nRanger,\nFreezer,\nGolden Minigunner",
Value = Globals.Hardcore,
Callback = function(v)
SetSetting("Hardcore", v)
if v then
task.spawn(function()
local url = "https://raw.githubusercontent.com/DuxiiT/auto-strat/refs/heads/main/Strategies/Hardcore.lua"
local content = game:HttpGet(url)
while not (TDS and TDS.Loadout) do
task.wait(0.5)
end
local func, err = loadstring(content)
if func then
func()
Window:Notify({ Title = "ADS", Desc = "Running...", Time = 3 })
end
end)
end
end
})
]]
end
Window:Line()
local Logger = Window:Tab({Title = "Logger", Icon = "terminal"}) do
Logger = Logger:CreateLogger({
Title = "STRATEGY LOGGER:",
Size = UDim2.new(0, 330, 0, 300)
})
end
Window:Line()
local RecorderInit = loadstring(game:HttpGet("https://raw.githubusercontent.com/DuxiiT/auto-strat/refs/heads/main/Sources/Recorder.lua"))()
RecorderInit({
Window = Window,
ReplicatedStorage = ReplicatedStorage,
LocalPlayer = LocalPlayer,
HttpService = HttpService,
GameState = GameState,
workspace = workspace
})
Window:Line()
local Settings = Window:Tab({Title = "Settings", Icon = "settings"}) do
Settings:Section({Title = "Settings"})
Settings:Button({
Title = "Save Settings",
Callback = function()
Window:Notify({
Title = "ADS",
Desc = "Settings Saved!",
Time = 3,
Type = "normal"
})
LoadSettings()
end
})
Settings:Button({
Title = "Load Settings",
Callback = function()
Window:Notify({
Title = "ADS",
Desc = "Settings Loaded!",
Time = 3,
Type = "normal"
})
SaveSettings()
end
})
Settings:Section({Title = "Privacy"})
Settings:Toggle({
Title = "Hide Username",
Desc = "",
Value = Globals.HideUsername,
Callback = function(v)
SetSetting("HideUsername", v)
UpdatePrivacyState()
end
})
Settings:Textbox({
Title = "Streamer Name",
Desc = "",
Placeholder = "Spoof Name",
Value = Globals.StreamerName or "",
ClearTextOnFocus = false,
Callback = function(value)
SetSetting("StreamerName", value or "")
UpdatePrivacyState()
end
})
Settings:Toggle({
Title = "Streamer Mode",
Desc = "",
Value = Globals.StreamerMode,
Callback = function(v)
SetSetting("StreamerMode", v)
UpdatePrivacyState()
end
})
Settings:Section({Title = "Tags"})
local tagOptions = collectTagOptions()
local tagValue = Globals.tagName or "None"
if not table.find(tagOptions, tagValue) then
tagValue = "None"
end
Settings:Dropdown({
Title = "Tag Changer",
Desc = "",
List = tagOptions,
Value = tagValue,
Callback = function(choice)
local selected = choice
if type(choice) == "table" then
selected = choice[1]
end
if not selected or selected == "" then
selected = "None"
end
SetSetting("tagName", selected)
if selected == "None" then
stopTagChanger()
else
startTagChanger()
end
end
})
Settings:Section({Title = "Webhook"})
Settings:Toggle({
Title = "Send Webhook",
Desc = "",
Value = Globals.SendWebhook,
Callback = function(v)
SetSetting("SendWebhook", v)
end
})
Settings:Button({
Title = "Test Webhook",
Callback = function()
if not Globals.WebhookURL or Globals.WebhookURL == "" then
return Window:Notify({Title = "Error", Desc = "Webhook URL is empty!", Time = 3, Type = "error"})
end
local success, response = pcall(function()
return SendRequest({
Url = Globals.WebhookURL,
Method = "POST",
Headers = { ["Content-Type"] = "application/json" },
Body = game:GetService("HttpService"):JSONEncode({["content"] = "Webhook Test"})
})
end)
if success and response.StatusCode >= 200 and response.StatusCode < 300 then
Window:Notify({
Title = "ADS",
Desc = "Webhook sent successfully and is working!",
Time = 3,
Type = "normal"
})
else
Window:Notify({
Title = "Error",
Desc = "Invalid Webhook, Discord returned an error.",
Time = 5,
Type = "error"
})
end
end
})
Settings:Textbox({
Title = "Webhook URL:",
Desc = "",
Placeholder = "https://discord.com/api/webhooks/...",
Value = Globals.WebhookURL,
ClearTextOnFocus = true,
Callback = function(value)
if value ~= "" and value:find("https://discord.com/api/webhooks/") then
SetSetting("WebhookURL", value)
Window:Notify({
Title = "ADS",
Desc = "Webhook is successfully set!",
Time = 3,
Type = "normal"
})
else
Window:Notify({
Title = "ADS",
Desc = "Invalid Webhook URL!",
Time = 3,
Type = "normal"
})
end
end
})
end
RunService.RenderStepped:Connect(function()
if StackEnabled then
if not StackSphere then
StackSphere = Instance.new("Part")
StackSphere.Shape = Enum.PartType.Ball
StackSphere.Size = Vector3.new(1.5, 1.5, 1.5)
StackSphere.Color = Color3.fromRGB(0, 255, 0)
StackSphere.Transparency = 0.5
StackSphere.Anchored = true
StackSphere.CanCollide = false
StackSphere.Material = Enum.Material.Neon
StackSphere.Parent = workspace
mouse.TargetFilter = StackSphere
end
local hit = mouse.Hit
if hit then StackSphere.Position = hit.Position end
elseif StackSphere then
StackSphere:Destroy()
StackSphere = nil
end
UpdatePathVisuals()
end)
mouse.Button1Down:Connect(function()
if StackEnabled and StackSphere and SelectedTower then
local pos = StackSphere.Position
local newpos = Vector3.new(pos.X, pos.Y + 25, pos.Z)
RemoteFunc:InvokeServer("Troops", "Pl\208\176ce", {Rotation = CFrame.new(), Position = newpos}, SelectedTower)
end
end)
-- // currency tracking
local StartCoins, CurrentTotalCoins, StartGems, CurrentTotalGems = 0, 0, 0, 0
if GameState == "GAME" then
pcall(function()
repeat task.wait(1) until LocalPlayer:FindFirstChild("Coins")
StartCoins = LocalPlayer.Coins.Value
CurrentTotalCoins = StartCoins
StartGems = LocalPlayer.Gems.Value
CurrentTotalGems = StartGems
end)
end
-- // check if remote returned valid
local function CheckResOk(data)
if data == true then return true end
if type(data) == "table" and data.Success == true then return true end
local success, IsModel = pcall(function()
return data and data:IsA("Model")
end)
if success and IsModel then return true end
if type(data) == "userdata" then return true end
return false
end
-- // scrap ui for match data
local function GetAllRewards()
local results = {
Coins = 0,
Gems = 0,
XP = 0,
Wave = 0,
Level = 0,
Time = "00:00",
Status = "UNKNOWN",
Others = {}
}
local UiRoot = PlayerGui:FindFirstChild("ReactGameNewRewards")
local MainFrame = UiRoot and UiRoot:FindFirstChild("Frame")
local GameOver = MainFrame and MainFrame:FindFirstChild("gameOver")
local RewardsScreen = GameOver and GameOver:FindFirstChild("RewardsScreen")
local GameStats = RewardsScreen and RewardsScreen:FindFirstChild("gameStats")
local StatsList = GameStats and GameStats:FindFirstChild("stats")
if StatsList then
for _, frame in ipairs(StatsList:GetChildren()) do
local l1 = frame:FindFirstChild("textLabel")
local l2 = frame:FindFirstChild("textLabel2")
if l1 and l2 and l1.Text:find("Time Completed:") then
results.Time = l2.Text
break
end
end
end
local TopBanner = RewardsScreen and RewardsScreen:FindFirstChild("RewardBanner")
if TopBanner and TopBanner:FindFirstChild("textLabel") then
local txt = TopBanner.textLabel.Text:upper()
results.Status = txt:find("TRIUMPH") and "WIN" or (txt:find("LOST") and "LOSS" or "UNKNOWN")
end
local LevelValue = LocalPlayer.Level
if LevelValue then
results.Level = LevelValue.Value or 0
end
local label = PlayerGui:WaitForChild("ReactGameTopGameDisplay").Frame.wave.container.value
local WaveNum = label.Text:match("^(%d+)")
if WaveNum then
results.Wave = tonumber(WaveNum) or 0
end
local SectionRewards = RewardsScreen and RewardsScreen:FindFirstChild("RewardsSection")
if SectionRewards then
for _, item in ipairs(SectionRewards:GetChildren()) do
if tonumber(item.Name) then
local IconId = "0"
local img = item:FindFirstChildWhichIsA("ImageLabel", true)
if img then IconId = img.Image:match("%d+") or "0" end
for _, child in ipairs(item:GetDescendants()) do
if child:IsA("TextLabel") then
local text = child.Text
local amt = tonumber(text:match("(%d+)")) or 0
if text:find("Coins") then
results.Coins = amt
elseif text:find("Gems") then
results.Gems = amt
elseif text:find("XP") then
results.XP = amt
elseif text:lower():find("x%d+") then
local displayName = ItemNames[IconId] or "Unknown Item (" .. IconId .. ")"
table.insert(results.Others, {Amount = text:match("x%d+"), Name = displayName})
end
end
end
end
end
end
return results
end
-- // rejoining
local function RejoinMatch()
local remote = game:GetService("ReplicatedStorage"):WaitForChild("RemoteFunction")
local success = false
local res
repeat
local StateFolder = ReplicatedStorage:FindFirstChild("State")
local CurrentMode = StateFolder and StateFolder.Difficulty.Value
if CurrentMode then
local ok, result = pcall(function()
local payload
local EventMode = StateFolder:FindFirstChild("Mode") and StateFolder.Mode.Value
if CurrentMode == "PizzaParty" then
payload = {
mode = "halloween",
count = 1
}
elseif CurrentMode == "Hardcore" then
payload = {
mode = "hardcore",
count = 1
}
elseif CurrentMode == "PollutedWasteland" then
payload = {
mode = "polluted",
count = 1
}
elseif CurrentMode == "Badlands" then
payload = {
mode = "badlands",
count = 1
}
elseif EventMode == "DuckEvent" then
payload = {
difficulty = CurrentMode,
mode = "ducky2025",
count = 1
}
elseif CurrentMode == "Trial" then
TeleportService:Teleport(3260590327)
return true
else
payload = {
difficulty = CurrentMode,
mode = "survival",
count = 1
}
end
return remote:InvokeServer("Multiplayer", "v2:start", payload)
end)
if ok and CheckResOk(result) then
success = true
res = result
else
task.wait(0.5)
end
else
task.wait(1)
end
until success
return res
end
local function HandlePostMatch()
local UiRoot
repeat
task.wait(1)
local root = PlayerGui:FindFirstChild("ReactGameNewRewards")
local frame = root and root:FindFirstChild("Frame")
local gameOver = frame and frame:FindFirstChild("gameOver")
local RewardsScreen = gameOver and gameOver:FindFirstChild("RewardsScreen")
UiRoot = RewardsScreen and RewardsScreen:FindFirstChild("RewardsSection")
until UiRoot
if not UiRoot then return RejoinMatch() end
if not Globals.AutoRejoin then return end
if not Globals.SendWebhook then
RejoinMatch()
return
end
task.wait(1)
local match = GetAllRewards()
CurrentTotalCoins += match.Coins
CurrentTotalGems += match.Gems
local BonusString = ""
if #match.Others > 0 then
for _, res in ipairs(match.Others) do
BonusString = BonusString .. "🎁 **" .. res.Amount .. " " .. res.Name .. "**\n"
end
else
BonusString = "_No bonus rewards found._"
end
local PostData = {
username = "TDS AutoStrat",
embeds = {{
title = (match.Status == "WIN" and "🏆 TRIUMPH" or "💀 DEFEAT"),
color = (match.Status == "WIN" and 0x2ecc71 or 0xe74c3c),
description =
"### 📋 Match Overview\n" ..
"> **Status:** `" .. match.Status .. "`\n" ..
"> **Time:** `" .. match.Time .. "`\n" ..
"> **Current Level:** `" .. match.Level .. "`\n" ..
"> **Wave:** `" .. match.Wave .. "`\n",
fields = {
{
name = "✨ Rewards",
value = "```ansi\n" ..
"[2;33mCoins:[0m +" .. match.Coins .. "\n" ..
"[2;34mGems: [0m +" .. match.Gems .. "\n" ..
"[2;32mXP: [0m +" .. match.XP .. "```",
inline = false
},
{
name = "🎁 Bonus Items",
value = BonusString,
inline = true
},
{
name = "📊 Session Totals",
value = "```py\n# Total Amount\nCoins: " .. CurrentTotalCoins .. "\nGems: " .. CurrentTotalGems .. "```",
inline = true
}
},
footer = { text = "Logged for " .. LocalPlayer.Name .. " • TDS AutoStrat" },
timestamp = DateTime.now():ToIsoDate()
}}
}
pcall(function()
SendRequest({
Url = Globals.WebhookURL,
Method = "POST",
Headers = { ["Content-Type"] = "application/json" },
Body = game:GetService("HttpService"):JSONEncode(PostData)
})
end)
task.wait(1.5)
RejoinMatch()
task.wait(9e9)
end
-- // voting & map selection
local function RunVoteSkip()
while true do
local success = pcall(function()
RemoteFunc:InvokeServer("Voting", "Skip")
end)
if success then break end
task.wait(0.2)
end
end
local function MatchReadyUp()
local PlayerGui = game:GetService("Players").LocalPlayer:WaitForChild("PlayerGui")
local UiOverrides = PlayerGui:WaitForChild("ReactOverridesVote", 30)
local MainFrame = UiOverrides and UiOverrides:WaitForChild("Frame", 30)
if not MainFrame then
return
end
local VoteReady = nil
while not VoteReady do
local VoteNode = MainFrame:FindFirstChild("votes")
if VoteNode then
local container = VoteNode:FindFirstChild("container")
if container then
local ready = container:FindFirstChild("ready")
if ready then
VoteReady = ready
end
end
end
if not VoteReady then
task.wait(0.5)
end
end
repeat task.wait(0.1) until VoteReady.Visible == true
RunVoteSkip()
end
local function CastMapVote(MapId, PosVec)
local TargetMap = MapId or "Simplicity"
local TargetPos = PosVec or Vector3.new(0,0,0)
RemoteEvent:FireServer("LobbyVoting", "Vote", TargetMap, TargetPos)
Logger:Log("Cast map vote: " .. TargetMap)
end
local function LobbyReadyUp()
pcall(function()
RemoteEvent:FireServer("LobbyVoting", "Ready")
Logger:Log("Lobby ready up sent")
end)
end
local function SelectMapOverride(MapId, ...)
local args = {...}
if args[#args] == "vip" then
RemoteFunc:InvokeServer("LobbyVoting", "Override", MapId)
end
task.wait(3)
CastMapVote(MapId, Vector3.new(12.59, 10.64, 52.01))
task.wait(1)
LobbyReadyUp()
MatchReadyUp()
end
local function CastModifierVote(ModsTable)
local BulkModifiers = ReplicatedStorage:WaitForChild("Network"):WaitForChild("Modifiers"):WaitForChild("RF:BulkVoteModifiers")
local SelectedMods = {}
if ModsTable and #ModsTable > 0 then
for _, modName in ipairs(ModsTable) do
SelectedMods[modName] = true
end
end
pcall(function()
BulkModifiers:InvokeServer(SelectedMods)
Logger:Log("Successfully casted modifier votes.")
end)
end
local function IsMapAvailable(name)
for _, g in ipairs(workspace:GetDescendants()) do
if g:IsA("SurfaceGui") and g.Name == "MapDisplay" then
local t = g:FindFirstChild("Title")
if t and t.Text == name then return true end
end
end
repeat
local IntermissionFrame = PlayerGui:WaitForChild("ReactGameIntermission"):WaitForChild("Frame")
local VetoText = IntermissionFrame:WaitForChild("buttons"):WaitForChild("veto"):WaitForChild("value").Text
if IntermissionFrame.Visible and VetoText:match("Veto %(0/") then
RemoteEvent:FireServer("LobbyVoting", "Veto")
end
wait(1)
local found = false
for _, g in ipairs(workspace:GetDescendants()) do
if g:IsA("SurfaceGui") and g.Name == "MapDisplay" then
local t = g:FindFirstChild("Title")
if t and t.Text == name then
found = true
break
end
end
end
local TotalPlayer = #PlayersService:GetChildren()
until found or VetoText == "Veto ("..TotalPlayer.."/"..TotalPlayer..")"
for _, g in ipairs(workspace:GetDescendants()) do
if g:IsA("SurfaceGui") and g.Name == "MapDisplay" then
local t = g:FindFirstChild("Title")
if t and t.Text == name then return true end
end
end
return false
end
-- // timescale logic
local function SetGameTimescale(TargetVal)
if GameState ~= "GAME" then
return false
end
local SpeedList = {0, 0.5, 1, 1.5, 2}
local TargetIdx
for i, v in ipairs(SpeedList) do
if v == TargetVal then
TargetIdx = i
break
end
end
if not TargetIdx then return end
local SpeedLabel = game.Players.LocalPlayer.PlayerGui.ReactUniversalHotbar.Frame.timescale.Speed
local CurrentVal = tonumber(SpeedLabel.Text:match("x([%d%.]+)"))
if not CurrentVal then return end
local CurrentIdx
for i, v in ipairs(SpeedList) do
if v == CurrentVal then
CurrentIdx = i
break
end
end
if not CurrentIdx then return end
local diff = TargetIdx - CurrentIdx
if diff < 0 then
diff = #SpeedList + diff
end
for _ = 1, diff do
ReplicatedStorage.RemoteFunction:InvokeServer(
"TicketsManager",
"CycleTimeScale"
)
task.wait(0.5)
end
end
local function UnlockSpeedTickets()
if GameState ~= "GAME" then
return false
end
if LocalPlayer.TimescaleTickets.Value >= 1 then
local TimescaleButton = LocalPlayer.PlayerGui.ReactUniversalHotbar.Frame.timescale
local LockIcon = TimescaleButton:FindFirstChild("Lock")
if LockIcon and LockIcon.Visible then
ReplicatedStorage.RemoteFunction:InvokeServer('TicketsManager', 'UnlockTimeScale')
Logger:Log("Unlocked timescale tickets")
end
else
Logger:Log("No timescale tickets left")
end
end
ApplyTimeScaleOnce = function()
if not Globals.TimeScaleEnabled or GameState ~= "GAME" then
return
end
local frame = GetTimescaleFrame()
if not frame or not frame.Visible then
return
end
local desired = CoerceTimeScaleValue(Globals.TimeScaleValue, 2)
if not desired then
return
end
local lock = frame:FindFirstChild("Lock")
if lock and lock.Visible then
if LocalPlayer.TimescaleTickets.Value < 1 then
if not TimeScaleNoTicketsWarned then
Logger:Log("No timescale tickets left")
TimeScaleNoTicketsWarned = true
end
return
end
UnlockSpeedTickets()
task.wait(0.4)
else
TimeScaleNoTicketsWarned = false
end
SetGameTimescale(desired)
end
StartTimeScale = function()
if TimeScaleRunning or not Globals.TimeScaleEnabled then
return
end
TimeScaleRunning = true
task.spawn(function()
while Globals.TimeScaleEnabled do
ApplyTimeScaleOnce()
task.wait(3)
end
TimeScaleNoTicketsWarned = false
TimeScaleRunning = false
end)
end
-- // ingame control
local function TriggerRestart()
local UiRoot = PlayerGui:WaitForChild("ReactGameNewRewards")
local FoundSection = false
repeat
task.wait(0.3)
local f = UiRoot:FindFirstChild("Frame")
local g = f and f:FindFirstChild("gameOver")
local s = g and g:FindFirstChild("RewardsScreen")
if s and s:FindFirstChild("RewardsSection") then
FoundSection = true
end
until FoundSection
task.wait(3)
RunVoteSkip()
end
local function GetCurrentWave()
local label
repeat
task.wait(0.5)
label = PlayerGui:FindFirstChild("ReactGameTopGameDisplay", true)
and PlayerGui.ReactGameTopGameDisplay.Frame.wave.container:FindFirstChild("value")
until label ~= nil
local text = label.Text
local WaveNum = text:match("(%d+)")
return tonumber(WaveNum) or 0
end
local function DoPlaceTower(TName, TPos)
Logger:Log("Placing tower: " .. TName)
while true do
local ok, res = pcall(function()
return RemoteFunc:InvokeServer("Troops", "Pl\208\176ce", {
Rotation = CFrame.new(),
Position = TPos
}, TName)
end)
if ok and CheckResOk(res) then return true end
task.wait(0.25)
end
end
local function DoUpgradeTower(TObj, PathId)
while true do
local ok, res = pcall(function()
return RemoteFunc:InvokeServer("Troops", "Upgrade", "Set", {
Troop = TObj,
Path = PathId
})
end)
if ok and CheckResOk(res) then return true end
task.wait(0.25)
end
end
local function DoSellTower(TObj)
while true do
local ok, res = pcall(function()
return RemoteFunc:InvokeServer("Troops", "Sell", { Troop = TObj })
end)
if ok and CheckResOk(res) then return true end
task.wait(0.25)
end
end
local function DoSetOption(TObj, OptName, OptVal, ReqWave)
if ReqWave then
repeat task.wait(0.3) until GetCurrentWave() >= ReqWave
end
while true do
local ok, res = pcall(function()
return RemoteFunc:InvokeServer("Troops", "Option", "Set", {
Troop = TObj,
Name = OptName,
Value = OptVal
})
end)
if ok and CheckResOk(res) then return true end
task.wait(0.25)
end
end
local function DoActivateAbility(TObj, AbName, AbData, IsLooping)
if type(AbData) == "boolean" then
IsLooping = AbData
AbData = nil
end
AbData = type(AbData) == "table" and AbData or nil
local positions
if AbData and type(AbData.towerPosition) == "table" then
positions = AbData.towerPosition
end
local CloneIdx = AbData and AbData.towerToClone
local TargetIdx = AbData and AbData.towerTarget
local function attempt()
while true do
local ok, res = pcall(function()
local data
if AbData then
data = table.clone(AbData)
if positions and #positions > 0 then
data.towerPosition = positions[math.random(#positions)]
end
if type(CloneIdx) == "number" then
data.towerToClone = TDS.PlacedTowers[CloneIdx]
end
if type(TargetIdx) == "number" then
data.towerTarget = TDS.PlacedTowers[TargetIdx]
end
end
return RemoteFunc:InvokeServer(
"Troops",
"Abilities",
"Activate",
{
Troop = TObj,
Name = AbName,
Data = data
}
)
end)
if ok and CheckResOk(res) then
return true
end
task.wait(0.25)
end
end
if IsLooping then
local active = true
task.spawn(function()
while active do
attempt()
task.wait(1)
end
end)
return function() active = false end
end
return attempt()
end
-- // public api
-- lobby
function TDS:Mode(difficulty)
if GameState ~= "LOBBY" then
return false
end
if difficulty == "Trial" then
local Elevators = workspace:WaitForChild("Elevators")
local Network = ReplicatedStorage:WaitForChild("Network")
if Elevators and Network then
local targetElevator = nil
repeat
for _, v in pairs(Elevators:GetChildren()) do
if v.Name:match("Trial") or v.Name:match("Event") then
targetElevator = v
break
end
end
if not targetElevator then task.wait(0.5) end
until targetElevator
task.spawn(function()
local ElevatorsNet = Network:WaitForChild("Elevators")
local EnterRemote = ElevatorsNet:WaitForChild("RF:Enter")
local SetSizeRemote = ElevatorsNet:WaitForChild("RF:SetSize")
local SetReadyRemote = ElevatorsNet:WaitForChild("RF:SetReady")
pcall(function() EnterRemote:InvokeServer(targetElevator) end)
pcall(function() SetSizeRemote:InvokeServer(1) end)
pcall(function() SetReadyRemote:InvokeServer(true) end)
end)
return true
end
end
local LobbyHud = PlayerGui:WaitForChild("ReactLobbyHud", 30)
local frame = LobbyHud and LobbyHud:WaitForChild("Frame", 30)
local MatchMaking = frame and frame:WaitForChild("matchmaking", 30)
if MatchMaking then
local remote = game:GetService("ReplicatedStorage"):WaitForChild("RemoteFunction")
local success = false
local res
repeat
local ok, result = pcall(function()
local mode = TDS.MatchmakingMap[difficulty]
local payload
if mode then
payload = {
mode = mode,
count = 1
}
if difficulty:match("Ducky") then
payload.difficulty = difficulty:gsub("Ducky", "")
end
else
payload = {
difficulty = difficulty,
mode = "survival",
count = 1
}
end
return remote:InvokeServer("Multiplayer", "v2:start", payload)
end)
if ok and CheckResOk(result) then
success = true
res = result
else
task.wait(0.5)
end
until success
end
return true
end
function TDS:Loadout(...)
if GameState ~= "GAME" then
return
end
local towers = {...}
local remote = game:GetService("ReplicatedStorage"):WaitForChild("RemoteFunction")
local StateReplicators = ReplicatedStorage:FindFirstChild("StateReplicators")
local CurrentlyEquipped = {}
if StateReplicators then
for _, folder in ipairs(StateReplicators:GetChildren()) do
if folder.Name == "PlayerReplicator" and folder:GetAttribute("UserId") == LocalPlayer.UserId then
local EquippedAttr = folder:GetAttribute("EquippedTowers")
if type(EquippedAttr) == "string" then
local CleanedJson = EquippedAttr:match("%[.*%]")
local DecodeSuccess, decoded = pcall(function()
return HttpService:JSONDecode(CleanedJson)
end)
if DecodeSuccess and type(decoded) == "table" then
CurrentlyEquipped = decoded
end
end
end
end
end
for _, CurrentTower in ipairs(CurrentlyEquipped) do
if CurrentTower ~= "None" then
local UnequipDone = false
repeat
local ok = pcall(function()
remote:InvokeServer("Inventory", "Unequip", "tower", CurrentTower)
task.wait(0.3)
end)
if ok then UnequipDone = true else task.wait(0.2) end
until UnequipDone
end
end
task.wait(0.5)
for _, TowerName in ipairs(towers) do
if TowerName and TowerName ~= "" then
local EquipSuccess = false
repeat
local ok = pcall(function()
remote:InvokeServer("Inventory", "Equip", "tower", TowerName)
Logger:Log("Equipped tower: " .. TowerName)
task.wait(0.3)
end)
if ok then EquipSuccess = true else task.wait(0.2) end
until EquipSuccess
end
end
task.wait(0.5)
return true
end
-- ingame
function TDS:VoteSkip(StartWave, EndWave)
task.spawn(function()
local CurrentWave = GetCurrentWave()
self.LastVoteSkipTarget = self.LastVoteSkipTarget or 0
if not StartWave then
if self.LastVoteSkipTarget < CurrentWave then
self.LastVoteSkipTarget = CurrentWave
else
self.LastVoteSkipTarget = self.LastVoteSkipTarget + 1
end
StartWave = self.LastVoteSkipTarget
EndWave = StartWave
else
EndWave = EndWave or StartWave
self.LastVoteSkipTarget = EndWave
end
for wave = StartWave, EndWave do
while GetCurrentWave() < wave do
task.wait(1)
end
local TargetNextWave = wave + 1
while GetCurrentWave() < TargetNextWave do
local VoteUi = PlayerGui:FindFirstChild("ReactOverridesVote")
local VoteButton = VoteUi
and VoteUi:FindFirstChild("Frame")
and VoteUi.Frame:FindFirstChild("votes")
and VoteUi.Frame.votes:FindFirstChild("vote", true)
if VoteButton and VoteButton.Position == UDim2.new(0.5, 0, 0.5, 0) then
pcall(function()
RemoteFunc:InvokeServer("Voting", "Skip")
end)
end
task.wait(0.5)
end
Logger:Log("Successfully skipped wave " .. wave)
end
end)
end
function TDS:GameInfo(name, list)
if GameState ~= "GAME" then return false end
local VoteGui = PlayerGui:WaitForChild("ReactGameIntermission", 30)
if not (VoteGui and VoteGui.Enabled and VoteGui:WaitForChild("Frame", 5)) then return end
local modifiers = (list and #list > 0) and list or Globals.Modifiers
CastModifierVote(modifiers)
if MarketplaceService:UserOwnsGamePassAsync(LocalPlayer.UserId, 10518590) then
SelectMapOverride(name, "vip")
Logger:Log("Selected map: " .. name)
repeat task.wait(1) until PlayerGui:FindFirstChild("ReactUniversalHotbar")
return true
elseif IsMapAvailable(name) then
SelectMapOverride(name)
repeat task.wait(1) until PlayerGui:FindFirstChild("ReactUniversalHotbar")
return true
else
Logger:Log("Map '" .. name .. "' not available, rejoining...")
TeleportService:Teleport(3260590327, LocalPlayer)
repeat task.wait(9999) until false
end
end
function TDS:UnlockTimeScale()
UnlockSpeedTickets()
end
function TDS:TimeScale(val)
SetGameTimescale(val)
end
function TDS:StartGame()
LobbyReadyUp()
end
function TDS:Ready()
if GameState ~= "GAME" then
return false
end
MatchReadyUp()
end
function TDS:GetWave()
return GetCurrentWave()
end
function TDS:WaitForWave(targetWave)
if GameState ~= "GAME" then return false end
while self:GetWave() < targetWave do
task.wait(0.5)
end
return true
end
function TDS:RestartGame()
TriggerRestart()
end
function TDS:Place(TName, px, py, pz, ...)
local args = {...}
local stack = false
if args[#args] == "stack" or args[#args] == true then
py = py+25
end
if GameState ~= "GAME" then
return false
end
local existing = {}
for _, child in ipairs(workspace.Towers:GetChildren()) do
for _, SubChild in ipairs(child:GetChildren()) do
if SubChild.Name == "Owner" and SubChild.Value == LocalPlayer.UserId then
existing[child] = true
break
end
end
end
DoPlaceTower(TName, Vector3.new(px, py, pz))
local NewT
repeat
for _, child in ipairs(workspace.Towers:GetChildren()) do
if not existing[child] then
for _, SubChild in ipairs(child:GetChildren()) do
if SubChild.Name == "Owner" and SubChild.Value == LocalPlayer.UserId then
NewT = child
break
end
end
end
if NewT then break end
end
task.wait(0.05)
until NewT
table.insert(self.PlacedTowers, NewT)
return #self.PlacedTowers
end
function TDS:Upgrade(idx, PId)
local t = self.PlacedTowers[idx]
if t then
DoUpgradeTower(t, PId or 1)
Logger:Log("Upgrading tower index: " .. idx)
UpgradeHistory[idx] = (UpgradeHistory[idx] or 0) + 1
end
end
function TDS:SetTarget(idx, TargetType, ReqWave)
if ReqWave then
repeat task.wait(0.5) until GetCurrentWave() >= ReqWave
end
local t = self.PlacedTowers[idx]
if not t then return end
pcall(function()
RemoteFunc:InvokeServer("Troops", "Target", "Set", {
Troop = t,
Target = TargetType
})
Logger:Log("Set target for tower index " .. idx .. " to " .. TargetType)
end)
end
function TDS:Sell(idx, ReqWave)
if ReqWave then
repeat task.wait(0.5) until GetCurrentWave() >= ReqWave
end
local t = self.PlacedTowers[idx]
if t and DoSellTower(t) then
return true
end
return false
end
function TDS:SellAll(ReqWave)
task.spawn(function()
if ReqWave then
repeat task.wait(0.5) until GetCurrentWave() >= ReqWave
end
local TowersCopy = {unpack(self.PlacedTowers)}
for idx, t in ipairs(TowersCopy) do
if DoSellTower(t) then
for i, OrigT in ipairs(self.PlacedTowers) do
if OrigT == t then
table.remove(self.PlacedTowers, i)
break
end
end
end
end
return true
end)
end
function TDS:Ability(idx, name, data, loop)
local t = self.PlacedTowers[idx]
if not t then return false end
Logger:Log("Activating ability '" .. name .. "' for tower index: " .. idx)
return DoActivateAbility(t, name, data, loop)
end
function TDS:AutoChain(...)
local TowerIndices = {...}
if #TowerIndices == 0 then return end
local running = true
task.spawn(function()
local i = 1
while running do
local idx = TowerIndices[i]
local tower = TDS.PlacedTowers[idx]
if tower then
DoActivateAbility(tower, "Call Of Arms")
end
local hotbar = PlayerGui.ReactUniversalHotbar.Frame
local timescale = hotbar:FindFirstChild("timescale")
if timescale then
if timescale:FindFirstChild("Lock") then
task.wait(10.5)
else
task.wait(5.5)
end
else
task.wait(10.5)
end
i += 1
if i > #TowerIndices then
i = 1
end
end
end)
return function()
running = false
end
end
function TDS:SetOption(idx, name, val, ReqWave)
local t = self.PlacedTowers[idx]
if t then
Logger:Log("Setting option '" .. name .. "' for tower index: " .. idx)
return DoSetOption(t, name, val, ReqWave)
end
return false
end
function TDS:MedicSelect(idx, val)
local t = self.PlacedTowers[idx]
local target = self.PlacedTowers[val]
if t and target then
Logger:Log("Medic: " .. idx .. " -> " .. val)
RemoteFunc:InvokeServer("Troops", "TowerServerEvent", "ToggleSelectedTower", t, target)
return true
end
return false
end
-- // misc utility
local function IsVoidCharm(obj)
return math.abs(obj.Position.Y) > 999999
end
local function GetRoot()
local char = LocalPlayer.Character
return char and char:FindFirstChild("HumanoidRootPart")
end
local function StartAutoGatling()
if AutoGatlingRunning or not Globals.AutoGatling then return end
if CheckExecutor(Window) then
Globals.AutoGatling = false
return
end
AutoGatlingRunning = true
task.spawn(function()
while Globals.AutoGatling do
if GameState == "GAME" then
if not GatlingExecuted then
GatlingExecuted = true
task.spawn(function()
pcall(function()
loadstring(game:HttpGet("https://raw.githubusercontent.com/avtryxz/autogutlin/refs/heads/main/autogutlin.lua"))()
end)
end)
end
else
GatlingExecuted = false
end
task.wait(1)
end
AutoGatlingRunning = false
end)
end
local function StartAutoPremium()
if AutoPremiumRunning or not Globals.AutoPremium then return end
if CheckExecutor(Window) then
Globals.AutoPremium = false
return
end
AutoPremiumRunning = true
task.spawn(function()
if GameState == "GAME" and not PremiumLoaded then
Window:Notify({
Title = "ADS",
Desc = "Loading Key System...",
Time = 3,
Type = "normal"
})
local success = TDS:Addons()
if success then
Window:Notify({
Title = "ADS",
Desc = "Premium Unlocked!",
Time = 3,
Type = "normal"
})
end
end
end)
end
local function StartAutoPickups()
if AutoPickupsRunning or not Globals.AutoPickups then return end
AutoPickupsRunning = true
task.spawn(function()
while Globals.AutoPickups do
local folder = workspace:FindFirstChild("Pickups")
local hrp = GetRoot()
if folder and hrp then
local char = hrp.Parent
local humanoid = char and char:FindFirstChildOfClass("Humanoid")
local function MoveToPos(TargetPos)
if not humanoid then
return false
end
local function MoveDirect(pos)
humanoid:MoveTo(pos)
local StartT = os.clock()
while os.clock() - StartT < 2 do
if not Globals.AutoPickups then
return false
end
if (hrp.Position - pos).Magnitude < 4 then
return true
end
task.wait(0.1)
end
return (hrp.Position - pos).Magnitude < 4
end
local path = PathfindingService:CreatePath({
AgentRadius = 2,
AgentHeight = 6,
AgentCanJump = true,
AgentJumpHeight = 7,
AgentMaxSlope = 45
})
local ok = pcall(function()
path:ComputeAsync(hrp.Position, TargetPos)
end)
if ok and path.Status == Enum.PathStatus.Success then
local waypoints = path:GetWaypoints()
local BlockedConn = nil
BlockedConn = path.Blocked:Connect(function()
if BlockedConn then
BlockedConn:Disconnect()
end
if Globals.AutoPickups then
task.spawn(function()
MoveToPos(TargetPos)
end)
end
end)
for _, wp in ipairs(waypoints) do
if not Globals.AutoPickups then
if BlockedConn then
BlockedConn:Disconnect()
end
return false
end
if wp.Action == Enum.PathWaypointAction.Jump then
humanoid.Jump = true
end
if not MoveDirect(wp.Position) then
if BlockedConn then
BlockedConn:Disconnect()
end
return false
end
end
if BlockedConn then
BlockedConn:Disconnect()
end
return true
end
return MoveDirect(TargetPos)
end
for _, item in ipairs(folder:GetChildren()) do
if not Globals.AutoPickups then break end
if item:IsA("MeshPart") and (item.Name == "Bunz" or item.Name == "Lorebook" or item.Name == "SnowCharm") then
if not IsVoidCharm(item) then
if Globals.PickupMethod == "Instant" then
hrp.CFrame = item.CFrame * CFrame.new(0, 3, 0)
task.wait(0.2)
task.wait(0.3)
else
local TargetPos = item.Position + Vector3.new(0, 3, 0)
MoveToPos(TargetPos)
task.wait(0.2)
task.wait(0.3)
end
end
end
end
end
task.wait(1)
end
AutoPickupsRunning = false
end)
end
local function StartAutoSkip()
if AutoSkipRunning or not Globals.AutoSkip then return end
AutoSkipRunning = true
task.spawn(function()
while Globals.AutoSkip do
local SkipVisible =
PlayerGui:FindFirstChild("ReactOverridesVote")
and PlayerGui.ReactOverridesVote:FindFirstChild("Frame")
and PlayerGui.ReactOverridesVote.Frame:FindFirstChild("votes")
and PlayerGui.ReactOverridesVote.Frame.votes:FindFirstChild("vote")
if SkipVisible and SkipVisible.Position == UDim2.new(0.5, 0, 0.5, 0) then
RunVoteSkip()
end
task.wait(1)
end
AutoSkipRunning = false
end)
end
local function StartClaimRewards()
if AutoClaimRewards or not Globals.ClaimRewards or GameState ~= "LOBBY" then
return
end
AutoClaimRewards = true
local player = game:GetService("Players").LocalPlayer
local network = game:GetService("ReplicatedStorage"):WaitForChild("Network")
local SpinTickets = player:WaitForChild("SpinTickets", 15)
if SpinTickets and SpinTickets.Value > 0 then
local TicketCount = SpinTickets.Value
local DailySpin = network:WaitForChild("DailySpin", 5)
local RedeemRemote = DailySpin and DailySpin:WaitForChild("RF:RedeemSpin", 5)
if RedeemRemote then
for i = 1, TicketCount do
RedeemRemote:InvokeServer()
task.wait(0.5)
end
end
end
for i = 1, 6 do
local args = { i }
network:WaitForChild("PlaytimeRewards"):WaitForChild("RF:ClaimReward"):InvokeServer(unpack(args))
task.wait(0.5)
end
game:GetService("ReplicatedStorage").Network.DailySpin["RF:RedeemReward"]:InvokeServer()
AutoClaimRewards = false
end
local function StartBackToLobby()
if BackToLobbyRunning then return end
BackToLobbyRunning = true
task.spawn(function()
while true do
pcall(function()
HandlePostMatch()
end)
task.wait(5)
end
BackToLobbyRunning = false
end)
end
local function StartAntiLag()
if AntiLagRunning then return end
AntiLagRunning = true
local settings = settings().Rendering
local OriginalQuality = settings.QualityLevel
settings.QualityLevel = Enum.QualityLevel.Level01
task.spawn(function()
while Globals.AntiLag do
local TowersFolder = workspace:FindFirstChild("Towers")
local ClientUnits = workspace:FindFirstChild("ClientUnits")
if TowersFolder then
for _, tower in ipairs(TowersFolder:GetChildren()) do
local anims = tower:FindFirstChild("Animations")
local weapon = tower:FindFirstChild("Weapon")
local projectiles = tower:FindFirstChild("Projectiles")
if anims then anims:Destroy() end
if projectiles then projectiles:Destroy() end
if weapon then weapon:Destroy() end
end
end
if ClientUnits then
for _, unit in ipairs(ClientUnits:GetChildren()) do
unit:Destroy()
end
end
task.wait(0.5)
end
AntiLagRunning = false
end)
end
local function StartAutoChain()
if AutoChainRunning or not Globals.AutoChain then return end
AutoChainRunning = true
task.spawn(function()
local idx = 1
while Globals.AutoChain do
local commander = {}
local TowersFolder = workspace:FindFirstChild("Towers")
if TowersFolder then
for _, towers in ipairs(TowersFolder:GetDescendants()) do
if towers:IsA("Folder") and towers.Name == "TowerReplicator"
and towers:GetAttribute("Name") == "Commander"
and towers:GetAttribute("OwnerId") == game.Players.LocalPlayer.UserId
and (towers:GetAttribute("Upgrade") or 0) >= 2 then
commander[#commander + 1] = towers.Parent
end
end
end
if #commander >= 3 then
if idx > #commander then idx = 1 end
local CurrentCommander = commander[idx]
local replicator = CurrentCommander:FindFirstChild("TowerReplicator")
local UpgradeLevel = replicator and replicator:GetAttribute("Upgrade") or 0
if UpgradeLevel >= 4 and Globals.SupportCaravan then
RemoteFunc:InvokeServer(
"Troops",
"Abilities",
"Activate",
{ Troop = CurrentCommander, Name = "Support Caravan", Data = {} }
)
task.wait(0.1)
end
local response = RemoteFunc:InvokeServer(
"Troops",
"Abilities",
"Activate",
{ Troop = CurrentCommander, Name = "Call Of Arms", Data = {} }
)
if response then
idx += 1
local hotbar = PlayerGui:FindFirstChild("ReactUniversalHotbar")
local TimescaleFrame = hotbar and hotbar.Frame:FindFirstChild("timescale")
if TimescaleFrame and TimescaleFrame.Visible then
if TimescaleFrame:FindFirstChild("Lock") then
task.wait(10.3)
else
task.wait(5.25)
end
else
task.wait(10.3)
end
else
task.wait(0.5)
end
else
task.wait(1)
end
end
AutoChainRunning = false
end)
end
local function StartAutoDjBooth()
if AutoDjRunning or not Globals.AutoDJ then return end
AutoDjRunning = true
task.spawn(function()
while Globals.AutoDJ do
local TowersFolder = workspace:FindFirstChild("Towers")
if TowersFolder then
for _, towers in ipairs(TowersFolder:GetDescendants()) do
if towers:IsA("Folder") and towers.Name == "TowerReplicator"
and towers:GetAttribute("Name") == "DJ Booth"
and towers:GetAttribute("OwnerId") == game.Players.LocalPlayer.UserId
and (towers:GetAttribute("Upgrade") or 0) >= 3 then
DJ = towers.Parent
end
end
end
if DJ then
RemoteFunc:InvokeServer(
"Troops",
"Abilities",
"Activate",
{ Troop = DJ, Name = "Drop The Beat", Data = {} }
)
end
task.wait(1)
end
AutoDjRunning = false
end)
end
local function StartAutoNecro()
if AutoNecroRunning or not Globals.AutoNecro then return end
AutoNecroRunning = true
local lastActivation = 0
local ownerId = game.Players.LocalPlayer.UserId
local function getNecros(towersFolder)
local list = {}
if not towersFolder then
return list
end
for _, rep in ipairs(towersFolder:GetDescendants()) do
if rep:IsA("Folder") and rep.Name == "TowerReplicator"
and rep:GetAttribute("Name") == "Necromancer"
and rep:GetAttribute("OwnerId") == ownerId then
list[#list + 1] = rep.Parent
end
end
return list
end
local function pickMaxGraves(rep, graveStore, up)
local maxGraves = rep and rep:GetAttribute("Max_Graves")
if graveStore then
local gMax = graveStore:GetAttribute("Max_Graves")
if type(gMax) == "number" and gMax > 0 then
maxGraves = gMax
end
end
if not maxGraves or maxGraves < 2 then
if up >= 4 then
maxGraves = 9
elseif up >= 2 then
maxGraves = 6
else
maxGraves = 3
end
end
return maxGraves
end
local function countGraves(graveStore)
if not graveStore then
return 0
end
local cnt = 0
for k, v in pairs(graveStore:GetAttributes()) do
if type(k) == "string" and #k > 20 then
local isDestroy = false
if type(v) == "table" then
for _, elem in pairs(v) do
if tostring(elem) == "Destroy" then
isDestroy = true
break
end
end
elseif tostring(v):find("Destroy") then
isDestroy = true
end
if isDestroy then
graveStore:SetAttribute(k, nil)
else
cnt += 1
end
end
end
return cnt
end
local function cleanAllGraves(list)
for _, necro in ipairs(list) do
local rep = necro and necro:FindFirstChild("TowerReplicator")
local store = rep and rep:FindFirstChild("GraveStone")
if store then
countGraves(store)
end
end
end
task.spawn(function()
local idx = 1
while Globals.AutoNecro do
local TowersFolder = workspace:FindFirstChild("Towers")
local necromancer = getNecros(TowersFolder)
cleanAllGraves(necromancer)
if #necromancer >= 1 then
if idx > #necromancer then idx = 1 end
local CurrentNecromancer = necromancer[idx]
local replicator = CurrentNecromancer:FindFirstChild("TowerReplicator")
local up = replicator and (replicator:GetAttribute("Upgrade") or 0) or 0
local graveStore = replicator and replicator:FindFirstChild("GraveStone")
local maxGraves = pickMaxGraves(replicator, graveStore, up)
local graveCount = countGraves(graveStore)
local debounce = (replicator and replicator:GetAttribute("AbilityDebounce")) or 5
local now = os.clock()
if maxGraves and graveCount >= maxGraves and (now - lastActivation >= debounce) then
local response = RemoteFunc:InvokeServer(
"Troops",
"Abilities",
"Activate",
{ Troop = CurrentNecromancer, Name = "Raise The Dead", Data = {} }
)
if response then
lastActivation = now
idx += 1
task.wait(1)
else
task.wait(0.5)
end
else
task.wait(0.1)
end
else
task.wait(1)
end
end
AutoNecroRunning = false
end)
end
local function StartAutoMercenary()
if not Globals.AutoMercenary and not Globals.AutoMilitary then return end
if AutoMercenaryBaseRunning then return end
AutoMercenaryBaseRunning = true
task.spawn(function()
while Globals.AutoMercenary do
local TowersFolder = workspace:FindFirstChild("Towers")
if TowersFolder then
for _, towers in ipairs(TowersFolder:GetDescendants()) do
if towers:IsA("Folder") and towers.Name == "TowerReplicator"
and towers:GetAttribute("Name") == "Mercenary Base"
and towers:GetAttribute("OwnerId") == game.Players.LocalPlayer.UserId
and (towers:GetAttribute("Upgrade") or 0) >= 5 then
RemoteFunc:InvokeServer(
"Troops",
"Abilities",
"Activate",
{
Troop = towers.Parent,
Name = "Air-Drop",
Data = {
pathName = 1,
directionCFrame = CFrame.new(),
dist = Globals.MercenaryPath or 195
}
}
)
task.wait(0.5)
if not Globals.AutoMercenary then break end
end
end
end
task.wait(0.5)
end
AutoMercenaryBaseRunning = false
end)
end
local function StartAutoMilitary()
if not Globals.AutoMilitary then return end
if AutoMilitaryBaseRunning then return end
AutoMilitaryBaseRunning = true
task.spawn(function()
while Globals.AutoMilitary do
local TowersFolder = workspace:FindFirstChild("Towers")
if TowersFolder then
for _, towers in ipairs(TowersFolder:GetDescendants()) do
if towers:IsA("Folder") and towers.Name == "TowerReplicator"
and towers:GetAttribute("Name") == "Military Base"
and towers:GetAttribute("OwnerId") == game.Players.LocalPlayer.UserId
and (towers:GetAttribute("Upgrade") or 0) >= 4 then
RemoteFunc:InvokeServer(
"Troops",
"Abilities",
"Activate",
{
Troop = towers.Parent,
Name = "Airstrike",
Data = {
pathName = 1,
pointToEnd = CFrame.new(),
dist = Globals.MilitaryPath or 195
}
}
)
task.wait(0.5)
if not Globals.AutoMilitary then break end
end
end
end
task.wait(0.5)
end
AutoMilitaryBaseRunning = false
end)
end
local function StartSellFarm()
if SellFarmsRunning or not Globals.SellFarms then return end
SellFarmsRunning = true
if GameState ~= "GAME" then
return false
end
task.spawn(function()
while Globals.SellFarms do
local CurrentWave = GetCurrentWave()
if Globals.SellFarmsWave and CurrentWave < Globals.SellFarmsWave then
task.wait(1)
continue
end
local TowersFolder = workspace:FindFirstChild("Towers")
if TowersFolder then
for _, replicator in ipairs(TowersFolder:GetDescendants()) do
if replicator:IsA("Folder") and replicator.Name == "TowerReplicator" then
local IsFarm = replicator:GetAttribute("Name") == "Farm"
local IsMine = replicator:GetAttribute("OwnerId") == game.Players.LocalPlayer.UserId
if IsFarm and IsMine then
local TowerModel = replicator.Parent
RemoteFunc:InvokeServer("Troops", "Sell", { Troop = TowerModel })
task.wait(0.2)
end
end
end
end
task.wait(1)
end
SellFarmsRunning = false
end)
end
task.spawn(function()
while true do
if Globals.AutoPickups and not AutoPickupsRunning then
StartAutoPickups()
end
if Globals.AutoSkip and not AutoSkipRunning then
StartAutoSkip()
end
if Globals.TimeScaleEnabled and not TimeScaleRunning then
StartTimeScale()
end
if Globals.AutoChain and not AutoChainRunning then
StartAutoChain()
end
if Globals.AutoDJ and not AutoDjRunning then
StartAutoDjBooth()
end
if Globals.AutoNecro and not AutoNecroRunning then
StartAutoNecro()
end
if Globals.AutoMercenary and not AutoMercenaryBaseRunning then
StartAutoMercenary()
end
if Globals.AutoMilitary and not AutoMilitaryBaseRunning then
StartAutoMilitary()
end
if Globals.SellFarms and not SellFarmsRunning then
StartSellFarm()
end
if Globals.AntiLag and not AntiLagRunning then
StartAntiLag()
end
if Globals.AutoRejoin and not BackToLobbyRunning then
StartBackToLobby()
end
if Globals.AutoGatling and not AutoGatlingRunning then
StartAutoGatling()
end
if Globals.AutoPremium and not AutoPremiumRunning then
StartAutoPremium()
end
task.wait(1)
end
end)
if Globals.ClaimRewards and not AutoClaimRewards then
StartClaimRewards()
end
MissionsUIFix()
return TDSLoads code from the internet. It downloads more code when it runs (loadstring + HttpGet), which can change after it was posted. From: api.jnkie.com, raw.githubusercontent.com, discord.gg, discord.com.