Run it
Copy the script and paste it into your executor.
Players=:()
UIS=:()
Run=:()
Tween=:()
Http=:()
LP=Players.LocalPlayer
LP
FORCE_MOBILE=
TEST_VIEWPORT=
preferredTouch=
(()preferredTouch=UIS.PreferredInput==.PreferredInput.Touch )
mobile=UIS.TouchEnabled (preferredTouch UIS.KeyboardEnabled UIS.MouseEnabled)
FORCE_MOBILE~= mobile=FORCE_MOBILE
mobile ( UIS.KeyboardEnabled UIS.MouseEnabled) ();
deviceName=mobile
pg=LP:()
saved={}
_,name ({,}) old=pg:(name); old saved=old:(); old:()
C={InfiniteAmmo=,AutoReload=,AutoClicker=,ClickRate=,NoCooldown=,TriggerBot=,AutoShoot=,FireRate=,FireDelay=,FireAngle=,FPSDetails=,FPSGraph=,FPSCorner=,WatermarkDetails=,WatermarkCorner=,HUDScale=,HUDOpacity=,
AimThroughWalls=,PlayerTarget=,PlayerStandOff=,AimPriority=,AimFallback=,AimResponse=,
AimPrediction=,AimLead=,AimRetention=,Fly=,FlySpeed=,FlyVerticalSpeed=,FlyBoost=,
Hitboxes=,HitboxDisplay=,HitboxPart=,HitboxSize=,HitboxOpacity=,HitboxTeams=,WallShots=,
TravelSlot=,TravelHeight=,TravelForward=,TravelFacing=,TravelStop=,
TravelRemember=,TravelMarker=,SpeedOverride=,WalkSpeed=,
JumpOverride=,JumpPower=,JumpHeight=,GravityOverride=,Gravity=,
AutoRotateOverride=,AutoRotate=,ZoomOverride=,MinZoom=,MaxZoom=,
ViewMode=,CameraOffsetOverride=,CameraHeight=,CameraSide=,
Aim=,ESP=,ESPAll=,ESPUnlimited=,ESPInterval=,Names=,Health=,Distance=,Through=,Teams=,Visibility=,
Circle=,Sticky=,FOV=,Speed=,Range=,Opacity=,Part=,Mode=,
Origin=,Color=,Motion=,Backdrop=,
AnimationSpeed=,Parallax=,Notifications=,Background=,
FullBright=,CustomLight=,LightBrightness=,LightExposure=,AmbientLevel=,
TimeLock=,DayTime=,NoShadows=,NoFog=,NoBloom=,NoBlur=,
NoSunRays=,NoColor=,NoDOF=,CameraOverride=,CameraFOV=,
ShowStatus=,ShowFPS=,Watermark=,QuickCursor=,ShowAimPad=,
AimPadSize=,UISize=,HideRingMenu=,Crosshair=,CrosshairSize=,CrosshairGap=,
CrosshairStyle=,LabelSize=,LabelHeight=,LabelRange=,OutlineFade=}
k,v (C) (saved[k])==(v) C[k]=saved[k]
key,value (C) (value)== C[key]=
C.ViewMode=
C.Color=
C.Fly=;C.WallShots=;C.TriggerBot=;C.AutoShoot=;C.NoCooldown=;C.InfiniteAmmo=;C.AutoReload=;C.AutoClicker=
saved.Version~= saved.Version~= saved.Version~= saved.Version~= saved.Version~= saved.Version~= C.FPSCorner=;C.WatermarkCorner=
C.HitboxPart== C.HitboxPart=
saved.Version~= saved.Version~= saved.Version~= saved.Version~= saved.Version~= saved.Version~= saved.Version~= saved.Version~= saved.Version~= saved.Version~= saved.Version~= C.HitboxSize=.(,C.HitboxSize);C.Speed=
mobile
C.Mode== C.Mode= C.Mode== C.Mode=
C.Origin=
C.Mode== C.Mode=
C.Mode== C.Mode=
backgroundList={
{name=,file=},
{name=,file=},
{name=,file=},
{name=,file=,stretch=},
{name=,file=},
{name=,file=},
{name=,file=}
}
backgroundIndex={}
i,entry (backgroundList) backgroundIndex[entry.name]=i
backgroundIndex[C.Background] C.Background=
themeProfiles={
Chrome={primary=.(,,),muted=.(,,),accent=.(,,)},
Pearl={primary=.(,,),muted=.(,,),accent=.(,,)},
[]={primary=.(,,),muted=.(,,),accent=.(,,)},
[]={primary=.(,,),muted=.(,,),accent=.(,,)},
Ember={primary=.(,,),muted=.(,,),accent=.(,,)},
Nebula={primary=.(,,),muted=.(,,),accent=.(,,)},
[]={primary=.(,,),muted=.(,,),accent=.(,,)}
}
currentTheme=themeProfiles[C.Background]
palettes={Silver=.(,,),Violet=.(,,),
Cyan=.(,,),Rose=.(,,),Lime=.(,,)}
palettes.Background=currentTheme.accent
ink=currentTheme.primary
muted=currentTheme.muted
bg=.(,,)
card=.(,,)
cons,records,paints={}, {}, {}
applyWorld,restoreWorld
notify
switchBackground
applyTheme
tabNames={,,,,,,,,,,,}
alive,free,focus,latch=,,,
selected,drag,sliding
aimTouch,touchHolding=,
menuOpen=
lastMouse,lastIcon=UIS.MouseBehavior,UIS.MouseIconEnabled
uniqueId=(LP.UserId)....(.()):(,)
(()uniqueId=Http:())
binding=..uniqueId
traceError=(debug debug.traceback) (err) (err)
(kind,props,parent)
o=.(kind); k,v (props) o[k]=v ; o:() props.BackgroundColor3==ink o:(,)
o.Parent=parent; o
(signal,fn) c=signal:(fn);.(cons,c); c
(o,r) (,{CornerRadius=.(,r )},o)
anims={}
(value) C.Motion value/.(,C.AnimationSpeed/)
(o,props,duration,easing)
alive o.Parent
state=anims[o]; state state={};anims[o]=state
property,value (props)
state[property] state[property]:()
C.Motion duration==
o[property]=value;state[property]=
tw=Tween:(o,TweenInfo.((duration ),easing .EasingStyle.Quint,.EasingDirection.Out),{[property]=value})
anims[o]=state;state[property]=tw
tw.Completed:(()
state[property]==tw state[property]=
(state)== anims[o]==state anims[o]=
)
tw:()
(state)== anims[o]=
(parent,value,size,color,pos,dimensions)
label=(,{BackgroundTransparency=,Text=value,TextSize=size ,
TextColor3=color ink,Font=.Font.GothamMedium,TextXAlignment=.TextXAlignment.Left,
TextTruncate=.TextTruncate.AtEnd,Position=pos .(),Size=dimensions .(,,,)},parent)
label:(,color==muted )
label
(o,transparency)
edge=(,{Color=muted,Transparency=transparency ,Thickness=},o)
edge:(,); edge
(parent,name,value,pos,size)
b=(,{Name=name,Text=value,Position=pos,Size=size,
Font=.Font.GothamMedium,TextSize=,TextColor3=ink,AutoButtonColor=,
BackgroundColor3=card,BackgroundTransparency=,BorderSizePixel=,ClipsDescendants=},parent)
(b,)
b:(,)
parent:() b.ZIndex=
b:(,card);b:(,)
border=(b,);border.Name=
press=(,{Name=,Scale=},b)
hovered=
()
col=b:() card
(b,{BackgroundColor3=hovered col:(ink,) col,
BackgroundTransparency=hovered (b:() )},)
(border,{Transparency=hovered },)
(b.MouseEnter,() hovered=;() )
(b.MouseLeave,() hovered=;();(press,{Scale=},,.EasingStyle.Back) )
(b.InputBegan,(i)
i.UserInputType==.UserInputType.MouseButton1 i.UserInputType==.UserInputType.Touch (press,{Scale=},)
)
(b.InputEnded,(i)
i.UserInputType==.UserInputType.MouseButton1 i.UserInputType==.UserInputType.Touch (press,{Scale=},,.EasingStyle.Back)
)
ripple
(b.Activated,(input)
(press,{Scale=},,.EasingStyle.Back)
C.Motion
ripple ripple:()
p=.(b.AbsoluteSize.X/,b.AbsoluteSize.Y/)
input p=.(input.Position.X,input.Position.Y)-b.AbsolutePosition
ripple=(,{Name=,AnchorPoint=.(,),Position=.(p.X,p.Y),
Size=.(,),BorderSizePixel=,BackgroundColor3=ink,BackgroundTransparency=,
ZIndex=},b);(ripple,)
current=ripple; diameter=.(b.AbsoluteSize.X,b.AbsoluteSize.Y)*
(current,{Size=.(diameter,diameter),BackgroundTransparency=},)
.((),() current.Parent current:() )
)
b
gui=(,{Name=,IgnoreGuiInset=,ResetOnSpawn=,
DisplayOrder=,ZIndexBehavior=.ZIndexBehavior.Sibling},pg)
mobile (()gui.ScreenInsets=.ScreenInsets.CoreUISafeInsets )
world=(,{Name=binding},)
overlay=(,{Name=,Size=.(,),BackgroundTransparency=},gui)
root=(,{Name=,AnchorPoint=.(,),
Position=.(,),Size=.(,),GroupTransparency=,
BackgroundColor3=bg,BorderSizePixel=,ZIndex=},gui)
(root,)
halo=(,{Name=,BackgroundTransparency=,AnchorPoint=.(,),
Size=.(,),Position=root.Position,ZIndex=,BorderSizePixel=},gui);(halo,)
haloEdge=(halo,);haloEdge.Thickness=
scale=(,{Scale=},root)
reveal=(,{Name=,Value=},gui)
border=(root,)
(,{Color=ColorSequence.({
ColorSequenceKeypoint.(,.(,,)),
ColorSequenceKeypoint.(,.(,,)),
ColorSequenceKeypoint.(,.(,,)),
ColorSequenceKeypoint.(,.(,,))}),Rotation=},border)
assetCache={}
(entry)
assetCache[entry.name] assetCache[entry.name]
providers={getcustomasset,getsynasset,get_custom_asset}
i=,
provider=providers[i]
(provider)==
ok,result=(provider,..entry.file)
ok (result)== result~=
assetCache[entry.name]=result
result
gui:(,)
initialBackground=backgroundList[backgroundIndex[C.Background]]
image=(initialBackground)
liquid=(,{Name=,BackgroundTransparency=,Image=image,
ScaleType=.ScaleType.Crop,ImageTransparency=,Position=.(-,-),
Size=.(,,,)},root)
liquidSwap=(,{Name=,BackgroundTransparency=,Image=image,
ScaleType=initialBackground.stretch .ScaleType.Stretch .ScaleType.Crop,
ImageTransparency=,Position=liquid.Position,Size=liquid.Size},root)
backgroundMix=(,{Name=,Value=},gui)
activeBackground=C.Background
mist=(,{Name=,BackgroundTransparency=,Image=image,
ImageTransparency=,Rotation=,ScaleType=.ScaleType.Crop,
Position=.(-,),Size=.(,)},root)
veil=(,{Name=,BackgroundColor3=bg,BorderSizePixel=,Size=.(,)},root)
(,{Rotation=,Transparency=NumberSequence.({
NumberSequenceKeypoint.(,),NumberSequenceKeypoint.(,),
NumberSequenceKeypoint.(,),NumberSequenceKeypoint.(,)})},veil)
surface=(,{Name=,BackgroundColor3=ink,BackgroundTransparency=,
BorderSizePixel=,Size=.(,)},root)
surfaceLight=(,{Rotation=,Offset=.(-,),Transparency=NumberSequence.({
NumberSequenceKeypoint.(,),NumberSequenceKeypoint.(,),NumberSequenceKeypoint.(,),
NumberSequenceKeypoint.(,),NumberSequenceKeypoint.(,)})},surface)
topLine=(,{BackgroundColor3=ink,BorderSizePixel=,Position=.(,),
Size=.(,-,,)},root)
shine=(,{Transparency=NumberSequence.({
NumberSequenceKeypoint.(,),NumberSequenceKeypoint.(,),
NumberSequenceKeypoint.(,),NumberSequenceKeypoint.(,),NumberSequenceKeypoint.(,)})},topLine)
brand=(root,,,ink,.(,),.(,))
brand.Font=.Font.GothamBold
chrome=(,{Rotation=,Color=ColorSequence.({
ColorSequenceKeypoint.(,.(,,)),
ColorSequenceKeypoint.(,.(,,)),
ColorSequenceKeypoint.(,.(,,)),
ColorSequenceKeypoint.(,.(,,))})},brand)
(root,,,.(,,),
.(,),.(,))
liveDot=(,{BackgroundColor3=ink,BorderSizePixel=,
Position=.(,),Size=.(,)},root);(liveDot,)
deviceBadge=(root,deviceName..,,muted,.(,),.(,))
header=(,{Name=,BackgroundTransparency=,Active=,
Size=.(,-,,)},root)
cursor=(root,,,.(,-,,),.(,))
minimize=(root,,,.(,-,,),.(,))
unload=(root,,,.(,-,,),.(,))
heroTag=(root,C.Background:(),,.(,,),
.(,-,,),.(,));heroTag.TextXAlignment=.TextXAlignment.Right
(,{BackgroundColor3=ink,BackgroundTransparency=,BorderSizePixel=,
Position=.(,),Size=.(,-,,)},root)
side=(,{Name=,BackgroundTransparency=,BorderSizePixel=,CanvasSize=.(,#tabNames*+),ScrollBarThickness=,ScrollingEnabled=,ScrollingDirection=.ScrollingDirection.Y,
Position=.(,),Size=.(,,,-)},root)
(side,,,muted,.(,),.(,))
rail=(,{BackgroundColor3=ink,BackgroundTransparency=,
Position=.(,),Size=.(,,,-),BorderSizePixel=},root)
pages,tabs={},{}
ui={}
ui.(position)
_,object (pg:(position.X,position.Y))
object:(gui)
node=object
node node~=gui
node:() node:()
node=node.Parent
activeTab=
indicator=(,{Name=,BackgroundColor3=ink,BorderSizePixel=,
Position=.(,),Size=.(,)},side);(indicator,)
tabIndex={}; i,name (tabNames) tabIndex[name]=i
uiPagePosition=.(,)
compact=
ui.searchBar=(,{Name=,BackgroundColor3=.(,,),BackgroundTransparency=,BorderSizePixel=,
Position=.(,),Size=.(,-,,)},root);(ui.searchBar,);(ui.searchBar,)
(ui.searchBar,,,muted,.(,),.(,))
ui.search=(,{Name=,BackgroundTransparency=,Text=,ClearTextOnFocus=,
PlaceholderText=,PlaceholderColor3=muted,TextColor3=ink,Font=.Font.Gotham,
TextSize=,TextXAlignment=.TextXAlignment.Left,Position=.(,),Size=.(,-,,)},ui.searchBar)
ui.searchCount=(ui.searchBar,,,muted,.(,-,,),.(,));ui.searchCount.TextXAlignment=.TextXAlignment.Right
ui.clear=(ui.searchBar,,,.(,-,,),.(,));ui.clear.Visible=
ui.empty=(root,,,muted,.(,),.(,-,,))
ui.empty.Name=;ui.empty.Visible=;ui.empty.TextWrapped=
ui.()
page=pages[activeTab]
page
query=ui.search.Text:():()
terms={}; word query:() terms[#terms+]=word
count=
_,item (page:())
item:()
item.Name== item.Visible=query== ( mobile overlay.AbsoluteSize.Y>)
content=item.Name
item:() content..=..item.Text
_,label (item:())
label:() content..=..label.Text
content=content:()
match=item:()~=
_,term (terms) content:(term,,) match=;
item.Visible=match
match count+=
ui.searchCount.Text=(count)..(query== )
ui.clear.Visible=query~=;ui.empty.Visible=query~= count==
gui:(,count);gui:(,ui.search.Text)
ui.()
ui.searchBar.Position=mobile .(,) .(,)
ui.searchBar.Size=mobile .(,-,,) .(,-,,)
ui.empty.Position=mobile .(,) .(,)
ui.empty.Size=mobile .(,-,,) .(,-,,)
(ui.search:(),() pages[activeTab] pages[activeTab].CanvasPosition=.zero ;ui.())
(ui.clear.Activated,()ui.search.Text=;ui.search:();ui.())
(name)
activeTab=name
ui.search.Text=;ui.search.PlaceholderText=..name:()..
heroTag.Text=name:()....C.Background:()
n,p (pages)
p.Visible=n==name
tabs[n].TextColor3=n==name ink muted
tabs[n]:(,n==name )
tabs[n]:(,n==name .(,,) card)
(tabs[n],{BackgroundTransparency=n==name ,
BackgroundColor3=n==name .(,,) card},)
_,label (tabs[n]:())
label:() label:(,n==name );(label,{TextColor3=n==name ink muted},)
compact
(indicator,{Position=.((tabIndex[name]-)*+,),Size=.(,)},)
side.CanvasPosition=.(.((tabIndex[name]-)*-,,.(,#tabNames*-side.AbsoluteSize.X)),)
side.CanvasPosition=.(,.(+(tabIndex[name]-)*-,,.(,#tabNames*+-side.AbsoluteSize.Y)))
(indicator,{Position=.(,+(tabIndex[name]-)*),Size=.(,)},)
gui:(,name)
page=pages[name]
index=
_,item (page:())
item:()
rowScale=item:()
rowScale rowScale.Scale=C.Motion
visible=item.AbsolutePosition.Y+item.AbsoluteSize.Y>=page.AbsolutePosition.Y item.AbsolutePosition.Y<page.AbsolutePosition.Y+page.AbsoluteSize.Y
visible C.Motion
index+=; delayTime=.(index-,)*
_,label (item:()) label:() label.TextTransparency=
.((delayTime),()
alive activeTab~=name item.Parent
rowScale (rowScale,{Scale=},,.EasingStyle.Back)
_,label (item:()) label:() (label,{TextTransparency=},)
)
rowScale rowScale.Scale=
_,label (item:()) label:() label.TextTransparency=
page.Position=.(uiPagePosition.X.Scale,uiPagePosition.X.Offset+,uiPagePosition.Y.Scale,uiPagePosition.Y.Offset)
(page,{Position=uiPagePosition},)
ui.()
i,name (tabNames)
glyph=({,,,,,,,,,,,})[i]
tab=(side,name,,.(,+(i-)*),.(,))
tabs[name]=tab
icon=(tab,glyph,,ink,.(,),.(,))
(tab,name:(),,ink,.(,),.(,))
tab.BackgroundTransparency=name==activeTab
page=(,{Name=name,BackgroundTransparency=,BorderSizePixel=,
Position=uiPagePosition,Size=.(,-,,-),
ScrollBarThickness=,ScrollBarImageColor3=.(,,),
ScrollBarImageTransparency=,CanvasSize=.(),AutomaticCanvasSize=.AutomaticSize.Y,
ScrollingDirection=.ScrollingDirection.Y,Visible=name==activeTab},root)
(,{Padding=.(,),SortOrder=.SortOrder.LayoutOrder},page)
(,{PaddingRight=.(,),PaddingBottom=.(,)},page)
pages[name]=page
(tab.Activated,() (name) )
keybox=(,{BackgroundColor3=.(,,),BackgroundTransparency=,
BorderSizePixel=,Position=.(,),Size=.(,)},side);(keybox,);(keybox,)
keybox.Visible=
(keybox,,,muted,.(,),.(,))
i,pair ({{,},{,},{,}})
(keybox,pair[],,ink,.(,+(i-)*),.(,))
(keybox,pair[],,muted,.(,+(i-)*),.(,))
(,{BackgroundColor3=ink,BackgroundTransparency=,BorderSizePixel=,
Position=.(,,,-),Size=.(,-,,)},root)
status=(root,,,muted,.(,,,-),.(,-,,))
statusDot=(,{BackgroundColor3=ink,BorderSizePixel=,
Position=.(,,,-),Size=.(,)},root);(statusDot,)
(root,,,muted,.(,-,,-),.(,))
mini=(gui,,,.(,),.(,))
mini.Visible=
floating=(gui,,,.(,),.(,))
touchAim=(gui,,,.(,-,,-),.(,))
(touchAim,)
touchAim.Visible=mobile menuOpen C.ShowAimPad
()
aimTouch=;touchHolding=;latch=
gui:(,)
()
touchAim.Visible=mobile menuOpen C.ShowAimPad
mobile touchAim.Size=.(C.AimPadSize,C.AimPadSize);touchAim.AnchorPoint=.(,)
touchAim.Text= C.Aim C.Mode== (latch )
C.Mode==
touchAim.TextColor3=(touchHolding latch) .(,,) ink
(touchAim.InputBegan,(i)
mobile C.Aim menuOpen i.UserInputType==.UserInputType.Touch aimTouch
aimTouch=i;touchHolding=;gui:(,);()
)
(touchAim.InputEnded,(i)
i==aimTouch aimTouch=;touchHolding=;gui:(,);()
)
(touchAim.Activated,()
mobile C.Mode== C.Aim menuOpen latch= latch;()
)
()
ui.enforceCapabilities ui.()
switchBackground (C.Background)
k,v (C) gui:(k,v)
gui:(,free)
cursor.Text=mobile (free )
floating.Text=free
cursor.Modal= mobile free root.Visible;floating.Modal= mobile free
floating.Visible= mobile C.QuickCursor
()
_,fn (paints) ()
status.Visible=C.ShowStatus;statusDot.Visible=C.ShowStatus
applyWorld ()
toast=(,{Name=,AnchorPoint=.(,),
Position=.(,,,-),Size=.(,),GroupTransparency=,
BackgroundColor3=.(,,),BorderSizePixel=,Visible=,ZIndex=},gui)
(toast,);(toast,)
toastTitle=(toast,,,ink,.(,),.(,-,,))
toastValue=(toast,,,muted,.(,),.(,-,,))
toastLine=(,{BackgroundColor3=ink,BorderSizePixel=,
Position=.(,,,-),Size=.(,,,)},toast)
toastSerial=
notify=(title,value)
toastSerial+=; serial=toastSerial
C.Notifications toast.Visible=;
toastTitle.Text=title;toastValue.Text=value
toast.Visible=;toast.GroupTransparency=;toast.Position=.(,,,-)
toastLine.Size=.(,,,)
(toast,{GroupTransparency=,Position=.(,,,-)},)
(toastLine,{Size=.(,,,)},)
.(.(,()),()
alive serial~=toastSerial
(toast,{GroupTransparency=,Position=.(,,,-)},)
.((),() alive serial==toastSerial toast.Visible= )
)
(value)
free=value;latch=;selected=
mobile
UIS.MouseBehavior=free .MouseBehavior.Default .MouseBehavior.LockCenter
UIS.MouseIconEnabled=free lastIcon
()
transition=
(value)
value C.EditorOpen C.EditorOpen=; editor=gui:(); editor editor.Visible=
transition+=; current=transition
menuOpen=value;gui:(,value);()
mini.Visible=mobile value;(value)
mobile mini.Text=value
value
root.Visible=;root.GroupTransparency=;reveal.Value=
(root,{GroupTransparency=},);(reveal,{Value=},,.EasingStyle.Back)
(root,{GroupTransparency=},);(reveal,{Value=},)
.((),() alive transition==current root.Visible= )
(cursor.Activated,() mobile () ( free) )
(floating.Activated,() ( free) )
(minimize.Activated,() () )
(mini.Activated,() mobile ( menuOpen) () )
(page,titleValue,subtitle)
box=(,{Name=,Size=.(,,,mobile ),BackgroundTransparency=},page)
(box,titleValue,mobile ,ink,.(,),.(,,,)).Font=.Font.GothamBold
sub=(box,subtitle,,muted,.(,),.(,-,,));sub.TextWrapped=;sub.TextTruncate=.TextTruncate.None
(box,,,muted,.(,-,,),.(,))
(page,key,titleValue,detail,height)
box=(,{Name=key..,BackgroundColor3=.(,,),BackgroundTransparency=,
BorderSizePixel=,Size=.(,,,mobile .(,height ) (height ))},page);(box,)
stroke=(box,)
rowScale=(,{Name=,Scale=},box)
rowTitle=(box,titleValue,,ink,.(,),.(,-,,));rowTitle.Name=
rowDetail=(box,detail,,muted,.(,mobile ),.(,-,,));rowDetail.Name=;rowDetail.TextWrapped=;rowDetail.TextYAlignment=.TextYAlignment.Top;rowDetail.TextTruncate=.TextTruncate.None
(box.MouseEnter,() (stroke,{Transparency=},);(rowScale,{Scale=},) )
(box.MouseLeave,() (stroke,{Transparency=},);(rowScale,{Scale=},) )
box
(page,key,titleValue,detail)
C[key]=
box=(page,key,titleValue,detail)
b=(box,key,,.(,mobile - -,,mobile ),.(mobile ,mobile ))
knob=(,{Name=,BackgroundColor3=ink,BorderSizePixel=,
Position=.(,mobile ),Size=.(mobile ,mobile )},b);(knob,)
box.RowTitle.Size=.(,-,,)
stateText=(box,,,muted,.(,mobile - -,,),.(,));stateText.Name=
last
()
last==C[key] ;last=C[key]
stateText.Text=C[key] ;stateText.TextColor3=C[key] ink muted
edge=box:(); edge edge.Color=C[key] ink muted;edge.Transparency=C[key]
(knob,{Position=.(C[key] (mobile ) ,mobile ),
BackgroundColor3=C[key] ink .(,,)},,.EasingStyle.Back)
b:(,C[key] .(,,) card)
(b,{BackgroundColor3=b:()},)
.(paints,paint)
(b.Activated,() ui.canToggle ui.(key) ;C[key]= C[key];selected=;(); notify (titleValue,C[key] ) )
(page,key,titleValue,detail,values)
box=(page,key,titleValue,detail)
b=(box,key,,.(,-,,mobile ),.(,mobile ))
.(paints,() b.Text=(C[key])..;b.TextColor3=ink )
(b.Activated,()
at=.(values,C[key]) ;C[key]=values[at % #values+];selected=;(); notify (titleValue,(C[key]))
)
(page,key,titleValue,detail,lo,hi,step)
box=(page,key,titleValue,detail,)
mobile box.Detail.Position=.(,);box.Detail.Size=.(,-,,)
valueLabel=(box,,,ink,.(,-,,),.(,))
valueLabel.TextXAlignment=.TextXAlignment.Right
displayed=(,{Value=C[key]},box)
valueLabel.Text=(C[key])
(displayed.Changed,(value) valueLabel.Text=step< .(,value) (.(value+)) )
track=(,{Name=key,Text=,AutoButtonColor=,BackgroundColor3=.(,,),
BorderSizePixel=,BackgroundTransparency=,Position=.(,,,mobile ),Size=.(,-,,mobile )},box)
trackLine=(,{BackgroundColor3=.(,,),BorderSizePixel=,
AnchorPoint=.(,),Position=.(,),Size=.(,,,)},track);(trackLine,)
fill=(,{BackgroundColor3=ink,BorderSizePixel=,AnchorPoint=.(,),Position=.(,),Size=.(,,,)},track);(fill,)
(,{Color=ColorSequence.(.(,,),ink)},fill)
knob=(,{Name=,AnchorPoint=.(,),Size=.(mobile ,mobile ),
BackgroundColor3=ink,BorderSizePixel=,Position=.(,)},track);(knob,)
(knob,)
last
.(paints,()
last==C[key] ;last=C[key]
a=(C[key]-lo)/(hi-lo)
(fill,{Size=.(a,,,)},);(knob,{Position=.(a,)},)
(displayed,{Value=C[key]},)
)
(x)
a=.((x-track.AbsolutePosition.X)/.(,track.AbsoluteSize.X),,)
C[key]=.(.((lo+a*(hi-lo))/step+)*step,lo,hi);()
(track.InputEnded,(i)
sliding sliding.input==i
sliding=; _,p (pages) p.ScrollingEnabled=
)
(track.InputBegan,(i) i.UserInputType==.UserInputType.MouseButton1 i.UserInputType==.UserInputType.Touch
sliding={update=update,input=i};page.ScrollingEnabled=;(i.Position.X)
)
travel={spots={},previous=,marker=,folder=,loaded=}
(()
stash=saved.TravelSpots
(stash)== travel.spots=Http:(stash)
)
travel.path=travel.folder....(.PlaceId)..
travel.()
ch=LP.Character
hrp=ch ch:()
hum=ch ch:()
hrp hum hum.Health<=
ch,hrp,hum
travel.()
C.TravelRemember
ok,err=(()
((writefile)== (makefolder)==,)
(isfolder)~= (travel.folder) (makefolder,travel.folder)
(travel.path,Http:(travel.spots))
)
ok notify (,(err))
travel.()
travel.loaded C.TravelRemember
travel.loaded=
(()
(readfile)~=
parsed=Http:((travel.path))
(parsed)~=
i=,
value=parsed[(i)]
valid=(value)== #value==
valid _,n (value) (n)~= n~=n .(n)==.huge valid=;
valid travel.spots[(i)] travel.spots[(i)]=value
)
travel.(target,exact)
ch,hrp=travel.()
ch (,);
destination=exact target target+.(,C.TravelHeight,)+target.LookVector*C.TravelForward
C.TravelFacing destination=.(destination.Position)*hrp.CFrame.Rotation
old=hrp.CFrame
ok,err=(()
ch:(destination*hrp.CFrame:(ch:()))
C.TravelStop hrp.AssemblyLinearVelocity=.zero;hrp.AssemblyAngularVelocity=.zero
)
ok (,(err));
travel.previous=old
(,)
travel.(name,label,callback)
b=(pages.Travel,name,label,.(),.(,,,))
(b.Activated,callback)
travel.playerRow=(pages.Travel,,,,)
travel.playerRow.RowTitle.Size=.(,-,,)
travel.playerNext=(travel.playerRow,,,.(,-,,),.(,))
travel.()
id=(C.PlayerTarget)
id
Players:(id)
travel.()
p=travel.()
ch=p p.Character
h=ch ch:()
travel.playerRow.RowTitle.Text=p p.DisplayName
travel.playerRow.Detail.Text=p (..p.Name....(h h.Health> ))
gui:(,p p.UserId )
(travel.playerNext.Activated,()
list={}
_,p (Players:()) p~=LP .(list,p)
.(list,(a,b) a.Name:()<b.Name:())
#list== C.PlayerTarget=;travel.();(,);
at=
i,p (list) (p.UserId)==C.PlayerTarget at=i;
C.PlayerTarget=(list[at%#list+].UserId);travel.();()
)
travel.(,,()
p=travel.()
p p==LP (,);
ch=p.Character
root=ch ch:()
h=ch ch:()
root h h.Health<= (,);
travel.(root.CFrame*.(,,C.PlayerStandOff),)
)
(pages.Travel,,,,,,)
(pages.Travel,,)
(pages.Travel,,,,{,,,,,,,})
spotInfo=(pages.Travel,,,)
travel.(,,()
travel.()
ch,hrp=travel.()
ch (,);
travel.spots[C.TravelSlot]={hrp.CFrame:()};travel.()
();(,..C.TravelSlot..)
)
travel.(,,()
travel.(); spot=travel.spots[C.TravelSlot]
spot (,..C.TravelSlot..);
travel.(.(.(spot)))
)
travel.(,,()
travel.previous (,);
travel.(travel.previous,)
)
travel.(,,()
travel.spots[C.TravelSlot]=;travel.();();(,..C.TravelSlot)
)
(pages.Travel,,,)
(pages.Travel,,,)
(pages.Travel,,,)
(pages.Travel,,,)
(pages.Travel,,,,,,)
(pages.Travel,,,,-,,)
(pages.Travel,,)
(pages.Travel,,,)
(pages.Travel,,,,,,)
(pages.Travel,,,)
(pages.Travel,,,,,,)
(pages.Travel,,,,,,)
(pages.Travel,,,)
(pages.Travel,,,,,,)
(pages.Travel,,,)
(pages.Travel,,,)
(pages.Travel,,)
(pages.Travel,,,,{,,})
(pages.Travel,,,)
(pages.Travel,,,,,,)
(pages.Travel,,,,,,)
(pages.Travel,,,)
(pages.Travel,,,,-,,)
(pages.Travel,,,,-,,)
travel.(,,()
_,k ({,,,,,}) C[k]=
C.ViewMode=;C.TravelMarker=;()
)
travel.(own)
travel.()
travel.()
gui:(,Http:(travel.spots))
spot=travel.spots[C.TravelSlot]
spotInfo.Detail.Text=spot .(,C.TravelSlot,spot[],spot[],spot[])
gui:(,C.TravelSlot);gui:(,spot~=)
C.TravelMarker spot
travel.marker
travel.marker=(,{Name=,Anchored=,CanCollide=,CanTouch=,CanQuery=,
Material=.Material.Neon,Shape=.PartType.Ball,Size=.(,,),Transparency=},)
travel.marker.CFrame=.(spot[],spot[],spot[]);travel.marker.Color=ink
travel.marker travel.marker:();travel.marker=
ch,hrp,hum=travel.()
hum
C.SpeedOverride (hum,,C.WalkSpeed)
C.JumpOverride (hum,hum.UseJumpPower ,hum.UseJumpPower C.JumpPower C.JumpHeight)
C.AutoRotateOverride (hum,,C.AutoRotate)
C.CameraOffsetOverride (hum,,.(C.CameraSide,C.CameraHeight,))
C.GravityOverride (,,C.Gravity)
C.ZoomOverride
LP.CameraMinZoomDistance>.(C.MinZoom,C.MaxZoom) (LP,,C.MinZoom)
(LP,,.(C.MinZoom,C.MaxZoom));(LP,,C.MinZoom)
C.ViewMode~= (LP,,C.ViewMode== .CameraMode.LockFirstPerson .CameraMode.Classic)
flight={state=,up={},down={}}
flight.(value)
alive
gui:()~=value gui:(,value)
flight.status flight.status.Detail.Text=value
flight.()
state=flight.state
state
flight.state=
_,key ({,,}) state[key] (()state[key]:())
(()
state.hum.PlatformStand state.hum.PlatformStand=state.platform
state.hum.AutoRotate state.hum.AutoRotate=state.rotate
state.root.Parent state.root.AssemblyLinearVelocity=.zero;state.root.AssemblyAngularVelocity=.zero
)
gui:(,)
flight.rise=(gui,,,.(,,,-),.(,))
flight.fall=(gui,,,.(,,,-),.(,))
flight.rise.Visible=;flight.fall.Visible=
_,entry ({{flight.rise,flight.up},{flight.fall,flight.down}})
(entry[].InputBegan,(input)
input.UserInputType==.UserInputType.Touch input.UserInputType==.UserInputType.MouseButton1 entry[][input]=
)
(UIS.InputEnded,(input) flight.up[input]=;flight.down[input]= )
(UIS.WindowFocusReleased,() .(flight.up);.(flight.down) )
flight.(dt,cam)
flight.rise.Visible=mobile C.Fly menuOpen
flight.fall.Visible=flight.rise.Visible
C.Fly flight.();flight.waiting=;flight.();
ch,hrp,hum=travel.()
ch
flight.();flight.()
flight.waiting flight.waiting=;(,)
flight.waiting=
hrp.Anchored flight.();flight.();
state=flight.state
state (state.root~=hrp state.velocity.Parent state.orientation.Parent) flight.();state=
state
state={root=hrp,hum=hum,platform=hum.PlatformStand,rotate=hum.AutoRotate}
flight.state=state
created,createError=(()
state.attachment=(,{Name=},hrp)
state.velocity=(,{Name=,Attachment0=state.attachment,
VelocityConstraintMode=.VelocityConstraintMode.Vector,RelativeTo=.ActuatorRelativeTo.World,
ForceLimitsEnabled=,VectorVelocity=.zero},hrp)
state.orientation=(,{Name=,Attachment0=state.attachment,
Mode=.OrientationAlignmentMode.OneAttachment,MaxTorque=.huge,Responsiveness=,
=hrp.CFrame.Rotation},hrp)
)
created flight.();C.Fly=;flight.(..(createError));();
hum.PlatformStand=;hum.AutoRotate=
flat=.(cam.CFrame.LookVector.X,,cam.CFrame.LookVector.Z)
flat.Magnitude< flat=.(hrp.CFrame.LookVector.X,,hrp.CFrame.LookVector.Z)
flat.Magnitude< flat=.(,,-)
flat=flat.Unit
right=.(-flat.Z,,flat.X)
move=.zero
vertical,boost=,
focus menuOpen UIS:()
mobile move=hum.MoveDirection
UIS:(.KeyCode.W) move+=flat
UIS:(.KeyCode.S) move-=flat
UIS:(.KeyCode.D) move+=right
UIS:(.KeyCode.A) move-=right
(flight.up) UIS:(.KeyCode.Space) UIS:(.KeyCode.E) vertical+=
(flight.down) UIS:(.KeyCode.LeftControl) UIS:(.KeyCode.Q) vertical-=
UIS:(.KeyCode.LeftShift) boost=C.FlyBoost
move.Magnitude> move=move.Unit
state.velocity.VectorVelocity=(move*C.FlySpeed+.(,vertical*C.FlyVerticalSpeed,))*boost
state.orientation.CFrame=.(.zero,flat)
gui:(,)
flight.(menuOpen focus )
combat={patches={},newPatch=,wasWall=,module=,overlays={}}
combat.displayFolder=(,{Name=..uniqueId},)
combat.(part,seen)
C.HitboxDisplay
visual=combat.overlays[part]
visual
visual={}
visual.fill=(,{Name=,Adornee=part,
AlwaysOnTop=,ZIndex=,Transparency=,=.(,,),
Size=part.Size},combat.displayFolder)
visual.edge=(,{Name=,Adornee=part,
=.(,,),LineThickness=,SurfaceTransparency=},combat.displayFolder)
combat.overlays[part]=visual
visual.fill.Size=part.Size
seen[part]=
combat.(seen)
count=
part,visual (combat.overlays)
seen seen[part] part.Parent
visual.fill:();visual.edge:();combat.overlays[part]=
count+=
gui:(,count)
combat.(ch)
part=ch ch:(C.HitboxPart)
part ch (C.HitboxPart== C.HitboxPart== C.HitboxPart==)
part=ch:() ch:() ch:()
part part:() part
combat.targets={};combat.targetStamp=-.huge;combat.targetCount=
combat.rayParams=RaycastParams.()
combat.rayParams.FilterType=.RaycastFilterType.Include;combat.rayParams.IgnoreWater=
(()combat.rayParams.CollisionGroup=)
combat.(force)
force .()-combat.targetStamp<
combat.targetStamp=.()
parts,seen,count={},{},
(ch)
ch ch==LP.Character seen[ch] ch:()
seen[ch]=
hum=ch:()
hum hum.Health<=
found=
_,part (ch:())
part:() part.Name~= parts[#parts+]=part;found=
found count+=
_,p (Players:()) p~=LP (p.Character)
characters=:()
characters _,ch (characters:()) ch:() (ch)
combat.targets=parts;combat.targetCount=count
combat.rayParams.FilterDescendantsInstances=parts
gui:(,count)
combat.(self,origin,direction)
((origin)== (direction)==,)
(origin.X==origin.X origin.Y==origin.Y origin.Z==origin.Z direction.X==direction.X direction.Y==direction.Y direction.Z==direction.Z,)
direction.Magnitude<
combat.()
#combat.targets==
settings=(self)== (self,)
size=(settings)== settings.BulletSize
(size)== size.X> size.Y> size.Z>
:(.(origin),size,direction,combat.rayParams)
:(origin,direction,combat.rayParams)
combat.(gun)
(gun)~= ((gun,))~= ((gun,))~= ((gun,))~=
_,entry (combat.patches) entry.gun==gun
original=gun.Raycast
wrapper=(self,origin,direction,...)
alive C.WallShots
ok,result=(combat.raycast,self,origin,direction)
ok
gui:(,result )
result
gui:(,(result))
gui:(,(gui:() )+)
(self,origin,direction,...)
ok=(()gun.Raycast=wrapper )
ok .(combat.patches,{gun=gun,original=original,wrapper=wrapper})
combat.()
_,entry (combat.patches)
(() entry.gun.Raycast==entry.wrapper entry.gun.Raycast=entry.original )
combat.patches={}
entry=combat.newPatch
entry (() entry.module.new==entry.wrapper entry.module.new=entry.original )
combat.newPatch=;combat.wasWall=;combat.module=
combat.()
combat.wasWall=
ok,err=(()
rs=:()
client=rs:()
modules=client client:()
managers=modules modules:()
guns=managers managers:()
=guns guns:()
( :(),)
module=()
((module)== (module.Tools)==,)
combat.module=module
_,gun (module.Tools) combat.(gun)
gui:(,#combat.patches> )
end)
if not ok then
combat.restore();combat.wasWall=true;combat.module=nil
gui:SetAttribute("WallShotsStatus","Unavailable: "..tostring(err));notify("Wall shots",tostring(err))
else notify("Wall shots","Experimental client raycasts enabled. Server damage is unverified.") end
end
local cooldown={controlled={},registry=nil,retry=0,keys={"FireCooldown","BurstFireCooldown","BurstBulletCooldown","FireDelay"}}
function cooldown.restoreOne(settings,state)
for key,record in pairs(state.fields) do
pcall(function()if rawget(settings,key)==record.last then settings[key]=record.original end end)
end
end
function cooldown.restore()
for settings,state in pairs(cooldown.controlled) do cooldown.restoreOne(settings,state) end
cooldown.controlled={}
end
function cooldown.status(value,tables,fields)
if not alive then return end
gui:SetAttribute("NoCooldownStatus",value)
gui:SetAttribute("NoCooldownTables",tables or 0);gui:SetAttribute("NoCooldownFields",fields or 0)
if cooldown.row then cooldown.row.Detail.Text=value end
end
function cooldown.findRegistry()
if cooldown.registry then return cooldown.registry end
if os.clock()<cooldown.retry then return nil end
cooldown.retry=os.clock()+2
local ok,value=pcall(function()
local rs=game:GetService("ReplicatedStorage")
local client=rs:FindFirstChild("Client")
local modules=client and client:FindFirstChild("Modules")
local managers=modules and modules:FindFirstChild("Managers")
local guns=managers and managers:FindFirstChild("Guns")
local script=guns and guns:FindFirstChild("GunManager")
if not script then return nil end
local registry=require(script)
if type(registry)=="table" and type(registry.Tools)=="table" then return registry end
end)
if ok then cooldown.registry=value end
return cooldown.registry
end
function cooldown.update()
if not C.NoCooldown then
if next(cooldown.controlled) then cooldown.restore() end
cooldown.status("Disabled - original gun timing restored.")
return
end
local registry=cooldown.findRegistry()
if not registry then cooldown.restore();cooldown.status("Unsupported weapon system. Server cooldown cannot be overridden here.");return end
local active={}
for _,gun in pairs(registry.Tools) do
local settings=type(gun)=="table" and rawget(gun,"Settings")
if type(settings)=="table" then active[settings]=true end
end
local tables,fields,failures=0,0,0
for settings in pairs(active) do
local state=cooldown.controlled[settings]
if not state then state={fields={}};cooldown.controlled[settings]=state end
local handled=0
for _,key in ipairs(cooldown.keys) do
local value=rawget(settings,key)
if type(value)=="number" and value>=0 and value<math.huge then
local record=state.fields[key] or {original=value}
if record.last~=nil and value~=record.last then record.original=value end
local ok=pcall(function()settings[key]=0 end)
if ok then record.last=rawget(settings,key);state.fields[key]=record;handled+=1;fields+=1
else failures+=1 end
end
end
if handled>0 then tables+=1 end
end
for settings,state in pairs(cooldown.controlled) do
if not active[settings] then cooldown.restoreOne(settings,state);cooldown.controlled[settings]=nil end
end
local message
if tables>0 then message=tables.." gun profiles / "..fields.." client delays removed. Server firing limits unverified."
elseif not next(active) then message="Ready - equip a compatible gun. Server firing limits remain authoritative."
elseif failures>0 then message="Unavailable - the gun timing settings are read-only."
else message="Unsupported gun - no recognized cooldown settings were found." end
if failures>0 and tables>0 then message..=" Some settings are read-only." end
cooldown.status(message,tables,fields)
end
function combat.update(own)
cooldown.update()
local count=0
local displayed={}
if C.Hitboxes then
for _,p in ipairs(Players:GetPlayers()) do
local ch=p.Character
local h=ch and ch:FindFirstChildOfClass("Humanoid")
local part=combat.hitPart(ch)
local teammate=not LP.Neutral and not p.Neutral and LP.Team~=nil and LP.Team==p.Team
if p~=LP and h and h.Health>0 and part and part:IsA("BasePart") and (C.HitboxTeams or not teammate) then
own(part,"Size",Vector3.new(C.HitboxSize,C.HitboxSize,C.HitboxSize))
own(part,"CanCollide",false);own(part,"Massless",true);own(part,"CanQuery",true)
own(part,"Transparency",C.HitboxOpacity/100);own(part,"Color",ink)
combat.drawBox(part,displayed)
count+=1
end
end
end
combat.clearBoxes(displayed)
gui:SetAttribute("HitboxesChanged",count)
if combat.hitStatus then combat.hitStatus.Detail.Text=not C.Hitboxes and "Resizing is OFF. Enable Change hitboxes above." or count==0 and "No eligible living characters loaded. Waiting for players / respawn." or (tostring(count).." resized / "..C.HitboxPart.." / "..C.HitboxSize.." studs / boxes "..(C.HitboxDisplay and "ON" or "OFF")..". Damage unverified.") end
if C.WallShots and not combat.wasWall then combat.enableWalls()
elseif not C.WallShots and combat.wasWall then combat.restore();gui:SetAttribute("WallShotsStatus","Disabled") end
if C.WallShots and combat.module then
combat.refreshTargets(false)
local activeGuns={}
for _,gun in pairs(combat.module.Tools) do if type(gun)=="table" then activeGuns[gun]=true end end
for i=#combat.patches,1,-1 do
local entry=combat.patches[i]
if not activeGuns[entry.gun] or rawget(entry.gun,"Raycast")~=entry.wrapper then
if not activeGuns[entry.gun] then pcall(function()if entry.gun.Raycast==entry.wrapper then entry.gun.Raycast=entry.original end end) end
table.remove(combat.patches,i)
end
end
for _,gun in pairs(combat.module.Tools) do combat.patchGun(gun) end
gui:SetAttribute("WallShotsPatchedGuns",#combat.patches)
gui:SetAttribute("WallShotsStatus",#combat.patches>0 and (#combat.patches.." guns / "..combat.targetCount.." living targets. Local adapter active; damage unverified.") or "Ready - equip a compatible gun. Server damage unverified.")
end
if combat.status then combat.status.Detail.Text=gui:GetAttribute("WallShotsStatus") or "Experimental adapter for this game's guns; server damage unverified." end
end
-- Compatibility checks never send damage or weapon remotes.
function combat.checkResize()
local target
for _,p in ipairs(Players:GetPlayers()) do
local ch=p.Character
local h=ch and ch:FindFirstChildOfClass("Humanoid")
local teammate=not LP.Neutral and not p.Neutral and LP.Team~=nil and LP.Team==p.Team
if p~=LP and h and h.Health>0 and (C.HitboxTeams or not teammate) then
target=combat.hitPart(ch);if target then break end
end
end
if not target then return "NOT TESTED - no eligible living target", "NOT TESTED" end
local original=target.Size
local desired=Vector3.new(C.HitboxSize,C.HitboxSize,C.HitboxSize)
local query=false
local ok,err=pcall(function()
target.Size=desired
assert((target.Size-desired).Magnitude<.01,"Game did not retain requested size")
local params=RaycastParams.new()
params.FilterType=Enum.RaycastFilterType.Include;params.FilterDescendantsInstances={target}
pcall(function()params.CollisionGroup="Raycast"end)
local origin=target.Position+target.CFrame.RightVector*(desired.X/2+8)
local hit=workspace:Raycast(origin,target.Position-origin,params)
query=hit~=nil and hit.Instance==target
end)
local restored,restoreError=pcall(function()target.Size=original end)
if not restored then return "ERROR - could not restore test size: "..tostring(restoreError),"NOT TESTED" end
if not ok then return "FAIL - "..tostring(err),"NOT TESTED" end
return "PASS locally ("..C.HitboxPart..", "..C.HitboxSize.." studs)",query and "PASS locally" or "FAIL - part excluded from local rays"
end
function combat.checkWeapons()
local rs=game:GetService("ReplicatedStorage")
local client=rs:FindFirstChild("Client")
local modules=client and client:FindFirstChild("Modules")
local managers=modules and modules:FindFirstChild("Managers")
local guns=managers and managers:FindFirstChild("Guns")
local script=guns and guns:FindFirstChild("GunManager")
if not script or not script:IsA("ModuleScript") then return "UNSUPPORTED weapon system",false end
local ok,module=pcall(require,script)
if not ok or type(module)~="table" or type(module.Tools)~="table" then return "UNSUPPORTED gun registry",false end
local count=0
for _,gun in pairs(module.Tools) do
if type(gun)=="table" and type(rawget(gun,"Raycast"))=="function" and type(rawget(gun,"AttemptToHit"))=="function" then count+=1 end
end
return count>0 and ("READY - "..count.." compatible guns loaded") or "READY - equip a gun to attach",true
end
function combat.checkWallFilter()
local characters=workspace:FindFirstChild("Characters")
if not characters then return "NOT TESTED - character container unavailable" end
local scratch=Instance.new("Folder")
scratch.Name="NovaCompatibilityProbe_"..uniqueId;scratch.Parent=workspace
local model=Instance.new("Model")
model.Name="NovaCompatibilityTarget_"..uniqueId
local ok,err=xpcall(function()
local hum=Instance.new("Humanoid");hum.Parent=model
local target=Instance.new("Part");target.Name="Head";target.Anchored=true
target.CanCollide=false;target.CanTouch=false;target.Transparency=1
target.Size=Vector3.new(4,4,4);target.Position=Vector3.new(64000,32000,64000);target.Parent=model
model.Parent=characters
local wall=Instance.new("Part");wall.Name="TestBarrier";wall.Anchored=true
wall.CanCollide=false;wall.CanTouch=false;wall.Transparency=1
wall.Size=Vector3.new(12,12,2);wall.Position=Vector3.new(64000,32000,64020);wall.Parent=scratch
local origin=Vector3.new(64000,32000,64040);local direction=Vector3.new(0,0,-80)
local params=RaycastParams.new();params.FilterType=Enum.RaycastFilterType.Include
params.FilterDescendantsInstances={wall,target}
local normal=workspace:Raycast(origin,direction,params)
assert(normal and normal.Instance==wall,"Test barrier query failed")
combat.refreshTargets(true)
local bypass=combat.raycast(nil,origin,direction)
assert(bypass and bypass.Instance==target,"Client wall filter did not reach the test target")
end,traceError)
model:Destroy();scratch:Destroy();combat.refreshTargets(true)
return ok and "PASS on a local test target" or ("FAIL - "..tostring(err):sub(1,160))
end
function combat.checkCompatibility()
if combat.checking then return end
combat.checking=true;combat.report.Visible=true;combat.report:SetAttribute("SearchBaseVisible",true);combat.reportHide.Visible=true;combat.reportHide:SetAttribute("SearchBaseVisible",true);combat.checkButton.Text="CHECKING..."
combat.report.Detail.Text="Checking local resize, ray queries, and the gun adapter..."
task.defer(function()
local ok,err=xpcall(function()
local resize,query=combat.checkResize()
local weapons,supported=combat.checkWeapons()
local walls=supported and combat.checkWallFilter() or "UNSUPPORTED weapon system"
gui:SetAttribute("CompatibilityResize",resize)
gui:SetAttribute("CompatibilityRayQuery",query)
gui:SetAttribute("CompatibilityWeapons",weapons)
gui:SetAttribute("CompatibilityWallFilter",walls)
gui:SetAttribute("CompatibilityServerDamage","UNVERIFIED")
gui:SetAttribute("CompatibilityPlaceId",tostring(game.PlaceId))
if alive then
combat.report.Detail.Text="Place: "..game.PlaceId.." / "..os.date("!%H:%M:%S UTC")..
"\nHitbox size: "..resize.."\nHitbox ray query: "..query..
"\nGun adapter: "..weapons.."\nWall filter: "..walls..
"\nServer damage: UNVERIFIED. These checks do not fire shots or prove server acceptance."
end
end,traceError)
combat.checking=false
if alive then
combat.checkButton.Text="CHECK GAME COMPATIBILITY"
if not ok then combat.report.Detail.Text="Check failed: "..tostring(err):sub(1,300);gui:SetAttribute("CompatibilityCheckError",tostring(err))
else gui:SetAttribute("CompatibilityCheckError",nil);notify("Compatibility check","Results are shown below the button. Server damage remains unverified.") end
end
end)
end
-- Use the supported weapon's normal fire function; no OS mouse holds or damage remotes.
local autofire={lastFire=-math.huge,target=nil,since=0,busy=false,nextRegistry=0,registry=nil}
function autofire.status(value)
if not alive then return end
if gui:GetAttribute("AutoFireStatus")~=value then gui:SetAttribute("AutoFireStatus",value) end
if autofire.row then autofire.row.Detail.Text=value end
end
function autofire.reset(value)
autofire.target=nil;autofire.since=0;autofire.status(value)
end
function autofire.playerForHit(hit)
local object=hit and hit.Instance
while object and object~=workspace do
if object:IsA("Model") then
local p=Players:GetPlayerFromCharacter(object)
local h=object:FindFirstChildOfClass("Humanoid")
if p and p~=LP and h and h.Health>0 then
local teammate=not LP.Neutral and not p.Neutral and LP.Team~=nil and LP.Team==p.Team
if C.Teams and teammate then return nil end
return p
end
end
object=object.Parent
end
end
function autofire.registryForGame()
if autofire.registry then return autofire.registry end
if os.clock()<autofire.nextRegistry then return nil end
autofire.nextRegistry=os.clock()+2
local ok,value=pcall(function()
local client=game:GetService("ReplicatedStorage"):FindFirstChild("Client")
local modules=client and client:FindFirstChild("Modules")
local managers=modules and modules:FindFirstChild("Managers")
local guns=managers and managers:FindFirstChild("Guns")
local script=guns and guns:FindFirstChild("GunManager")
if not script then return nil end
local registry=require(script)
if type(registry)=="table" and type(registry.Tools)=="table" then return registry end
end)
if ok then autofire.registry=value end
return autofire.registry
end
function autofire.crosshair(cam)
local origin=cam.CFrame.Position
local direction=cam.CFrame.LookVector*C.Range
local hit
if C.WallShots then
local ok,value=pcall(combat.raycast,nil,origin,direction)
if ok then hit=value end
else
local params=RaycastParams.new();params.FilterType=Enum.RaycastFilterType.Exclude
params.FilterDescendantsInstances={LP.Character,cam}
pcall(function()params.CollisionGroup="Raycast"end)
hit=workspace:Raycast(origin,direction,params)
end
return autofire.playerForHit(hit)
end
function autofire.step(cam,chosen,point)
if C.EditorOpen then autofire.reset("Paused for script editor");return end
if C.Healing then autofire.reset("Paused for healing");return end
if not alive or not (C.TriggerBot or C.AutoShoot) then autofire.reset("Disabled");return end
if menuOpen or not mobile and free or not focus or UIS:GetFocusedTextBox() then autofire.reset("Paused - menu, cursor, or text input.");return end
if type(iswindowactive)=="function" then
local ok,active=pcall(iswindowactive)
if not ok or not active then autofire.reset("Paused - game window is not active.");return end
end
local ch=LP.Character
local hum=ch and ch:FindFirstChildOfClass("Humanoid")
if not hum or hum.Health<=0 then autofire.reset("Waiting for a living character.");return end
local tool=autofire.currentTool and autofire.currentTool() or ch:FindFirstChildOfClass("Tool")
if not tool then autofire.reset("Equip a compatible gun.");return end
if not tool.Enabled or tool:GetAttribute("Ammo")==0 then autofire.reset("Weapon unavailable or out of ammo.");return end
local registry=autofire.registryForGame()
local gun=registry and registry.Tools[tool]
if type(gun)~="table" or type(gun.DoFire)~="function" then autofire.reset("Unsupported weapon - no native fire adapter.");return end
local target
local crosshair=autofire.crosshair(cam)
if C.TriggerBot and crosshair then target=crosshair end
if not target and C.AutoShoot and chosen and point then
local direction=point-cam.CFrame.Position
if direction.Magnitude>.001 and cam.CFrame.LookVector:Dot(direction.Unit)>=math.cos(math.rad(C.FireAngle)) and crosshair==chosen then target=chosen end
end
if not target then autofire.reset(C.AutoShoot and "Waiting for aim alignment or crosshair target." or "Waiting for a crosshair target.");return end
local now=os.clock()
if target~=autofire.target then autofire.target=target;autofire.since=now end
if (now-autofire.since)*1000<C.FireDelay then autofire.status("Target acquired - waiting for firing delay.");return end
if autofire.busy or now-autofire.lastFire<1/math.max(1,C.FireRate) then return end
autofire.lastFire=now;autofire.busy=true;autofire.status("Native fire request / "..target.Name)
task.spawn(function()
if alive and tool.Parent==LP.Character and (C.TriggerBot or C.AutoShoot) and not menuOpen and focus then
local ok,err=pcall(gun.DoFire,gun)
if not ok then gui:SetAttribute("AutoFireError",tostring(err));autofire.status("Native fire failed: "..tostring(err):sub(1,100)) end
end
autofire.busy=false
end)
end
-- Utilities own their state so reruns/unloading stop scheduled actions.
local utility={alive=true,nextStep=0,nextClick=0,nextReload=0,busy=false,reloadBusy=false,tools=setmetatable({},{__mode="k"})}
function utility.status(message)
if not alive then return end
if utility.row then utility.row.Detail.Text=message end
gui:SetAttribute("AmmoStatus",message)
end
function utility.current()
local ch=LP.Character
local h=ch and ch:FindFirstChildOfClass("Humanoid")
if not h or h.Health<=0 then return nil end
return ch:FindFirstChildOfClass("Tool")
end
function utility.gun(tool)
local registry=autofire.registryForGame()
return registry and registry.Tools[tool]
end
function utility.capacity(tool)
local gun=utility.gun(tool)
local settings=type(gun)=="table" and gun.Settings
if type(settings)=="table" and type(settings.Ammo)=="number" and settings.Ammo>0 and settings.Ammo<100000 then
return math.floor(settings.Ammo),gun
end
return nil,gun
end
function utility.inspect()
local tool=utility.current()
if not tool then utility.status("Equip a gun. Ammo support is checked again automatically.");return end
local ammo,mags=tool:GetAttribute("Ammo"),tool:GetAttribute("Mags")
local cap=utility.capacity(tool)
local server=tool:GetAttribute("ServerAmmo")
gui:SetAttribute("AmmoWeapon",tool.Name)
gui:SetAttribute("AmmoCapacity",cap or 0)
gui:SetAttribute("AmmoServerVerified",false)
if type(ammo)~="number" or not cap then
utility.status(tool.Name..": unsupported ammo system. Local refill is unavailable.")
elseif type(server)=="number" then
utility.status(tool.Name.." | local "..tostring(ammo).."/"..cap.." | server "..tostring(server).." | reserve "..tostring(mags)..". Local refill cannot guarantee server ammo.")
else
utility.status(tool.Name.." | local "..tostring(ammo).."/"..cap.." | reserve "..tostring(mags)..". Server acceptance is unverified.")
end
end
function utility.refill(tool)
local cap=utility.capacity(tool)
local ammo=tool:GetAttribute("Ammo")
if not cap or type(ammo)~="number" then return end
if ammo<cap then tool:SetAttribute("Ammo",cap) end
end
function utility.watch(tool)
if utility.tools[tool] then return end
utility.tools[tool]=true
on(tool:GetAttributeChangedSignal("Ammo"),function()
if not alive or not C.InfiniteAmmo then return end
task.defer(function()
if alive and C.InfiniteAmmo and tool==utility.current() then
local ok,err=pcall(utility.refill,tool)
if not ok then utility.status("Local refill failed: "..tostring(err):sub(1,90)) end
end
end)
end)
end
function utility.reload()
local tool=utility.current()
if not tool then utility.status("Equip a gun before reloading.");return end
local cap,gun=utility.capacity(tool)
if not cap or type(gun)~="table" or type(gun.DoReload)~="function" then utility.status("Reload unavailable: unsupported weapon.");return end
if utility.reloadBusy then return end
if (tonumber(tool:GetAttribute("Mags")) or 0)<=0 then utility.status("No reserve ammo. Reload requires ammunition supplied by the game.");return end
if (tonumber(tool:GetAttribute("Ammo")) or cap)>=cap then return end
utility.reloadBusy=true
task.spawn(function()
local ok,err=pcall(function()if alive and tool==utility.current() then gun:DoReload() end end)
utility.reloadBusy=false
if not ok and alive then utility.status("Reload failed: "..tostring(err):sub(1,100)) end
end)
end
function utility.click()
if C.EditorOpen or C.Healing or C.Bot or not C.AutoClicker or utility.busy or menuOpen or not focus or UIS:GetFocusedTextBox() then return end
if type(mouse1click)~="function" or type(iswindowactive)~="function" then
C.AutoClicker=false;refresh();utility.clickRow.Detail.Text="Mouse input unavailable in this executor.";return
end
local ok,active=pcall(iswindowactive)
if not ok or not active then return end
local position=UIS:GetMouseLocation()
if ui.pointerBlocked(position) then return end
local now=os.clock()
if now<utility.nextClick then return end
utility.nextClick=now+1/math.clamp(C.ClickRate,1,20)
utility.busy=true
task.spawn(function()
local success,err=pcall(function()
if alive and C.AutoClicker and not menuOpen and focus and not UIS:GetFocusedTextBox() and iswindowactive() then mouse1click() end
end)
utility.busy=false
if not success and alive then C.AutoClicker=false;refresh();utility.clickRow.Detail.Text="Click failed: "..tostring(err):sub(1,80) end
end)
end
function utility.step()
utility.click()
local now=os.clock()
if now<utility.nextStep then return end
utility.nextStep=now+.2
local tool=utility.current()
if tool then
utility.watch(tool)
if C.InfiniteAmmo then utility.refill(tool) end
if C.AutoReload and not C.InfiniteAmmo and not menuOpen and focus and not UIS:GetFocusedTextBox() and now>=utility.nextReload then
if tool:GetAttribute("Ammo")==0 then utility.nextReload=now+1;utility.reload() end
end
end
utility.inspect()
end
heading(pages.Combat,"Ammo and clicking","Ammo requires game support. Mouse clicking works independently of the weapon adapter.")
toggle(pages.Combat,"InfiniteAmmo","Infinite ammo (local only)","Experimental magazine refill. Server ammo and accepted shots are not guaranteed. Does not create reserve ammo.")
toggle(pages.Combat,"AutoReload","Automatic reload","Reload an empty supported gun using the game's reload function and existing reserve ammo.")
utility.row=row(pages.Combat,"AmmoDiagnostics","Ammo diagnostics","Equip a gun to check its ammo system.",mobile and 150 or 125)
utility.row.RowTitle.Size=UDim2.new(1,-32,0,22);utility.row.Detail.Size=UDim2.new(1,-32,1,-48)
local ammoCheck=button(pages.Combat,"CheckAmmo","CHECK AMMO SUPPORT",UDim2.new(),UDim2.new(1,0,0,44))
on(ammoCheck.Activated,function()utility.inspect()end)
local reloadNow=button(pages.Combat,"ReloadNow","RELOAD NOW",UDim2.new(),UDim2.new(1,0,0,44))
on(reloadNow.Activated,function()utility.reload()end)
toggle(pages.Combat,"AutoClicker","Auto clicker","Repeat left clicks while the menu is closed. Pauses over Nova, during typing, and when the game loses focus. F6 toggles.")
slider(pages.Combat,"ClickRate","Clicks per second","Independent of weapon cooldown and trigger bot.",1,20,1)
utility.clickRow=row(pages.Combat,"ClickerHelp","Auto clicker control","Close the menu to begin clicking. Press F6 to stop.",100)
utility.clickRow.RowTitle.Size=UDim2.new(1,-32,0,22);utility.clickRow.Detail.Size=UDim2.new(1,-32,1,-48)
local stopUtilities=button(pages.Combat,"StopUtilities","STOP AMMO AND AUTO CLICKER",UDim2.new(),UDim2.new(1,0,0,44))
on(stopUtilities.Activated,function()C.AutoClicker=false;C.InfiniteAmmo=false;C.AutoReload=false;refresh();utility.status("Ammo refill, automatic reload, and auto clicker stopped.")end)
on(UIS.InputBegan,function(key,processed)
if not processed and not UIS:GetFocusedTextBox() and key.KeyCode==Enum.KeyCode.F6 then
C.AutoClicker=not C.AutoClicker;refresh();notify("Auto clicker",C.AutoClicker and "Enabled; close the menu to click." or "Disabled")
end
end)
heading(pages.Combat,"Combat controls","Local weapon support, visible hitboxes, and game compatibility.")
toggle(pages.Combat,"NoCooldown","No gun cooldown (local)","Remove supported client shot and burst delays. The server may still enforce cooldowns.")
cooldown.row=row(pages.Combat,"NoCooldownStatus","Gun cooldown status","Disabled",110)
cooldown.row.RowTitle.Size=UDim2.new(1,-32,0,22);cooldown.row.Detail.Size=UDim2.new(1,-32,1,-48);cooldown.row.Detail.TextWrapped=true
toggle(pages.Combat,"TriggerBot","Trigger bot","Fire the equipped gun when a living target is under the center crosshair.")
toggle(pages.Combat,"AutoShoot","Auto shoot","Fire when aim tracking has aligned with a target. Enable Aim in the Aim tab.")
slider(pages.Combat,"FireRate","Auto fire limit","Maximum requests per second; the weapon still controls its actual fire rate.",1,12,1)
slider(pages.Combat,"FireDelay","Target firing delay","Wait this many milliseconds after acquiring a target.",0,300,10)
slider(pages.Combat,"FireAngle","Aim alignment tolerance","Auto shoot requires the camera to align within this angle.",0.5,5,0.5)
autofire.row=row(pages.Combat,"AutoFireStatus","Automatic firing status","Disabled",110)
autofire.row.RowTitle.Size=UDim2.new(1,-32,0,22);autofire.row.Detail.Size=UDim2.new(1,-32,1,-48);autofire.row.Detail.TextWrapped=true
local godInfo=button(pages.Combat,"GodModeUnavailable","GOD MODE - SERVER SUPPORT REQUIRED",UDim2.new(),UDim2.new(1,0,0,44))
on(godInfo.Activated,function()notify("God mode unavailable","This client cannot grant server-side invulnerability.")end)
toggle(pages.Combat,"WallShots","Shoot through walls","Experimental local gun adapter. Server damage remains unverified.")
combat.status=row(pages.Combat,"WallShotsStatus","Weapon status","Disabled. Enable Shoot through walls above.",110)
combat.status.RowTitle.Size=UDim2.new(1,-32,0,22)
combat.status.Detail.Size=UDim2.new(1,-32,1,-48);combat.status.Detail.TextWrapped=true;combat.status.Detail.TextYAlignment=Enum.TextYAlignment.Top
toggle(pages.Combat,"Hitboxes","Change hitboxes","Resize the chosen body part locally. Disable to restore.")
toggle(pages.Combat,"HitboxDisplay","Show hitbox boxes","Cyan bounds show the selected part through walls.")
cycle(pages.Combat,"HitboxPart","Hitbox body part","Choose Head or Torso; torso supports both character rigs.",{"Head","Torso","UpperTorso","LowerTorso"})
slider(pages.Combat,"HitboxSize","Hitbox size","Local part size. Server damage is not guaranteed.",2,100,2)
slider(pages.Combat,"HitboxOpacity","Hitbox transparency","Independent of the cyan box display.",0,100,5)
toggle(pages.Combat,"HitboxTeams","Include teammates","Also resize players on your team.")
combat.hitStatus=row(pages.Combat,"HitboxStatus","Hitbox status","Waiting for a character.",96)
combat.hitStatus.RowTitle.Size=UDim2.new(1,-32,0,22)
combat.hitStatus.Detail.Size=UDim2.new(1,-32,1,-44);combat.hitStatus.Detail.TextWrapped=true
combat.checkButton=button(pages.Combat,"CheckCompatibility","CHECK GAME COMPATIBILITY",UDim2.new(),UDim2.new(1,0,0,48))
on(combat.checkButton.Activated,combat.checkCompatibility)
combat.report=row(pages.Combat,"CompatibilityReport","Local compatibility results","Run a check to see results.",mobile and 340 or 270)
combat.report.RowTitle.Size=UDim2.new(1,-32,0,22)
combat.report.Detail.Position=UDim2.fromOffset(16,42);combat.report.Detail.Size=UDim2.new(1,-32,1,-54)
combat.report.Detail.TextWrapped=true;combat.report.Detail.TextYAlignment=Enum.TextYAlignment.Top
combat.report.Visible=false;combat.report:SetAttribute("SearchBaseVisible",false)
combat.reportHide=button(pages.Combat,"HideCompatibility","HIDE CHECK RESULTS",UDim2.new(),UDim2.new(1,0,0,36))
combat.reportHide.Visible=false;combat.reportHide:SetAttribute("SearchBaseVisible",false)
on(combat.reportHide.Activated,function()combat.report.Visible=false;combat.report:SetAttribute("SearchBaseVisible",false);combat.reportHide.Visible=false;combat.reportHide:SetAttribute("SearchBaseVisible",false);ui.applyFilter()end)
heading(pages.Travel,"Flight","Close the menu to move. WASD; Space/E up; Ctrl/Q down; Shift boost.")
toggle(pages.Travel,"Fly","Fly","Hover and move freely. Touch uses the joystick and UP / DOWN buttons.")
slider(pages.Travel,"FlySpeed","Fly speed","Horizontal flight speed in studs per second.",5,150,5)
slider(pages.Travel,"FlyVerticalSpeed","Fly vertical speed","Ascend and descend speed in studs per second.",5,100,5)
slider(pages.Travel,"FlyBoost","Fly boost multiplier","Hold Left Shift on PC to temporarily increase flight speed.",1,4,0.5)
flight.status=row(pages.Travel,"FlyStatus","Flight status","Disabled",100)
flight.status.RowTitle.Size=UDim2.new(1,-32,0,22);flight.status.Detail.Size=UDim2.new(1,-32,1,-44);flight.status.Detail.TextWrapped=true
local extras={parts={},character=nil,checkpoint=nil,nextScan=0,nextHop=0,rows=0}
extras.defaults={Noclip=false,InfiniteJump=false,BunnyHop=false,Sprint=false,SlowFall=false,Spin=false,AutoWalk=false,
SelfLight=false,Ghost=false,HideAccessories=false,HideTool=false,SelfOutline=false,Coordinates=false,Compass=false,AirPlatform=false,
SprintSpeed=32,FallLimit=18,SpinRate=120,GhostOpacity=65,StepDistance=8}
for key,value in pairs(extras.defaults) do C[key]=value end
function extras.characterParts()
local ch=LP.Character
local hum=ch and ch:FindFirstChildOfClass("Humanoid")
local hrp=ch and ch:FindFirstChild("HumanoidRootPart")
if hum and hum.Health>0 and hrp then return ch,hum,hrp end
end
function extras.active()
return alive and focus and not menuOpen and not UIS:GetFocusedTextBox()
end
function extras.message(value)
if extras.statusRow then extras.statusRow.Detail.Text=value end
gui:SetAttribute("ExtrasStatus",value)
end
function extras.scan(ch)
if extras.character~=ch or os.clock()>=extras.nextScan then
extras.character=ch;extras.nextScan=os.clock()+1;table.clear(extras.parts)
if ch then for _,object in ipairs(ch:GetDescendants()) do if object:IsA("BasePart") then table.insert(extras.parts,object) end end end
end
end
function extras.apply(own)
extras.own=own
local ch,hum,hrp=extras.characterParts()
extras.scan(ch)
if ch then
for _,part in ipairs(extras.parts) do if part.Parent and part:IsDescendantOf(ch) then
if C.Noclip then own(part,"CanCollide",false) end
local hidden=C.HideAccessories and part:FindFirstAncestorOfClass("Accessory") or C.HideTool and part:FindFirstAncestorOfClass("Tool")
if hidden then own(part,"LocalTransparencyModifier",1)
elseif C.Ghost then own(part,"LocalTransparencyModifier",C.GhostOpacity/100) end
end end
if C.Sprint and extras.active() and (mobile and hum.MoveDirection.Magnitude>.1 or UIS:IsKeyDown(Enum.KeyCode.LeftShift)) and not C.Fly then
own(hum,"WalkSpeed",C.SprintSpeed)
end
if C.Spin and extras.active() and not C.Fly then own(hum,"AutoRotate",false) end
end
if C.SelfLight and hrp then
if not extras.light or extras.light.Parent~=hrp then
if extras.light then extras.light:Destroy() end
extras.light=make("PointLight",{Name="NovaHeadlight",Brightness=2,Range=40,Shadows=false,Color=Color3.new(1,1,1)},hrp)
end
elseif extras.light then extras.light:Destroy();extras.light=nil end
if C.SelfOutline and ch then
if not extras.outline then extras.outline=make("Highlight",{Name="NovaSelfOutline",FillTransparency=1,OutlineTransparency=.1,DepthMode=Enum.HighlightDepthMode.AlwaysOnTop},world) end
extras.outline.Adornee=ch;extras.outline.OutlineColor=ink
elseif extras.outline then extras.outline:Destroy();extras.outline=nil end
end
function extras.step(dt,cam)
if extras.own then extras.apply(extras.own) end
local ch,hum,hrp=extras.characterParts()
local active=extras.active()
if hrp then
if active and not C.Fly then
if C.SlowFall then
local v=hrp.AssemblyLinearVelocity
if v.Y < -C.FallLimit then hrp.AssemblyLinearVelocity=Vector3.new(v.X,-C.FallLimit,v.Z) end
end
if C.Spin then hrp.CFrame=hrp.CFrame*CFrame.Angles(0,math.rad(C.SpinRate)*math.min(dt,.1),0) end
if C.AutoWalk then
local direction=Vector3.new(cam.CFrame.LookVector.X,0,cam.CFrame.LookVector.Z)
if direction.Magnitude>.01 then hum:Move(direction.Unit,false) end
end
if C.BunnyHop and hum.MoveDirection.Magnitude>.1 and hum.FloorMaterial~=Enum.Material.Air and os.clock()>=extras.nextHop then
extras.nextHop=os.clock()+.2;hum.Jump=true
end
end
if C.AirPlatform and not C.Noclip then
if not extras.platform then
extras.platform=make("Part",{Name="NovaAirPlatform",Anchored=true,CanCollide=true,CanTouch=false,CanQuery=false,Size=Vector3.new(7,.3,7),Material=Enum.Material.Neon,Transparency=.65},world)
end
extras.platform.Color=ink;extras.platform.CFrame=CFrame.new(hrp.Position-Vector3.new(0,hum.HipHeight+hrp.Size.Y/2+.25,0))
elseif extras.platform then extras.platform:Destroy();extras.platform=nil end
extras.coords.Text=string.format("X %.1f Y %.1f Z %.1f",hrp.Position.X,hrp.Position.Y,hrp.Position.Z)
elseif extras.platform then extras.platform:Destroy();extras.platform=nil end
extras.coords.Visible=C.Coordinates and hrp~=nil
local look=cam.CFrame.LookVector
local degrees=(math.deg(math.atan2(look.X,-look.Z))+360)%360
extras.compass.Text=({"N","NE","E","SE","S","SW","W","NW"})[math.floor((degrees+22.5)/45)%8+1].." "..math.floor(degrees).."°"
extras.compass.Visible=C.Compass
end
function extras.resetMovement()
for _,key in ipairs({"Noclip","InfiniteJump","BunnyHop","Sprint","SlowFall","Spin","AutoWalk","AirPlatform","Fly","SpeedOverride","JumpOverride","GravityOverride","AutoRotateOverride"}) do C[key]=false end
flight.stop()
local _,hum,hrp=extras.characterParts()
if hum then hum:Move(Vector3.zero,false) end
if hrp then hrp.AssemblyLinearVelocity=Vector3.zero;hrp.AssemblyAngularVelocity=Vector3.zero end
refresh();extras.message("Movement controls stopped and original properties restored.")
end
function extras.panic()
extras.resetMovement()
for key,value in pairs(C) do if type(value)=="boolean" then C[key]=false end end
C.ViewMode="Game default";C.Mode=mobile and "Hold AIM" or "Hold RMB"
autofire.reset("Emergency stop");cooldown.restore();combat.restore();combat.clearBoxes()
if restoreWorld then restoreWorld() end
refresh();extras.message("Emergency stop: toggles disabled. F8 is always available.")
end
function extras.destroy()
for _,key in ipairs({"light","outline","platform"}) do if extras[key] then extras[key]:Destroy();extras[key]=nil end end
end
function extras.action(key,label,fn)
extras.rows+=1
local b=button(pages.Extras,key,label,UDim2.new(),UDim2.new(1,0,0,44))
on(b.Activated,function()
local ok,err=pcall(fn)
if not ok then extras.message("Action failed: "..tostring(err):sub(1,100)) end
end)
end
function extras.toggle(key,titleValue,detail)
extras.rows+=1;toggle(pages.Extras,key,titleValue,detail)
end
function extras.slider(key,titleValue,detail,lo,hi,step)
extras.rows+=1;slider(pages.Extras,key,titleValue,detail,lo,hi,step)
end
function extras.move(offset)
local _,_,hrp=extras.characterParts()
if not hrp then extras.message("Wait for a living character.");return end
hrp.CFrame=hrp.CFrame*CFrame.new(offset)
hrp.AssemblyLinearVelocity=Vector3.zero;hrp.AssemblyAngularVelocity=Vector3.zero
extras.message("Moved locally. The game server may correct movement.")
end
extras.coords=text(gui,"",11,ink,UDim2.new(1,-290,1,-92),UDim2.fromOffset(274,24));extras.coords.Name="CoordinatesHUD";extras.coords.Visible=false;extras.coords.TextXAlignment=Enum.TextXAlignment.Right
extras.compass=text(gui,"",15,ink,UDim2.new(.5,-80,0,12),UDim2.fromOffset(160,28));extras.compass.Name="CompassHUD";extras.compass.Visible=false
extras.ammo=button(gui,"QuickInfiniteAmmo","INF AMMO: OFF",UDim2.new(1,-16,.5,-22),UDim2.fromOffset(174,44))
extras.ammo.AnchorPoint=Vector2.new(1,0);extras.ammo.ZIndex=25
on(extras.ammo.Activated,function()
C.InfiniteAmmo=not C.InfiniteAmmo;refresh();utility.inspect()
notify("Infinite ammo",C.InfiniteAmmo and "Local refill enabled; check Combat for server ammo status." or "Disabled")
end)
table.insert(paints,function()
extras.ammo.Text="INF AMMO: "..(C.InfiniteAmmo and "ON" or "OFF")
extras.ammo.BackgroundColor3=C.InfiniteAmmo and Color3.fromRGB(28,133,94) or Color3.fromRGB(31,34,43)
end)
heading(pages.Extras,"Extra controls","Local movement, appearance, quick presets, and recovery. Features start disabled; servers may limit movement.")
extras.toggle("Noclip","Noclip","Disable local character collisions. Turn off to restore original collision properties.")
extras.toggle("InfiniteJump","Infinite jump","Request another jump while airborne. Close the menu first.")
extras.toggle("BunnyHop","Bunny hop","Automatically jump when moving on the ground.")
extras.toggle("Sprint","Sprint","Hold Left Shift to sprint. Touch: sprint while moving.")
extras.slider("SprintSpeed","Sprint speed","Applies while sprint is active.",16,100,2)
extras.toggle("SlowFall","Slow fall","Limit local falling speed while the menu is closed.")
extras.slider("FallLimit","Fall speed limit","Downward speed cap in studs per second.",5,80,1)
extras.toggle("Spin","Spin character","Rotate the character during play; disabled while flying.")
extras.slider("SpinRate","Spin speed","Degrees per second.",30,720,30)
extras.toggle("AutoWalk","Auto walk","Move forward in the camera direction while the menu is closed.")
extras.toggle("AirPlatform","Air platform","Create a visible local platform under your character. Paused while noclip is on.")
heading(pages.Extras,"Local appearance","These appearance controls affect your view.")
extras.toggle("SelfLight","Personal light","Attach a local light to your character.")
extras.toggle("Ghost","Transparent character","Fade your own character locally; does not make you invisible to other players.")
extras.slider("GhostOpacity","Character transparency","Amount of local fading.",10,100,5)
extras.toggle("HideAccessories","Hide accessories","Hide your accessories locally and restore them when disabled.")
extras.toggle("HideTool","Hide equipped tool","Hide the equipped tool model locally.")
extras.toggle("SelfOutline","Self outline","Outline your own character using the current theme color.")
extras.toggle("Coordinates","Coordinates HUD","Show your current X, Y, and Z at the bottom right.")
extras.toggle("Compass","Compass HUD","Show the camera compass heading at the top center.")
heading(pages.Extras,"Quick movement","Short moves and one-click presets. Teleports are local and may be corrected by the server.")
extras.slider("StepDistance","Step distance","Distance used by the five directional step buttons.",1,30,1)
extras.action("StepForward","STEP FORWARD",function()extras.move(Vector3.new(0,0,-C.StepDistance))end)
extras.action("StepBack","STEP BACK",function()extras.move(Vector3.new(0,0,C.StepDistance))end)
extras.action("StepLeft","STEP LEFT",function()extras.move(Vector3.new(-C.StepDistance,0,0))end)
extras.action("StepRight","STEP RIGHT",function()extras.move(Vector3.new(C.StepDistance,0,0))end)
extras.action("StepUp","STEP UP",function()extras.move(Vector3.new(0,C.StepDistance,0))end)
extras.action("Brake","STOP MOMENTUM",function()local _,_,r=extras.characterParts();if r then r.AssemblyLinearVelocity=Vector3.zero;r.AssemblyAngularVelocity=Vector3.zero;extras.message("Momentum stopped.")end end)
extras.action("SitDown","SIT DOWN",function()local _,h=extras.characterParts();if h then h.Sit=true end end)
extras.action("StandUp","STAND UP",function()local _,h=extras.characterParts();if h then h.Sit=false;h:ChangeState(Enum.HumanoidStateType.GettingUp)end end)
extras.action("SaveCheckpoint","SAVE QUICK CHECKPOINT",function()local _,_,r=extras.characterParts();if r then extras.checkpoint=r.CFrame;extras.message("Session checkpoint saved.")end end)
extras.action("ReturnCheckpoint","RETURN TO CHECKPOINT",function()local _,_,r=extras.characterParts();if r and extras.checkpoint then r.CFrame=extras.checkpoint;r.AssemblyLinearVelocity=Vector3.zero;extras.message("Returned to checkpoint.")else extras.message("Save a checkpoint first.")end end)
extras.action("ClearCheckpoint","CLEAR QUICK CHECKPOINT",function()extras.checkpoint=nil;extras.message("Checkpoint cleared.")end)
extras.action("FastWalkPreset","FAST WALK PRESET",function()C.SpeedOverride=true;C.WalkSpeed=40;refresh();extras.message("Walk speed set to 40.")end)
extras.action("SuperJumpPreset","SUPER JUMP PRESET",function()C.JumpOverride=true;C.JumpPower=85;C.JumpHeight=18;refresh();extras.message("Higher jump preset enabled.")end)
extras.action("MoonGravityPreset","MOON GRAVITY PRESET",function()C.GravityOverride=true;C.Gravity=55;refresh();extras.message("Local gravity set to 55.")end)
extras.action("ResetMovementExtras","RESET MOVEMENT",extras.resetMovement)
heading(pages.Extras,"Quick view presets","Presets use the existing World, Visuals, and Travel settings.")
extras.action("DayPreset","DAYTIME",function()C.TimeLock=true;C.DayTime=12;refresh()end)
extras.action("NightPreset","NIGHTTIME",function()C.TimeLock=true;C.DayTime=0;refresh()end)
extras.action("SunsetPreset","SUNSET",function()C.TimeLock=true;C.DayTime=18;refresh()end)
extras.action("ClearViewPreset","CLEAR VIEW PRESET",function()C.NoFog=true;C.NoBlur=true;C.NoDOF=true;C.NoBloom=true;refresh()end)
extras.action("WideFovPreset","WIDE CAMERA FOV",function()C.CameraOverride=true;C.CameraFOV=100;refresh()end)
extras.action("FirstPersonPreset","FIRST PERSON",function()C.ViewMode="First person";refresh()end)
extras.action("ThirdPersonPreset","THIRD PERSON",function()C.ViewMode="Third person";refresh()end)
extras.action("ResetCameraExtras","RESET CAMERA",function()C.ViewMode="Game default";C.CameraOverride=false;C.CameraOffsetOverride=false;C.ZoomOverride=false;refresh()end)
extras.action("OutlinePreset","OUTLINE ESP PRESET",function()C.ESP=true;C.Opacity=100;C.OutlineFade=0;C.Names=false;C.Health=false;C.Distance=false;refresh()end)
extras.action("LabelsPreset","PLAYER LABELS PRESET",function()C.ESP=true;C.Names=true;C.Health=true;C.Distance=true;C.Opacity=80;refresh()end)
extras.action("ResetAppearanceExtras","RESTORE LOCAL APPEARANCE",function()for _,k in ipairs({"Ghost","HideAccessories","HideTool","SelfLight","SelfOutline"})do C[k]=false end;refresh();extras.message("Local appearance restored.")end)
extras.action("PanicExtras","EMERGENCY STOP / F8",extras.panic)
extras.statusRow=row(pages.Extras,"ExtrasStatus","Extra controls status","Ready. F8 disables active toggles.",110)
extras.statusRow.RowTitle.Size=UDim2.new(1,-32,0,22);extras.statusRow.Detail.Size=UDim2.new(1,-32,1,-48)
gui:SetAttribute("ExtraControlCount",extras.rows)
on(UIS.JumpRequest,function()
if C.InfiniteJump and extras.active() and not C.Fly then
local _,hum=extras.characterParts()
if hum then hum:ChangeState(Enum.HumanoidStateType.Jumping)end
end
end)
on(UIS.InputBegan,function(key,processed)
if not processed and not UIS:GetFocusedTextBox() and key.KeyCode==Enum.KeyCode.F8 then extras.panic()end
end)
local shooter={commands={},order={},history={},recoil={"RecoilForce","CameraRecoilForce"},kick={"RecoilFOV","CameraRecoilFOV"}}
C.NoRecoil=false;C.NoSpread=false;C.NoAimKick=false
C.InputSensitivity=false;C.AimSensitivity=1
function shooter.apply(own)
if C.InputSensitivity and not mobile then own(UIS,"MouseDeltaSensitivity",C.AimSensitivity) end
local count,fields=0,0
if C.NoRecoil or C.NoSpread or C.NoAimKick then
local registry=autofire.registryForGame()
for _,gun in pairs(registry and registry.Tools or {}) do
local settings=type(gun)=="table" and gun.Settings
if type(settings)=="table" then
local matched=false
for _,group in ipairs({{enabled=C.NoRecoil,keys=shooter.recoil},{enabled=C.NoAimKick,keys=shooter.kick}}) do
if group.enabled then for _,key in ipairs(group.keys) do
if type(rawget(settings,key))=="number" then own(settings,key,0);fields+=1;matched=true end
end end
end
if C.NoSpread then
local spread=rawget(settings,"BulletSpread")
if type(spread)=="table" and type(rawget(spread,1))=="number" and type(rawget(spread,2))=="number" then
own(spread,1,0);own(spread,2,0);fields+=2;matched=true
elseif type(spread)=="number" then own(settings,"BulletSpread",0);fields+=1;matched=true end
end
if matched then count+=1 end
end
end
end
local message=not (C.NoRecoil or C.NoSpread or C.NoAimKick) and "Weapon modifiers off. Original settings restored."
or count>0 and (count.." compatible gun profiles / "..fields.." recognized local fields. Server shot validation remains unverified.")
or "Unsupported weapon settings. Equip a compatible gun; no universal weapon override is available."
if shooter.weaponRow then shooter.weaponRow.Detail.Text=message end
gui:SetAttribute("ShooterWeaponStatus",message);gui:SetAttribute("ShooterProfiles",count)
end
function shooter.log(message)
table.insert(shooter.history,1,tostring(message):sub(1,240))
while #shooter.history>4 do table.remove(shooter.history)end
shooter.output.Detail.Text=table.concat(shooter.history,"\n")
gui:SetAttribute("CommandResult",tostring(message))
end
function shooter.add(name,example,description,fn)
shooter.commands[name]={run=fn,example=example,description=description}
table.insert(shooter.order,name)
end
function shooter.number(value,lo,hi)
local number=tonumber(value)
if not number or number~=number or number<lo or number>hi then error("Expected a number from "..lo.." to "..hi,0)end
return number
end
function shooter.switch(value)
if value=="on" then return true elseif value=="off" then return false end
error("Use on or off.",0)
end
function shooter.setting(name,key,description)
shooter.add(name,name.." on",description,function(args)C[key]=shooter.switch(args[1]);return name.." "..args[1]end)
end
function shooter.execute(raw)
if type(raw)~="string" or #raw>120 then shooter.log("Command must be 120 characters or fewer.");return end
local tokens={};for word in raw:lower():gsub("^%s*[/%.]",""):gmatch("%S+") do table.insert(tokens,word)end
local name=table.remove(tokens,1)
local command=name and shooter.commands[name]
if not command then shooter.log("Unknown command. Type help or use a button below.");return end
local expected=0;for _ in command.example:gmatch("%S+")do expected+=1 end
if #tokens~=expected-1 then shooter.log("Usage: "..command.example);return end
local ok,result=pcall(command.run,tokens)
if ok then refresh();shooter.log(result or (name.." applied."))else shooter.log("Command error: "..tostring(result))end
end
heading(pages.Commands,"Shooter commands","Run commands locally in Nova. Nothing is sent to game chat. Click preset buttons or enter a command.")
shooter.entry=row(pages.Commands,"CommandEntry","Command input","Examples: sniper, dot, norecoil on, cps 10, stopfire",140)
shooter.entry.RowTitle.Size=UDim2.new(1,-32,0,22)
shooter.input=make("TextBox",{Name="CommandInput",Text="",ClearTextOnFocus=false,PlaceholderText="Type a Nova command...",Font=Enum.Font.Gotham,TextSize=13,TextColor3=ink,
PlaceholderColor3=muted,BackgroundColor3=Color3.fromRGB(13,15,20),BorderSizePixel=0,TextXAlignment=Enum.TextXAlignment.Left,
Position=UDim2.fromOffset(16,83),Size=UDim2.new(1,-112,0,40)},shooter.entry);round(shooter.input,8)
make("UIPadding",{PaddingLeft=UDim.new(0,9),PaddingRight=UDim.new(0,6)},shooter.input)
shooter.run=button(shooter.entry,"RunCommand","RUN",UDim2.new(1,-87,0,83),UDim2.fromOffset(71,40))
on(shooter.run.Activated,function()shooter.execute(shooter.input.Text)end)
on(shooter.input.FocusLost,function(enter)if enter then shooter.execute(shooter.input.Text)end end)
shooter.output=row(pages.Commands,"CommandOutput","Recent command results","Ready. Use help to list commands.",210)
shooter.output.RowTitle.Size=UDim2.new(1,-32,0,22);shooter.output.Detail.Size=UDim2.new(1,-32,1,-48)
heading(pages.Commands,"Weapon controls","Compatible local settings only. Modifiers start disabled and restore when turned off or Nova unloads.")
toggle(pages.Commands,"NoRecoil","No recoil (local)","Set recognized recoil-force fields to zero on supported gun profiles.")
toggle(pages.Commands,"NoSpread","No spread (local)","Zero the recognized BulletSpread range. Server accuracy may still differ.")
toggle(pages.Commands,"NoAimKick","No FOV kick (local)","Remove recognized weapon camera FOV pulses.")
shooter.weaponRow=row(pages.Commands,"ShooterWeaponStatus","Weapon modifier status","Waiting for compatible gun profiles.",120)
shooter.weaponRow.RowTitle.Size=UDim2.new(1,-32,0,22);shooter.weaponRow.Detail.Size=UDim2.new(1,-32,1,-48)
toggle(pages.Commands,"InputSensitivity","Mouse sensitivity override","PC: scale camera mouse movement. Restore original sensitivity by disabling.")
slider(pages.Commands,"AimSensitivity","Mouse sensitivity multiplier","0.2 is slow; 1 is normal. Does not change the weapon's aim-assist code.",.1,2,.1)
shooter.add("help","help","Show help and command examples.",function()return #shooter.order.." commands. Browse the buttons below. Examples: sniper / dot / norecoil on / cps 10 / stopfire. Use on or off for toggles."end)
shooter.add("status","status","Show the equipped weapon's ammo diagnostics.",function()utility.inspect();return gui:GetAttribute("AmmoStatus")end)
shooter.setting("aim","Aim","Enable or disable aim tracking with the selected activation key.")
shooter.setting("esp","ESP","Enable or disable player highlights.")
shooter.setting("names","Names","Toggle player names.")
shooter.setting("health","Health","Toggle player health labels.")
shooter.setting("distance","Distance","Toggle player distance labels.")
shooter.setting("predict","AimPrediction","Toggle velocity lead for projectile aiming.")
shooter.setting("visible","Visibility","Toggle aim visibility checks.")
shooter.setting("teamfilter","Teams","Toggle teammate filtering for aim.")
shooter.setting("ring","Circle","Toggle the aim radius circle.")
shooter.setting("norecoil","NoRecoil","Toggle supported local recoil-force removal.")
shooter.setting("nospread","NoSpread","Toggle supported local spread removal.")
shooter.setting("nokick","NoAimKick","Toggle supported local camera FOV-kick removal.")
shooter.setting("ammo","InfiniteAmmo","Toggle local ammo refill. Server acceptance is unverified.")
shooter.setting("autoreload","AutoReload","Reload an empty supported weapon using existing reserve ammo.")
shooter.setting("clicker","AutoClicker","Toggle repeated mouse clicks. Close the menu to start; F6 stops.")
shooter.setting("trigger","TriggerBot","Toggle firing when a target is under the crosshair.")
shooter.setting("autoshoot","AutoShoot","Toggle firing when current aim is aligned with a target.")
shooter.add("smooth","smooth","Smooth aim preset; hold your chosen aim key during play.",function()C.Aim=true;C.AimResponse="Smooth";C.Speed=18;C.FOV=140;C.AimThroughWalls=false;C.Visibility=true;C.AimPrediction=false;C.Mode=mobile and "Hold AIM" or "Hold RMB"end)
shooter.add("sniper","sniper","Tight aim radius and slow response for precision weapons.",function()C.Aim=true;C.FOV=75;C.Speed=12;C.Part="Head";C.AimPrediction=false;C.Visibility=true;C.AimThroughWalls=false;C.AimResponse="Smooth";C.Mode=mobile and "Hold AIM" or "Hold RMB"end)
shooter.add("close","close","Wider aim radius and faster response for close range.",function()C.Aim=true;C.FOV=240;C.Speed=35;C.Part="UpperTorso";C.AimResponse="Smooth";C.Visibility=true;C.AimThroughWalls=false;C.Mode=mobile and "Hold AIM" or "Hold RMB"end)
shooter.add("tracking","tracking","Torso tracking with target retention and smooth response.",function()C.Aim=true;C.Part="UpperTorso";C.Sticky=true;C.AimRetention=50;C.Speed=24;C.FOV=180;C.AimResponse="Smooth";C.Visibility=true;C.AimThroughWalls=false;C.Mode=mobile and "Hold AIM" or "Hold RMB"end)
shooter.add("head","head","Select the head as the aim target.",function()C.Part="Head"end)
shooter.add("torso","torso","Select the upper torso as the aim target.",function()C.Part="UpperTorso"end)
shooter.add("fov","fov 120","Set aim radius: 40 to 600 pixels.",function(a)C.FOV=shooter.number(a[1],40,600)end)
shooter.add("response","response 24","Set aim response speed: 2 to 100.",function(a)C.Speed=shooter.number(a[1],2,100)end)
shooter.add("lead","lead 60","Set prediction lead: 0 to 200 milliseconds.",function(a)C.AimLead=shooter.number(a[1],0,200);C.AimPrediction=true end)
shooter.add("dot","dot","Use a small center-dot crosshair.",function()C.Crosshair=true;C.CrosshairStyle="Dot";C.CrosshairSize=4;C.CrosshairGap=0 end)
shooter.add("cross","cross","Use a compact plus crosshair.",function()C.Crosshair=true;C.CrosshairStyle="Plus";C.CrosshairSize=6;C.CrosshairGap=3 end)
shooter.add("outline","outline","Outline-only player ESP preset.",function()C.ESP=true;C.Opacity=100;C.OutlineFade=0;C.Names=false;C.Health=false;C.Distance=false end)
shooter.add("labels","labels","Player names, health, and distance preset.",function()C.ESP=true;C.Names=true;C.Health=true;C.Distance=true;C.Opacity=80 end)
shooter.add("clear","clear","Clear fog, blur, bloom, and depth of field locally.",function()C.NoFog=true;C.NoBlur=true;C.NoDOF=true;C.NoBloom=true end)
shooter.add("day","day","Lock the local scene to midday.",function()C.TimeLock=true;C.DayTime=12 end)
shooter.add("night","night","Lock the local scene to midnight.",function()C.TimeLock=true;C.DayTime=0 end)
shooter.add("camera","camera 90","Set camera FOV: 40 to 120 degrees.",function(a)C.CameraFOV=shooter.number(a[1],40,120);C.CameraOverride=true end)
shooter.add("scope","scope on","Use a narrow camera FOV. This does not add weapon zoom mechanics.",function(a)C.CameraOverride=shooter.switch(a[1]);if C.CameraOverride then C.CameraFOV=40 end end)
shooter.add("shoulder","shoulder right","Camera shoulder: left, right, or off.",function(a)if a[1]=="off"then C.CameraOffsetOverride=false elseif a[1]=="left"or a[1]=="right"then C.CameraOffsetOverride=true;C.CameraSide=a[1]=="left"and -2 or 2 else error("Use left, right, or off.",0)end end)
shooter.add("sensitivity","sensitivity 0.5","Set PC mouse sensitivity: 0.1 to 2.",function(a)if mobile then error("Mouse sensitivity requires PC mouse input.",0)end;C.AimSensitivity=shooter.number(a[1],.1,2);C.InputSensitivity=true end)
shooter.add("resetinput","resetinput","Restore original mouse sensitivity.",function()C.InputSensitivity=false end)
shooter.add("reload","reload","Request the equipped compatible weapon's native reload.",function()utility.reload();return "Reload requested; see Combat ammo status for compatibility."end)
shooter.add("cps","cps 10","Set auto-clicker rate: 1 to 20 clicks per second.",function(a)C.ClickRate=shooter.number(a[1],1,20)end)
shooter.add("mark","mark","Save a quick session checkpoint.",function()local _,_,r=extras.characterParts();if not r then error("No living character.",0)end;extras.checkpoint=r.CFrame end)
shooter.add("back","back","Return to the saved quick checkpoint.",function()local _,_,r=extras.characterParts();if not r or not extras.checkpoint then error("Save a checkpoint with mark first.",0)end;r.CFrame=extras.checkpoint;r.AssemblyLinearVelocity=Vector3.zero end)
shooter.add("walk","walk 32","Set a local walk-speed override: 0 to 100.",function(a)C.WalkSpeed=shooter.number(a[1],0,100);C.SpeedOverride=true end)
shooter.add("jump","jump 80","Set local jump power: 0 to 150, with jump-height fallback.",function(a)local n=shooter.number(a[1],0,150);C.JumpPower=n;C.JumpHeight=math.clamp(n*n/(2*math.max(1,workspace.Gravity)),0,50);C.JumpOverride=true end)
shooter.add("resetweapon","resetweapon","Restore local recoil, spread, camera-kick, and cooldown settings.",function()C.NoRecoil=false;C.NoSpread=false;C.NoAimKick=false;C.NoCooldown=false;cooldown.restore()end)
shooter.add("stopfire","stopfire","Disable all automatic firing and clicking immediately.",function()C.AutoClicker=false;C.TriggerBot=false;C.AutoShoot=false;autofire.reset("Stopped by command")end)
shooter.add("panic","panic","Disable active toggles and restore properties. F8 also works.",function()extras.panic()end)
heading(pages.Commands,"Command buttons","Each button runs the example shown. Use the command box to choose other values or turn options off.")
for _,name in ipairs(shooter.order) do
local command=shooter.commands[name]
local box=row(pages.Commands,"Command_"..name,command.example,command.description,100)
box.RowTitle.Size=UDim2.new(1,-110,0,22)
local run=button(box,"Cmd_"..name,"RUN",UDim2.new(1,-86,0,10),UDim2.fromOffset(70,32))
on(run.Activated,function()shooter.execute(command.example)end)
end
gui:SetAttribute("ShooterCommandCount",#shooter.order)
local bot={epoch=0,active=false,scanAt=0,pathAt=0,moveAt=0,shotAt=0,reloadAt=0,target=nil,waypoints=nil,index=1,pathBusy=false,fireBusy=false,reloadBusy=false,strafesAt=0,strafeSign=1,goal=nil,smoothed=Vector3.zero,random=Random.new(),progressAt=0,unstuckAt=0,pauseUntil=0}
C.Bot=false;C.BotMove=true;C.BotEquip=true;C.BotReload=true;C.BotStrafe=true;C.BotSmooth=true;C.BotRange=1000;C.BotDistance=70;C.BotRate=6;C.BotAimSpeed=16
function bot.status(message)
if not alive then return end
gui:SetAttribute("BotStatus",message)
if bot.row then bot.row.Detail.Text=message end
end
function bot.stopMovement()
bot.goal=nil;bot.smoothed=Vector3.zero;bot.jumpUntil=0;bot.jumpPlan=nil
local _,hum,root=extras.characterParts()
if hum and root then hum:Move(Vector3.zero,false)end
end
function bot.stop(message)
if bot.setADS then bot.setADS(nil,false)end
bot.epoch+=1;bot.active=false;bot.target=nil;bot.waypoints=nil;bot.pathBusy=false;bot.fireBusy=false;bot.reloadBusy=false;bot.progressPosition=nil;bot.progressAt=0;bot.pauseUntil=0
bot.stopMovement();gui:SetAttribute("BotTarget","");bot.status(message or "Disabled. F7 enables bot; F10 stops bot.")
end
function bot.team(p)
return not LP.Neutral and not p.Neutral and LP.Team~=nil and LP.Team==p.Team
end
function bot.visible(ch,cam)
local params=RaycastParams.new();params.FilterType=Enum.RaycastFilterType.Exclude
params.FilterDescendantsInstances={LP.Character,world}
pcall(function()params.CollisionGroup="Raycast"end)
for _,name in ipairs({"Head","UpperTorso","Torso","HumanoidRootPart"})do
local part=ch:FindFirstChild(name)
if part and part:IsA("BasePart")then
local direction=part.Position-cam.CFrame.Position
if direction.Magnitude>.01 then
local hit=workspace:Raycast(cam.CFrame.Position,direction,params)
if not hit or hit.Instance:IsDescendantOf(ch)then return part end
end
end
end
end
function bot.choose(root,cam)
local best,chosen,part=math.huge,nil,nil
for _,p in ipairs(Players:GetPlayers())do
if p~=LP and not bot.team(p)then
local ch=p.Character
local h=ch and ch:FindFirstChildOfClass("Humanoid")
local r=ch and ch:FindFirstChild("HumanoidRootPart")
if h and h.Health>0 and r and not ch:FindFirstChildOfClass("ForceField")then
local distance=(r.Position-root.Position).Magnitude
if distance<=C.BotRange then
local visible=bot.visible(ch,cam)
local score=distance+(visible and 0 or C.BotRange)
if p==bot.target then score*=.85 end
if score<best then best=score;chosen=p;part=visible end
end
end
end
end
return chosen,part
end
function bot.weapon(hum,ch)
local registry=autofire.registryForGame()
if not registry then return nil,nil,"Unsupported game: no native weapon adapter."end
local current=ch:FindFirstChildOfClass("Tool")
local gun=current and registry.Tools[current]
if type(gun)=="table" and type(gun.DoFire)=="function" and ((tonumber(current:GetAttribute("Ammo"))or 0)>0 or (tonumber(current:GetAttribute("Mags"))or 0)>0)then return current,gun end
if C.BotEquip then
for tool,entry in pairs(registry.Tools)do
if typeof(tool)=="Instance" and tool:IsA("Tool") and (tool.Parent==LP.Backpack or tool.Parent==ch)and type(entry)=="table" and type(entry.DoFire)=="function"then
if (tonumber(tool:GetAttribute("Ammo"))or 0)>0 or (tonumber(tool:GetAttribute("Mags"))or 0)>0 then
hum:EquipTool(tool);return tool,entry
end
end
end
end
return nil,nil,"Equip a supported gun with ammo or reserve magazines."
end
function bot.path(root,destination)
if bot.pathBusy or os.clock()<bot.pathAt then return end
bot.pathAt=os.clock()+1.3;bot.pathBusy=true
local token=bot.epoch
local target=bot.target
local start=root.Position
task.spawn(function()
local ok,result=pcall(function()
local path=game:GetService("PathfindingService"):CreatePath({AgentRadius=2,AgentHeight=5,AgentCanJump=true,WaypointSpacing=5})
path:ComputeAsync(start,destination)
return path.Status==Enum.PathStatus.Success and path:GetWaypoints()or nil
end)
if token~=bot.epoch or not alive or not C.Bot then return end
bot.pathBusy=false
if target~=bot.target then return end
if ok and result and #result>1 then
bot.waypoints=result;bot.index=2
gui:SetAttribute("BotPathStatus","Ready: "..#result.." waypoints")
else bot.waypoints=nil;gui:SetAttribute("BotPathStatus",ok and "No navigable path"or tostring(result):sub(1,120))end
end)
end
function bot.walk(hum,root,enemy,visible)
if not C.BotMove then bot.stopMovement();return end
local now=os.clock()
if now<bot.moveAt then return end
bot.moveAt=now+.12
if bot.jumpPlan then bot.goal=bot.jumpPlan.goal;return end
if C.BotShortcut and now<(bot.shortcutUntil or 0)and bot.shortcutGoal then bot.goal=bot.shortcutGoal;return end
local delta=enemy.Position-root.Position
local horizontal=Vector3.new(delta.X,0,delta.Z)
if visible and horizontal.Magnitude>.01 then
local forward=horizontal.Unit
local distance=horizontal.Magnitude
local step=distance>C.BotDistance+10 and 9 or distance<C.BotDistance*.5 and -7 or 0
if now>bot.strafesAt then
bot.strafesAt=now+(C.BotSmooth and bot.random:NextNumber(.9,1.6)or 1.3)
bot.strafeUntil=now+(C.BotSmooth and bot.random:NextNumber(.35,.7)or 1.3)
bot.strafeSign=-bot.strafeSign
end
local side=C.BotStrafe and now<(bot.strafeUntil or 0)and Vector3.new(-forward.Z,0,forward.X)*(C.BotSmooth and 3 or 4)*bot.strafeSign or Vector3.zero
local destination=root.Position+forward*step+side
local params=RaycastParams.new();params.FilterType=Enum.RaycastFilterType.Exclude;params.FilterDescendantsInstances={LP.Character,world,enemy.Parent}
local ground=workspace:Raycast(destination+Vector3.new(0,2,0),Vector3.new(0,-12,0),params)
local block=workspace:Raycast(root.Position,destination-root.Position,params)
if ground and not block then
bot.waypoints=nil
bot.goal=(destination-root.Position).Magnitude>1 and Vector3.new(destination.X,ground.Position.Y,destination.Z)or nil
return
end
end
if C.BotShortcut then
local jumped,landing=bot.checkObstacle(hum,root,enemy.Position-root.Position)
if jumped then bot.shortcutGoal=landing;bot.shortcutUntil=now+.7;bot.goal=landing;return end
end
bot.path(root,enemy.Position)
local waypoint=bot.waypoints and bot.waypoints[bot.index]
if waypoint then
local flat=Vector3.new(root.Position.X-waypoint.Position.X,0,root.Position.Z-waypoint.Position.Z)
if flat.Magnitude<2.5 and math.abs(root.Position.Y-waypoint.Position.Y)<6 then bot.index+=1;waypoint=bot.waypoints[bot.index]end
if waypoint then
if waypoint.Action==Enum.PathWaypointAction.Jump then bot.requestJump(hum,"Path waypoint")end
bot.goal=waypoint.Position
else bot.stopMovement()end
else
if horizontal.Magnitude>1 then bot.goal=root.Position+horizontal.Unit*math.min(8,horizontal.Magnitude)else bot.stopMovement()end
end
end
function bot.drive(hum,root,dt)
bot.updateJump(hum,root)
local now=os.clock()
local wanted=Vector3.zero
local distance=0
if bot.goal and C.BotMove then
local delta=Vector3.new(bot.goal.X-root.Position.X,0,bot.goal.Z-root.Position.Z)
distance=delta.Magnitude
if distance>(bot.jumpPlan and .2 or 1)then wanted=delta.Unit end
end
local avoiding=false
if wanted.Magnitude>.1 then bot.checkObstacle(hum,root,wanted);if not bot.jumpPlan then wanted,avoiding=bot.steer(hum,root,wanted)end end
if bot.obstacleRow then bot.obstacleRow.Detail.Text=gui:GetAttribute("BotObstacleStatus")or "Ready: scanning low obstacles while moving."end
if C.BotSmooth and now<bot.pauseUntil then wanted=Vector3.zero end
if bot.jumpPlan or avoiding then bot.smoothed=wanted
elseif C.BotSmooth then
bot.smoothed=bot.smoothed:Lerp(wanted,1-math.exp(-9*math.min(dt,.1)))
else bot.smoothed=wanted end
if bot.smoothed.Magnitude<.025 then bot.smoothed=Vector3.zero end
-- Apply after PlayerModule's render update; MoveTo is canceled by default controls.
hum:Move(bot.smoothed,false)
if now<(bot.jumpUntil or 0)and hum.FloorMaterial~=Enum.Material.Air then hum.Jump=true end
if hum.FloorMaterial==Enum.Material.Air or root.AssemblyLinearVelocity.Y>2 then bot.jumpUntil=0 end
gui:SetAttribute("BotMovementInput",bot.smoothed.Magnitude)
gui:SetAttribute("BotPosition",root.Position)
if now>=bot.progressAt then
local progress=bot.progressPosition and (root.Position-bot.progressPosition).Magnitude or 10
if wanted.Magnitude>.5 and distance>4 and progress<.8 and now>=bot.unstuckAt then
bot.unstuckAt=now+2.5;bot.pathAt=0;bot.waypoints=nil
if hum.FloorMaterial~=Enum.Material.Air then bot.requestJump(hum,"Obstacle recovery")end
if C.BotSmooth then bot.pauseUntil=now+.18 end
gui:SetAttribute("BotNavigation","Blocked: jumping once and computing a new path")
else gui:SetAttribute("BotNavigation",wanted.Magnitude>.1 and "Following path / progress "..string.format("%.1f",progress).." studs"or "Holding position")end
bot.progressPosition=root.Position;bot.progressAt=now+1
end
end
function bot.step(dt,cam)
if C.EditorOpen then bot.setADS(nil,false);bot.stopMovement();bot.status("Paused for script editor");return end
if C.Healing then bot.setADS(nil,false);bot.stopMovement();bot.status("Paused for healing");return end
if not C.Bot then if bot.active then bot.stop()end;return end
if not bot.active then
if ui.prepareBot and not ui.prepareBot() then C.Bot=false;bot.stop("Equip a firearm Tool before starting; this game may require a custom weapon adapter.");refresh();return end
C.BotAvoid=true;C.BotMove=true;C.BotSmooth=true;C.BotStrafe=true;C.BotReload=true;C.BotADS=true;C.BotFollowCamera=true;C.BotObstacleJump=true;C.BotJumpAssist=true
if ui.enforceCapabilities then ui.enforceCapabilities() end
bot.active=true;bot.epoch+=1;bot.scanAt=0;bot.pathAt=0
C.AutoClicker=false;C.TriggerBot=false;C.AutoShoot=false;C.Aim=false
for _,key in ipairs({"Fly","Spin","AutoWalk","Noclip","AirPlatform","BunnyHop","Hitboxes"})do C[key]=false end
if C.BotADS then C.CameraOverride=false end
flight.stop();refresh();showMenu(false)
end
if not extras.active()then bot.setADS(nil,false);bot.stopMovement();bot.status("Paused: close the menu, focus the game, and finish typing. F10 stops bot.");return end
if type(iswindowactive)=="function"then local ok,focused=pcall(iswindowactive);if not ok or not focused then bot.setADS(nil,false);bot.stopMovement();bot.status("Paused: game window is not focused.");return end end
local ch,hum,root=extras.characterParts()
if not ch then bot.setADS(nil,false);bot.status("Waiting for a living character.");return end
if bot.character~=ch then bot.character=ch;bot.epoch+=1;bot.target=nil;bot.waypoints=nil;bot.pathBusy=false;bot.fireBusy=false;bot.reloadBusy=false end
local tool,gun,message=bot.weapon(hum,ch)
if not tool then bot.setADS(nil,false);bot.stopMovement();bot.status(message);return end
if tool:GetAttribute("Ammo")==0 then
bot.setADS(nil,false)
bot.stopMovement()
if C.BotReload and (tonumber(tool:GetAttribute("Mags"))or 0)>0 and type(gun.DoReload)=="function"then
bot.status("Reloading "..tool.Name.." using available reserve ammo.")
if not bot.reloadBusy and os.clock()>=bot.reloadAt then
bot.reloadBusy=true;bot.reloadAt=os.clock()+1
local token=bot.epoch
task.spawn(function()
local ok,err=pcall(function()if alive and C.Bot and token==bot.epoch then gun:DoReload()end end)
if token==bot.epoch then bot.reloadBusy=false;if not ok then bot.status("Reload failed: "..tostring(err):sub(1,100))end end
end)
end
else bot.status("Out of ammo. Bot cannot create server ammunition.")end
return
end
local now=os.clock()
if now>=bot.scanAt then
bot.scanAt=now+.2
local target=bot.choose(root,cam)
if target~=bot.target then bot.target=target;bot.waypoints=nil;bot.pathAt=0 end
end
local enemy=bot.target and bot.target.Character
local enemyHum=enemy and enemy:FindFirstChildOfClass("Humanoid")
local enemyRoot=enemy and enemy:FindFirstChild("HumanoidRootPart")
if not enemyRoot or not enemyHum or enemyHum.Health<=0 then bot.target=nil;bot.setADS(nil,false);bot.stopMovement();bot.status("Searching for a living opponent within "..C.BotRange.." studs.");return end
gui:SetAttribute("BotTarget",bot.target.Name)
local part=bot.visible(enemy,cam)
bot.walk(hum,root,enemyRoot,part~=nil)
bot.drive(hum,root,dt)
if not part then
bot.setADS(nil,false)
bot.routeCamera(cam,root,dt,enemyRoot.Position)
local navigation=gui:GetAttribute("BotNavigation")or gui:GetAttribute("BotPathStatus")or "Planning a route"
bot.status("Seeking "..bot.target.Name.." / "..navigation..". No clear shot.");return
end
bot.setADS(gun,true)
if bot.adsRow then bot.adsRow.Detail.Text=gui:GetAttribute("BotADSStatus")or "Ready"end
local direction=part.Position-cam.CFrame.Position
if direction.Magnitude<.01 then return end
gui:SetAttribute("BotCameraStatus","Tracking visible target")
cam.CFrame=cam.CFrame:Lerp(CFrame.lookAt(cam.CFrame.Position,part.Position),1-math.exp(-C.BotAimSpeed*dt))
bot.status("Tracking "..bot.target.Name.." / "..tool.Name..". Native weapon cooldowns apply. F10 stops.")
if bot.fireBusy or bot.reloadBusy or now<bot.shotAt or cam.CFrame.LookVector:Dot(direction.Unit)<math.cos(math.rad(3))then return end
bot.shotAt=now+1/math.max(1,C.BotRate);bot.fireBusy=true
local token=bot.epoch
task.spawn(function()
local ok,err=pcall(function()
if alive and C.Bot and token==bot.epoch and extras.active()and tool.Parent==LP.Character and enemyHum.Health>0 and bot.visible(enemy,cam)then gun:DoFire()end
end)
if token==bot.epoch then bot.fireBusy=false;if not ok then bot.status("Native firing failed: "..tostring(err):sub(1,100))end end
end)
end
heading(pages.Bot,"Auto-play bot","Opt-in target search, camera aiming, native firing, reloading, and pathfinding. Requires a compatible game weapon adapter.")
toggle(pages.Bot,"Bot","Auto-play bot / F7","Starts disabled. Starting enables movement, camera follow, jump assistance and supported ADS/reload, then closes the menu. Reopen the menu to pause. F10 stops only the bot; F8 stops everything.")
toggle(pages.Bot,"BotMove","Bot movement","Use paths when targets are behind cover; approach or retreat to your preferred distance.")
toggle(pages.Bot,"BotEquip","Auto equip compatible gun","Choose an owned, compatible gun with ammo or reserve magazines.")
toggle(pages.Bot,"BotReload","Bot reload","Use the weapon's native reload with existing reserve ammo.")
toggle(pages.Bot,"BotStrafe","Bot strafe","Alternate short side steps while fighting visible targets. Requires Bot movement.")
toggle(pages.Bot,"BotSmooth","Natural movement","Ease direction changes, take shorter side steps, and pause briefly when recovering from obstacles.")
slider(pages.Bot,"BotRange","Opponent search range","Nearest visible opponent is preferred. Teammates and spawn-protected players are skipped.",100,2000,50)
slider(pages.Bot,"BotDistance","Preferred fighting distance","Distance from a visible target, in studs.",15,200,5)
slider(pages.Bot,"BotRate","Bot fire request limit","Maximum attempts per second. Native weapon cooldowns still apply.",1,12,1)
slider(pages.Bot,"BotAimSpeed","Bot aim response","Higher values align the camera faster.",4,35,1)
bot.row=row(pages.Bot,"BotStatus","Bot status","Disabled. F7 toggles bot; F10 stops bot; F8 stops all active toggles.",140)
bot.row.RowTitle.Size=UDim2.new(1,-32,0,22);bot.row.Detail.Size=UDim2.new(1,-32,1,-48)
bot.stopButton=button(pages.Bot,"StopBot","STOP BOT / F10",UDim2.new(),UDim2.new(1,0,0,48))
on(bot.stopButton.Activated,function()C.Bot=false;bot.stop("Stopped by button. F7 enables bot again.");refresh()end)
on(UIS.InputBegan,function(key,processed)
if processed or UIS:GetFocusedTextBox()then return end
if key.KeyCode==Enum.KeyCode.F7 then C.Bot=not C.Bot;if not C.Bot then bot.stop("Stopped with F7.")end;refresh()
elseif key.KeyCode==Enum.KeyCode.F10 then C.Bot=false;bot.stop("Stopped with F10. F8 remains emergency stop.");refresh()end
end)
heading(pages.Aim,"Precision control",mobile and "Close the menu, then hold or tap the AIM pad." or "Configure your targeting. Free cursor pauses aiming.")
toggle(pages.Aim,"Aim","Aim assist","Smooth camera tracking while activated.")
cycle(pages.Aim,"Mode","Activation","Choose hold, toggle, or always active.",mobile and {"Hold AIM","Toggle AIM","Always"} or {"Hold RMB","Toggle RMB","Always"})
cycle(pages.Aim,"Part","Target bone","Automatically falls back for custom rigs.",{"Head","HumanoidRootPart","UpperTorso"})
cycle(pages.Aim,"Origin","FOV origin","Track from your crosshair or cursor.",mobile and {"Screen center"} or {"Screen center","Mouse"})
slider(pages.Aim,"FOV","Field of view","Target selection radius in screen pixels.",40,600,10)
slider(pages.Aim,"Speed","Response speed","Higher values follow targets faster; independent of frame rate.",2,100,1)
cycle(pages.Aim,"AimPriority","Target priority","Choose the closest crosshair, nearest player, or lowest health.",{"Crosshair","Nearest","Lowest health"})
cycle(pages.Aim,"AimResponse","Tracking response","Smooth follows at your response speed. Instant points directly at the target.",{"Smooth","Instant"})
toggle(pages.Aim,"AimFallback","Visible body-part fallback","Try head and torso alternatives when the selected part is blocked.")
toggle(pages.Aim,"AimPrediction","Movement prediction","Optional velocity lead; leave disabled for hitscan guns.")
slider(pages.Aim,"AimLead","Prediction lead","Milliseconds of motion lead when prediction is enabled.",0,200,10)
slider(pages.Aim,"AimRetention","Target retention strength","Prefer your current target without permanently locking it.",0,80,5)
local responsive=button(pages.Aim,"ResponsiveAim","APPLY RESPONSIVE AIM PRESET",UDim2.new(),UDim2.new(1,0,0,48))
on(responsive.Activated,function()
C.Aim=true;C.Speed=32;C.FOV=250;C.Sticky=true;C.AimRetention=35
C.AimPriority="Crosshair";C.AimFallback=true;C.AimResponse="Smooth";C.AimPrediction=false
selected=nil;refresh();notify("Aim preset","Enabled. Close the menu and use your selected activation mode.")
end)
slider(pages.Aim,"Range","Detection range","Maximum aim distance; ESP has separate distance controls.",100,5000,50)
toggle(pages.Aim,"AimThroughWalls","Aim through walls","Track players behind walls. Does not guarantee shots pass through them.")
toggle(pages.Aim,"Visibility","Visibility check","Skip blocked targets while Aim through walls is disabled.")
toggle(pages.Aim,"Teams","Ignore teammates","Neutral players remain eligible.")
toggle(pages.Aim,"Sticky","Target retention","Stay on one target while it remains valid.")
toggle(pages.Aim,"Circle","FOV circle","Display your targeting radius.")
heading(pages.Visuals,"Visual intelligence","Fine-tune character highlights and player information.")
toggle(pages.Visuals,"ESP","Character highlights","Outline player characters available on your client.")
toggle(pages.Visuals,"ESPAll","Show every player","Include teammates independently of your aim team filter.")
toggle(pages.Visuals,"ESPUnlimited","Unlimited ESP distance","Remove the aim and label distance limits from ESP.")
slider(pages.Visuals,"ESPInterval","ESP refresh interval","Milliseconds between text updates. Outlines follow players every frame.",25,200,25)
toggle(pages.Visuals,"Names","Identity labels","Display name and username.")
toggle(pages.Visuals,"Health","Health display","Health bar with current and maximum HP.")
toggle(pages.Visuals,"Distance","Distance markers","Player distance measured in studs.")
toggle(pages.Visuals,"Through","Through walls","Keep highlights and labels visible behind geometry.")
slider(pages.Visuals,"Opacity","Fill transparency","Solid fill at 0. Outline only at 100.",0,100,5)
cycle(pages.Visuals,"Color","Visual accent","Choose the highlight and FOV color.",{"Background","Silver","Violet","Cyan","Rose","Lime"})
heading(pages.Interface,"Interface","Liquid chrome / "..deviceName.." controls")
local appliedTheme=nil
applyTheme=function(name)
if appliedTheme==name then return end
local profile=themeProfiles[name] or themeProfiles.Chrome
appliedTheme=name;currentTheme=profile
ink=profile.primary;muted=profile.muted;palettes.Background=profile.accent
gui:SetAttribute("ThemePrimary",ink);gui:SetAttribute("ThemeMuted",muted);gui:SetAttribute("ThemeAccent",profile.accent)
for _,object in ipairs(gui:GetDescendants())do
if object:IsA("TextLabel") or object:IsA("TextButton") then
local role=object:GetAttribute("ThemeRole")
if role then animate(object,{TextColor3=role=="Muted" and muted or ink},.34) end
elseif object:IsA("GuiObject") and object:GetAttribute("ThemeFill")=="Primary" then
animate(object,{BackgroundColor3=ink},.34)
elseif object:IsA("UIStroke") and object:GetAttribute("ThemeEdge") then
animate(object,{Color=profile.accent},.34)
end
end
chrome.Color=ColorSequence.new({
ColorSequenceKeypoint.new(0,ink),ColorSequenceKeypoint.new(.45,profile.accent:Lerp(Color3.new(0,0,0),.32)),
ColorSequenceKeypoint.new(.54,ink),ColorSequenceKeypoint.new(1,profile.accent:Lerp(Color3.new(0,0,0),.48))})
local gradient=border:FindFirstChildOfClass("UIGradient")
if gradient then gradient.Color=ColorSequence.new({
ColorSequenceKeypoint.new(0,profile.accent:Lerp(Color3.new(0,0,0),.65)),
ColorSequenceKeypoint.new(.28,ink),
ColorSequenceKeypoint.new(.55,profile.accent:Lerp(Color3.new(0,0,0),.7)),
ColorSequenceKeypoint.new(1,profile.accent)}) end
end
local function chooseBackground(name)
if not backgroundIndex[name] then return end
C.Background=name;refresh()
if notify then notify("Background",name) end
end
local function stepBackground(delta)
local at=backgroundIndex[C.Background] or 1
chooseBackground(backgroundList[(at-1+delta)%#backgroundList+1].name)
end
local prevBG=button(root,"PreviousBackground","‹",UDim2.new(1,-100,0,88),UDim2.fromOffset(32,28))
local nextBG=button(root,"NextBackground","›",UDim2.new(1,-56,0,88),UDim2.fromOffset(32,28))
prevBG.Visible=not mobile;nextBG.Visible=not mobile
heroTag.Position=UDim2.new(1,-290,0,90);heroTag.Size=UDim2.fromOffset(175,24)
on(prevBG.Activated,function()stepBackground(-1)end)
on(nextBG.Activated,function()stepBackground(1)end)
switchBackground=function(name)
local entry=backgroundList[backgroundIndex[name] or 1]
heroTag.Text=entry.name:upper()
if applyTheme then applyTheme(entry.name) end
if entry.name==activeBackground then return end
local nextImage=backgroundAsset(entry)
if nextImage=="" then
gui:SetAttribute("BackgroundError","Background asset unavailable: "..entry.name)
return
end
liquid.Image=liquidSwap.Image;liquid.ScaleType=liquidSwap.ScaleType
liquidSwap.Image=nextImage
liquidSwap.ScaleType=entry.stretch and Enum.ScaleType.Stretch or Enum.ScaleType.Crop
mist.Image=nextImage;mist.ScaleType=liquidSwap.ScaleType
image=nextImage;activeBackground=entry.name
backgroundMix.Value=0;animate(backgroundMix,{Value=1},.5)
gui:SetAttribute("BackgroundError",nil)
gui:SetAttribute("BackgroundAsset",entry.file)
end
local columns=mobile and 2 or 3
local gridRows=math.ceil(#backgroundList/columns)
local gridHeight=gridRows*82+(gridRows-1)*8
local gallery=make("Frame",{Name="BackgroundGallery",BackgroundTransparency=1,
Size=UDim2.new(1,0,0,gridHeight+32)},pages.Interface)
text(gallery,"CHOOSE YOUR BACKGROUND",10,muted,UDim2.new(),UDim2.new(1,0,0,22))
local grid=make("Frame",{Name="Previews",BackgroundTransparency=1,Position=UDim2.fromOffset(0,30),
Size=UDim2.new(1,0,0,gridHeight)},gallery)
make("UIGridLayout",{CellSize=UDim2.new(1/columns,-8*(columns-1)/columns-2,0,82),
CellPadding=UDim2.fromOffset(8,8),FillDirectionMaxCells=columns,
SortOrder=Enum.SortOrder.LayoutOrder},grid)
for i,entry in ipairs(backgroundList)do
local preview=button(grid,entry.name,"",UDim2.new(),UDim2.fromOffset(150,82))
preview.LayoutOrder=i
local photo=make("ImageLabel",{Name="PreviewImage",BackgroundTransparency=1,
Image=backgroundAsset(entry),Size=UDim2.fromScale(1,1),
ScaleType=entry.stretch and Enum.ScaleType.Stretch or Enum.ScaleType.Crop},preview)
local strip=make("Frame",{BackgroundColor3=Color3.fromRGB(9,10,14),BackgroundTransparency=.12,
BorderSizePixel=0,Position=UDim2.new(0,0,1,-25),Size=UDim2.new(1,0,0,25)},preview)
local caption=text(strip,entry.name,11,ink,UDim2.fromOffset(9,0),UDim2.new(1,-30,1,0))
local check=text(strip,"✓",12,ink,UDim2.new(1,-23,0,0),UDim2.fromOffset(20,25))
local selectedFrame=make("Frame",{Name="Selection",BackgroundTransparency=1,
Position=UDim2.fromOffset(1,1),Size=UDim2.new(1,-2,1,-2),ZIndex=2},preview);round(selectedFrame,9)
local selectedEdge=outline(selectedFrame,1);selectedEdge.Color=ink;selectedEdge.Thickness=1.5
table.insert(paints,function()
local chosen=C.Background==entry.name
preview:SetAttribute("Selected",chosen)
check.Visible=chosen
animate(selectedEdge,{Transparency=chosen and .05 or 1},.2)
caption:SetAttribute("ThemeRole",chosen and "Primary" or "Muted")
animate(caption,{TextColor3=chosen and ink or muted},.34)
end)
on(preview.Activated,function()chooseBackground(entry.name)end)
end
gui:SetAttribute("BackgroundAsset",initialBackground.file)
toggle(pages.Interface,"Motion","Interface animations","Background drift, chrome shimmer, and transitions.")
slider(pages.Interface,"Backdrop","Backdrop intensity","Adjust the brightness of your liquid-metal image.",0,100,5)
-- Visibility and label tuning.
slider(pages.Visuals,"OutlineFade","Outline transparency","0 = solid outline; 100 = hidden outline.",0,100,5)
slider(pages.Visuals,"LabelSize","Label text size","Resize player names, distance, and health text.",10,20,1)
slider(pages.Visuals,"LabelHeight","Label height","Move player labels above their characters.",2,8,.5)
slider(pages.Visuals,"LabelRange","Label distance","Limit information labels separately from highlights.",100,5000,100)
heading(pages.World,"World & lighting","Local visual adjustments. Original settings restore on unload.")
toggle(pages.World,"FullBright","Full Bright","Bright ambient light with shadows removed.")
toggle(pages.World,"NoFog","Clear fog & atmosphere","Remove fog, haze, density, and atmospheric glare.")
toggle(pages.World,"NoShadows","Remove shadows","Disable global shadows independently.")
toggle(pages.World,"TimeLock","Lock time of day","Keep the sun at your chosen time.")
slider(pages.World,"DayTime","Time of day","0 = midnight; 12 = noon; 18 = evening.",0,24,.5)
toggle(pages.World,"CustomLight","Custom lighting","Enable the three controls below. Full Bright takes priority.")
slider(pages.World,"LightBrightness","Brightness","Applied when Custom lighting is enabled.",0,10,.5)
slider(pages.World,"LightExposure","Exposure","Adjust scene exposure with Custom lighting enabled.",-3,3,.1)
slider(pages.World,"AmbientLevel","Ambient light","Ambient fill strength with Custom lighting enabled.",0,100,5)
toggle(pages.World,"NoBloom","Disable bloom","Remove bright bloom glow.")
toggle(pages.World,"NoBlur","Disable blur","Remove BlurEffect post-processing.")
toggle(pages.World,"NoDOF","Disable depth of field","Remove near / far camera blur.")
toggle(pages.World,"NoSunRays","Disable sun rays","Remove post-processing sun rays.")
toggle(pages.World,"NoColor","Disable color filters","Remove game ColorCorrectionEffect filters.")
toggle(pages.World,"CameraOverride","Camera FOV override","Use your selected camera field of view.")
slider(pages.World,"CameraFOV","Camera field of view","Camera zoom angle; separate from aim selection radius.",40,120,5)
local worldKeys={"FullBright","CustomLight","TimeLock","NoShadows","NoFog","NoBloom","NoBlur","NoSunRays","NoColor","NoDOF","CameraOverride"}
local restoreButton=button(pages.World,"RestoreWorld","RESTORE ORIGINAL WORLD",UDim2.new(),UDim2.new(1,0,0,44))
on(restoreButton.Activated,function()
for _,key in ipairs(worldKeys) do C[key]=false end
if restoreWorld then restoreWorld() end
refresh()
end)
toggle(pages.Interface,"ShowStatus","Status footer","Show tracking and player-count information.")
toggle(pages.Interface,"ShowFPS","FPS performance panel","Live FPS, frame time, ping, and a recent performance graph.")
toggle(pages.Interface,"FPSDetails","FPS details","Show frame time and ping. Clicking the FPS panel also switches this.")
toggle(pages.Interface,"FPSGraph","FPS history graph","Show the most recent six seconds of sampled FPS.")
cycle(pages.Interface,"FPSCorner","FPS position","Choose the screen corner for your performance panel.",{"Top right","Top left","Bottom right","Bottom left"})
toggle(pages.Interface,"Watermark","NOVA watermark","Show the new Nova brand panel with version and session information.")
toggle(pages.Interface,"WatermarkDetails","Watermark details","Show device, player count, and session time. Click the watermark to switch.")
cycle(pages.Interface,"WatermarkCorner","Watermark position","Panels automatically stack when you select the same corner.",{"Top left","Top right","Bottom left","Bottom right"})
slider(pages.Interface,"HUDScale","Overlay size","Scale the FPS and watermark panels; automatically fit narrow screens.",75,125,5)
slider(pages.Interface,"HUDOpacity","Overlay opacity","Background opacity for both panels.",20,100,5)
toggle(pages.Interface,"QuickCursor","Floating cursor button","PC: show the extra mouse-unlock button.")
toggle(pages.Interface,"ShowAimPad","Touch AIM pad","Mobile: show or hide the gameplay AIM pad.")
slider(pages.Interface,"AimPadSize","Touch pad size","Mobile AIM button diameter in pixels.",56,112,4)
slider(pages.Interface,"UISize","Desktop panel size","Desktop scale percentage; stays within the screen.",75,125,5)
toggle(pages.Interface,"HideRingMenu","Hide FOV in menu","Keep the circle out of the way while adjusting controls.")
toggle(pages.Interface,"Crosshair","Custom crosshair","Show a crosshair at the camera center during play.")
cycle(pages.Interface,"CrosshairStyle","Crosshair style","Plus, diagonal cross, or a single center dot.",{"Plus","Cross","Dot"})
slider(pages.Interface,"CrosshairSize","Crosshair size","Length of the crosshair arms, in pixels.",3,24,1)
slider(pages.Interface,"CrosshairGap","Crosshair gap","Space between the center and crosshair arms.",0,12,1)
slider(pages.Interface,"AnimationSpeed","Animation speed","50 = slower; 100 = normal; 175 = faster.",50,175,25)
toggle(pages.Interface,"Parallax","Cursor parallax","Desktop: reflections gently follow the cursor.")
toggle(pages.Interface,"Notifications","Setting notifications","Show a small confirmation when changing a toggle.")
local preset={previous=nil,profile="Not applied"}
function preset.describe(message)
preset.status.Detail.Text=message
gui:SetAttribute("GamePresetStatus",message)
end
function preset.detect()
local tool=utility.current()
local gun=tool and utility.gun(tool)
local settings=type(gun)=="table" and gun.Settings
if type(settings)~="table"then
local registry=autofire.registryForGame()
for candidate,entry in pairs(registry and registry.Tools or {})do
if typeof(candidate)=="Instance"and candidate:IsA("Tool")and candidate.Parent==LP.Backpack and type(entry)=="table"and type(entry.Settings)=="table"and type(entry.DoFire)=="function"then
tool=candidate;gun=entry;settings=entry.Settings;break
end
end
end
local supported=type(settings)=="table"
local kind="General shooter"
if supported then
local name=tool.Name:lower()
if settings.ShotgunReload or settings.ShotgunPumpEnabled or (tonumber(settings.BulletAmount)or 1)>1 or name:find("shotgun",1,true)or name:find("sawn",1,true)or name:find("870",1,true)then kind="Shotgun"
elseif name:find("barrett",1,true)or name:find("sniper",1,true)or name:find("awm",1,true)then kind="Precision"
elseif type(settings.Modes)=="table"and table.find(settings.Modes,"Automatic")then kind="Automatic"
else kind="Single fire"end
end
return tool,gun,settings,kind
end
function preset.apply()
local tool,gun,settings,kind=preset.detect()
local values={Aim=true,Mode="Always",AimResponse="Smooth",AimPrediction=false,
AimFallback=true,AimPriority="Crosshair",Sticky=true,AimRetention=35,Visibility=true,AimThroughWalls=false,Teams=true,
ESP=true,ESPAll=true,Names=true,Health=true,Distance=true,Through=true,Opacity=100,OutlineFade=10,
Crosshair=true,CrosshairStyle="Plus",CrosshairSize=6,CrosshairGap=3,LabelSize=12,
Hitboxes=true,HitboxDisplay=true,HitboxSize=12,HitboxPart="Head",HitboxOpacity=75,HitboxTeams=false,
WallShots=false,NoCooldown=false,InfiniteAmmo=false,AutoShoot=false,TriggerBot=false,AutoClicker=false,Bot=false,
NoRecoil=false,NoSpread=false,NoAimKick=false,AutoReload=false,FireRate=6,FireDelay=80,FireAngle=2.5,
BotSmooth=true,BotStrafe=true,BotMove=true,BotReload=true,BotEquip=true,BotRange=1000,BotDistance=70,BotRate=6,
InputSensitivity=false,FOV=150,Speed=20,Part="UpperTorso"}
if type(settings)=="table"then
values.NoRecoil=type(settings.RecoilForce)=="number"or type(settings.CameraRecoilForce)=="number"
local spread=settings.BulletSpread
values.NoSpread=type(spread)=="number"or type(spread)=="table"and type(spread[1])=="number"and type(spread[2])=="number"
values.NoAimKick=type(settings.RecoilFOV)=="number"or type(settings.CameraRecoilFOV)=="number"
values.AutoReload=type(gun.DoReload)=="function"
values.AutoShoot=type(gun.DoFire)=="function";values.TriggerBot=values.AutoShoot
values.InfiniteAmmo=type(settings.Ammo)=="number"and type(tool:GetAttribute("Ammo"))=="number"
values.WallShots=type(gun.Raycast)=="function"
values.AimThroughWalls=values.WallShots;values.Visibility=not values.WallShots
for _,key in ipairs(cooldown.keys)do if type(settings[key])=="number"then values.NoCooldown=true;break end end
end
if kind=="Shotgun"then values.FOV=200;values.Speed=26;values.Part="UpperTorso";values.BotDistance=35;values.BotRate=3
elseif kind=="Precision"then values.FOV=85;values.Speed=12;values.Part="Head";values.BotDistance=140;values.BotRate=2
elseif kind=="Automatic"then values.FOV=165;values.Speed=25;values.BotDistance=60
elseif kind=="Single fire"then values.FOV=125;values.Speed=18;values.Part="Head";values.BotDistance=80 end
-- Keep the first pre-preset snapshot until restored; repeated clicks do not erase it.
if not preset.previous then preset.previous={};for key in pairs(values)do preset.previous[key]=C[key]end end
for key,value in pairs(values)do C[key]=value end
bot.stop("Game preset applied; bot remains off.");autofire.reset("Game preset applied");cooldown.restore()
refresh()
preset.profile=(game.PlaceId==126210570846701 and "Sanguine Fields"or (game.PlaceId==120189115846709 or game.GameId==10090256806) and "TTK Testing"or "Detected game").." / "..kind
gui:SetAttribute("GamePresetProfile",preset.profile)
gui:SetAttribute("GamePresetWeapon",tool and tool.Name or "No equipped gun")
local enabled={};for _,entry in ipairs({{"AutoShoot","auto shoot"},{"TriggerBot","trigger bot"},{"Hitboxes","hitboxes"},{"InfiniteAmmo","local ammo"},{"NoRecoil","no recoil"},{"NoSpread","no spread"},{"NoAimKick","no FOV kick"},{"NoCooldown","no cooldown"},{"WallShots","local wall shots"},{"AutoReload","auto reload"}})do if C[entry[1]]then table.insert(enabled,entry[2])end end
gui:SetAttribute("GamePresetEnabled",table.concat(enabled,", "))
preset.describe(preset.profile..(tool and " / "..tool.Name or "")..". ON: "..table.concat(enabled,", ")..". Equip a gun and close the menu to engage. Ammo and wall-shot server acceptance remain unverified.")
notify("Combat preset applied",kind.." / "..#enabled.." combat controls enabled.")
end
function preset.restore()
if not preset.previous then preset.describe("No preset snapshot yet. Apply Game Preset first.");return end
for key,value in pairs(preset.previous)do C[key]=value end
preset.previous=nil;preset.profile="Restored"
refresh();gui:SetAttribute("GamePresetProfile","Restored")
preset.describe("Your settings from before the preset have been restored.")
notify("Settings restored","Returned to your pre-preset settings.")
end
preset.quick=button(gui,"ApplyGamePresetQuick","AIM/FIRE PRESET",UDim2.new(1,-16,.5,28),UDim2.fromOffset(174,44))
preset.quick.AnchorPoint=Vector2.new(1,0);preset.quick.ZIndex=25
on(preset.quick.Activated,function()preset.apply()end)
heading(pages.Settings,"Game preset","Enable supported combat features together, including automatic aiming and shooting. Close the menu to engage. Apply again after switching weapon types.")
preset.applyButton=button(pages.Settings,"ApplyGamePreset","APPLY AIM/FIRE SETTINGS (BOT STAYS OFF)",UDim2.new(),UDim2.new(1,0,0,48))
on(preset.applyButton.Activated,function()preset.apply()end)
preset.restoreButton=button(pages.Settings,"RestoreGamePreset","RESTORE PREVIOUS SETTINGS",UDim2.new(),UDim2.new(1,0,0,44))
on(preset.restoreButton.Activated,preset.restore)
preset.status=row(pages.Settings,"GamePresetStatus","Game preset status","Not applied. Press Game Preset to enable supported combat controls together.",230)
preset.status.RowTitle.Size=UDim2.new(1,-32,0,22);preset.status.Detail.Size=UDim2.new(1,-32,1,-48)
local healing={busy=false,epoch=0}
C.Healing=false
function healing.status(message)
if not alive then return end
gui:SetAttribute("HealStatus",message)
if healing.row then healing.row.Detail.Text=message end
if healing.quick then healing.quick.Text=C.Healing and "HEALING..."or "HEAL TO FULL"end
end
function healing.find()
local best,score=nil,0
for _,root in ipairs({LP.Backpack,LP.Character})do if root then for _,tool in ipairs(root:GetChildren())do
if tool:IsA("Tool")then
local name=tool.Name:lower()
local rank=(name:find("first aid",1,true)or name:find("medkit",1,true))and 3 or name:find("healing potion",1,true)and 2 or name=="bandage"and 1 or 0
if rank>score and tool:FindFirstChild("Settings")then best=tool;score=rank end
end
end end end
return best
end
function healing.wait(seconds,token,hum,tool)
local finish=os.clock()+seconds
repeat
if not alive or not C.Healing or healing.epoch~=token or hum.Health<=0 or hum.Parent~=LP.Character or tool and tool.Parent~=LP.Character then return false end
task.wait(.05)
until os.clock()>=finish
return true
end
function healing.release()
if healing.signal then pcall(function()healing.signal:Fire(false)end);healing.signal=nil end
if healing.controller and type(healing.controller.DoStop)=="function"then pcall(healing.controller.DoStop,healing.controller)end
healing.controller=nil
Run:UnbindFromRenderStep(binding.."_HealSelf")
if healing.camera and healing.camera.Parent and healing.cameraFrame then healing.camera.CFrame=healing.cameraFrame end
healing.camera=nil;healing.cameraFrame=nil
end
function healing.run()
if healing.busy then healing.status("Healing is already in progress. Use Cancel heal to stop.");return end
local ch,hum=extras.characterParts()
if not hum then healing.status("Wait for a living character. This button cannot revive a dead character.");return end
if hum.Health>=hum.MaxHealth then healing.status("Already at full health: "..math.floor(hum.Health).." / "..math.floor(hum.MaxHealth));return end
if game.PlaceId~=126210570846701 then healing.status("This game has no verified healing adapter. The button cannot grant server health.");return end
if not healing.find()then healing.status("No healing items. Obtain a healing potion, first aid kit, or bandage first.");return end
healing.busy=true;C.Healing=true;healing.epoch+=1;local token=healing.epoch
local original=ch:FindFirstChildOfClass("Tool")
local equipped
task.spawn(function()
local ok,err=pcall(function()
local network=require(game.ReplicatedStorage.Shared.Modules.Dependencies.Network)
local manager=require(game.ReplicatedStorage.Client.Modules.Managers.ConsumableManager)
local attempted={}
for attempt=1,8 do
if not alive or not C.Healing or token~=healing.epoch or hum.Health<=0 then break end
if hum.Health>=hum.MaxHealth then healing.status("Full health confirmed: "..math.floor(hum.Health).." / "..math.floor(hum.MaxHealth));return end
local tool=healing.find()
if not tool then healing.status("No healing items left. Health: "..math.floor(hum.Health).." / "..math.floor(hum.MaxHealth));return end
if attempted[tool]then healing.status("The healing item was not consumed. Try using it manually or obtain another item.");return end
attempted[tool]=true
local settings=require(tool.Settings)
local equip=math.clamp(tonumber(settings.EquipTime)or 1,.15,10)
local use=math.clamp(tonumber(settings.UseSelfTime)or 3,.2,30)
local before=hum.Health
equipped=tool;hum:EquipTool(tool)
healing.status("Using "..tool.Name.." on yourself. Health "..math.floor(before).." / "..math.floor(hum.MaxHealth))
if not healing.wait(equip+.25,token,hum,tool)then healing.status("Healing canceled during equip.");return end
local controller=manager.Tools[tool]
if type(controller)~="table"or type(controller.DoStart)~="function"then healing.status("This item has no ready native consumable controller. Re-equip it and try again.");return end
healing.controller=controller
-- Aim at open space while the native controller chooses self vs another player.
local cam=workspace.CurrentCamera
healing.camera=cam;healing.cameraFrame=cam.CFrame
local up=CFrame.lookAt(cam.CFrame.Position,cam.CFrame.Position+Vector3.new(0,1,.001))
Run:BindToRenderStep(binding.."_HealSelf",Enum.RenderPriority.Last.Value+200,function()if alive and C.Healing then cam.CFrame=up end end)
if not healing.wait(.1,token,hum,tool)then healing.status("Healing canceled.");return end
healing.signal=network.Signals.MobileAttack
healing.signal:Fire(true)
if not healing.wait(.15,token,hum,nil)then healing.status("Healing canceled.");return end
Run:UnbindFromRenderStep(binding.."_HealSelf");cam.CFrame=healing.cameraFrame;healing.camera=nil;healing.cameraFrame=nil
local mouseGui=LP.PlayerGui:FindFirstChild("Mouse")
local markers=mouseGui and mouseGui:FindFirstChild("Markers")
local indicator=markers and markers:FindFirstChild("Consumable")
if indicator and indicator.Visible and not indicator.Text:find(" ON "..LP.Name:upper(),1,true)then
healing.status("Native action selected another player. Healing canceled; aim at open space and retry.");return
end
if not healing.wait(use+.5,token,hum,nil)then healing.status("Healing canceled.");return end
healing.release()
if not healing.wait(3,token,hum,nil)then healing.status("Healing canceled.");return end
if hum.Health<=before then healing.status("Healing was not confirmed by the game. Health "..math.floor(hum.Health).." / "..math.floor(hum.MaxHealth));return end
if tool.Parent==ch and hum.Health<hum.MaxHealth then
healing.status("Healing applied. Wait for item removal before using another item.");return
end
end
healing.status(hum.Health>=hum.MaxHealth and "Full health confirmed."or "Healing stopped. Health "..math.floor(hum.Health).." / "..math.floor(hum.MaxHealth))
end)
healing.release()
C.Healing=false;healing.busy=false
if not ok then healing.status("Healing unavailable: "..tostring(err):sub(1,140))end
if alive and LP.Character==ch and hum.Health>0 then
if not ch:FindFirstChildOfClass("Tool")or ch:FindFirstChildOfClass("Tool")==equipped then
if original and original.Parent==LP.Backpack then hum:EquipTool(original)
elseif equipped and equipped.Parent==ch then hum:UnequipTools()end
end
end
if alive then healing.quick.Text="HEAL TO FULL"end
end)
end
function healing.cancel()
C.Healing=false;healing.epoch+=1;healing.release();healing.status("Healing canceled. No further items will be used.")
end
healing.quick=button(gui,"HealFullQuick","HEAL TO FULL",UDim2.new(1,-16,.5,78),UDim2.fromOffset(174,44))
healing.quick.AnchorPoint=Vector2.new(1,0);healing.quick.ZIndex=25
on(healing.quick.Activated,healing.run)
heading(pages.Combat,"Healing","Use owned healing items on yourself. Health is confirmed from the game; healing cannot be granted without game support.")
healing.button=button(pages.Combat,"HealFull","HEAL TO FULL",UDim2.new(),UDim2.new(1,0,0,48))
on(healing.button.Activated,healing.run)
healing.cancelButton=button(pages.Combat,"CancelHeal","CANCEL HEAL",UDim2.new(),UDim2.new(1,0,0,40))
on(healing.cancelButton.Activated,healing.cancel)
healing.row=row(pages.Combat,"HealStatus","Healing status","Ready. Healing uses items in your inventory; it cannot create health or supplies.",130)
healing.row.RowTitle.Size=UDim2.new(1,-32,0,22);healing.row.Detail.Size=UDim2.new(1,-32,1,-48)
local defense={elapsed=0,retryAt=0}
C.DefenseAssist=false;C.DefenseThreshold=85
function defense.status(message)
if not alive then return end
gui:SetAttribute("DefenseStatus",message)
if defense.row then defense.row.Detail.Text=message end
end
function defense.toggle()
C.DefenseAssist=not C.DefenseAssist;defense.retryAt=0;refresh()
defense.status(C.DefenseAssist and "Enabled. Healing items will be used below "..C.DefenseThreshold.."% health. Incoming damage is unchanged."or "Disabled. No additional automatic healing will start.")
end
function defense.tick(dt)
defense.elapsed+=dt;if defense.elapsed<.4 then return end;defense.elapsed=0
if not C.DefenseAssist then defense.status("Disabled. This feature uses owned healing supplies; it does not grant damage immunity.");return end
local _,hum=extras.characterParts()
if not hum then defense.status("Waiting for a living character. Cannot prevent death or revive you.");return end
if game.PlaceId~=126210570846701 then defense.status("Unavailable: no verified healing adapter for this game.");return end
if C.Healing or healing.busy then defense.status("Healing in progress. Automatic firing and bot actions are paused.");return end
local ratio=hum.Health/math.max(1,hum.MaxHealth)*100
if ratio>=C.DefenseThreshold then
defense.status("Ready: "..math.floor(hum.Health).." / "..math.floor(hum.MaxHealth).." HP. Heal trigger "..C.DefenseThreshold.."%. Incoming damage is unchanged.");return
end
if not healing.find()then defense.status("Low health, but no healing supplies remain. Obtain a first aid kit, potion, or bandage.");return end
if os.clock()<defense.retryAt then return end
defense.retryAt=os.clock()+10
defense.status("Low health: using a healing item. This takes the game's normal use time.")
healing.run()
end
defense.quick=button(gui,"DefenseAssistQuick","DEFENSE: OFF",UDim2.new(1,-16,.5,128),UDim2.fromOffset(174,44))
defense.quick.AnchorPoint=Vector2.new(1,0);defense.quick.ZIndex=25
on(defense.quick.Activated,defense.toggle)
table.insert(paints,function()
defense.quick.Text="DEFENSE: "..(C.DefenseAssist and "ON"or "OFF")
defense.quick.BackgroundColor3=C.DefenseAssist and Color3.fromRGB(28,133,94)or Color3.fromRGB(31,34,43)
end)
heading(pages.Combat,"Defense assist","Automatic use of owned healing supplies. Server damage and death rules are unchanged.")
toggle(pages.Combat,"DefenseAssist","Defense assist","Use a healing item when health falls below the selected percentage. F8 stops it.")
slider(pages.Combat,"DefenseThreshold","Auto-heal health threshold","Percentage of maximum health that triggers automatic healing.",25,95,5)
defense.row=row(pages.Combat,"DefenseStatus","Defense status","Disabled. No damage reduction or invulnerability is granted.",140)
defense.row.RowTitle.Size=UDim2.new(1,-32,0,22);defense.row.Detail.Size=UDim2.new(1,-32,1,-48)
on(Run.Heartbeat,function(dt)
local ok,err=pcall(defense.tick,dt)
if not ok and alive then C.DefenseAssist=false;refresh();defense.status("Defense assist stopped: "..tostring(err):sub(1,100))end
end)
local studio={job=0,running=false,thread=nil,lines={},layoutKey="",drag=nil}
C.EditorOpen=false
function studio.log(message)
if not alive then return end
table.insert(studio.lines,tostring(message):sub(1,1200))
while #studio.lines>40 do table.remove(studio.lines,1)end
studio.output.Text=table.concat(studio.lines,"\n")
gui:SetAttribute("ExecutorOutput",studio.lines[#studio.lines])
end
function studio.layout(viewport)
local key=tostring(viewport)
if studio.layoutKey==key then return end;studio.layoutKey=key
local width=math.max(280,math.min(880,viewport.X-24))
local height=math.max(320,math.min(670,viewport.Y-36))
studio.window.Size=UDim2.fromOffset(width,height)
end
function studio.show(value)
if value then
showMenu(false);C.EditorOpen=true;setFree(true);studio.window.Visible=true
studio.window.Position=UDim2.fromScale(.5,.5)
studio.layout(workspace.CurrentCamera.ViewportSize)
else
C.EditorOpen=false;studio.window.Visible=false;studio.code:ReleaseFocus(false);showMenu(true)
end
gui:SetAttribute("EditorOpen",C.EditorOpen)
end
function studio.run()
if studio.running then studio.log("An editor task is already running. Stop it before running another.");return end
if studio.code.Text:match("^%s*$")then studio.log("Paste your Luau code first.");return end
if type(loadstring)~="function"then studio.log("This executor does not provide loadstring.");return end
local fn,err=loadstring(studio.code.Text,"=Nova Script Studio")
if not fn then studio.log("Compile error: "..tostring(err));return end
studio.job+=1;local job=studio.job;studio.running=true
studio.state.Text="RUNNING";gui:SetAttribute("ExecutorRunning",true)
studio.log("Running script...")
if type(setfenv)=="function"and type(getfenv)=="function"then
local base=getfenv(fn)
local function capture(prefix,...)
local args=table.pack(...);local out={}
for i=1,args.n do out[i]=tostring(args[i])end
if studio.job==job then studio.log(prefix..table.concat(out,"\t"))end
end
local environment=setmetatable({print=function(...)capture("",...)end,warn=function(...)capture("WARN: ",...)end},{__index=base,__newindex=base})
setfenv(fn,environment)
end
studio.thread=task.spawn(function()
local result=table.pack(xpcall(fn,traceError))
if job~=studio.job or not alive then return end
studio.running=false;studio.thread=nil;studio.state.Text=result[1]and "FINISHED"or "ERROR"
gui:SetAttribute("ExecutorRunning",false)
if not result[1]then studio.log("Runtime error: "..tostring(result[2]))
else
local returned={};for i=2,result.n do returned[#returned+1]=tostring(result[i])end
studio.log(#returned>0 and "Returned: "..table.concat(returned,"\t")or "Script finished.")
end
end)
end
function studio.stop()
studio.job+=1
if studio.thread and coroutine.status(studio.thread)~="dead"then pcall(task.cancel,studio.thread)end
studio.thread=nil;studio.running=false;gui:SetAttribute("ExecutorRunning",false)
if alive then studio.state.Text="STOPPED";studio.log("Editor task stopped. Existing script changes or spawned tasks can remain.")end
end
function studio.destroy()
studio.job+=1
if studio.thread and coroutine.status(studio.thread)~="dead"then pcall(task.cancel,studio.thread)end
studio.thread=nil;studio.running=false
end
function studio.file(action)
local ok,err=pcall(function()
if action=="save"then
assert(type(writefile)=="function","File saving is unavailable")
if type(makefolder)=="function"then pcall(makefolder,"NOVA")end
writefile("NOVA/editor.luau",studio.code.Text);studio.log("Saved: NOVA/editor.luau")
else
assert(type(readfile)=="function","File loading is unavailable")
studio.code.Text=readfile("NOVA/editor.luau");studio.log("Loaded: NOVA/editor.luau")
end
end)
if not ok then studio.log("File error: "..tostring(err))end
end
studio.window=make("Frame",{Name="ScriptStudio",AnchorPoint=Vector2.new(.5,.5),Position=UDim2.fromScale(.5,.5),Size=UDim2.fromOffset(860,650),BackgroundColor3=Color3.fromRGB(13,17,25),BorderSizePixel=0,Visible=false,ZIndex=50},gui)
round(studio.window,14);outline(studio.window,.35)
studio.header=make("Frame",{Name="StudioHeader",Size=UDim2.new(1,0,0,48),BackgroundColor3=Color3.fromRGB(22,29,42),BorderSizePixel=0,Active=true},studio.window);round(studio.header,14)
text(studio.header,"NOVA / SCRIPT STUDIO",15,Color3.fromRGB(225,235,250),UDim2.fromOffset(16,0),UDim2.new(1,-65,1,0))
studio.close=button(studio.header,"CloseStudio","×",UDim2.new(1,-44,0,8),UDim2.fromOffset(32,32))
on(studio.close.Activated,function()studio.show(false)end)
text(studio.window,"Paste Luau and run locally in Madium. Ctrl + Enter runs your script.",11,muted,UDim2.fromOffset(16,55),UDim2.new(1,-32,0,28))
studio.editor=make("ScrollingFrame",{Name="CodeScroll",BackgroundColor3=Color3.fromRGB(8,11,17),BorderSizePixel=0,Position=UDim2.fromOffset(16,90),Size=UDim2.new(1,-32,1,-315),AutomaticCanvasSize=Enum.AutomaticSize.XY,CanvasSize=UDim2.new(),ScrollBarThickness=5,ScrollingDirection=Enum.ScrollingDirection.XY},studio.window);round(studio.editor,8)
studio.code=make("TextBox",{Name="ScriptCode",Position=UDim2.fromOffset(10,8),Size=UDim2.new(1,-20,1,-16),AutomaticSize=Enum.AutomaticSize.XY,BackgroundTransparency=1,
Text='print("Hello from Nova")\nreturn "Ready"',PlaceholderText="Paste your script here...",ClearTextOnFocus=false,MultiLine=true,TextEditable=true,RichText=false,TextWrapped=false,
Font=Enum.Font.Code,TextSize=14,TextColor3=Color3.fromRGB(207,222,246),TextXAlignment=Enum.TextXAlignment.Left,TextYAlignment=Enum.TextYAlignment.Top},studio.editor)
studio.toolbar=make("ScrollingFrame",{Name="StudioToolbar",Position=UDim2.new(0,16,1,-214),Size=UDim2.new(1,-32,0,44),AutomaticCanvasSize=Enum.AutomaticSize.X,CanvasSize=UDim2.new(),BackgroundTransparency=1,BorderSizePixel=0,ScrollBarThickness=2,ScrollingDirection=Enum.ScrollingDirection.X},studio.window)
make("UIListLayout",{FillDirection=Enum.FillDirection.Horizontal,Padding=UDim.new(0,7),SortOrder=Enum.SortOrder.LayoutOrder},studio.toolbar)
studio.actions={{"RunScript","RUN",studio.run},{"StopScript","STOP TASK",studio.stop},{"ClearScript","CLEAR",function()studio.code.Text=""end},{"CopyScript","COPY",function()
local copy=setclipboard or toclipboard
if type(copy)=="function"then copy(studio.code.Text);studio.log("Code copied.")else studio.log("Clipboard API unavailable.")end
end},{"SaveScript","SAVE",function()studio.file("save")end},{"LoadScript","LOAD",function()studio.file("load")end},{"ClearOutput","CLEAR LOG",function()table.clear(studio.lines);studio.output.Text=""end}}
for index,entry in ipairs(studio.actions)do
local control=button(studio.toolbar,entry[1],entry[2],UDim2.new(),UDim2.fromOffset(entry[2]=="STOP TASK"and 108 or 96,36));control.LayoutOrder=index
on(control.Activated,function()local ok,err=pcall(entry[3]);if not ok then studio.log(tostring(err))end end)
end
studio.state=text(studio.window,"READY",10,muted,UDim2.new(0,16,1,-166),UDim2.new(1,-32,0,20));studio.state.Name="ExecutorState"
studio.outputScroll=make("ScrollingFrame",{Name="OutputScroll",Position=UDim2.new(0,16,1,-140),Size=UDim2.new(1,-32,0,122),BackgroundColor3=Color3.fromRGB(8,11,17),BorderSizePixel=0,AutomaticCanvasSize=Enum.AutomaticSize.Y,CanvasSize=UDim2.new(),ScrollBarThickness=4,ScrollingDirection=Enum.ScrollingDirection.Y},studio.window);round(studio.outputScroll,8)
studio.output=text(studio.outputScroll,"Output and errors appear here.",12,Color3.fromRGB(171,198,228),UDim2.fromOffset(10,8),UDim2.new(1,-24,0,100))
studio.output.Font=Enum.Font.Code;studio.output.TextWrapped=true;studio.output.TextYAlignment=Enum.TextYAlignment.Top;studio.output.AutomaticSize=Enum.AutomaticSize.Y
studio.quick=button(gui,"OpenScriptStudioQuick","SCRIPT STUDIO",UDim2.new(1,-16,.5,178),UDim2.fromOffset(174,44));studio.quick.AnchorPoint=Vector2.new(1,0);studio.quick.ZIndex=25
on(studio.quick.Activated,function()studio.show(not C.EditorOpen)end)
on(studio.header.InputBegan,function(input)
if input.UserInputType==Enum.UserInputType.MouseButton1 or input.UserInputType==Enum.UserInputType.Touch then studio.drag={input=input,origin=input.Position,position=studio.window.Position}end
end)
on(UIS.InputChanged,function(input)
if studio.drag and (input.UserInputType==Enum.UserInputType.MouseMovement or input==studio.drag.input)then
local delta=input.Position-studio.drag.origin
local viewport=workspace.CurrentCamera.ViewportSize;local size=studio.window.AbsoluteSize
local origin=studio.drag.position
local x=origin.X.Scale*viewport.X+origin.X.Offset+delta.X
local y=origin.Y.Scale*viewport.Y+origin.Y.Offset+delta.Y
studio.window.Position=UDim2.fromOffset(math.clamp(x,size.X/2,math.max(size.X/2,viewport.X-size.X/2)),math.clamp(y,size.Y/2,math.max(size.Y/2,viewport.Y-size.Y/2)))
end
end)
on(UIS.InputEnded,function(input)if studio.drag and (input==studio.drag.input or input.UserInputType==Enum.UserInputType.MouseButton1)then studio.drag=nil end end)
on(UIS.InputBegan,function(input)
if C.EditorOpen and input.KeyCode==Enum.KeyCode.Return and (UIS:IsKeyDown(Enum.KeyCode.LeftControl)or UIS:IsKeyDown(Enum.KeyCode.RightControl))then studio.code:ReleaseFocus(false);studio.run()end
end)
studio.layout(workspace.CurrentCamera.ViewportSize)
-- Useful session tools.
studio.toolCount=0
function studio.tool(name,label,callback)
studio.toolCount+=1
local control=button(pages.Tools,name,label,UDim2.new(),UDim2.new(1,0,0,44))
on(control.Activated,function()
local ok,result=pcall(callback)
studio.toolStatus.Detail.Text=ok and (result or "Done.")or "Failed: "..tostring(result):sub(1,160)
end)
end
function studio.copy(textValue)
local copy=setclipboard or toclipboard;assert(type(copy)=="function","Clipboard API unavailable")
copy(textValue);return "Copied to clipboard."
end
heading(pages.Tools,"Session tools","Script editor, local profiles, camera recovery, weapon switching, and quick diagnostics.")
studio.tool("OpenScriptStudio","OPEN SCRIPT STUDIO",function()studio.show(true);return "Script Studio opened."end)
studio.tool("SaveNovaProfile","SAVE GAME SETTINGS",function()
assert(type(writefile)=="function","File saving unavailable")
if type(makefolder)=="function"then pcall(makefolder,"NOVA")end
writefile("NOVA/settings-"..game.PlaceId..".json",Http:JSONEncode({place=game.PlaceId,settings=C}));return "Settings saved for this game."
end)
studio.tool("LoadNovaProfile","LOAD GAME SETTINGS",function()
local data=Http:JSONDecode(readfile("NOVA/settings-"..game.PlaceId..".json"))
assert(data.place==game.PlaceId and type(data.settings)=="table","Invalid profile for this game")
for key,value in pairs(data.settings)do
if typeof(value)==typeof(C[key])and (type(value)~="number"or value==value and math.abs(value)<=1000000)then C[key]=value end
end
for _,key in ipairs({"Bot","AutoShoot","TriggerBot","AutoClicker","Healing","DefenseAssist","EditorOpen"})do C[key]=false end
refresh();return "Settings loaded. Automatic actions are paused; enable them when ready."
end)
studio.tool("CopyCoordinates","COPY COORDINATES",function()local _,_,r=extras.characterParts();assert(r,"No character");return studio.copy(string.format("%.2f, %.2f, %.2f",r.Position.X,r.Position.Y,r.Position.Z))end)
studio.tool("CopyGameDetails","COPY GAME DETAILS",function()return studio.copy("Place: "..game.PlaceId.."\nServer: "..game.JobId.."\nPlayers: "..#Players:GetPlayers())end)
studio.tool("CycleWeapon","NEXT COMPATIBLE GUN",function()
local ch,h=extras.characterParts();assert(h,"No living character")
local reg=autofire.registryForGame();assert(reg,"No compatible gun adapter")
local list={};for tool,gun in pairs(reg.Tools)do if typeof(tool)=="Instance"and (tool.Parent==LP.Backpack or tool.Parent==ch)and type(gun)=="table"and type(gun.DoFire)=="function"then table.insert(list,tool)end end
table.sort(list,function(a,b)return a.Name<b.Name end);assert(#list>0,"No compatible guns owned")
local index=table.find(list,ch:FindFirstChildOfClass("Tool"))or 0;local tool=list[index%#list+1];h:EquipTool(tool);return "Equipped "..tool.Name
end)
studio.tool("UnequipTools","UNEQUIP TOOL",function()local _,h=extras.characterParts();assert(h,"No living character");h:UnequipTools();return "Tool unequipped."end)
studio.tool("RepairCamera","RESTORE CAMERA FOLLOW",function()
local _,h=extras.characterParts();assert(h,"No living character")
C.CameraOverride=false;C.CameraOffsetOverride=false;C.ZoomOverride=false;C.ViewMode="Game default"
workspace.CurrentCamera.CameraType=Enum.CameraType.Custom;workspace.CurrentCamera.CameraSubject=h;refresh();return "Camera follow restored."
end)
studio.tool("LowClutterPreset","LOW CLUTTER VIEW",function()C.Circle=false;C.Opacity=100;C.Distance=false;C.Health=false;C.Names=true;C.NoBlur=true;C.NoDOF=true;C.Motion=false;refresh();return "Low clutter view applied."end)
studio.tool("NightVisionPreset","BRIGHT CLEAR VIEW",function()C.FullBright=true;C.NoFog=true;C.NoShadows=true;refresh();return "Local bright, clear view applied."end)
studio.tool("ShowPerformance","SHOW PERFORMANCE HUD",function()C.ShowFPS=true;C.FPSDetails=true;C.FPSGraph=true;refresh();return "Performance HUD enabled."end)
studio.tool("WeaponDiagnostics","CHECK CURRENT WEAPON",function()utility.inspect();return gui:GetAttribute("AmmoStatus")end)
studio.tool("StopCombatTools","STOP COMBAT FEATURES",function()
for _,key in ipairs({"Bot","Aim","AutoShoot","TriggerBot","AutoClicker","InfiniteAmmo","NoCooldown","NoRecoil","NoSpread","NoAimKick","Hitboxes","WallShots"})do C[key]=false end
bot.stop("Stopped from session tools");autofire.reset("Stopped");refresh();return "Combat features stopped."
end)
studio.toolStatus=row(pages.Tools,"ToolsStatus","Tools status","Ready. Script Studio also has a shortcut on the right.",120)
studio.toolStatus.RowTitle.Size=UDim2.new(1,-32,0,22);studio.toolStatus.Detail.Size=UDim2.new(1,-32,1,-48)
gui:SetAttribute("SessionToolCount",studio.toolCount)
C.BotObstacleJump=true;C.BotShortcut=true;C.BotJumpLookAhead=6;C.BotMaxObstacle=4
function bot.checkObstacle(hum,root,direction)
local now=os.clock()
if not C.BotObstacleJump or bot.jumpPlan or hum.FloorMaterial==Enum.Material.Air or now<(bot.nextObstacleJump or 0)or now<(bot.nextObstacleScan or 0)then return false end
bot.nextObstacleScan=now+.15
direction=Vector3.new(direction.X,0,direction.Z)
if direction.Magnitude<.01 then return false end;direction=direction.Unit
local params=RaycastParams.new();params.FilterType=Enum.RaycastFilterType.Exclude
params.FilterDescendantsInstances={LP.Character,world,bot.target and bot.target.Character}
if typeof(root)=="Instance"and root.Parent then local exclude=params.FilterDescendantsInstances;table.insert(exclude,root.Parent);params.FilterDescendantsInstances=exclude end
pcall(function()params.RespectCanCollide=true end)
local floor=workspace:Raycast(root.Position,Vector3.new(0,-12,0),params)
if not floor then return false end
local gravity=math.max(1,workspace.Gravity)
local jumpHeight=hum.UseJumpPower and hum.JumpPower*hum.JumpPower/(2*gravity)or hum.JumpHeight
local velocity=math.sqrt(2*gravity*jumpHeight)
local speed=math.max(1,hum.WalkSpeed)
local reach=speed*(2*velocity/gravity)*.82
local scan=math.min(C.BotJumpLookAhead,math.max(2,reach-2))
local hit
for _,height in ipairs({.7,1.6,2.5})do
local origin=Vector3.new(root.Position.X,floor.Position.Y+height,root.Position.Z)
local candidate=workspace:Raycast(origin,direction*scan,params)
if candidate and (not hit or candidate.Distance<hit.Distance)then hit=candidate end
end
if not hit then return false end
bot.failedBarriers=bot.failedBarriers or setmetatable({},{__mode="k"})
if now<(bot.failedBarriers[hit.Instance]or 0)then gui:SetAttribute("BotObstacleStatus","Recent failed jump: using a route around this barrier");return false end
local maximum=math.min(C.BotMaxObstacle,jumpHeight*.75)
local probe=hit.Position+direction*.4
local top=workspace:Raycast(Vector3.new(probe.X,floor.Position.Y+maximum+1,probe.Z),Vector3.new(0,-maximum-2,0),params)
if not top or top.Instance~=hit.Instance or top.Position.Y-floor.Position.Y>maximum then gui:SetAttribute("BotObstacleStatus","Barrier exceeds jump clearance: routing around it");return false end
local barrierHeight=top.Position.Y-floor.Position.Y
if barrierHeight<.9 then return false end
local landing
local side=Vector3.new(-direction.Z,0,direction.X)
for extra=3,math.max(3,reach-hit.Distance),.5 do
local point=hit.Position+direction*extra
local ground=workspace:Raycast(Vector3.new(point.X,floor.Position.Y+maximum+1,point.Z),Vector3.new(0,-maximum-8,0),params)
if ground and ground.Instance~=hit.Instance and ground.Position.Y-floor.Position.Y<=maximum and ground.Position.Y-floor.Position.Y>=-4 then
local clear=true
for _,offset in ipairs({Vector3.zero,side,-side,direction,-direction})do
local supported=workspace:Raycast(ground.Position+offset+Vector3.new(0,1.2,0),Vector3.new(0,-2.4,0),params)
if not supported or math.abs(supported.Position.Y-ground.Position.Y)>.8 or workspace:Raycast(ground.Position+offset+Vector3.new(0,.2,0),Vector3.new(0,4.8,0),params)then clear=false;break end
end
if clear then landing=ground.Position;break end
end
end
if not landing then gui:SetAttribute("BotObstacleStatus","No supported landing within jump range: routing around");return false end
local rootOffset=root.Position.Y-floor.Position.Y
local deltaY=landing.Y+rootOffset-root.Position.Y
local discriminant=velocity*velocity-2*gravity*deltaY
if discriminant<=0 then return false end
local flight=(velocity+math.sqrt(discriminant))/gravity
local horizontal=Vector3.new(landing.X-root.Position.X,0,landing.Z-root.Position.Z)
local distance=horizontal.Magnitude
if distance>speed*flight*.9 then gui:SetAttribute("BotObstacleStatus","Landing beyond current jump range");return false end
local travel=horizontal.Unit
local offsets={Vector3.new(0,-math.max(.5,rootOffset-.35),0),Vector3.zero,Vector3.new(0,1.8,0),side*.75,-side*.75}
local previous=root.Position
for index=1,12 do
local t=flight*index/12
local point=root.Position+travel*math.min(distance,speed*t)+Vector3.new(0,velocity*t-.5*gravity*t*t,0)
for _,offset in ipairs(offsets)do
local blocked=workspace:Raycast(previous+offset,point-previous,params)
if blocked then gui:SetAttribute("BotJumpBlockedBy",blocked.Instance:GetFullName());gui:SetAttribute("BotObstacleStatus","Jump arc intersects cover or ceiling: routing around");return false end
end
previous=point
end
if not bot.requestJump(hum,"Planned barrier jump")then return false end
bot.jumpPlan={goal=Vector3.new(landing.X,landing.Y+rootOffset,landing.Z),started=now,flight=flight,obstacle=hit.Instance,wasAir=false,start=root.Position}
bot.goal=bot.jumpPlan.goal;bot.smoothed=travel;hum:Move(travel,false)
bot.nextObstacleJump=now+flight+.3
gui:SetAttribute("BotObstacleStatus",string.format("Committed jump: %.1f high / %.1f forward",barrierHeight,distance))
return true,bot.jumpPlan.goal
end
function bot.updateJump(hum,root)
local plan=bot.jumpPlan;if not plan then return end
local now=os.clock()
if hum.FloorMaterial==Enum.Material.Air or root.Position.Y-plan.start.Y>.5 then plan.wasAir=true end
local landed=plan.wasAir and hum.FloorMaterial~=Enum.Material.Air and root.AssemblyLinearVelocity.Y<2 and now-plan.started>.18
if landed or now-plan.started>plan.flight+1 then
local gap=Vector3.new(root.Position.X-plan.goal.X,0,root.Position.Z-plan.goal.Z).Magnitude
if not landed or gap>2 or math.abs(root.Position.Y-plan.goal.Y)>1.2 then
bot.failedBarriers[plan.obstacle]=now+8;bot.waypoints=nil;bot.pathAt=0
gui:SetAttribute("BotObstacleStatus","Jump did not reach landing: avoiding this barrier for 8 seconds")
else gui:SetAttribute("BotObstacleStatus","Jump landed successfully")end
bot.jumpPlan=nil;bot.shortcutUntil=0
else bot.goal=plan.goal end
end
heading(pages.Bot,"Obstacle navigation","Plan jumps using the character's jump height, a supported landing, and body clearance along the full jump arc.")
toggle(pages.Bot,"BotObstacleJump","Obstacle jump","Jump checked low barriers. Movement stays committed to the landing while airborne.")
toggle(pages.Bot,"BotShortcut","Jump shortcuts","Try a short checked jump before taking a longer path around an obstacle.")
slider(pages.Bot,"BotJumpLookAhead","Obstacle detection distance","Scan ahead; actual movement speed and jump range limit the planner.",3,8,.5)
slider(pages.Bot,"BotMaxObstacle","Maximum barrier height","Actual jump height and ceiling clearance may impose a lower limit.",1,6,.5)
bot.obstacleRow=row(pages.Bot,"ObstacleNavigation","Obstacle status","Ready. Failed barriers are temporarily avoided rather than repeatedly jumped into.",130)
bot.obstacleRow.RowTitle.Size=UDim2.new(1,-32,0,22);bot.obstacleRow.Detail.Size=UDim2.new(1,-32,1,-48)
C.BotFollowCamera=true;C.BotCameraSpeed=8;C.BotJumpAssist=true
function bot.requestJump(hum,reason)
local now=os.clock()
if hum.FloorMaterial==Enum.Material.Air or now<(bot.nextNativeJump or 0)then return false end
local ok,enabled=pcall(hum.GetStateEnabled,hum,Enum.HumanoidStateType.Jumping)
if not ok or not enabled then gui:SetAttribute("BotObstacleStatus","The game currently disables jumping; computing a route around it.");return false end
bot.nextNativeJump=now+.65;bot.jumpUntil=now+.25
hum.Jump=true
if C.BotJumpAssist then pcall(hum.ChangeState,hum,Enum.HumanoidStateType.Jumping)end
gui:SetAttribute("BotJumpReason",reason or "Navigation")
return true
end
function bot.routeCamera(cam,root,dt,fallback)
if not C.BotFollowCamera then return end
local direction=bot.smoothed
if direction.Magnitude<.1 and bot.goal then direction=bot.goal-root.Position end
if direction.Magnitude<.1 and fallback then direction=fallback-root.Position end
direction=Vector3.new(direction.X,0,direction.Z)
if direction.Magnitude<.1 then return end
local desired=CFrame.lookAt(cam.CFrame.Position,cam.CFrame.Position+direction.Unit*30)
cam.CFrame=cam.CFrame:Lerp(desired,1-math.exp(-C.BotCameraSpeed*math.min(dt,.1)))
gui:SetAttribute("BotCameraStatus","Following travel direction")
end
heading(pages.Bot,"Camera and jump control","The camera follows travel direction and switches to visible targets during a fight.")
toggle(pages.Bot,"BotFollowCamera","Follow bot view","Turn your screen smoothly toward the route while the bot walks.")
slider(pages.Bot,"BotCameraSpeed","Route camera turn speed","Smooth camera response while navigating.",3,20,1)
toggle(pages.Bot,"BotJumpAssist","Jump input assist","Use the native jump state and briefly hold the jump request to avoid canceled inputs.")
C.BotADS=true
function bot.setADS(gun,enabled)
enabled=enabled and C.BotADS
if not enabled or gun~=bot.adsGun then
if bot.adsGun and bot.adsOriginal then
if bot.adsGun.DoAim==bot.adsWrapper then pcall(function()bot.adsGun.DoAim=bot.adsOriginal end)end
pcall(bot.adsOriginal,bot.adsGun,false)
end
bot.adsGun=nil;bot.adsActive=false;bot.adsOriginal=nil;bot.adsWrapper=nil
end
if not enabled or not C.BotADS then gui:SetAttribute("BotADSStatus","Hip fire / traveling");return end
if type(gun)~="table"or type(gun.DoAim)~="function"then gui:SetAttribute("BotADSStatus","Weapon does not expose native aim-down-sights");return end
local hum=LP.Character and LP.Character:FindFirstChildOfClass("Humanoid")
if not bot.adsWrapper then
local original=gun.DoAim
local wrapper=function(self,requested,...)
local character=LP.Character
local h=character and character:FindFirstChildOfClass("Humanoid")
local held=alive and C.Bot and C.BotADS and bot.adsActive and bot.adsGun==self and extras.active()and not C.Healing and not C.EditorOpen and h and not h:GetAttribute("Reloading")
return original(self,held and true or requested,...)
end
local ok=pcall(function()gun.DoAim=wrapper end)
if not ok then gui:SetAttribute("BotADSStatus","Weapon aim controller is read-only");return end
bot.adsOriginal=original;bot.adsWrapper=wrapper;bot.adsGun=gun;bot.adsActive=true
end
if gun==bot.adsGun and hum and hum:GetAttribute("Aiming")then return end
if os.clock()<(bot.adsRetry or 0)then return end;bot.adsRetry=os.clock()+.3
local ok,err=pcall(gun.DoAim,gun,true)
if ok then bot.adsGun=gun;bot.adsActive=true;gui:SetAttribute("BotADSStatus","Native aim-down-sights requested")
else gui:SetAttribute("BotADSStatus","Native aim unavailable: "..tostring(err):sub(1,90))end
end
toggle(pages.Bot,"BotADS","Aim down sights","Use the gun's native aim/scope action on visible targets. Release it during travel, reload, pause, or stop.")
bot.adsRow=row(pages.Bot,"BotADSStatus","Aim-down-sights status","Ready. Requires a compatible gun with a native DoAim action.",110)
bot.adsRow.RowTitle.Size=UDim2.new(1,-32,0,22);bot.adsRow.Detail.Size=UDim2.new(1,-32,1,-48)
-- TTK uses a controller-owned weapon model, not a Backpack Tool.
do
local ttk={name="TTK Testing",registry={Tools={}},controller=nil,weapon=nil,tool=nil,gun=nil}
function ttk.connect()
if (game.PlaceId~=120189115846709 and game.GameId~=10090256806) then return nil end
if ttk.controller then return ttk.controller end
local rs=game:GetService("ReplicatedStorage")
local modules=rs:FindFirstChild("Modules")
local client=modules and modules:FindFirstChild("Client")
local controllers=client and client:FindFirstChild("Controllers")
local module=controllers and controllers:FindFirstChild("GunController")
if not module or not module:IsA("ModuleScript") then return nil end
local ok,value=pcall(require,module)
if ok and type(value)=="table" and type(value.FireWeapon)=="function" and type(value.Reload)=="function" and type(value.StartAiming)=="function" and type(value.StopAiming)=="function" then ttk.controller=value;return value end
end
function ttk.current()
local c=ttk.connect()
local w=c and c.Weapon
if type(w)~="table" or not c.Enabled or not w.IsEquipped or c._isGenericItem then
ttk.weapon=nil;ttk.tool=nil;ttk.gun=nil;table.clear(ttk.registry.Tools)
gui:SetAttribute("AdapterWeapon",nil)
return nil
end
if ttk.weapon~=w then
ttk.weapon=w
local tool={Name=w.Name or "TTK weapon",Enabled=true,Parent=LP.Character}
function tool:GetAttribute(key)
if key=="Ammo" then return w.MagAmmo end
if key=="Mags" then return type(w.GetReserve)=="function" and w:GetReserve() or 0 end
end
local gun={Settings={Modes={w.FireMode=="auto" and "Automatic" or "Semi"}}}
function gun:DoFire()
if not alive or c.Weapon~=w or not c.Enabled or w.IsReloading then return false end
if type(c.ShouldBlockWeaponInput)=="function" and c:ShouldBlockWeaponInput() then return false end
local fired=c:FireWeapon()
-- A discrete native shot, including semi-auto trigger release.
if fired and not UIS:IsMouseButtonPressed(Enum.UserInputType.MouseButton1) and type(w.ReleaseTrigger)=="function" then w:ReleaseTrigger() end
return fired
end
function gun:DoReload()
if alive and c.Weapon==w and c.Enabled and not w.IsReloading then return c:Reload() end
end
function gun:DoAim(enabled)
if c.Weapon~=w then return end
if enabled and alive and c.Enabled and not w.IsReloading then c:StartAiming() else c:StopAiming() end
end
ttk.tool=tool;ttk.gun=gun;table.clear(ttk.registry.Tools);ttk.registry.Tools[tool]=gun
end
ttk.tool.Parent=LP.Character
ttk.tool.Enabled=c.Enabled and not w.IsReloading
gui:SetAttribute("WeaponAdapter",ttk.name)
gui:SetAttribute("AdapterWeapon",ttk.tool.Name)
return ttk.tool,ttk.gun
end
if (game.PlaceId==120189115846709 or game.GameId==10090256806) then
gui:SetAttribute("WeaponAdapter",ttk.name)
gui:SetAttribute("AdapterSupport","Native firing, aiming, reload, bot weapon selection. Ammo, wall shots, recoil overrides, healing and defense are unavailable.")
autofire.registryForGame=function()ttk.current();return ttk.registry end
autofire.currentTool=function()return ttk.current()end
utility.current=function()return ttk.current()end
utility.watch=function()end -- No Tool attribute signals exist in this game.
utility.capacity=function(tool)
local current,gun=ttk.current()
if current and current==tool then return tonumber(ttk.weapon.MaxMagSize),gun end
end
utility.refill=function()utility.status("TTK Testing: infinite ammo is unsupported; native ammo rules remain active.")end
utility.inspect=function()
local tool=ttk.current()
gui:SetAttribute("AmmoServerVerified",false)
if not tool then gui:SetAttribute("AmmoWeapon",nil);gui:SetAttribute("AmmoCapacity",0);utility.status("TTK Testing: equip a firearm to use native fire, aim and reload.");return end
local capacity=tonumber(ttk.weapon.MaxMagSize) or 0
gui:SetAttribute("AmmoWeapon",tool.Name);gui:SetAttribute("AmmoCapacity",capacity)
utility.status(C.InfiniteAmmo and "TTK Testing: infinite ammo is unsupported; native ammo rules remain active." or (tool.Name.." | "..tostring(tool:GetAttribute("Ammo")).."/"..capacity.." | reserve "..tostring(tool:GetAttribute("Mags"))..". Native firing / aiming / reload supported."))
end
bot.weapon=function()
local tool,gun=ttk.current()
if tool then return tool,gun end
returnNOVA: this script is good in some games, has features like no cooldown on weapons shoot threw walls, bot play, and many other features.

Universal