-- improved hookSound: try harder to cache hrp/char immediately -- Auto Block Rayfield Script (Full Features) local ReplicatedStorage = game:GetService("ReplicatedStorage") local TweenService = game:GetService("TweenService") local RunService = game:GetService("RunService") local Players = game:GetService("Players") local lp = Players.LocalPlayer local PlayerGui = lp:WaitForChild("PlayerGui") local Humanoid, Animator local StarterGui = game:GetService("StarterGui") local TestService = game:GetService("TestService") local ChatEvents = ReplicatedStorage:FindFirstChild("DefaultChatSystemChatEvents") local SayMessageRequest = ChatEvents and ChatEvents:FindFirstChild("SayMessageRequest") local testRemote = ReplicatedStorage:WaitForChild("Modules"):WaitForChild("Network"):WaitForChild("RemoteEvent") -- Place in ReplicatedFirst (LocalScript -- Continue script local Rayfield = loadstring(game:HttpGet("https://sirius.menu/rayfield"))() local Window = Rayfield:CreateWindow({ Name = "Auto Block Hub", LoadingTitle = "Auto Block Script", LoadingSubtitle = "by Skibidi Shots", ConfigurationSaving = { Enabled = true, FolderName = "AutoBlockHub", FileName = "Settings" }, Discord = {Enabled = false}, KeySystem = false }) local NoticeTab = Window:CreateTab("Notice", 4483362458) local AutoBlockTab = Window:CreateTab("Auto Block", 4483362458) local BDTab = Window:CreateTab("Better Detection", 4483362458) local TechTab = Window:CreateTab("Techs", 4483362458) local PredictiveTab = Window:CreateTab("Predictive Auto Block", 4483362458) local FakeBlockTab = Window:CreateTab("Fake Block", 4483362458) local AutoPunchTab = Window:CreateTab("Auto Punch", 4483362458) local CustomAnimationsTab = Window:CreateTab("Custom Animations", 4483362458) local MiscTab = Window:CreateTab("Misc", 4483362458) -- IDs. local autoBlockTriggerSounds = { ["102228729296384"] = true, ["140242176732868"] = true, ["112809109188560"] = true, ["136323728355613"] = true, ["115026634746636"] = true, ["84116622032112"] = true, ["108907358619313"] = true, ["127793641088496"] = true, ["86174610237192"] = true, ["95079963655241"] = true, ["101199185291628"] = true, ["119942598489800"] = true, ["84307400688050"] = true, ["113037804008732"] = true, ["105200830849301"] = true, ["75330693422988"] = true, ["82221759983649"] = true, ["81702359653578"] = true, ["108610718831698"] = true, ["112395455254818"] = true, ["109431876587852"] = true, ["109348678063422"] = true, ["85853080745515"] = true, ["12222216"] = true, ["105840448036441"] = true, ["114742322778642"] = true, ["119583605486352"] = true, ["79980897195554"] = true, ["71805956520207"] = true, ["79391273191671"] = true, ["89004992452376"] = true, ["101553872555606"] = true, ["101698569375359"] = true, ["106300477136129"] = true, ["116581754553533"] = true, ["117231507259853"] = true, ["119089145505438"] = true, ["121954639447247"] = true, ["125213046326879"] = true, ["131406927389838"] = true, } -- Prevent repeated aim triggers for the same animation track local lastAimTrigger = {} -- keys = AnimationTrack, value = timestamp when we triggered local AIM_WINDOW = 0.5 -- how long to aim (seconds) local AIM_COOLDOWN = 0.6 -- don't retrigger within this many seconds -- add once, outside the RenderStepped loop local _lastPunchMessageTime = _lastPunchMessageTime or 0 local MESSAGE_PUNCH_COOLDOWN = 0.6 -- overall throttle (seconds) local _punchPrevPlaying = _punchPrevPlaying or {} -- persist between frames local _lastBlockMessageTime = _lastBlockMessageTime or 0 local MESSAGE_BLOCK_COOLDOWN = 0.6 -- overall throttle (seconds) local _blockPrevPlaying = _blockPrevPlaying or {} -- persist between frames local autoBlockTriggerAnims = { "126830014841198", "126355327951215", "121086746534252", "18885909645", "98456918873918", "105458270463374", "83829782357897", "125403313786645", "118298475669935", "82113744478546", "70371667919898", "99135633258223", "97167027849946", "109230267448394", "139835501033932", "126896426760253", "109667959938617", "126681776859538", "129976080405072", "121293883585738", "81639435858902", "137314737492715", "92173139187970" } -- State Variables local autoBlockOn = false local autoBlockAudioOn = false local doubleblocktech = false local blockdelay = 0 local looseFacing = true local detectionRange = 18 local messageWhenAutoBlockOn = false local messageWhenAutoBlock = "" -- local fasterAudioAB = false (this is scrapped. im too lazy to remove it) local Debris = game:GetService("Debris") -- Anti-flick toggle state local antiFlickOn = false -- how many anti-flick parts to spawn (default 4) local antiFlickParts = 4 -- optional: base distance in front of killer for the first part local antiFlickBaseOffset = 2.7 -- optional: distance step between successive parts local antiFlickOffsetStep = 0 local antiFlickDelay = 0 -- seconds to wait before parts spawn (default 0 = instant) local PRED_SECONDS_FORWARD = 0.25 -- seconds ahead for linear prediction local PRED_SECONDS_LATERAL = 0.18 -- seconds ahead for lateral prediction local PRED_MAX_FORWARD = 6 -- clamp (studs) local PRED_MAX_LATERAL = 4 -- clamp (studs) local ANG_TURN_MULTIPLIER = 0.6 -- how much angular velocity contributes to lateral offset local SMOOTHING_LERP = 0.22 -- smoothing for sampled velocity/angular vel local killerState = {} -- [model] = { prevPos, prevLook, vel(Vector3), angVel(number) } -- prediction multiplier: 1.0 is normal, up to 10.0 -- prediction multipliers local predictionStrength = 1 -- forward/lateral (1x .. 10x) local predictionTurnStrength = 1 -- turning strength (1x .. 10x) -- multiplier for blue block parts size (1.0 = default) local blockPartsSizeMultiplier = 1 local autoAdjustDBTFBPS = false local _savedManualAntiFlickDelay = antiFlickDelay or 0 -- keep user's manual value when toggle is turned off -- map of killer name (lowercase) -> antiFlickDelay value you requested local killerDelayMap = { ["c00lkidd"] = 0, ["jason"] = 0.013, ["slasher"] = 0.01, ["1x1x1x1"] = 0.15, ["johndoe"] = 0.33, ["noli"] = 0.15, } local predictiveBlockOn = false local edgeKillerDelay = 3 local killerInRangeSince = nil local predictiveCooldown = 0 local Dspeed = 5.6 -- you can tweak these numbers local Ddelay = 0 local killerNames = {"c00lkidd", "Jason", "JohnDoe", "1x1x1x1", "Noli", "Slasher", "Sixer"} local autoPunchOn = false local messageWhenAutoPunchOn = false local messageWhenAutoPunch = "" local flingPunchOn = false local flingPower = 10000 local hiddenfling = false local aimPunch = false local customBlockEnabled = false local customBlockAnimId = "" local customblockdelay = 2 local customPunchEnabled = false local customPunchAnimId = "" local custompunchdelay = 2.7 local espEnabled = false local KillersFolder = workspace:WaitForChild("Players"):WaitForChild("Killers") local lastBlockTime = 0 local lastPunchTime = 0 local blockAnimIds = { "72722244508749", "96959123077498", "95802026624883" } local punchAnimIds = { "87259391926321", "140703210927645", "136007065400978", "136007065400978", "129843313690921", "129843313690921", "86709774283672", "87259391926321", "129843313690921", "129843313690921", "108807732150251", "138040001965654", "86096387000557", "86096387000557" } local chargeAnimIds = { "106014898538300" } local customChargeEnabled = false local customChargeAnimId = "" local chargeAnimIds = { "106014898528300" } local cachedAnimator = nil local function refreshAnimator() local char = lp.Character if not char then cachedAnimator = nil return end local hum = char:FindFirstChildOfClass("Humanoid") if hum then local anim = hum:FindFirstChildOfClass("Animator") cachedAnimator = anim or nil else cachedAnimator = nil end end lp.CharacterAdded:Connect(function(char) task.wait(0.5) -- allow Humanoid/Animator to be created refreshAnimator() end) -- ===== performance improvements for Sound Auto Block ===== -- cached UI / refs local cachedPlayerGui = PlayerGui local cachedPunchBtn, cachedBlockBtn, cachedCharges, cachedCooldown, cachedChargeBtn, cachedCloneBtn = nil, nil, nil, nil, nil, nil local detectionRangeSq = detectionRange * detectionRange local function refreshUIRefs() -- ensure we have the most up-to-date references for MainUI and ability buttons cachedPlayerGui = lp:FindFirstChild("PlayerGui") or PlayerGui local main = cachedPlayerGui and cachedPlayerGui:FindFirstChild("MainUI") if main then local ability = main:FindFirstChild("AbilityContainer") cachedPunchBtn = ability and ability:FindFirstChild("Punch") cachedBlockBtn = ability and ability:FindFirstChild("Block") cachedChargeBtn = ability and ability:FindFirstChild("Charge") cachedCloneBtn = ability and ability:FindFirstChild("Clone") cachedCharges = cachedPunchBtn and cachedPunchBtn:FindFirstChild("Charges") cachedCooldown = cachedBlockBtn and cachedBlockBtn:FindFirstChild("CooldownTime") else cachedPunchBtn, cachedBlockBtn, cachedCharges, cachedCooldown, cachedChargeBtn, cachedCloneBtn = nil, nil, nil, nil, nil, nil end end -- call once at startup refreshUIRefs() -- refresh on GUI or character changes (keeps caches fresh) if cachedPlayerGui then cachedPlayerGui.ChildAdded:Connect(function(child) if child.Name == "MainUI" then task.delay(0.02, refreshUIRefs) end end) end lp.CharacterAdded:Connect(function() task.delay(0.5, refreshUIRefs) end) NoticeTab:CreateParagraph({ Title = "welcome", Content = "thanks for using my wonderful auto block script" }) NoticeTab:CreateParagraph({ Title = "", Content = "some features may only work with guest skins thats using the default anims" }) NoticeTab:CreateParagraph({ Title = "", Content = ".gg/Tmby2GkKJR" }) -- GUI Toggles AutoBlockTab:CreateToggle({ Name = "Auto Block (Animation)", CurrentValue = false, Flag = "AutoBlockAnimation", Callback = function(Value) autoBlockOn = Value end }) -- Rayfield toggle for Auto Block (Audio) AutoBlockTab:CreateToggle({ Name = "Auto Block (Audio)", CurrentValue = false, Flag = "AutoBlockAudio", Callback = function(state) autoBlockAudioOn = state end, }) -- make sure AutoBlockTab is a valid Rayfield tab object local autoblocktype = "Block" local StarterGui = game:GetService("StarterGui") -- simple notification local function SendNotif(title, text, duration) StarterGui:SetCore("SendNotification", { Title = title or "Hello", Text = text or "hi", Duration = duration or 4 -- seconds }) end AutoBlockTab:CreateButton({ Name = "Change auto block type", Callback = function() if autoblocktype == "Block" then autoblocktype = "Charge" SendNotif("changed auto block type", "CHARGE", 4) elseif autoblocktype == "Charge" then autoblocktype = "7n7 Clone" SendNotif("changed auto block type", "7N7 CLONE", 4) elseif autoblocktype == "7n7 Clone" then autoblocktype = "Block" SendNotif("changed auto block type", "BLOCK", 4) end end, }) --AutoBlockTab:CreateToggle({ -- Name = "Faster Audio AB (only uses detection range)", -- CurrentValue = false, -- Flag = "FasterAudioAB", -- Callback = function(state) -- fasterAudioAB = state -- end, --}) AutoBlockTab:CreateParagraph({ Title = "Recomendation", Content = "use audio auto block and use 20 range for it" }) AutoBlockTab:CreateToggle({ Name = "Message When Blocking", CurrentValue = false, Flag = "MessageWhenBlockToggle", Callback = function(Value) messageWhenAutoBlockOn = Value end }) AutoBlockTab:CreateInput({ Name = "Block Delay", PlaceholderText = "0", RemoveTextAfterFocusLost = false, Flag = "blockdelaynumber", Callback = function(Text) blockdelay = tonumber(Text) or blockdelay end }) AutoBlockTab:CreateInput({ Name = "Message when blocking", PlaceholderText = "im gonna block ya", RemoveTextAfterFocusLost = false, Flag = "MessageWhenBlockText", Callback = function(Text) messageWhenAutoBlock = Text end }) AutoBlockTab:CreateParagraph({ Title = "notice", Content = "face check delays on coolkid, dont use face check agaisnt coolkid." }) local facingCheckEnabled = true local customFacingDot = -0.3 AutoBlockTab:CreateToggle({ Name = "Enable Facing Check", CurrentValue = true, Flag = "FacingCheckToggle", Callback = function(Value) facingCheckEnabled = Value end }) local function isFacing(localRoot, targetRoot) if not facingCheckEnabled then return true end local dir = (localRoot.Position - targetRoot.Position).Unit local dot = targetRoot.CFrame.LookVector:Dot(dir) return looseFacing and dot > customFacingDot end -- Optimized facing check local function isFacing(localRoot, targetRoot) -- fast global reads local enabled = facingCheckEnabled if not enabled then return true end local loose = looseFacing -- difference vector (one allocation, unavoidable) local dx = localRoot.Position.X - targetRoot.Position.X local dy = localRoot.Position.Y - targetRoot.Position.Y local dz = localRoot.Position.Z - targetRoot.Position.Z -- magnitude (sqrt) once; handle zero-distance safely local mag = math.sqrt(dx*dx + dy*dy + dz*dz) if mag == 0 then -- if positions coincide treat as "facing" (matches permissive behavior) return true end local invMag = 1 / mag -- unit direction components (no new Vector3 allocation) local ux, uy, uz = dx * invMag, dy * invMag, dz * invMag -- cache look vector components local lv = targetRoot.CFrame.LookVector local lx, ly, lz = lv.X, lv.Y, lv.Z -- dot product (fast scalar math) local dot = lx * ux + ly * uy + lz * uz -- same logic as original, but explicit for clarity/branch prediction return dot > (customFacingDot or -0.3) end -- ===== Facing Check Visual (fixed) ===== local facingVisualOn = false local facingVisuals = {} -- [killer] = visual local function updateFacingVisual(killer, visual) if not (killer and visual and visual.Parent) then return end local hrp = killer:FindFirstChild("HumanoidRootPart") if not hrp then return end -- calculate angle from DOT threshold (safe-clamp) local dot = math.clamp(customFacingDot or -0.3, -1, 1) local angle = math.acos(dot) -- radians, 0..pi local frac = angle / math.pi -- 0..1 (0 = very narrow cone, 1 = very wide) -- scale radius between a small fraction and full detectionRange local minFrac = 0.20 -- tune: smallest disc is 20% of detectionRange local radius = math.max(1, detectionRange * (minFrac + (1 - minFrac) * frac)) visual.Radius = radius visual.Height = 0.12 -- place the disc in front of the killer; move slightly less forward for narrow cones local forwardDist = detectionRange * (0.35 + 0.15 * frac) -- tune if you like local yOffset = -(hrp.Size.Y / 2 + 0.05) visual.CFrame = CFrame.new(0, yOffset, -forwardDist) * CFrame.Angles(math.rad(90), 0, 0) -- determine local player's HRP and whether they are inside range & facing local myRoot = lp.Character and lp.Character:FindFirstChild("HumanoidRootPart") local inRange = false local facingOkay = false if myRoot and hrp then local dist = (hrp.Position - myRoot.Position).Magnitude inRange = dist <= detectionRange facingOkay = (not facingCheckEnabled) or (type(isFacing) == "function" and isFacing(myRoot, hrp)) end -- color / transparency if inRange and facingOkay then visual.Color3 = Color3.fromRGB(0, 255, 0) visual.Transparency = 0.40 else visual.Color3 = Color3.fromRGB(255, 255, 0) -- show yellow when not both conditions visual.Transparency = 0.85 end end local function addFacingVisual(killer) if not killer or not killer:IsA("Model") then return end if facingVisuals[killer] then return end local hrp = killer:FindFirstChild("HumanoidRootPart") if not hrp then return end local visual = Instance.new("CylinderHandleAdornment") visual.Name = "FacingCheckVisual" visual.Adornee = hrp visual.AlwaysOnTop = true visual.ZIndex = 2 visual.Transparency = 0.55 visual.Color3 = Color3.fromRGB(0, 255, 0) -- green visual.Parent = hrp facingVisuals[killer] = visual -- initialize placement immediately updateFacingVisual(killer, visual) end local function removeFacingVisual(killer) local v = facingVisuals[killer] if v then v:Destroy() facingVisuals[killer] = nil end end local function refreshFacingVisuals() for _, k in ipairs(KillersFolder:GetChildren()) do if facingVisualOn then -- make sure HRP exists before creating local hrp = k:FindFirstChild("HumanoidRootPart") or k:WaitForChild("HumanoidRootPart", 5) if hrp then addFacingVisual(k) end else removeFacingVisual(k) end end end -- keep visuals in sync every frame (ensures size/mode changes apply immediately) RunService.RenderStepped:Connect(function() for killer, visual in pairs(facingVisuals) do -- if the killer was removed/died, clean up if not killer.Parent or not killer:FindFirstChild("HumanoidRootPart") then removeFacingVisual(killer) else updateFacingVisual(killer, visual) end end end) -- Keep visuals for newly added/removed killers KillersFolder.ChildAdded:Connect(function(killer) if facingVisualOn then task.spawn(function() local hrp = killer:WaitForChild("HumanoidRootPart", 5) if hrp then addFacingVisual(killer) end end) end end) KillersFolder.ChildRemoved:Connect(function(killer) removeFacingVisual(killer) end) -- toggle in GUI (keeps behaviour with dropdown) AutoBlockTab:CreateToggle({ Name = "Facing Check Visual", CurrentValue = false, Flag = "FacingCheckVisualToggle", Callback = function(state) facingVisualOn = state refreshFacingVisuals() end }) AutoBlockTab:CreateParagraph({ Title = "letsgo", Content = "facing check visual not being accurate is because its just there to give u an idea of the facing check" }) AutoBlockTab:CreateInput({ Name = "Facing Check angle (DOT)", PlaceholderText = "-0.3", RemoveTextAfterFocusLost = false, Flag = "Facingcheckdot", Callback = function(Text) customFacingDot = tonumber(Text) or customFacingDot end }) AutoBlockTab:CreateParagraph({ Title = "DOT explanation", Content = "if for example you put it 0 you will need to be EXACTLY infront of the killer. but you can make the facing check cone larger by making it -0.3 or -0.5 if you put -1 is going to be a half circle cone infront the killer, so yeah." }) AutoBlockTab:CreateInput({ Name = "Detection Range", PlaceholderText = "18", RemoveTextAfterFocusLost = false, Flag = "DetectionRange", Callback = function(Text) detectionRange = tonumber(Text) or detectionRange detectionRangeSq = detectionRange * detectionRange end }) -- ===== Facing Check Visual (paste after detectionCircles / addKillerCircle) ===== local detectionCircles = {} -- store all killer circles local killerCirclesVisible = false -- Function to add circle to a killer -- replace your addKillerCircle with this local function addKillerCircle(killer) if not killer:FindFirstChild("HumanoidRootPart") then return end if detectionCircles[killer] then return end local hrp = killer.HumanoidRootPart local circle = Instance.new("CylinderHandleAdornment") circle.Name = "KillerDetectionCircle" circle.Adornee = hrp circle.Color3 = Color3.fromRGB(255, 0, 0) circle.AlwaysOnTop = true circle.ZIndex = 1 circle.Transparency = 0.6 circle.Radius = detectionRange -- <- use detectionRange exactly circle.Height = 0.12 -- thin disc -- place the disc at the feet of the HumanoidRootPart (CFrame is relative to Adornee) local yOffset = -(hrp.Size.Y / 2 + 0.05) -- a little below HRP origin circle.CFrame = CFrame.new(0, yOffset, 0) * CFrame.Angles(math.rad(90), 0, 0) circle.Parent = hrp detectionCircles[killer] = circle end -- Update radius when detectionRange changes (and on render) -- Function to remove circle from a killer local function removeKillerCircle(killer) if detectionCircles[killer] then detectionCircles[killer]:Destroy() detectionCircles[killer] = nil end end -- Refresh all circles local function refreshKillerCircles() for _, killer in ipairs(KillersFolder:GetChildren()) do if killerCirclesVisible then addKillerCircle(killer) else removeKillerCircle(killer) end end end -- Keep radius updated RunService.RenderStepped:Connect(function() for killer, circle in pairs(detectionCircles) do if circle and circle.Parent then circle.Radius = detectionRange end end end) -- Hook into killers being added/removed KillersFolder.ChildAdded:Connect(function(killer) if killerCirclesVisible then task.spawn(function() -- Wait until HRP exists (max 5s timeout) local hrp = killer:WaitForChild("HumanoidRootPart", 5) if hrp then addKillerCircle(killer) end end) end end) KillersFolder.ChildRemoved:Connect(function(killer) removeKillerCircle(killer) end) -- Rayfield toggle AutoBlockTab:CreateToggle({ Name = "Range Visual", CurrentValue = false, Flag = "KillerCircleToggle", Callback = function(state) killerCirclesVisible = state refreshKillerCircles() end }) BDTab:CreateParagraph({ Title = "notice", Content = "BD or Better Detection delays on coolkid, use normal detection agaisnt coolkid." }) BDTab:CreateToggle({ Name = "Better Detection (doesn't use detectrange)", CurrentValue = false, Flag = "AntiFlickToggle", Callback = function(state) antiFlickOn = state end, }) BDTab:CreateSlider({ Name = "How many block parts that spawn", Range = {1, 16}, -- min,max parts the player can pick Increment = 1, -- step size (integer only) Suffix = "parts", CurrentValue = 4, -- default shown in UI Flag = "AntiFlickParts", Callback = function(val) antiFlickParts = math.max(1, math.floor(val)) end, }) BDTab:CreateSlider({ Name = "Block Parts Size Multiplier", Range = {0.1, 5}, -- min 0.1x, max 5x Increment = 0.1, Suffix = "x", CurrentValue = 1, -- default 1x Flag = "BlockPartsSizeMultiplier", Callback = function(val) blockPartsSizeMultiplier = tonumber(val) or 1 end, }) BDTab:CreateSlider({ Name = "Forward Prediction Strength", Range = {0, 10}, -- 1x .. 10x Increment = 0.1, Suffix = "x", CurrentValue = 1, Flag = "PredictionStrength", Callback = function(val) predictionStrength = val end, }) BDTab:CreateSlider({ Name = "Turn Prediction Strength", Range = {0, 10}, -- 1x .. 10x Increment = 0.1, Suffix = "x", CurrentValue = 1, Flag = "PredictionTurnStrength", Callback = function(val) predictionTurnStrength = val end, }) BDTab:CreateInput({ Name = "delay before the first block part spawn (seconds) (DBTFBPS)", PlaceholderText = "0", RemoveTextAfterFocusLost = false, Flag = "AntiFlickDelay", Callback = function(text) local num = tonumber(text) if num then antiFlickDelay = math.max(0, num) -- don’t allow negative end end, }) -- ===== auto-adjust DBTFBPS based on killer (drop this after KillersFolder / BD inputs) ===== local function getNearestKillerModel() local myChar = lp.Character local myRoot = myChar and myChar:FindFirstChild("HumanoidRootPart") if not myRoot then return nil end local closest, closestDist = nil, math.huge for _, k in ipairs(KillersFolder:GetChildren()) do if k and k:IsA("Model") then local hrp = k:FindFirstChild("HumanoidRootPart") if hrp then local d = (hrp.Position - myRoot.Position).Magnitude if d < closestDist then closest, closestDist = k, d end end end end return closest end local function applyDelayForKillerModel(killerModel) if not killerModel then -- no killer found -> restore manual value if antiFlickDelay ~= _savedManualAntiFlickDelay then antiFlickDelay = _savedManualAntiFlickDelay print(("Auto-DBTFBPS: no killer -> restore antiFlickDelay = %s"):format(tostring(antiFlickDelay))) end return end local key = (tostring(killerModel.Name) or ""):lower() local mapped = killerDelayMap[key] if mapped ~= nil then if antiFlickDelay ~= mapped then antiFlickDelay = mapped print(("Auto-DBTFBPS: matched killer '%s' -> antiFlickDelay = %s"):format(killerModel.Name, tostring(mapped))) end else -- killer not in mapping: restore manual value (avoid surprising changes) if antiFlickDelay ~= _savedManualAntiFlickDelay then antiFlickDelay = _savedManualAntiFlickDelay print(("Auto-DBTFBPS: killer '%s' not mapped -> restore antiFlickDelay = %s"):format(killerModel.Name, tostring(_savedManualAntiFlickDelay))) end end end -- small throttled heartbeat loop (runs only when toggle enabled) local adjustTicker = 0 RunService.Heartbeat:Connect(function(dt) if not autoAdjustDBTFBPS then return end adjustTicker = adjustTicker + dt if adjustTicker < 0.15 then return end -- check ~every 0.15s adjustTicker = 0 local nearest = getNearestKillerModel() applyDelayForKillerModel(nearest) end) -- immediate update helper when killers spawn/leave or user toggles local function doImmediateUpdate() if not autoAdjustDBTFBPS then return end local nearest = getNearestKillerModel() applyDelayForKillerModel(nearest) end -- respond quickly when killers are added/removed (so toggle reacts immediately) KillersFolder.ChildAdded:Connect(function() task.delay(0.05, doImmediateUpdate) end) KillersFolder.ChildRemoved:Connect(function() task.delay(0.05, doImmediateUpdate) end) -- UI toggle to enable/disable the auto-adjust behavior (place this near other BDTab controls) BDTab:CreateToggle({ Name = "Auto-adjust DBTFBPS based on killer", CurrentValue = false, Flag = "AutoAdjustDBTFBPS", Callback = function(state) autoAdjustDBTFBPS = state if state then -- save the current manual value so we can restore it when the toggle is off _savedManualAntiFlickDelay = antiFlickDelay or 0 doImmediateUpdate() print("Auto-DBTFBPS: enabled (saved manual antiFlickDelay = " .. tostring(_savedManualAntiFlickDelay) .. ")") else -- restore manual value when user disables antiFlickDelay = _savedManualAntiFlickDelay print("Auto-DBTFBPS: disabled -> restored antiFlickDelay = " .. tostring(antiFlickDelay)) end end, }) -- ===== end auto-adjust snippet ===== local stagger = 0.02 BDTab:CreateInput({ Name = "delay before each block parts spawns (seconds)", PlaceholderText = "0.02", RemoveTextAfterFocusLost = false, Flag = "AntiFlickDelayEachParts", Callback = function(text) local num = tonumber(text) if num then stagger = math.max(0, num) -- don’t allow negative end end, }) BDTab:CreateInput({ Name = "how much studs infront killer the block parts are gonna spawn (studs)", PlaceholderText = "2.7", RemoveTextAfterFocusLost = false, Flag = "AntiFlickDistanceInfront", Callback = function(text) local num = tonumber(text) if num then antiFlickBaseOffset = math.max(0, num) -- don’t allow negative end end, }) TechTab:CreateToggle({ Name = "Double Punch Tech", CurrentValue = false, Flag = "doubleblockTechtoggle", Callback = function(state) doubleblocktech = state end, }) -- Hitbox Dragging Tech local hitboxDraggingTech = false local _hitboxDraggingDebounce = false local HITBOX_DRAG_DURATION = 1.4 local HITBOX_DETECT_RADIUS = 6 TechTab:CreateToggle({ Name = "Hitbox Dragging tech (HDT)", CurrentValue = false, Flag = "HitboxDraggingToggle", Callback = function(state) hitboxDraggingTech = state end, }) TechTab:CreateInput({ Name = "HDT speed", PlaceholderText = "5.6", RemoveTextAfterFocusLost = false, Flag = "HDTspeed", Callback = function(Text) Dspeed = Text end }) TechTab:CreateInput({ Name = "HDT delay", PlaceholderText = "0", RemoveTextAfterFocusLost = false, Flag = "HDTdelay", Callback = function(Text) Ddelay = Text end }) TechTab:CreateParagraph({ Title = "Hitbox Dragging tech", Content = "i reccomend using a high detection range (if using normal detection) when using this" }) TechTab:CreateButton({ Name = "Fake Lag Tech", Callback = function() pcall(function() local char = lp.Character or lp.CharacterAdded:Wait() local humanoid = char and char:FindFirstChildOfClass("Humanoid") if not humanoid then return end local animator = humanoid:FindFirstChildOfClass("Animator") or Instance.new("Animator", humanoid) -- (optional) stop any identical track already playing for _, t in ipairs(animator:GetPlayingAnimationTracks()) do local id = tostring(t.Animation and t.Animation.AnimationId or ""):match("%d+") if id == "136252471123500" then pcall(function() t:Stop() end) end end local anim = Instance.new("Animation") anim.AnimationId = "rbxassetid://136252471123500" local track = animator:LoadAnimation(anim) track:Play() end) end, }) PredictiveTab:CreateToggle({ Name = "Predictive Auto Block", CurrentValue = false, Callback = function(Value) predictiveBlockOn = Value end, }) PredictiveTab:CreateInput({ Name = "Detection Range", PlaceholderText = "10", RemoveTextAfterFocusLost = false, Callback = function(text) local num = tonumber(text) if num then detectionRange = num end end, }) PredictiveTab:CreateSlider({ Name = "Edge Killer", Range = {0, 7}, Increment = 0.1, CurrentValue = 3, Flag = "edgekillerlmao", Callback = function(val) edgeKillerDelay = val end, }) PredictiveTab:CreateParagraph({ Title = "Edge Killer", Content = "how many secs until it blocks (resets when killer gets out of range)" }) FakeBlockTab:CreateButton({ Name = "Load Fake Block", Callback = function() pcall(function() local fakeGui = PlayerGui:FindFirstChild("FakeBlockGui") if not fakeGui then local success, result = pcall(function() return loadstring(game:HttpGet("https://raw.githubusercontent.com/skibidi399/Auto-block-script/refs/heads/main/fakeblock"))() end) if not success then warn("❌ Failed to load Fake Block GUI:", result) end else fakeGui.Enabled = true print("✅ Fake Block GUI enabled") end end) end }) AutoPunchTab:CreateToggle({ Name = "Auto Punch", CurrentValue = false, Flag = "AutoPunchToggle", Callback = function(Value) autoPunchOn = Value end }) AutoPunchTab:CreateToggle({ Name = "Message When Punching", CurrentValue = false, Flag = "MessageWhenPunchToggle", Callback = function(Value) messageWhenAutoPunchOn = Value end }) AutoPunchTab:CreateInput({ Name = "Message when punching", PlaceholderText = "Im not gonna sugarcoat it.", RemoveTextAfterFocusLost = false, Flag = "MessageWhenPunchText", Callback = function(Text) messageWhenAutoPunch = Text end }) AutoPunchTab:CreateToggle({ Name = "Fling Punch", CurrentValue = false, Callback = function(Value) flingPunchOn = Value end }) AutoPunchTab:CreateToggle({ Name = "Punch Aimbot", CurrentValue = false, Flag = "PunchAimToggle", Callback = function(Value) aimPunch = Value end }) local predictionValue = 4 AutoPunchTab:CreateSlider({ Name = "Aim Prediction", Range = {0, 10}, Increment = 0.1, Suffix = "studs", CurrentValue = predictionValue, Flag = "PredictionSlider", Callback = function(Value) predictionValue = Value end, }) AutoPunchTab:CreateSlider({ Name = "Fling Power", Range = {5000, 50000000000000}, Increment = 1000000, CurrentValue = 10000, Flag = "FlingPower", Callback = function(Value) flingPower = Value end }) -- Custom Block Animation CustomAnimationsTab:CreateInput({ Name = "Custom Block Animation", PlaceholderText = "AnimationId", RemoveTextAfterFocusLost = false, Flag = "customblockid", Callback = function(Text) customBlockAnimId = Text end }) CustomAnimationsTab:CreateToggle({ Name = "Enable Custom Block Animation", CurrentValue = false, Callback = function(Value) customBlockEnabled = Value end }) CustomAnimationsTab:CreateInput({ Name = "delay before stop anim (block)", PlaceholderText = "2", RemoveTextAfterFocusLost = false, Flag = "customblockdelaystop", Callback = function(Text) customblockdelay = Text end }) CustomAnimationsTab:CreateInput({ Name = "Custom Punch Animation (not for M3/M4)", PlaceholderText = "AnimationId", RemoveTextAfterFocusLost = false, Flag = "custompunchid", Callback = function(Text) customPunchAnimId = Text end }) CustomAnimationsTab:CreateToggle({ Name = "Enable Custom Punch Animation", CurrentValue = false, Callback = function(Value) customPunchEnabled = Value end }) CustomAnimationsTab:CreateInput({ Name = "delay before stop anim (punch)", PlaceholderText = "2", RemoveTextAfterFocusLost = false, Flag = "custompunchdelaystop", Callback = function(Text) custompunchdelay = Text end }) CustomAnimationsTab:CreateInput({ Name = "Charge Animation ID", PlaceholderText = "Put animation ID here", RemoveTextAfterFocusLost = false, Flag = "customchargeid", Callback = function(input) customChargeAnimId = input end, }) CustomAnimationsTab:CreateToggle({ Name = "Custom Charge Animation", CurrentValue = false, Callback = function(value) customChargeEnabled = value end, }) -- Button to run Infinite Yield MiscTab:CreateButton({ Name = "Run Infinite Yield", Callback = function() loadstring(game:HttpGet("https://raw.githubusercontent.com/EdgeIY/infiniteyield/master/source"))() end, }) MiscTab:CreateButton({ Name = "c00lgui (custom stamina, esp, dont use on xeno) creds to owner", Callback = function() loadstring(game:HttpGet("https://rawscripts.net/raw/Forsaken-c00lgui-v15-ESP-EDITABLE-STAMINA-41624"))() end, }) -- Control Charge: only watch sounds that are descendants of the local player's character -- ===== Full Control Charge block using noli void rush override behavior ===== -- Assumes your script already requires RunService and Players in the file, -- but this block gets its own references so it can be pasted standalone. local RunService = game:GetService("RunService") local Players = game:GetService("Players") local lp = Players.LocalPlayer -- Detector IDs table (use existing chargeAnimIds if available) local detectorChargeIds = (type(chargeAnimIds) == "table" and chargeAnimIds) or {} -- Optional: detect a custom charge anim id (if you already use these vars elsewhere) -- set customChargeEnabled = true and customChargeAnimId = "123456" elsewhere in your script to detect custom anim too -- local customChargeEnabled = false -- local customChargeAnimId = "" -- Override speed (same as your noli script) local ORIGINAL_DASH_SPEED = 60 -- Toggle / runtime state local controlChargeEnabled = false local controlChargeActive = false local overrideConnection = nil -- Save/restore for humanoid original values local savedHumanoidState = {} local function getHumanoid() if not lp or not lp.Character then return nil end return lp.Character:FindFirstChildOfClass("Humanoid") end local function saveHumState(hum) if not hum then return end if savedHumanoidState[hum] then return end local s = {} pcall(function() s.WalkSpeed = hum.WalkSpeed -- support either JumpPower or JumpHeight local ok, _ = pcall(function() s.JumpPower = hum.JumpPower end) if not ok then pcall(function() s.JumpPower = hum.JumpHeight end) end -- AutoRotate might not exist on all Humanoids; try to capture if possible local ok2, ar = pcall(function() return hum.AutoRotate end) if ok2 then s.AutoRotate = ar end s.PlatformStand = hum.PlatformStand end) savedHumanoidState[hum] = s end local function restoreHumState(hum) if not hum then return end local s = savedHumanoidState[hum] if not s then return end pcall(function() if s.WalkSpeed ~= nil then hum.WalkSpeed = s.WalkSpeed end if s.JumpPower ~= nil then local ok, _ = pcall(function() hum.JumpPower = s.JumpPower end) if not ok then pcall(function() hum.JumpHeight = s.JumpPower end) end end if s.AutoRotate ~= nil then pcall(function() hum.AutoRotate = s.AutoRotate end) end if s.PlatformStand ~= nil then hum.PlatformStand = s.PlatformStand end end) savedHumanoidState[hum] = nil end -- Start the override (forces dash movement similar to noli void rush) local function startOverride() if controlChargeActive then return end local hum = getHumanoid() if not hum then return end controlChargeActive = true saveHumState(hum) -- Make sure humanoid is set to dash state pcall(function() hum.WalkSpeed = ORIGINAL_DASH_SPEED hum.AutoRotate = false end) -- RenderStepped connection to force forward movement every frame (like your noli function) overrideConnection = RunService.RenderStepped:Connect(function() local humanoid = getHumanoid() local rootPart = humanoid and humanoid.Parent and humanoid.Parent:FindFirstChild("HumanoidRootPart") if not humanoid or not rootPart then return end -- ensure speed + autorotate each frame (helps if some other code fights it) pcall(function() humanoid.WalkSpeed = ORIGINAL_DASH_SPEED humanoid.AutoRotate = false end) local direction = rootPart.CFrame.LookVector local horizontal = Vector3.new(direction.X, 0, direction.Z) if horizontal.Magnitude > 0 then humanoid:Move(horizontal.Unit) else humanoid:Move(Vector3.new(0,0,0)) end end) end -- Stop the override and restore humanoid state local function stopOverride() if not controlChargeActive then return end controlChargeActive = false -- disconnect override loop if overrideConnection then pcall(function() overrideConnection:Disconnect() end) overrideConnection = nil end -- restore humanoid fields local hum = getHumanoid() if hum then pcall(function() -- restore saved values if present restoreHumState(hum) -- ensure we stop movement humanoid:Move(Vector3.new(0,0,0)) end) end end -- Internal detection: look for playing anim tracks that match charge IDs or custom ID local function detectChargeAnimation() local hum = getHumanoid() if not hum then return false end for _, track in ipairs(hum:GetPlayingAnimationTracks()) do local ok, animId = pcall(function() return tostring(track.Animation and track.Animation.AnimationId or ""):match("%d+") end) if ok and animId and animId ~= "" then if detectorChargeIds and table.find(detectorChargeIds, animId) then return true end if (type(customChargeEnabled) == "boolean" and customChargeEnabled) and customChargeAnimId and tostring(customChargeAnimId) ~= "" then if tostring(animId) == tostring(customChargeAnimId) then return true end end end end return false end -- Public toggle control local function ControlCharge_SetEnabled(val) controlChargeEnabled = val and true or false if not controlChargeEnabled and controlChargeActive then stopOverride() end end -- Main loop: check detection each RenderStepped (uses same cadence as noli script) RunService.RenderStepped:Connect(function() if not controlChargeEnabled then if controlChargeActive then stopOverride() end return end -- If humanoid dies or character resets, ensure override cleared local hum = getHumanoid() if not hum then if controlChargeActive then stopOverride() end return end local isCharging = detectChargeAnimation() if isCharging then if not controlChargeActive then startOverride() end else if controlChargeActive then stopOverride() end end end) -- Keep humanoid state fresh on CharacterAdded lp.CharacterAdded:Connect(function(char) -- small wait to let Humanoid exist task.spawn(function() local hum = char:WaitForChild("Humanoid", 2) if hum then -- optionally prime saved state (not necessary) end end) end) -- Expose toggle function globally for other script parts or for hotkeys _G.ControlCharge_SetEnabled = ControlCharge_SetEnabled -- Example usage: -- _G.ControlCharge_SetEnabled(true) -- enable detection/override -- _G.ControlCharge_SetEnabled(false) -- disable -- ======================================================================= -- Rayfield GUI for Control Charge (paste near your other CustomAnimationsTab UI code) -- Requires CustomAnimationsTab from your Rayfield Window (already present in your big script) -- initialize global defaults so the control block can read them _G.ControlCharge_DashSpeed = _G.ControlCharge_DashSpeed or 60 _G.ControlCharge_CustomEnabled = _G.ControlCharge_CustomEnabled or false _G.ControlCharge_CustomAnimId = _G.ControlCharge_CustomAnimId or "" -- Toggle: enable / disable the control charge monitoring MiscTab:CreateToggle({ Name = "Control Charge", CurrentValue = false, Callback = function(val) -- call the setter your control block exposes if _G.ControlCharge_SetEnabled then pcall(function() _G.ControlCharge_SetEnabled(val) end) else -- fallback: store desired state so the control block can pick it up if it reads _G later _G.ControlCharge_WantedEnabled = val end end, }) -- Message below the button MiscTab:CreateParagraph({ Title = "Tip", Content = 'Run Infinite Yield and type "antifling" so punch fling works better.' }) local function addESP(obj) if not obj:IsA("Model") then return end if not obj:FindFirstChild("HumanoidRootPart") then return end local plr = Players:GetPlayerFromCharacter(obj) if not plr then return end -- ✅ only add ESP if it's a player character -- Prevent duplicates if obj:FindFirstChild("ESP_Highlight") then return end -- Highlight local highlight = Instance.new("Highlight") highlight.Name = "ESP_Highlight" highlight.FillColor = Color3.fromRGB(255, 0, 0) highlight.OutlineColor = Color3.fromRGB(255, 255, 255) highlight.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop highlight.Adornee = obj highlight.Parent = obj -- Billboard local billboard = Instance.new("BillboardGui") billboard.Name = "ESP_Billboard" billboard.Size = UDim2.new(0, 100, 0, 50) billboard.AlwaysOnTop = true billboard.Adornee = obj:FindFirstChild("HumanoidRootPart") billboard.Parent = obj local textLabel = Instance.new("TextLabel") textLabel.Name = "ESP_Text" textLabel.Size = UDim2.new(1, 0, 1, 0) textLabel.BackgroundTransparency = 1 textLabel.TextColor3 = Color3.fromRGB(255, 0, 0) textLabel.TextScaled = true textLabel.Font = Enum.Font.SourceSansBold textLabel.Text = obj.Name textLabel.Parent = billboard end -- Function to clear ESP local function clearESP(obj) if obj:FindFirstChild("ESP_Highlight") then obj.ESP_Highlight:Destroy() end if obj:FindFirstChild("ESP_Billboard") then obj.ESP_Billboard:Destroy() end end -- Function to refresh all ESP local function refreshESP() if not espEnabled then for _, killer in pairs(KillersFolder:GetChildren()) do clearESP(killer) end return end for _, killer in pairs(KillersFolder:GetChildren()) do addESP(killer) end end -- Modify ChildAdded connection: KillersFolder.ChildAdded:Connect(function(child) if espEnabled then task.wait(0.1) -- wait for HRP addESP(child) end end) KillersFolder.ChildRemoved:Connect(function(child) clearESP(child) end) -- Distance updater RunService.RenderStepped:Connect(function() if not espEnabled then return end local char = lp.Character local hrp = char and char:FindFirstChild("HumanoidRootPart") if not hrp then return end for _, killer in pairs(KillersFolder:GetChildren()) do local billboard = killer:FindFirstChild("ESP_Billboard") if billboard and billboard:FindFirstChild("ESP_Text") and killer:FindFirstChild("HumanoidRootPart") then local dist = (killer.HumanoidRootPart.Position - hrp.Position).Magnitude billboard.ESP_Text.Text = string.format("%s\n[%d]", killer.Name, dist) end end end) MiscTab:CreateToggle({ Name = "Killer ESP", CurrentValue = false, Flag = "KillerESP_Toggle", Callback = function(Value) espEnabled = Value refreshESP() end, }) MiscTab:CreateButton({ Name = "Remove Slowness (only the status effect)", Callback = function(Value) game:GetService("ReplicatedStorage").Modules.StatusEffects.Slowness:Destroy() end, }) MiscTab:CreateButton({ Name = "infinite resistence 100% real not fake trust", Callback = function(Value) lp:Kick("u got banned from roblxo permandnenly very real not fake trust %100") end, }) -- Helpers local function fireRemoteBlock() local args = {"UseActorAbility", "Block"} ReplicatedStorage:WaitForChild("Modules"):WaitForChild("Network"):WaitForChild("RemoteEvent"):FireServer(unpack(args)) end local function fireRemotePunch() local args = {"UseActorAbility", "Punch"} ReplicatedStorage:WaitForChild("Modules"):WaitForChild("Network"):WaitForChild("RemoteEvent"):FireServer(unpack(args)) end -- replace existing playCustomAnim with this local function playCustomAnim(animId, isPunch) if not Humanoid then warn("Humanoid missing") return end if not animId or animId == "" then warn("No animation ID provided") return end local now = tick() local lastTime = isPunch and lastPunchTime or lastBlockTime if now - lastTime < 1 then return end -- Stop other known anims (unchanged) for _, track in ipairs(Humanoid:GetPlayingAnimationTracks()) do local animNum = tostring(track.Animation and track.Animation.AnimationId):match("%d+") if table.find(isPunch and punchAnimIds or blockAnimIds, animNum) then pcall(function() track:Stop() end) end end local anim = Instance.new("Animation") anim.AnimationId = "rbxassetid://" .. animId local success, track = pcall(function() return Humanoid:LoadAnimation(anim) end) if success and track then print("✅ Playing custom " .. (isPunch and "punch" or "block") .. " animation:", animId) track:Play() -- record last-play time (keeps original behavior) if isPunch then lastPunchTime = now else lastBlockTime = now end -- stop the custom track automatically after X seconds local duration = isPunch and 2.7 or 2.0 -- use task.delay so we don't block; use pcall to avoid runtime errors task.delay(duration, function() pcall(function() if track and track.IsPlaying then track:Stop() end end) end) else warn("❌ Failed to load or play custom animation: " .. tostring(animId)) end end -- Push *into* the killer (drops in for doLegitBlockTP_withVelocity) -- Fling coroutine coroutine.wrap(function() local hrp, c, vel, movel = nil, nil, nil, 0.1 while true do RunService.Heartbeat:Wait() if hiddenfling then while hiddenfling and not (c and c.Parent and hrp and hrp.Parent) do RunService.Heartbeat:Wait() c = lp.Character hrp = c and c:FindFirstChild("HumanoidRootPart") end if hiddenfling then vel = hrp.Velocity hrp.Velocity = vel * flingPower + Vector3.new(0, flingPower, 0) RunService.RenderStepped:Wait() hrp.Velocity = vel RunService.Stepped:Wait() hrp.Velocity = vel + Vector3.new(0, movel, 0) movel = movel * -1 end end end end)() local function sendChatMessage(text) if not text or text:match("^%s*$") then return end local TextChatService = game:GetService("TextChatService") local channel = TextChatService.TextChannels.RBXGeneral channel:SendAsync(text) end -- ===== Robust Sound Auto Block (replace your current Sound Auto Block) ===== local soundHooks = {} -- [Sound] = {playedConn, propConn, destroyConn} local soundBlockedUntil = {} -- [Sound] = timestamp when we can block again (throttle) local function getNearestKillerRoot(maxDist) local killersFolder = workspace:FindFirstChild("Players") and workspace.Players:FindFirstChild("Killers") if not killersFolder then return nil end local myRoot = lp.Character and lp.Character:FindFirstChild("HumanoidRootPart") if not myRoot then return nil end local closest, closestDist = nil, maxDist or math.huge for _, killer in ipairs(killersFolder:GetChildren()) do local hrp = killer:FindFirstChild("HumanoidRootPart") if hrp then local dist = (hrp.Position - myRoot.Position).Magnitude if dist < closestDist then closest, closestDist = hrp, dist end end end return closest end -- place once in outer scope if this runs in a hot loop local string_match = string.match local tostring_local = tostring local function extractNumericSoundId(sound) if not sound then return nil end local sid = sound.SoundId if not sid then return nil end sid = (type(sid) == "string") and sid or tostring_local(sid) -- Prefer explicit "rbxassetid://" pattern (most common), then generic "://digits", then plain digits local num = string_match(sid, "rbxassetid://(%d+)") or string_match(sid, "://(%d+)") or string_match(sid, "^(%d+)$") if num and #num > 0 then return num end -- Fallbacks (kept for completeness) local hash = string_match(sid, "[&%?]hash=([^&]+)") if hash then return "&hash=" .. hash end local path = string_match(sid, "rbxasset://sounds/.+") if path then return path end return nil end -- cache KillersFolder outside the function when possible: local KF = KillersFolder local function getSoundWorldPosition(sound) if not sound then return nil end local parent = sound.Parent if parent then if parent:IsA("BasePart") then return parent.Position, parent end if parent:IsA("Attachment") then local gp = parent.Parent if gp and gp:IsA("BasePart") then return gp.Position, gp end end end -- Only perform deep descendant search if the sound is inside KillersFolder if KF and sound:IsDescendantOf(KF) then -- search descendants of the nearest meaningful root (prefer parent if present) local root = parent or sound local found = root:FindFirstChildWhichIsA("BasePart", true) if found then return found.Position, found end end return nil, nil end local function getCharacterFromDescendant(inst) if not inst then return nil end local model = inst:FindFirstAncestorOfClass("Model") if model and model:FindFirstChildOfClass("Humanoid") then return model end return nil end local function isPointInsidePart(part, point) if not (part and point) then return false end -- convert world point to part-local coordinates and test against half-extents local rel = part.CFrame:PointToObjectSpace(point) local half = part.Size * 0.5 return math.abs(rel.X) <= half.X + 0.001 and math.abs(rel.Y) <= half.Y + 0.001 and math.abs(rel.Z) <= half.Z + 0.001 end -- ===== predictive helpers (paste near top, before attemptBlockForSound) ===== -- keep killerState updated each frame (lightweight) RunService.RenderStepped:Connect(function(dt) if dt <= 0 then return end local killersFolder = workspace:FindFirstChild("Players") and workspace.Players:FindFirstChild("Killers") if not killersFolder then return end for _, killer in ipairs(killersFolder:GetChildren()) do if killer and killer.Parent then local hrp = killer:FindFirstChild("HumanoidRootPart") if hrp then local st = killerState[killer] or { prevPos = hrp.Position, prevLook = hrp.CFrame.LookVector, vel = Vector3.new(), angVel = 0 } -- linear velocity sample & smoothing local newVel = (hrp.Position - st.prevPos) / math.max(dt, 1e-6) st.vel = st.vel and st.vel:Lerp(newVel, SMOOTHING_LERP) or newVel -- angular velocity (radians/sec, signed by left/right) local prevLook = st.prevLook or hrp.CFrame.LookVector local look = hrp.CFrame.LookVector local dot = math.clamp(prevLook:Dot(look), -1, 1) local angle = math.acos(dot) -- 0..pi local crossY = prevLook:Cross(look).Y local angSign = (crossY >= 0) and 1 or -1 local newAngVel = (angle / math.max(dt, 1e-6)) * angSign st.angVel = (st.angVel * (1 - SMOOTHING_LERP)) + (newAngVel * SMOOTHING_LERP) st.prevPos = hrp.Position st.prevLook = look killerState[killer] = st end end end end) -- near top with other locals local _LP = Players.LocalPlayer local _isFacing = isFacing local _fireRemoteBlock = fireRemoteBlock local _fireRemotePunch = fireRemotePunch local _cachedBlockBtn = cachedBlockBtn local _cachedCooldown = cachedCooldown -- these may be updated by refreshUIRefs local _cachedCharges = cachedCharges local LOCAL_BLOCK_COOLDOWN = 0.7 -- optimistic local cooldown (tune as needed) local lastLocalBlockTime = 0 local function tryActivateButton(btn) if not btn then return false end for _, conn in pairs(getconnections(btn.MouseButton1Click)) do conn:Fire() end end -- thx glov -- Replace previous fireRemoteBlock / fireRemotePunch with these: local function fireGuiBlock() local blockAction = "UseActorAbility" local blockData = {buffer.fromstring("\"Block\"")} testRemote:FireServer(blockAction, blockData) end local function fireGuiPunch() local punchAction = "UseActorAbility" local punchData = {buffer.fromstring("\"Punch\"")} testRemote:FireServer(punchAction, punchData) end local function fireGuiCharge() local blockAction = "UseActorAbility" local blockData = {buffer.fromstring("\"Charge\"")} testRemote:FireServer(blockAction, blockData) end local function fireGuiClone() local blockAction = "UseActorAbility" local blockData = {buffer.fromstring("\"Clone\"")} testRemote:FireServer(blockAction, blockData) end local chargeAimActive = false local chargeAimThread = nil local function stopChargeAim() chargeAimActive = false -- thread will exit when it notices the flag; we don't force-kill it end -- Start aiming at nearest killer until the charge animation stops (or fallback timeout) -- fallbackSec is optional (seconds) to stop attempting if no animation is detected. local function startChargeAimUntilChargeEnds(fallbackSec) -- ensure only one thread at a time stopChargeAim() chargeAimActive = true chargeAimThread = task.spawn(function() local startWatch = tick() local fallback = tonumber(fallbackSec) or 1.2 -- try to get humanoid/root/animator local function getCharObjects() local char = lp.Character if not char then return nil, nil, nil end local hum = char:FindFirstChildOfClass("Humanoid") local hrp = char:FindFirstChild("HumanoidRootPart") local animator = char:FindFirstChildOfClass("Animator") return hum, hrp, animator end local humanoid, myRoot, animator = getCharObjects() if humanoid then pcall(function() humanoid.AutoRotate = false end) end local seenChargeAnim = false local watchStart = tick() while chargeAimActive do -- refresh references each loop in case character reloaded humanoid, myRoot, animator = getCharObjects() if not myRoot then break end -- find nearest killer model and its hrp local killerModel = getNearestKillerModel() local targetHRP = (killerModel and killerModel:FindFirstChild("HumanoidRootPart")) or nil if targetHRP then -- predictionValue exists in your script (used by aimPunch). use it for nicer aiming. local pred = (type(predictionValue) == "number") and predictionValue or 0 local predictedPos = targetHRP.Position + (targetHRP.CFrame.LookVector * pred) -- set lookAt while keeping our position pcall(function() myRoot.CFrame = CFrame.lookAt(myRoot.Position, predictedPos) end) end -- check if charge animation is playing (if we can access animator) local stillPlaying = false if animator then local ok, tracks = pcall(function() return animator:GetPlayingAnimationTracks() end) if ok and tracks then for _, track in ipairs(tracks) do local animId = nil pcall(function() animId = tostring(track.Animation and track.Animation.AnimationId or ""):match("%d+") end) if animId and table.find(chargeAnimIds, animId) then stillPlaying = true seenChargeAnim = true break end end end end -- stop conditions: -- 1) we saw a charge anim and now it's gone -> stop if seenChargeAnim and not stillPlaying then break end -- 2) we never saw a charge anim and we've exceeded fallback -> stop if not seenChargeAnim and (tick() - watchStart) > fallback then break end task.wait() end -- restore AutoRotate if humanoid then pcall(function() humanoid.AutoRotate = true end) end chargeAimActive = false end) end -- modify hookSound: store extracted id once -- optimized attemptBlockForSound (accepts optional precomputed id) -- Replace your existing attemptBlockForSound with this improved version -- TUNABLES (put near top of file so you can tweak for high ping) local AUDIO_PREDICT_DT = 0.08 -- seconds to predict forward (increase for high ping) local AUDIO_LOCAL_COOLDOWN = 0.35 -- local throttle between blocks (seconds) local AUDIO_SOUND_THROTTLE = 1.0 -- how long to throttle the same sound (seconds) -- helper: fast squared distance (no sqrt) local function distSq(a, b) local dx = a.X - b.X local dy = a.Y - b.Y local dz = a.Z - b.Z return dx*dx + dy*dy + dz*dz end local _getSoundWorldPosition = getSoundWorldPosition -- shared heavy work helper (local to file/scope) local function _attemptForSound(sound, idParam, mode) -- quick guards (keep same order) if not autoBlockAudioOn then return end if not sound or not sound:IsA("Sound") then return end if not sound.IsPlaying then return end -- hot locals local now = tick() local hooks = soundHooks local hook = hooks and hooks[sound] -- id resolution (prefer cached) local id = idParam or (hook and hook.id) or extractNumericSoundId(sound) if not id or not autoBlockTriggerSounds[id] then return end -- per-sound throttle if soundBlockedUntil[sound] and now < soundBlockedUntil[sound] then return end -- global local cooldown if now - lastLocalBlockTime < AUDIO_LOCAL_COOLDOWN then return end -- ensure UI refs depending on mode (preserve original checks) if mode == "Block" or mode == "Charge" then if not cachedBlockBtn or not cachedCooldown or not cachedCharges then refreshUIRefs() end elseif mode == "Clone" then if not cachedCloneBtn then refreshUIRefs() end end -- local player root local lpLocal = _LP or Players.LocalPlayer local myChar = lpLocal and lpLocal.Character local myRoot = myChar and myChar:FindFirstChild("HumanoidRootPart") if not myRoot then return end -- cached hook mapping (may be nil) local char = hook and hook.char local hrp = hook and hook.hrp if not hrp then -- expensive path: only when cache missing local soundPos, soundPart = getSoundWorldPosition(sound) if not soundPart then return end char = getCharacterFromDescendant(soundPart) hrp = char and char:FindFirstChild("HumanoidRootPart") -- cache mapping for next time if hook then hook.char = char hook.hrp = hrp else soundHooks[sound] = { id = id, char = char, hrp = hrp } hook = soundHooks[sound] end end if not hrp then return end -- predicted position using velocity (unrolled for speed) local v = hrp.Velocity or Vector3.new() local predictedX = hrp.Position.X + v.X * AUDIO_PREDICT_DT local predictedY = hrp.Position.Y + v.Y * AUDIO_PREDICT_DT local predictedZ = hrp.Position.Z + v.Z * AUDIO_PREDICT_DT local dx = predictedX - myRoot.Position.X local dy = predictedY - myRoot.Position.Y local dz = predictedZ - myRoot.Position.Z local distSqPred = dx*dx + dy*dy + dz*dz -- detection range check (preserve grace fallback logic) if detectionRangeSq and distSqPred > detectionRangeSq then local dx2 = hrp.Position.X - myRoot.Position.X local dy2 = hrp.Position.Y - myRoot.Position.Y local dz2 = hrp.Position.Z - myRoot.Position.Z local distSqNow = dx2*dx2 + dy2*dy2 + dz2*dz2 local grace = (detectionRange + 3) * (detectionRange + 3) if distSqNow > grace then return end end -- verify sound world position (kept as in original) local soundPos, soundPart = _getSoundWorldPosition(sound) if not soundPart then return end -- climb to Model & validate humanoid local model = soundPart and soundPart:FindFirstAncestorOfClass("Model") or nil if not model then return end local humanoid = model:FindFirstChildWhichIsA("Humanoid") if not humanoid then return end local plr = Players:GetPlayerFromCharacter(model) if not plr or plr == lp then return end -- facing check (cached _isFacing) if facingCheckEnabled and not _isFacing(myRoot, hrp) then return end task.wait(blockdelay) -- mode-specific extra checks & actions (preserve prints and exact calls) if mode == "Block" then if cachedCooldown and cachedCooldown.Text == "" then print("yay") else return end fireGuiBlock() if doubleblocktech == true then fireGuiPunch() end elseif mode == "Charge" then if cachedChargeBtn and cachedChargeBtn:FindFirstChild("CooldownTime") and cachedChargeBtn.CooldownTime.Text == "" then print("yay") else return end fireGuiCharge() startChargeAimUntilChargeEnds(0.4) elseif mode == "Clone" then if cachedCloneBtn and cachedCloneBtn:FindFirstChild("CooldownTime") and cachedCloneBtn.CooldownTime.Text == "" then print("yay") else return end fireGuiClone() startChargeAimUntilChargeEnds(0.4) end -- optimistic local timestamp & throttle this sound (identical) lastLocalBlockTime = now soundBlockedUntil[sound] = now + AUDIO_SOUND_THROTTLE end -- public wrappers to preserve original names/behavior local function attemptBlockForSound(sound, idParam) return _attemptForSound(sound, idParam, "Block") end local function attemptChargeForSound(sound, idParam) return _attemptForSound(sound, idParam, "Charge") end local function attemptCloneForSound(sound, idParam) return _attemptForSound(sound, idParam, "Clone") end -- Improved hookSound: cache id and keep placeholder for hrp/char (so attemptBlock hot-path reads cached data) local function attemptBDParts(sound) if not autoBlockAudioOn then return end if not sound or not sound:IsA("Sound") then return end if not sound.IsPlaying then return end local id = extractNumericSoundId(sound) if not id or not autoBlockTriggerSounds[id] then return end local t = tick() if soundBlockedUntil[sound] and t < soundBlockedUntil[sound] then return end local lp = Players.LocalPlayer local myChar = lp and lp.Character local myRoot = myChar and myChar:FindFirstChild("HumanoidRootPart") if not myRoot then return end local soundPos, soundPart = getSoundWorldPosition(sound) if not soundPos or not soundPart then return end local char = getCharacterFromDescendant(soundPart) local plr = char and Players:GetPlayerFromCharacter(char) if not plr or plr == lp then return end local hrp = char:FindFirstChild("HumanoidRootPart") if not hrp then return end local Debris = game:GetService("Debris") if antiFlickOn then local basePartSize = Vector3.new(5.5, 7.5, 8.5) -- original / default size local partSize = basePartSize * (blockPartsSizeMultiplier or 1) local count = math.max(1, antiFlickParts or 4) local base = antiFlickBaseOffset or 2.5 local step = antiFlickOffsetStep or 0.2 local lifeTime = 0.2 task.spawn(function() local blocked = false task.wait(antiFlickDelay or 0) for i = 1, count do if not hrp or not myRoot then break end local dist = base + (i - 1) * step local st = killerState[char] or { vel = hrp.Velocity or Vector3.new(), angVel = 0 } local vel = st.vel or hrp.Velocity or Vector3.new() local forwardSpeed = vel:Dot(hrp.CFrame.LookVector) local lateralSpeed = vel:Dot(hrp.CFrame.RightVector) -- separate multipliers local pStrength = (type(predictionStrength) == "number" and predictionStrength) or 1 local pTurn = (type(predictionTurnStrength) == "number" and predictionTurnStrength) or 1 -- raw predicted displacements local forwardPredictRaw = forwardSpeed * PRED_SECONDS_FORWARD * pStrength local lateralPredictRaw = lateralSpeed * PRED_SECONDS_LATERAL * pStrength local turnLateralRaw = st.angVel * ANG_TURN_MULTIPLIER * pTurn -- clamps (scaled separately) local forwardClamp = PRED_MAX_FORWARD * pStrength local lateralClamp = PRED_MAX_LATERAL * pStrength local turnClamp = PRED_MAX_LATERAL * pTurn local forwardPredict = math.clamp(forwardPredictRaw, -forwardClamp, forwardClamp) local lateralPredict = math.clamp(lateralPredictRaw, -lateralClamp, lateralClamp) local turnLateral = math.clamp(turnLateralRaw, -turnClamp, turnClamp) local forwardDist = dist + forwardPredict local spawnPos = hrp.Position + hrp.CFrame.LookVector * forwardDist + hrp.CFrame.RightVector * (lateralPredict + turnLateral) local part = Instance.new("Part") part.Name = "AntiFlickZone" part.Size = partSize part.Transparency = 0.45 part.Anchored = true part.CanCollide = false part.CFrame = CFrame.new(spawnPos, hrp.Position) part.BrickColor = BrickColor.new("Bright blue") part.Parent = workspace Debris:AddItem(part, lifeTime) if isPointInsidePart(part, myRoot.Position) then blocked = true else local touching = {} pcall(function() touching = myRoot:GetTouchingParts() end) for _, p in ipairs(touching) do if p == part then blocked = true break end end end if blocked then if not (facingCheckEnabled and not isFacing(myRoot, hrp)) then if autoblocktype == "Block" then fireGuiBlock() elseif autoblocktype == "Charge" then fireGuiCharge() elseif autoblocktype == "7n7 Clone" then fireGuiClone() end soundBlockedUntil[sound] = t + 1.2 end break end if stagger and stagger > 0 then task.wait(stagger) else task.wait(0) end end end) return end end local function hookSound(sound) if not sound or not sound:IsA("Sound") then return end if soundHooks[sound] then return end local preId = extractNumericSoundId(sound) -- create entry with id; hrp/char may be nil initially and will be cached later soundHooks[sound] = { id = preId, hrp = nil, char = nil } -- helper: centralize the logic so behaviour remains identical but without duplication local function handleAttempt(snd, id) if not autoBlockAudioOn then return end if not antiFlickOn then local at = autoblocktype if at == "Block" then attemptBlockForSound(snd, id) elseif at == "Charge" then attemptChargeForSound(snd, id) elseif at == "7n7 Clone" then attemptCloneForSound(snd, id) end else attemptBDParts(snd, id) end end -- connections local playedConn = sound.Played:Connect(function() handleAttempt(sound, preId) end) local propConn = sound:GetPropertyChangedSignal("IsPlaying"):Connect(function() if sound.IsPlaying then handleAttempt(sound, preId) end end) local destroyConn destroyConn = sound.Destroying:Connect(function() if playedConn and playedConn.Connected then playedConn:Disconnect() end if propConn and propConn.Connected then propConn:Disconnect() end if destroyConn and destroyConn.Connected then destroyConn:Disconnect() end soundHooks[sound] = nil soundBlockedUntil[sound] = nil end) -- store connections & metadata in hook table for later cleanup if you want (optional) soundHooks[sound].playedConn = playedConn soundHooks[sound].propConn = propConn soundHooks[sound].destroyConn = destroyConn -- If currently playing, handle immediately (cheap) if sound.IsPlaying then handleAttempt(sound, preId) end end -- Hook existing Sounds across the game (covers workspace, SoundService, Lighting, etc.) for _, desc in ipairs(KillersFolder:GetDescendants()) do if desc:IsA("Sound") then hookSound(desc) end end -- Hook any future Sounds KillersFolder.DescendantAdded:Connect(function(desc) if desc:IsA("Sound") then hookSound(desc) end end) -- ===== End Robust Sound Auto Block ===== -- Utility to safely get a killer HRP local function getKillerHRP(killerModel) if not killerModel then return nil end if killerModel:FindFirstChild("HumanoidRootPart") then return killerModel:FindFirstChild("HumanoidRootPart") end if killerModel.PrimaryPart then return killerModel.PrimaryPart end -- try finding any basepart descendant return killerModel:FindFirstChildWhichIsA("BasePart", true) end local function beginDragIntoKiller(killerModel) -- Basic guards if _hitboxDraggingDebounce then return end if not killerModel or not killerModel.Parent then return end local char = lp and lp.Character if not char then return end local hrp = char:FindFirstChild("HumanoidRootPart") local humanoid = char:FindFirstChildOfClass("Humanoid") if not hrp or not humanoid then return end local targetHRP = getKillerHRP(killerModel) if not targetHRP then warn("beginDragIntoKiller: killer has no HRP/PrimaryPart") return end _hitboxDraggingDebounce = true -- save old locomotion state so we can restore it local oldWalk = humanoid.WalkSpeed local oldJump = humanoid.JumpPower local oldPlatformStand = humanoid.PlatformStand -- block normal movement by zeroing walk/jump (works for mobile joystick too) humanoid.WalkSpeed = 0 humanoid.JumpPower = 0 humanoid.PlatformStand = false -- keep physics normal so BodyVelocity works -- create BodyVelocity to push the HRP toward the killer smoothly local bv = Instance.new("BodyVelocity") bv.MaxForce = Vector3.new(1e5, 0, 1e5) -- allow horizontal movement, keep y free bv.Velocity = Vector3.new(0,0,0) bv.Parent = hrp -- optional: lightly damp vertical to avoid sudden pops (leave Y alone to respect gravity) local conn conn = RunService.Heartbeat:Connect(function(dt) if not _hitboxDraggingDebounce then conn:Disconnect() if bv and bv.Parent then pcall(function() bv:Destroy() end) end humanoid.WalkSpeed = oldWalk humanoid.JumpPower = oldJump humanoid.PlatformStand = oldPlatformStand return end -- abort if character/killer removed if not (char and char.Parent) or not (killerModel and killerModel.Parent) then _hitboxDraggingDebounce = false return end -- refresh target HRP (killer may respawn) targetHRP = getKillerHRP(killerModel) if not targetHRP then _hitboxDraggingDebounce = false return end -- compute desired horizontal velocity toward the target local toTarget = (targetHRP.Position - hrp.Position) local dist = toTarget.Magnitude -- desired speed: based on distance but clamped so it feels natural local horiz = Vector3.new(toTarget.X, 0, toTarget.Z) if horiz.Magnitude > 0.01 then local dir = horiz.Unit bv.Velocity = Vector3.new(dir.X * Dspeed, bv.Velocity.Y, dir.Z * Dspeed) else bv.Velocity = Vector3.new(0, bv.Velocity.Y, 0) end -- stop condition: when very close to killer (adjust threshold as needed) local stopDist = 2.0 if dist <= stopDist then _hitboxDraggingDebounce = false -- cleanup will happen in next loop tick end end) -- final cleanup safety (timeout) task.delay(0.4, function() if _hitboxDraggingDebounce then _hitboxDraggingDebounce = false end end) end -- Example call: -- beginDragIntoKiller(someKillerModel) -- Watch for local block animations starting and trigger drag RunService.RenderStepped:Connect(function() if not hitboxDraggingTech then return end if not cachedAnimator then refreshAnimator() end local animator = cachedAnimator if not animator then return end for _, track in ipairs(animator:GetPlayingAnimationTracks()) do local ok, animId = pcall(function() local a = track.Animation return a and tostring(a.AnimationId):match("%d+") end) if ok and animId and table.find(blockAnimIds, animId) then -- only trigger once when it starts (timepos ~ 0) local timePos = 0 pcall(function() timePos = track.TimePosition or 0 end) if timePos <= 0.12 then local nearest = getNearestKillerModel() if nearest then -- spawn so we don't block the RenderStepped loop task.wait(Ddelay) task.spawn(function() beginDragIntoKiller(nearest) end) startChargeAimUntilChargeEnds(0.4) end end end end end) -- If Better Detection (antiFlickOn) is enabled, watch for blue AntiFlickZone parts near the player -- and trigger dragging when they appear in range. task.spawn(function() if not cachedBlockBtn or not cachedCooldown or not cachedCharges then refreshUIRefs() end if cachedBlockBtn and cachedBlockBtn:FindFirstChild("CooldownTime") and cachedBlockBtn.CooldownTime.Text == "" then print("yay") else return end while true do RunService.Heartbeat:Wait() if not (hitboxDraggingTech and antiFlickOn) then task.wait(0.15) continue end local char = lp.Character local myRoot = char and char:FindFirstChild("HumanoidRootPart") if not myRoot then task.wait(0.15) continue end -- look for parts named "AntiFlickZone" inside radius (fast and simple) local found = nil for _, part in ipairs(workspace:GetDescendants()) do if not part:IsA("BasePart") then continue end if part.Name ~= "AntiFlickZone" then continue end if (part.Position - myRoot.Position).Magnitude <= HITBOX_DETECT_RADIUS then found = part break end end if found and not _hitboxDraggingDebounce then local nearest = getNearestKillerModel() if nearest then task.wait(Ddelay) task.spawn(function() beginDragIntoKiller(nearest) end) startChargeAimUntilChargeEnds(0.4) end end task.wait(0.12) -- throttle checks end end) -- double-punch tech detection -- Replacement double-punch detection (safer + debounced) local _REFRESH_UI_IF_NIL = true local TRACK_DEBOUNCE = 0.45 -- seconds to avoid retriggering same track local START_WINDOW = 0 -- consider a track "starting" if TimePosition <= START_WINDOW local trackLastTriggered = setmetatable({}, { __mode = "k" }) -- weak keys (AnimationTrack -> last tick) -- Play a custom charge animation and stop it when LP touches a non-player part or after 4s local function playCustomChargeWithAutoStop(animId) if not lp or not lp.Character then return end local char = lp.Character local hum = char:FindFirstChildOfClass("Humanoid") local hrp = char:FindFirstChild("HumanoidRootPart") if not hum or not hrp then return end -- get or create Animator local animator = hum:FindFirstChildOfClass("Animator") or Instance.new("Animator", hum) local anim = Instance.new("Animation") anim.AnimationId = "rbxassetid://" .. tostring(animId) local ok, track = pcall(function() return animator:LoadAnimation(anim) end) if not ok or not track then warn("Failed to load charge animation:", animId) return end track:Play() local stopped = false local touchConn local timeoutConn -- stop function (safe, idempotent) local function stopTrack() if stopped then return end stopped = true pcall(function() track:Stop() end) if touchConn and touchConn.Connected then pcall(function() touchConn:Disconnect() end) end if timeoutConn and timeoutConn.Connected then pcall(function() timeoutConn:Disconnect() end) end end -- stop when HRP touches a part that's not part of our character touchConn = hrp.Touched:Connect(function(part) if stopped then return end if not part then return end if part:IsDescendantOf(char) then return end -- ignore touching own character parts -- optional: ignore other players' characters if you want; here we treat anything not part of our char as "wall" stopTrack() end) -- timeout after 4 seconds (hard stop) timeoutConn = nil task.spawn(function() local start = tick() while not stopped and (tick() - start) < 4 do task.wait(0.05) end if not stopped then stopTrack() end end) -- try to clean up if the track stops normally (AnimationTrack may have Stopped event) pcall(function() if track.Stopped then track.Stopped:Connect(stopTrack) end end) end local lastReplaceTime = { block = 0, punch = 0, charge = 0, } task.spawn(function() while true do RunService.Heartbeat:Wait() local char = lp.Character if not char then continue end local humanoid = char:FindFirstChildOfClass("Humanoid") local animator = humanoid and humanoid:FindFirstChildOfClass("Animator") if not animator then continue end for _, track in ipairs(animator:GetPlayingAnimationTracks()) do local animId = tostring(track.Animation.AnimationId):match("%d+") -- Block animation replacement if customBlockEnabled and customBlockAnimId ~= "" and table.find(blockAnimIds, animId) then if animId == tostring(customBlockAnimId) then continue -- already custom anim end if tick() - lastReplaceTime.block >= 3 then lastReplaceTime.block = tick() track:Stop() local newAnim = Instance.new("Animation") newAnim.AnimationId = "rbxassetid://" .. customBlockAnimId local newTrack = animator:LoadAnimation(newAnim) newTrack:Play() -- auto-stop after 2.7 seconds (safe) task.delay(customblockdelay, function() pcall(function() if newTrack and newTrack.IsPlaying then newTrack:Stop() end end) end) break end end -- Punch animation replacement if customPunchEnabled and customPunchAnimId ~= "" and table.find(punchAnimIds, animId) then if animId == tostring(customPunchAnimId) then continue -- already custom anim end if tick() - lastReplaceTime.punch >= 3 then lastReplaceTime.punch = tick() track:Stop() -- with this patch: local newAnim = Instance.new("Animation") newAnim.AnimationId = "rbxassetid://" .. customPunchAnimId local newTrack = animator:LoadAnimation(newAnim) newTrack:Play() -- auto-stop after 2.7 seconds (safe) task.delay(custompunchdelay, function() pcall(function() if newTrack and newTrack.IsPlaying then newTrack:Stop() end end) end) break end end -- Charge animation replacement if customChargeEnabled and customChargeAnimId ~= "" and table.find(chargeAnimIds, animId) then if animId == tostring(customChargeAnimId) then continue -- already custom anim end if tick() - lastReplaceTime.charge >= 3 then lastReplaceTime.charge = tick() track:Stop() local newAnim = Instance.new("Animation") newAnim.AnimationId = "rbxassetid://" .. customChargeAnimId -- Instead of directly playing the custom track, use the helper so it auto-stops on touch or after 4s playCustomChargeWithAutoStop(customChargeAnimId) break end end end end end) -- Auto block + punch detection loop RunService.RenderStepped:Connect(function() local gui = PlayerGui:FindFirstChild("MainUI") local punchBtn = gui and gui:FindFirstChild("AbilityContainer") and gui.AbilityContainer:FindFirstChild("Punch") local charges = punchBtn and punchBtn:FindFirstChild("Charges") local blockBtn = gui and gui:FindFirstChild("AbilityContainer") and gui.AbilityContainer:FindFirstChild("Block") local cooldown = blockBtn and blockBtn:FindFirstChild("CooldownTime") local myChar = lp.Character if not myChar then return end local myRoot = myChar:FindFirstChild("HumanoidRootPart") Humanoid = myChar:FindFirstChildOfClass("Humanoid") -- Auto Block: Trigger block if a valid animation is played by a killer for _, plr in ipairs(Players:GetPlayers()) do if plr ~= lp and plr.Character then local hrp = plr.Character:FindFirstChild("HumanoidRootPart") local hum = plr.Character:FindFirstChildOfClass("Humanoid") local animTracks = hum and hum:FindFirstChildOfClass("Animator") and hum:FindFirstChildOfClass("Animator"):GetPlayingAnimationTracks() if hrp and myRoot and (hrp.Position - myRoot.Position).Magnitude <= detectionRange then for _, track in ipairs(animTracks or {}) do local id = tostring(track.Animation.AnimationId):match("%d+") if table.find(autoBlockTriggerAnims, id) then if autoBlockOn and (hrp.Position - myRoot.Position).Magnitude <= detectionRange then if isFacing(myRoot, hrp) then if cooldown and cooldown.Text == "" then fireRemoteBlock() end if doubleblocktech == true and charges and charges.Text == "1" then fireRemotePunch() end end end end end end end end -- Detect if player is playing a block animation, and blockTP is enabled -- Predictive Auto Block: Check killer range and time if predictiveBlockOn and tick() > predictiveCooldown then local killersFolder = workspace:FindFirstChild("Players") and workspace.Players:FindFirstChild("Killers") local myChar = lp.Character local myHRP = myChar and myChar:FindFirstChild("HumanoidRootPart") local myHum = myChar and myChar:FindFirstChild("Humanoid") if killersFolder and myHRP and myHum then local killerInRange = false for _, killer in ipairs(killersFolder:GetChildren()) do local hrp = killer:FindFirstChild("HumanoidRootPart") if hrp then local dist = (myHRP.Position - hrp.Position).Magnitude if dist <= detectionRange then killerInRange = true break end end end -- Handle killer entering range if killerInRange then if not killerInRangeSince then killerInRangeSince = tick() -- Start the timer when the killer enters the range elseif tick() - killerInRangeSince >= edgeKillerDelay then -- Block if the killer has stayed in range long enough fireRemoteBlock() predictiveCooldown = tick() + 2 -- Set cooldown to avoid blocking too quickly again killerInRangeSince = nil -- Reset the timer end else killerInRangeSince = nil -- Reset timer if the killer leaves range end end end local myChar = lp.Character local myRoot = myChar and myChar:FindFirstChild("HumanoidRootPart") -- Auto Punch if autoPunchOn then if charges and charges.Text == "1" then for _, name in ipairs(killerNames) do local killer = workspace:FindFirstChild("Players") and workspace.Players:FindFirstChild("Killers") and workspace.Players.Killers:FindFirstChild(name) if killer and killer:FindFirstChild("HumanoidRootPart") then local root = killer.HumanoidRootPart if root and myRoot and (root.Position - myRoot.Position).Magnitude <= 10 then -- Trigger punch GUI button fireGuiPunch() -- Fling Punch: Constant TP 2 studs in front of killer for 1 second if flingPunchOn then hiddenfling = true local targetHRP = root task.spawn(function() local start = tick() while tick() - start < 1 do if lp.Character and lp.Character:FindFirstChild("HumanoidRootPart") and targetHRP and targetHRP.Parent then local frontPos = targetHRP.Position + (targetHRP.CFrame.LookVector * 2) lp.Character.HumanoidRootPart.CFrame = CFrame.new(frontPos, targetHRP.Position) end task.wait() end hiddenfling = false end) end -- Play custom punch animation if enabled if customPunchEnabled and customPunchAnimId ~= "" then playCustomAnim(customPunchAnimId, true) end break -- Only punch one killer per frame end end end end end -- === Message-When-Punching: send once per animation start === do local myChar = lp.Character local hum = myChar and myChar:FindFirstChildOfClass("Humanoid") local animator = cachedAnimator local currentPlaying = {} -- map animId -> true for tracks playing this frame if not animator then refreshAnimator() animator = cachedAnimator end if animator then local ok, tracks = pcall(function() return animator:GetPlayingAnimationTracks() end) if ok and tracks then for _, track in ipairs(tracks) do local animId pcall(function() animId = tostring(track.Animation and track.Animation.AnimationId or ""):match("%d+") end) if animId and table.find(punchAnimIds, animId) then currentPlaying[animId] = true -- if it wasn't playing last frame, it's a newly-started punch animation if not _punchPrevPlaying[animId] then if messageWhenAutoPunchOn and messageWhenAutoPunch and tostring(messageWhenAutoPunch):match("%S") and (tick() - _lastPunchMessageTime) > MESSAGE_PUNCH_COOLDOWN then pcall(function() sendChatMessage(messageWhenAutoPunch) end) _lastPunchMessageTime = tick() end end end end end end -- replace prev state with current state (garbage-collected) _punchPrevPlaying = currentPlaying end do local myChar = lp.Character local hum = myChar and myChar:FindFirstChildOfClass("Humanoid") local animator = cachedAnimator local currentPlaying = {} -- map animId -> true for tracks playing this frame if not animator then refreshAnimator() animator = cachedAnimator end if animator then local ok, tracks = pcall(function() return animator:GetPlayingAnimationTracks() end) if ok and tracks then for _, track in ipairs(tracks) do local animId pcall(function() animId = tostring(track.Animation and track.Animation.AnimationId or ""):match("%d+") end) if animId and table.find(blockAnimIds, animId) then currentPlaying[animId] = true -- if it wasn't playing last frame, it's a newly-started punch animation if not _blockPrevPlaying[animId] then if messageWhenAutoBlockOn and messageWhenAutoBlock and tostring(messageWhenAutoBlock):match("%S") and (tick() - _lastBlockMessageTime) > MESSAGE_BLOCK_COOLDOWN then pcall(function() sendChatMessage(messageWhenAutoBlock) end) _lastBlockMessageTime = tick() end end end end end end -- replace prev state with current state (garbage-collected) _blockPrevPlaying = currentPlaying end -- === end message-when-punching === if aimPunch then if not cachedAnimator then refreshAnimator() end local animator = cachedAnimator if animator and myRoot and myChar then for _, name in ipairs(killerNames) do local killer = workspace:FindFirstChild("Players") and workspace.Players:FindFirstChild("Killers") and workspace.Players.Killers:FindFirstChild(name) if killer and killer:FindFirstChild("HumanoidRootPart") then local root = killer.HumanoidRootPart for _, track in ipairs(animator:GetPlayingAnimationTracks()) do -- guard: want only punch tracks (vanilla or custom) local animId = tostring(track.Animation.AnimationId):match("%d+") if table.find(punchAnimIds, animId) then -- Avoid retriggering for the same AnimationTrack within cooldown local last = lastAimTrigger[track] if last and tick() - last < AIM_COOLDOWN then -- already triggered recently for this track -> skip else -- Only trigger when the track is just starting (helps avoid mid/late triggers) local timePos = 0 pcall(function() timePos = track.TimePosition or 0 end) -- safe read if timePos <= 0.1 then -- Lock it so we don't retrigger lastAimTrigger[track] = tick() -- Disable autoroate once and aim for AIM_WINDOW seconds local humanoid = myChar:FindFirstChild("Humanoid") if humanoid then humanoid.AutoRotate = false end task.spawn(function() local start = tick() while tick() - start < AIM_WINDOW do if myRoot and root and root.Parent then local predictedPos = root.Position + (root.CFrame.LookVector * predictionValue) myRoot.CFrame = CFrame.lookAt(myRoot.Position, predictedPos) end task.wait() end -- restore if humanoid then humanoid.AutoRotate = true end -- cleanup: allow retrigger later task.delay(AIM_COOLDOWN - AIM_WINDOW, function() lastAimTrigger[track] = nil end) end) end end end end end end end end end) Rayfield:LoadConfiguration()