Created by waa#7294
Features:
- MAKE SUPER HARD MODE REALLY EASY
- DEV NOTES:
- this makes the game not fun and is in no way undetectable; if they add a client anticheat and you use this youre doomed
-- Constants
local REMOVE_BANANA_PEELS = true
local REMOVE_JEFFTHEKILLER_HITBOX = true -- makes jeff unable to deal damage
local REMOVE_GREED_RISK = true -- makes you unable to collect gold when you risk taking damage from greed
local REMOVE_AMBIENCE_SOUNDS = true -- not that necessary but if you want to hear better keep it
local REMOVE_EYES_DAMAGE = true -- makes eyes deal no damage
local REMOVE_SCREECH = true
local REMOVE_LIGHT_SHATTER = true -- makes lights not shatter from any entity moving (screech will still appear unless removed)
-- creates a guiding light so you know where to go
local MARK_NEXT_DOOR = true
local MARK_GATE_LEVER = true
local MARK_HINT_BOOKS = true
local SPEED_BOOST_ENABLED = true
local BOOST_EXTRA_WALKSPEED = 6 -- above makes you teleport back by anticheat
local CREATE_ENTITY_HINTS = true -- watch your topbar for hints when entities spawn
--- don't touch below (you can however change light properties, color is (red, green, blue) up to 255)
-- Services
local PlayersService = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Vars
local CurrentRooms = workspace:WaitForChild("CurrentRooms")
local LocalPlayer = PlayersService.LocalPlayer
--
local Hint
local function HandleModels(model)
task.wait(0.1)
local modelIdentifier = model.Name
if modelIdentifier == "BananaPeel" and REMOVE_BANANA_PEELS then
model:Destroy()
elseif modelIdentifier == "JeffTheKiller" and REMOVE_JEFFTHEKILLER_HITBOX then
local knife = model:WaitForChild("Knife", 10)
if not knife then
return
end
for _, descendant in ipairs(model:GetDescendants()) do
if descendant:IsA("BasePart") then
descendant.CanTouch = false
descendant.CanQuery = false
end
end
elseif (modelIdentifier == "RushMoving" or modelIdentifier == "AmbushMoving") and CREATE_ENTITY_HINTS then
if Hint then
return
end
task.wait(0.15)
local primaryPart = model.PrimaryPart
if not primaryPart or primaryPart.Position.Y < -100 then -- don't watch fake ones
return
end
local entityIdentifier = primaryPart.Name
local resultName = entityIdentifier == "RushNew" and string.gsub(model.Name, "Moving", "") or entityIdentifier
Hint = Instance.new("Hint")
Hint.Text = resultName.. " is coming! hide!!!"
Hint.Parent = workspace
-- yield until the entity is destroyed completely
model:GetPropertyChangedSignal("Parent"):Wait()
Hint:Destroy()
Hint = nil
end
end
local function HandleRooms(room)
task.wait(2)
local nextRoomId = tonumber(room.Name) + 1
for _, descendant in ipairs(room:GetDescendants()) do
local guidingLight = Instance.new("PointLight")
if MARK_GATE_LEVER and descendant.Name == "LeverForGate" then
guidingLight.Range = 60
guidingLight.Color = Color3.fromRGB(0, 255, 255)
guidingLight.Shadows = true
guidingLight.Parent = descendant:WaitForChild("Main", 5)
elseif MARK_HINT_BOOKS and descendant.Name == "LiveHintBook" then
guidingLight.Range = 20
guidingLight.Color = Color3.fromRGB(255, 0, 255)
guidingLight.Shadows = false
guidingLight.Parent = descendant:WaitForChild("Base", 5)
elseif MARK_NEXT_DOOR and descendant:GetAttribute("RoomID") == nextRoomId then
guidingLight.Range = 40
guidingLight.Color = Color3.fromRGB(255, 255, 255)
guidingLight.Shadows = false
guidingLight.Parent = descendant:WaitForChild("Door", 5)
end
end
end
local function HandleLoot(prompt)
if not REMOVE_GREED_RISK then
return
end
if prompt.Name ~= "LootPrompt" or prompt.ActionText ~= "Collect" then
return
end
-- if this isn't done script won't be able to use holdbegan signal to prevent collecting
prompt.HoldDuration = 0.025
local holdBeganConnection
local ancestryChangedConnection
holdBeganConnection = prompt.PromptButtonHoldBegan:Connect(function(playerWhoTriggered)
if LocalPlayer ~= playerWhoTriggered or LocalPlayer:GetAttribute("Greed") ~= 6 or prompt.HoldDuration == 999999 then
return
end
prompt.HoldDuration = 999999
-- yield until greed level changes
LocalPlayer:GetAttributeChangedSignal("Greed"):Wait()
prompt.HoldDuration = 0.025
end)
ancestryChangedConnection = game.AncestryChanged:Connect(function()
if prompt:IsDescendantOf(CurrentRooms) then
return
end
-- prompt was removed from workspace; these connections will only take memory
holdBeganConnection:Disconnect()
ancestryChangedConnection:Disconnect()
holdBeganConnection = nil
ancestryChangedConnection = nil
end)
end
local function HandleEntities()
local entitiesFolder = ReplicatedStorage:WaitForChild("Entities", 5)
if not entitiesFolder then
return
end
if REMOVE_SCREECH then
local screechModel = entitiesFolder:WaitForChild("Screech", 5)
if not screechModel then
return
end
screechModel:Destroy()
end
end
local function HandleAmbience()
if not REMOVE_AMBIENCE_SOUNDS then
return
end
local ambience_dark = workspace:WaitForChild("Ambience_Dark", 5)
if ambience_dark then
ambience_dark.Volume = 0
end
local ambienceFolder = workspace:WaitForChild("Ambience", 5)
if not ambienceFolder then
return
end
for _, descendant in ipairs(ambienceFolder:GetDescendants()) do
if descendant.ClassName == "Sound" then
descendant.Volume = 0
end
end
end
local function HandleSpeedBoost()
if not SPEED_BOOST_ENABLED then
return
end
local function handleCharacter(character)
local humanoid = character:WaitForChild("Humanoid")
local updating = false
local function updateSpeedBoost()
if updating then
return
end
-- basic debounce
updating = true
humanoid:SetAttribute("SpeedBoostBehind", BOOST_EXTRA_WALKSPEED)
updating = false
end
humanoid:GetAttributeChangedSignal("SpeedBoostBehind"):Connect(updateSpeedBoost)
updateSpeedBoost()
end
-- on revive
LocalPlayer.CharacterAdded:Connect(handleCharacter)
handleCharacter(LocalPlayer.Character)
end
local function HandleGameEvents()
local function isValid(func)
return type(func) == "function" and islclosure(func) and not is_synapse_function(func)
end
local gc = getgc()
for _, value in pairs(gc) do
if REMOVE_LIGHT_SHATTER then
if isValid(value) then
local info = debug.getinfo(value)
if info.currentline == 14 and string.find(info.short_src, "Module_Events") then
local functionEnvironment = getfenv(value)
-- remove luau optimizations (thats necessary)
setuntouched(functionEnvironment, false)
-- overwrite spawn
functionEnvironment.spawn = function()end
break
end
end
end
end
end
local function HandleRemotes()
local entityInfo = ReplicatedStorage:WaitForChild("EntityInfo", 5)
if not entityInfo then
return
end
if REMOVE_EYES_DAMAGE then
local motorReplicationEvent = entityInfo:WaitForChild("MotorReplication", 5)
if not motorReplicationEvent then
return
end
local findFirstChild = game.FindFirstChild
local originalNC
originalNC = hookmetamethod(game, "__namecall", function(self, ...)
if self and rawequal(self, motorReplicationEvent) then
if findFirstChild(workspace, "Eyes") then
local function filter(x, y, ...) -- x, y, z, crouching
return x, -89 - math.random(), ...
end
return originalNC(self, filter(...))
end
end
return originalNC(self, ...)
end, true)
end
end
local function SetUp()
workspace.ChildAdded:Connect(HandleModels)
for _, child in ipairs(workspace:GetChildren()) do
task.spawn(HandleModels, child)
end
--
CurrentRooms.ChildAdded:Connect(HandleRooms)
--
game.DescendantAdded:Connect(HandleLoot)
for _, descendant in ipairs(game:GetDescendants()) do
task.spawn(HandleLoot, descendant)
end
--
task.spawn(HandleEntities)
task.spawn(HandleAmbience)
task.spawn(HandleSpeedBoost)
task.spawn(HandleGameEvents)
task.spawn(HandleRemotes)
end
SetUp()