Run it
Copy the script and paste it into your executor.
HttpService = :()
CoreGui = :()
Players = :()
RbxAnalyticsService = :()
cloneref = cloneref (o) o
gethui = gethui () CoreGui
CoreGui = (:())
Players = (:())
VirtualInputManager = (:())
UserInputService = (:())
RunService = (:())
TweenService = (:())
LogService = (:())
GuiService = (:())
= ( .request) ( .request) (fluxus fluxus.request)
TOGGLE_KEY = .KeyCode.RightControl
MIN_CPM =
MAX_CPM_LEGIT =
MAX_CPM_BLATANT =
.(.())
THEME = {
Background = .(, , ),
ItemBG = .(, , ),
Accent = .(, , ),
Text = .(, , ),
SubText = .(, , ),
Success = .(, , ),
Warning = .(, , ),
Slider = .(, , )
}
(c)
.(, .(c.R * ), .(c.G * ), .(c.B * ))
ConfigFile =
Config = {
CPM = ,
Blatant = ,
Humanize = ,
FingerModel = ,
SortMode = ,
SuffixMode = ,
LengthMode = ,
AutoPlay = ,
AutoJoin = ,
AutoJoinSettings = {
_1v1 = ,
_4p = ,
_8p =
},
PanicMode = ,
ShowKeyboard = ,
ErrorRate = ,
ThinkDelay = ,
RiskyMistakes = ,
CustomWords = {},
MinTypeSpeed = ,
MaxTypeSpeed = ,
KeyboardLayout =
}
()
writefile
(ConfigFile, HttpService:(Config))
()
isfile (ConfigFile)
success, decoded = (() HttpService:((ConfigFile)) )
success decoded
k, v (decoded) Config[k] = v
()
Config.SortMode =
currentCPM = Config.CPM
isBlatant = Config.Blatant
useHumanization = Config.Humanize
useFingerModel = Config.FingerModel
sortMode = Config.SortMode
suffixMode = Config.SuffixMode
lengthMode = Config.LengthMode
autoPlay = Config.AutoPlay
autoJoin = Config.AutoJoin
panicMode = Config.PanicMode
showKeyboard = Config.ShowKeyboard
errorRate = Config.ErrorRate
thinkDelayCurrent = Config.ThinkDelay
riskyMistakes = Config.RiskyMistakes
keyboardLayout = Config.KeyboardLayout
isTyping =
isAutoPlayScheduled =
lastTypingStart =
runConn =
inputConn =
logConn =
unloaded =
isMyTurnLogDetected =
logRequiredLetters =
turnExpiryTime =
Blacklist = {}
UsedWords = {}
RandomOrderCache = {}
RandomPriority = {}
lastDetected =
lastLogicUpdate =
lastAutoJoinCheck =
lastWordCheck =
cachedDetected =
cachedCensored =
LOGIC_RATE =
AUTO_JOIN_RATE =
UpdateList
ButtonCache = {}
ButtonData = {}
JoinDebounce = {}
thinkDelayMin =
thinkDelayMax =
listUpdatePending =
forceUpdateList =
lastInputTime =
LIST_DEBOUNCE =
currentBestMatch =
logConn logConn:()
logConn = LogService.MessageOut:((message, )
wordPart, timePart = message:()
wordPart timePart
isMyTurnLogDetected =
logRequiredLetters = wordPart
turnExpiryTime = () + (timePart)
)
url =
fileName =
LoadingGui = .()
LoadingGui.Name =
success, parent = (() () )
success parent parent = :()
LoadingGui.Parent = parent
LoadingGui.ZIndexBehavior = .ZIndexBehavior.Sibling
LoadingFrame = .(, LoadingGui)
LoadingFrame.Size = .(, , , )
LoadingFrame.Position = .(, -, , )
LoadingFrame.BackgroundColor3 = THEME.Background
LoadingFrame.BorderSizePixel =
.(, LoadingFrame).CornerRadius = .(, )
LStroke = .(, LoadingFrame)
LStroke.Color = THEME.Accent
LStroke.Transparency =
LStroke.Thickness =
LoadingTitle = .(, LoadingFrame)
LoadingTitle.Size = .(, , , )
LoadingTitle.BackgroundTransparency =
LoadingTitle.Text =
LoadingTitle.TextColor3 = THEME.Accent
LoadingTitle.Font = .Font.GothamBold
LoadingTitle.TextSize =
LoadingStatus = .(, LoadingFrame)
LoadingStatus.Size = .(, -, , )
LoadingStatus.Position = .(, , , )
LoadingStatus.BackgroundTransparency =
LoadingStatus.Text =
LoadingStatus.TextColor3 = THEME.Text
LoadingStatus.Font = .Font.Gotham
LoadingStatus.TextSize =
(text, color)
LoadingStatus.Text = text
color LoadingStatus.TextColor3 = color
:().RenderStepped:()
()
(, THEME.Warning)
success, res = (()
({Url = url, Method = })
)
success res res.Body
(fileName, res.Body)
(, THEME.Success)
(, .(, , ))
.()
()
Words = {}
SeenWords = {}
(fname)
(, THEME.Warning)
(fname)
content = (fname)
w content:()
clean = w:(, ):()
#clean > SeenWords[clean]
SeenWords[clean] =
.(Words, clean)
( .. #Words .. , THEME.Success)
(, .(, , ))
.()
(fileName)
LoadingGui LoadingGui:()
.(Words)
Buckets = {}
_, w (Words)
c = w:(,)
c == c =
Buckets[c] = Buckets[c] {}
.(Buckets[c], w)
Config.CustomWords
_, w (Config.CustomWords)
clean = w:(, ):()
#clean > SeenWords[clean]
SeenWords[clean] =
.(Words, clean)
c = clean:(,)
c == c =
Buckets[c] = Buckets[c] {}
.(Buckets[c], clean)
SeenWords =
(t)
n = #t
i = n, , -
j = .(i)
t[i], t[j] = t[j], t[i]
t
HardLetterScores = {
x = , z = , q = , j = , v = , k = , b = , f = , w = ,
y = , g = , p =
}
(word)
lastChar = word:(-)
HardLetterScores[lastChar]
(obj, props, time)
TweenService:(obj, TweenInfo.(time , .EasingStyle.Quad, .EasingDirection.Out), props):()
(providedFrame)
frame = providedFrame
frame
player = Players.LocalPlayer
gui = player player:()
inGame = gui gui:()
frame = inGame inGame:()
container = frame frame:()
container ,
detected =
censored =
children = container:()
letterData = {}
_, c (children)
c:() c.Visible
txt = c:()
txt txt:() txt.TextTransparency <
.(letterData, {
Obj = c,
Txt = txt,
X = c.AbsolutePosition.X,
Id = (c.Name)
})
.(letterData, (a,b)
.(a.X - b.X) >
a.X < b.X
a.Id < b.Id
)
_, data (letterData)
t = (data.Txt.Text)
t:() t:() censored =
detected = detected .. t
detected:():(, ), censored
(providedFrame)
isMyTurnLogDetected
() < turnExpiryTime
, logRequiredLetters
isMyTurnLogDetected =
frame = providedFrame
frame
player = Players.LocalPlayer
gui = player player:()
inGame = gui gui:()
frame = inGame inGame:()
typeLbl = frame frame:()
typeLbl typeLbl:()
text = typeLbl.Text
player = Players.LocalPlayer
text:(, #player.Name) == player.Name text:(, #player.DisplayName) == player.DisplayName
char = text:()
, char
,
()
success, result = (()
()
)
success result result
success, result = (()
CoreGui
)
success result result
Players.LocalPlayer.PlayerGui
ParentTarget = ()
GuiName = (.(, ))
env = ( ())
env.WordHelperInstance env.WordHelperInstance.Parent
env.WordHelperInstance:()
ScreenGui = .()
ScreenGui.Name = GuiName
ScreenGui.Parent = ParentTarget
ScreenGui.ZIndexBehavior = .ZIndexBehavior.Sibling
env.WordHelperInstance = ScreenGui
ToastContainer = .(, ScreenGui)
ToastContainer.Name =
ToastContainer.Size = .(, , , )
ToastContainer.Position = .(, -, , )
ToastContainer.BackgroundTransparency =
ToastContainer.ZIndex =
(message, )
toast = .()
toast.Size = .(, , , )
toast.BackgroundColor3 = THEME.ItemBG
toast.BorderSizePixel =
toast.BackgroundTransparency =
toast.Parent = ToastContainer
stroke = .(, toast)
stroke.Thickness =
stroke.Transparency =
color = THEME.Text
== color = THEME.Success
== color = THEME.Warning
== color = .(, , )
stroke.Color = color
.(, toast).CornerRadius = .(, )
lbl = .(, toast)
lbl.Size = .(, -, , )
lbl.Position = .(, , , )
lbl.BackgroundTransparency =
lbl.Text = message
lbl.TextColor3 = color
lbl.Font = .Font.GothamMedium
lbl.TextSize =
lbl.TextWrapped =
lbl.TextTransparency =
(toast, {BackgroundTransparency = }, )
(lbl, {TextTransparency = }, )
(stroke, {Transparency = }, )
.(, ()
toast toast.Parent
(toast, {BackgroundTransparency = }, )
(lbl, {TextTransparency = }, )
(stroke, {Transparency = }, )
.()
toast:()
)
MainFrame = .()
MainFrame.Name =
MainFrame.Size = .(, , , )
MainFrame.Position = .(, -, , )
MainFrame.BackgroundColor3 = THEME.Background
MainFrame.BorderSizePixel =
MainFrame.Active =
MainFrame.ClipsDescendants =
MainFrame.Parent = ScreenGui
(frame)
dragging, dragInput, dragStart, startPos
(input)
delta = input.Position - dragStart
frame.Position = .(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y)
frame.InputBegan:((input)
input.UserInputType == .UserInputType.MouseButton1 input.UserInputType == .UserInputType.Touch
dragging =
dragStart = input.Position
startPos = frame.Position
input.Changed:(()
input.UserInputState == .UserInputState.End
dragging =
)
)
frame.InputChanged:((input)
input.UserInputType == .UserInputType.MouseMovement input.UserInputType == .UserInputType.Touch
dragInput = input
)
UserInputService.InputChanged:((input)
input == dragInput dragging
(input)
)
(MainFrame)
.(, MainFrame).CornerRadius = .(, )
Stroke = .(, MainFrame)
Stroke.Color = THEME.Accent
Stroke.Transparency =
Stroke.Thickness =
Header = .(, MainFrame)
Header.Size = .(, , , )
Header.BackgroundColor3 = THEME.ItemBG
Header.BorderSizePixel =
Title = .(, Header)
Title.Text =
Title.RichText =
Title.Font = .Font.GothamBold
Title.TextSize =
Title.TextColor3 = THEME.Text
Title.Size = .(, -, , )
Title.Position = .(, , , )
Title.BackgroundTransparency =
Title.TextXAlignment = .TextXAlignment.Left
MinBtn = .(, Header)
MinBtn.Text =
MinBtn.Font = .Font.GothamBold
MinBtn.TextSize =
MinBtn.TextColor3 = THEME.SubText
MinBtn.Size = .(, , , )
MinBtn.Position = .(, -, , )
MinBtn.BackgroundTransparency =
CloseBtn = .(, Header)
CloseBtn.Text =
CloseBtn.Font = .Font.GothamBold
CloseBtn.TextSize =
CloseBtn.TextColor3 = .(, , )
CloseBtn.Size = .(, , , )
CloseBtn.Position = .(, -, , )
CloseBtn.BackgroundTransparency =
CloseBtn.MouseButton1Click:(()
unloaded =
runConn runConn:() runConn =
inputConn inputConn:() inputConn =
logConn logConn:() logConn =
_, btn (ButtonCache) btn:()
.(ButtonCache)
ScreenGui ScreenGui.Parent ScreenGui:()
)
StatusFrame = .(, MainFrame)
StatusFrame.Size = .(, -, , )
StatusFrame.Position = .(, , , )
StatusFrame.BackgroundTransparency =
StatusDot = .(, StatusFrame)
StatusDot.Size = .(, , , )
StatusDot.Position = .(, , , -)
StatusDot.BackgroundColor3 = THEME.SubText
.(, StatusDot).CornerRadius = .(, )
StatusText = .(, StatusFrame)
StatusText.Text =
StatusText.RichText =
StatusText.Font = .Font.Gotham
StatusText.TextSize =
StatusText.TextColor3 = THEME.SubText
StatusText.Size = .(, -, , )
StatusText.Position = .(, , , )
StatusText.BackgroundTransparency =
StatusText.TextXAlignment = .TextXAlignment.Left
SearchFrame = .(, MainFrame)
SearchFrame.Size = .(, -, , )
SearchFrame.Position = .(, , , )
SearchFrame.BackgroundColor3 = THEME.ItemBG
.(, SearchFrame).CornerRadius = .(, )
SearchBox = .(, SearchFrame)
SearchBox.Size = .(, -, , )
SearchBox.Position = .(, , , )
SearchBox.BackgroundTransparency =
SearchBox.Font = .Font.Gotham
SearchBox.TextSize =
SearchBox.TextColor3 = THEME.Text
SearchBox.PlaceholderText =
SearchBox.PlaceholderColor3 = THEME.SubText
SearchBox.Text =
SearchBox.TextXAlignment = .TextXAlignment.Left
SearchBox:():(()
UpdateList
(lastDetected, lastRequiredLetter)
)
ScrollList = .(, MainFrame)
ScrollList.Size = .(, -, , -)
ScrollList.Position = .(, , , )
ScrollList.BackgroundTransparency =
ScrollList.ScrollBarThickness =
ScrollList.ScrollBarImageColor3 = THEME.Accent
ScrollList.CanvasSize = .(,,,)
UIListLayout = .(, ScrollList)
UIListLayout.SortOrder = .SortOrder.LayoutOrder
UIListLayout.Padding = .(, )
SettingsFrame = .(, MainFrame)
SettingsFrame.BackgroundColor3 = THEME.ItemBG
SettingsFrame.BorderSizePixel =
SettingsFrame.ClipsDescendants =
SlidersFrame = .(, SettingsFrame)
SlidersFrame.Size = .(, , , )
SlidersFrame.BackgroundTransparency =
TogglesFrame = .(, SettingsFrame)
TogglesFrame.Size = .(, , , )
TogglesFrame.Position = .(, , , )
TogglesFrame.BackgroundTransparency =
TogglesFrame.Visible =
sep = .(, SettingsFrame)
sep.Size = .(, , , )
sep.BackgroundColor3 = .(, , )
settingsCollapsed =
()
settingsCollapsed
(SettingsFrame, {Size = .(, , , ), Position = .(, , , -)})
(ScrollList, {Size = .(, -, , -)})
TogglesFrame.Visible =
(SettingsFrame, {Size = .(, , , ), Position = .(, , , -)})
(ScrollList, {Size = .(, -, , -)})
TogglesFrame.Visible =
()
ExpandBtn = .(, SlidersFrame)
ExpandBtn.Text =
ExpandBtn.Font = .Font.GothamBold
ExpandBtn.TextSize =
ExpandBtn.TextColor3 = THEME.Accent
ExpandBtn.BackgroundColor3 = .(, , )
ExpandBtn.BackgroundTransparency =
ExpandBtn.Size = .(, -, , )
ExpandBtn.Position = .(, , , -)
.(, ExpandBtn).CornerRadius = .(, )
ExpandBtn.MouseButton1Click:(()
settingsCollapsed = settingsCollapsed
ExpandBtn.Text = settingsCollapsed
()
)
(btn, bg, fill, callback)
btn.MouseButton1Down:(()
move, rel
()
mousePos = UserInputService:()
relX = .(mousePos.X - bg.AbsolutePosition.X, , bg.AbsoluteSize.X)
pct = relX / bg.AbsoluteSize.X
(pct)
Config.CPM = currentCPM
Config.ErrorRate = errorRate
Config.ThinkDelay = thinkDelayCurrent
()
move = RunService.RenderStepped:(Update)
rel = UserInputService.InputEnded:((inp)
inp.UserInputType == .UserInputType.MouseButton1 inp.UserInputType == .UserInputType.Touch
move move:() move =
rel rel:() rel =
()
)
)
KeyboardFrame = .(, ScreenGui)
KeyboardFrame.Name =
KeyboardFrame.Size = .(, , , )
KeyboardFrame.Position = .(, , , -)
KeyboardFrame.BackgroundColor3 = THEME.Background
KeyboardFrame.Visible = showKeyboard
(KeyboardFrame)
.(, KeyboardFrame).CornerRadius = .(, )
KStroke = .(, KeyboardFrame)
KStroke.Color = THEME.Accent
KStroke.Transparency =
KStroke.Thickness =
Keys = {}
(char, pos, size)
k = .(, KeyboardFrame)
k.Size = size .(, , , )
k.Position = pos
k.BackgroundColor3 = THEME.ItemBG
.(, k).CornerRadius = .(, )
l = .(, k)
l.Size = .(,,,)
l.BackgroundTransparency =
l.Text = char:()
l.TextColor3 = THEME.Text
l.Font = .Font.GothamBold
l.TextSize =
Keys[char:()] = k
k
()
_, c (KeyboardFrame:())
c:() c:() c:()
Keys = {}
rows
keyboardLayout ==
rows = {
{,,,,,,,,,},
{,,,,,,,,},
{,,,,,,}
}
keyboardLayout ==
rows = {
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,}
}
rows = {
{,,,,,,,,,},
{,,,,,,,,},
{,,,,,,}
}
startY =
spacing =
r, rowChars (rows)
rowWidth = #rowChars *
startX = ( - rowWidth) /
i = , #rowChars
char = rowChars[i]
(char, .(, startX + (i-)*, , startY + (r-)*))
space = (, .(, -, , startY + *), .(, , , ))
space.(space, ).Text =
()
(parent, text, options, default, callback)
container = .(, parent)
container.Size = .(, , , )
container.BackgroundColor3 = THEME.Background
container.ZIndex =
.(, container).CornerRadius = .(, )
mainBtn = .(, container)
mainBtn.Size = .(, , , )
mainBtn.BackgroundTransparency =
mainBtn.Text = text .. .. default
mainBtn.Font = .Font.GothamMedium
mainBtn.TextSize =
mainBtn.TextColor3 = THEME.Accent
mainBtn.ZIndex =
listFrame = .(, container)
listFrame.Size = .(, , , #options * )
listFrame.Position = .(, , , )
listFrame.BackgroundColor3 = THEME.ItemBG
listFrame.Visible =
listFrame.ZIndex =
.(, listFrame).CornerRadius = .(, )
isOpen =
mainBtn.MouseButton1Click:(()
isOpen = isOpen
listFrame.Visible = isOpen
)
i, opt (options)
btn = .(, listFrame)
btn.Size = .(, , , )
btn.Position = .(, , , (i-)*)
btn.BackgroundTransparency =
btn.Text = opt
btn.Font = .Font.Gotham
btn.TextSize =
btn.TextColor3 = THEME.Text
btn.ZIndex =
btn.MouseButton1Click:(()
mainBtn.Text = text .. .. opt
isOpen =
listFrame.Visible =
(opt)
)
container
LayoutDropdown = (TogglesFrame, , {, , }, keyboardLayout, (val)
keyboardLayout = val
Config.KeyboardLayout = keyboardLayout
()
()
)
LayoutDropdown.Position = .(, , , )
UserInputService.InputBegan:((input)
showKeyboard
input.UserInputType == .UserInputType.Keyboard
char = input.KeyCode.Name:()
Keys[char]
(Keys[char], {BackgroundColor3 = THEME.Accent}, )
input.KeyCode == .KeyCode.Space
(Keys[], {BackgroundColor3 = THEME.Accent}, )
)
UserInputService.InputEnded:((input)
showKeyboard
input.UserInputType == .UserInputType.Keyboard
char = input.KeyCode.Name:()
Keys[char]
(Keys[char], {BackgroundColor3 = THEME.ItemBG}, )
input.KeyCode == .KeyCode.Space
(Keys[], {BackgroundColor3 = THEME.ItemBG}, )
)
SliderLabel = .(, SlidersFrame)
SliderLabel.Text = .. currentCPM ..
SliderLabel.Font = .Font.GothamMedium
SliderLabel.TextSize =
SliderLabel.TextColor3 = THEME.SubText
SliderLabel.Size = .(, -, , )
SliderLabel.Position = .(, , , )
SliderLabel.BackgroundTransparency =
SliderLabel.TextXAlignment = .TextXAlignment.Left
SliderBg = .(, SlidersFrame)
SliderBg.Size = .(, -, , )
SliderBg.Position = .(, , , )
SliderBg.BackgroundColor3 = THEME.Slider
.(, SliderBg).CornerRadius = .(, )
SliderFill = .(, SliderBg)
SliderFill.Size = .(, , , )
SliderFill.BackgroundColor3 = THEME.Accent
.(, SliderFill).CornerRadius = .(, )
SliderBtn = .(, SliderBg)
SliderBtn.Size = .(,,,)
SliderBtn.BackgroundTransparency =
SliderBtn.Text =
ErrorLabel = .(, SlidersFrame)
ErrorLabel.Text = .. errorRate ..
ErrorLabel.Font = .Font.GothamMedium
ErrorLabel.TextSize =
ErrorLabel.TextColor3 = THEME.SubText
ErrorLabel.Size = .(, -, , )
ErrorLabel.Position = .(, , , )
ErrorLabel.BackgroundTransparency =
ErrorLabel.TextXAlignment = .TextXAlignment.Left
ErrorBg = .(, SlidersFrame)
ErrorBg.Size = .(, -, , )
ErrorBg.Position = .(, , , )
ErrorBg.BackgroundColor3 = THEME.Slider
.(, ErrorBg).CornerRadius = .(, )
ErrorFill = .(, ErrorBg)
ErrorFill.Size = .(errorRate/, , , )
ErrorFill.BackgroundColor3 = .(, , )
.(, ErrorFill).CornerRadius = .(, )
ErrorBtn = .(, ErrorBg)
ErrorBtn.Size = .(,,,)
ErrorBtn.BackgroundTransparency =
ErrorBtn.Text =
(ErrorBtn, ErrorBg, ErrorFill, (pct)
errorRate = .(pct * )
Config.ErrorRate = errorRate
ErrorFill.Size = .(pct, , , )
ErrorLabel.Text = .. errorRate ..
)
ThinkLabel = .(, SlidersFrame)
ThinkLabel.Text = .(, thinkDelayCurrent)
ThinkLabel.Font = .Font.GothamMedium
ThinkLabel.TextSize =
ThinkLabel.TextColor3 = THEME.SubText
ThinkLabel.Size = .(, -, , )
ThinkLabel.Position = .(, , , )
ThinkLabel.BackgroundTransparency =
ThinkLabel.TextXAlignment = .TextXAlignment.Left
ThinkBg = .(, SlidersFrame)
ThinkBg.Size = .(, -, , )
ThinkBg.Position = .(, , , )
ThinkBg.BackgroundColor3 = THEME.Slider
.(, ThinkBg).CornerRadius = .(, )
ThinkFill = .(, ThinkBg)
thinkPct = (thinkDelayCurrent - thinkDelayMin) / (thinkDelayMax - thinkDelayMin)
ThinkFill.Size = .(thinkPct, , , )
ThinkFill.BackgroundColor3 = THEME.Accent
.(, ThinkFill).CornerRadius = .(, )
ThinkBtn = .(, ThinkBg)
ThinkBtn.Size = .(,,,)
ThinkBtn.BackgroundTransparency =
ThinkBtn.Text =
(ThinkBtn, ThinkBg, ThinkFill, (pct)
thinkDelayCurrent = thinkDelayMin + pct * (thinkDelayMax - thinkDelayMin)
Config.ThinkDelay = thinkDelayCurrent
ThinkFill.Size = .(pct, , , )
ThinkLabel.Text = .(, thinkDelayCurrent)
)
(text, pos, callback)
btn = .(, TogglesFrame)
btn.Text = text
btn.Font = .Font.GothamMedium
btn.TextSize =
btn.TextColor3 = THEME.Success
btn.BackgroundColor3 = THEME.Background
btn.Size = .(, , , )
btn.Position = pos
.(, btn).CornerRadius = .(, )
btn.MouseButton1Click:(()
newState, newText, newColor = ()
btn.Text = newText
btn.TextColor3 = newColor
()
)
btn
HumanizeBtn = (..(useHumanization ), .(, , , ), ()
useHumanization = useHumanization
Config.Humanize = useHumanization
useHumanization, ..(useHumanization ), useHumanization THEME.Success .(, , )
)
HumanizeBtn.TextColor3 = useHumanization THEME.Success .(, , )
FingerBtn = (..(useFingerModel ), .(, , , ), ()
useFingerModel = useFingerModel
Config.FingerModel = useFingerModel
useFingerModel, ..(useFingerModel ), useFingerModel THEME.Success .(, , )
)
FingerBtn.TextColor3 = useFingerModel THEME.Success .(, , )
KeyboardBtn = (..(showKeyboard ), .(, , , ), ()
showKeyboard = showKeyboard
Config.ShowKeyboard = showKeyboard
KeyboardFrame.Visible = showKeyboard
showKeyboard, ..(showKeyboard ), showKeyboard THEME.Success .(, , )
)
KeyboardBtn.TextColor3 = showKeyboard THEME.Success .(, , )
SortBtn = (..sortMode, .(, , , ), ()
sortMode == sortMode =
sortMode == sortMode =
sortMode == sortMode =
sortMode =
Config.SortMode = sortMode
lastDetected =
, ..sortMode, THEME.Accent
)
SortBtn.TextColor3 = THEME.Accent
SortBtn.Size = .(, , , )
AutoBtn = (..(autoPlay ), .(, , , ), ()
autoPlay = autoPlay
Config.AutoPlay = autoPlay
autoPlay, ..(autoPlay ), autoPlay THEME.Success .(, , )
)
AutoBtn.TextColor3 = autoPlay THEME.Success .(, , )
AutoBtn.Size = .(, , , )
AutoJoinBtn = (..(autoJoin ), .(, , , ), ()
autoJoin = autoJoin
Config.AutoJoin = autoJoin
autoJoin, ..(autoJoin ), autoJoin THEME.Success .(, , )
)
AutoJoinBtn.TextColor3 = autoJoin THEME.Success .(, , )
AutoJoinBtn.Size = .(, , , )
(text, pos, key)
container = .(, TogglesFrame)
container.Size = .(, , , )
container.Position = pos
container.BackgroundColor3 = THEME.ItemBG
container.AutoButtonColor =
container.Text =
.(, container).CornerRadius = .(, )
box = .(, container)
box.Size = .(, , , )
box.Position = .(, , , -)
box.BackgroundColor3 = THEME.Slider
.(, box).CornerRadius = .(, )
check = .(, box)
check.Size = .(, , , )
check.Position = .(, -, , -)
check.BackgroundColor3 = THEME.Success
check.Visible = Config.AutoJoinSettings[key]
.(, check).CornerRadius = .(, )
lbl = .(, container)
lbl.Text = text
lbl.Font = .Font.GothamMedium
lbl.TextSize =
lbl.TextColor3 = THEME.SubText
lbl.Size = .(, -, , )
lbl.Position = .(, , , )
lbl.BackgroundTransparency =
lbl.TextXAlignment = .TextXAlignment.Left
container.MouseButton1Click:(()
Config.AutoJoinSettings[key] = Config.AutoJoinSettings[key]
check.Visible = Config.AutoJoinSettings[key]
Config.AutoJoinSettings[key]
lbl.TextColor3 = THEME.Text
(box, {BackgroundColor3 = THEME.Accent}, )
lbl.TextColor3 = THEME.SubText
(box, {BackgroundColor3 = THEME.Slider}, )
()
)
Config.AutoJoinSettings[key]
lbl.TextColor3 = THEME.Text
box.BackgroundColor3 = THEME.Accent
container
(, .(, , , ), )
(, .(, , , ), )
(, .(, , , ), )
BlatantBtn = (..(isBlatant ), .(, , , ), ()
isBlatant = isBlatant
Config.Blatant = isBlatant
isBlatant, ..(isBlatant ), isBlatant .(, , ) THEME.SubText
)
BlatantBtn.TextColor3 = isBlatant .(, , ) THEME.SubText
BlatantBtn.Size = .(, , , )
RiskyBtn = (..(riskyMistakes ), .(, , , ), ()
riskyMistakes = riskyMistakes
Config.RiskyMistakes = riskyMistakes
riskyMistakes, ..(riskyMistakes ), riskyMistakes .(, , ) THEME.SubText
)
RiskyBtn.TextColor3 = riskyMistakes .(, , ) THEME.SubText
RiskyBtn.Size = .(, , , )
ManageWordsBtn = .(, TogglesFrame)
ManageWordsBtn.Text =
ManageWordsBtn.Font = .Font.GothamMedium
ManageWordsBtn.TextSize =
ManageWordsBtn.TextColor3 = THEME.Accent
ManageWordsBtn.BackgroundColor3 = THEME.Background
ManageWordsBtn.Size = .(, , , )
ManageWordsBtn.Position = .(, , , )
.(, ManageWordsBtn).CornerRadius = .(, )
WordBrowserBtn = .(, TogglesFrame)
WordBrowserBtn.Text =
WordBrowserBtn.Font = .Font.GothamMedium
WordBrowserBtn.TextSize =
WordBrowserBtn.TextColor3 = .(, , )
WordBrowserBtn.BackgroundColor3 = THEME.Background
WordBrowserBtn.Size = .(, , , )
WordBrowserBtn.Position = .(, , , )
.(, WordBrowserBtn).CornerRadius = .(, )
ServerBrowserBtn = .(, TogglesFrame)
ServerBrowserBtn.Text =
ServerBrowserBtn.Font = .Font.GothamMedium
ServerBrowserBtn.TextSize =
ServerBrowserBtn.TextColor3 = .(, , )
ServerBrowserBtn.BackgroundColor3 = THEME.Background
ServerBrowserBtn.Size = .(, , , )
ServerBrowserBtn.Position = .(, , , )
.(, ServerBrowserBtn).CornerRadius = .(, )
CustomWordsFrame = .(, ScreenGui)
CustomWordsFrame.Name =
CustomWordsFrame.Size = .(, , , )
CustomWordsFrame.Position = .(, -, , -)
CustomWordsFrame.BackgroundColor3 = THEME.Background
CustomWordsFrame.Visible =
CustomWordsFrame.ClipsDescendants =
(CustomWordsFrame)
.(, CustomWordsFrame).CornerRadius = .(, )
CWStroke = .(, CustomWordsFrame)
CWStroke.Color = THEME.Accent
CWStroke.Transparency =
CWStroke.Thickness =
CWHeader = .(, CustomWordsFrame)
CWHeader.Text =
CWHeader.Font = .Font.GothamBold
CWHeader.TextSize =
CWHeader.TextColor3 = THEME.Text
CWHeader.Size = .(, , , )
CWHeader.BackgroundTransparency =
CWCloseBtn = .(, CustomWordsFrame)
CWCloseBtn.Text =
CWCloseBtn.Font = .Font.GothamBold
CWCloseBtn.TextSize =
CWCloseBtn.TextColor3 = .(, , )
CWCloseBtn.Size = .(, , , )
CWCloseBtn.Position = .(, -, , )
CWCloseBtn.BackgroundTransparency =
CWCloseBtn.MouseButton1Click:(() CustomWordsFrame.Visible = )
ManageWordsBtn.MouseButton1Click:(()
CustomWordsFrame.Visible = CustomWordsFrame.Visible
CustomWordsFrame.Parent =
CustomWordsFrame.Parent = ScreenGui
)
(box, placeholder)
box.Text = placeholder
box.TextColor3 = THEME.SubText
box.Focused:(()
box.Text == placeholder
box.Text =
box.TextColor3 = THEME.Text
)
box.FocusLost:(()
box.Text ==
box.Text = placeholder
box.TextColor3 = THEME.SubText
)
CWSearchBox = .(, CustomWordsFrame)
CWSearchBox.Font = .Font.Gotham
CWSearchBox.TextSize =
CWSearchBox.BackgroundColor3 = THEME.ItemBG
CWSearchBox.Size = .(, -, , )
CWSearchBox.Position = .(, , , )
.(, CWSearchBox).CornerRadius = .(, )
(CWSearchBox, )
CWScroll = .(, CustomWordsFrame)
CWScroll.Size = .(, -, , -)
CWScroll.Position = .(, , , )
CWScroll.BackgroundTransparency =
CWScroll.ScrollBarThickness =
CWScroll.ScrollBarImageColor3 = THEME.Accent
CWScroll.CanvasSize = .(,,,)
CWListLayout = .(, CWScroll)
CWListLayout.SortOrder = .SortOrder.LayoutOrder
CWListLayout.Padding = .(, )
CWAddBox = .(, CustomWordsFrame)
CWAddBox.Font = .Font.Gotham
CWAddBox.TextSize =
CWAddBox.BackgroundColor3 = THEME.ItemBG
CWAddBox.Size = .(, , , )
CWAddBox.Position = .(, , , -)
.(, CWAddBox).CornerRadius = .(, )
(CWAddBox, )
CWAddBtn = .(, CustomWordsFrame)
CWAddBtn.Text =
CWAddBtn.Font = .Font.GothamBold
CWAddBtn.TextSize =
CWAddBtn.TextColor3 = THEME.Success
CWAddBtn.BackgroundColor3 = THEME.ItemBG
CWAddBtn.Size = .(, , , )
CWAddBtn.Position = .(, -, , -)
.(, CWAddBtn).CornerRadius = .(, )
()
_, c (CWScroll:())
c:() c:()
queryRaw = CWSearchBox.Text
query = (queryRaw == ) queryRaw:():(, )
list = Config.CustomWords {}
shownCount =
i, w (list)
query == w:(query, , )
shownCount = shownCount +
row = .(, CWScroll)
row.Size = .(, -, , )
row.BackgroundColor3 = (shownCount % == ) .(,,) .(,,)
row.BorderSizePixel =
row.Text =
row.AutoButtonColor =
.(, row).CornerRadius = .(, )
row.MouseButton1Click:(()
(w, lastDetected, , )
(row, {BackgroundColor3 = THEME.Accent}, )
.(, ()
(row, {BackgroundColor3 = (shownCount % == ) .(,,) .(,,)}, )
)
)
lbl = .(, row)
lbl.Text = w
lbl.Font = .Font.Gotham
lbl.TextSize =
lbl.TextColor3 = THEME.Text
lbl.Size = .(, -, , )
lbl.Position = .(, , , )
lbl.BackgroundTransparency =
lbl.TextXAlignment = .TextXAlignment.Left
del = .(, row)
del.Text =
del.Font = .Font.GothamBold
del.TextSize =
del.TextColor3 = .(, , )
del.Size = .(, , , )
del.Position = .(, -, , )
del.BackgroundTransparency =
del.MouseButton1Click:(()
.(Config.CustomWords, i)
()
Blacklist[w] =
()
( .. w, )
)
CWScroll.CanvasSize = .(, , , shownCount * )
CWSearchBox:():(RefreshCustomWords)
CWAddBtn.MouseButton1Click:(()
text = CWAddBox.Text
text ==
text = text:(, ):()
#text <
Config.CustomWords Config.CustomWords = {}
_, w (Config.CustomWords)
w == text
(, )
existsInMain =
c = text:(,)
Buckets Buckets[c]
_, w (Buckets[c])
w == text existsInMain =
existsInMain
(, )
.(Config.CustomWords, text)
()
.(Words, text)
c == c =
Buckets[c] = Buckets[c] {}
.(Buckets[c], text)
CWAddBox.Text =
CWAddBox:()
()
( .. text, )
)
()
ServerFrame = .(, ScreenGui)
ServerFrame.Name =
ServerFrame.Size = .(, , , )
ServerFrame.Position = .(, -, , -)
ServerFrame.BackgroundColor3 = THEME.Background
ServerFrame.Visible =
ServerFrame.ClipsDescendants =
(ServerFrame)
.(, ServerFrame).CornerRadius = .(, )
SBStroke = .(, ServerFrame)
SBStroke.Color = THEME.Accent
SBStroke.Transparency =
SBStroke.Thickness =
SBHeader = .(, ServerFrame)
SBHeader.Text =
SBHeader.Font = .Font.GothamBold
SBHeader.TextSize =
SBHeader.TextColor3 = THEME.Text
SBHeader.Size = .(, , , )
SBHeader.BackgroundTransparency =
SBClose = .(, ServerFrame)
SBClose.Text =
SBClose.Font = .Font.GothamBold
SBClose.TextSize =
SBClose.TextColor3 = .(, , )
SBClose.Size = .(, , , )
SBClose.Position = .(, -, , )
SBClose.BackgroundTransparency =
SBClose.MouseButton1Click:(() ServerFrame.Visible = )
SBList = .(, ServerFrame)
SBList.Size = .(, -, , -)
SBList.Position = .(, , , )
SBList.BackgroundTransparency =
SBList.ScrollBarThickness =
SBList.ScrollBarImageColor3 = THEME.Accent
SBLayout = .(, SBList)
SBLayout.Padding = .(, )
SBLayout.SortOrder = .SortOrder.LayoutOrder
ServerSortMode =
SBSortBtn = .(, ServerFrame)
SBSortBtn.Text =
SBSortBtn.Font = .Font.GothamBold
SBSortBtn.TextSize =
SBSortBtn.BackgroundColor3 = THEME.ItemBG
SBSortBtn.TextColor3 = THEME.SubText
SBSortBtn.Size = .(, -, , )
SBSortBtn.Position = .(, , , -)
.(, SBSortBtn).CornerRadius = .(, )
SBRefresh = .(, ServerFrame)
SBRefresh.Text =
SBRefresh.Font = .Font.GothamBold
SBRefresh.TextSize =
SBRefresh.BackgroundColor3 = THEME.Accent
SBRefresh.Size = .(, -, , )
SBRefresh.Position = .(, , , -)
.(, SBRefresh).CornerRadius = .(, )
()
SBRefresh.Text =
_, c (SBList:())
c:() c:()
.(()
success, result = (()
({
Url = .. .PlaceId .. ,
Method =
})
)
success result result.Body
data = HttpService:(result.Body)
data data.data
servers = data.data
ServerSortMode ==
.(servers, (a,b) (a.playing ) < (b.playing ) )
.(servers, (a,b) (a.playing ) > (b.playing ) )
_, srv (servers)
srv.playing srv.maxPlayers srv.id ~= .JobId
row = .(, SBList)
row.Size = .(, -, , )
row.BackgroundColor3 = THEME.ItemBG
.(, row).CornerRadius = .(, )
info = .(, row)
info.Text = .. srv.playing .. .. srv.maxPlayers .. .. (srv.ping ) ..
info.Size = .(, , , )
info.Position = .(, , , )
info.BackgroundTransparency =
info.TextColor3 = THEME.Text
info.Font = .Font.Gotham
info.TextSize =
info.TextXAlignment = .TextXAlignment.Left
join = .(, row)
join.Text =
join.BackgroundColor3 = .(, , )
join.Size = .(, , , )
join.Position = .(, -, , -)
join.Font = .Font.GothamBold
join.TextSize =
join.TextColor3 = .(,,)
.(, join).CornerRadius = .(, )
join.MouseButton1Click:(()
join.Text =
(, )
queue_on_teleport
()
.(()
success, err = (()
:():(.PlaceId, srv.id, Players.LocalPlayer)
)
success
join.Text =
( .. (err), )
.()
join.Text =
)
)
SBList.CanvasSize = .(,,, SBLayout.AbsoluteContentSize.Y)
(, )
SBRefresh.Text =
)
SBSortBtn.MouseButton1Click:(()
ServerSortMode ==
ServerSortMode =
ServerSortMode =
SBSortBtn.Text = .. ServerSortMode
()
)
SBRefresh.MouseButton1Click:(FetchServers)
ServerBrowserBtn.MouseButton1Click:(()
ServerFrame.Visible = ServerFrame.Visible
ServerFrame.Parent =
ServerFrame.Parent = ScreenGui
ServerFrame.Visible
()
)
WordBrowserFrame = .(, ScreenGui)
WordBrowserFrame.Name =
WordBrowserFrame.Size = .(, , , )
WordBrowserFrame.Position = .(, -, , -)
WordBrowserFrame.BackgroundColor3 = THEME.Background
WordBrowserFrame.Visible =
WordBrowserFrame.ClipsDescendants =
(WordBrowserFrame)
.(, WordBrowserFrame).CornerRadius = .(, )
WBStroke = .(, WordBrowserFrame)
WBStroke.Color = THEME.Accent
WBStroke.Transparency =
WBStroke.Thickness =
WBHeader = .(, WordBrowserFrame)
WBHeader.Text =
WBHeader.Font = .Font.GothamBold
WBHeader.TextSize =
WBHeader.TextColor3 = THEME.Text
WBHeader.Size = .(, , , )
WBHeader.BackgroundTransparency =
WBClose = .(, WordBrowserFrame)
WBClose.Text =
WBClose.Font = .Font.GothamBold
WBClose.TextSize =
WBClose.TextColor3 = .(, , )
WBClose.Size = .(, , , )
WBClose.Position = .(, -, , )
WBClose.BackgroundTransparency =
WBClose.MouseButton1Click:(() WordBrowserFrame.Visible = )
WBStartBox = .(, WordBrowserFrame)
WBStartBox.Font = .Font.Gotham
WBStartBox.TextSize =
WBStartBox.BackgroundColor3 = THEME.ItemBG
WBStartBox.Size = .(, , , )
WBStartBox.Position = .(, , , )
.(, WBStartBox).CornerRadius = .(, )
(WBStartBox, )
WBEndBox = .(, WordBrowserFrame)
WBEndBox.Font = .Font.Gotham
WBEndBox.TextSize =
WBEndBox.BackgroundColor3 = THEME.ItemBG
WBEndBox.Size = .(, , , )
WBEndBox.Position = .(, , , )
.(, WBEndBox).CornerRadius = .(, )
(WBEndBox, )
WBLengthBox = .(, WordBrowserFrame)
WBLengthBox.Font = .Font.Gotham
WBLengthBox.TextSize =
WBLengthBox.BackgroundColor3 = THEME.ItemBG
WBLengthBox.Size = .(, , , )
WBLengthBox.Position = .(, , , )
.(, WBLengthBox).CornerRadius = .(, )
(WBLengthBox, )
WBSearchBtn = .(, WordBrowserFrame)
WBSearchBtn.Text =
WBSearchBtn.Font = .Font.GothamBold
WBSearchBtn.TextSize =
WBSearchBtn.BackgroundColor3 = THEME.Accent
WBSearchBtn.Size = .(, , , )
WBSearchBtn.Position = .(, , , )
.(, WBSearchBtn).CornerRadius = .(, )
WBList = .(, WordBrowserFrame)
WBList.Size = .(, -, , -)
WBList.Position = .(, , , )
WBList.BackgroundTransparency =
WBList.ScrollBarThickness =
WBList.ScrollBarImageColor3 = THEME.Accent
WBList.CanvasSize = .(,,,)
WBLayout = .(, WBList)
WBLayout.Padding = .(, )
WBLayout.SortOrder = .SortOrder.LayoutOrder
()
_, c (WBList:())
c:() c.Name ~= c:()
sVal = WBStartBox.Text
eVal = WBEndBox.Text
lVal = (WBLengthBox.Text)
sVal == sVal =
eVal == eVal =
sVal = sVal:():(, )
eVal = eVal:():(, )
suffixMode = eVal
Config.SuffixMode = eVal
lengthMode = lVal
Config.LengthMode = lengthMode
UpdateList
(lastDetected, lastRequiredLetter)
sVal == eVal == lVal
results = {}
limit =
bucket = Words
sVal ~=
c = sVal:(,)
Buckets Buckets[c]
bucket = Buckets[c]
_, w (bucket)
matchStart = (sVal == ) (w:(, #sVal) == sVal)
matchEnd = (eVal == ) (w:(-#eVal) == eVal)
matchLen = ( lVal) (#w == lVal)
matchStart matchEnd matchLen
.(results, w)
#results >= limit
i, w (results)
row = .(, WBList)
row.Size = .(, -, , )
row.BackgroundColor3 = (i % == ) .(,,) .(,,)
row.Text =
row.AutoButtonColor =
.(, row).CornerRadius = .(, )
row.MouseButton1Click:(()
(w, lastDetected, , )
(row, {BackgroundColor3 = THEME.Accent}, )
.(, ()
(row, {BackgroundColor3 = (i % == ) .(,,) .(,,)}, )
)
)
lbl = .(, row)
lbl.Text = w
lbl.Font = .Font.Gotham
lbl.TextSize =
lbl.TextColor3 = THEME.Text
lbl.Size = .(, -, , )
lbl.Position = .(, , , )
lbl.BackgroundTransparency =
lbl.TextXAlignment = .TextXAlignment.Left
WBList.CanvasSize = .(,,, WBLayout.AbsoluteContentSize.Y)
WBSearchBtn.MouseButton1Click:(SearchWords)
WBStartBox.FocusLost:((enter) enter () )
WBEndBox.FocusLost:((enter) enter () )
WBLengthBox.FocusLost:((enter) enter () )
WordBrowserBtn.MouseButton1Click:(()
WordBrowserFrame.Visible = WordBrowserFrame.Visible
WordBrowserFrame.Parent =
WordBrowserFrame.Parent = ScreenGui
)
()
charsPerMin = currentCPM
baseDelay = / charsPerMin
variance = baseDelay *
useHumanization and (baseDelay + math.random()*variance - (variance/2)) or baseDelay
end
local KEY_POS = {}
do
local row1 = "qwertyuiop"
local row2 = "asdfghjkl"
local row3 = "zxcvbnm"
for i = 1, #row1 do
KEY_POS[row1:sub(i,i)] = {x = i, y = 1}
end
for i = 1, #row2 do
KEY_POS[row2:sub(i,i)] = {x = i + 0.5, y = 2}
end
for i = 1, #row3 do
KEY_POS[row3:sub(i,i)] = {x = i + 1, y = 3}
end
end
local function KeyDistance(a, b)
if not a or not b then return 1 end
a = a:lower()
b = b:lower()
local pa = KEY_POS[a]
local pb = KEY_POS[b]
if not pa or not pb then return 1 end
local dx = pa.x - pb.x
local dy = pa.y - pb.y
return math.sqrt(dx*dx + dy*dy)
end
local lastKey = nil
local function CalculateDelayForKeys(prevChar, nextChar)
if isBlatant then
return 60 / currentCPM
end
local charsPerMin = currentCPM
local baseDelay = 60 / charsPerMin
local variance = baseDelay * 0.35
local extra = 0
if useHumanization and useFingerModel and prevChar and nextChar and prevChar ~= "" then
local dist = KeyDistance(prevChar, nextChar)
extra = dist * 0.018 * (550 / math.max(150, currentCPM))
local pa = KEY_POS[prevChar:lower()]
local pb = KEY_POS[nextChar:lower()]
if pa and pb then
if (pa.x <= 5 and pb.x <= 5) or (pa.x > 5 and pb.x > 5) then
extra = extra * 0.8
end
end
end
if useHumanization then
local r = (math.random() + math.random() + math.random()) / 3
local noise = (r * 2 - 1) * variance
return math.max(0.005, baseDelay + extra + noise)
else
return baseDelay
end
end
local VirtualUser = game:GetService("VirtualUser")
local isMobile = UserInputService.TouchEnabled and not UserInputService.KeyboardEnabled
local function GetKeyCode(char)
local layout = Config.KeyboardLayout or "QWERTY"
if type(char) == "string" and #char == 1 then
char = char:lower()
if layout == "QWERTZ" then
if char == "z" then return Enum.KeyCode.Y end
if char == "y" then return Enum.KeyCode.Z end
elseif layout == "AZERTY" then
if char == "a" then return Enum.KeyCode.Q end
if char == "q" then return Enum.KeyCode.A end
if char == "z" then return Enum.KeyCode.W end
if char == "w" then return Enum.KeyCode.Z end
if char == "m" then return Enum.KeyCode.Semicolon end -- M is often next to L
-- NOTE: AZERTY is tricky because M can vary, but standard AZERTY FR places M right of L (where semi-colon is on QWERTY)
-- However, many games might use scan codes where M is actually comma or something else depending on the specific AZERTY variant.
-- For standard AZERTY (France), M is indeed usually where ; is.
end
return Enum.KeyCode[char:upper()]
end
return nil
end
local function SimulateKey(input)
if typeof(input) == "string" and #input == 1 then
local char = input
local vimSuccess = pcall(function()
VirtualInputManager:SendTextInput(char)
end)
if not vimSuccess then
-- Fallback for executors that don't support SendTextInput or for keycodes
local key
pcall(function() key = GetKeyCode(input) end)
if not key then pcall(function() key = Enum.KeyCode[input:upper()] end) end
if key then
pcall(function()
VirtualInputManager:SendKeyEvent(true, key, false, game)
task.wait(0.01)
VirtualInputManager:SendKeyEvent(false, key, false, game)
end)
end
end
return
end
local key
if typeof(input) == "EnumItem" then
key = input
else
pcall(function() key = Enum.KeyCode[input:upper()] end)
end
if key then
local baseHold = math.clamp(12 / currentCPM, 0.015, 0.05)
local hold = isBlatant and 0.002 or (baseHold + (math.random() * 0.01) - 0.005)
local vimSuccess = pcall(function()
VirtualInputManager:SendKeyEvent(true, key, false, game)
task.wait(hold)
VirtualInputManager:SendKeyEvent(false, key, false, game)
end)
if not vimSuccess then
pcall(function()
VirtualUser:TypeKey(key)
end)
end
end
end
local function Backspace(count)
local focused = UserInputService:GetFocusedTextBox()
if focused and focused:IsDescendantOf(game) and focused.TextEditable then
local text = focused.Text
focused.Text = text:sub(1, -count - 1)
lastKey = nil
return
end
local key = Enum.KeyCode.Backspace
for i = 1, count do
pcall(function()
VirtualInputManager:SendKeyEvent(true, key, false, game)
VirtualInputManager:SendKeyEvent(false, key, false, game)
end)
if i % 20 == 0 then task.wait() end
end
lastKey = nil
end
local function PressEnter()
SimulateKey(Enum.KeyCode.Return)
lastKey = nil
end
local function GetGameTextBox()
local player = Players.LocalPlayer
local gui = player and player:FindFirstChild("PlayerGui")
local inGame = gui and gui:FindFirstChild("InGame")
if inGame then
local frame = inGame:FindFirstChild("Frame")
if frame then
for _, c in ipairs(frame:GetDescendants()) do
if c:IsA("TextBox") and c.Visible then return c end
end
end
for _, c in ipairs(inGame:GetDescendants()) do
if c:IsA("TextBox") and c.Visible then return c end
end
end
return UserInputService:GetFocusedTextBox()
end
local function SmartType(targetWord, currentDetected, isCorrection, bypassTurn)
if unloaded then return end
if isTyping then
if (tick() - lastTypingStart) > 15 then
isTyping = false
isAutoPlayScheduled = false
StatusText.Text = "Typing State Reset (Timeout)"
StatusText.TextColor3 = THEME.Warning
else
return
end
end
isTyping = true
lastTypingStart = tick()
local targetBox = GetGameTextBox()
if targetBox then
targetBox:CaptureFocus()
task.wait(0.1)
end
StatusText.Text = "Typing..."
StatusText.TextColor3 = THEME.Accent
Tween(StatusDot, {BackgroundColor3 = THEME.Accent})
local success, err = pcall(function()
if isCorrection then
local commonLen = 0
local minLen = math.min(#targetWord, #currentDetected)
for i = 1, minLen do
if targetWord:sub(i,i) == currentDetected:sub(i,i) then
commonLen = i
else
break
end
end
local backspaceCount = #currentDetected - commonLen
if backspaceCount > 0 then
Backspace(backspaceCount)
task.wait(0.15)
end
local toType = targetWord:sub(commonLen + 1)
for i = 1, #toType do
if not bypassTurn and not GetTurnInfo() then
-- Double check if turn info is just flickering
task.wait(0.05)
if not GetTurnInfo() then break end
end
local ch = toType:sub(i, i)
SimulateKey(ch)
task.wait(CalculateDelayForKeys(lastKey, ch))
lastKey = ch
if useHumanization and math.random() < 0.03 then
task.wait(0.15 + math.random() * 0.45)
end
end
-- Pre-submission verify
local finalCheck = GetGameTextBox()
if not riskyMistakes then
task.wait(0.1)
finalCheck = GetGameTextBox()
if finalCheck and finalCheck.Text ~= targetWord then
StatusText.Text = "Typing mismatch detected!"
StatusText.TextColor3 = THEME.Warning
Backspace(#finalCheck.Text)
isTyping = false
forceUpdateList = true
return
end
end
PressEnter()
local verifyStart = tick()
local accepted = false
while (tick() - verifyStart) < 1.5 do
local currentCheck = GetCurrentGameWord()
if currentCheck == "" or (currentCheck ~= targetWord and currentCheck ~= currentDetected) then
accepted = true
break
end
task.wait(0.05)
end
if not accepted then
Blacklist[targetWord] = true
RandomPriority[targetWord] = nil
for k, list in pairs(RandomOrderCache) do
for i = #list, 1, -1 do
if list[i] == targetWord then table.remove(list, i) end
end
end
StatusText.Text = "Rejected: removed '" .. targetWord .. "'"
StatusText.TextColor3 = THEME.Warning
local focused = UserInputService:GetFocusedTextBox()
if focused and focused:IsDescendantOf(game) and focused.TextEditable then
focused.Text = ""
else
Backspace(#targetWord + 5)
end
lastDetected = "---"
isTyping = false
forceUpdateList = true
return
else
StatusText.Text = "Word Cleared (Corrected)"
StatusText.TextColor3 = THEME.SubText
local current = GetCurrentGameWord()
if #current > 0 then
Backspace(#current)
end
UsedWords[targetWord] = true
isMyTurnLogDetected = false
task.wait(0.2)
end
else
local missingPart = ""
if targetWord:sub(1, #currentDetected) == currentDetected then
missingPart = targetWord:sub(#currentDetected + 1)
else
missingPart = targetWord
end
local letters = "abcdefghijklmnopqrstuvwxyz"
for i = 1, #missingPart do
if not bypassTurn and not GetTurnInfo() then
-- Double check if turn info is just flickering
task.wait(0.05)
if not GetTurnInfo() then break end
end
local ch = missingPart:sub(i, i)
if errorRate > 0 and (math.random() < (errorRate / 100)) then
local typoChar
repeat
local idx = math.random(1, #letters)
typoChar = letters:sub(idx, idx)
until typoChar ~= ch
SimulateKey(typoChar)
if riskyMistakes then
task.wait(0.05 + math.random() * 0.1)
PressEnter()
end
task.wait(CalculateDelayForKeys(lastKey, typoChar))
lastKey = typoChar
local realize = thinkDelayCurrent * (0.6 + math.random() * 0.8)
task.wait(realize)
SimulateKey(Enum.KeyCode.Backspace)
lastKey = nil
task.wait(0.05 + math.random() * 0.08)
SimulateKey(ch)
task.wait(CalculateDelayForKeys(lastKey, ch))
lastKey = ch
else
SimulateKey(ch)
task.wait(CalculateDelayForKeys(lastKey, ch))
lastKey = ch
end
if useHumanization and math.random() < 0.03 then
task.wait(0.12 + math.random() * 0.5)
end
end
-- Pre-submission verify
if not riskyMistakes then
-- Wait a moment for last character to register
task.wait(0.1)
local finalCheck = GetGameTextBox()
if finalCheck and finalCheck.Text ~= targetWord then
StatusText.Text = "Typing mismatch detected!"
StatusText.TextColor3 = THEME.Warning
Backspace(#finalCheck.Text)
isTyping = false
forceUpdateList = true
-- Return without blacklisting
return
end
end
PressEnter()
local verifyStart = tick()
local accepted = false
while (tick() - verifyStart) < 1.5 do
local currentCheck = GetCurrentGameWord()
if currentCheck == "" or (currentCheck ~= targetWord and currentCheck ~= currentDetected) then
accepted = true
break
end
task.wait(0.05)
end
if not accepted then
local postCheck = GetGameTextBox()
if postCheck and postCheck.Text == targetWord then
StatusText.Text = "Enter failed? Retrying..."
PressEnter()
task.wait(0.5)
if GetCurrentGameWord() == currentDetected then
StatusText.Text = "Submission Failed (Lag?)"
StatusText.TextColor3 = THEME.Warning
Backspace(#targetWord)
isTyping = false
forceUpdateList = true
return
end
end
Blacklist[targetWord] = true
for k, list in pairs(RandomOrderCache) do
for i = #list, 1, -1 do
if list[i] == targetWord then table.remove(list, i) end
end
end
StatusText.Text = "Rejected: removed '" .. targetWord .. "'"
StatusText.TextColor3 = THEME.Warning
local focused = UserInputService:GetFocusedTextBox()
if focused and focused:IsDescendantOf(game) and focused.TextEditable then
focused.Text = ""
else
Backspace(#targetWord + 5)
end
isTyping = false
lastDetected = "---"
forceUpdateList = true
task.spawn(function()
task.wait(0.1)
local _, req = GetTurnInfo()
UpdateList(currentDetected, req)
end)
return
else
StatusText.Text = "Verification Failed"
StatusText.TextColor3 = THEME.Warning
local current = GetCurrentGameWord()
if #current > 0 then
Backspace(#current)
end
UsedWords[targetWord] = true
isMyTurnLogDetected = false
task.wait(0.2)
end
end
end)
isTyping = false
forceUpdateList = true
end
local function GetMatchLength(str, prefix)
local len = 0
local max = math.min(#str, #prefix)
for i = 1, max do
local pb = string.byte(prefix, i)
if pb == 35 or pb == string.byte(str, i) then
len = i
else
break
end
end
return len
end
local function BinarySearchStart(list, prefix)
local left = 1
local right = #list
local result = -1
local pLen = #prefix
while left <= right do
local mid = math.floor((left + right) / 2)
local word = list[mid]
local sub = word:sub(1, pLen)
if sub == prefix then
result = mid
right = mid - 1
elseif sub < prefix then
left = mid + 1
else
right = mid - 1
end
end
return result
end
UpdateList = function(detectedText, requiredLetter)
local matches = {}
local searchPrefix = detectedText
local isBacktracked = false
local manualSearch = false
if SearchBox and SearchBox.Text ~= "" then
searchPrefix = SearchBox.Text:lower():gsub("[%s%c]+", "")
manualSearch = true
if requiredLetter and searchPrefix:sub(1,1) ~= requiredLetter:sub(1,1):lower() then
requiredLetter = nil
end
end
if not manualSearch and requiredLetter and #requiredLetter > 0 then
local reqLen = GetMatchLength(requiredLetter, searchPrefix)
if reqLen == #searchPrefix and #requiredLetter > #searchPrefix then
searchPrefix = requiredLetter
end
end
local firstChar = searchPrefix:sub(1,1)
if firstChar == "#" then firstChar = nil end
if (not firstChar or firstChar == "") and requiredLetter then
firstChar = requiredLetter:sub(1,1):lower()
end
local bucket
if firstChar and firstChar ~= "" and Buckets then
bucket = Buckets[firstChar] or {}
else
bucket = Words
end
local function CollectMatches(prefix, tryFallbackLengths)
local exacts = {}
local fallbackExacts = {}
local partials = {}
local maxPartialLen = 0
local limit = 100
if bucket then
local checkWord = function(w)
if Blacklist[w] or UsedWords[w] then return end
-- Check for main list filtering (suffix/length)
if suffixMode ~= "" and w:sub(-#suffixMode) ~= suffixMode then return end
local isLengthMatch = true
if not tryFallbackLengths and lengthMode > 0 then
isLengthMatch = (#w == lengthMode)
elseif tryFallbackLengths and lengthMode > 0 then
isLengthMatch = true
end
if not isLengthMatch then return end
local mLen = GetMatchLength(w, prefix)
if mLen == #prefix then
table.insert(exacts, w)
elseif #exacts == 0 then
if mLen > maxPartialLen then
maxPartialLen = mLen
partials = {w}
elseif mLen == maxPartialLen and mLen > 0 then
if #partials < 50 then table.insert(partials, w) end
end
end
end
local useBinary = true
if prefix:find("#") or prefix:find("%*") then useBinary = false end
if useBinary and #prefix > 0 then
local startIndex = BinarySearchStart(bucket, prefix)
if startIndex ~= -1 then
local count = 0
local loopMax = (sortMode == "Longest" or sortMode == "Shortest") and 99999 or 3000 -- SEARCH MORE IF SORTING
for i = startIndex, #bucket do
local w = bucket[i]
if w:sub(1, #prefix) ~= prefix then break end
checkWord(w)
count = count + 1
if count >= loopMax then break end
end
end
else
-- MODIFIED SEARCH LIMIT LOGIC HERE FOR LENGTH SORTING
local searchLimit = limit
if sortMode == "Random" then
searchLimit = 1000
elseif sortMode == "Longest" or sortMode == "Shortest" then
searchLimit = 999999 -- Check essentially everything if searching for specific length extremes
end
for _, w in ipairs(bucket) do
checkWord(w)
if #exacts >= searchLimit then break end
end
end
if sortMode == "Random" and #exacts > 0 then
shuffleTable(exacts)
end
end
return exacts, partials, maxPartialLen
end
local exacts, partials, pLen = CollectMatches(searchPrefix, false)
if #exacts == 0 and lengthMode > 0 then
local fallbackExacts, fallbackPartials, fallbackPLen = CollectMatches(searchPrefix, true)
if #fallbackExacts > 0 then
exacts = fallbackExacts
end
end
if #exacts > 0 then
matches = exacts
elseif pLen > 0 then
matches = partials
searchPrefix = searchPrefix:sub(1, pLen)
isBacktracked = true
elseif requiredLetter and #requiredLetter > 0 then
local reqChar = requiredLetter:sub(1,1):lower()
if searchPrefix:sub(1,1):lower() ~= reqChar then
local fallbackBucket = (Buckets and Buckets[reqChar]) or Words
if fallbackBucket then
for _, w in ipairs(fallbackBucket) do
if not Blacklist[w] and not UsedWords[w] then
local mLen = GetMatchLength(w, requiredLetter)
if mLen == #requiredLetter then
table.insert(matches, w)
if #matches >= 100 then break end
end
end
end
end
if #matches > 0 then
searchPrefix = requiredLetter
isBacktracked = true
end
end
end
if #matches > 0 then
if sortMode == "Longest" then
table.sort(matches, function(a, b) return #a > #b end)
elseif sortMode == "Shortest" then
table.sort(matches, function(a, b) return #a < #b end)
elseif sortMode == "Killer" then
table.sort(matches, function(a, b)
local sA = GetKillerScore(a)
local sB = GetKillerScore(b)
if sA == sB then
return #a < #b
end
return sA > sB
end)
end
end
local displayList = {}
local maxDisplay = 40
for i = 1, math.min(maxDisplay, #matches) do table.insert(displayList, matches[i]) end
if showKeyboard and KeyboardFrame.Visible then
local colors = {
Color3.fromRGB(100, 255, 140),
Color3.fromRGB(255, 180, 200),
Color3.fromRGB(100, 200, 255)
}
local targetKeys = {}
for i = 1, math.min(3, #displayList) do
local w = displayList[i]
local nextChar = w:sub(#searchPrefix + 1, #searchPrefix + 1)
if nextChar and nextChar ~= "" then
local char = nextChar:lower()
if not targetKeys[char] then
targetKeys[char] = i
end
end
end
for char, k in pairs(Keys) do
local priority = targetKeys[char]
if priority then
k.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
Tween(k, {BackgroundColor3 = colors[priority]}, 0.3)
else
Tween(k, {BackgroundColor3 = THEME.ItemBG}, 0.2)
end
end
end
if #matches > 0 and not isBacktracked then
currentBestMatch = matches[1]
else
currentBestMatch = nil
end
if isBacktracked then
local validPart = searchPrefix
local invalidPart = detectedText:sub(#searchPrefix + 1)
local accentRGB = ColorToRGB(THEME.Accent)
StatusText.Text = "No match: <font color=\"rgb(" .. accentRGB .. ")\">" .. validPart .. "</font><font color=\"rgb(255,80,80)\">" .. invalidPart .. "</font>"
StatusText.TextColor3 = THEME.SubText
elseif #exacts == 0 and lengthMode > 0 and suffixMode ~= "" then
StatusText.Text = "No len match (showing all)"
StatusText.TextColor3 = THEME.Warning
end
for i = 1, math.max(#displayList, #ButtonCache) do
local w = displayList[i]
local btn = ButtonCache[i]
if w then
local lbl
if not btn then
btn = Instance.new("TextButton")
btn.Size = UDim2.new(1, -6, 0, 30)
btn.BackgroundColor3 = THEME.ItemBG
btn.Text = ""
btn.AutoButtonColor = false
Instance.new("UICorner", btn).CornerRadius = UDim.new(0, 6)
lbl = Instance.new("TextLabel", btn)
lbl.Name = "Label"
lbl.Size = UDim2.new(1, -20, 1, 0)
lbl.Position = UDim2.new(0, 10, 0, 0)
lbl.BackgroundTransparency = 1
lbl.Font = Enum.Font.GothamMedium
lbl.TextSize = 14
lbl.TextXAlignment = Enum.TextXAlignment.Left
lbl.RichText = true
btn.MouseEnter:Connect(function() Tween(btn, {BackgroundColor3 = Color3.fromRGB(45,45,55)}) end)
btn.MouseLeave:Connect(function() Tween(btn, {BackgroundColor3 = THEME.ItemBG}) end)
btn.MouseButton1Click:Connect(function()
local d = ButtonData[btn]
if d then
SmartType(d.word, d.detected, true)
local l = btn:FindFirstChild("Label")
if l then l.TextColor3 = THEME.Success end
Tween(btn, {BackgroundColor3 = Color3.fromRGB(30,60,40)})
end
end)
btn.Parent = ScrollList
table.insert(ButtonCache, btn)
else
lbl = btn:FindFirstChild("Label")
btn.Visible = true
btn.Parent = ScrollList
btn.BackgroundColor3 = THEME.ItemBG
if lbl then lbl.TextColor3 = THEME.Text end
end
ButtonData[btn] = {word = w, detected = detectedText}
local accentRGB = ColorToRGB(THEME.Accent)
if i == 1 then accentRGB = "100,255,140"
elseif i == 2 then accentRGB = "255,180,200"
elseif i == 3 then accentRGB = "100,200,255"
end
local textRGB = ColorToRGB(THEME.Text)
local displayText = ""
if isBacktracked then
local prefix = w:sub(1, #searchPrefix)
local suffix = w:sub(#searchPrefix + 1)
displayText = "<font color=\"rgb(" .. accentRGB .. ")\">" .. prefix .. "</font>"
.. "<font color=\"rgb(" .. textRGB .. ")\">" .. suffix .. "</font>"
else
local prefix = w:sub(1, #detectedText)
local suffix = w:sub(#detectedText + 1)
displayText = "<font color=\"rgb(" .. accentRGB .. ")\">" .. prefix .. "</font>"
.. "<font color=\"rgb(" .. textRGB .. ")\">" .. suffix .. "</font>"
end
if lbl then lbl.Text = displayText end
else
if btn then
btn.Visible = false
ButtonData[btn] = nil
end
end
end
ScrollList.CanvasSize = UDim2.new(0,0,0, UIListLayout.AbsoluteContentSize.Y)
end
SetupSlider(SliderBtn, SliderBg, SliderFill, function(pct)
local max = isBlatant and MAX_CPM_BLATANT or MAX_CPM_LEGIT
currentCPM = math.floor(MIN_CPM + (pct * (max - MIN_CPM)))
SliderFill.Size = UDim2.new(pct, 0, 1, 0)
SliderLabel.Text = "Speed: " .. currentCPM .. " CPM"
if currentCPM > 900 then Tween(SliderFill, {BackgroundColor3 = Color3.fromRGB(255,80,80)})
else Tween(SliderFill, {BackgroundColor3 = THEME.Accent}) end
end)
MinBtn.MouseButton1Click:Connect(function()
local isMin = MainFrame.Size.Y.Offset < 100
if not isMin then
Tween(MainFrame, {Size = UDim2.new(0, 300, 0, 45)})
ScrollList.Visible = false
SettingsFrame.Visible = false
StatusFrame.Visible = false
MinBtn.Text = "+"
else
Tween(MainFrame, {Size = UDim2.new(0, 300, 0, 500)})
task.wait(0.2)
ScrollList.Visible = true
SettingsFrame.Visible = true
StatusFrame.Visible = true
MinBtn.Text = "-"
end
end)
local lastTypeVisible = false
local lastRequiredLetter = ""
local StatsData = {}
do
local sf = Instance.new("Frame")
sf.Name = "StatsFrame"
sf.Size = UDim2.new(0, 120, 0, 60)
sf.Position = UDim2.new(0.5, -60, 0, 10)
sf.BackgroundColor3 = THEME.Background
sf.Visible = false
sf.Parent = ScreenGui
EnableDragging(sf)
Instance.new("UICorner", sf).CornerRadius = UDim.new(0, 8)
Instance.new("UIStroke", sf).Color = THEME.Accent
StatsData.Frame = sf
local st = Instance.new("TextLabel")
st.Size = UDim2.new(1, 0, 0, 25)
st.Position = UDim2.new(0, 0, 0, 5)
st.BackgroundTransparency = 1
st.TextColor3 = THEME.Text
st.Font = Enum.Font.GothamBold
st.TextSize = 20
st.Text = "--"
st.Parent = sf
StatsData.Timer = st
local sc = Instance.new("TextLabel")
sc.Size = UDim2.new(1, 0, 0, 20)
sc.Position = UDim2.new(0, 0, 0, 30)
sc.BackgroundTransparency = 1
sc.TextColor3 = THEME.SubText
sc.Font = Enum.Font.Gotham
sc.TextSize = 12
sc.Text = "Words: 0"
sc.Parent = sf
StatsData.Count = sc
end
runConn = RunService.RenderStepped:Connect(function()
local success, err = pcall(function()
local now = tick()
local player = Players.LocalPlayer
local gui = player and player:FindFirstChild("PlayerGui")
local frame = gui and gui:FindFirstChild("InGame") and gui.InGame:FindFirstChild("Frame")
if isTyping and (tick() - lastTypingStart) > 15 then
isTyping = false
isAutoPlayScheduled = false
StatusText.Text = "Typing State Reset (Watchdog)"
StatusText.TextColor3 = THEME.Warning
end
local isVisible = false
if frame and frame.Parent then
if frame.Parent:IsA("ScreenGui") then
isVisible = frame.Parent.Enabled
elseif frame.Parent:IsA("GuiObject") then
isVisible = frame.Parent.Visible
end
end
local seconds = nil
if isVisible then
local circle = frame:FindFirstChild("Circle")
local timerLbl = circle and circle:FindFirstChild("Timer") and circle.Timer:FindFirstChild("Seconds")
if timerLbl then
local timeText = timerLbl.Text
seconds = tonumber(timeText:match("([%d%.]+)"))
StatsData.Frame.Visible = true
StatsData.Timer.Text = timeText
if seconds and seconds < 3 then StatsData.Timer.TextColor3 = Color3.fromRGB(255, 80, 80)
else StatsData.Timer.TextColor3 = THEME.Text end
end
else
StatsData.Frame.Visible = false
end
local isMyTurn, requiredLetter = GetTurnInfo(frame)
if (now - lastWordCheck) > 0.05 then
cachedDetected, cachedCensored = GetCurrentGameWord(frame)
lastWordCheck = now
end
local detected, censored = cachedDetected, cachedCensored
if isVisible and isMyTurn and not isTyping and seconds and seconds < 1.5 then
local char = (requiredLetter or ""):lower()
local bucket = Buckets[char]
if bucket then
local bestWord = nil
local bestLen = 999
for _, w in ipairs(bucket) do
if not Blacklist[w] and not UsedWords[w] and w:sub(1, #detected) == detected then
if #w < bestLen then
bestWord = w
bestLen = #w
end
end
end
if bestWord then
StatusText.Text = "PANIC SAVE!"
StatusText.TextColor3 = Color3.fromRGB(255, 50, 50)
SmartType(bestWord, detected, false)
end
end
end
if autoJoin and (now - lastAutoJoinCheck > AUTO_JOIN_RATE) then
lastAutoJoinCheck = now
task.spawn(function()
local displayMatch = gui and gui:FindFirstChild("DisplayMatch")
local dFrame = displayMatch and displayMatch:FindFirstChild("Frame")
local matches = dFrame and dFrame:FindFirstChild("Matches")
if matches then
for _, matchFrame in ipairs(matches:GetChildren()) do
if (matchFrame:IsA("Frame") or matchFrame:IsA("GuiObject")) and matchFrame.Name ~= "UIListLayout" then
local joinBtn = matchFrame:FindFirstChild("Join")
local title = matchFrame:FindFirstChild("Title")
local isLastLetter = false
local titleText = "N/A"
if title and title:IsA("TextLabel") then
titleText = title.Text
if titleText:find("Last Letter") then
isLastLetter = true
end
end
local idx = tonumber(matchFrame.Name)
local allowed = true
if idx then
if idx >= 1 and idx <= 4 then allowed = Config.AutoJoinSettings._1v1
elseif idx >= 5 and idx <= 8 then allowed = Config.AutoJoinSettings._4p
elseif idx == 9 then allowed = Config.AutoJoinSettings._8p
end
end
if joinBtn and joinBtn.Visible and isLastLetter and allowed then
local matchId = matchFrame.Name
if (tick() - (JoinDebounce[matchId] or 0)) > 2 then
JoinDebounce[matchId] = tick()
task.wait(0.5)
local clicked = false
if getconnections then
if joinBtn:IsA("GuiButton") then
local success, conns = pcall(function() return getconnections(joinBtn.MouseButton1Click) end)
if success and conns then
for _, conn in ipairs(conns) do
if conn.Fire then conn:Fire() end
if conn.Function then
task.spawn(conn.Function)
end
clicked = true
end
end
end
end
if not clicked then
local cd = joinBtn:FindFirstChildWhichIsA("ClickDetector")
if cd then
fireclickdetector(cd)
clicked = true
end
end
if not clicked then
local absPos = joinBtn.AbsolutePosition
local absSize = joinBtn.AbsoluteSize
local centerX = absPos.X + absSize.X/2
local centerY = absPos.Y + absSize.Y/2
VirtualInputManager:SendMouseButtonEvent(centerX, centerY, 0, true, game, 1)
task.wait(0.05)
VirtualInputManager:SendMouseButtonEvent(centerX, centerY, 0, false, game, 1)
end
break
end
end
end
end
end
end)
end
local typeLbl = frame and frame:FindFirstChild("Type")
local typeVisible = typeLbl and typeLbl.Visible
if typeVisible and not lastTypeVisible then
UsedWords = {}
StatusText.Text = "New Round - Words Reset"
StatusText.TextColor3 = THEME.Success
end
lastTypeVisible = typeVisible
if censored then
if StatusText.Text ~= "Word is Censored" then
StatusText.Text = "Word is Censored"
StatusText.TextColor3 = THEME.Warning
Tween(StatusDot, {BackgroundColor3 = THEME.Warning})
for _, btn in ipairs(ButtonCache) do btn.Visible = false end
StatsData.Count.Text = "Words: 0"
end
listUpdatePending = false
forceUpdateList = false
currentBestMatch = nil
lastDetected = detected
lastRequiredLetter = requiredLetter
end
if listUpdatePending and (now - lastInputTime > LIST_DEBOUNCE) then
listUpdatePending = false
UpdateList(lastDetected, lastRequiredLetter)
local visCount = 0
for _, b in ipairs(ButtonCache) do
if b.Visible then visCount = visCount + 1 end
end
StatsData.Count.Text = "Words: " .. visCount .. "+"
end
if not isVisible then
if StatusText.Text ~= "Not in Round" then
StatusText.Text = "Not in Round"
StatusText.TextColor3 = THEME.SubText
Tween(StatusDot, {BackgroundColor3 = THEME.SubText})
for _, btn in ipairs(ButtonCache) do btn.Visible = false end
StatsData.Count.Text = "Words: 0"
end
lastDetected = "---"
elseif detected ~= lastDetected or requiredLetter ~= lastRequiredLetter or forceUpdateList then
currentBestMatch = nil
lastDetected = detected
lastRequiredLetter = requiredLetter
if detected == "" and not forceUpdateList then
StatusText.Text = "Waiting..."
StatusText.TextColor3 = THEME.SubText
Tween(StatusDot, {BackgroundColor3 = THEME.SubText})
UpdateList("", requiredLetter)
listUpdatePending = false
local visCount = 0
for _, b in ipairs(ButtonCache) do
if b.Visible then visCount = visCount + 1 end
end
StatsData.Count.Text = "Words: " .. visCount .. "+"
else
if detected ~= "" then
local isCompleted = false
if #detected > 2 then
local c = detected:sub(1,1)
if c ~= "#" and Buckets and Buckets[c] then
for _, w in ipairs(Buckets[c]) do
if w == detected then
isCompleted = true
break
end
end
end
end
if isCompleted then
StatusText.Text = "Completed: " .. detected .. " <font color=\"rgb(100,255,140)\">✓</font>"
StatusText.TextColor3 = THEME.Success
Tween(StatusDot, {BackgroundColor3 = THEME.Success})
else
StatusText.Text = "Input: " .. detected
StatusText.TextColor3 = THEME.Accent
Tween(StatusDot, {BackgroundColor3 = THEME.Warning})
end
end
if forceUpdateList then
listUpdatePending = true
lastInputTime = 0
forceUpdateList = false
else
listUpdatePending = true
lastInputTime = now
end
end
end
if autoPlay and not isTyping and not isAutoPlayScheduled and currentBestMatch and detected == lastDetected then
local isMyTurnCheck, _ = GetTurnInfo(frame)
if isMyTurnCheck then
isAutoPlayScheduled = true
local targetWord = currentBestMatch
local snapshotDetected = lastDetected
task.spawn(function()
local delay = isBlatant and 0.15 or (0.8 + math.random() * 0.5)
task.wait(delay)
local stillMyTurn, _ = GetTurnInfo()
if autoPlay and not isTyping and GetCurrentGameWord() == snapshotDetected and stillMyTurn then
SmartType(targetWord, snapshotDetected, false)
end
isAutoPlayScheduled = false
end)
end
end
end)
end)
inputConn = UserInputService.InputBegan:Connect(function(input)
if unloaded then return end
if input.KeyCode == TOGGLE_KEY then ScreenGui.Enabled = not ScreenGui.Enabled end
end)Loads code from the internet. It downloads more code when it runs (loadstring + HttpGet), which can change after it was posted. From: raw.githubusercontent.com, games.roblox.com.
. Shows longest word .

Universal