
Key Required VerifiedUniversal

-- Patch 309: Relax false-positive cooldown UI detection and allow Drag V2 to reach check 7.
-- Patch 305: Slasher/Sixer Drag V2 uses a 1.75x normal ABH hitbox on check 7.
-- Patch 303: reliable hitbox visualization folder and nil-safe ShowHitboxes setting.
-- Patch 191 base: Restore loading from Patch 189.
-- Forsaken Plus Made by Naiko Scripts --
-- Copies of this script must contain the original credits and be open source --
if workspace.DistributedGameTime < 4 then
task.wait(4 - workspace.DistributedGameTime)
end
local ExistingPlusMarker = game.CoreGui:FindFirstChild("Plus")
local ExistingPlusScreen
pcall(function()
local ExistingPlayer = game:GetService("Players").LocalPlayer
local ExistingPlayerGui = ExistingPlayer and ExistingPlayer:FindFirstChildOfClass("PlayerGui")
local ExistingMainUI = ExistingPlayerGui and ExistingPlayerGui:FindFirstChild("MainUI")
ExistingPlusScreen = ExistingMainUI and ExistingMainUI:FindFirstChild("PlusScreen")
end)
-- A failed startup can leave the old CoreGui marker behind. Only treat the
-- script as running when its actual PlusScreen was created; otherwise remove
-- the stale marker so the repaired script can start on the next attempt.
if ExistingPlusMarker and ExistingPlusScreen then
return warn("Script already running")
elseif ExistingPlusMarker then
ExistingPlusMarker:Destroy()
end
if game.GameId == 6331902150 or game.GameId == 7464167604 or workspace:GetAttribute("ServerType") then
Instance.new("BoolValue", game.CoreGui).Name = "Plus"
else
return warn("Incorrect game")
end
game:GetService("Players").LocalPlayer.Idled:Connect(function()
game:GetService("VirtualUser"):ClickButton2(Vector2.new())
end)
-- General Variables --
Version = "1.8"
Players = game:GetService("Players")
LocalPlayer = Players.LocalPlayer
LocalCharacter = LocalPlayer.Character
LocalHumanoid = LocalCharacter and (LocalCharacter:FindFirstChildOfClass("Humanoid") or LocalCharacter:WaitForChild("Humanoid",2)) or nil
LocalHead = LocalCharacter and (LocalCharacter:FindFirstChild("Head") or LocalCharacter:WaitForChild("Head",2)) or nil
LocalRoot = LocalCharacter and ((LocalHumanoid and LocalHumanoid.RootPart) or LocalCharacter:FindFirstChild("HumanoidRootPart") or LocalCharacter:WaitForChild("HumanoidRootPart",2)) or nil
LocalAnimator = LocalHumanoid and (LocalHumanoid:FindFirstChildOfClass("Animator") or LocalHumanoid:WaitForChild("Animator",2)) or nil
SpeedMultipliers = LocalCharacter and (LocalCharacter:FindFirstChild("SpeedMultipliers")) or nil
ResistanceMultipliers = LocalCharacter and (LocalCharacter:FindFirstChild("ResistanceMultipliers")) or nil
FOVMultipliers = LocalCharacter and (LocalCharacter:FindFirstChild("FOVMultipliers")) or nil
CoreGui = game:GetService("CoreGui")
PlayerGui = LocalPlayer:FindFirstChildOfClass("PlayerGui") or LocalPlayer:WaitForChild("PlayerGui", 20)
MainUI = PlayerGui:FindFirstChild("MainUI") or PlayerGui:WaitForChild("MainUI", 80)
PlayerData = LocalPlayer:FindFirstChild("PlayerData") or LocalPlayer:WaitForChild("PlayerData", 20)
PlusFolderSettings = Instance.new("Folder")
SideBar = MainUI:FindFirstChild("Sidebar") or MainUI:WaitForChild("Sidebar", 20)
Buttons = SideBar:FindFirstChild("Buttons") or SideBar:FindFirstChild("Middle") or SideBar:WaitForChild("Buttons", 20) or SideBar:WaitForChild("Middle", 20)
MainButton = Buttons:FindFirstChild("Settings") or Buttons:FindFirstChild("Stats") or Buttons:WaitForChild("Settings", 20) or Buttons:FindFirstChild("Stats") or Buttons:WaitForChild("Stats", 20)
SidePlusButton = MainButton and MainButton:Clone()
PlusButton = SidePlusButton and SidePlusButton:FindFirstChild("Button") or nil
PulloutFramePlus = SidePlusButton and SidePlusButton:FindFirstChild("PulloutHolder") and SidePlusButton.PulloutHolder:FindFirstChild("PulloutFrame")
NewUIVersion = not PulloutFramePlus
SettingsMenu = MainUI:FindFirstChild("SettingsScreen") or MainUI:WaitForChild("SettingsScreen", 20)
TempUI = PlayerGui:FindFirstChild("TemporaryUI") or PlayerGui:WaitForChild("TemporaryUI",5)
PlusMenu = SettingsMenu and SettingsMenu:Clone()
PlayersFolder = workspace:FindFirstChild("Players")
KillersFolder = PlayersFolder and PlayersFolder:FindFirstChild("Killers")
SurvivorsFolder = PlayersFolder and PlayersFolder:FindFirstChild("Survivors")
RagdollsFolder = workspace:FindFirstChild("Ragdolls")
Hitboxes = workspace:FindFirstChild("Hitboxes")
-- Patch 303: refresh/recreate the visualization folder if the game replaces it.
local function GetHitboxesFolder()
local CurrentFolder = workspace:FindFirstChild("Hitboxes")
if not CurrentFolder then
CurrentFolder = Instance.new("Folder")
CurrentFolder.Name = "Hitboxes"
CurrentFolder.Parent = workspace
end
Hitboxes = CurrentFolder
return CurrentFolder
end
local function AreHitboxesShown()
-- The settings object may load after the detector starts; don't error if it's missing.
local Settings = PlayerData and PlayerData:FindFirstChild("Settings")
local Setting = Settings and Settings:FindFirstChild("ShowHitboxes", true)
if Setting and Setting:IsA("BoolValue") then
ShowHitboxesSetting = Setting
return Setting.Value
end
return ShowHitboxesSetting ~= nil and ShowHitboxesSetting.Value == true
end
MarketplaceService = game:GetService("MarketplaceService")
ReplicatedStorage = game:GetService("ReplicatedStorage")
UserInputService = game:GetService("UserInputService")
TextChatService = game:GetService("TextChatService")
PhysicsService = game:GetService("PhysicsService")
TweenService = game:GetService("TweenService")
GroupService = game:GetService("GroupService")
HttpService = game:GetService("HttpService")
LogService = game:GetService("LogService")
RunService = game:GetService("RunService")
StarterGui = game:GetService("StarterGui")
Lighting = game:GetService("Lighting")
Debris = game:GetService("Debris")
AssetsFolder = ReplicatedStorage:FindFirstChild("Assets") or ReplicatedStorage:WaitForChild("Assets",3)
SkinsAssets = AssetsFolder and AssetsFolder:FindFirstChild("Skins")
SurvivorAssets = AssetsFolder and AssetsFolder:FindFirstChild("Survivors")
KillerAssets = AssetsFolder and AssetsFolder:FindFirstChild("Killers")
FlowGame = ReplicatedStorage:FindFirstChild("FlowGame",true)
Network = ReplicatedStorage:FindFirstChild("Modules") and (ReplicatedStorage:FindFirstChild("Modules"):FindFirstChild("Network",true) and ReplicatedStorage:FindFirstChild("Modules"):FindFirstChild("Network",true):FindFirstChild("Network")) or ReplicatedStorage:FindFirstChild("Modules"):FindFirstChild("Network",true) or nil
InGame = workspace:FindFirstChild("Map") and workspace:FindFirstChild("Map"):FindFirstChild("Ingame")
GameMap = InGame and InGame:FindFirstChild("Map") or nil
RoundEvent = Instance.new("BindableEvent")
local BindableShouldStop = Instance.new("BindableEvent")
local UIScale = Instance.new("UIScale")
IsUnderground,IsFixingGenerator,WarnedAboutFilesCompatability = false,false,false
local AutoDoAllInvincibleToken = 0
local IsAutoDoAllGeneratorsRunning = false
local AutoDoAllPuzzleWasEnabled = nil
OverriddenAnimations,AllAnimations,Values = {},{["Default Roblox"] = {["Idle"] = "http://www.roblox.com/asset/?id=180435571",["Walk"] = "http://www.roblox.com/asset/?id=180426354",["Run"] = "http://www.roblox.com/asset/?id=180426354"}},{}
local ModulesOptions,LastTrack,NoliConfig,GetAnimationType,LastAnimOriginalUsed,UpdateAnim,CanPlayOverrideAnim,CurrentQTEAzure,TeleportSound,GetFunction
ColorPresets = {["White"] = Color3.fromRGB(255,255,255),["Teal"] = Color3.fromRGB(3,252,157),["Green"] = Color3.fromRGB(0,255,0),["Purple"] = Color3.fromRGB(158, 0, 179),["Red"] = Color3.fromRGB(255,0,0),["Blue"] = Color3.fromRGB(0,0,255),["Cyan"] = Color3.fromRGB(0,255,255),["Gold"] = Color3.fromRGB(255,215,0),["Orange"] = Color3.fromRGB(255,165,0)}
IgnoreKeybinds = {"W", "A", "S", "D"}
GameVersionForScript = "2026-10-06"
-- Patch 198: Drag Block Helpless/cooldown handling.
-- Patch 199: Added WallCheck gate for Auto Block and Drag Block.
-- Patch 302: Allow both Drag Block and Drag V2 follow calls immediately after their own successful Block trigger, while preserving cooldown checks for ordinary calls.
-- Patch 307: Enforce Block cooldown before firing and retain the follow throttle.
-- Physically walks toward the killer while Auto Block is active.
-- Helpless pauses an existing follow instead of resetting/cancelling it.
-- New Drag Block triggers are rejected during Helpless; cooldown time still advances.
-- All survivor movement inputs are blocked until the routine finishes.
local DragBlockBusy = false
local DragBlockToken = 0
local DragBlockLastFollowAt = -math.huge
-- Drag Block now follows the game's actual Block cooldown instead of a hardcoded timer.
-- The value is refreshed from the Block ability UI whenever the block is used.
local FOLLOW_KILLER_COOLDOWN = 0
local LastKnownBlockCooldown = 0
local CancelDragBlockFollow = nil
-- Exact Helpless detection from ReplicatedStorage.Modules.Schematics.StatusEffects.Helpless.
-- The game's Applied handler sets Character.AbilitiesDisabled = true.
local function IsHelplessActive()
if not LocalCharacter or not LocalCharacter.Parent then
return false
end
return LocalCharacter:GetAttribute("AbilitiesDisabled") == true
end
-- Patch 199: WallCheck prevents Auto Block and Drag Block from triggering
-- when a solid obstacle is between the survivor and the attacking killer.
-- It uses the same local/client-side raycast idea as the standalone tracer.
local function IsWallCheckBlocked(Killer)
if not GetValue("WallCheck", true) then
return false
end
local Character = LocalCharacter
local Root = LocalRoot or (Character and Character:FindFirstChild("HumanoidRootPart"))
if not Character or not Character.Parent or not Root or not Root.Parent
or not Killer or not Killer.Parent then
return false
end
local KillerRoot = Killer:FindFirstChild("HumanoidRootPart")
or Killer:FindFirstChild("LowerTorso")
or Killer:FindFirstChild("Torso")
if not KillerRoot then
return false
end
local Origin = Root.Position
local Destination = KillerRoot.Position
local Direction = Destination - Origin
if Direction.Magnitude <= 0.05 then
return false
end
local Params = RaycastParams.new()
Params.FilterType = Enum.RaycastFilterType.Exclude
Params.FilterDescendantsInstances = {Character, Killer}
Params.IgnoreWater = true
-- Skip non-solid/query-only decorative parts and keep checking until the
-- line reaches the killer. Terrain or a solid collidable part counts as a wall.
local CurrentOrigin = Origin
local Remaining = Direction
for _ = 1, 12 do
local Result = workspace:Raycast(CurrentOrigin, Remaining, Params)
if not Result then
return false
end
local Hit = Result.Instance
if Hit:IsA("Terrain") then
return true
end
if Hit:IsA("BasePart") and Hit.CanCollide and Hit.Transparency < 1 then
return true
end
local ToHit = Result.Position - CurrentOrigin
local RemainingDistance = Remaining.Magnitude
if ToHit.Magnitude >= RemainingDistance - 0.05 then
return false
end
local Step = math.max(0.05, ToHit.Magnitude + 0.05)
CurrentOrigin += Remaining.Unit * Step
Remaining = Destination - CurrentOrigin
if Remaining.Magnitude <= 0.05 then
return false
end
end
return true
end
-- Read the game's current Block cooldown from the Block ability UI.
-- Different game versions can expose it as an attribute or as a countdown label,
-- so support both without changing the game's Block cooldown itself.
local function UpdateDragBlockCooldownFromBlockUI(BlockButton)
if not BlockButton then return end
local function AcceptNumber(Value)
local Number = tonumber(Value)
if Number and Number > 0 and Number < 120 then
LastKnownBlockCooldown = Number
FOLLOW_KILLER_COOLDOWN = Number
return true
end
return false
end
for _, AttributeName in {"Cooldown", "CooldownTime", "CooldownDuration", "Duration"} do
if AcceptNumber(BlockButton:GetAttribute(AttributeName)) then
return
end
end
for _, Descendant in BlockButton:GetDescendants() do
for _, AttributeName in {"Cooldown", "CooldownTime", "CooldownDuration", "Duration", "Time"} do
if AcceptNumber(Descendant:GetAttribute(AttributeName)) then
return
end
end
if Descendant:IsA("TextLabel") or Descendant:IsA("TextButton") then
local Name = string.lower(Descendant.Name or "")
local Text = tostring(Descendant.Text or "")
local Number = tonumber(Text:match("(%d+%.?%d*)"))
if Number and (Name:find("cooldown", 1, true) or Name:find("cd", 1, true)) then
if AcceptNumber(Number) then return end
end
end
end
end
-- Patch 307: gate the actual ABH trigger before attempting to activate Block.
-- BlockJustTriggered is only for the one follow associated with a real trigger;
-- it must not let later hitbox checks fire Block again while its UI is cooling down.
local function IsDragBlockCooldownActive(BlockButton)
if not BlockButton then return true end
if BlockButton:GetAttribute("OnCooldown") == true
or BlockButton:GetAttribute("CooldownActive") == true
or BlockButton:GetAttribute("Disabled") == true then
return true
end
for _, Descendant in BlockButton:GetDescendants() do
local Name = string.lower(Descendant.Name or "")
if Descendant:GetAttribute("OnCooldown") == true
or Descendant:GetAttribute("CooldownActive") == true then
return true
end
if (Descendant:IsA("TextLabel") or Descendant:IsA("TextButton"))
and (Name:find("cooldown", 1, true) or Name == "cd") then
local Remaining = tonumber(tostring(Descendant.Text or ""):match("(%d+%.?%d*)"))
if Remaining and Remaining > 0 then return true end
end
end
return false
end
-- Normal Drag Block only. Cooldown is recorded when a valid follow trigger
-- starts, so repeated ABH/sound callbacks cannot restart it early.
local function DragBlockAttackingKiller(Killer, FeatureName, BlockJustTriggered)
FeatureName = FeatureName or "DragBlock"
if DragBlockBusy or not GetValue(FeatureName, false) then return end
if IsWallCheckBlocked(Killer) then return end
-- A new follow may not start while Helpless is active.
if IsHelplessActive() then return end
local AbilityContainer = MainUI and MainUI:FindFirstChild("AbilityContainer")
local BlockButton = AbilityContainer and AbilityContainer:FindFirstChild("Block")
if not BlockButton then return end
UpdateDragBlockCooldownFromBlockUI(BlockButton)
-- Preserve this patch's existing Block UI/cooldown checks for normal Drag Block.
-- Drag V2 is invoked immediately after a successful fourth ABH check, so its
-- just-triggered Block cooldown UI must not reject that same follow request.
if not BlockJustTriggered then
if BlockButton:GetAttribute("OnCooldown") == true
or BlockButton:GetAttribute("CooldownActive") == true
or BlockButton:GetAttribute("Disabled") == true
or BlockButton.Active == false then
return
end
for _, Descendant in BlockButton:GetDescendants() do
local Name = string.lower(Descendant.Name or "")
if Descendant:GetAttribute("OnCooldown") == true
or Descendant:GetAttribute("CooldownActive") == true
or ((Name:find("cooldown", 1, true) or Name == "cd")
and Descendant:IsA("GuiObject") and Descendant.Visible) then
return
end
if (Descendant:IsA("TextLabel") or Descendant:IsA("TextButton"))
and (Name:find("cooldown", 1, true) or Name == "cd") then
local Remaining = tonumber(tostring(Descendant.Text or ""):match("(%d+%.?%d*)"))
if Remaining and Remaining > 0 then return end
end
end
end
local Now = time()
local CurrentBlockCooldown = LastKnownBlockCooldown
if CurrentBlockCooldown <= 0 then
CurrentBlockCooldown = FOLLOW_KILLER_COOLDOWN
end
-- Patch 306: BlockJustTriggered only bypasses the UI's newly-started
-- cooldown state; it must NOT bypass the reader-based follow throttle.
-- This allows the first valid follow immediately, then prevents both
-- Drag Block and Drag V2 from retriggering until the learned cooldown ends.
if CurrentBlockCooldown > 0
and Now - DragBlockLastFollowAt < CurrentBlockCooldown then
return
end
if not Killer or not Killer.Parent then return end
local Character = LocalCharacter
local Humanoid = LocalHumanoid
local Root = LocalRoot
local KillerRoot = Killer:FindFirstChild("HumanoidRootPart")
if not Character or not Humanoid or not Root or not KillerRoot then return end
local PathfindingService = game:GetService("PathfindingService")
local ContextActionService = game:GetService("ContextActionService")
local Players = game:GetService("Players")
local MovementActionName = "AutoBlockFollowMovementOverride"
local KillerNameLower = string.lower(Killer.Name or "")
local STOP_DISTANCE = tonumber(GetValue("DragBlockStopDistance")) or (KillerNameLower:find("c00lkidd", 1, true) and 2 or 3)
local FOLLOW_DURATION = tonumber(GetValue("DragBlockHoldDuration")) or 0.2
local WALK_DISTANCE_ONCE = 3
local MOVE_TIMEOUT = math.max(1.5, FOLLOW_DURATION + 1.0)
local function GetFlatDistance()
if not Root or not Root.Parent or not KillerRoot or not KillerRoot.Parent then
return math.huge
end
local Delta = Vector3.new(KillerRoot.Position.X - Root.Position.X, 0, KillerRoot.Position.Z - Root.Position.Z)
return Delta.Magnitude
end
if GetFlatDistance() <= STOP_DISTANCE then return end
DragBlockLastFollowAt = Now
DragBlockBusy = true
DragBlockToken += 1
local Token = DragBlockToken
local OriginalWalkSpeed = Humanoid.WalkSpeed
local OriginalJumpPower = Humanoid.JumpPower
local OriginalJumpHeight = Humanoid.JumpHeight
local OriginalAutoRotate = Humanoid.AutoRotate
local PlayerControls
pcall(function()
local PlayerScripts = Players.LocalPlayer:FindFirstChildOfClass("PlayerScripts")
local PlayerModule = PlayerScripts and PlayerScripts:FindFirstChild("PlayerModule")
if PlayerModule then
local Controls = require(PlayerModule):GetControls()
if Controls then
PlayerControls = Controls
PlayerControls:Disable()
end
end
end)
local function SinkMovementInput()
return Enum.ContextActionResult.Sink
end
pcall(function()
ContextActionService:BindActionAtPriority(
MovementActionName,
SinkMovementInput,
false,
Enum.ContextActionPriority.High.Value,
Enum.PlayerActions.CharacterForward,
Enum.PlayerActions.CharacterBackward,
Enum.PlayerActions.CharacterLeft,
Enum.PlayerActions.CharacterRight,
Enum.PlayerActions.CharacterJump,
Enum.PlayerActions.CharacterToggleAutoRun
)
end)
local Finished = false
local function FinishDragBlock(ReachedStopDistance)
if Finished then return end
Finished = true
if ReachedStopDistance then
FOLLOW_DURATION = 0
end
if Token == DragBlockToken then
DragBlockToken += 1
end
if Humanoid and Humanoid.Parent then
pcall(function()
if Root and Root.Parent then Humanoid:MoveTo(Root.Position) end
end)
Humanoid.WalkSpeed = OriginalWalkSpeed
Humanoid.JumpPower = OriginalJumpPower
Humanoid.JumpHeight = OriginalJumpHeight
Humanoid.AutoRotate = OriginalAutoRotate
Humanoid:Move(Vector3.zero, true)
end
pcall(function() ContextActionService:UnbindAction(MovementActionName) end)
pcall(function()
if PlayerControls then PlayerControls:Enable() end
end)
DragBlockBusy = false
if CancelDragBlockFollow == FinishDragBlock then
CancelDragBlockFollow = nil
end
end
CancelDragBlockFollow = FinishDragBlock
Humanoid.WalkSpeed = 27
Humanoid.JumpPower = 0
Humanoid.JumpHeight = 0
Humanoid.AutoRotate = false
task.spawn(function()
local Started = os.clock()
local Direction = Vector3.new(KillerRoot.Position.X - Root.Position.X, 0, KillerRoot.Position.Z - Root.Position.Z)
if Direction.Magnitude <= 0.05 then
FinishDragBlock(false)
return
end
-- Issue one stable MoveTo target (as in Patch 151). Reissuing MoveTo
-- every frame can continually cancel the Humanoid's current movement.
local MoveDistance = math.max(0, GetFlatDistance() - STOP_DISTANCE)
MoveDistance = math.min(WALK_DISTANCE_ONCE, MoveDistance)
local TargetPosition = Root.Position + Direction.Unit * MoveDistance
if MoveDistance > 0.05 then
Humanoid:MoveTo(TargetPosition)
end
while DragBlockBusy
and Token == DragBlockToken
and GetValue(FeatureName, false)
and not IsHelplessActive()
and Humanoid.Health > 0
and Killer.Parent
and KillerRoot.Parent
and os.clock() - Started < MOVE_TIMEOUT do
local CurrentDistance = GetFlatDistance()
if CurrentDistance <= STOP_DISTANCE then
FinishDragBlock(true)
return
end
local LookPosition = Vector3.new(KillerRoot.Position.X, Root.Position.Y, KillerRoot.Position.Z)
if (LookPosition - Root.Position).Magnitude > 0.05 then
Root.CFrame = CFrame.lookAt(Root.Position, LookPosition)
end
if (Root.Position - TargetPosition).Magnitude <= 0.75 then
break
end
task.wait(0.03)
end
FinishDragBlock(GetFlatDistance() <= STOP_DISTANCE)
end)
end
local function StopCurrentDragBlockFollow()
local CancelFollow = CancelDragBlockFollow
if CancelFollow then
CancelFollow()
end
end
-- Returns true when the local player is currently spectating.
-- Spectators do not run the Auto Do All Generators automation.
local function IsLocalPlayerSpectating()
if LocalCharacter and LocalCharacter.Parent and LocalCharacter.Parent.Name == "Spectator" then
return true
end
if LocalPlayer and LocalPlayer.Team and string.lower(LocalPlayer.Team.Name or "") == "spectator" then
return true
end
return false
end
local function StopAutoDoAllInvincibility()
AutoDoAllInvincibleToken += 1
IsAutoDoAllGeneratorsRunning = false
workspace:SetAttribute("Invincible", nil)
local Invincible = GetValue("Invincible", true)
if Invincible then
Invincible.Value = false
pcall(function()
Invincible:GoUnder(false)
end)
end
local AutoPuzzle = GetValue("AutoGeneratorPuzzle", true)
if AutoDoAllPuzzleWasEnabled == false and AutoPuzzle then
AutoPuzzle.Value = false
end
AutoDoAllPuzzleWasEnabled = nil
end
local function EnableAutoDoAllPuzzleAssist()
local AutoPuzzle = GetValue("AutoGeneratorPuzzle", true)
if not AutoPuzzle then
return
end
if AutoDoAllPuzzleWasEnabled == nil then
AutoDoAllPuzzleWasEnabled = AutoPuzzle.Value == true
end
if not AutoPuzzle.Value then
AutoPuzzle.Value = true
end
end
-- Finds a clear interaction position around a generator.
-- This prevents another survivor standing on the preferred side
-- from blocking the normal generator interaction.
local function GetClearGeneratorPosition(GeneratorMain)
local Root = LocalRoot or (LocalCharacter and LocalCharacter:FindFirstChild("HumanoidRootPart"))
if not GeneratorMain or not Root then
return nil
end
local GeneratorCFrame = GeneratorMain.CFrame
local GeneratorSize = GeneratorMain.Size
local CheckDistance = math.max(4.5, math.max(GeneratorSize.X, GeneratorSize.Z) * 0.5 + 3)
-- Only use the two sides and the front. Never use the back.
local Positions = {
GeneratorCFrame.Position + GeneratorCFrame.RightVector * CheckDistance,
GeneratorCFrame.Position - GeneratorCFrame.RightVector * CheckDistance,
GeneratorCFrame.Position + GeneratorCFrame.LookVector * CheckDistance
}
local RaycastParams = RaycastParams.new()
RaycastParams.FilterType = Enum.RaycastFilterType.Exclude
RaycastParams.FilterDescendantsInstances = {LocalCharacter, GeneratorMain.Parent}
local FallbackPosition = Positions[1]
for _, Position in Positions do
local Clear = true
-- Make sure the player's body would not overlap solid geometry.
local OccupyingParts = workspace:GetPartBoundsInBox(
CFrame.new(Position),
Vector3.new(3, 5, 3),
RaycastParams
)
for _, Part in ipairs(OccupyingParts) do
if Part.CanCollide then
Clear = false
break
end
end
if Clear then
for _, Player in Players:GetPlayers() do
if Player ~= LocalPlayer and Player.Character then
local OtherRoot = Player.Character:FindFirstChild("HumanoidRootPart")
if OtherRoot and (OtherRoot.Position - Position).Magnitude < 4 then
Clear = false
break
end
end
end
end
if Clear then
-- Make sure there is no wall directly between the generator and
-- the interaction position.
local Direction = Position - GeneratorCFrame.Position
local WallCheck = workspace:Raycast(
GeneratorCFrame.Position,
Direction.Unit * Direction.Magnitude,
RaycastParams
)
if WallCheck then
Clear = false
end
end
if Clear then
return Position
end
end
-- A blocked test should not prevent the automation from trying the
-- generator. The prompt/interaction retry logic handles the fallback.
return FallbackPosition
end
local FeatureLoadout; FeatureLoadout = {
["EnviromentFunctions"] = {
["TabAttributes"] = {
["DisplayTitle"] = "Script Made by Naiko Scripts | " .. tostring(Version),
["LayoutOrder"] = 666
},
["hookmetamethod"] = {
["DisplayDescription"] = " ",
["DisplayTitle"] = "hookmetamethod",
["LayoutOrder"] = 666,
["Savable"] = false,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = true,
["Requirement"] = true
},
["getgc"] = {
["DisplayDescription"] = " ",
["DisplayTitle"] = "getgc",
["LayoutOrder"] = 666,
["Savable"] = false,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = true,
["Requirement"] = true
},
["require"] = {
["DisplayDescription"] = " ",
["DisplayTitle"] = "require",
["LayoutOrder"] = 666,
["Savable"] = false,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = true,
["Requirement"] = true
},
["files"] = {
["DisplayDescription"] = " ",
["DisplayTitle"] = "files",
["LayoutOrder"] = 666,
["Savable"] = false,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = true,
["Requirement"] = true
},
["OfficialGame"] = {
["DisplayDescription"] = " ",
["DisplayTitle"] = "Official Game",
["LayoutOrder"] = 666,
["Savable"] = false,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = game.GameId == 6331902150 or game.GameId == 7464167604,
["Requirement"] = true
},
["PrivateServer"] = {
["DisplayDescription"] = " ",
["DisplayTitle"] = "Private Server",
["LayoutOrder"] = 666,
["Savable"] = false,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = workspace:GetAttribute("ServerType") == "VIP",
["Requirement"] = true
},
["PrivateServerOwner"] = {
["DisplayDescription"] = " ",
["DisplayTitle"] = "Private Server",
["LayoutOrder"] = 666,
["Savable"] = false,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = workspace:GetAttribute("ServerOwnerID") == LocalPlayer.UserId,
["Requirement"] = true
},
["NServer"] = {
["DisplayDescription"] = " ",
["DisplayTitle"] = "N Server",
["LayoutOrder"] = 666,
["Savable"] = false,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = game.PlaceId == 83645629621104,
["Requirement"] = true
},
["Computer"] = {
["DisplayDescription"] = " ",
["DisplayTitle"] = "Computer",
["LayoutOrder"] = 666,
["Savable"] = false,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = UserInputService.KeyboardEnabled,
["Requirement"] = true,
["OnLoop"] = function(self)
self.Instance.Value = UserInputService.KeyboardEnabled
end
},
},
["Automation"] = {
["TabAttributes"] = {
["DisplayTitle"] = "Automation",
["LayoutOrder"] = 1
},
["AutoGeneratorPuzzle"] = {
["DisplayDescription"] = "Auto Completes Generator Puzzles",
["DisplayTitle"] = "Auto Generator(s)",
["LayoutOrder"] = 1,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["GenCheck"] = function()
return not IsFixingGenerator or not LocalCharacter or not SpeedMultipliers or not PlayerGui:FindFirstChild("PuzzleUI") or PlayerGui:FindFirstChild("PuzzleUI"):FindFirstChildWhichIsA("GuiObject").Size ~= ReplicatedStorage:FindFirstChild("PuzzleUI",true):FindFirstChildWhichIsA("GuiObject").Size or not (GetValue("AutoGeneratorPuzzle"))
end,
["IsPlayersNear"] = function(self,Distance)
if LocalCharacter and LocalRoot then
for i,v in Players:GetPlayers() do
if v ~= LocalPlayer and v.Character and v.Character:FindFirstChild("HumanoidRootPart") and (v.Character:FindFirstChild("HumanoidRootPart").Position-LocalRoot.Position).Magnitude < Distance then
return true
end
end
end
return false
end,
["RNG"] = Random.new(),
["OnLoop"] = function(self)
task.spawn(function()
if LocalRoot and not IsFixingGenerator and (GetValue("AutoGeneratorPuzzle")) and GameMap then
for i,Object in GameMap:QueryDescendants("Model#Generator:has(#Main)") do
if LocalRoot and LocalRoot.Anchored ~= true and (Object:FindFirstChild("Main").Position - LocalRoot.Position).Magnitude < 6.7 then
task.spawn(function()
IsFixingGenerator = true
local Remotes = Object:FindFirstChild("Remotes")
local Progress = Remotes and Object:FindFirstChild("Progress")
local RemoteEvent = Progress and Remotes:FindFirstChildOfClass("RemoteEvent")
if RemoteEvent and PlayerGui:FindFirstChild("PuzzleUI") then
while true do
if self:GenCheck() then
break
end
local IsNear = self:IsPlayersNear(32)
local GenCD = (not IsNear and GetValue("SpeedUpCooldown") and GetValue("GeneratorCooldown") > 2 and (GetValue("GeneratorCooldown",true):GetAttribute("MinValue"))) or GetValue("GeneratorCooldown")
task.wait(self.RNG:NextNumber(GenCD - 0.1 * GenCD,GenCD + 0.1 * GenCD))
if self:GenCheck() then
break
end
if not GetValue("require") then
RemoteEvent:FireServer()
PlaySound("puzzleDone", {["Parent"] = Object:FindFirstChild("Main")})
end
end
end
IsFixingGenerator = false
end)
break
end
end
end
end)
end,
["CustomSetup"] = function(self)
local LoadUI = Instance.new("TextButton")
local Folder = Instance.new("Folder")
local Dot1 = Instance.new("TextLabel")
local TextButton = Instance.new("TextLabel")
LoadUI.Name = "load"
LoadUI.BackgroundColor3 = Color3.new(0, 0, 0)
LoadUI.BackgroundTransparency = 0.4
LoadUI.BorderSizePixel = 0
LoadUI.Active = true
LoadUI.Interactable = true
LoadUI.AutoButtonColor = false
LoadUI.Size = UDim2.new(1, 0, 1, 0)
LoadUI.ZIndex = 7
LoadUI.Text = ""
Folder.Parent = LoadUI
Dot1.Name = "1"
Dot1.Parent = Folder
Dot1.AnchorPoint = Vector2.new(0.5, 0)
Dot1.BackgroundColor3 = Color3.new(1, 1, 1)
Dot1.BackgroundTransparency = 1
Dot1.BorderSizePixel = 0
Dot1.Position = UDim2.new(0.5, 0, -0.05, 0)
Dot1.Size = UDim2.new(0.1, 0, 1, 0)
Dot1.ZIndex = 4
Dot1.Font = Enum.Font.Cartoon
Dot1.Text = "."
Dot1.TextColor3 = Color3.new(1, 1, 1)
Dot1.TextSize = 50
Dot1.TextScaled = true
Dot1.TextStrokeTransparency = 0.9
local Dot2 = Dot1:Clone()
Dot2.Name = "2"
Dot2.Parent = Folder
local Dot3 = Dot1:Clone()
Dot3.Name = "3"
Dot3.Parent = Folder
TextButton.Name = "TextButton"
TextButton.Parent = LoadUI
TextButton.BackgroundColor3 = Color3.new(1, 1, 1)
TextButton.BackgroundTransparency = 1
TextButton.BorderSizePixel = 0
TextButton.AnchorPoint = Vector2.new(0.5, 0.5)
TextButton.Position = UDim2.new(0.5, 0, 0.6, 0)
TextButton.Selectable = false
TextButton.Size = UDim2.new(0.4, 0, 0.4, 0)
TextButton.ZIndex = 7
TextButton.Font = Enum.Font.SciFi
TextButton.Text = "Completing"
TextButton.TextColor3 = Color3.new(1, 1, 1)
TextButton.TextSize = 20
TextButton.TextScaled = true
TextButton.TextStrokeTransparency = 0.9
PlayerGui.ChildAdded:Connect(function(Child)
if Child.Name == "PuzzleUI" then
local ClonedLoadUI = LoadUI:Clone()
ClonedLoadUI.Parent = Child.Container.GridHolder
local InstanceAuto = GetValue("AutoGeneratorPuzzle",true)
ClonedLoadUI.Visible = InstanceAuto.Value
InstanceAuto:GetPropertyChangedSignal("Value"):Connect(function()
ClonedLoadUI.Visible = InstanceAuto.Value
end)
task.spawn(function()
while task.wait() and ClonedLoadUI and ClonedLoadUI.Parent do
if ClonedLoadUI.Visible then
for i = 1, 3 do
ClonedLoadUI.Folder[i].Rotation = math.cos(tick() + i * 10) * 360
end
else
wait(0.1)
end
end
end)
end
end)
end
},
["ResetAfterAllGenerators"] = {
["DisplayDescription"] = "Resets the player after Auto Do All Generators finishes every unfinished generator",
["DisplayTitle"] = "Reset After All Generators",
["LayoutOrder"] = 2.5,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["Requirement"] = "AutoDoAllGenerators"
},
["AutoDoAllGenerators"] = {
["DisplayDescription"] = "Teleports to each unfinished generator and automatically completes it",
["DisplayTitle"] = "Auto Do All Generators",
["LayoutOrder"] = 2,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["ScriptFunction"] = function(self, Value)
AutoDoAllInvincibleToken += 1
local Token = AutoDoAllInvincibleToken
if not Value then
StopAutoDoAllInvincibility()
return
end
if IsLocalPlayerSpectating() then
return
end
EnableAutoDoAllPuzzleAssist()
local Invincible = GetValue("Invincible", true)
if Invincible and not Invincible.Value then
Invincible.Value = true
end
end,
["OnLoop"] = function(self)
if IsLocalPlayerSpectating() then
if IsAutoDoAllGeneratorsRunning then
IsAutoDoAllGeneratorsRunning = false
end
return
end
if IsAutoDoAllGeneratorsRunning then
return
end
if not GetValue("AutoDoAllGenerators") or not GameMap or not LocalCharacter then
return
end
EnableAutoDoAllPuzzleAssist()
IsAutoDoAllGeneratorsRunning = true
task.spawn(function()
local function IsActive()
return Token == AutoDoAllInvincibleToken
and GetValue("AutoDoAllGenerators") == true
and not IsLocalPlayerSpectating()
and GameMap
and LocalCharacter
end
if not IsActive() then
IsAutoDoAllGeneratorsRunning = false
return
end
for _, Object in GameMap:QueryDescendants("Model#Generator:has(#Main)") do
if not IsActive() then
break
end
local Main = Object:FindFirstChild("Main")
local ProgressValue = Object:FindFirstChild("Progress")
local Remotes = Object:FindFirstChild("Remotes")
local RemoteEvent = Remotes and (Remotes:FindFirstChild("Progress") or Remotes:FindFirstChildOfClass("RemoteEvent"))
if Main and ProgressValue and ProgressValue.Value < 100 then
local TargetPosition = GetClearGeneratorPosition(Main)
if TargetPosition and LocalCharacter.PivotTo then
LocalCharacter:PivotTo(CFrame.new(TargetPosition))
task.wait(0.15)
else
task.wait(0.5)
end
local GeneratorPrompt = Object:FindFirstChildWhichIsA("ProximityPrompt", true)
local HasClearPosition = TargetPosition ~= nil
if GeneratorPrompt and HasClearPosition then
-- Try to open this generator from up to three positions.
-- If all three attempts fail, move to another available side
-- of the same generator and try again.
local GeneratorOpened = false
local GeneratorPositions = {}
if Main then
local GeneratorCFrame = Main.CFrame
local GeneratorSize = Main.Size
local CheckDistance = math.max(4.5, math.max(GeneratorSize.X, GeneratorSize.Z) * 0.5 + 3)
-- Retry only from the left, right, or front.
-- Never retry from behind the generator.
GeneratorPositions = {
GeneratorCFrame.Position + GeneratorCFrame.RightVector * CheckDistance,
GeneratorCFrame.Position - GeneratorCFrame.RightVector * CheckDistance,
GeneratorCFrame.Position + GeneratorCFrame.LookVector * CheckDistance
}
end
local function TryOpenFromPosition(Position)
if not IsActive() or not Position or not LocalCharacter then
return false
end
if LocalCharacter.PivotTo then
local SafeParams = RaycastParams.new()
SafeParams.FilterType = Enum.RaycastFilterType.Exclude
SafeParams.FilterDescendantsInstances = {LocalCharacter, Object}
local OccupyingParts = workspace:GetPartBoundsInBox(
CFrame.new(Position),
Vector3.new(3, 5, 3),
SafeParams
)
for _, Part in ipairs(OccupyingParts) do
if Part.CanCollide then
return false
end
end
LocalCharacter:PivotTo(CFrame.new(Position))
task.wait(0.15)
end
local BeforeProgress = ProgressValue.Value
for _ = 1, 3 do
if not IsActive()
or not LocalCharacter
or not ProgressValue.Parent then
return false
end
if typeof(fireproximityprompt) == "function" then
pcall(function()
fireproximityprompt(GeneratorPrompt, 1, true)
end)
end
pcall(function()
GeneratorPrompt:InputHoldBegin()
end)
-- Complete the generator directly as well as
-- opening its prompt. This keeps Do All
-- independent from Auto Generator(s).
if RemoteEvent and RemoteEvent:IsA("RemoteEvent") then
pcall(function()
RemoteEvent:FireServer()
end)
end
-- Give the generator up to 3 seconds to actually respond.
local WaitStart = os.clock()
local LastRemoteFire = os.clock()
while os.clock() - WaitStart < 3 do
if not IsActive()
or not LocalCharacter
or not ProgressValue.Parent then
pcall(function()
GeneratorPrompt:InputHoldEnd()
end)
return false
end
if ProgressValue.Value > BeforeProgress then
pcall(function()
GeneratorPrompt:InputHoldEnd()
end)
return true
end
if RemoteEvent
and RemoteEvent:IsA("RemoteEvent")
and os.clock() - LastRemoteFire >= 0.15 then
LastRemoteFire = os.clock()
pcall(function()
RemoteEvent:FireServer()
end)
end
task.wait(0.05)
end
pcall(function()
GeneratorPrompt:InputHoldEnd()
end)
-- Small pause before the next open attempt.
task.wait(0.15)
-- Refresh the prompt in case the generator recreated it.
local RefreshedPrompt = Object:FindFirstChildWhichIsA("ProximityPrompt", true)
if RefreshedPrompt then
GeneratorPrompt = RefreshedPrompt
end
end
return false
end
-- First try the original clear position.
GeneratorOpened = TryOpenFromPosition(TargetPosition)
-- If three attempts fail, switch to another clear generator position.
if not GeneratorOpened and #GeneratorPositions > 0 then
for _, Position in ipairs(GeneratorPositions) do
if (Position - TargetPosition).Magnitude > 0.5 then
local Clear = true
for _, Player in Players:GetPlayers() do
if Player ~= LocalPlayer and Player.Character then
local OtherRoot = Player.Character:FindFirstChild("HumanoidRootPart")
if OtherRoot and (OtherRoot.Position - Position).Magnitude < 4 then
Clear = false
break
end
end
end
if Clear then
GeneratorOpened = TryOpenFromPosition(Position)
if GeneratorOpened then
break
end
end
end
end
end
-- If the generator still did not open, skip it and let the
-- next generator be processed rather than getting stuck here.
if not GeneratorOpened then
pcall(function()
GeneratorPrompt:InputHoldEnd()
end)
task.wait(0.25)
end
end
-- Keep the existing Auto Generator(s) solver alive long
-- enough to finish the puzzle opened above.
local CompletionDeadline = os.clock() + 8
while IsActive()
and HasClearPosition
and LocalCharacter
and ProgressValue.Parent
and ProgressValue.Value < 100
and os.clock() < CompletionDeadline do
if IsLocalPlayerSpectating() then
break
end
if RemoteEvent
and RemoteEvent:IsA("RemoteEvent") then
pcall(function()
RemoteEvent:FireServer()
end)
end
task.wait(0.1)
end
if GeneratorPrompt and HasClearPosition then
pcall(function()
GeneratorPrompt:InputHoldEnd()
end)
end
end
task.wait(math.max(0.1, tonumber(GetValue("AutoDoAllGeneratorInterval")) or 1.5))
end
if Token == AutoDoAllInvincibleToken then
IsAutoDoAllGeneratorsRunning = false
if GetValue("ResetAfterAllGenerators") then
local Humanoid = LocalCharacter and LocalCharacter:FindFirstChildOfClass("Humanoid")
if Humanoid and Humanoid.Health > 0 then
Humanoid.Health = 0
end
end
end
end)
end
},
["AutoDoAllGeneratorInterval"] = {
["DisplayDescription"] = "Cooldown in seconds between Auto Do All Generator completions",
["DisplayTitle"] = "Auto Do All Generator Interval",
["LayoutOrder"] = 2.25,
["Savable"] = true,
["InstanceType"] = "NumberValue",
["DefaultInstanceValue"] = 1.5,
["Requirement"] = "AutoDoAllGenerators",
["ExtraData"] = {
["MaxValue"] = 8,
["MinValue"] = 0.1,
["Step"] = 0.1
}
},
["GeneratorCooldown"] = {
["DisplayDescription"] = "The cooldown in seconds before completing a generator",
["DisplayTitle"] = "Cooldown Between Auto Completions",
["LayoutOrder"] = 2,
["Savable"] = true,
["InstanceType"] = "NumberValue",
["DefaultInstanceValue"] = 4,
["Requirement"] = "AutoGeneratorPuzzle",
["ExtraData"] = {
["MaxValue"] = 8,
["MinValue"] = 1.5,
["Step"] = 0.25,
["CurrentSpeed"] = 0.4,
["CurrentGrid"] = 6
},
["IsPlayersNear"] = function(self,Distance)
if LocalCharacter and LocalRoot then
for i,v in Players:GetPlayers() do
if v ~= LocalPlayer and v.Character and v.Character:FindFirstChild("HumanoidRootPart") and (v.Character:FindFirstChild("HumanoidRootPart").Position-LocalRoot.Position).Magnitude < Distance then
return true
end
end
end
return false
end,
["OnLoop"] = function(self)
local IsNear = self:IsPlayersNear(32)
local CurrentGrid = self.Instance:GetAttribute("CurrentGrid")
local RNG = Random.new()
local GenCD = (not IsNear and GetValue("SpeedUpCooldown") and self.Instance:GetAttribute("MinValue")) or RNG:NextNumber(GetValue("GeneratorCooldown") - 0.1 * GetValue("GeneratorCooldown"),GetValue("GeneratorCooldown") + 0.1 * GetValue("GeneratorCooldown"))
self.Instance:SetAttribute("CurrentSpeed",(GenCD / math.pow(CurrentGrid,2)))
end
},
["SpeedUpCooldown"] = {
["DisplayDescription"] = "Make the cooldown low when nobody is near to look at you",
["DisplayTitle"] = "Speed Up When Nobodys Near",
["LayoutOrder"] = 3,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["Requirement"] = "AutoGeneratorPuzzle|GeneratorCooldown~1.5|GeneratorCooldown~1.75|GeneratorCooldown~2"
},
["AutoPickup"] = {
["DisplayDescription"] = "Auto-Picks up <b>Items</b> near you",
["DisplayTitle"] = "Auto Pickup",
["LayoutOrder"] = 4,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["CustomSetup"] = function(self)
if InGame then
InGame.ChildAdded:Connect(function(Child)
if Child:IsA("Tool") then
Child:SetAttribute("JustDropped", true)
task.delay(1.5, function()
if Child then
Child:SetAttribute("JustDropped", nil)
end
end)
end
end)
end
end
},
["AutoEscape"] = {
["DisplayDescription"] = "Auto-Escapes <b>Nosferatu's</b> Hook",
["DisplayTitle"] = "Auto Escape",
["LayoutOrder"] = 5,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["Requirement"] = not (KillerAssets and KillerAssets:FindFirstChild("Nosferatu"))
},
["EscapeCooldown"] = {
["DisplayDescription"] = "The cooldown in seconds before pressing a key",
["DisplayTitle"] = "Cooldown Between Auto Escape Presses",
["LayoutOrder"] = 6,
["Savable"] = true,
["InstanceType"] = "NumberValue",
["DefaultInstanceValue"] = 0.5,
["Requirement"] = (KillerAssets and KillerAssets:FindFirstChild("Nosferatu")) and "AutoEscape" or true,
["ExtraData"] = {
["MaxValue"] = 1.2,
["MinValue"] = 0.2,
["Step"] = 0.1,
},
["ScriptFunction"] = function(self, Value)
if Value <= 0.3 then
GetValue("EscapeCooldown",true):SetAttribute("DisplayDescription",self["DisplayDescription"] .. " " .. RichTextGradientColor("(TOO FAST)",{Color3.fromRGB(251, 107, 43),Color3.fromRGB(251, 165, 43),Color3.fromRGB(251, 107, 43)}))
else
GetValue("EscapeCooldown",true):SetAttribute("DisplayDescription",self["DisplayDescription"])
end
end,
["CustomSetup"] = function(self)
TempUI.ChildAdded:Connect(function(UIElement)
if UIElement.Name:upper() == "QTE" and UIElement:FindFirstChildOfClass("UIAspectRatioConstraint") then
while UIElement and UIElement.Visible do
local Cooldown = GetValue("EscapeCooldown")
task.wait(Random.new():NextNumber(Cooldown - 0.2 * Cooldown,Cooldown + 0.2 * Cooldown))
if GetValue("AutoEscape") then
for i,v in KillersFolder:GetChildren() do
if v.Name:lower() == "nosferatu" then
local Player = Players:GetPlayerFromCharacter(v)
if Player then
Network:FindFirstChildOfClass("RemoteEvent"):FireServer(Player.Name.."NosHookQTE",{true})
end
end
end
end
end
end
end)
end
},
["AutoDisarm"] = {
["DisplayDescription"] = "Auto-Disarms <b>Azure's</b> Traps Instantly",
["DisplayTitle"] = "Auto Disarm",
["LayoutOrder"] = 7,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["ExtraData"] = {
["Requirement"] = (KillerAssets and KillerAssets:FindFirstChild("Azure") and "require" or true)
},
["ScriptFunction"] = function(self, Value)
if CurrentQTEAzure and Value then
CurrentQTEAzure:AddProgress(100)
CurrentQTEAzure = nil
end
end
},
},
["Features"] = {
["TabAttributes"] = {
["DisplayTitle"] = "Features",
["LayoutOrder"] = 3
},
["Invincible"] = {
["DisplayDescription"] = "Makes you invisible & god mode (you can still use abilities)",
["DisplayTitle"] = "Invincible",
["LayoutOrder"] = 1,
["Savable"] = false,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["Requirement"] = "hookmetamethod|require|OfficialGame",
["ScriptFunction"] = function(self, Value)
if workspace:GetAttribute("Invincible") == nil then
workspace:SetAttribute("Invincible", Value)
self.Instance.Value = Value
if Value then
GetValue("DisableToxicTrails",true).Value = true
GetValue("DisableFootprints",true).Value = true
end
task.delay(1.5, function()
workspace:SetAttribute("Invincible",nil)
end)
self:GoUnder(Value)
else
self.Instance.Value = workspace:GetAttribute("Invincible")
end
end,
["IsHitboxNotNear"] = function(self,HitboxPart,Position)
if HitboxPart and Position and LocalRoot then
local IsHitboxNotNearParams = OverlapParams.new()
IsHitboxNotNearParams.FilterType = Enum.RaycastFilterType.Include
IsHitboxNotNearParams.MaxParts = 1
IsHitboxNotNearParams.FilterDescendantsInstances = {HitboxPart}
local Result = workspace:GetPartBoundsInRadius(Position, 2.5, IsHitboxNotNearParams)
return #Result == 0
else
ColoredPrint("HitboxPart/Position/HumanoidRootPart is nil while trying to check if near", "info", Color3.new(1,0.25,0))
return false
end
end,
["VelocityToPosition"] = function(self,target)
local TimeLimit = workspace.DistributedGameTime + 7
local OGCG = LocalRoot.CollisionGroup
local AllParts = LocalCharacter:QueryDescendants("BasePart:not([CollisonGroup=Default])")
for i,v in AllParts do
v.CollisionGroup = "None"
end
local Body = Instance.new("BodyVelocity")
Body.MaxForce = Vector3.new(9e9, 9e9, 9e9)
Body.Velocity = Vector3.new(0, 0, 0)
Body.Parent = LocalRoot
while (LocalRoot.Position - target).Magnitude > 2 and not (workspace.DistributedGameTime >= TimeLimit) do
Body.Velocity = (target - LocalRoot.Position).Unit * 100
RunService.RenderStepped:Wait()
end
if workspace.DistributedGameTime >= TimeLimit then
warn("Failed to do in time")
end
Body:Destroy()
for i,v in AllParts do
v.CollisionGroup = OGCG
end
end,
["GoUnder"] = function(self,Value)
local Offset = 22
if Value == nil then
IsUnderground = false
Value = GetValue("Invincible")
end
if Value and not SideBar:GetAttribute("WasVisible") and not IsUnderground then
IsUnderground = false
if not (LocalRoot and LocalHead and LocalHumanoid and MainUI.Enabled) then
repeat task.wait(0.25) until (LocalRoot and LocalHead and LocalHumanoid and MainUI.Enabled)
end
local MapName
if GameMap and GameMap:FindFirstChild("Config") then
local MapData = require(GameMap:FindFirstChild("Config"))
if MapData and MapData["DisplayName"] ~= nil then
MapName = MapData["DisplayName"]
end
end
local OldCFrame:CFrame = LocalRoot.CFrame
local UnderCFrame
if MapName == "Underground War" then
local SelfParams = OverlapParams.new()
SelfParams.FilterType = Enum.RaycastFilterType.Include
SelfParams.MaxParts = 1
SelfParams.FilterDescendantsInstances = {LocalRoot}
local BoxCheck = workspace:GetPartBoundsInBox(CFrame.new(-172,4444,-20,1,0,0,0,1,0,0,0,1),Vector3.new(230, 35, 300),SelfParams)
if #BoxCheck > 0 then
Offset = 50
end
local MapPart = GameMap:FindFirstChild("DirtSlabs",true) and GameMap:FindFirstChild("DirtSlabs",true):FindFirstChildWhichIsA("BasePart")
if MapPart then
UnderCFrame = CFrame.new(Vector3.new(OldCFrame.X + 0.5,MapPart.Position.Y - 7.5,OldCFrame.Z + 0.5))
else
UnderCFrame = OldCFrame * CFrame.new(0, -Offset, 0)
end
else
UnderCFrame = OldCFrame * CFrame.new(0, -Offset, 0)
end
LocalHumanoid.CameraOffset = Vector3.new(0, 12e12 ,0)
task.wait(0.1)
LocalRoot.CFrame = UnderCFrame
local Tries = 0
local TimerStop = workspace.DistributedGameTime + 3.5
repeat
Tries += 1
LocalRoot.Velocity = Vector3.zero
self:VelocityToPosition(UnderCFrame.Position)
LocalHead.Anchored = true
repeat task.wait() until self:IsHitboxNotNear(LocalCharacter:FindFirstChild("QueryHitbox"),OldCFrame.Position) or not LocalRoot or not LocalCharacter or TimerStop < workspace.DistributedGameTime
IsUnderground = true
task.wait()
LocalRoot.Velocity = Vector3.zero
LocalHead.Anchored = false
LocalRoot.CFrame = OldCFrame
RunService.Heartbeat:Wait()
LocalRoot.Velocity = Vector3.zero
until self:IsHitboxNotNear(LocalCharacter:FindFirstChild("QueryHitbox"),OldCFrame.Position) or Tries >= 3
if Tries >= 3 then
IsUnderground = false
workspace:SetAttribute("Invincible",nil)
GetValue("Invincible",true).Value = false
if GetValue("OfficialGame") then
StarterGui:SetCore("SendNotification",{
Title = "Fail", Text = "Failed to become invincible, if this keeps happning please report this in the discord server",
Icon = "rbxasset://textures/DevConsole/Warning.png", Duration = 4.5
})
else
StarterGui:SetCore("SendNotification",{
Title = "Fail", Text = "Failed to become invincible, this feature is not supported here",
Icon = "rbxasset://textures/DevConsole/Warning.png", Duration = 4.5
})
GetValue("Invincible",true):SetAttribute("Requirement", true)
end
return ColoredPrint("Failed to go invincible! Tried 3 Times and still failed.", "info", Color3.new(1,0.25,0))
end
else
IsUnderground = false
end
end,
["CharacterAdded"] = function(self)
task.delay(1,self.GoUnder,self)
if not LocalRoot then
repeat task.wait() until LocalRoot
end
LocalRoot:GetPropertyChangedSignal("Anchored"):Connect(function()
if not LocalRoot.Anchored then
task.delay(0.75,self.GoUnder,self)
end
end)
end,
["CustomSetup"] = function(self)
if GetValue("OfficialGame") then
task.spawn(function()
export type DesyncHook = {DesyncNumber:number,BufferCorruption:buffer}
export type CorruptArguments = {Number:number,Table1:table,NilObject:any,Table2:table}
local hookmetamethod = GetFunction(hookmetamethod, hook_metamethod)
local HookSuccess, HookResult = pcall(function()
local UnreliableRemoteEvent = Network:WaitForChild("UnreliableRemoteEvent")
local newcclosure = GetFunction(newcclosure, new_cclosure)
local checkcaller = GetFunction(checkcaller, check_caller)
if not newcclosure or not checkcaller then
return
end
local FeatureInstance = GetValue("Invincible",true)
if not FeatureInstance.Value then
FeatureInstance:GetPropertyChangedSignal("Value"):Wait()
end
local TypeEnum = "invalidnumber"
local __namecall
__namecall = hookmetamethod(game, "__namecall", newcclosure(function(self, ...): DesyncHook
if not checkcaller() and IsUnderground and getnamecallmethod() == "FireServer" and self == UnreliableRemoteEvent and FeatureInstance and FeatureInstance.Value then
local Args: CorruptArguments = {...}
if Args[1] == math.pow(#TypeEnum,0) then
return function() return nil end
end
end
return __namecall(self, ...)
end))
return __namecall
end)
end)
end
end
},
["DisableKillerWalls"] = {
["DisplayDescription"] = "Disables Thin Killer Walls",
["DisplayTitle"] = "Disable Killer Walls",
["LayoutOrder"] = 2,
["Savable"] = false,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["HandleDisableKillerWalls"] = function(self,MainValue,Tween)
local KillerDoorsFolder = GameMap and (GameMap:FindFirstChild("KillerDoors",true) or GameMap:FindFirstChild("Killer Doors",true))
local KillerCollisions = GameMap and GameMap:FindFirstChild("KillerOnly",true)
local MainTweenInfo = TweenInfo.new(0.5,Enum.EasingStyle.Quad,Enum.EasingDirection.InOut)
local function ColorBrightness(Color,Brightness)
local H, S, V = Color:ToHSV()
return Color3.fromHSV(H, S, math.clamp(V * Brightness, 0, 1))
end
if KillerDoorsFolder then
for i,v in KillerDoorsFolder:GetChildren() do
if v:IsA("BasePart") then
if math.min(v.Size.X,v.Size.Z) > 5 then continue end
v.CanTouch = true
local Value = not v:GetAttribute("WalkedThrough") and MainValue or false
local Color = Value and Color3.new(0,1,0) or Color3.new(1,0,0)
local VertexColor = Value and Vector3.new(0,255,0) or Vector3.new(255,0,0)
local ShouldTween --= Tween and v:GetAttribute("WalkedThrough") ~= nil
if ShouldTween then
TweenService:Create(v,MainTweenInfo,{Color = Color}):Play()
else
v.Color = Color
end
if v:GetAttribute("OriginalCanCollide") == nil then
v:SetAttribute("OriginalCanCollide", v.CanCollide)
end
v.CanCollide = v:GetAttribute("OriginalCanCollide") ~= false and not Value or false
if v:FindFirstChildOfClass("SpecialMesh") then
if ShouldTween then
TweenService:Create(v:FindFirstChildOfClass("SpecialMesh"),MainTweenInfo,{VertexColor = VertexColor}):Play()
else
v:FindFirstChildOfClass("SpecialMesh").VertexColor = VertexColor
end
end
if KillerCollisions then
local Params = OverlapParams.new()
Params.FilterType = Enum.RaycastFilterType.Include
Params.BruteForceAllSlow = true
Params.FilterDescendantsInstances = {KillerCollisions}
local Params2 = OverlapParams.new()
Params2.FilterType = Enum.RaycastFilterType.Include
Params2.BruteForceAllSlow = true
Params2.FilterDescendantsInstances = {KillerDoorsFolder:QueryDescendants("#KillerWallDetail")}
local Hitbox = workspace:GetPartBoundsInRadius(v.Position, 25, Params)
local DecorationHitbox = workspace:GetPartBoundsInRadius(v.Position, 25, Params2)
for i,v in Hitbox do
v.CanCollide = not Value
end
for i,v2 in DecorationHitbox do
local MainDecoration = v2:FindFirstAncestor("KillerWallDetail")
if not MainDecoration then continue end
local FloorSpikes = MainDecoration:FindFirstChildOfClass("MeshPart")
if ShouldTween then
TweenService:Create(FloorSpikes,MainTweenInfo,{Color = ColorBrightness(Color, 0.43)}):Play()
else
FloorSpikes.Color = ColorBrightness(Color, 0.43)
end
for i,v in FloorSpikes:QueryDescendants("Texture") do
if ShouldTween then
TweenService:Create(v,MainTweenInfo,{Color3 = Value and Color3.new(0,0,0) or Color3.new(1,1,1)}):Play()
else
v.Color3 = Value and Color3.new(0,0,0) or Color3.new(1,1,1)
end
end
local Effects = MainDecoration:QueryDescendants("ParticleEmitter")
for i,v in Effects do
if not v:GetAttribute("OGColor") then
v:SetAttribute("OGColor",v.Color)
end
v.Color = (Value and ColorSequence.new(Color)) or v:GetAttribute("OGColor")
end
end
end
end
end
end
end,
["ScriptFunction"] = function(self, Value, Starting)
if Starting then
if GetValue("PrivateServer") then
self.Instance:SetAttribute("DisplayDescription",self.Instance:GetAttribute("DisplayDescription"):gsub("%s?<b>.-</b>", ""))
end
end
self:HandleDisableKillerWalls(Value)
end,
["CharacterAdded"] = function(self)
LocalRoot.Touched:Connect(function(Hit)
if Hit and Hit.Parent and (Hit:FindFirstAncestor("KillerDoors") or Hit:FindFirstAncestor("Killer Doors")) then
if GetValue("DisableKillerWalls") and Hit.CanQuery and (Hit:GetAttribute("WalkedThrough") ~= false or Hit:GetAttribute("WalkedThrough") == nil) then
local KillerDoorsFolder = GameMap and (GameMap:FindFirstChild("KillerDoors",true) or GameMap:FindFirstChild("Killer Doors",true))
if not KillerDoorsFolder then return end
local Params = OverlapParams.new()
Params.FilterType = Enum.RaycastFilterType.Include
Params.BruteForceAllSlow = true
Params.FilterDescendantsInstances = {KillerDoorsFolder}
local Gates = workspace:GetPartBoundsInRadius(Hit.Position,15,Params)
for i,v in Gates do
if v:IsA("BasePart") then
v:SetAttribute("WalkedThrough","Ignore")
end
end
Hit:SetAttribute("WalkedThrough","Ignore")
task.delay(0.3,function()
if Hit and Hit.Parent then
for i,v in Gates do
if v:IsA("BasePart") then
v:SetAttribute("WalkedThrough",true)
end
end
Hit:SetAttribute("WalkedThrough",true)
task.wait()
self:HandleDisableKillerWalls(GetValue("DisableKillerWalls"),true)
end
end)
task.delay(4.5,function()
if Hit and Hit.Parent then
for i,v in Gates do
if v:IsA("BasePart") then
v:SetAttribute("WalkedThrough",nil)
end
end
Hit:SetAttribute("WalkedThrough",nil)
task.wait()
self:HandleDisableKillerWalls(GetValue("DisableKillerWalls"),true)
end
end)
end
end
end)
end,
["CustomSetup"] = function(self)
InGame.ChildAdded:Connect(function(Child)
if Child.Name == "Map" then
GameMap = Child
task.delay(2,self.HandleDisableKillerWalls,self,GetValue("DisableKillerWalls"))
end
end)
end
},
["DisableToxicTrails"] = {
["DisplayDescription"] = "Disables damaging trails for john doe",
["DisplayTitle"] = "Disable <b>John Doe's</b> Trails",
["LayoutOrder"] = 3,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["ScriptFunction"] = function(self, Value)
for i,v in InGame:GetChildren() do
if v:IsA("Folder") and (v.Name):find("JohnDoeTrail") then
for i,v2 in v:GetChildren() do
if v2:IsA("BasePart") then
v2.CanTouch = not Value
end
end
end
end
end,
["CustomSetup"] = function(self)
--self.DisplayTitle = self.DisplayTitle:gsub("John Doe's",RichTextGradientColor("John Doe's",{Color3.fromRGB(255, 190, 71), Color3.fromRGB(168, 3, 0),Color3.fromRGB(184, 171, 255)}))
if InGame then
InGame.ChildAdded:Connect(function(Child)
if Child:IsA("Folder") and (Child.Name):find("JohnDoeTrail") then
task.wait()
for i,v in Child:GetChildren() do
if v:IsA("BasePart") then
v.CanTouch = not GetValue("DisableToxicTrails")
end
end
if not Child:GetAttribute("Checked") then
Child:SetAttribute("Checked", true)
Child.ChildAdded:Connect(function(v)
if v:IsA("BasePart") then
v.CanTouch = not GetValue("DisableToxicTrails")
end
end)
end
end
end)
end
end
},
["DisableFootprints"] = {
["DisplayDescription"] = "Disables footprints made by john doe",
["DisplayTitle"] = "Disable <b>John Doe's</b> Footprints",
["LayoutOrder"] = 4,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["ScriptFunction"] = function(self, Value)
for i,v in InGame:GetChildren() do
if v:IsA("Folder") and (v.Name):find("Shadows") then
for i,v2 in v:GetChildren() do
if v2:IsA("BasePart") then
v2.CanTouch = not Value
end
end
if not v:GetAttribute("Checked") then
v:SetAttribute("Checked", true)
v.ChildAdded:Connect(function(GrandChild)
if GrandChild:IsA("BasePart") then
GrandChild.CanTouch = not GetValue("DisableFootprints")
end
end)
end
end
end
end,
["CustomSetup"] = function(self)
--self.DisplayTitle = self.DisplayTitle:gsub("John Doe's",RichTextGradientColor("John Doe's",{Color3.fromRGB(255, 190, 71), Color3.fromRGB(168, 3, 0),Color3.fromRGB(184, 171, 255)}))
if InGame then
InGame.ChildAdded:Connect(function(Child)
if Child:IsA("Folder") and (Child.Name):find("Shadows") then
task.wait()
for i,v in Child:GetChildren() do
if v:IsA("BasePart") then
v.CanTouch = not GetValue("DisableFootprints")
end
end
if not Child:GetAttribute("Checked") then
Child:SetAttribute("Checked", true)
Child.ChildAdded:Connect(function(v)
if v:IsA("BasePart") then
v.CanTouch = not GetValue("DisableFootprints")
end
end)
end
end
end)
end
end
},
["SmallerSpikeCollisions"] = {
["DisplayDescription"] = "Makes spike collisions smaller for john doe's ability",
["DisplayTitle"] = "Smaller Spike Collisions",
["LayoutOrder"] = 5,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["ScriptFunction"] = function(self, Value)
for i,v in InGame:GetChildren() do
if v.Name == "SpikeCollision" then
v.Size = Value and Vector3.new(11,3.5,3.5) or Vector3.new(11, 5, 5)
v.Shape = Value and Enum.PartType.Cylinder or Enum.PartType.Block
end
end
end,
["CustomSetup"] = function(self)
if InGame then
InGame.ChildAdded:Connect(function(Child)
if Child.Name == "SpikeCollision" then
task.delay(3.5,function()
Child.Size = GetValue("SmallerSpikeCollisions") and Vector3.new(11,3.5,3.5) or Vector3.new(11, 5, 5)
Child.Shape = GetValue("SmallerSpikeCollisions") and Enum.PartType.Cylinder or Enum.PartType.Block
end)
end
end)
end
end
},
["EnableJumping"] = {
["DisplayDescription"] = "Enables Jumping for when its disabled",
["DisplayTitle"] = "Enable Jumping",
["LayoutOrder"] = 7,
["Savable"] = false,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["HandleAllowJumping"] = function(self,Value)
if LocalHumanoid and not LocalHumanoid:GetAttribute("JumpingConnection") then
if Value then
if not LocalHumanoid:GetAttribute("JumpingConnection") then
LocalHumanoid:SetAttribute("JumpingConnection",LocalHumanoid.JumpPower)
else
return
end
local Connection;Connection = LocalHumanoid.StateChanged:Connect(function(old,new)
if LocalHumanoid.FloorMaterial == Enum.Material.Air then
return
end
if LocalCharacter.Parent ~= "Spectator" and new == Enum.HumanoidStateType.Jumping or new == Enum.HumanoidStateType.Freefall and LocalHumanoid.JumpPower > 0 and (GetValue("EnableJumping") or false) and not LocalHumanoid:GetAttribute("CDJump") then
if not(GetValue("EnableJumping")) then
Connection:Disconnect()
LocalHumanoid.JumpPower = LocalHumanoid:GetAttribute("JumpingConnection") or 0
LocalHumanoid:SetAttribute("JumpingConnection",nil)
return
end
LocalHumanoid:GetPropertyChangedSignal("FloorMaterial"):Wait()
if LocalHumanoid.FloorMaterial == Enum.Material.Air then
LocalHumanoid.JumpPower = 0
else
return
end
LocalHumanoid:SetAttribute("CDJump",true)
task.wait(1.25)
if GetValue("EnableJumping") then
LocalHumanoid.JumpPower = 47
else
Connection:Disconnect()
LocalHumanoid.JumpPower = LocalHumanoid:GetAttribute("JumpingConnection") or 0
LocalHumanoid:SetAttribute("JumpingConnection",nil)
end
LocalHumanoid:SetAttribute("CDJump",nil)
end
end)
end
LocalHumanoid.JumpPower = Value and 47 or 0
end
end,
["ScriptFunction"] = function(self, Value)
self:HandleAllowJumping(Value)
end,
["CharacterAdded"] = function(self)
task.delay(0.25,self.HandleAllowJumping,self,GetValue("EnableJumping"))
end
},
["StaminaPreset"] = {
["DisplayDescription"] = "Select a Stamina Preset",
["DisplayTitle"] = "Stamina Preset",
["LayoutOrder"] = 8,
["Savable"] = true,
["InstanceType"] = "StringValue",
["DefaultInstanceValue"] = "Original",
["Requirement"] = "require",
["ExtraData"] = {
["Options"] = "Original|Realistic|Semi-Realistic|Infinite"
},
["OnLoop"] = function()
local StaminaPreset = GetValue("StaminaPreset")
if StaminaPreset ~= "Original" and MainModule and MainModule.MaxStamina then
if StaminaPreset == "Infinite" then
rawset(MainModule, "Stamina", MainModule.MaxStamina)
else
local MaxStamina = MainModule.MaxStamina
if MainModule.Stamina < MaxStamina * 0.8 then
rawset(MainModule, "Stamina", math.min(MainModule.Stamina + MaxStamina * (StaminaPreset == "Semi-Realistic" and 0.005 or 0.0025), MaxStamina))
end
end
end
end,
["CharacterAdded"] = function(self)
if TempUI then
task.spawn(function()
local AmountUI = (TempUI:FindFirstChild("PlayerInfo") or TempUI:WaitForChild("PlayerInfo")) and TempUI.PlayerInfo:FindFirstChild("Bars") and TempUI.PlayerInfo.Bars:FindFirstChild("Stamina") and TempUI.PlayerInfo.Bars.Stamina:FindFirstChild("Amount")
if AmountUI and MainModule then
local OriginalAmountUI = AmountUI
local InfiniteStaminaElement = OriginalAmountUI:Clone()
local CenterStaminaCounter = TempUI:FindFirstChild("CenterStaminaCounter")
local CenterDrainBar = TempUI:FindFirstChild("Drain")
if CenterStaminaCounter then
CenterStaminaCounter:SetAttribute("WasVisible", CenterStaminaCounter.Visible)
CenterStaminaCounter.Visible = GetValue("StaminaPreset") ~= "Infinite" and CenterStaminaCounter:GetAttribute("WasVisible")
end
if CenterDrainBar then
CenterDrainBar:SetAttribute("WasVisible", CenterDrainBar.Visible)
CenterDrainBar.Visible = GetValue("StaminaPreset") ~= "Infinite" and CenterDrainBar:GetAttribute("WasVisible")
end
InfiniteStaminaElement.Name = "InfiniteAmount"
InfiniteStaminaElement.Text = "∞"
InfiniteStaminaElement.Parent = OriginalAmountUI.Parent
InfiniteStaminaElement.Visible = GetValue("StaminaPreset") == "Infinite"
InfiniteStaminaElement.Size = UDim2.new(0.225,0,0.7,14)
OriginalAmountUI.Visible = GetValue("StaminaPreset") ~= "Infinite"
if not GetValue("StaminaPreset",true) then return end
local InfViewConnection;InfViewConnection = GetValue("StaminaPreset",true):GetPropertyChangedSignal("Value"):Connect(function()
if InfiniteStaminaElement and OriginalAmountUI then
InfiniteStaminaElement.Visible = GetValue("StaminaPreset") == "Infinite"
OriginalAmountUI.Visible = GetValue("StaminaPreset") ~= "Infinite"
if CenterStaminaCounter then
CenterStaminaCounter.Visible = GetValue("StaminaPreset") ~= "Infinite" and CenterStaminaCounter:GetAttribute("WasVisible")
end
if CenterDrainBar then
CenterDrainBar.Visible = GetValue("StaminaPreset") ~= "Infinite" and CenterDrainBar:GetAttribute("WasVisible")
end
else
InfViewConnection:Disconnect()
end
end)
TempUI.Destroying:Once(function()
InfViewConnection:Disconnect()
end)
end
end)
for i,v in TempUI:QueryDescendants("#redFlash,#injuredVignette") do
v.Visible = not GetValue("HideInjury")
end
end
end
},
["AntiSlowness"] = {
["DisplayDescription"] = "Removes all types of Slowness Effects",
["DisplayTitle"] = "Anti Slowness",
["LayoutOrder"] = 9,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["Check"] = function(self,ValueInstance)
if GetValue("AntiSlowness") then
if ValueInstance and ValueInstance.Name ~= "Sprinting" then
if ValueInstance.Name == "DirectionalMovement" or ValueInstance.Name == "FixingGenerator" or ValueInstance.Name:upper() == "ENRAGED" then
if ValueInstance.Value < 1 then
ValueInstance.Value = 1
end
elseif ValueInstance.Value > 0.05 and ValueInstance.Value < 1 then
--ValueInstance:Destroy()
--else
ValueInstance.Value = 1
ValueInstance:GetPropertyChangedSignal("Value"):Connect(function()
if ValueInstance.Value > 0.05 and ValueInstance.Value < 1 then
ValueInstance.Value = 1
--ValueInstance:Destroy()
end
end)
end
end
end
end,
["ScriptFunction"] = function(self,Value)
if not Value or not SpeedMultipliers then
return
end
for i,Child in SpeedMultipliers:GetChildren() do
self:Check(Child)
end
end,
["CharacterAdded"] = function(self)
if SpeedMultipliers ~= nil and typeof(SpeedMultipliers) == "Instance" then
SpeedMultipliers.ChildAdded:Connect(function(Child)
if not Child:IsA("NumberValue") or Child.Name == "Sprinting" then
return
end
self:Check(Child)
Child:GetPropertyChangedSignal("Value"):Connect(function()
self:Check(Child)
end)
end)
end
end
},
["AnimationChanger"] = {
["DisplayDescription"] = "Select a character/skin to override the animations",
["DisplayTitle"] = "Animation Changer",
["LayoutOrder"] = 10,
["Savable"] = false,
["InstanceType"] = "StringValue",
["DefaultInstanceValue"] = "Original",
["Requirement"] = "require",
["ExtraData"] = {
["Options"] = "Original|Jason|Jason IV|Slasher|Slasher IV|c00lkidd|c00lkidd IV|c0llabk1dd|John Doe|JohnDoe IV|Noli|Noli IV|1x1x1x1|1x1x1x1 IV|Nosferatu|Azure|Dusekkar|Artful|Erlking|Herobrine|Sukuna|Retro|Mafioso|The Admin|Deceiver|The Pestilence|Celebration|P4rtyPwny|Alfred Drevis|Killer Kyle|Pursuer|TV TIME|c00lskeleton95|dragondudes3|Eye of The Abyss|White Pumpkin|Nerfed Demoman|Voidbound test|Sniper|Little Guy|Crouch|NPC Zombie|Default Roblox"
},
["ScriptFunction"] = function(self, Value, Starting)
if Starting then return end
if Value == "Original" then
GetValue("ChangeInLobby",true).Value = false
if LocalAnimator then
local AllTracks = LocalAnimator:GetPlayingAnimationTracks()
for i,v in AllTracks do
v:Stop(0)
end
end
if LastAnimOriginalUsed then
LastAnimOriginalUsed:Play(0)
end
else
if LocalAnimator and CanPlayOverrideAnim(LocalCharacter) then
local AllTracks = LocalAnimator:GetPlayingAnimationTracks()
for i,v in AllTracks do
v:Stop(0)
end
UpdateAnim(LocalHumanoid)
end
end
end
},
["ChangeInLobby"] = {
["DisplayDescription"] = "If it should change the animation in the lobby too",
["DisplayTitle"] = "Change In Lobby",
["LayoutOrder"] = 11,
["Savable"] = false,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["Requirement"] = "AnimationChanger~Original",
["ScriptFunction"] = function(self, Value, Starting)
if Starting then return end
local CanPlay = CanPlayOverrideAnim(LocalCharacter)
if Value == true then
UpdateAnim(LocalHumanoid)
else
if LocalAnimator then
local AllTracks = LocalAnimator:GetPlayingAnimationTracks()
for i,v in AllTracks do
v:Stop(0)
end
if LastAnimOriginalUsed then
LastAnimOriginalUsed:Play(0)
end
UpdateAnim(LocalHumanoid)
end
end
end
},
["NoliControl"] = {
["DisplayDescription"] = "Allows you to have better control of Void Rush Ability",
["DisplayTitle"] = "Better Void Rush",
["LayoutOrder"] = 12,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["Requirement"] = "require",
["ScriptFunction"] = function(self, Value, Starting)
if not Value and Starting then return end
if NoliConfig then
for i, Entry in {
{Name = "InitialTurnDuration", Value = 0.005, Default = 1.5},
{Name = "TurnSpeed", Value = 10000, Default = 1},
{Name = "InitialTurnMult", Value = 1000, Default = 6.6},
} do
local CurrentValue, Key, Parent = TableValueFind(NoliConfig, function(i, v) return type(i) == "string" and i:find(Entry.Name) and not i:find(Entry.Name .. "OG") end)
if Key and Parent then
if Value then
if not Parent[Key .. "OG"] then
Parent[Key .. "OG"] = Parent[Key]
end
Parent[Key] = Entry.Value
else
Parent[Key] = Parent[Key .. "OG"] or Entry.Default
end
end
end
if LocalCharacter and LocalCharacter.Parent.Name == "Killers" and not workspace:GetAttribute("NotifCD") then
StarterGui:SetCore("SendNotification", {
Title = "Information",
Text = "Changes only apply the time you become the killer",
Duration = 5
})
workspace:SetAttribute("NotifCD", true)
task.delay(10, function()
workspace:SetAttribute("NotifCD", nil)
end)
end
elseif not NoliConfig and not Starting then
self.Instance:SetAttribute("Requirement",true)
StarterGui:SetCore("SendNotification", {
Title = "Information",
Text = `Failed to find Noli's Config Module{GetValue("OfficialGame") and ". Please Report This issue!" or ""}`,
Duration = GetValue("OfficialGame") and 12 or 7
})
end
end
},
["ControllableDash"] = {
["DisplayDescription"] = "Allows you to control where the dash goes just like Void Rush Ability",
["DisplayTitle"] = "Make Coolkidd's Dash Controllable",
["LayoutOrder"] = 13,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["CharacterAdded"] = function(self)
LocalRoot.ChildAdded:Connect(function(Child)
if Child:IsA("LinearVelocity") and LocalHumanoid then
local OriginalVelocity = Child.LineDirection
local OriginalVelocityMag = Child.LineDirection.Magnitude
for i,v in SpeedMultipliers:GetChildren() do
if v.Name == "HinderedMovement" and GetValue("ControllableDash") and v.Value == 0 then
v.Value = 0.005
end
end
local function UpdateVelocity()
if GetValue("ControllableDash") and (LocalCharacter.Name:gsub("0","O"):lower():find("coolkid")) and LocalHumanoid.MoveDirection ~= Vector3.zero then
Child.LineDirection = LocalHumanoid.MoveDirection * OriginalVelocityMag
elseif GetValue("ControllableDash") and (LocalCharacter.Name:gsub("0","O"):lower():find("coolkid")) and workspace.CurrentCamera then
local CameraDirection = Vector3.new(workspace.CurrentCamera.CFrame.LookVector.X, 0, workspace.CurrentCamera.CFrame.LookVector.Z)
Child.LineDirection = CameraDirection.Unit * OriginalVelocityMag
if Child.LineVelocity > 0 then
LocalRoot.CFrame = LocalRoot.CFrame:Lerp(CFrame.lookAt(LocalRoot.Position, LocalRoot.Position + CameraDirection),0.05)
end
else
Child.LineDirection = OriginalVelocity
end
end
UpdateVelocity()
local Connection1;Connection1 = LocalHumanoid:GetPropertyChangedSignal("MoveDirection"):Connect(UpdateVelocity)
local Connection2;Connection2 = workspace.CurrentCamera:GetPropertyChangedSignal("CFrame"):Connect(UpdateVelocity)
Child.Destroying:Once(function()
if Connection1 then
Connection1:Disconnect()
Connection1 = nil
end
if Connection2 then
Connection2:Disconnect()
Connection2 = nil
end
end)
end
end)
end
},
["AutoBlockHitboxAllKiller"] = {
["DisplayDescription"] = "Adjust the Auto Block hitbox size for every killer (studs)",
["DisplayTitle"] = "All Killer ABH",
["LayoutOrder"] = 17,
["Savable"] = true,
["InstanceType"] = "NumberValue",
["DefaultInstanceValue"] = 0,
["Requirement"] = "AutoBlock",
["ExtraData"] = {
["MaxValue"] = 5,
["MinValue"] = -3,
["Step"] = 0.25
}
},
["AutoBlockHitboxSlasher"] = {
["DisplayDescription"] = "Slasher ABH size adjustment (studs)",
["DisplayTitle"] = "Slasher ABH",
["LayoutOrder"] = 18,
["Savable"] = true,
["InstanceType"] = "NumberValue",
["DefaultInstanceValue"] = 0,
["Requirement"] = "AutoBlock",
["ExtraData"] = { ["MaxValue"] = 5, ["MinValue"] = -3, ["Step"] = 0.25 }
},
["AutoBlockHitboxJohnDoe"] = {
["DisplayDescription"] = "John Doe ABH size adjustment (studs)",
["DisplayTitle"] = "John Doe ABH",
["LayoutOrder"] = 19,
["Savable"] = true,
["InstanceType"] = "NumberValue",
["DefaultInstanceValue"] = 0,
["Requirement"] = "AutoBlock",
["ExtraData"] = { ["MaxValue"] = 5, ["MinValue"] = -3, ["Step"] = 0.25 }
},
["AutoBlockHitboxSixer"] = {
["DisplayDescription"] = "Sixer ABH size adjustment (studs)",
["DisplayTitle"] = "Sixer ABH",
["LayoutOrder"] = 20,
["Savable"] = true,
["InstanceType"] = "NumberValue",
["DefaultInstanceValue"] = 0,
["Requirement"] = "AutoBlock",
["ExtraData"] = { ["MaxValue"] = 5, ["MinValue"] = -3, ["Step"] = 0.25 }
},
["AutoBlockHitboxNosferatu"] = {
["DisplayDescription"] = "Nosferatu ABH size adjustment (studs)",
["DisplayTitle"] = "Nosferatu ABH",
["LayoutOrder"] = 21,
["Savable"] = true,
["InstanceType"] = "NumberValue",
["DefaultInstanceValue"] = 0,
["Requirement"] = "AutoBlock",
["ExtraData"] = { ["MaxValue"] = 5, ["MinValue"] = -3, ["Step"] = 0.25 }
},
["AutoBlockHitboxNoli"] = {
["DisplayDescription"] = "Noli ABH size adjustment (studs)",
["DisplayTitle"] = "Noli ABH",
["LayoutOrder"] = 22,
["Savable"] = true,
["InstanceType"] = "NumberValue",
["DefaultInstanceValue"] = 0,
["Requirement"] = "AutoBlock",
["ExtraData"] = { ["MaxValue"] = 5, ["MinValue"] = -3, ["Step"] = 0.25 }
},
["AutoBlockHitboxC00lkidd"] = {
["DisplayDescription"] = "C00lkidd ABH size adjustment (studs)",
["DisplayTitle"] = "C00lkidd ABH",
["LayoutOrder"] = 23,
["Savable"] = true,
["InstanceType"] = "NumberValue",
["DefaultInstanceValue"] = 0,
["Requirement"] = "AutoBlock",
["ExtraData"] = { ["MaxValue"] = 5, ["MinValue"] = -3, ["Step"] = 0.25 }
},
["AutoBlockHitboxAzure"] = {
["DisplayDescription"] = "Azure ABH size adjustment (studs)",
["DisplayTitle"] = "Azure ABH",
["LayoutOrder"] = 24,
["Savable"] = true,
["InstanceType"] = "NumberValue",
["DefaultInstanceValue"] = 0,
["Requirement"] = "AutoBlock",
["ExtraData"] = { ["MaxValue"] = 5, ["MinValue"] = -3, ["Step"] = 0.25 }
},
["AutoBlockHitbox1x1x1x1"] = {
["DisplayDescription"] = "1x1x1x1 ABH size adjustment (studs)",
["DisplayTitle"] = "1x1x1x1 ABH",
["LayoutOrder"] = 25,
["Savable"] = true,
["InstanceType"] = "NumberValue",
["DefaultInstanceValue"] = 0,
["Requirement"] = "AutoBlock",
["ExtraData"] = { ["MaxValue"] = 5, ["MinValue"] = -3, ["Step"] = 0.25 }
},
["AutoBlockHitboxGolemslash"] = {
["DisplayDescription"] = "Golem Slash ABH size adjustment (studs)",
["DisplayTitle"] = "Golem Slash ABH",
["LayoutOrder"] = 26,
["Savable"] = true,
["InstanceType"] = "NumberValue",
["DefaultInstanceValue"] = 0,
["Requirement"] = "AutoBlock",
["ExtraData"] = { ["MaxValue"] = 5, ["MinValue"] = -3, ["Step"] = 0.25 }
},
["WallCheck"] = {
["DisplayDescription"] = "Prevents Auto Block and Drag Block from firing when a solid wall is between you and the killer",
["DisplayTitle"] = "WallCheck",
["LayoutOrder"] = 14.9,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = true
},
["AutoBlock"] = {
["DisplayDescription"] = "Uses the block ability automatically when about to get hit (REQUIRES GOOD PING)",
["DisplayTitle"] = "Guest1337 Auto Block",
["LayoutOrder"] = 15,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["ScriptFunction"] = function(self, Value)
local BlockAbilityUI = MainUI and MainUI:FindFirstChild("AbilityContainer") and MainUI:FindFirstChild("AbilityContainer"):FindFirstChild("Block")
local AutoImage = BlockAbilityUI and BlockAbilityUI:FindFirstChild("AutoImage")
if Value and AutoImage then
AutoImage.Visible = true
elseif AutoImage then
AutoImage.Visible = false
end
end,
["HandleKiller"] = function(self,Killer)
local BlockableAttacks = {"slash","enragedslash","stab","attack","punch",--[["behead",]]"swing","golemslash"}
local CustomHitboxes = {
["golemslash"] = {
Size = Vector3.new(6, 2, 7),
Offset = CFrame.new(0,0,-5.5)
},
-- Patch 92 hitbox values, excluding c00lkidd as requested.
["slasher"] = {
Size = Vector3.new(5, 6.75, 3),
Offset = CFrame.new(0,0,-3.5),
Linger = 0.25
},
["johndoe"] = {
Size = Vector3.new(4, 5.75, 4),
Offset = CFrame.new(0,0,-3.5)
},
["noli"] = {
Size = Vector3.new(5.75, 5.75, 4.75),
Offset = CFrame.new(0,0,-3.5),
Linger = 0.3
},
["sixer"] = {
Size = Vector3.new(5, 5, 6),
Offset = CFrame.new(0,0,-3.5)
},
["nosferatu"] = {
Size = Vector3.new(3, 5.75, 3),
Offset = CFrame.new(0,0,-3.5),
Linger = 0.6
},
}
local FireSignal = GetFunction(firesignal,FireSignal)
local SelfParams = OverlapParams.new()
SelfParams.MaxParts = 1
SelfParams.FilterType = Enum.RaycastFilterType.Include
local UseActorAbility = Network and Network:FindFirstChildOfClass("RemoteEvent")
local ShowHitboxesSetting = PlayerData and PlayerData:FindFirstChild("Settings") and PlayerData.Settings:FindFirstChild("ShowHitboxes",true)
local Humanoid = Killer:FindFirstChildOfClass("Humanoid") or Killer:WaitForChild("Humanoid")
local QueryHitbox = Killer:FindFirstChild("QueryHitbox") or Killer:WaitForChild("QueryHitbox")
local KillerAnimator = Humanoid:FindFirstChildOfClass("Animator")
-- Patch 200: recognize C00lkidd skins by their model name or
-- character/skin attributes instead of requiring the model to be
-- named exactly "c00lkidd".
local function IsC00lkiddKiller(Character)
if not Character then return false end
local function Matches(Value)
if type(Value) ~= "string" then return false end
local Name = string.lower(Value)
local Compact = Name:gsub("[%s_%-]", "")
if Compact == "c00lkidd"
or Compact:find("^c00lkidd")
or Compact == "c0llabk1dd"
or Compact == "c00lskeleton95"
or Compact == "dragondudes3" then
return true
end
return false
end
if Matches(Character.Name) then return true end
for _, AttributeName in {
"Killer", "KillerName", "Character", "CharacterName",
"Skin", "SkinName", "DisplayName", "ActorDisplayName"
} do
if Matches(Character:GetAttribute(AttributeName)) then
return true
end
end
return false
end
-- C00lkidd ABH is triggered by the M1 animation, not attack sounds.
local C00lkiddM1AnimationId = "121858217776572"
local C00lkiddM1Tracks = {}
local RunC00lkiddSoundAutoBlock
if KillerAnimator then
KillerAnimator.AnimationPlayed:Connect(function(Track)
local Animation = Track and Track.Animation
local AnimationId = Animation and tostring(Animation.AnimationId or ""):match("%d+")
if AnimationId == C00lkiddM1AnimationId then
C00lkiddM1Tracks[Track] = true
Track.Stopped:Connect(function()
C00lkiddM1Tracks[Track] = nil
end)
task.spawn(function() RunC00lkiddSoundAutoBlock(true) end)
end
end)
end
local function IsC00lkiddM1Playing()
for Track in pairs(C00lkiddM1Tracks) do
if Track.IsPlaying then return true end
C00lkiddM1Tracks[Track] = nil
end
return false
end
RunC00lkiddSoundAutoBlock = function(RequireM1Animation)
if not GetValue("AutoBlock") or IsHelplessActive() then return end
if IsWallCheckBlocked(Killer) then return end
if not IsC00lkiddKiller(Killer) then return end
if not LocalCharacter or not LocalCharacter:FindFirstChild("QueryHitbox") or LocalCharacter.Parent ~= SurvivorsFolder then return end
local AbilityContainer = MainUI and MainUI:FindFirstChild("AbilityContainer")
local BlockButton = AbilityContainer and AbilityContainer:FindFirstChild("Block")
if not BlockButton then return end
local CustomHitbox = CustomHitboxes["c00lkidd"]
local KillerNameLower = Killer.Name:lower()
for i = 1, 9 do
if IsHelplessActive() or not GetValue("AutoBlock") then return end
-- This specific M1 uses animation detection; other listed sounds keep audio detection.
if RequireM1Animation and not IsC00lkiddM1Playing() then return end
SelfParams.FilterDescendantsInstances = {LocalCharacter:FindFirstChild("QueryHitbox")}
local Part = Instance.new("Part")
Part.Name = "KillerDetectHitbox"
Part.Color = BrickColor.new("Really black").Color
local BaseHitboxSize = (CustomHitbox and CustomHitbox["Size"] or Vector3.new(5.2, 6, 5.65)) * 2.2
local GlobalHitboxAdjustment = GetCurrentHitboxAdjustment("AutoBlockHitboxAllKiller")
local IndividualHitboxAdjustment = GetCurrentHitboxAdjustment("AutoBlockHitboxC00lkidd")
local TotalHitboxAdjustment = GlobalHitboxAdjustment + IndividualHitboxAdjustment
Part.Size = BaseHitboxSize + Vector3.new(TotalHitboxAdjustment, TotalHitboxAdjustment, TotalHitboxAdjustment)
Part.Size = Vector3.new(math.max(0.1, Part.Size.X), math.max(0.1, Part.Size.Y), math.max(0.1, Part.Size.Z))
local DetectionOffset = CustomHitbox and CustomHitbox["Offset"] or CFrame.new(0,0,-3.5)
if GetValue("DragBlock", false) then
Part.Size = Part.Size + Vector3.new(0,0,2)
Part.CFrame = QueryHitbox.CFrame * DetectionOffset * CFrame.new(0,0,-1)
else
Part.CFrame = QueryHitbox.CFrame * DetectionOffset
end
if IsC00lkiddKiller(Killer) then
-- Reduce only the forward reach by 2 studs while keeping the rear edge fixed.
Part.Size = Vector3.new(
math.max(0.1, Part.Size.X),
math.max(0.1, Part.Size.Y),
math.max(0.1, Part.Size.Z - 2)
)
Part.CFrame = Part.CFrame * CFrame.new(0, 0, 1)
end
Part.CanCollide = false
Part.Anchored = true
Part.CastShadow = false
Part.Material = Enum.Material.ForceField
Part.Transparency = AreHitboxesShown() and 0.1 or 1
Part.Parent = GetHitboxesFolder()
Debris:AddItem(Part, 0.4)
local Hitbox = workspace:GetPartsInPart(Part, SelfParams)
if #Hitbox > 0 and not IsWallCheckBlocked(Killer) and not IsDragBlockCooldownActive(BlockButton) then
if FireSignal and BlockButton then
FireSignal(BlockButton.MouseButton1Click)
task.defer(function()
task.wait()
UpdateDragBlockCooldownFromBlockUI(BlockButton)
end)
elseif GetValue("OfficialGame") and UseActorAbility then
UseActorAbility:FireServer("UseActorAbility", {"Block"})
elseif UseActorAbility then
UseActorAbility:FireServer("UseActorAbility", "Block")
UseActorAbility:FireServer("UseActorAbility", {"Block"})
end
if GetValue("DragBlock", false) and not IsHelplessActive() then
DragBlockAttackingKiller(Killer, "DragBlock", true)
end
break
end
task.wait(0.02)
end
end
-- Keep C00lkidd's other audio detections; only 75330693422988
-- is excluded because it is detected through the M1 animation instead.
local C00lkiddAttackSounds = {
["80516583309685"] = true,
["84307400688050"] = true,
["82221759983649"] = true,
["105516183226360"] = true,
["124234993291213"] = true,
["128195973631079"] = true
}
local C00lkiddSoundConnections = {}
local C00lkiddSoundLastTrigger = {}
local function GetC00lkiddSoundAssetId(Sound)
if not Sound or not Sound:IsA("Sound") then return nil end
return tostring(Sound.SoundId or ""):match("%d+")
end
local function WatchC00lkiddSound(Sound)
if not Sound or not Sound:IsA("Sound") then return end
local SoundId = GetC00lkiddSoundAssetId(Sound)
if not SoundId or not C00lkiddAttackSounds[SoundId] or C00lkiddSoundConnections[Sound] then return end
local function Trigger()
if not Sound.Parent or not Sound.Playing then return end
if not GetValue("AutoBlock") or IsHelplessActive() then return end
local Now = os.clock()
if C00lkiddSoundLastTrigger[Sound] and Now - C00lkiddSoundLastTrigger[Sound] < 0.08 then return end
C00lkiddSoundLastTrigger[Sound] = Now
task.spawn(function() RunC00lkiddSoundAutoBlock(false) end)
end
C00lkiddSoundConnections[Sound] = Sound:GetPropertyChangedSignal("Playing"):Connect(Trigger)
if Sound.Playing then Trigger() end
end
if IsC00lkiddKiller(Killer) then
for _, Descendant in Killer:GetDescendants() do
if Descendant:IsA("Sound") then WatchC00lkiddSound(Descendant) end
end
Killer.DescendantAdded:Connect(function(Descendant)
if Descendant:IsA("Sound") then WatchC00lkiddSound(Descendant) end
end)
end
-- Treachstone is sound-only. Use the same ABH/sound logic as C00lkidd,
-- but search Workspace as well because the attack sound may not be parented
-- directly under the killer model.
local TreachstoneAttackSounds = {
["140242176732868"] = true
}
local TreachstoneSoundConnections = {}
local TreachstoneSoundLastTrigger = {}
local function GetTreachstoneSoundAssetId(Sound)
if not Sound or not Sound:IsA("Sound") then return nil end
return tostring(Sound.SoundId or ""):match("%d+")
end
local function RunTreachstoneSoundAutoBlock()
if not GetValue("AutoBlock") or IsHelplessActive() then return end
if IsWallCheckBlocked(Killer) then return end
if string.lower(Killer.Name or "") ~= "treachstone" then return end
if not LocalCharacter or not LocalCharacter:FindFirstChild("QueryHitbox") or LocalCharacter.Parent ~= SurvivorsFolder then return end
local AbilityContainer = MainUI and MainUI:FindFirstChild("AbilityContainer")
local BlockButton = AbilityContainer and AbilityContainer:FindFirstChild("Block")
if not BlockButton then return end
local CustomHitbox = CustomHitboxes["johndoe"]
local KillerNameLower = Killer.Name:lower()
for i = 1, 12 do
if IsHelplessActive() or not GetValue("AutoBlock") then return end
SelfParams.FilterDescendantsInstances = {LocalCharacter:FindFirstChild("QueryHitbox")}
local Part = Instance.new("Part")
Part.Name = "KillerDetectHitbox"
Part.Color = BrickColor.new("Really black").Color
local BaseHitboxSize = (CustomHitbox and CustomHitbox["Size"] or Vector3.new(5.2, 6, 5.65)) * 2.2
local GlobalHitboxAdjustment = GetCurrentHitboxAdjustment("AutoBlockHitboxAllKiller")
local IndividualHitboxAdjustment = GetCurrentHitboxAdjustment("AutoBlockHitboxJohnDoe")
local TotalHitboxAdjustment = GlobalHitboxAdjustment + IndividualHitboxAdjustment
Part.Size = BaseHitboxSize + Vector3.new(TotalHitboxAdjustment, TotalHitboxAdjustment, TotalHitboxAdjustment)
Part.Size = Vector3.new(math.max(0.1, Part.Size.X), math.max(0.1, Part.Size.Y), math.max(0.1, Part.Size.Z))
local DetectionOffset = CustomHitbox and CustomHitbox["Offset"] or CFrame.new(0,0,-3.5)
if GetValue("DragBlock", false) then
Part.Size = Part.Size + Vector3.new(0,0,2)
Part.CFrame = QueryHitbox.CFrame * DetectionOffset * CFrame.new(0,0,-1)
else
Part.CFrame = QueryHitbox.CFrame * DetectionOffset
end
Part.CanCollide = false
Part.Anchored = true
Part.CastShadow = false
Part.Material = Enum.Material.ForceField
Part.Transparency = AreHitboxesShown() and 0.1 or 1
Part.Parent = GetHitboxesFolder()
Debris:AddItem(Part, 0.4)
local Hitbox = workspace:GetPartsInPart(Part, SelfParams)
if #Hitbox > 0 and not IsWallCheckBlocked(Killer) and not IsDragBlockCooldownActive(BlockButton) then
if FireSignal and BlockButton then
FireSignal(BlockButton.MouseButton1Click)
task.defer(function()
task.wait()
UpdateDragBlockCooldownFromBlockUI(BlockButton)
end)
elseif GetValue("OfficialGame") and UseActorAbility then
UseActorAbility:FireServer("UseActorAbility", {"Block"})
elseif UseActorAbility then
UseActorAbility:FireServer("UseActorAbility", "Block")
UseActorAbility:FireServer("UseActorAbility", {"Block"})
end
if GetValue("DragBlock", false) and not IsHelplessActive() then
DragBlockAttackingKiller(Killer, "DragBlock", true)
end
break
end
task.wait(0.02)
end
end
local function WatchTreachstoneSound(Sound)
if not Sound or not Sound:IsA("Sound") then return end
if TreachstoneSoundConnections[Sound] then return end
local function TryWatch()
local SoundId = GetTreachstoneSoundAssetId(Sound)
if not SoundId or not TreachstoneAttackSounds[SoundId] then return end
if TreachstoneSoundConnections[Sound] then return end
local function Trigger()
if not Sound.Parent or not Sound.Playing then return end
if not GetValue("AutoBlock") or IsHelplessActive() then return end
local Now = os.clock()
if TreachstoneSoundLastTrigger[Sound] and Now - TreachstoneSoundLastTrigger[Sound] < 0.08 then return end
TreachstoneSoundLastTrigger[Sound] = Now
task.spawn(RunTreachstoneSoundAutoBlock)
end
TreachstoneSoundConnections[Sound] = Sound:GetPropertyChangedSignal("Playing"):Connect(Trigger)
if Sound.Playing then Trigger() end
end
TryWatch()
Sound:GetPropertyChangedSignal("SoundId"):Connect(TryWatch)
end
if string.lower(Killer.Name or "") == "treachstone" then
-- Match C00lkidd's watcher, while also covering sounds that are
-- created outside the killer model.
for _, Descendant in workspace:GetDescendants() do
if Descendant:IsA("Sound") then
WatchTreachstoneSound(Descendant)
end
end
workspace.DescendantAdded:Connect(function(Descendant)
if Descendant:IsA("Sound") then
WatchTreachstoneSound(Descendant)
end
end)
end
if KillerAnimator then
KillerAnimator.AnimationPlayed:Connect(function(Track)
if Players:GetPlayerFromCharacter(Killer) then
local AnimationId = tostring(Track.Animation.AnimationId or "")
local NumericAnimationId = AnimationId:match("%d+")
local AnimType,KillerName = GetAnimationType(AnimationId)
-- Route only C00lkidd's specified M1 animation through the
-- shared ABH detector so Show ABH Hitbox displays it too.
if IsC00lkiddKiller(Killer) then
if NumericAnimationId == C00lkiddM1AnimationId then
AnimType = "attack"
else
AnimType = nil
end
end
-- John Doe attack animation detected from the logged animation ID.
if string.lower(Killer.Name or "") == "johndoe" and (AnimationId:match("%d+") == "87347358451124" or AnimationId:match("%d+") == "121778755277919") then
AnimType = "attack"
end
if AnimType and type(AnimType) == type("") and table.find(BlockableAttacks,AnimType:lower()) then
local CustomHitbox = CustomHitboxes[AnimType:lower()] or CustomHitboxes[Killer.Name:lower()]
-- Patch 159: show the same Auto Block hitbox while the local player is the killer.
-- This is a visualization-only preview and does not attempt to block while playing killer.
if LocalCharacter == Killer then
local PreviewHitbox = Instance.new("Part")
PreviewHitbox.Name = "KillerDetectHitboxPreview"
PreviewHitbox.Color = BrickColor.new("Really black").Color
local BasePreviewSize = (CustomHitbox and CustomHitbox["Size"] or Vector3.new(5.2, 6, 5.65)) * 2.2
local GlobalPreviewAdjustment = GetCurrentHitboxAdjustment("AutoBlockHitboxAllKiller")
local PreviewKillerNameLower = Killer.Name:lower()
local PreviewKillerHitboxKeys = {
["slasher"] = "AutoBlockHitboxSlasher",
["johndoe"] = "AutoBlockHitboxJohnDoe",
["sixer"] = "AutoBlockHitboxSixer",
["nosferatu"] = "AutoBlockHitboxNosferatu",
["noli"] = "AutoBlockHitboxNoli",
["1x1x1x1"] = "AutoBlockHitbox1x1x1x1",
["c00lkidd"] = "AutoBlockHitboxC00lkidd",
["azure"] = "AutoBlockHitboxAzure",
["treachstone"] = "AutoBlockHitboxJohnDoe",
["vanity"] = "AutoBlockHitboxSlasher",
["vanity slasher"] = "AutoBlockHitboxSlasher",
["combat initiation"] = "AutoBlockHitboxSlasher",
["combat initiation slasher"] = "AutoBlockHitboxSlasher"
}
local PreviewKillerHitboxKey = IsC00lkiddKiller(Killer) and "AutoBlockHitboxC00lkidd" or (PreviewKillerHitboxKeys[PreviewKillerNameLower] or ("AutoBlockHitbox" .. Killer.Name:gsub("[^%w]", "")))
if AnimType:lower() == "golemslash" then
PreviewKillerHitboxKey = "AutoBlockHitboxGolemslash"
end
local IndividualPreviewAdjustment = GetCurrentHitboxAdjustment(PreviewKillerHitboxKey)
local TotalPreviewAdjustment = GlobalPreviewAdjustment + IndividualPreviewAdjustment
PreviewHitbox.Size = BasePreviewSize + Vector3.new(TotalPreviewAdjustment, TotalPreviewAdjustment, TotalPreviewAdjustment)
PreviewHitbox.Size = Vector3.new(
math.max(0.1, PreviewHitbox.Size.X),
math.max(0.1, PreviewHitbox.Size.Y),
math.max(0.1, PreviewHitbox.Size.Z)
)
local PreviewOffset = CustomHitbox and CustomHitbox["Offset"] or CFrame.new(0,0,-3.5)
if GetValue("DragBlock", false) then
PreviewHitbox.Size = PreviewHitbox.Size + Vector3.new(0,0,2)
PreviewHitbox.CFrame = QueryHitbox.CFrame * PreviewOffset * CFrame.new(0,0,-1)
else
PreviewHitbox.CFrame = QueryHitbox.CFrame * PreviewOffset
end
if IsC00lkiddKiller(Killer) then
PreviewHitbox.Size = Vector3.new(
math.max(0.1, PreviewHitbox.Size.X),
math.max(0.1, PreviewHitbox.Size.Y),
math.max(0.1, PreviewHitbox.Size.Z - 2)
)
PreviewHitbox.CFrame = PreviewHitbox.CFrame * CFrame.new(0, 0, 1)
end
PreviewHitbox.CanCollide = false
PreviewHitbox.Anchored = true
PreviewHitbox.CastShadow = false
PreviewHitbox.Material = Enum.Material.ForceField
PreviewHitbox.Transparency = 0.1
PreviewHitbox.Parent = GetHitboxesFolder()
Debris:AddItem(PreviewHitbox, 0.4)
return
end
if GetValue("AutoBlock") and LocalCharacter and LocalCharacter:FindFirstChild("QueryHitbox") and LocalCharacter.Parent == SurvivorsFolder and MainUI:FindFirstChild("AbilityContainer") and MainUI:FindFirstChild("AbilityContainer"):FindFirstChild("Block") then
local CustomHitbox = CustomHitboxes[AnimType:lower()] or CustomHitboxes[Killer.Name:lower()]
for i = 1,(IsC00lkiddKiller(Killer) and 9 or (Killer.Name:lower() == "noli" and 10 or 10)) do
SelfParams.FilterDescendantsInstances = {LocalCharacter:FindFirstChild("QueryHitbox")}
local Part = Instance.new("Part")
Part.Name = "KillerDetectHitbox"
Part.Color = BrickColor.new("Really black").Color
local BaseHitboxSize = (CustomHitbox and CustomHitbox["Size"] or Vector3.new(5.2, 6, 5.65)) * 2.2
local GlobalHitboxAdjustment = GetCurrentHitboxAdjustment("AutoBlockHitboxAllKiller")
local KillerNameLower = Killer.Name:lower()
local KillerHitboxKeys = {
["slasher"] = "AutoBlockHitboxSlasher",
["johndoe"] = "AutoBlockHitboxJohnDoe",
["sixer"] = "AutoBlockHitboxSixer",
["nosferatu"] = "AutoBlockHitboxNosferatu",
["noli"] = "AutoBlockHitboxNoli",
["1x1x1x1"] = "AutoBlockHitbox1x1x1x1",
["c00lkidd"] = "AutoBlockHitboxC00lkidd",
["azure"] = "AutoBlockHitboxAzure",
["treachstone"] = "AutoBlockHitboxJohnDoe",
["vanity"] = "AutoBlockHitboxSlasher",
["vanity slasher"] = "AutoBlockHitboxSlasher",
["combat initiation"] = "AutoBlockHitboxSlasher",
["combat initiation slasher"] = "AutoBlockHitboxSlasher"
}
local KillerHitboxKey = IsC00lkiddKiller(Killer) and "AutoBlockHitboxC00lkidd" or (KillerHitboxKeys[KillerNameLower] or ("AutoBlockHitbox" .. Killer.Name:gsub("[^%w]", "")))
if AnimType and AnimType:lower() == "golemslash" then
KillerHitboxKey = "AutoBlockHitboxGolemslash"
end
local IndividualHitboxAdjustment = GetCurrentHitboxAdjustment(KillerHitboxKey)
local TotalHitboxAdjustment = GlobalHitboxAdjustment + IndividualHitboxAdjustment
Part.Size = BaseHitboxSize + Vector3.new(TotalHitboxAdjustment, TotalHitboxAdjustment, TotalHitboxAdjustment)
Part.Size = Vector3.new(
math.max(0.1, Part.Size.X),
math.max(0.1, Part.Size.Y),
math.max(0.1, Part.Size.Z)
)
local DetectionOffset = CustomHitbox and CustomHitbox["Offset"] or CFrame.new(0,0,-3.5)
if GetValue("DragBlock", false) then
-- Make the detection hitbox 2 studs deeper toward the killer/front.
-- The rear edge stays in the same place; this changes the hitbox size, not just its offset.
Part.Size = Part.Size + Vector3.new(0,0,2)
Part.CFrame = QueryHitbox.CFrame * DetectionOffset * CFrame.new(0,0,-1)
else
Part.CFrame = QueryHitbox.CFrame * DetectionOffset
end
if IsC00lkiddKiller(Killer) then
-- Reduce only the forward reach by 2 studs while keeping the rear edge fixed.
Part.Size = Vector3.new(
math.max(0.1, Part.Size.X),
math.max(0.1, Part.Size.Y),
math.max(0.1, Part.Size.Z - 2)
)
Part.CFrame = Part.CFrame * CFrame.new(0, 0, 1)
end
if i == 7 and GetValue("DragV2", false) then
-- Patch 305: Drag V2 uses a 75% larger hitbox than normal ABH for Slasher/Sixer.
local DragV2KillerName = string.lower(Killer.Name):gsub("[%s_%-]", "")
if DragV2KillerName == "slasher" or DragV2KillerName == "sixer" then
Part.Size = Part.Size * 1.75
if DragV2KillerName == "slasher" then
-- Patch 308: Slasher's forward depth matches its side width for Drag V2.
Part.Size = Vector3.new(Part.Size.X, Part.Size.Y, Part.Size.X)
end
else
Part.Size = Part.Size * 1.5
end
end
Part.CanCollide = false
Part.Anchored = true
Part.CastShadow = false
Part.Material = Enum.Material.ForceField
Part.Transparency = AreHitboxesShown() and 0.1 or 1
Part.Parent = GetHitboxesFolder()
Debris:AddItem(Part,0.4)
local Hitbox = workspace:GetPartsInPart(Part,SelfParams)
-- Auto Block can use any ABH normally. When Drag V2 is enabled by itself,
-- wait for its dedicated 7th ABH so Auto Block and Drag V2 start together there.
-- Drag Block retains its own ability to trigger on any ABH.
local DragV2Enabled = GetValue("DragV2", false)
local DragBlockEnabled = GetValue("DragBlock", false)
local IsDragV2Check = i == 7
local ShouldTriggerThisHitbox = #Hitbox > 0 and (not DragV2Enabled or IsDragV2Check or DragBlockEnabled)
if ShouldTriggerThisHitbox and not IsWallCheckBlocked(Killer) and not IsDragBlockCooldownActive(MainUI:FindFirstChild("AbilityContainer"):FindFirstChild("Block")) then
if FireSignal and MainUI:FindFirstChild("AbilityContainer"):FindFirstChild("Block") then
FireSignal(MainUI.AbilityContainer.Block.MouseButton1Click)
task.defer(function()
task.wait()
UpdateDragBlockCooldownFromBlockUI(MainUI.AbilityContainer.Block)
end)
if GetValue("DragBlock", false) and not IsHelplessActive() then
DragBlockAttackingKiller(Killer, "DragBlock", true)
elseif GetValue("DragV2", false) and not IsHelplessActive() then
DragBlockAttackingKiller(Killer, "DragV2", true)
end
break
end
if GetValue("OfficialGame") then
UseActorAbility:FireServer("UseActorAbility",{"Block"})
else
UseActorAbility:FireServer("UseActorAbility","Block")
UseActorAbility:FireServer("UseActorAbility",{"Block"})
end
if GetValue("DragBlock", false) and not IsHelplessActive() then
DragBlockAttackingKiller(Killer, "DragBlock", true)
elseif GetValue("DragV2", false) and not IsHelplessActive() then
DragBlockAttackingKiller(Killer, "DragV2", true)
end
break
end
task.wait(0.02)
end
end
end
end
end)
end
end,
["SetupUI"] = function(AbilityContainer)
if AbilityContainer.Name == "AbilityContainer" then
if AbilityContainer:FindFirstChild("Block") and not AbilityContainer:FindFirstChild("Block"):FindFirstChild("AutoImage") then
local AutoImage = Instance.new("ImageLabel")
AutoImage.Name = "AutoImage"
AutoImage.Interactable = false
AutoImage.Parent = AbilityContainer:FindFirstChild("Block")
AutoImage.Image = "rbxassetid://114159864966636"
AutoImage.BackgroundTransparency = 1
AutoImage.Size = UDim2.fromScale(0.8,0.8)
AutoImage.Position = UDim2.fromScale(0.5,0)
AutoImage.AnchorPoint = Vector2.new(0.5,0.4)
AutoImage.Visible = GetValue("AutoBlock") and LocalCharacter.Parent.Name:find("Survi")
end
end
end,
["CustomSetup"] = function(self)
self.DisplayTitle = self.DisplayTitle:gsub("Guest1337",RichTextGradientColor("Guest1337",{Color3.fromRGB(16, 47, 185), Color3.fromRGB(146, 202, 93)}))
if MainUI:FindFirstChild("AbilityContainer") then
self:SetupUI(MainUI:FindFirstChild("AbilityContainer"))
end
MainUI.ChildAdded:Connect(self.SetupUI)
if KillersFolder then
KillersFolder.ChildAdded:Connect(function(Killer)
self:HandleKiller(Killer)
end)
for i,Killer in KillersFolder:GetChildren() do self:HandleKiller(Killer) end
end
end
},
["PunchWait"] = {
["DisplayDescription"] = "How long Auto Punch waits after a successful block before punching (seconds)",
["DisplayTitle"] = "Punch Wait",
["LayoutOrder"] = 14.1,
["Savable"] = true,
["InstanceType"] = "NumberValue",
["DefaultInstanceValue"] = 0.15,
["Requirement"] = "AutoPunch",
["ExtraData"] = {
["MaxValue"] = 1,
["MinValue"] = 0,
["Step"] = 0.05
}
},
["AutoPunch"] = {
["DisplayDescription"] = "Uses the punch ability when you block successfully",
["DisplayTitle"] = "Guest1337 Auto Punch",
["LayoutOrder"] = 14,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["ScriptFunction"] = function(self, Value)
local BlockAbilityUI = MainUI and MainUI:FindFirstChild("AbilityContainer") and MainUI:FindFirstChild("AbilityContainer"):FindFirstChild("Punch")
local AutoImage = BlockAbilityUI and BlockAbilityUI:FindFirstChild("AutoImage")
if Value and AutoImage then
AutoImage.Visible = true
elseif AutoImage then
AutoImage.Visible = false
end
end,
["SetupUI"] = function(AbilityContainer)
if AbilityContainer.Name == "AbilityContainer" then
if AbilityContainer:FindFirstChild("Punch") and not AbilityContainer:FindFirstChild("Punch"):FindFirstChild("AutoImage") then
local AutoImage = Instance.new("ImageLabel")
AutoImage.Name = "AutoImage"
AutoImage.Interactable = false
AutoImage.Parent = AbilityContainer:FindFirstChild("Punch")
AutoImage.Image = "rbxassetid://114159864966636"
AutoImage.BackgroundTransparency = 1
AutoImage.Size = UDim2.fromScale(0.8,0.8)
AutoImage.Position = UDim2.fromScale(0.5,0)
AutoImage.AnchorPoint = Vector2.new(0.5,0.4)
AutoImage.Visible = GetValue("AutoPunch") and LocalCharacter.Parent.Name:find("Survi")
end
end
end,
["GetClosestKiller"] = function()
local Distance = 55
local SelectedKiller
for i,v in KillersFolder:GetChildren() do
if Players:GetPlayerFromCharacter(v) and LocalRoot and v:FindFirstChild("HumanoidRootPart") and (v:FindFirstChild("HumanoidRootPart").Position - LocalRoot.Position).Magnitude < Distance then
Distance = (v:FindFirstChild("HumanoidRootPart").Position - LocalRoot.Position).Magnitude
SelectedKiller = v
end
end
return SelectedKiller,Distance
end,
["CharacterAdded"] = function(self)
local FireSignal = GetFunction(firesignal,FireSignal)
local UseActorAbility = Network and Network:FindFirstChildOfClass("RemoteEvent")
if not LocalHumanoid then return warn("no humanoid found") end
LocalCharacter:GetAttributeChangedSignal("TimesHit"):Connect(function()
if GetValue("AutoPunch") and SpeedMultipliers:FindFirstChild("GuestBlocking") and LocalHumanoid:GetAttribute("Overheal") ~= nil and LocalHumanoid:GetAttribute("Overheal") >= 10 and (self:GetClosestKiller()) then
-- Auto Punch takes priority over dragging the player
-- toward the killer. Stop follow before the Punch Wait.
StopCurrentDragBlockFollow()
-- Patch 173: read the current Punch Wait slider directly each trigger.
local PunchWaitValue = PlusFolderSettings and PlusFolderSettings:FindFirstChild("PunchWait", true)
local PunchWait = math.clamp(tonumber(PunchWaitValue and PunchWaitValue.Value) or 0.15, 0, 1)
if PunchWait > 0 then
task.wait(PunchWait)
end
LocalCharacter:SetAttribute("DisableShiftLockMovement",true)
if FireSignal and MainUI:FindFirstChild("AbilityContainer"):FindFirstChild("Punch") then
FireSignal(MainUI.AbilityContainer.Punch.MouseButton1Click)
else
if GetValue("OfficialGame") then
UseActorAbility:FireServer("UseActorAbility",{"Punch"})
else
UseActorAbility:FireServer("UseActorAbility","Punch")
UseActorAbility:FireServer("UseActorAbility",{"Punch"})
end
end
local CameraTarget
-- Patch 178: keep Auto Punch facing locked to the killer for the full 0.5s.
-- Do not depend on PunchAbility still existing; the ability can end before the aim window.
local LookAtUntil = os.clock() + 0.5
local PreviousAutoRotate = LocalHumanoid.AutoRotate
LocalHumanoid.AutoRotate = false
LocalCharacter:SetAttribute("DisableShiftLockMovement",true)
local function FaceClosestKiller()
if not LocalRoot or not LocalRoot.Parent or not LocalHumanoid or LocalHumanoid.Health <= 0 then
return
end
local ClosestKiller = self:GetClosestKiller()
if not ClosestKiller then return end
local KillerRoot = ClosestKiller:FindFirstChild("HumanoidRootPart")
if not KillerRoot then return end
local RootPosition = LocalRoot.Position
local TargetPosition = Vector3.new(KillerRoot.Position.X, RootPosition.Y, KillerRoot.Position.Z)
if (TargetPosition - RootPosition).Magnitude <= 0.05 then return end
local TargetCFrame = CFrame.lookAt(RootPosition, TargetPosition)
LocalRoot.CFrame = TargetCFrame
end
FaceClosestKiller()
CameraTarget = RunService.RenderStepped:Connect(function()
if os.clock() >= LookAtUntil or not LocalCharacter.Parent then
if CameraTarget then
CameraTarget:Disconnect()
CameraTarget = nil
end
return
end
FaceClosestKiller()
end)
repeat
task.wait(0.05)
until os.clock() >= LookAtUntil or not LocalCharacter.Parent or not LocalHumanoid or LocalHumanoid.Health <= 0
if CameraTarget then
CameraTarget:Disconnect()
CameraTarget = nil
end
LocalHumanoid.AutoRotate = PreviousAutoRotate
LocalCharacter:SetAttribute("DisableShiftLockMovement",false)
task.wait(0.2)
end
end)
end,
["CustomSetup"] = function(self)
self.DisplayTitle = self.DisplayTitle:gsub("Guest1337",RichTextGradientColor("Guest1337",{Color3.fromRGB(16, 47, 185), Color3.fromRGB(146, 202, 93)}))
if MainUI:FindFirstChild("AbilityContainer") then
self:SetupUI(MainUI:FindFirstChild("AbilityContainer"))
end
MainUI.ChildAdded:Connect(self.SetupUI)
end
},
["DragV2"] = {
["DisplayDescription"] = "Uses the seventh Auto Block hitbox check; Slasher/Sixer use a hitbox 75% larger than normal ABH, with the basic Drag Block cooldown",
["DisplayTitle"] = "Drag V2",
["LayoutOrder"] = 15.9,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["ExtraData"] = {
["Requirement"] = "AutoBlock"
},
["ScriptFunction"] = function(self, Value) end
},
["DragBlock"] = {
["DisplayDescription"] = "Follows the killer who triggered Auto Block for a short time",
["DisplayTitle"] = "Drag Block",
["LayoutOrder"] = 16,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["ExtraData"] = {
["Requirement"] = "AutoBlock"
},
["ScriptFunction"] = function(self, Value) end
},
["DragBlockStopDistance"] = {
["DisplayDescription"] = "How close Drag Block stops the player near the killer (studs)",
["DisplayTitle"] = "Stop Near Killer (Studs)",
["LayoutOrder"] = 16.1,
["Savable"] = true,
["InstanceType"] = "NumberValue",
["DefaultInstanceValue"] = 3,
["Requirement"] = "AutoBlock|DragBlock",
["ExtraData"] = {
["MaxValue"] = 10,
["MinValue"] = 0.5,
["Step"] = 0.25
}
},
["DragBlockHoldDuration"] = {
["DisplayDescription"] = "How long Drag Block holds/moves the player toward the killer (seconds)",
["DisplayTitle"] = "Hold Player Duration",
["LayoutOrder"] = 16.2,
["Savable"] = true,
["InstanceType"] = "NumberValue",
["DefaultInstanceValue"] = 0.2,
["Requirement"] = "AutoBlock|DragBlock",
["ExtraData"] = {
["MaxValue"] = 2,
["MinValue"] = 0.01,
["Step"] = 0.01
}
},
["EnableOverride"] = {
["DisplayDescription"] = "Overrides the puzzle grid size of the generators",
["DisplayTitle"] = "Override Generator(s) Grid Size",
["LayoutOrder"] = 27,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["Requirement"] = "require",
},
["GridSize"] = {
["DisplayDescription"] = "The Size to override for the Generator's Puzzle",
["DisplayTitle"] = "Generator(s) Grid Size",
["LayoutOrder"] = 28,
["Savable"] = true,
["InstanceType"] = "NumberValue",
["DefaultInstanceValue"] = 6,
["Requirement"] = "require|EnableOverride",
["ExtraData"] = {
["MaxValue"] = 12,
["MinValue"] = 4,
["Step"] = 1,
},
["HandlePuzzle"] = function(Data)
PuzzleData = {}
local function GetDirection(Row1,Col1,Row2,Col2)
if Row2 < Row1 then
return "up"
end
if Row2 > Row1 then
return "down"
end
if Col2 < Col1 then
return "left"
end
if Col2 > Col1 then
return "right"
end
end
local function GetPuzzleConnections(Last, New, Next)
local Connections = {}
if Last and New then
local Direction = GetDirection(New.row, New.col, Last.row, Last.col)
if Direction == "up" then
Direction = "down"
elseif Direction == "down" then
Direction = "up"
elseif Direction == "left" then
Direction = "right"
elseif Direction == "right" then
Direction = "left"
end
if Direction ~= "" and Direction then
Connections[Direction] = true
end
end
if Next and New then
local Direction = GetDirection(New.row, New.col, Next.row, Next.col)
if Direction ~= "" and Direction then
Connections[Direction] = true
end
end
return Connections
end
local function NearbyDirection(Row1, Col1, Row2, Col2)
if Row2 == Row1 - 1 and Col2 == Col1 then
return "up"
end
if Row2 == Row1 + 1 and Col2 == Col1 then
return "down"
end
if Row2 == Row1 and Col2 == Col1 - 1 then
return "left"
end
if Row2 == Row1 and Col2 == Col1 + 1 then
return "right"
end
return false
end
local function GetPlaceKey(Point)
return `{Point.row}-{Point.col}`
end
local function PathEndpoints(Path, endpoints)
if not Path or #Path == 0 then
return Path
end
local UniquePoint
for i, Point in endpoints or {} do
for i, v in Path do
if v.row == Point.row and v.col == Point.col then
UniquePoint = {row = Point.row,col = Point.col}
break
end
end
if UniquePoint then
break
end
end
if not UniquePoint then
local PointsInPath = {}
for i, Point in Path do
local TableKey = GetPlaceKey(Point)
PointsInPath[TableKey] = Point
end
for i, Point in Path do
local Nearby = 0
local Directions = {{Point.row - 1,Point.col}, {Point.row + 1,Point.col},{Point.row,Point.col - 1}, {Point.row,Point.col + 1}}
for i, Data in Directions do
local Row = Data[1]
local Col = Data[2]
local TableKey = `{Row}-{Col}`
if PointsInPath[TableKey] ~= nil then
Nearby += 1
end
end
if Nearby == 1 then
UniquePoint = {row = Point.row,col = Point.col}
break
end
end
end
if not UniquePoint then
UniquePoint = {row = Path[1].row,col = Path[1].col}
end
local Remaining = {}
for i,Point in Path do
local TableKey = GetPlaceKey(Point)
local CurrentTableKey = {row = Point.row,col = Point.col}
Remaining[TableKey] = CurrentTableKey
end
local Ordered = {}
local CurrentTableKey = {row = UniquePoint.row,col = UniquePoint.col}
local ClonedTable = table.clone(CurrentTableKey)
setmetatable(ClonedTable, nil)
table.insert(Ordered, ClonedTable)
local TableKey = GetPlaceKey(CurrentTableKey)
Remaining[TableKey] = nil
while true do
local Size = 0
for i in Remaining do
Size += 1
end
if not (Size > 0) then
break
end
local foundNext = false
for key, Point in Remaining do
local Direction = NearbyDirection(CurrentTableKey.row,CurrentTableKey.col,Point.row,Point.col)
if Direction ~= "" and Direction then
local ClonedPoint = table.clone(Point)
setmetatable(ClonedPoint, nil)
table.insert(Ordered, ClonedPoint)
Remaining[key] = nil
CurrentTableKey = Point
foundNext = true
break
end
end
if not foundNext then
return Path
end
end
return Ordered
end
local function ActivatePuzzlePathfind(self, Puzzle, UI)
if not Puzzle or not Puzzle.Solution then
return nil
end
local TotalPaths = #Puzzle.Solution
local PuzzlePoints = {}
local CanIncrease = false
for i = 1,TotalPaths do
table.insert(PuzzlePoints, i)
end
for i = #PuzzlePoints-1, 2, -1 do
local RandomChoice = math.random(1,i)
local Temp = PuzzlePoints[i+1]
PuzzlePoints[i+1] = PuzzlePoints[RandomChoice+1]
PuzzlePoints[RandomChoice+1] = Temp
end
local IsActiveConnection
local function Restart()
if not GetValue("AutoGeneratorPuzzle") then return end
for i, Color in PuzzlePoints do
local Path = Puzzle.Solution[Color]
local endpoints = Puzzle.targetPairs[Color]
local CompletePath = PathEndpoints(Path, endpoints)
Puzzle.paths[Color] = {}
for i = 0, #CompletePath - 1 do
local Point = CompletePath[i + 1]
local ColorData = Puzzle.paths[Color]
local TableKey = {row = Point.row,col = Point.col}
table.insert(ColorData,TableKey)
local Last = CompletePath[i]
local Next = CompletePath[i + 2]
local PuzzleConnections = GetPuzzleConnections(Last, Point, Next)
Puzzle.gridConnections = Puzzle.gridConnections or {}
Puzzle.gridConnections[`{Point.row}-{Point.col}`] = PuzzleConnections
if not GetValue("AutoGeneratorPuzzle") then
break
elseif not UI or not UI.Parent then
IsActiveConnection:Disconnect()
break
end
Puzzle:updateGui()
task.wait(GetValue("GeneratorCooldown",true):GetAttribute("CurrentSpeed"))
if not GetValue("AutoGeneratorPuzzle") then
break
elseif not UI or not UI.Parent then
IsActiveConnection:Disconnect()
break
end
end
if not GetValue("AutoGeneratorPuzzle") then
break
elseif not UI or not UI.Parent then
IsActiveConnection:Disconnect()
break
end
Puzzle:checkForWin()
end
end
IsActiveConnection = GetValue("AutoGeneratorPuzzle",true):GetPropertyChangedSignal("Value"):Connect(Restart)
Restart()
end
ActivatePuzzlePathfind(PuzzleData,Data[1],Data[2])
end,
["CustomSetup"] = function(self)
if GetValue("require") and FlowGame then
if FlowGame:FindFirstChild("Settings") then
local SettingsModule = require(FlowGame:FindFirstChild("Settings"))
self.DefaultInstanceValue = SettingsModule and SettingsModule.DefaultGridSize or self.DefaultInstanceValue
end
local FlowGameFunctions = require(FlowGame)
local Original = FlowGameFunctions.new
function FlowGameFunctions.new(...)
local Args = {...}
if type(Args[2]) == type(0) or not Args[2] then
Args[2] = GetValue("EnableOverride") and GetValue("GridSize") or Args[2]
GetValue("GeneratorCooldown",true):SetAttribute("CurrentGrid",Args[2])
local Result = {Original(table.unpack(Args))}
task.delay(0.35,self.HandlePuzzle,{Result[1],Args[1]})
return Result[1]
else
self.Requirement = true
Original(...)
end
end
else
self.Requirement = true
end
end
},
},
["Visuals"] = {
["TabAttributes"] = {
["DisplayTitle"] = "Visuals",
["LayoutOrder"] = 6
},
["DisableNoliNPC"] = {
["DisplayDescription"] = "Disables Noli's Distracting NPC",
["DisplayTitle"] = "Disable Noli's NPC",
["LayoutOrder"] = 1,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["HandleNoliNPC"] = function(self,Value)
-- Keep hidden Noli clones out of collision/query/physics work.
-- Moving the model to Lighting alone does not make its BaseParts
-- non-physical, so the clone could continue participating in
-- engine spatial/physics processing while hidden.
self.NoliNPCFrozenState = self.NoliNPCFrozenState or setmetatable({}, {__mode = "k"})
local function FreezeHiddenNoli(Model)
if not Model or Players:GetPlayerFromCharacter(Model) then return end
if not self.NoliNPCFrozenState[Model] then
local State = {Parts = {}, Humanoids = {}}
for _,Descendant in Model:GetDescendants() do
if Descendant:IsA("BasePart") then
State.Parts[Descendant] = {
Anchored = Descendant.Anchored,
CanCollide = Descendant.CanCollide,
CanTouch = Descendant.CanTouch,
CanQuery = Descendant.CanQuery,
Massless = Descendant.Massless
}
Descendant.Anchored = true
Descendant.CanCollide = false
Descendant.CanTouch = false
Descendant.CanQuery = false
Descendant.Massless = true
elseif Descendant:IsA("Humanoid") then
State.Humanoids[Descendant] = {AutoRotate = Descendant.AutoRotate}
Descendant.AutoRotate = false
end
end
self.NoliNPCFrozenState[Model] = State
else
for Part in pairs(self.NoliNPCFrozenState[Model].Parts) do
if Part and Part.Parent then
Part.Anchored = true
Part.CanCollide = false
Part.CanTouch = false
Part.CanQuery = false
Part.Massless = true
end
end
end
end
local function RestoreNoli(Model)
local State = self.NoliNPCFrozenState and self.NoliNPCFrozenState[Model]
if not State then return end
for Part,Original in pairs(State.Parts) do
if Part and Part.Parent then
Part.Anchored = Original.Anchored
Part.CanCollide = Original.CanCollide
Part.CanTouch = Original.CanTouch
Part.CanQuery = Original.CanQuery
Part.Massless = Original.Massless
end
end
for Humanoid,Original in pairs(State.Humanoids) do
if Humanoid and Humanoid.Parent then
Humanoid.AutoRotate = Original.AutoRotate
end
end
self.NoliNPCFrozenState[Model] = nil
end
if Value then
for i,v in KillersFolder:GetChildren() do
if v.Name:lower() == "noli" and not Players:GetPlayerFromCharacter(v) then
FreezeHiddenNoli(v)
v.Parent = Lighting
v:PivotTo(v:GetPivot() * CFrame.new(0,-100,0))
end
end
if workspace:FindFirstChild("Themes") then
for i,v in pairs(workspace.Themes:GetChildren()) do
if v.Name:find("FakeLayer") and v:IsA("Sound") then
v:Destroy()
end
end
end
else
for i,v in Lighting:GetChildren() do
if v.Name:lower() == "noli" then
v.Parent = InGame
v:PivotTo(v:GetPivot() * CFrame.new(0,100,0))
RestoreNoli(v)
end
end
end
end,
["ScriptFunction"] = function(self, Value)
self:HandleNoliNPC(Value)
end,
["CustomSetup"] = function(self)
if KillersFolder then
KillersFolder.ChildAdded:Connect(function(Child)
task.wait(0.5)
self:HandleNoliNPC(GetValue("DisableNoliNPC"))
end)
end
end
},
["Disable007n7NPC"] = {
["DisplayDescription"] = "Disables 007n7's Distracting NPC",
["DisplayTitle"] = "Disable 007n7's NPC",
["LayoutOrder"] = 1,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["Handle007n7NPC"] = function(self,Value)
if Value then
for i,v in InGame:GetChildren() do
if v.Name:lower() == "007n7" and not Players:GetPlayerFromCharacter(v) then
v.Parent = Lighting
if v:FindFirstChild("HumanoidRootPart") then
v:FindFirstChild("HumanoidRootPart").ChildAdded:Connect(function(Child)
if Child:IsA("Sound") and GetValue("Disable007n7NPC") then
Child:Destroy()
end
end)
end
end
end
else
for i,v in Lighting:GetChildren() do
if v.Name:lower() == "007n7" then
v.Parent = InGame
end
end
end
end,
["ScriptFunction"] = function(self, Value)
self:Handle007n7NPC(Value)
end,
["CustomSetup"] = function(self)
if InGame then
InGame.ChildAdded:Connect(function(Child)
task.wait(0.02)
self:Handle007n7NPC(GetValue("Disable007n7NPC"))
end)
end
end
},
["ESP"] = {
["DisplayDescription"] = "Track things in the game through walls",
["DisplayTitle"] = "ESP",
["LayoutOrder"] = 2,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["CheckHighlightDistance"] = function(self,Highlight,TargetRoot,Settings)
local Camera = TargetRoot and workspace.CurrentCamera
if not Camera or (Highlight:GetAttribute("Frozen") and not Settings.Instant) then return end
local Distance = (Camera.CFrame.Position - TargetRoot.Position).Magnitude
local MinDistance = Settings.MinDistance
local ShouldHide = Distance < MinDistance or Distance > 1200
if ShouldHide and Highlight.FillTransparency ~= 1 then
local Tween = TweenService:Create(Highlight,TweenInfo.new(Settings.Instant and 0 or 0.1),{
FillTransparency = 1,
OutlineTransparency = 1
})
Tween.Parent = Highlight
Tween:Play()
Debris:AddItem(Tween,0.2)
return
end
if not ShouldHide and Distance >= MinDistance and Distance < 1200 then
local TransparencyAmount = math.clamp(1 - math.clamp((Distance - MinDistance) / math.max(Settings.MaxDistance - MinDistance, 0.001),0,1),0.45,1)
if math.abs(Highlight.FillTransparency - TransparencyAmount) > 0 then
local Tween = TweenService:Create(Highlight,TweenInfo.new(Settings.Instant and 0 or 0.1),{
FillTransparency = math.clamp(TransparencyAmount + 0.05,0,1),
OutlineTransparency = TransparencyAmount <= 0.95 and TransparencyAmount - 0.05 or TransparencyAmount
})
Tween.Parent = Highlight
Tween:Play()
Debris:AddItem(Tween,0.2)
end
end
end,
["CheckTextDistance"] = function(self,Text,TargetRoot,Settings)
local Camera = TargetRoot and workspace.CurrentCamera
if not Camera or (Text:GetAttribute("Frozen") and not Settings.Instant) then return end
local Distance = (Camera.CFrame.Position - TargetRoot.Position).Magnitude
local MinDistance = Settings.MinDistance
if Distance > MinDistance and Distance < 1200 and Text.TextTransparency ~= 0 then
local Tween = TweenService:Create(Text,TweenInfo.new(Settings.Instant and 0 or 0.1),{TextTransparency = 0,TextStrokeTransparency = 0})
Tween.Parent = TargetRoot
Tween:Play()
Debris:AddItem(Tween,0.2)
elseif Distance <= MinDistance or Distance >= 1200 and Text.TextTransparency ~= 1 then
local Tween = TweenService:Create(Text,TweenInfo.new(Settings.Instant and 0 or 0.1),{TextTransparency = 1,TextStrokeTransparency = 1})
Tween.Parent = TargetRoot
Tween:Play()
Debris:AddItem(Tween,0.2)
end
end,
["CreateDynamicHighlight"] = function(self,Enabled,ItemInstance,TargetRoot,Settings)
Settings = type(Settings) == "table" and Settings or {["MaxDistance"] = 100,["MinDistance"] = 10,["Color"] = Color3.new(1,1,1)}
local Highlight:Highlight? = ItemInstance:QueryDescendants("Highlight[$Dynamic]")
if Enabled and GetValue("ESP") then
if not Highlight[1] then
Highlight = Instance.new("Highlight")
Highlight.Name = HttpService:GenerateGUID(false):sub(1,7)
Highlight.Archivable = false
local H, S, V = Settings.Color:ToHSV()
Highlight.FillColor = Color3.fromHSV(H, S, V * 0.8)
Highlight.OutlineColor = Color3.fromHSV(H, S, V * 1.1)
Highlight:SetAttribute("Dynamic",true)
Highlight.Parent = ItemInstance
Highlight.Adornee = ItemInstance
Highlight.FillTransparency = 1
Highlight.OutlineTransparency = 1
self:CheckHighlightDistance(Highlight, TargetRoot, Settings)
local Connection;Connection = workspace.CurrentCamera:GetPropertyChangedSignal("CameraSubject"):Connect(function()
if Highlight and Highlight.Parent then
for i,v in Highlight:GetChildren() do v:Cancel() end
Highlight.FillTransparency = 0.95
Highlight.OutlineTransparency = 0.95
else
Connection:Disconnect()
end
end)
Highlight.Destroying:Once(function()
if Connection then
Connection:Disconnect()
end
end)
Highlight.Parent:GetPropertyChangedSignal("Parent"):Once(function()
Highlight:Destroy()
end)
else
Highlight = Highlight[1]
local H, S, V = Settings.Color:ToHSV()
Highlight.FillColor = Color3.fromHSV(H, S, V * 0.8)
Highlight.OutlineColor = Color3.fromHSV(H, S, V * 1.1)
self:CheckHighlightDistance(Highlight, TargetRoot, Settings)
end
elseif Highlight[1] then
Highlight[1]:Destroy()
end
end,
["CreateText"] = function(self,Enabled,ItemInstance,TargetRoot,Settings)
Settings = type(Settings) == "table" and Settings or {["MinDistance"] = 10,["Color"] = Color3.new(1,1,1)}
local BillboardGui = ItemInstance:QueryDescendants("BillboardGui[$Dynamic]")
if Enabled and GetValue("ShowText") and GetValue("ESP") then
if not BillboardGui[1] then
BillboardGui = Instance.new("BillboardGui")
local TextLabel = Instance.new("TextLabel")
BillboardGui.Name = HttpService:GenerateGUID(false):sub(1,7)
BillboardGui.Archivable = false
BillboardGui.Size = ItemInstance:IsA("Tool") and UDim2.new(1.5, 30, 0.75, 30) or UDim2.new(1.5,60,0.75,25)
BillboardGui["StudsOffset" .. (ItemInstance:IsA("Tool") and "WorldSpace" or "")] = ItemInstance:IsA("Tool") and Vector3.new(0,3,0) or Vector3.new(0,4,0)
BillboardGui.AlwaysOnTop = true
BillboardGui.ResetOnSpawn = false
BillboardGui.Adornee = TargetRoot
BillboardGui:SetAttribute("Dynamic",true)
TextLabel.Text = Settings.Text or "Unknown"
local H, S, V = Settings.Color:ToHSV()
TextLabel.TextColor3 = Color3.fromHSV(H, S, V * 1.1)
TextLabel.AnchorPoint = Vector2.new(0.5,0.5)
TextLabel.Position = UDim2.fromScale(0.5,0.5)
TextLabel.Size = UDim2.fromScale(1,1)
TextLabel.BackgroundTransparency = 1
TextLabel.TextScaled = true
TextLabel.Parent = BillboardGui
BillboardGui.Parent = TargetRoot
self:CheckTextDistance(TextLabel,TargetRoot,Settings)
local Connection;Connection = workspace.CurrentCamera:GetPropertyChangedSignal("CameraSubject"):Connect(function()
if BillboardGui and BillboardGui.Parent then
for i,v in TextLabel:GetChildren() do v:Cancel() end
TextLabel.TextTransparency = 0.95
TextLabel.TextStrokeTransparency = 0.95
else
Connection:Disconnect()
end
end)
BillboardGui.Destroying:Once(function()
if Connection then
Connection:Disconnect()
end
end)
BillboardGui.Parent:GetPropertyChangedSignal("Parent"):Once(function()
BillboardGui:Destroy()
end)
else
BillboardGui = BillboardGui[1]
local H, S, V = Settings.Color:ToHSV()
local TextLabel = BillboardGui.TextLabel
TextLabel.TextColor3 = Color3.fromHSV(H, S, V * 1.1)
self:CheckTextDistance(TextLabel,TargetRoot,Settings)
end
elseif BillboardGui[1] then
BillboardGui[1]:Destroy()
end
end,
["OnLoop"] = function(self)
local fireprompt = fireproximitypromptFunction and function(ProximityPrompt)
return ProximityPrompt and fireproximitypromptFunction(ProximityPrompt)
end or function(ProximityPrompt)
if ProximityPrompt then
ProximityPrompt:InputHoldBegin();ProximityPrompt:InputHoldEnd()
end
end
for i,v in PlayersFolder:QueryDescendants("#Killers > Instance,#Survivors > Instance") do
task.spawn(function()
local Player = v ~= LocalPlayer.Character and Players:GetPlayerFromCharacter(v)
if Player and v:FindFirstChildOfClass("Humanoid") and v:FindFirstChildOfClass("Humanoid").Health > 0 and MainUI.Enabled == true then
local FolderName = v.Parent.Name
local FeatureValue, ColorValue, TargetRoot = GetValue(FolderName.."ESP"), ColorPresets[GetValue(FolderName.."Color")], v:FindFirstChild("HumanoidRootPart")
self:CreateDynamicHighlight(FeatureValue, v, TargetRoot, {MaxDistance = 100,MinDistance = 10,Color = ColorValue })
self:CreateText(FeatureValue, v, TargetRoot, {MinDistance = 25,Text = Player.Name,Color = ColorValue})
else
self:CreateDynamicHighlight(false, v)
self:CreateText(false, v)
end
end)
end
if InGame and GameMap then
task.spawn(function()
local Tools = InGame:QueryDescendants("#Map > Tool")
local DroppedTools = InGame.Parent:QueryDescendants("Folder > Tool")
for i,v in table.move(Tools,1,#Tools,#DroppedTools+1,DroppedTools) do
local FeatureValue, ColorValue, TargetRoot = GetValue("ItemsESP"), ColorPresets[GetValue("ItemsColor")], v:FindFirstChildWhichIsA("BasePart")
self:CreateDynamicHighlight(FeatureValue, v, TargetRoot, {MaxDistance = 100,MinDistance = 12,Color = ColorValue})
self:CreateText(FeatureValue, v, TargetRoot, {MinDistance = 25,Text = v.Name, Color = ColorValue})
if v:IsA("Tool") and not LocalCharacter:FindFirstChild(v.Name) and not LocalPlayer:FindFirstChildOfClass("Backpack"):FindFirstChild(v.Name) and not v:GetAttribute("JustDropped") and GetValue("AutoPickup") then
local Param = OverlapParams.new()
Param.FilterType = Enum.RaycastFilterType.Include
Param.FilterDescendantsInstances = {v}
local Result = workspace:GetPartBoundsInRadius(LocalRoot.Position, 4.5, Param)
if LocalRoot and #Result > 0 then
fireprompt(v:FindFirstChildWhichIsA("ProximityPrompt",true))
end
end
end
end)
for i,v in GameMap:QueryDescendants("Model#Generator:has(#Main)") do
task.spawn(function()
if (GetValue("GeneratorsCheck")) == true and v:FindFirstChild("Progress") and v:FindFirstChild("Progress").Value >= 100 then
self:CreateDynamicHighlight(false, v)
self:CreateText(false, v)
elseif v:FindFirstChild("Progress") then
local FeatureValue, ColorValue, TargetRoot = GetValue("GeneratorsESP"), ColorPresets[GetValue("GeneratorsColor")], v:FindFirstChild("Main") or v:WaitForChild("Main")
self:CreateDynamicHighlight(FeatureValue, v, TargetRoot, { MaxDistance = 100,MinDistance = 12,Color = ColorValue})
self:CreateText(FeatureValue, v, TargetRoot, { MinDistance = 25,Text = v.Name,Color = ColorValue})
end
end)
end
end
end
},
["ShowText"] = {
["DisplayDescription"] = "Show text over the highlighted objects",
["DisplayTitle"] = "Show Text",
["LayoutOrder"] = 3,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["Requirement"] = "ESP",
},
["KillersESP"] = {
["DisplayDescription"] = "Enables ESP for the killer(s)",
["DisplayTitle"] = "Killer(s) (ESP)",
["LayoutOrder"] = 4,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["Requirement"] = "ESP",
},
["KillersColor"] = {
["DisplayDescription"] = "Select a Color for Killer(s) (ESP)",
["DisplayTitle"] = "Killer(s) Color",
["LayoutOrder"] = 5,
["Savable"] = true,
["InstanceType"] = "StringValue",
["DefaultInstanceValue"] = "Red",
["Requirement"] = "ESP|KillersESP",
["ExtraData"] = {
["Options"] = "Red|Orange|Purple|Gold",
},
["ScriptFunction"] = function(self, Value)
local Name = "Killer(s)"
local H, S, V = ColorPresets[Value]:ToHSV()
local Color = ColorPresets[Value]
local DarkerColor = Color3.fromHSV(H, S, V * 0.7)
for i,v in FeatureLoadout["Visuals"] do
if v["DisplayTitle"]:find(Name,1,true) then
local ColoredName = RichTextGradientColor(Name,{Color,DarkerColor})
local FormattedName = Name:gsub("([%(%)])", "%%%1")
local ColoredText = v["DisplayTitle"]:gsub(FormattedName, ColoredName, 1)
if v["Instance"] then
v["Instance"]:SetAttribute("DisplayTitle",ColoredText)
else
v["DisplayTitle"] = ColoredText
end
end
end
end
},
["SurvivorsESP"] = {
["DisplayDescription"] = "Enables ESP for the survivor(s)",
["DisplayTitle"] = "Survivor(s) (ESP)",
["LayoutOrder"] = 6,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["Requirement"] = "ESP",
["ScriptFunction"] = function(self, Value) end
},
["SurvivorsColor"] = {
["DisplayDescription"] = "Select a Color for Survivor(s) (ESP)",
["DisplayTitle"] = "Survivor(s) Color",
["LayoutOrder"] = 7,
["Savable"] = true,
["InstanceType"] = "StringValue",
["DefaultInstanceValue"] = "Green",
["Requirement"] = "ESP|SurvivorsESP",
["ExtraData"] = {
["Options"] = "Green|Orange|Purple|Gold",
},
["ScriptFunction"] = function(self, Value)
local Name = "Survivor(s)"
local H, S, V = ColorPresets[Value]:ToHSV()
local Color = ColorPresets[Value]
local DarkerColor = Color3.fromHSV(H, S, V * 0.7)
for i,v in FeatureLoadout["Visuals"] do
if v["DisplayTitle"]:find(Name,1,true) then
local ColoredName = RichTextGradientColor(Name,{Color,DarkerColor})
local FormattedName = Name:gsub("([%(%)])", "%%%1")
local ColoredText = v["DisplayTitle"]:gsub(FormattedName, ColoredName, 1)
if v["Instance"] then
v["Instance"]:SetAttribute("DisplayTitle",ColoredText)
else
v["DisplayTitle"] = ColoredText
end
end
end
end
},
["GeneratorsESP"] = {
["DisplayDescription"] = "Enables ESP for the Generator(s)",
["DisplayTitle"] = "Generator(s) (ESP)",
["LayoutOrder"] = 9,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["Requirement"] = "ESP",
["ScriptFunction"] = function(self, Value) end
},
["GeneratorsColor"] = {
["DisplayDescription"] = "Select a Color for Generator(s) (ESP)",
["DisplayTitle"] = "Generator(s) Color",
["LayoutOrder"] = 10,
["Savable"] = true,
["InstanceType"] = "StringValue",
["DefaultInstanceValue"] = "Cyan",
["Requirement"] = "ESP|GeneratorsESP",
["ExtraData"] = {
["Options"] = "Cyan|Blue|Green|Orange|Purple|Gold",
},
["ScriptFunction"] = function(self, Value)
local Name = "Generator(s)"
local H, S, V = ColorPresets[Value]:ToHSV()
local Color = ColorPresets[Value]
local DarkerColor = Color3.fromHSV(H, S, V * 0.7)
local ExtraSelected = {GetValue("GridSize",true),GetValue("AutoGeneratorPuzzle",true),GetValue("EnableOverride",true)}
for i,v in FeatureLoadout["Visuals"] do
if v["DisplayTitle"]:find(Name,1,true) then
local ColoredName = RichTextGradientColor(Name,{Color,DarkerColor})
local FormattedName = Name:gsub("([%(%)])", "%%%1")
local ColoredText = v["DisplayTitle"]:gsub(FormattedName, ColoredName, 1)
if v["Instance"] then
v["Instance"]:SetAttribute("DisplayTitle",ColoredText)
else
v["DisplayTitle"] = ColoredText
end
end
end
for i,v in ExtraSelected do
local ColoredName = RichTextGradientColor(Name,{Color,DarkerColor})
local FormattedName = Name:gsub("([%(%)])", "%%%1")
local CleanTitle = v:GetAttribute("DisplayTitle"):gsub("<[^>]->", "")
local ColoredText = CleanTitle:gsub(FormattedName, ColoredName, 1)
v:SetAttribute("DisplayTitle",ColoredText)
end
end
},
["GeneratorsCheck"] = {
["DisplayDescription"] = "Hides Generator(s) That are Completed (ESP)",
["DisplayTitle"] = "Hide Completed Generator(s)",
["LayoutOrder"] = 11,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = true,
["Requirement"] = "ESP|GeneratorsESP",
["ScriptFunction"] = function(self, Value) end
},
["ItemsESP"] = {
["DisplayDescription"] = "Enables ESP for the Item(s)",
["DisplayTitle"] = "Item(s) (ESP)",
["LayoutOrder"] = 12,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["Requirement"] = "ESP",
["ScriptFunction"] = function(self, Value) end
},
["ItemsColor"] = {
["DisplayDescription"] = "Select a Color for Item(s) (ESP)",
["DisplayTitle"] = "Item(s) Color",
["LayoutOrder"] = 13,
["Savable"] = true,
["InstanceType"] = "StringValue",
["DefaultInstanceValue"] = "Gold",
["Requirement"] = "ESP|ItemsESP",
["ExtraData"] = {
["Options"] = "Gold|Cyan|Purple|White",
},
["ScriptFunction"] = function(self, Value)
local Name = "Item(s)"
local H, S, V = ColorPresets[Value]:ToHSV()
local Color = ColorPresets[Value]
local DarkerColor = Color3.fromHSV(H, S, V * 0.7)
for i,v in FeatureLoadout["Visuals"] do
if v["DisplayTitle"]:find(Name,1,true) then
local ColoredName = RichTextGradientColor(Name,{Color,DarkerColor})
local FormattedName = Name:gsub("([%(%)])", "%%%1")
local ColoredText = v["DisplayTitle"]:gsub(FormattedName, ColoredName, 1)
if v["Instance"] then
v["Instance"]:SetAttribute("DisplayTitle",ColoredText)
else
v["DisplayTitle"] = ColoredText
end
end
end
GetValue("AutoPickup",true):SetAttribute("DisplayDescription",string.format("Auto-Picks up <b>%s</b> near you",RichTextGradientColor("Items",{Color,DarkerColor})))
end
}
},
["Miscellaneous"] = {
["TabAttributes"] = {
["DisplayTitle"] = "Miscellaneous",
["LayoutOrder"] = 10
},
["ExtendedFOV"] = {
["DisplayDescription"] = "A extended version of the FOV inside the normal settings",
["DisplayTitle"] = "Extended FOV",
["LayoutOrder"] = 1,
["Savable"] = true,
["InstanceType"] = "NumberValue",
["FovSetting"] = PlayerData:FindFirstChild("FieldOfView",true) or PlayerData:FindFirstChild("FOV",true),
["DefaultInstanceValue"] = PlayerData:FindFirstChild("FieldOfView",true) and PlayerData:FindFirstChild("FieldOfView",true).Value or 70,
["ExtraData"] = {
["MaxValue"] = 120,
["MinValue"] = 10,
["Step"] = 5,
},
["ScriptFunction"] = function(self, Value)
if self.FovSetting then
self.FovSetting.Value = Value
end
end,
["CustomSetup"] = function(self)
if self.FovSetting and self.FovSetting:IsA("NumberValue") then
self.FovSetting:GetPropertyChangedSignal("Value"):Connect(function()
self.Instance.Value = self.FovSetting.Value
end)
end
end
},
["ExtendedZoom"] = {
["DisplayDescription"] = "Extends the Maximum Zoom Distance for the camera",
["DisplayTitle"] = "Extended Zoom Distance",
["LayoutOrder"] = 2,
["Savable"] = true,
["InstanceType"] = "NumberValue",
["DefaultInstanceValue"] = 10,
["ExtraData"] = {
["MaxValue"] = 100,
["MinValue"] = 0,
["Step"] = 5,
},
["ScriptFunction"] = function(self, Value)
LocalPlayer.CameraMaxZoomDistance = game:GetService("StarterPlayer").CameraMaxZoomDistance + (Value * 0.25)
end
},
["ShowChat"] = {
["DisplayDescription"] = "Shows the Full Chat while in the Round",
["DisplayTitle"] = "Show Chat",
["LayoutOrder"] = 3,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["Requirement"] = not game:GetService("Chat"):CanUserChatAsync(LocalPlayer.UserId) and true or nil,
["ScriptFunction"] = function(self, Value)
if not SideBar:GetAttribute("WasVisible") and TextChatService:FindFirstChildOfClass("ChatWindowConfiguration") then
TextChatService:FindFirstChildOfClass("ChatWindowConfiguration").Enabled = Value
end
end,
["CustomSetup"] = function(self)
if TextChatService:FindFirstChildOfClass("ChatWindowConfiguration") then
TextChatService:FindFirstChildOfClass("ChatWindowConfiguration"):GetPropertyChangedSignal("Enabled"):Connect(function()
if GetValue("ShowChat") then
TextChatService:FindFirstChildOfClass("ChatWindowConfiguration").Enabled = true
end
end)
end
end
},
["ShowPrivacy"] = {
["DisplayDescription"] = "Shows everyones privacy info",
["DisplayTitle"] = "Shows Privacy Info",
["LayoutOrder"] = 4,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["HandlePrivacySettings"] = function(self,Player)
if Player then
local Data = Player:FindFirstChild("PlayerData")
if Data then
local PrivacySettings = Data:FindFirstChild("Privacy",true)
if PrivacySettings then
for i,v in PrivacySettings:GetChildren() do
if not v:GetAttribute("OriginalValue") and v:IsA("BoolValue") then
v:SetAttribute("OriginalValue", v.Value)
v:GetPropertyChangedSignal("Value"):Connect(function()
local ShowPrivacy = FeatureLoadout["Miscellaneous"]["ShowPrivacy"]["Instance"]
if ShowPrivacy and ShowPrivacy.Value then
v.Value = false
else
v.Value = v:GetAttribute("OriginalValue")
end
end)
local ShowPrivacy = FeatureLoadout["Miscellaneous"]["ShowPrivacy"]["Instance"]
if ShowPrivacy and ShowPrivacy.Value then
v.Value = false
else
v.Value = v:GetAttribute("OriginalValue")
end
elseif v:IsA("BoolValue") then
local ShowPrivacy = FeatureLoadout["Miscellaneous"]["ShowPrivacy"]["Instance"]
if ShowPrivacy and ShowPrivacy.Value then
v.Value = false
else
v.Value = v:GetAttribute("OriginalValue")
end
end
end
end
end
end
end,
["HandleCheckForMod"] = function(self,Player)
if not Player then return end
if game.CreatorType ~= Enum.CreatorType.Group then return end
local Rank = Player:GetRoleInGroupAsync(game.CreatorId)
if Rank and (Rank:lower():find("mod") or Rank:lower():find("admin")) and not workspace:GetAttribute("ModFound") then
workspace:SetAttribute("ModFound",true)
StarterGui:SetCore("SendNotification",{
Title = "WARNING", Text = "A Moderator is in your server all features are now disabled",
Icon = "rbxasset://textures/DevConsole/Warning.png", Duration = 10
})
FeatureLoadout["EnviromentFunctions"]["files"]["DefaultInstanceValue"] = true
for i,v in FeatureLoadout do
if i ~= "EnviromentFunctions" then
if i ~= "TabAttributes" then
for i2,v2 in v do
if v2["Instance"] and i2 ~= "DisableAllFeatures" then
v2["Instance"].Value = v2["DefaultInstanceValue"]
end
end
end
end
end
end
end,
["ScriptFunction"] = function(self, Value)
for i,v in Players:GetPlayers() do
if v ~= LocalPlayer then
self:HandlePrivacySettings(v)
end
end
end,
["CustomSetup"] = function(self)
task.spawn(function()
for i,v in Players:GetPlayers() do
if v ~= LocalPlayer then
self:HandlePrivacySettings(v)
self:HandleCheckForMod(v)
end
end
end)
Players.PlayerAdded:Connect(function(Player)
self:HandleCheckForMod(Player)
task.delay(2, function()
self:HandlePrivacySettings(Player)
end)
end)
end
},
["HideInjury"] = {
["DisplayDescription"] = "Hides the injured screen and effects used when you are low health",
["DisplayTitle"] = "Hide Injured UI/Effects",
["LayoutOrder"] = 5,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = true,
["ScriptFunction"] = function(self, Value)
for i,v in TempUI and TempUI:QueryDescendants("#redFlash,#injuredVignette") or {} do
v.Visible = not Value
end
if Lighting:FindFirstChild("HealthDesaturation") then
Lighting:FindFirstChild("HealthDesaturation").Enabled = not Value
end
end,
["CustomSetup"] = function(self)
Lighting.ChildAdded:Connect(function(Child)
if Child.Name == "HealthDesaturation" then
Child.Enabled = not GetValue("HideInjury")
end
end)
if Lighting:FindFirstChild("HealthDesaturation") then
Lighting.HealthDesaturation.Enabled = not GetValue("HideInjury")
end
end
},
["DisableBlindness"] = {
["DisplayDescription"] = "Disables the blindness effect",
["DisplayTitle"] = "Disable Blindness",
["LayoutOrder"] = 6,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = true,
["ScriptFunction"] = function(self, Value)
for i,v in Lighting:QueryDescendants("#BlindnessBlur BlurEffect") do
v.Enabled = not Value
end
end,
["CustomSetup"] = function(self)
Lighting.ChildAdded:Connect(function(Child)
if Child.Name == "BlindnessBlur" and Child:IsA("BlurEffect") then
Child.Enabled = not GetValue("DisableBlindness")
end
end)
if Lighting:FindFirstChild("BlindnessBlur") then
Lighting:FindFirstChild("BlindnessBlur").Enabled = not GetValue("DisableBlindness")
end
end
},
["DeleteRagdolls"] = {
["DisplayDescription"] = "Deletes ALL Ragdolls regardless the type of ragdoll for performance",
["DisplayTitle"] = "Delete All Ragdolls",
["LayoutOrder"] = 7,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["Requirement"] = "PrivateServer",
["ScriptFunction"] = function(self, Value)
if Value and RagdollsFolder then
RagdollsFolder:ClearAllChildren()
elseif not RagdollsFolder then
self.Value = false
self.Instance:SetAttribute("Requirement",true)
end
end,
["CustomSetup"] = function(self)
if RagdollsFolder then
RagdollsFolder.ChildAdded:Connect(function(Ragdoll)
if GetValue("DeleteRagdolls") and GetValue("PrivateServer") then
RagdollsFolder:ClearAllChildren()
else
for i,v in Ragdoll:QueryDescendants("Highlight[$Dynamic],BillboardGui[$Dynamic]") do
v:Destroy()
end
end
end)
end
end
},
["PlayerSelectCrash"] = {
["DisplayDescription"] = "Select a player to crash",
["DisplayTitle"] = "Player to crash",
["LayoutOrder"] = 8,
["Savable"] = false,
["InstanceType"] = "StringValue",
["DefaultInstanceValue"] = "None",
["Requirement"] = ReplicatedStorage:FindFirstChild("Nausea",true) and "PrivateServerOwner",
["UpdatePlayerCrashDrop"] = function(self)
local OriginString = self.DefaultInstanceValue
local CurrentPlayers = Players:GetPlayers()
for i,v in CurrentPlayers do
if v ~= LocalPlayer then
OriginString ..= "|" .. v.Name
end
end
local PlayerCount = #CurrentPlayers
if PlayerCount == 3 then
OriginString ..= "|Both"
elseif PlayerCount > 3 then
OriginString ..= "|Everyone"
end
if GetValue("PlayerSelectCrash",true) then
GetValue("PlayerSelectCrash",true):SetAttribute("Options", OriginString)
end
if GetValue("PlayerSelectCrash") ~= self.DefaultInstanceValue and not Players:FindFirstChild(GetValue("PlayerSelectCrash")) then
self.Instance.Value = self.DefaultInstanceValue
end
end,
["ExtraData"] = {
["Options"] = "None",
},
["CustomSetup"] = function(self)
local function Upd()
self:UpdatePlayerCrashDrop()
end
Players.PlayerAdded:Connect(Upd)
Players.PlayerRemoving:Connect(Upd)
task.delay(0.5,Upd)
end
},
["CrashTheTarget"] = {
["DisplayDescription"] = "Crashes the selected target (Host Exclusive)",
["DisplayTitle"] = "Crash Target",
["LayoutOrder"] = 9,
["Savable"] = false,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["Requirement"] = ReplicatedStorage:FindFirstChild("Nausea",true) and "PlayerSelectCrash~None|PrivateServerOwner",
["ScriptFunction"] = function(self, Value)
if Value then
self.Instance.Value = false
local PlayerName = GetValue("PlayerSelectCrash")
if PlayerName == "Everyone" or PlayerName == "Both" then
for i,Player in Players:GetPlayers() do
if Player ~= LocalPlayer then
local Name = Player.Name
task.spawn(function()
repeat
if GetValue("OfficialGame") then
Network:WaitForChild("RemoteEvent"):FireServer("ExecuteCommand",{"GiveStatus", Name, "Nausea", math.huge, 1})
else
Network:WaitForChild("RemoteEvent"):FireServer("ExecuteCommand",{"GiveStatus", Name, "Nausea", math.huge, 1})
Network:WaitForChild("RemoteEvent"):FireServer("ExecuteCommand","GiveStatus", Name, "Nausea", math.huge, 1)
end
task.wait(1.5)
until not Players:FindFirstChild(Name)
end)
end
end
else
task.spawn(function()
repeat
if GetValue("OfficialGame") then
Network:WaitForChild("RemoteEvent"):FireServer("ExecuteCommand",{"GiveStatus", PlayerName, "Nausea", math.huge, 1})
else
Network:WaitForChild("RemoteEvent"):FireServer("ExecuteCommand",{"GiveStatus", PlayerName, "Nausea", math.huge, 1})
Network:WaitForChild("RemoteEvent"):FireServer("ExecuteCommand","GiveStatus", PlayerName, "Nausea", math.huge, 1)
end
task.wait(1.5)
until not Players:FindFirstChild(PlayerName)
end)
end
end
end
},
["SkyGlitch"] = {
["DisplayDescription"] = "Gives sky glitching effect to everyone (Host Exclusive)",
["DisplayTitle"] = "Sky Glitch",
["LayoutOrder"] = 10,
["Savable"] = false,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["Requirement"] = ReplicatedStorage:FindFirstChild("Nausea",true) and "PrivateServerOwner",
["ScriptFunction"] = function(self, Value)
if Value and not workspace:GetAttribute("EffectActive") then
workspace:SetAttribute("EffectActive",true)
self.Instance.Value = false
if PlayerData:FindFirstChild("EpilepsyMode",true) and PlayerData:FindFirstChild("EpilepsyMode",true).Value then
StarterGui:SetCore("SendNotification", {
Title = "Warning",
Text = "Disabled your Epilepsy Mode Temporarily for the effect to work",
Duration = 5
})
PlayerData:FindFirstChild("EpilepsyMode",true).Value = false
task.delay(10, function()
PlayerData:FindFirstChild("EpilepsyMode",true).Value = true
end)
end
if GetValue("OfficialGame") then
Network:WaitForChild("RemoteEvent"):FireServer("ExecuteCommand",{"GiveStatus","All","Nausea",-1e11,10})
else
Network:WaitForChild("RemoteEvent"):FireServer("ExecuteCommand",{"GiveStatus","All","Nausea",-1e11,10})
Network:WaitForChild("RemoteEvent"):FireServer("ExecuteCommand","GiveStatus","All","Nausea",-1e11,10)
end
task.delay(10, function()
workspace:SetAttribute("EffectActive",nil)
self.Instance.Value = false
end)
elseif workspace:GetAttribute("EffectActive") then
self.Instance.Value = true
end
end
},
["InstaKill"] = {
["DisplayDescription"] = "Allows you to instantly kill anyone (Host Exclusive)",
["DisplayTitle"] = "Instant Kill",
["LayoutOrder"] = 11,
["Savable"] = false,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["Requirement"] = ReplicatedStorage:FindFirstChild("Weakness",true) and "PrivateServerOwner",
["ScriptFunction"] = function(self, Value)
if workspace:GetAttribute("InstaKill") == nil then
workspace:SetAttribute("InstaKill", Value)
self.Instance.Value = Value
task.delay(1.5, function()
workspace:SetAttribute("InstaKill",nil)
end)
if Value then
repeat
if GetValue("OfficialGame") then
Network:WaitForChild("RemoteEvent"):FireServer("ExecuteCommand",{"GiveStatus",LocalPlayer.Name,"Weakness",-1e11,2})
else
Network:WaitForChild("RemoteEvent"):FireServer("ExecuteCommand",{"GiveStatus",LocalPlayer.Name,"Weakness",-1e11,2})
Network:WaitForChild("RemoteEvent"):FireServer("ExecuteCommand","GiveStatus",LocalPlayer.Name,"Weakness",-1e11,2)
end
task.wait(1.25)
until not self.Instance.Value
end
else
self.Instance.Value = workspace:GetAttribute("InstaKill")
end
end
},
["DisableDamage"] = {
["DisplayDescription"] = "Disables dealing damage for everyone (Host Exclusive)",
["DisplayTitle"] = "Disable Damage",
["LayoutOrder"] = 12,
["Savable"] = false,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["Requirement"] = ReplicatedStorage:FindFirstChild("Strength",true) and "PrivateServerOwner",
["ScriptFunction"] = function(self, Value)
if workspace:GetAttribute("DisableDamage") == nil then
workspace:SetAttribute("DisableDamage", Value)
self.Instance.Value = Value
task.delay(2.25, function()
workspace:SetAttribute("DisableDamage",nil)
end)
if Value then
repeat
for i,v in Players:GetPlayers() do
if v.UserId == LocalPlayer.UserId and GetValue("InstaKill") then continue end
if GetValue("OfficialGame") then
Network:WaitForChild("RemoteEvent"):FireServer("ExecuteCommand",{"GiveStatus",v.Name,"Strength",-1e11,2})
else
Network:WaitForChild("RemoteEvent"):FireServer("ExecuteCommand",{"GiveStatus",v.Name,"Strength",-1e11,2})
Network:WaitForChild("RemoteEvent"):FireServer("ExecuteCommand","GiveStatus",v.Name,"Strength",-1e11,2)
end
end
task.wait(1.25)
until not self.Instance.Value
end
else
self.Instance.Value = workspace:GetAttribute("DisableDamage")
end
end
},
["DisableAbilityCooldown"] = {
["DisplayDescription"] = "Disables the ability cooldown only for you (Host Exclusive)",
["DisplayTitle"] = "Disable Ability Cooldown",
["LayoutOrder"] = 13,
["Savable"] = false,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["Requirement"] = ReplicatedStorage:FindFirstChild("Fatigue",true) and "PrivateServerOwner" or true,
["ScriptFunction"] = function(self, Value)
if workspace:GetAttribute("DisableAbilityCooldownSelf") == nil then
workspace:SetAttribute("DisableAbilityCooldownSelf", Value)
self.Instance.Value = Value
task.delay(1.5, function()
workspace:SetAttribute("DisableAbilityCooldownSelf",nil)
end)
if Value then
repeat
if GetValue("OfficialGame") then
Network:WaitForChild("RemoteEvent"):FireServer("ExecuteCommand",{"GiveStatus",LocalPlayer.Name,"Fatigue",-1e8,2})
else
Network:WaitForChild("RemoteEvent"):FireServer("ExecuteCommand",{"GiveStatus",LocalPlayer.Name,"Fatigue",-1e8,2})
Network:WaitForChild("RemoteEvent"):FireServer("ExecuteCommand","GiveStatus",LocalPlayer.Name,"Fatigue",-1e8,2)
end
task.wait(1.25)
until not self.Instance.Value
end
else
self.Instance.Value = workspace:GetAttribute("DisableAbilityCooldownSelf")
end
end
},
["DisableAllFeatures"] = {
["DisplayDescription"] = "Disables all features when the script is outdated/not tested",
["DisplayTitle"] = "Disable Features When Outdated",
["LayoutOrder"] = 18,
["Savable"] = true,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["Requirement"] = "OfficialGame",
["ScriptFunction"] = function(self, Value) end
},
["OfficialJoin"] = {
["DisplayDescription"] = "Makes you join the official forsaken game",
["DisplayTitle"] = "Join the official version",
["LayoutOrder"] = 19,
["Savable"] = false,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["Requirement"] = "OfficialGame~true",
["ScriptFunction"] = function(self, Value)
if Value and not workspace:GetAttribute("LoadingTeleport") then
workspace:SetAttribute("LoadingTeleport",true)
local A = workspace:FindFirstChild("Sounds") and workspace.Sounds:ClearAllChildren()
local B = workspace:FindFirstChild("Themes") and workspace.Themes:ClearAllChildren()
TeleportSound.TimePosition = 0.4
TeleportSound.Volume = 4
TeleportSound.Playing = true
local OtherInstance = GetValue("Rejoin",true)
OtherInstance:SetAttribute("Requirement",true)
task.wait(0.5)
local FrequencyData = HttpService:JSONDecode(ReturnData("AccountType.txt", true))
local PlaceId = 83645629621104
if FrequencyData["New"] and FrequencyData["New"] < FrequencyData["Normal"] then
PlaceId = 18687417158
end
game:GetService("ExperienceService"):LaunchExperience({placeId = PlaceId})
elseif workspace:GetAttribute("LoadingTeleport") then
self.Instance.Value = true
end
end
},
["Rejoin"] = {
["DisplayDescription"] = "Makes you rejoin the exact same server",
["DisplayTitle"] = "Rejoin",
["LayoutOrder"] = 20,
["Savable"] = false,
["InstanceType"] = "BoolValue",
["DefaultInstanceValue"] = false,
["ScriptFunction"] = function(self, Value)
if Value and not workspace:GetAttribute("LoadingTeleport") then
workspace:SetAttribute("LoadingTeleport",true)
local A = workspace:FindFirstChild("Sounds") and workspace.Sounds:ClearAllChildren()
local B = workspace:FindFirstChild("Themes") and workspace.Themes:ClearAllChildren()
TeleportSound.TimePosition = 0.4
TeleportSound.Volume = 4
TeleportSound.Playing = true
local OtherInstance = GetValue("OfficialJoin",true)
OtherInstance:SetAttribute("Requirement",true)
task.wait(0.25)
game:GetService("TeleportService").TeleportInitFailed:Once(function()
workspace:SetAttribute("LoadingTeleport",nil)
TeleportSound.Playing = false
warn("Failed to teleport, please try again. (Rejoin manually if it repeats)")
self.Instance.Value = false
end)
if workspace:GetAttribute("ServerType") == "VIP" then
game:GetService("TeleportService"):Teleport(game.PlaceId)
else
game:GetService("TeleportService"):TeleportToPlaceInstance(game.PlaceId,game.JobId)
end
elseif workspace:GetAttribute("LoadingTeleport") then
self.Instance.Value = true
end
end
},
}
}
-- UI Creation --
MainUI.DisplayOrder = 5
PlusFolderSettings.Name = "Plus"
PlusFolderSettings.Parent = PlayerData
SidePlusButton.Name = "Plus"
SidePlusButton.Parent = Buttons
SidePlusButton.LayoutOrder = MainButton.Name == "Settings" and MainButton.LayoutOrder - 1 or MainButton.LayoutOrder + 1
if NewUIVersion then
PlusButton:FindFirstChild("Icon").ImageColor3 = Color3.fromRGB(0, 170, 127)
PlusButton:FindFirstChild("Icon").Image = "rbxassetid://118860705115878"
PlusButton:FindFirstChild("Text"):FindFirstChild("Name").Text = "Plus"
PlusButton:FindFirstChild("Line").ImageColor3 = Color3.fromRGB(0, 170, 127)
PlusButton:FindFirstChild("Highlight").ImageColor3 = Color3.fromRGB(0, 170, 127)
PlusButton:FindFirstChild("Text"):FindFirstChild("Name").TextColor3 = Color3.fromRGB(0, 170, 127)
PlusButton:FindFirstChild("Texture").ImageColor3 = Color3.fromRGB(0, 170, 127)
for i,v in PlusButton:FindFirstChild("Text"):GetChildren() do if v:IsA("ImageLabel") then v.ImageColor3 = Color3.fromRGB(0, 17, 13) end end
PlusButton:FindFirstChild("BG").ImageColor3 = Color3.fromRGB(0, 17, 13)
PlusButton:FindFirstChild("Grunge").ImageColor3 = Color3.fromRGB(0, 37, 24)
PlusButton:FindFirstChild("Grunge").ImageTransparency = 0.2
PlusButton:FindFirstChild("GrungeMain").ImageTransparency = 1
UIScale.Parent = PlusButton
else
SidePlusButton.Button.ImageColor3 = Color3.fromRGB(0, 170, 127)
SidePlusButton.Icon.ImageColor3 = Color3.fromRGB(0, 170, 127)
SidePlusButton.Icon.Image = "rbxassetid://118860705115878"
SidePlusButton.Inverted.ImageColor3 = Color3.fromRGB(105, 255, 212)
SidePlusButton.Inverted.ImageTransparency = 1
SidePlusButton.InvertedIcon.ImageColor3 = Color3.fromRGB(105, 255, 212)
SidePlusButton.InvertedIcon.Image = "rbxassetid://85001556314176"
SidePlusButton.InvertedIcon.ImageTransparency = 1
PulloutFramePlus.Title.TextColor3 = Color3.fromRGB(0, 170, 127)
PulloutFramePlus.Position = UDim2.fromScale(0,0.5)
PulloutFramePlus.ArtAsset.ImageColor3 = Color3.fromRGB(0, 170, 127)
PulloutFramePlus.Inverted.ImageColor3 = Color3.fromRGB(105, 255, 212)
PulloutFramePlus.Inverted.ImageTransparency = 1
end
local Arrow = ReplicatedStorage:FindFirstChild("DropdownArrow",true):Clone()
Arrow.ImageColor3 = Color3.fromRGB(0, 170, 127)
Arrow.Parent = SidePlusButton
Arrow.Position = UDim2.fromScale(1.6,0.5)
Arrow.AnchorPoint = Vector2.new(0.5,0.5)
Arrow.Rotation = 90
Arrow.Size = UDim2.fromScale(0.67,0.67)
Arrow.Visible = false
Arrow.Active = false
PlusMenu.Name = "PlusScreen"
PlusMenu.Parent = MainUI
PlusMenu.Visible = false
PlusMenu.Size = UDim2.new(1,-20,0,0)
PlusMenu.SettingsContainer.ImageColor3 = Color3.fromRGB(0, 170, 127)
PlusMenu.SettingsContainer.BackgroundTransparency = 1
PlusMenu.SettingsContainer.Contents.ScrollBarImageColor3 = Color3.fromRGB(0, 170, 127)
PlusMenu.SettingsContainer.Contents.Size = UDim2.fromScale(0.95,0.935)
PlusMenu.SettingsContainer.Contents.Position = UDim2.fromScale(0.5,0.035)
PlusMenu.ZIndex += 25
for i,v in PlusMenu.SettingsContainer:GetChildren() do if not (v:IsA("UIAspectRatioConstraint") or v.Name == "Contents") then v:Destroy() end end
for i,v in PlusMenu.SettingsContainer.Contents:QueryDescendants("Frame,ImageLabel") do v:Destroy() end
-- Functions --
function ColoredPrint(Text, Icon, Color)
task.spawn(function()
task.spawn(function()
if not _G.Initialized and not _G.Initizalling then
_G.Initizalling = true
_G.PrintedData = {}
local CoreGuiConnection
local function Handle(child)
if child.Name == "DevConsoleMaster" then
CoreGuiConnection:Disconnect()
local DevConsoleMaster = child
local DevConsoleUI = DevConsoleMaster:FindFirstChild("DevConsoleUI",true) or DevConsoleMaster:WaitForChild("DevConsoleWindow",999999):WaitForChild("DevConsoleUI",999999)
local IconData = {
["error"] = {"rbxasset://textures/DevConsole/Error.png","rbxassetid://97467062933153",Color3.fromRGB(215,90,74)},
["information"] = {"rbxasset://textures/DevConsole/Info.png","rbxassetid://98895588220731",Color3.fromRGB(0,162,255)},
["warning"] = {"rbxasset://textures/DevConsole/Warning.png","rbxassetid://129253285072281",Color3.fromRGB(255,218,68)},
["plus"] = {"rbxassetid://127360009371476","rbxassetid://127360009371476",Color3.fromRGB(255,255,255)},
["success"] = {"rbxassetid://75097763556603","rbxassetid://87889653826033",Color3.fromRGB(105,215,74)},
}
local function GetIcon(Icon)
if type(Icon) == "string" then
local iconLower = Icon:lower()
for i,v in pairs(IconData) do
if string.lower(string.sub(i, 1, #iconLower)) == iconLower then
return v
end
end
end
return IconData["information"]
end
local function RunChecks(ins)
local Log = ins:FindFirstChild("ClientLog")
local function RunChecks2(ins2,Log)
local TextLabel = ins2:FindFirstChildWhichIsA("TextLabel")
local Image = ins2:FindFirstChildWhichIsA("ImageLabel")
if TextLabel then
local function Update()
local ID = string.sub(TextLabel.Text, -7, -1)
if _G.PrintedData[ID] then
local Data = _G.PrintedData[ID]
local Icon = Data[1] or nil
local Color = Data[2] or nil
local ImageColored = false
TextLabel.RichText = true
if type(Icon) ~= type("") and typeof(Color) ~= typeof(Color3.new()) then
Icon = GetIcon("info")[1]
ImageColored = false
Color = Color3.new(1,1,1)
elseif type(Icon) == type("") and typeof(Color) ~= typeof(Color3.new()) then
Color = GetIcon(Icon)[3]
ImageColored = false
Icon = GetIcon(Icon)[1]
elseif type(Icon) ~= type("") and typeof(Color) == typeof(Color3.new()) then
Icon = ""
ImageColored = false
elseif type(Icon) == type("") and typeof(Color) == typeof(Color3.new()) then
ImageColored = true
Icon = GetIcon(Icon)[2]
end
local OriginalText = TextLabel.Text
local function Update2()
TextLabel.Text = string.format("<font color='#%s' size='15'>%s</font>",Color:ToHex(),string.gsub(OriginalText,ID,""))
if Image then
Image.Image = Icon
if ImageColored then
Image.ImageColor3 = Color
end
end
end
Update2()
else
Image.ImageColor3 = Color3.new(1,1,1)
Image.Image = TextLabel.TextColor3 == Color3.fromRGB(255,218,68) and GetIcon("warning")[1] or TextLabel.TextColor3 == Color3.fromRGB(215,90,74) and GetIcon("error")[1] or TextLabel.TextColor3 == Color3.fromRGB(0,162,255) and GetIcon("info")[1] or ""
end
TextLabel:GetPropertyChangedSignal("Text"):Once(Update)
end
Update()
end
end
if Log then
for i,ins2 in pairs(Log:GetChildren()) do
RunChecks2(ins2, Log)
end
Log.ChildAdded:Connect(function(ins2)
RunChecks2(ins2, Log)
end)
end
ins.ChildAdded:Connect(function(Log)
if Log.Name == "ClientLog" then
for i,ins2 in pairs(Log:GetChildren()) do
RunChecks2(ins2, Log)
end
Log.ChildAdded:Connect(function(ins2)
RunChecks2(ins2, Log)
end)
end
end)
end
if DevConsoleUI:FindFirstChild("MainView") then
RunChecks(DevConsoleUI:FindFirstChild("MainView"))
end
DevConsoleUI.ChildAdded:Connect(function(ins)
if ins.Name == "MainView" then
RunChecks(ins)
end
end)
_G.Initialized = true
_G.Initizalling = nil
end
end
CoreGuiConnection = game:GetService("CoreGui").ChildAdded:Connect(Handle)
if game:GetService("CoreGui"):FindFirstChild("DevConsoleMaster") then
Handle(game:GetService("CoreGui"):FindFirstChild("DevConsoleMaster"))
end
end
end)
local UniqueID = string.sub(game:GetService("HttpService"):GenerateGUID(false), 1, 7)
game:GetService("LogService"):Output((type(Text) == "string" and Text or "") .. UniqueID)
_G.PrintedData[UniqueID] = {Icon,Color}
end)
end
function PlaySound(SoundName,Settings,KeepPlaying)
local Sound = typeof(SoundName) == "string" and AssetsFolder.Sounds:FindFirstChild(SoundName,true) or (typeof(SoundName) == "Instance" and SoundName) or nil
if Sound then
task.spawn(function()
Sound = Sound:Clone()
Sound.Parent = workspace:FindFirstChild("Sounds") or workspace
if type(Settings) == "table" then
for i,v in Settings do
Sound[i] = v
end
end
if KeepPlaying then
Sound.Playing = true
else
Sound:Play()
end
Debris:AddItem(Sound, Sound.TimeLength + 1)
return Sound
end)
else
warn("Failed to play sound: ".. tostring(SoundName))
end
end
local function SetButtonState(Active)
task.spawn(function()
local u4 = {}
local BGData = {
["Active"] = {
["ImageColor3"] = Color3.fromRGB(0, 170, 127)
},
["Inactive"] = {
["ImageColor3"] = Color3.fromRGB(0, 17, 13)
}
}
u4.BG = BGData
local GrungeMainData = {
["Active"] = {
["ImageColor3"] = Color3.fromRGB(0, 37, 24)
},
["Inactive"] = {
["ImageColor3"] = Color3.fromRGB(80, 80, 80)
}
}
u4.GrungeMain = GrungeMainData
local GrungeData = {
["Active"] = {
["ImageTransparency"] = 0,
["ImageColor3"] = Color3.fromRGB(0, 229, 171)
},
["Inactive"] = {
["ImageTransparency"] = 0.2,
["ImageColor3"] = Color3.fromRGB(0, 37, 24)
}
}
u4.Grunge = GrungeData
local HighlightData = {
["Active"] = {
["ImageColor3"] = Color3.fromRGB(0, 37, 24)
},
["Inactive"] = {
["ImageColor3"] = Color3.fromRGB(0, 170, 127)
}
}
u4.Highlight = HighlightData
local IconData = {
["Active"] = {
["ImageColor3"] = Color3.fromRGB(0, 37, 24)
},
["Inactive"] = {
["ImageColor3"] = Color3.fromRGB(0, 170, 127)
}
}
u4.Icon = IconData
local LineData = {
["Active"] = {
["ImageColor3"] = Color3.fromRGB(0, 37, 24)
},
["Inactive"] = {
["ImageColor3"] = Color3.fromRGB(0, 170, 127)
}
}
u4.Line = LineData
local TextLabelUI = PlusButton:FindFirstChild("Text")
for i, Child in TextLabelUI and TextLabelUI:GetChildren() or {} do
if Child:IsA("TextLabel") then
TweenService:Create(Child, TweenInfo.new(0.25), {
["TextColor3"] = Active and Color3.fromRGB(0, 37, 24) or Color3.fromRGB(0, 170, 127)
}):Play()
elseif Child:IsA("ImageLabel") then
TweenService:Create(Child, TweenInfo.new(0.25), {
["ImageColor3"] = Active and Color3.fromRGB(0, 170, 127) or Color3.fromRGB(0, 17, 13)
}):Play()
end
end
local v28 = Active and "Active" or "Inactive"
for v29, v30 in u4 do
local v31 = PlusButton:FindFirstChild(v29)
if v31 then
TweenService:Create(v31, TweenInfo.new(0.25), v30[v28]):Play()
end
end
end)
end
function GetValue(FeatureName,InstanceOnly)
local FeatureInstance = Values[FeatureName]
if not FeatureInstance then
FeatureInstance = PlusFolderSettings:FindFirstChild(FeatureName,true)
Values[FeatureName] = FeatureInstance
end
if InstanceOnly then
return FeatureInstance
else
return FeatureInstance and FeatureInstance.Value
end
end
function GetFunction(Function1, Function2)
return typeof(Function1) == "function" and Function1 or (typeof(Function2) == "function" and Function2) or nil
end
-- Patch 168: Always read the current ABH NumberValue from the settings folder.
-- Some menu implementations can replace the NumberValue when a slider changes,
-- which would leave the cached Values[] entry pointing at the old value.
function GetCurrentHitboxAdjustment(FeatureName)
local CurrentInstance = PlusFolderSettings and PlusFolderSettings:FindFirstChild(FeatureName, true)
if CurrentInstance and CurrentInstance:IsA("NumberValue") then
return tonumber(CurrentInstance.Value) or 0
end
-- Never fall back to Values[] here: a replaced slider instance must not
-- leave an old individual-killer ABH adjustment active.
return 0
end
function RichTextGradientColor(Text:string,Colors)
local Count = 0
for Char in Text:gmatch(utf8.charpattern) do
if Char ~= " " then
Count += 1
end
end
if Count == 0 then return Text end
local MaxIndex = math.max(1,Count-1)
local Segments = #Colors-1
local Result,Used = "",0
for Char in Text:gmatch(utf8.charpattern) do
if Char == " " then
Result..=Char
elseif Char:byte() >= 128 then
else
local T = Used/MaxIndex
Used += 1
local Segment= math.min(math.floor(T*Segments),Segments-1)
Result..=('<font color="#%s">%s</font>'):format(Colors[Segment+1]:Lerp(Colors[Segment+2],T*Segments-Segment):ToHex(),Char)
end
end
return Result
end
local function collidewith(gui1,gui2)
local gui1_topLeft,gui1_bottomRight = gui1.AbsolutePosition, gui1.AbsolutePosition + gui1.AbsoluteSize
local gui2_topLeft,gui2_bottomRight = gui2.AbsolutePosition, gui2.AbsolutePosition + gui2.AbsoluteSize
return ((gui1_topLeft.x < gui2_bottomRight.x and gui1_bottomRight.x > gui2_topLeft.x) and (gui1_topLeft.y < gui2_bottomRight.y and gui1_bottomRight.y > gui2_topLeft.y))
end
function TableValueFind(Table, MatchFn, Seen)
if type(Table) ~= "table" or type(MatchFn) ~= "function" then
return nil
end
Seen = Seen or {}
if Seen[Table] then
return nil
end
Seen[Table] = true
for Key, Value in Table do
if MatchFn(Key, Value) then
return Value, Key, Table
elseif type(Value) == "table" then
local FoundValue, FoundKey, FoundParent = TableValueFind(Value, MatchFn, Seen)
if FoundKey ~= nil then
return FoundValue, FoundKey, FoundParent
end
end
end
return nil
end
function CanPlayOverrideAnim(Character)
return Character and Character.Parent and GetValue("AnimationChanger") ~= "Original" and ((GetValue("ChangeInLobby") and Character.Parent.Name == "Spectating") or Character.Parent.Name ~= "Spectating")
end
function GetAnimationType(ID)
for i,v in AllAnimations do
for animtype,animId in v do
if type(animId) == "table" then
for i2,v2 in animId do
if type(v2) == "string" and v2:find(tostring(ID)) then
return animtype,i,i2
end
end
else
if type(animId) == "string" and animId:find(tostring(ID)) then
return animtype,i
end
end
end
end
end
local function AddOverridenAnimation(ID)
if LocalCharacter and ID then
if OverriddenAnimations[ID] then
return table.unpack(OverriddenAnimations[ID])
end
local OverrideFolder = LocalCharacter:FindFirstChild("OverrideAnimation") or Instance.new("Folder", LocalCharacter)
OverrideFolder.Name = "OverrideAnimation"
local AnimType,CharName = GetAnimationType(ID) or "Unknown"
local Animation = Instance.new("Animation")
Animation.Name = AnimType .. tostring(ID)
Animation.AnimationId = tostring(ID):find("id") and tostring(ID) or "http://www.roblox.com/asset/?id=" .. tostring(ID)
Animation.Parent = OverrideFolder
Animation:SetAttribute("Overriden",true)
if LocalAnimator then
local Track = LocalAnimator:LoadAnimation(Animation)
OverriddenAnimations[ID] = {Track,Animation}
return Track,Animation
end
else
return
end
end
local SupportedOverrides = {"idle","walk","run"}
function UpdateAnim(Humanoid)
local AnimSelected = GetValue("AnimationChanger")
if not CanPlayOverrideAnim(LocalCharacter) then return end
local AnimString
local Type
if MainModule["IsSprinting"] and Humanoid.MoveDirection ~= Vector3.zero then
AnimString = AllAnimations[AnimSelected] and AllAnimations[AnimSelected]["Run"]
Type = "Run"
elseif Humanoid.MoveDirection ~= Vector3.zero then
AnimString = AllAnimations[AnimSelected] and AllAnimations[AnimSelected]["Walk"]
Type = "Walk"
else
AnimString = AllAnimations[AnimSelected] and AllAnimations[AnimSelected]["Idle"]
Type = "Idle"
end
if AnimString then
local FoundAction = false
for i,v in Humanoid:GetPlayingAnimationTracks() do
if v.Animation and v.Animation:GetAttribute("Overriden") then
v:Stop(0.2)
continue
end
if not v.IsPlaying then
continue
end
local AnimType,Char,Name = GetAnimationType(v.Animation.AnimationId)
local IsSupported = false
for i,v in SupportedOverrides do
if AnimType and AnimType:lower():find(v:lower()) then
IsSupported = true
end
end
if not IsSupported then
FoundAction = v
end
end
local OverrideTrack,Animation = AddOverridenAnimation(AnimString)
if OverrideTrack and CanPlayOverrideAnim(LocalCharacter) then
OverrideTrack:Play(not FoundAction and 0.1 or 0.3)
end
end
end
function DefaultData(Path, Option)
if isfile("NaikoScript/ForsakenPlus/" .. Path) then
ColoredPrint("Option already exists", "info", Color3.fromRGB(252, 210, 150))
else
writefile("NaikoScript/ForsakenPlus/" .. Path, Option)
ColoredPrint("Set default data", "success", Color3.fromRGB(125, 230, 75))
end
return
end
function ChangeData(Path, Option, WithFolder)
if WithFolder == false then
if isfile(Path) then
writefile(Path,Option)
end
else
if isfile("NaikoScript/ForsakenPlus/" .. Path) then
writefile("NaikoScript/ForsakenPlus/" .. Path, Option)
end
end
end
function ReturnData(Path, WithFolder)
if WithFolder == false then
if isfile(Path) ~= false then
return readfile(Path)
end
else
if isfile("NaikoScript/ForsakenPlus/" .. Path) ~= false then
return readfile("NaikoScript/ForsakenPlus/" .. Path)
end
return nil
end
end
-- General Scripting --
if not (game.GameId == 6331902150 or game.GameId == 7464167604) then
FeatureLoadout["Unofficial"] = {
["TabAttributes"] = {
["DisplayTitle"] = '<font color="rgb(255,166,0)">⚠</font>' .. RichTextGradientColor(" SOME FEATURES MAY NOT WORK HERE ",{Color3.fromRGB(255, 166, 0), Color3.fromRGB(243, 227, 0)}) .. '<font color="rgb(243, 227, 0)">⚠</font>',
["LayoutOrder"] = -1
}
}
ColoredPrint("This is not the official game which means some of the features may not work as expected.", "warning", Color3.fromRGB(255, 166, 0))
end
FeatureLoadout["EnviromentFunctions"]["TabAttributes"]["DisplayTitle"] = string.format(
"Script Made by %s | %s ",
RichTextGradientColor("Naiko Scripts",{Color3.fromRGB(0, 255, 128),Color3.fromRGB(0, 102, 255)}),
RichTextGradientColor("V"..Version,{Color3.fromRGB(87, 160, 255),Color3.fromRGB(0, 132, 255)})
) -- Tryna edit something here?? i can see that... you ain taking that you know..
FeatureLoadout["Visuals"]["DisableNoliNPC"]["DisplayTitle"] = string.format("Disable %s NPC", RichTextGradientColor("Noli's",{Color3.fromRGB(130, 72, 255), Color3.fromRGB(77, 0, 185)}))
FeatureLoadout["Visuals"]["Disable007n7NPC"]["DisplayTitle"] = string.format("Disable %s NPC", RichTextGradientColor("007n7's",{Color3.fromRGB(117, 161, 255), Color3.fromRGB(13, 70, 175)}))
FeatureLoadout["Features"]["NoliControl"]["DisplayTitle"] = string.format("Better %s", RichTextGradientColor("Void Rush",{Color3.fromRGB(240, 90, 253), Color3.fromRGB(141, 0, 197)}))
FeatureLoadout["Features"]["ControllableDash"]["DisplayTitle"] = string.format("Make %s Dash Controllable", RichTextGradientColor("Coolkidd's",{Color3.fromRGB(255, 22, 22), Color3.fromRGB(175, 13, 13)}))
FeatureLoadout["Automation"]["AutoEscape"]["DisplayDescription"] = string.format("Auto-Escapes <b>%s</b> Hook",RichTextGradientColor("Nosferatu's",{Color3.fromRGB(192, 15, 24), Color3.fromRGB(108, 20, 9)}))
FeatureLoadout["Automation"]["AutoDisarm"]["DisplayDescription"] = string.format("Auto-Disarms <b>%s</b> Traps",RichTextGradientColor("Azure's",{Color3.fromRGB(130, 72, 255), Color3.fromRGB(49, 0, 228)}))
local ThreadBindable = Instance.new("BindableEvent")
task.spawn(function()
while task.wait(0.1) do
ThreadBindable:Fire()
end
end)
local InputDeviceType = {Keyboard = "PC", MouseButton1 = "PC", MouseButton2 = "PC", MouseMovement = "PC", Touch = "Mobile", Gamepad1 = "Console"}
local Device = InputDeviceType[UserInputService:GetLastInputType().Name]
local getgc = GetFunction(getgc, get_gc)
local IsRequireSupported = false
task.spawn(function()
local generaltest,result = pcall(function()
return require(LocalPlayer:FindFirstChildOfClass("PlayerScripts"):FindFirstChild("PlayerModule"))
end)
local s,Err = pcall(function()
LogService:Info("",result)
end)
local Success,Result
if tostring(Err):find("cyclic") or s then
if s then
--ColoredPrint("Require does not function completely correctly some features could bug out!","warn", Color3.new(1,0.25,0))
end
if Device == "PC" then
Success, Result = pcall(function()
local Module = require(ReplicatedStorage:WaitForChild("Systems",4):WaitForChild("Character",4):WaitForChild("Game",4):WaitForChild("Sprinting",4))
if Module and type(Module) == "table" and Module["StaminaChanged"] then
IsRequireSupported = true
return Module
end
end)
else
Success, Result = pcall(function()
for i,Object in getgc(true) do
if type(Object) == "table" then
if rawget(Object, "Stamina") and rawget(Object, "StaminaChanged") then
return Object
end
end
end
end)
end
end
if not (Success and type(Result) == "table") then
FeatureLoadout["EnviromentFunctions"]["require"]["DefaultInstanceValue"] = false
else
IsRequireSupported = true
MainModule = Result
end
local AnimationPreset = FeatureLoadout["Features"]["AnimationChanger"]
if IsRequireSupported and KillerAssets and SurvivorAssets and SkinsAssets then
if ReplicatedStorage:FindFirstChild("Modules") and ReplicatedStorage:FindFirstChild("Modules"):FindFirstChild("Util",true) then
--UtilModule = require(ReplicatedStorage:FindFirstChild("Modules"):FindFirstChild("Util",true))
end
local AllAssets = {}
for i,v in KillerAssets:QueryDescendants("ModuleScript#Config") do
table.insert(AllAssets,v)
end
for i,v in SurvivorAssets:QueryDescendants("ModuleScript#Config") do
table.insert(AllAssets,v)
end
for i,v in SkinsAssets:QueryDescendants("ModuleScript#Config") do
table.insert(AllAssets,v)
end
for i,ConfigModule in AllAssets do
if ConfigModule.Parent:IsA("Model") then continue end
local ConfigData = require(ConfigModule)
local AnimationData = ConfigData and ConfigData.Animations
if ConfigModule.Parent.Name == "Noli" and ConfigData and TableValueFind(ConfigData, function(Key, Value) return type(Key) == "string" and Key:find("InitialTurnMult") end) then
NoliConfig = ConfigData
end
if ConfigModule.Parent.Name == "TwoTime" and AnimationData and TableValueFind(AnimationData, function(Key, Value) return type(Key) == "string" and Key:find("CrouchIdle") end) then
AllAnimations["Crouch"] = {["Idle"] = AnimationData["CrouchIdle"],["Walk"] = AnimationData["CrouchWalk"],["Run"] = AnimationData["CrouchRun"]}
end
if ConfigModule.Parent.Name == "1x1x1x1" and AnimationData and TableValueFind(ConfigData, function(Key, Value) return type(Key) == "string" and Key:find("ZombieAnimations") end) then
AllAnimations["NPC Zombie"] = TableValueFind(ConfigData, function(Key, Value) return type(Key) == "string" and Key:find("ZombieAnimations") end)
end
if not AnimationData or not ConfigData.DisplayName then continue end
local ChosenName = ConfigData.DisplayName:find("Milestone") and string.format("%s %s",ConfigModule.Parent.Parent.Name,ConfigData.DisplayName:gsub("Milestone ","")) or ConfigData.DisplayName
AllAnimations[ChosenName] = AnimationData
end
for i,v in string.split(AnimationPreset["ExtraData"]["Options"], "|") do
if v ~= "Original" then
if not AllAnimations[v] or not AllAnimations[v]["Idle"] then
AnimationPreset["ExtraData"]["Options"] = AnimationPreset["ExtraData"]["Options"]:gsub("|" .. v, "")
end
end
end
if AnimationPreset["ExtraData"]["Options"]:gsub("|Default Roblox","") == "Original" then
AnimationPreset["Requirement"] = true
end
--[[if UtilModule then
local AllPlayersSideUI = MainUI:FindFirstChild(LocalPlayer.Name,true) and MainUI:FindFirstChild(LocalPlayer.Name,true).Parent
local function HandlePlayerForUI(Player)
if AllPlayersSideUI:FindFirstChild(Player.Name) then
local PlayersUI = AllPlayersSideUI:FindFirstChild(Player.Name)
local PlayersData = Player:FindFirstChild("PlayerData")
local Settings = PlayersData and PlayersData:FindFirstChild("Settings")
local Pron = Settings and Settings:FindFirstChild("Pronouns",true)
if Pron and Pron.Value == "discord.gg/Fs47aNrdGF" then
local NoChat = PlayersUI:FindFirstChild("NoChat")
if NoChat then
NoChat.Visible = false
end
local ClonedUI = ReplicatedStorage:FindFirstChild("NoChat",true) and ReplicatedStorage:FindFirstChild("NoChat",true):Clone()
if ClonedUI then
ClonedUI.Name = "FSUser"
ClonedUI.Image = "rbxassetid://118860705115878"
ClonedUI.Parent = PlayersUI
ClonedUI.Visible = true
ClonedUI.AnchorPoint = Vector2.new(0.5,0.425)
ClonedUI.MouseEnter:Connect(function()
UtilModule:CreateTooltip("This is a Forsaken Plus user.")
end)
ClonedUI.MouseLeave:Connect(function()
UtilModule:CreateTooltip("")
end)
if ClonedUI:FindFirstChildOfClass("UIAspectRatioConstraint") then
ClonedUI:FindFirstChildOfClass("UIAspectRatioConstraint").AspectRatio = 1
end
end
end
end
end
if AllPlayersSideUI then
for i,v in Players:GetPlayers() do
HandlePlayerForUI(v)
end
Players.PlayerAdded:Connect(function(v)
task.delay(1.5,function() HandlePlayerForUI(v) end)
end)
else
ColoredPrint("Failed to find PlayerList UI","error")
end
end]]
else
AnimationPreset["Requirement"] = true
end
if not NoliConfig then
FeatureLoadout["Features"]["NoliControl"]["Requirement"] = true
end
end)
local SupportedOverrides = {"idle","walk","run"}
local function StartSprintDetection()
repeat task.wait(0.1) until MainModule["__sprintedEvent"]
MainModule["__sprintedEvent"].Event:Connect(function()
if GetValue("AnimationChanger") ~= "Original" then
UpdateAnim(LocalHumanoid)
end
end)
MainModule["__sprintedEvent"].Destroying:Once(function()
StartSprintDetection()
end)
end
if MainModule then
task.spawn(StartSprintDetection)
end
local function ActionOnCharacter(Character)
LocalCharacter = Character
LocalHumanoid = LocalCharacter and (LocalCharacter:FindFirstChildOfClass("Humanoid") or LocalCharacter:WaitForChild("Humanoid",2)) or nil
LocalHead = LocalCharacter and (LocalCharacter:FindFirstChild("Head") or LocalCharacter:WaitForChild("Head",2)) or nil
LocalRoot = LocalCharacter and ((LocalHumanoid and LocalHumanoid.RootPart) or LocalCharacter:FindFirstChild("HumanoidRootPart") or LocalCharacter:WaitForChild("HumanoidRootPart",2)) or nil
LocalAnimator = LocalHumanoid and (LocalHumanoid:FindFirstChildOfClass("Animator") or LocalHumanoid:WaitForChild("Animator",2)) or nil
SpeedMultipliers = LocalCharacter and (Character:FindFirstChild("SpeedMultipliers") or Character:WaitForChild("SpeedMultipliers",5)) or nil
ResistanceMultipliers = LocalCharacter and (Character:FindFirstChild("ResistanceMultipliers") or Character:WaitForChild("ResistanceMultipliers",5)) or nil
FOVMultipliers = LocalCharacter and (Character:FindFirstChild("FOVMultipliers") or Character:WaitForChild("FOVMultipliers",5)) or nil
task.spawn(function()
SetButtonState(false)
OverriddenAnimations = {}
LastAnimOriginalUsed = LocalAnimator:GetPlayingAnimationTracks()[1]
LocalAnimator.AnimationPlayed:Connect(function(Track)
if CanPlayOverrideAnim(LocalCharacter) and MainModule then
local Override = Track.Animation:GetAttribute("Overriden")
if Override then
--return
end
LastAnimOriginalUsed = not Override and Track or LastAnimOriginalUsed
local AnimType,CharName = GetAnimationType(tonumber(Track.Animation.AnimationId:match("%d+")))
if not Override then
for i,v in SupportedOverrides do
if AnimType and AnimType:lower():find(v:lower()) then
Track:Stop(0)
elseif not AnimType and Track.Looped then
Track:Stop(0)
end
end
end
local FoundAction = false
for i,v in LocalAnimator:GetPlayingAnimationTracks() do
task.spawn(function()
local AnimType,Char,Name = GetAnimationType(v.Animation.AnimationId)
local IsSupported = false
for i,v in SupportedOverrides do
if AnimType and AnimType:lower():find(v:lower()) then
IsSupported = true
end
end
if v.IsPlaying and not IsSupported and not v:GetAttribute("Ignored") then
FoundAction = v
end
end)
end
if FoundAction and Override then
Track:Stop(0.2)
task.wait(not FoundAction.Looped and FoundAction.Length * 0.95 or 0)
if FoundAction.Looped then
FoundAction.Stopped:Wait()
end
FoundAction:SetAttribute("Ignored",true)
task.delay(0.2,function()
FoundAction:SetAttribute("Ignored",nil)
end)
UpdateAnim(LocalHumanoid)
end
end
end)
local MoreThanZero = 0
LocalHumanoid:GetPropertyChangedSignal("MoveDirection"):Connect(function()
if GetValue("AnimationChanger") ~= "Original" and MoreThanZero ~= (LocalHumanoid.MoveDirection.Magnitude == 0) then
MoreThanZero = (LocalHumanoid.MoveDirection.Magnitude == 0)
UpdateAnim(LocalHumanoid)
end
end)
task.delay(0.05,UpdateAnim,LocalHumanoid)
end)
end
if not MainModule then
ColoredPrint("Failed to load required modules, some features may be hidden.\n use a different executor that supports 'require' and 'getgc'", "warn", Color3.new(1,0.25,0))
FeatureLoadout["EnviromentFunctions"]["getgc"]["DefaultInstanceValue"] = false
end
if FeatureLoadout["EnviromentFunctions"]["getgc"]["DefaultInstanceValue"] then
task.spawn(function()
if game.GameId ~= 6331902150 then
task.wait(0.5)
if IsRequireSupported then
for i,v in getgc(true) do
if type(v) == type({}) then
if not rawget(v,"Idle") or not rawget(v,"Run") then if i%250 == 0 then task.wait() end continue end
local num = 0
for i,v in v do
num += 1
end
if num > 3 then
AllAnimations[HttpService:GenerateGUID(false):sub(1,5)] = v
end
end
end
end
end
end)
end
--local readfile = GetFunction(readfile, read_file)
--local writefile = GetFunction(writefile, write_file)
--local isfolder = GetFunction(isfolder, is_folder)
--local isfile = GetFunction(isfile, is_file)
--local makefolder = GetFunction(makefolder, make_folder)
local UserType = 1
if not (readfile and writefile and isfolder and isfile) then
FeatureLoadout["EnviromentFunctions"]["files"]["DefaultInstanceValue"] = false
else
if not isfolder("NaikoScript") and not isfolder("NaikoScript/ForsakenPlus") then
makefolder("NaikoScript")
makefolder("NaikoScript/ForsakenPlus")
UserType = 1
elseif isfolder("NaikoScript") and not isfolder("NaikoScript/ForsakenPlus") then
UserType = 2
makefolder("NaikoScript/ForsakenPlus")
elseif isfolder("NaikoScript") and isfolder("NaikoScript/ForsakenPlus") then
UserType = 3
end
DefaultData("Data.txt", "{}")
DefaultData("AccountType.txt","{}")
makefolder("NaikoScript/ForsakenPlus/Plugins")
end
if UserType < 3 then
task.spawn(function()
Arrow.Visible = true
local MovingTween = TweenService:Create(Arrow, TweenInfo.new(0.6, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut, -1, true), {Position = UDim2.fromScale(1.4, 0.5)})
MovingTween:Play()
SidePlusButton.Button.MouseEnter:Wait()
local DisappearTween = TweenService:Create(Arrow, TweenInfo.new(0.25, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {Position = UDim2.fromScale(1.6, 0.5),Size = UDim2.fromScale(0.2, 0.2),ImageTransparency = 1})
MovingTween:Pause()
MovingTween:Cancel()
DisappearTween:Play()
DisappearTween.Completed:Wait()
Arrow.Visible = false
end)
end
local hookmetamethod = GetFunction(hookmetamethod, hook_metamethod)
if not hookmetamethod then
FeatureLoadout["EnviromentFunctions"]["hookmetamethod"]["DefaultInstanceValue"] = false
end
if GetValue("OfficialGame") then
task.spawn(function()
local FrequencyData = HttpService:JSONDecode(ReturnData("AccountType.txt", true))
FrequencyData["Normal"] = FrequencyData["Normal"] or 0
FrequencyData["New"] = FrequencyData["New"] or 0
ChangeData("AccountType.txt",HttpService:JSONEncode(FrequencyData),true)
if GetValue("PrivateServer") then return end
for i,v in Players:GetPlayers() do if v:IsFriendsWithAsync(LocalPlayer.UserId) then return end end
if UserType < 3 then
task.wait(26)
if PlayerGui:FindFirstChild("LoadingGui") then return end
if game.PlaceId ~= 83645629621104 then
FrequencyData["Normal"] = 3
else
FrequencyData["New"] = 5
end
else
task.wait(18)
if PlayerGui:FindFirstChild("LoadingGui") then return end
if game.PlaceId ~= 83645629621104 then
FrequencyData["Normal"] += 2
FrequencyData["New"] -= 1
else
FrequencyData["New"] += 2
FrequencyData["Normal"] -= 1
end
end
ChangeData("AccountType.txt",HttpService:JSONEncode(FrequencyData),true)
end)
end
task.spawn(function()
local AzureQTE = KillerAssets and KillerAssets:FindFirstChild("Azure") and KillerAssets:FindFirstChild("Azure"):FindFirstChild("cl_ConstructQTE",true)
if IsRequireSupported and AzureQTE then
local RequiredModule = require(AzureQTE)
task.delay(1,function()
local origin;origin = hookfunction(RequiredModule.new,function(...)
local QTEAzure = origin(...)
task.delay(0.05,function()
if typeof(QTEAzure) == "table" and QTEAzure.AddProgress then
if GetValue("AutoDisarm") then
QTEAzure:AddProgress(100)
else
CurrentQTEAzure = QTEAzure
end
else
warn("Failed Doing QTE For Azure")
end
end)
return QTEAzure
end)
end)
end
end)
LocalPlayer.CharacterAdded:Connect(ActionOnCharacter)
ActionOnCharacter(LocalCharacter or LocalPlayer.Character)
TeleportSound = Instance.new("Sound")
TeleportSound.Name = "TeleportSound"
TeleportSound.SoundId = "rbxassetid://130359426691991"
TeleportSound.Parent = CoreGui
TeleportSound.Volume = 0.001
TeleportSound:Play()
local fireproximitypromptFunction = GetFunction(fireproximityprompt, fire_proximity_prompt)
local fireprompt = fireproximitypromptFunction and function(ProximityPrompt)
return ProximityPrompt and fireproximitypromptFunction(ProximityPrompt)
end or function(ProximityPrompt)
if ProximityPrompt then
ProximityPrompt:InputHoldBegin();ProximityPrompt:InputHoldEnd()
end
end
RoundEvent.Event:Connect(function(Data)
IsUnderground = false
end)
local Graf2 = workspace:FindFirstChild("Graf2",true)
if Graf2 and math.round(Graf2.Position.X) == -3600 and Graf2:FindFirstChildWhichIsA("ImageLabel",true) then
Graf2.Position = Vector3.new(-3600, 19.25, 232.5)
Graf2.Size = Vector3.new(4.25, 1.5, 0.13)
Graf2.Rotation = Vector3.new(7, 90, 0)
Graf2:FindFirstChildWhichIsA("ImageLabel",true).Image = "rbxassetid://86461599034861"
Graf2:FindFirstChildWhichIsA("ImageLabel",true).ImageTransparency = 0.2
end
local BaseTweenInfo = TweenInfo.new(0.25)
local MenuData
if NewUIVersion then
local suc,err
if IsRequireSupported then
suc,err = pcall(function()
MenuData = require(ReplicatedStorage.Systems.Player:FindFirstChild("SidebarHandler",true))
end)
end
if not suc or not MenuData then
ColoredPrint('\n\n<font size="28"><b>⚠ YOUR EXECUTOR DOES NOT SUPPORT THIS SCRIPT ⚠</b></font>\n\n Switch to a different executor or play a forsaken clone game that uses the V1 UI.\n The executor must fully support "require" function for the script to work here\n', "error", Color3.new(1,0.4,0.25))
SidePlusButton:Destroy()
PlusMenu:Destroy()
StarterGui:SetCore("DevConsoleVisible", true)
if MainUI:FindFirstChild("UpdateScreen") then
MainUI:FindFirstChild("UpdateScreen").Visible = false
end
return
end
MenuData.__index = MenuData
local UICreator = {}
UICreator.__index = UICreator
function UICreator.new(MenuName, MenuScreen)
local Metaverse = setmetatable({}, UICreator)
Metaverse.Menu = MenuScreen:Clone()
local MenuToggleBin = Instance.new("BindableEvent")
Metaverse.Toggled = MenuToggleBin
Metaverse.Button = nil
Metaverse.MenuName = MenuName
Metaverse.Menu.Visible = false
Metaverse.Menu.Size = UDim2.fromScale()
Metaverse.Menu.Parent = MainUI
for i,v in Metaverse.Menu:QueryDescendants("ScrollingFrame") do
v:GetPropertyChangedSignal("AbsoluteSize"):Connect(function()
v.ScrollBarThickness = v.AbsoluteSize.X / 44
end)
end
return Metaverse
end
function UICreator.ToggleMenu(selfdata)
local DataSideBar = selfdata._sidebar
if DataSideBar.TogglingMenus then
return
elseif DataSideBar.MenusHidden and selfdata.SidebarButton then
return
elseif not (false and selfdata.Menu.Visible) then
DataSideBar.TogglingMenus = true
local VisibleUI = selfdata.Menu.Visible
PlaySound("select")
local SideBarMenu
for i, v in DataSideBar.SidebarMenus do
if v.Menu ~= selfdata.Menu or VisibleUI then
if v.Menu ~= selfdata.Menu then
if v.Menu.Visible then
SideBarMenu = v
end
end
if v.Menu.Visible then
v.Toggled:Fire(false)
local UIModule = ReplicatedStorage.Systems.Player.UI.Menus:FindFirstChild(v.MenuName)
local success, result = pcall(require, UIModule)
if success and (result and result.OnTransitionState) then
result.OnTransitionState(false)
else
TweenService:Create(v.Menu, BaseTweenInfo, {
["Size"] = UDim2.new(1, -20, 0, 0)
}):Play()
task.delay(0.25, function()
v.Menu.Visible = false
end)
end
SetButtonState(false)
if v.Button then
v.Button:SetAppearanceState(false)
end
end
end
end
task.delay(0.3 + (SideBarMenu and 0.125 or 0), function()
DataSideBar.TogglingMenus = nil
end)
if SideBarMenu then
task.wait(0.125)
if DataSideBar.MenusHidden then
DataSideBar.TogglingMenus = nil
return
end
end
if not VisibleUI then
selfdata.Toggled:Fire(true)
local UIModule = ReplicatedStorage.Systems.Player.UI.Menus:FindFirstChild(selfdata.MenuName)
local success, result = pcall(require, UIModule)
if success and (result and result.OnTransitionState) then
result.OnTransitionState(true)
else
selfdata.Menu.Visible = true
TweenService:Create(selfdata.Menu, BaseTweenInfo, {
["Size"] = UDim2.new(1, -20, 1, -20)
}):Play()
end
SetButtonState(true)
if selfdata.Button then
selfdata.Button:SetAppearanceState(true)
end
end
end
end
function MenuData.CreateSidebarMenu(self, MenuName, MenuScreen)
local Data = UICreator.new(MenuName, MenuScreen)
Data._sidebar = self
Data.SidebarButton = Buttons:FindFirstChild(MenuName)
task.delay(0, function()
Data.Button = MenuData.SidebarButtons[MenuName]
end)
MenuData.SidebarMenus[MenuName] = Data
return Data
end
else
MenuData = {
["SidebarMenus"] = {},
["Sidebars"] = {
["Sidebar"] = MainUI.Sidebar,
["Bottombar"] = MainUI.Sidebar:FindFirstChild("Bottombar") or nil
}
}
MenuData.__index = MenuData
function MenuData.CreateSidebarMenu(self, ButtonName, Menu, Bottom)
local Data = setmetatable({}, MenuData)
Data.Menu = Menu
Data.Menu.Visible = false
Data.Menu.Size = UDim2.fromScale()
Data.Menu.Parent = MainUI
Data.SidebarButton = Buttons:FindFirstChild(ButtonName)
local BindableEvent = Instance.new("BindableEvent")
BindableEvent.Parent = Data.Menu
Data.Toggled = BindableEvent.Event
Data.__toggleEvent = BindableEvent
for i,v in pairs(Data.Menu:QueryDescendants("ScrollingFrame")) do
v:GetPropertyChangedSignal("AbsoluteSize"):Connect(function()
v.ScrollBarThickness = v.AbsoluteSize.X / 44
end)
end
self.SidebarMenus[ButtonName] = Data
return Data
end
function MenuData.ToggleMenu(UIData, p24)
if MenuData.TogglingMenus then
return
elseif MenuData.MenusHidden and UIData.SidebarButton then
return
elseif not (p24 and UIData.Menu.Visible) then
MenuData.TogglingMenus = true
PlaySound("select")
local Visible = UIData.Menu.Visible
for i,v in SideBar:QueryDescendants(`#{Buttons.Name} > Frame:not(#Credits):not(#Spectate):not(#Plus):not(#TesterUi)`) do
v.Button.Interactable = false
task.delay(0.3, function()
v.Button.Interactable = true
end)
end
for i,Menu in pairs(MenuData.SidebarMenus) do
if Menu.Menu ~= UIData.Menu or Visible then
if Menu.Menu.Visible then
Menu.__toggleEvent:Fire(false)
TweenService:Create(Menu.Menu, BaseTweenInfo, {["Size"] = UDim2.new(1, -20, 0, 0)}):Play()
if Menu.SidebarButton then
TweenService:Create(Menu.SidebarButton.Inverted, BaseTweenInfo, {["ImageTransparency"] = 1}):Play()
TweenService:Create(Menu.SidebarButton.InvertedIcon, BaseTweenInfo, {["ImageTransparency"] = 1}):Play()
TweenService:Create(Menu.SidebarButton.PulloutHolder.PulloutFrame.Inverted, BaseTweenInfo, {["ImageTransparency"] = 1}):Play()
TweenService:Create(Menu.SidebarButton.PulloutHolder.PulloutFrame.Title, BaseTweenInfo, {
["TextColor3"] = Menu.Menu.Name == "PlusScreen" and Color3.fromRGB(0, 170, 127) or Color3.new(1,1,1)
}):Play()
end
task.delay(0.25, function()
Menu.Menu.Visible = false
end)
end
end
end
task.delay(0.3, function()
MenuData.TogglingMenus = nil
end)
if MenuData.MenusHidden then
return
end
if not Visible then
UIData.__toggleEvent:Fire(true)
UIData.Menu.Visible = true
TweenService:Create(UIData.Menu, BaseTweenInfo, {["Size"] = UDim2.new(1, -20, 1, -20)}):Play()
if UIData.SidebarButton then
TweenService:Create(UIData.SidebarButton.Inverted, BaseTweenInfo, {["ImageTransparency"] = 0}):Play()
TweenService:Create(UIData.SidebarButton.InvertedIcon, BaseTweenInfo, {["ImageTransparency"] = 0}):Play()
TweenService:Create(UIData.SidebarButton.PulloutHolder.PulloutFrame.Inverted, BaseTweenInfo, {["ImageTransparency"] = 0}):Play()
TweenService:Create(UIData.SidebarButton.PulloutHolder.PulloutFrame.Title, BaseTweenInfo, {["TextColor3"] = Color3.new()}):Play()
end
end
end
end
end
ModulesOptions = {
["Textbox"] = [=[
local u1 = {}
u1.__index = u1
local PlaySound = ({...})[1]
function u1.CreateSettingUI(_, u2, p3, u4)
if not u2 then
u2 = Instance.new("StringValue")
u2.Name = "SettingValue"
end
local v6 = u1
local u7 = setmetatable({
["SettingValue"] = u2
}, v6)
u7.Value = u2.Value
u7.Instance = p3 or game:GetService("ReplicatedStorage").Systems.Player.UI.Menus.Settings.Templates.Textbox.Textbox:Clone()
u7.Instance.TextboxBackground.Textbox.Focused:Connect(function()
PlaySound("click")
end)
u7.Instance.TextboxBackground.Textbox.FocusLost:Connect(function()
if u2.Name == "SettingValue" or u2.Name == "Value" then
u7.Value = u7.Instance.TextboxBackground.Textbox.Text
u7:OnUpdate()
if u4 then
u4(u7.Value)
end
else
u2.Value = u7.Instance.TextboxBackground.Textbox.Text
end
PlaySound("click")
end)
return u7
end
function u1.OnUpdate(p8)
p8.Instance.TextboxBackground.Textbox.Text = p8.Value or ""
end
return u1
]=],
["String"] = [=[
local u1 = {}
u1.__index = u1
local u2 = 200
local PlaySound = ({...})[1]
function u1.CreateSettingUI(_, u3, p4, u5)
if not u3 then
u3 = Instance.new("StringValue")
u3.Name = "SettingValue"
end
local v7 = u1
local u8 = setmetatable({
["SettingValue"] = u3
}, v7)
u8.Value = u3.Value
u8.Instance = p4 or game:GetService("ReplicatedStorage").Systems.Player.UI.Menus.Settings.Templates.String.Dropdown:Clone()
u8.DropdownVisible = false
local UIListLayout = u8.Instance.DropdownFrame.Options:FindFirstChildOfClass("UIListLayout") or Instance.new("UIListLayout")
UIListLayout.SortOrder = Enum.SortOrder.LayoutOrder
UIListLayout.Parent = u8.Instance.DropdownFrame.Options
u8.Instance.DropdownFrame.MouseButton1Click:Connect(function()
PlaySound("click")
local MainZIndex = u8.Instance.LayoutOrder
u8.DropdownVisible = not u8.DropdownVisible
u8.Instance.DropdownFrame.DropdownArrow.Rotation = u8.DropdownVisible and 180 or 0
u8.Instance.DropdownFrame.Options.Visible = u8.DropdownVisible
u8.Instance.ZIndex = 50000 - (MainZIndex * 2)
for i, v9 in pairs(u8.Instance.DropdownFrame.Options:GetChildren()) do
if v9:IsA("GuiObject") then
v9:Destroy()
end
end
local function Update()
local v10 = u3:GetAttribute("Options")
if v10 then
v10 = string.split(u3:GetAttribute("Options"), "|")
end
for i, v9 in pairs(u8.Instance.DropdownFrame.Options:GetChildren()) do
if v9:IsA("GuiObject") then
v9:Destroy()
end
end
for v11, u12 in pairs(v10 or {}) do
local v13 = game:GetService("ReplicatedStorage").Systems.Player.UI.Menus.Settings.Templates.String.DropdownOption:Clone()
v13.Name = u12
v13.LayoutOrder = v11
v13.Title.Text = v13.Name
v13.Parent = u8.Instance.DropdownFrame.Options
v13.MouseButton1Click:Connect(function()
if u3.Name == "SettingValue" or u3.Name == "Value" then
u8.Value = u12
u8:OnUpdate()
if u5 then
u5(u8.Value)
end
else
u3.Value = u12
end
PlaySound("switch0".. tostring(math.random(1,4)))
end)
end
end
Update()
u3:GetAttributeChangedSignal("Options"):Connect(Update)
end)
return u8
end
function u1.OnUpdate(p14)
p14.Instance.DropdownFrame.ChosenValue.Title.Text = p14.Value
p14.Instance.DropdownFrame.Options.Visible = false
p14.Instance.DropdownFrame.DropdownArrow.Rotation = 0
p14.DropdownVisible = false
end
return u1
]=],
["Number"] = [=[
local u1 = {}
u1.__index = u1
local PlaySound = ({...})[1]
function u1.CreateSettingUI(_, u2, p3, u4)
if not u2 then
u2 = Instance.new("NumberValue")
u2.Name = "SettingValue"
end
local v6 = u1
local u7 = setmetatable({
["SettingValue"] = u2
}, v6)
u7.Instance = p3 or game:GetService("ReplicatedStorage").Systems.Player.UI.Menus.Settings.Templates.Number.Slider:Clone()
u7.Value = u2.Value
local u8 = u7.Instance.DragBar
local u9 = u8.Dragger
local u10 = game.Players.LocalPlayer:GetMouse()
local u11 = u2:GetAttribute("MinValue")
u2:GetAttributeChangedSignal("MinValue"):Connect(function()
u11 = u2:GetAttribute("MinValue")
end)
local u12 = u2:GetAttribute("MaxValue")
u2:GetAttributeChangedSignal("MaxValue"):Connect(function()
u12 = u2:GetAttribute("MaxValue")
end)
local u13 = u2:GetAttribute("Step")
u2:GetAttributeChangedSignal("Step"):Connect(function()
u13 = u2:GetAttribute("Step")
end)
u7.__displayValue = Instance.new("NumberValue")
u7.__displayValue.Name = "__displayValue"
u7.__displayValue.Value = u2.Value
u7.__displayValue.Parent = u7.Instance
u7.__displayValue:GetPropertyChangedSignal("Value"):Connect(function()
local v14 = u9.Title
local v15 = u7.__displayValue.Value
local v16 = tonumber(string.format("%.10g", math.floor((v15/u13) + 0.5) * u13))
v14.Text = v16
end)
local v17 = u9.Title
local v18 = u7.__displayValue.Value
local v19 = tonumber(string.format("%.10g", math.floor((v18/u13) + 0.5) * u13))
v17.Text = tostring(v19)
u9.MouseButton1Down:Connect(function()
u7.Dragging = true
PlaySound("switch0" .. tostring(math.random(1, 4)))
while task.wait() and u7.Dragging do
local v20 = u10.X
local v21 = u8.AbsoluteSize.X
local v22 = (v20 - u8.AbsolutePosition.X) / v21
local v23 = u11
local v24 = u12
local v25 = v23 + (v24 - v23) * v22
local v26 = math.clamp(v25, v23, v24)
local RoundedNumber = tonumber(string.format("%.10g", math.floor((v26/u13) + 0.5) * u13))
local v27 = u13
if v27 ~= 0 or not v26 then
local v28 = (v26 + v27 / 2) / v27
v26 = math.floor(v28) * v27
end
if u7.Value ~= RoundedNumber then
PlaySound("tick0"..tostring(math.random(1,3)), {
["Volume"] = 0.025
})
u7.Value = RoundedNumber
u7:OnUpdate()
if u7.__updatedEvent then
u7.__updatedEvent:Fire()
end
end
end
end)
game.UserInputService.InputEnded:Connect(function(p29)
if u7.Dragging then
if p29.UserInputType == Enum.UserInputType.MouseButton1 or (p29.UserInputType == Enum.UserInputType.Touch or p29.UserInputType == Enum.UserInputType.Gamepad1 and p29.KeyCode == Enum.KeyCode.ButtonR2) then
u7.Dragging = false
PlaySound("switch0".. tostring(math.random(1,4)))
if u2.Name ~= "SettingValue" and u2.Name ~= "Value" then
u2.Value = u7.Value
end
u7:OnUpdate()
if u4 then
u4(u7.Value)
end
end
end
end)
return u7
end
function u1.OnUpdate(p30)
local v31 = p30.SettingValue:GetAttribute("MinValue")
local v32 = p30.SettingValue:GetAttribute("MaxValue")
local v33 = (p30.Value - v31) / (v32 - v31)
local v34 = math.clamp(v33, 0, 1)
local v35 = p30.Instance.DragBar.Dragger
local v36 = math.clamp(v34, 0, 1)
game.TweenService:Create(v35, TweenInfo.new(0.1), {
["Position"] = UDim2.fromScale(v36, 0.5)
}):Play()
game.TweenService:Create(p30.__displayValue, TweenInfo.new(0.1), {
["Value"] = p30.Value
}):Play()
end
return u1
]=],
["Keybind"] = [=[
local u1 = {}
u1.__index = u1
local PlaySound = ({...})[1]
function u1.CreateSettingUI(_, u2, p3)
if not u2 then
u2 = Instance.new("StringValue")
u2.Name = "SettingValue"
end
local v6 = u1
local u7 = setmetatable({
["SettingValue"] = u2
}, v6)
u7.Instance = p3 or game:GetService("ReplicatedStorage").Systems.Player.UI.Menus.Settings.Templates.Keybind.KeybindFrame:Clone()
u7.IsKeybind = true
local u8 = {
"None",
"Unknown",
"MouseMovement",
"Focus",
"Accelerometer",
"TextInput"
}
u7.Instance.KeybindButton.MouseButton1Click:Connect(function()
PlaySound("click")
if u1.__currentConnection then
return
elseif not u7.__debounce then
u7.__debounce = true
task.delay(0.25, function()
u7.__debounce = nil
end)
task.wait(0.05)
u7.Instance.KeybindButton.CurrentBind.Title.Text = "..."
u1.__currentConnection = game.UserInputService.InputEnded:Connect(function(p9)
if u1.__currentConnection then
local v10 = p9.KeyCode == Enum.KeyCode.Unknown and p9.UserInputType.Name or p9.KeyCode.Name
if table.find(u8, v10) or p9.KeyCode == Enum.KeyCode.Unknown and u2:GetAttribute("KeycodeOnly") then
PlaySound("error")
return
end
local v11 = require(game.ReplicatedStorage.Initializer)
for v12, v13 in pairs(v11.PlayerSettings) do
if v13.IsKeybind and (v13.Value == v10 and v12 ~= u2.Name) then
PlaySound("error")
return
end
end
u2.Value = v10
PlaySound("switch0".. tostring(math.random(1,4)))
if u1.__currentConnection then
u1.__currentConnection:Disconnect()
u1.__currentConnection = nil
end
u7.Instance.KeybindButton.CurrentBind.Title.Text = v10
end
end)
end
end)
local function v15()
local v14 = "PC"
if v14 == "Console" and u2.Name:find("~Console") then
u7.Instance.Visible = true
return
elseif v14 == "PC" and not u2.Name:find("~Console") then
u7.Instance.Visible = true
else
u7.Instance.Visible = false
end
end
v15()
return u7
end
function u1.OnUpdate(p16)
p16.Instance.KeybindButton.CurrentBind.Title.Text = p16.Value
end
return u1
]=],
["Bool"] = [=[
local u1 = {}
u1.__index = u1
local PlaySound = ({...})[1]
function u1.CreateSettingUI(_, u2, p3)
if not u2 then
u2 = Instance.new("BoolValue")
u2.Name = "SettingValue"
end
local v4 = u1
local u5 = setmetatable({
["SettingValue"] = u2
}, v4)
u5.isDebounce = false
u5.Instance = p3 or game:GetService("ReplicatedStorage").Systems.Player.UI.Menus.Settings.Templates.Bool.Checkbox:Clone()
u5.Instance.CheckboxButton.MouseButton1Click:Connect(function()
if not u5.isDebounce then
u5.isDebounce = true
task.delay(0.25, function()
u5.isDebounce = false
end)
PlaySound("switch0".. tostring(math.random(1,4)))
u2.Value = not u2.Value
end
end)
return u5
end
function u1.OnUpdate(p6)
p6.Value = p6.SettingValue.Value
p6.Instance.CheckboxButton.Checked.Visible = p6.Value
end
return u1
]=]
}
local SettingsData
local Contents
local Templates
local function SetupSettingUI(SettingInstance, TabSectionFolder,TableFeature)
local LayoutOrder = SettingInstance:GetAttribute("LayoutOrder")
local DisplayTitle = SettingInstance:GetAttribute("DisplayTitle")
if LayoutOrder and DisplayTitle then
if SettingInstance:IsA("Folder") then
local Seperator = Templates.Seperator:Clone()
Seperator.Name = SettingInstance.Name
Seperator.LayoutOrder = LayoutOrder * 100 + (TabSectionFolder and TabSectionFolder:GetAttribute("LayoutOrder") * 100 or 0)
SettingInstance:GetAttributeChangedSignal("LayoutOrder"):Connect(function()
if SettingInstance.Name ~= "EnviromentFunctions" then
Seperator.LayoutOrder = SettingInstance:GetAttribute("LayoutOrder") * 100 + (TabSectionFolder and TabSectionFolder:GetAttribute("LayoutOrder") * 100 or 0)
end
end)
Seperator.Title.Text = DisplayTitle
SettingInstance:GetAttributeChangedSignal("DisplayTitle"):Connect(function()
if SettingInstance.Name ~= "EnviromentFunctions" then
Seperator.Title.Text = SettingInstance:GetAttribute("DisplayTitle")
end
end)
Seperator.Parent = Contents
--[[for i,v in pairs(SettingInstance:GetChildren()) do
SetupSettingUI(v,SettingInstance,TableFeature)
end]]
elseif SettingInstance:IsA("ValueBase") then
local SettingType = Templates:FindFirstChild(SettingInstance:GetAttribute("TemplateType") or string.gsub(SettingInstance.ClassName, "Value", ""))
for i,Child in pairs(Templates:GetChildren()) do
if SettingInstance.Parent.Name:find(Child.Name) then
SettingType = Child
end
end
if SettingType then
local ModuleType = ModulesOptions[tostring(SettingType.Name)]
SettingType = loadstring(tostring(ModuleType))(PlaySound)
end
if SettingType and SettingType.CreateSettingUI then
local SettingUI = SettingType:CreateSettingUI(SettingInstance)
SettingUI.Instance.Name = SettingInstance.Name
TabSectionFolder = SettingInstance.Parent
SettingUI.Instance.LayoutOrder = LayoutOrder + (TabSectionFolder and TabSectionFolder:GetAttribute("LayoutOrder") * 100 or 0)
TabSectionFolder:GetAttributeChangedSignal("LayoutOrder"):Connect(function()
SettingUI.Instance.LayoutOrder = SettingInstance:GetAttribute("LayoutOrder") + (TabSectionFolder and TabSectionFolder:GetAttribute("LayoutOrder") * 100 or 0)
end)
SettingUI.Instance.Parent = Contents
local Requirement = SettingInstance:GetAttribute("Requirement")
local BindableCallCheckRequirement = Instance.new("BindableEvent")
local Requirements = {}
BindableCallCheckRequirement.Event:Connect(function()
local AllTrue = true
for i,v in pairs(Requirements) do
if not v then
AllTrue = false
break
end
end
if AllTrue then
SettingUI.Instance.Visible = true
else
SettingUI.Instance.Visible = false
end
end)
if type(Requirement) == "string" and Requirement:find("|") then
for i,v in (string.split(Requirement, "|")) do
Requirements[v] = false
end
else
Requirements = Requirement and {[Requirement] = false} or {}
end
for Requirement,v in pairs(Requirements) do
Requirements[Requirement] = false
local InstanceValue = type(Requirement) == "string" and PlusFolderSettings:FindFirstChild(Requirement, true) or nil
if InstanceValue and Requirement ~= true then
Requirements[Requirement] = InstanceValue.Value
InstanceValue:GetPropertyChangedSignal("Value"):Connect(function()
Requirements[Requirement] = InstanceValue.Value
BindableCallCheckRequirement:Fire()
end)
elseif Requirement == true then
Requirements[Requirement] = false
BindableCallCheckRequirement:Fire()
elseif Requirement:find("=") then
local SplitData = string.split(Requirement, "=")
local Value = SplitData[2]
local function BindChecker(CheckerInstance)
local function Update()
if tostring(CheckerInstance.Value) == Value or tostring(CheckerInstance.Value):lower() == "both" or tostring(CheckerInstance.Value):lower() == "all" then
Requirements[Requirement] = true
else
Requirements[Requirement] = false
end
BindableCallCheckRequirement:Fire()
end
Update()
CheckerInstance:GetPropertyChangedSignal("Value"):Connect(Update)
end
local CheckerInstance = PlusFolderSettings:FindFirstChild(SplitData[1], true)
if CheckerInstance then
BindChecker(CheckerInstance)
else
PlusFolderSettings.DescendantAdded:Connect(function(Child)
if Child.Name == SplitData[1] and Child:IsA("ValueBase") then
BindChecker(Child)
end
end)
end
elseif Requirement:find("~") then
local SplitData = string.split(Requirement, "~")
local Value = SplitData[2]
local function BindChecker(CheckerInstance)
local function Update()
if tostring(CheckerInstance.Value) ~= Value then
Requirements[Requirement] = true
else
Requirements[Requirement] = false
end
BindableCallCheckRequirement:Fire()
end
Update()
CheckerInstance:GetPropertyChangedSignal("Value"):Connect(Update)
end
local CheckerInstance = PlusFolderSettings:FindFirstChild(SplitData[1], true)
if CheckerInstance then
BindChecker(CheckerInstance)
else
PlusFolderSettings.DescendantAdded:Connect(function(Child)
if Child.Name == SplitData[1] and Child:IsA("ValueBase") then
BindChecker(Child)
end
end)
end
end
end
PlusFolderSettings.DescendantAdded:Connect(function(Child)
if not Child:IsA("ValueBase") then
return
end
for Requirement,v in pairs(Requirements) do
if type(Requirement) == "string" and not Requirement:find("=") and not Requirement:find("~") and Requirement == Child.Name then
Requirements[Requirement] = Child.Value
Child:GetPropertyChangedSignal("Value"):Connect(function()
Requirements[Requirement] = Child.Value
BindableCallCheckRequirement:Fire()
end)
BindableCallCheckRequirement:Fire()
end
end
end)
BindableCallCheckRequirement:Fire()
SettingInstance:GetAttributeChangedSignal("Requirement"):Connect(function()
Requirement = SettingInstance:GetAttribute("Requirement")
Requirements = {}
if type(Requirement) == "string" and Requirement:find("|") then
for i,v in (string.split(Requirement, "|")) do
Requirements[v] = false
end
else
Requirements = Requirement and {[Requirement] = false} or {}
end
BindableCallCheckRequirement:Fire()
end)
local SettingFeature = TableFeature
local ResetButton = Templates.Reset:Clone()
ResetButton.Parent = SettingUI.Instance
ResetButton.MouseButton1Click:Connect(function()
SettingInstance.Value = SettingFeature["DefaultInstanceValue"]
PlaySound("switch0".. tostring(math.random(1,4)))
end)
ResetButton.MouseEnter:Connect(function()
PlaySound("hover")
end)
ResetButton.MouseLeave:Connect(function()
PlaySound("hoverEnd")
end)
SettingUI.Instance:FindFirstChild("SettingName", true).Text = (DisplayTitle or "")
SettingInstance:GetAttributeChangedSignal("DisplayTitle"):Connect(function()
SettingUI.Instance:FindFirstChild("SettingName", true).Text = (SettingInstance:GetAttribute("DisplayTitle") or "")
end)
SettingUI.Instance:FindFirstChild("SettingDesc", true).Text = (SettingInstance:GetAttribute("DisplayDescription") or "")
SettingInstance:GetAttributeChangedSignal("DisplayDescription"):Connect(function()
SettingUI.Instance:FindFirstChild("SettingDesc", true).Text = (SettingInstance:GetAttribute("DisplayDescription") or "")
end)
SettingUI.__updatedEvent = Instance.new("BindableEvent", SettingUI.Instance)
SettingUI.Updated = SettingUI.__updatedEvent.Event
if SettingFeature then
if SettingFeature.CustomSetup then
task.spawn(SettingFeature.CustomSetup,SettingFeature)
end
SettingUI.Updated:Connect(function(Starting)
if SettingFeature.ScriptFunction and SettingUI.Value ~= nil then
SettingFeature:ScriptFunction(SettingUI.Value,Starting or false)
end
end)
if LocalCharacter then
if SettingFeature.CharacterAdded then
task.spawn(SettingFeature.CharacterAdded,SettingFeature)
end
end
LocalPlayer.CharacterAdded:Connect(function()
if SettingFeature.CharacterAdded then
task.delay(0,SettingFeature.CharacterAdded,SettingFeature)
end
end)
if SettingFeature.OnLoop then
ThreadBindable.Event:Connect(function()
SettingFeature:OnLoop(SettingFeature)
end)
end
end
SettingUI.Value = SettingInstance.Value
if SettingUI.OnUpdate then
SettingUI:OnUpdate()
end
SettingUI.__updatedEvent:Fire(true)
SettingInstance:GetPropertyChangedSignal("Value"):Connect(function()
SettingUI.Value = SettingInstance.Value
if SettingUI.OnUpdate then
SettingUI:OnUpdate()
end
SettingUI.__updatedEvent:Fire()
end)
SettingsData.PlayerSettings[SettingInstance.Name] = SettingUI
task.wait()
end
end
else
return
end
end
local function HandleUIFeatures(TabName,TabContents)
local Folder = Instance.new("Folder")
Folder.Name = TabName
Folder.Parent = PlusFolderSettings
if not TabContents["TabAttributes"] then
Folder:Destroy()
warn(`Failed to create section : {TabName}\nERROR: There is no TabAttributes attached to the section`)
return
end
for Attribute, Value in TabContents["TabAttributes"] do
Folder:SetAttribute(Attribute, Value)
end
for SettingName, SettingData in TabContents do
task.spawn(function()
if SettingName == "TabAttributes" then
return
end
if type(SettingData) ~= "table" or type(SettingData.InstanceType) ~= "string" then
return
end
local NewInstance = Instance.new(SettingData.InstanceType)
local TableEvent = table.clone(SettingData)
table.clear(SettingData)
setmetatable(SettingData,{
__index = TableEvent,
__newindex = function(Table,i,v)
TableEvent[i] = v
if i == "DisplayDescription" or i == "DisplayTitle" or i == "LayoutOrder" then
NewInstance:SetAttribute("DisplayDescription",type(TableEvent["DisplayDescription"]) == type("") and TableEvent["DisplayDescription"] or "")
NewInstance:SetAttribute("DisplayTitle",type(TableEvent["DisplayTitle"]) == type("") and TableEvent["DisplayTitle"] or "Untitled Feature")
NewInstance:SetAttribute("LayoutOrder",type(TableEvent["LayoutOrder"]) == type(1) and TableEvent["LayoutOrder"] or #NewInstance:GetAttribute("DisplayTitle"))
end
if i == "Requirement" then
NewInstance:SetAttribute("Requirement",(type(TableEvent["Requirement"]) == type(true) or TableEvent["Requirement"] == type("") and TableEvent["Requirement"]))
end
end
})
NewInstance.Name = SettingName
NewInstance.Value = SettingData.DefaultInstanceValue
local TableData = HttpService:JSONDecode(ReturnData("Data.txt", true))
if SettingData["Savable"] and FeatureLoadout["EnviromentFunctions"]["files"]["DefaultInstanceValue"] then
if TableData[SettingName] ~= nil and NewInstance:GetAttribute("Requirement") ~= true then
NewInstance.Value = TableData[SettingName]
end
NewInstance:GetPropertyChangedSignal("Value"):Connect(function()
if NewInstance:GetAttribute("Requirement") == true or not SettingData["Savable"] then
return
end
local TableData2 = HttpService:JSONDecode(ReturnData("Data.txt", true))
TableData2[SettingName] = SettingData.DefaultInstanceValue == NewInstance.Value and nil or NewInstance.Value
if FeatureLoadout["EnviromentFunctions"]["files"]["DefaultInstanceValue"] then
ChangeData("Data.txt",HttpService:JSONEncode(TableData2),true)
end
end)
elseif not FeatureLoadout["EnviromentFunctions"]["files"]["DefaultInstanceValue"] and SettingData["Savable"] and not WarnedAboutFilesCompatability then
WarnedAboutFilesCompatability = true
ColoredPrint("Failed to load a savable feature.\nIf this bothers you then you should use a different executor that supports 'writefile' and 'readfile'", "info", Color3.new(1,0.25,0))
end
if SettingData["DisplayDescription"] then
SettingData.DisplayDescription = SettingData.DisplayDescription:gsub("%(NO FUNCTIONALITY%)", RichTextGradientColor("(NO FUNCTIONALITY)",{Color3.fromRGB(255, 83, 53), Color3.fromRGB(255, 123, 0),Color3.fromRGB(255, 83, 53)}))
end
SettingData["Instance"] = NewInstance
NewInstance:SetAttribute("DisplayDescription",SettingData["DisplayDescription"] or "")
NewInstance:SetAttribute("DisplayTitle",SettingData["DisplayTitle"] or "Untitled Feature")
NewInstance:SetAttribute("LayoutOrder",SettingData["LayoutOrder"] or #NewInstance:GetAttribute("DisplayTitle"))
NewInstance:SetAttribute("Requirement",SettingData["Requirement"])
if SettingData["ExtraData"] then
for ExtraDataIndex, ExtraDataValue in SettingData.ExtraData do
NewInstance:SetAttribute(ExtraDataIndex, ExtraDataValue)
end
end
NewInstance.Parent = Folder
SetupSettingUI(NewInstance,Folder,SettingData)
end)
end
SetupSettingUI(Folder)
return Folder
end
local Initializer = {}
function Initializer.Start()
SettingsData = {}
SettingsData.PlayerSettings = {}
Initializer.SettingsMenu = MenuData:CreateSidebarMenu("Plus", PlusMenu)
if NewUIVersion then
PlusMenu:Destroy()
PlusMenu = Initializer.SettingsMenu.Menu
end
Contents = Initializer.SettingsMenu.Menu.SettingsContainer.Contents
Templates = ReplicatedStorage.Systems.Player.UI.Menus.Settings.Templates
local PluginsFolderDir = "NaikoScript/ForsakenPlus/Plugins"
local FilterDir = PluginsFolderDir:gsub("/","\\") .. "\\"
local PluginDefaultSettings = {
PluginVersion = "1.0",
PluginName = "Plugin",
PluginCredits = "Someone",
HidePluginInfoTab = false
}
if FeatureLoadout["EnviromentFunctions"]["files"]["DefaultInstanceValue"] then
local PluginFiles = isfolder(PluginsFolderDir) and listfiles(PluginsFolderDir) or nil
if PluginFiles then
local StartTime = workspace.DistributedGameTime
for i,v in PluginFiles do
local PluginFileData = ReturnData(v,false)
local FeatureErrors = 0
if string.gsub(PluginFileData,"[\n ]",""):sub(1,7) == "return{" then
local Plugin,err = loadstring(PluginFileData)
local Success,Features,PluginSettings
if Plugin == nil then
task.spawn(error,`Failed to load Plugin : {v:gsub(FilterDir,"")}\n{err}`,5)
continue
end
local suc,err = pcall(function()
setfenv(Plugin, getfenv())
Features,PluginSettings = Plugin()
end)
if not suc then
task.spawn(error,`Failed to load Plugin : {v:gsub(FilterDir,"")}\n{err}`,5)
continue
end
if typeof(Features) == typeof({}) then
for TabName, TabContents in Features do
if type(TabName) == type("") and typeof(TabContents) == typeof({}) then
FeatureLoadout[TabName] = FeatureLoadout[TabName] or {}
for FeatureName,FeatureData in TabContents do
if FeatureName == "TabAttributes" and TabName == "EnviromentFunctions" then continue end
if (FeatureLoadout[TabName][FeatureName] and FeatureData.InstanceType == FeatureLoadout[TabName][FeatureName].InstanceType) or not FeatureLoadout[TabName][FeatureName] then
FeatureLoadout[TabName][FeatureName] = FeatureData
else
FeatureErrors += 1
warn(`Failed to load {TabName} from {v:gsub(FilterDir,"")}\nERROR: to override the InstanceType must be the same as the original feature`)
end
end
else
FeatureErrors += 1
warn(`Failed to load {TabName} from {v:gsub(FilterDir,"")}\nERROR: Tab Name is not a string or Tab Contents is not a table`)
end
end
if PluginSettings and type(PluginSettings) == type({}) then
for i,v in PluginDefaultSettings do
PluginSettings[i] = PluginSettings[i] or v
end
if not PluginSettings["HidePluginInfoTab"] then
FeatureLoadout[PluginSettings["PluginName"] .. HttpService:GenerateGUID(false):sub(1,7)] = {
["TabAttributes"] = {
["DisplayTitle"] = string.format(
"%s Made by %s | %s",
PluginSettings["PluginName"],
PluginSettings["PluginCredits"],
RichTextGradientColor("V"..PluginSettings["PluginVersion"],{Color3.fromRGB(87, 160, 255),Color3.fromRGB(0, 132, 255)})
),
["LayoutOrder"] = 1000
}
}
end
end
else
warn(`Failed to load Plugin : {v:gsub(FilterDir,"")}\nERROR: The features returned is not a table value`)
continue
end
else
warn(`Failed to load Plugin : {v:gsub(FilterDir,"")} | This is for security. If you made this plugin please read the documentation.\nERROR: Return is not at the start of the first line without anything behind it and make sure it is infact correct`)
continue
end
local LoadDelay = workspace.DistributedGameTime - StartTime
if FeatureErrors > 0 then
ColoredPrint(`Loaded Plugin : <b>{v:gsub(FilterDir,"")}</b> with {FeatureErrors} Feature Error(s)`,"info",Color3.fromRGB(251, 109, 43))
else
ColoredPrint(`Loaded Plugin : <b>{v:gsub(FilterDir,"")}</b> successfully`,"suc",Color3.fromRGB(193,251,43))
end
end
else
--warn("No Plugins found or directory/folder is removed")
end
end
for TabName, TabContents in FeatureLoadout do
task.spawn(HandleUIFeatures,TabName,TabContents)
end
--[[task.spawn(function()
for i,Child in pairs(PlusFolderSettings:GetChildren()) do
SetupSettingUI(Child)
end
end)]]
task.spawn(function()
if game.GameId == 6331902150 then
local JsonVersionData
task.delay(5,function()
if not JsonVersionData then
ColoredPrint("Getting game version info is taking longer than usual.\nRovalra API has not responded in expected time.","warn")
end
task.wait(12)
if not JsonVersionData then
ColoredPrint(`Since it still has not gotten a response API still (after 17 seconds)\nYou can Manually check if the game has updated before the script has!\n(Last Script Update/Test : {GameVersionForScript})`,"info")
end
end)
JsonVersionData = (game:HttpGet("https://apis.rovalra.com/v1/games/history?place_id=18687417158"))
if not JsonVersionData then
ColoredPrint(`Failed to get game version info.\n Automatic update check failed.\n `)
return
end
local Success,TableVersionData = pcall(function() return HttpService:JSONDecode(tostring(JsonVersionData)) end)
local CurrentGameVersion = (Success and TableVersionData and type(TableVersionData) == "table" and TableVersionData["history"] and TableVersionData["history"][1] and TableVersionData["history"][1]["first_seen"]) or GameVersionForScript
CurrentGameVersion = CurrentGameVersion:sub(1,10)
local y,m,d = GameVersionForScript:match("(%d+)-(%d+)-(%d+)")
local ThenTime = os.time{year=y, month=m, day=d}
y,m,d = CurrentGameVersion:match("(%d+)-(%d+)-(%d+)")
local CurrentTime = os.time{year=y, month=m, day=d}
local DaysSinceScriptUpdate = math.floor(math.abs(ThenTime - os.time()) / 86400)
local DaysSinceGameUpdate = math.floor(math.abs(CurrentTime - os.time()) / 86400)
if ThenTime < CurrentTime and DaysSinceScriptUpdate > 1 then
ColoredPrint("Days since last script update: " .. DaysSinceScriptUpdate,"info", Color3.fromRGB(236, 48, 120))
ColoredPrint("Days since game update: " .. DaysSinceGameUpdate,"info", Color3.fromRGB(236, 48, 120))
FeatureLoadout["Outdated"] = {
["TabAttributes"] = {
["DisplayTitle"] = '<font color="rgb(255,166,0)">⚠</font>' .. RichTextGradientColor(" SCRIPT ISN'T TESTED FOR THIS GAME VERSION ",{Color3.fromRGB(255, 166, 0), Color3.fromRGB(243, 227, 0)}) .. '<font color="rgb(243, 227, 0)">⚠</font>',
["LayoutOrder"] = -10
}
}
local Folder = HandleUIFeatures("Outdated",FeatureLoadout["Outdated"])
--SetupSettingUI(Folder)
ColoredPrint(`The game has updated and it has been detected that the script has not been tested/updated for this version.\n{GetValue("DisableAllFeatures") and "All features have been disabled by default to prevent from you possibly getting detected.\n" or ""}Use the features with caution or wait for a update from the script.`, "warning", Color3.fromRGB(255, 166, 0))
if GetValue("DisableAllFeatures") then
print("Disabling all features")
for i,v in FeatureLoadout do
for i2,v2 in v do
if i2 == "DisableAllFeatures" then continue end
v2["Savable"] = false
if type(v2["DefaultInstanceValue"]) == "boolean" and v2["Instance"] and i ~= "Outdated" and i ~= "EnviromentFunctions" then
v2["DefaultInstanceValue"] = false
v2["Instance"].Value = false
elseif type(v2["DefaultInstanceValue"]) ~= "boolean" and v2["Instance"] and i ~= "Outdated" and i ~= "EnviromentFunctions" then
v2["Instance"].Value = v2["DefaultInstanceValue"]
end
end
end
end
end
end
end)
end
--[[for TabName, TabContents in FeatureLoadout do
task.spawn(HandleUIFeatures,TabName,TabContents)
end]]
Initializer.Start()
if SidePlusButton:IsA("Frame") then
task.spawn(function()
local Menu = MenuData.SidebarMenus[SidePlusButton.Name]
if NewUIVersion then
local CountingMod = false
if Menu then
SidePlusButton.Button.MouseButton1Click:Connect(function()
MenuData.SidebarMenus["Plus"]["_sidebar"]["MenusHidden"] = false
if not PlusMenu.Visible then
for i,v in MainUI:GetChildren() do
if v ~= PlusMenu and (v.Name):find("Screen") or v.Name == "Shop" then
local ButtonName = v.Name:gsub("Screen","")
local Button = SideBar:FindFirstChild(ButtonName,true)
if not Button and ButtonName ~= "Mod" then continue end
if (MenuData.SidebarMenus[ButtonName] and not MenuData.SidebarMenus[ButtonName]["Checked"]) or (ButtonName == "Mod" and not CountingMod) then
if ButtonName == "Mod" then
CountingMod = true
else
MenuData.SidebarMenus[ButtonName]["Checked"] = true
end
if Button then
Button.Button.MouseButton1Click:Connect(function()
if PlusMenu.Visible and MenuData.TogglingMenus == nil then
SetButtonState(false)
end
end)
elseif ButtonName == "Mod" and PlayerGui.TopbarStandard.Holders.Left:FindFirstChild("Widget") then
local TopMod
for i,v in PlayerGui.TopbarStandard.Holders.Left:GetChildren() do
if v:FindFirstChildWhichIsA("TextLabel",true) and v:FindFirstChildWhichIsA("TextLabel",true).Text == "Command Panel" then
TopMod = v
break
end
end
if TopMod then
TopMod.IconButton.Menu.IconSpot.ClickRegion.MouseButton1Click:Connect(function()
if PlusMenu.Visible and MenuData.TogglingMenus == nil then
SetButtonState(false)
end
end)
end
end
end
end
end
end
if MenuData.TogglingMenus == nil then
Menu:ToggleMenu()
end
end)
end
else
if Menu then
SidePlusButton.Button.MouseButton1Click:Connect(function()
if not PlusMenu.Visible then
for i,v in MainUI:GetChildren() do
if v ~= PlusMenu and (v.Name):find("Screen") then
local ButtonName = v.Name:gsub("Screen","")
local Button = Buttons:FindFirstChild(ButtonName) or (SideBar:FindFirstChild("Bottombar") and SideBar.Bottombar.Buttons:FindFirstChild(ButtonName)) or nil
if not Button and ButtonName ~= "Mod" then continue end
local Event = v:FindFirstChildOfClass("BindableEvent")
if MenuData.SidebarMenus[ButtonName] == nil then
if Button then
Button.Button.MouseButton1Click:Connect(function()
if PlusMenu.Visible and MenuData.TogglingMenus == nil then
Menu:ToggleMenu()
end
end)
elseif v.Name == "ModScreen" and PlayerGui.TopbarStandard.Holders.Left:FindFirstChild("Widget") then
PlayerGui.TopbarStandard.Holders.Left.Widget.IconButton.Menu.IconSpot.ClickRegion.MouseButton1Click:Connect(function()
if PlusMenu.Visible and MenuData.TogglingMenus == nil then
Menu:ToggleMenu()
end
end)
end
MenuData.SidebarMenus[ButtonName] = {
["Toggled"] = Event and Event.Event or nil,
["SidebarButton"] = Buttons:FindFirstChild(ButtonName) or nil,
["Menu"] = MainUI:FindFirstChild(v.Name),
["__toggleEvent"] = Event or nil
}
end
end
end
end
if MenuData.TogglingMenus == nil then
Menu:ToggleMenu()
end
end)
end
end
end)
if NewUIVersion then
local OriginalSize = SidePlusButton.Size
SidePlusButton.MouseEnter:Connect(function()
TweenService:Create(SidePlusButton, BaseTweenInfo, {
["Size"] = UDim2.fromScale(OriginalSize.X.Scale * 1.1, OriginalSize.Y.Scale * 1.13)
}):Play()
PlaySound("hover")
end)
SidePlusButton.MouseLeave:Connect(function()
TweenService:Create(SidePlusButton, BaseTweenInfo, {
["Size"] = OriginalSize
}):Play()
PlaySound("hoverEnd")
end)
else
local IsBottomBar = SidePlusButton.Parent.Parent.Name == "Bottombar"
local PulloutHolder = SidePlusButton.PulloutHolder
PulloutHolder.Parent = IsBottomBar and (MenuData.Sidebars.Bottombar.Pullouts or SidePlusButton) or SidePlusButton
local PulloutFrame = PulloutHolder.PulloutFrame
PulloutFrame.Title.Text = SidePlusButton.Name
SidePlusButton.MouseEnter:Connect(function()
if SidePlusButton.Button.ImageTransparency <= 0.1 then
TweenService:Create(SidePlusButton, BaseTweenInfo, {
["Size"] = UDim2.fromScale(1.05, IsBottomBar and 1.15 or 0.25)
}):Play()
if IsBottomBar then
TweenService:Create(PulloutHolder, BaseTweenInfo, {["Position"] = UDim2.fromScale(0.65, 0.85),["Size"] = UDim2.fromScale(0.35, 0.75)}):Play()
TweenService:Create(PulloutFrame.Display, BaseTweenInfo, {["ImageTransparency"] = 0}):Play()
TweenService:Create(PulloutFrame.Title, BaseTweenInfo, {["TextTransparency"] = 0}):Play()
else
TweenService:Create(PulloutFrame, BaseTweenInfo, {["Position"] = UDim2.new(0.225, PulloutFrame.Title.AbsoluteSize.X ^ 1.03, 0.5, 0)}):Play()
end
PlaySound("hover")
end
end)
SidePlusButton.MouseLeave:Connect(function()
TweenService:Create(SidePlusButton, BaseTweenInfo, {["Size"] = UDim2.fromScale(1, IsBottomBar and 1 or 0.2)}):Play()
if IsBottomBar then
TweenService:Create(PulloutHolder, BaseTweenInfo, {["Position"] = UDim2.fromScale(0.65, 1),["Size"] = UDim2.fromScale(0.15, 0.45)}):Play()
TweenService:Create(PulloutFrame.Display, BaseTweenInfo, {["ImageTransparency"] = 1}):Play()
TweenService:Create(PulloutFrame.Title, BaseTweenInfo, {["TextTransparency"] = 1}):Play()
else
TweenService:Create(PulloutFrame, BaseTweenInfo, {["Position"] = UDim2.fromScale(0, 0.5)}):Play()
end
if SidePlusButton.Button.ImageTransparency <= 0.1 then
PlaySound("hoverEnd")
end
end)
end
end
local function UICheck()
local Status = SideBar:GetAttribute("WasVisible")
SetButtonState(false)
if Status then
if not NewUIVersion then
local LayoutInstance = Buttons:FindFirstChildOfClass("UIListLayout") or Buttons:FindFirstChildOfClass("UIGridLayout")
if LayoutInstance then
LayoutInstance.VerticalAlignment = Enum.VerticalAlignment.Top
end
else
SideBar:FindFirstChildOfClass("UIPadding").PaddingRight = UDim.new(0.2,0)
SideBar:FindFirstChildOfClass("UIPadding").PaddingLeft = UDim.new(0,0)
UIScale.Scale = 1
end
PlusMenu.SettingsContainer.ImageTransparency = 0
PlusMenu.SettingsContainer.Contents.ScrollBarImageTransparency = 0
if SideBar:IsA("ImageLabel") then
SideBar.ImageTransparency = 0
end
for i,v in PlusMenu.SettingsContainer.Contents:GetChildren() do
if v:IsA("ImageLabel") then
v.ImageTransparency = 0
elseif v:IsA("Frame") then
for i,v in v:GetChildren() do
if v:IsA("ImageLabel") or v:IsA("ImageButton") then
v.ImageTransparency = 0
end
end
end
end
else
if NewUIVersion then
MenuData.SidebarMenus["Plus"]["_sidebar"]["MenusHidden"] = false
task.delay(0.5,function()
MenuData.SidebarMenus["Plus"]["_sidebar"]["MenusHidden"] = false
end)
SideBar:FindFirstChildOfClass("UIPadding").PaddingRight = UDim.new(0,0)
SideBar:FindFirstChildOfClass("UIPadding").PaddingLeft = UDim.new(0.2,0)
UIScale.Scale = 1.3
end
local LayoutInstance = Buttons:FindFirstChildOfClass("UIListLayout") or Buttons:FindFirstChildOfClass("UIGridLayout")
if LayoutInstance then
LayoutInstance.VerticalAlignment = Enum.VerticalAlignment.Center
end
PlusMenu.SettingsContainer.ImageTransparency = 0.3
PlusMenu.SettingsContainer.Contents.ScrollBarImageTransparency = 0.45
if SideBar:IsA("ImageLabel") then
SideBar.ImageTransparency = 1
end
for i,v in PlusMenu.SettingsContainer.Contents:GetChildren() do
if v:IsA("ImageLabel") then
v.ImageTransparency = 0.4
elseif v:IsA("Frame") then
for i,v in v:GetChildren() do
if v:IsA("ImageLabel") or v:IsA("ImageButton") then
v.ImageTransparency = 0.3
end
end
end
end
end
for i,v in SideBar:QueryDescendants(`#Bottom > Frame, #Money , #Bottombar , #{Buttons} > Frame {((not NewUIVersion) and ":not(#Credits)" or "")} :not(#TesterUi)`) do
if not v:GetAttribute("Visibility") then
v:SetAttribute("Visibility",v.Visible)
end
v.Visible = Status and v:GetAttribute("Visibility")
end
SidePlusButton.Visible = true
if not Status then
RoundEvent:Fire("Start")
else
RoundEvent:Fire("End")
end
end
-- Floating Auto Block toggle (Patch 92 GUI)
do
local AutoBlockToggleGui = Instance.new("ScreenGui")
AutoBlockToggleGui.Name = "AutoBlockFloatingToggle"
AutoBlockToggleGui.ResetOnSpawn = false
AutoBlockToggleGui.IgnoreGuiInset = true
AutoBlockToggleGui.Parent = CoreGui
local AutoBlockToggle = Instance.new("TextButton")
AutoBlockToggle.Name = "Toggle"
AutoBlockToggle.Parent = AutoBlockToggleGui
AutoBlockToggle.Size = UDim2.new(0, 150, 0, 48)
AutoBlockToggle.Position = UDim2.new(1, -170, 0.5, -24)
AutoBlockToggle.BackgroundTransparency = 0.15
AutoBlockToggle.BorderSizePixel = 0
AutoBlockToggle.TextColor3 = Color3.new(1, 1, 1)
AutoBlockToggle.TextScaled = true
AutoBlockToggle.Font = Enum.Font.GothamBold
AutoBlockToggle.ZIndex = 100
AutoBlockToggle.Active = true
AutoBlockToggle.Selectable = true
local Corner = Instance.new("UICorner")
Corner.CornerRadius = UDim.new(0, 10)
Corner.Parent = AutoBlockToggle
local Stroke = Instance.new("UIStroke")
Stroke.Thickness = 2
Stroke.Parent = AutoBlockToggle
local AutoBlockValue = GetValue("AutoBlock", true)
local function UpdateAutoBlockToggle()
local Enabled = AutoBlockValue and AutoBlockValue.Value or false
AutoBlockToggle.Text = Enabled and "Auto Block: ON" or "Auto Block: OFF"
AutoBlockToggle.BackgroundColor3 = Enabled and Color3.fromRGB(0, 170, 85) or Color3.fromRGB(45, 45, 45)
end
AutoBlockToggle.MouseButton1Click:Connect(function()
if AutoBlockValue then
AutoBlockValue.Value = not AutoBlockValue.Value
UpdateAutoBlockToggle()
end
end)
if AutoBlockValue then
AutoBlockValue:GetPropertyChangedSignal("Value"):Connect(UpdateAutoBlockToggle)
end
UpdateAutoBlockToggle()
-- Drag ONLY from the left/right side handles.
-- The center of the button remains click-only, which prevents
-- two-finger touches from fighting over the toggle.
local Dragging = false
local DragStart
local StartPosition
local function MakeDragHandle(Name, XPosition)
local Handle = Instance.new("Frame")
Handle.Name = Name
Handle.Parent = AutoBlockToggle
Handle.Size = UDim2.new(0, 28, 1, 0)
Handle.Position = UDim2.new(XPosition, 0, 0, 0)
Handle.BackgroundTransparency = 1
Handle.BorderSizePixel = 0
Handle.Active = true
Handle.ZIndex = 101
Handle.InputBegan:Connect(function(Input)
if Input.UserInputType == Enum.UserInputType.MouseButton1
or Input.UserInputType == Enum.UserInputType.Touch then
Dragging = true
DragStart = Input.Position
StartPosition = AutoBlockToggle.Position
Input.Changed:Connect(function()
if Input.UserInputState == Enum.UserInputState.End then
Dragging = false
end
end)
end
end)
return Handle
end
MakeDragHandle("LeftDragHandle", 0)
MakeDragHandle("RightDragHandle", 1)
UserInputService.InputChanged:Connect(function(Input)
if Dragging and (Input.UserInputType == Enum.UserInputType.MouseMovement
or Input.UserInputType == Enum.UserInputType.Touch) then
local Delta = Input.Position - DragStart
AutoBlockToggle.Position = UDim2.new(
StartPosition.X.Scale, StartPosition.X.Offset + Delta.X,
StartPosition.Y.Scale, StartPosition.Y.Offset + Delta.Y
)
end
end)
end
MainUI.ChildAdded:Connect(function(Child)
if Child.Name == "AbilityContainer" then
--[[if Child:FindFirstChild("Block") and not Child:FindFirstChild("Block"):FindFirstChild("AutoImage") then
local AutoImage = Instance.new("ImageLabel")
AutoImage.Name = "AutoImage"
AutoImage.Interactable = false
AutoImage.Parent = Child:FindFirstChild("Block")
AutoImage.Image = "rbxassetid://114159864966636"
AutoImage.BackgroundTransparency = 1
AutoImage.Size = UDim2.fromScale(0.8,0.8)
AutoImage.Position = UDim2.fromScale(0.5,0)
AutoImage.AnchorPoint = Vector2.new(0.5,0.4)
AutoImage.Visible = GetValue("AutoBlock") and LocalCharacter.Parent.Name:find("Survi")
end]]
SideBar:SetAttribute("WasVisible", false)
UICheck()
end
end)
MainUI.ChildRemoved:Connect(function(Child)
if Child.Name == "AbilityContainer" then
SideBar:SetAttribute("WasVisible", true)
UICheck()
end
end)
SideBar:GetPropertyChangedSignal("Visible"):Connect(function()
SideBar.Visible = true
end)
SideBar:SetAttribute("WasVisible",(MainUI:FindFirstChild("AbilityContainer") == nil))
UICheck()
SideBar.Visible = true
ColoredPrint("Forsaken plus has loaded successfully","success",Color3.fromRGB(0, 200, 125))



Soon in the upcoming forsaken plus update there will be plugins where you can create custom features and even override already existing features. (think of it like infinite yield plugins) I think you should create a plugin for it this way users can have the updates of forsaken plus while also having the features of the plugin at the same time EDIT : the update is out you can find out how to create a plugin in my server