local gui = script.Parent local text = gui.TextBackground.Text local op1 = gui.TextBackground.Option1 local op2 = gui.TextBackground.Option2 local headPic = gui.TextBackground.HeadPicture local range = 7 local npcName = gui.TextBackground.NPCName local plr = game.Players.LocalPlayer local NPCs = {} for i, descendant in pairs(workspace:GetDescendants()) do if descendant:FindFirstChild("Dialogue") then table.insert(NPCs, descendant) descendant.Head.InteractGui.Interact.Size = UDim2.new(0, 0, 0, 0) end end local closestNPC = script:WaitForChild("nil") local previousClosestNPC = closestNPC game:GetService("RunService").RenderStepped:Connect(function() previousClosestNPC = closestNPC closestNPC = script:WaitForChild("nil") local NPCsInRange = {} for i, NPC in pairs(NPCs) do local distance = plr:DistanceFromCharacter(NPC.HumanoidRootPart.Position) if distance <= range then table.insert(NPCsInRange, NPC) end end for i, NPCInRange in pairs(NPCsInRange) do if not closestNPC then closestNPC = NPCInRange end if closestNPC.Name == "nil" or plr:DistanceFromCharacter(closestNPC.HumanoidRootPart.Position) > plr:DistanceFromCharacter(NPCInRange.HumanoidRootPart.Position) then closestNPC = NPCInRange end end script:WaitForChild("ClosestNPC").Value = closestNPC end) script:WaitForChild("ClosestNPC"):GetPropertyChangedSignal("Value"):Connect(function() if closestNPC.Name == "nil" then for i, NPC in pairs(NPCs) do NPC.Head.InteractGui.Interact:TweenSize(UDim2.new(0, 0, 0, 0), "InOut", "Quint", 0.3, true) end gui.TextBackground:TweenPosition(UDim2.new(0.5, 0, 1 + gui.TextBackground.Size.Y.Scale, 0), "InOut", "Quint", 0.3, true) else if previousClosestNPC and previousClosestNPC.Name ~= "nil" then previousClosestNPC.Head.InteractGui.Interact:TweenSize(UDim2.new(0, 0, 0, 0), "InOut", "Quint", 0.3, true) end closestNPC.Head.InteractGui.Interact:TweenSize(UDim2.new(1, 0, 1, 0), "InOut", "Quint", 0.3, true) previousClosestNPC = closestNPC end end) local function handleChoice(interactVal, option) local character = plr.Character or plr.CharacterAdded:Wait() local debounce = false if string.find(interactVal, 'H2Restaurant') and debounce == false then print('went thru rest') if option == 1 then debounce = true plr.PlayerGui.FoodShop.Frame.Visible = true end elseif string.find(interactVal, 'H2Accessories') and debounce == false then print('went thru acess') if option == 1 then debounce = true plr.PlayerGui.AccessShop.Frame.Visible = true end end gui.TextBackground:TweenPosition(UDim2.new(0.5, 0, 1 + gui.TextBackground.Size.Y.Scale, 0), "InOut", "Quint", 0.3, true) end local uis = game:GetService("UserInputService") uis.InputBegan:Connect(function(inp, processed) if processed or not closestNPC then return end if inp.KeyCode == Enum.KeyCode.E then local interactValue = closestNPC.Dialogue.Value local npcImage = closestNPC:FindFirstChild('ImageLabel') headPic.Image = npcImage.Image npcName.Text = closestNPC.Name op1.OptionText.Text = closestNPC.Option1.Value op2.OptionText.Text = closestNPC.Option2.Value text.Text = "" gui.TextBackground:TweenPosition(UDim2.new(0.5, 0, 0.866, 0), "InOut", "Quint", 0.3, true) wait(0.3) op1.MouseButton1Click:Connect(function() handleChoice(interactValue, 1) end) op2.MouseButton1Click:Connect(function() handleChoice(interactValue, 2) end) for i = 1, #interactValue do text.Text = string.sub(interactValue, 1, i) wait() end end end)
An NPC needs a option1, option2, and and dialogue. Whenever I go to a NPC, it works fine, but the moment I go to another, it gives both of their things at the same time. I really don't know what the problem is. Please help? Thank you!