local Players = game:GetService("Players") local Workspace = game:GetService("Workspace") local Player = Players.LocalPlayer local Effects = Workspace:WaitForChild("Effects") local TARGET_NAME = "HalloweenDoor" local CHECK_INTERVAL = 0.15 local ACTIVATE_DISTANCE_SQ = 10 * 10 local FIRE_COOLDOWN = 0.1 local HOLD_DURATION = 0 local ESP_COLOR = Color3.fromRGB(255, 190, 120) local ESP_NAME = "HalloweenDoor_ESP" local canFire = typeof(fireproximityprompt) == "function" local doors = {} -- [door] = {highlight = Highlight, prompts = {[prompt] = true}} local lastFire = setmetatable({}, { __mode = "k" }) local function fixPrompt(prompt) pcall(function() prompt.ClickablePrompt = true prompt.Enabled = true prompt.HoldDuration = HOLD_DURATION prompt.MaxActivationDistance = 12 end) end local function addPrompt(data, prompt) if data.prompts[prompt] then return end data.prompts[prompt] = true fixPrompt(prompt) end local function trackDoor(door) if doors[door] then return end local highlight = Instance.new("Highlight") highlight.Name = ESP_NAME highlight.Adornee = door highlight.FillColor = ESP_COLOR highlight.OutlineColor = ESP_COLOR highlight.FillTransparency = 0.65 highlight.OutlineTransparency = 0 highlight.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop highlight.Parent = door local data = { highlight = highlight, prompts = {} } doors[door] = data if door:IsA("ProximityPrompt") then addPrompt(data, door) end for _, obj in ipairs(door:GetDescendants()) do if obj:IsA("ProximityPrompt") then addPrompt(data, obj) end end -- Prompt sinh thêm về sau door.DescendantAdded:Connect(function(obj) if obj:IsA("ProximityPrompt") then addPrompt(data, obj) end end) end local function untrackDoor(door) local data = doors[door] if data then data.highlight:Destroy() doors[door] = nil end end -- Quét 1 lần lúc đầu, sau đó chỉ nghe sự kiện for _, obj in ipairs(Effects:GetDescendants()) do if obj.Name == TARGET_NAME then trackDoor(obj) end end Effects.DescendantAdded:Connect(function(obj) if obj.Name == TARGET_NAME then trackDoor(obj) end end) Effects.DescendantRemoving:Connect(function(obj) if doors[obj] then untrackDoor(obj) end end) local function getPromptPosition(prompt) local parent = prompt.Parent if parent then if parent:IsA("Attachment") then return parent.WorldPosition elseif parent:IsA("BasePart") then return parent.Position end end end task.spawn(function() while true do local character = Player.Character local root = character and character:FindFirstChild("HumanoidRootPart") if root and canFire then local rootPos = root.Position local now = os.clock() for _, data in pairs(doors) do for prompt in pairs(data.prompts) do if not prompt.Parent then data.prompts[prompt] = nil elseif prompt.Enabled and now - (lastFire[prompt] or 0) >= FIRE_COOLDOWN then local pos = getPromptPosition(prompt) if pos then local d = rootPos - pos if d:Dot(d) <= ACTIVATE_DISTANCE_SQ then lastFire[prompt] = now pcall(fireproximityprompt, prompt) end end end end end end task.wait(CHECK_INTERVAL) end end)