key bind script (in starter gui, with image button, (in image button there is uiaspectratioconstraint, local script, and two text labels)) key bind is in local script:
local UIS = game:GetService("UserInputService") -- Service used to get the key pressed by a player UIS.InputBegan:connect(function(input,gameProcessed) if input.UserInputType == Enum.UserInputType.Keyboard then -- Checks if the player uses a Keyboard if input.KeyCode == Enum.KeyCode.E then -- Checks if the player pressed the "E" key if UIS:GetFocusedTextBox() == nil then -- Checks if the player is typing on a textbox like the chat... If not then... for i,v in pairs(game.Workspace.NPCS:GetChildren()) do -- Finds all the children from the folder. In this case it will find all the NPCs local mag = (v.Torso.Position-game.Players.LocalPlayer.Character.HumanoidRootPart.Position).magnitude -- Makes a variable for the position between the character and the npc. if mag <= 10 then -- If the magnitude is less than or equal to 10 studs then --Effect XD for i = 1,0.6,-0.05 do wait() script.Parent.ImageColor3 = Color3.new(i,i,i) end wait() for i = 0.6,1,0.05 do wait() script.Parent.ImageColor3 = Color3.new(i,i,i) end --This effect is like when you pressed a button it will darken. v.NPCTalk:FireServer() end end end end end end) while wait() do script.Parent.Visible = false -- Makes it invisible on screen for i,v in pairs(game.Workspace.NPCs:GetChildren()) do -- Finds all the children from the folder. In this case it will find all the NPCs local mag = (v.Torso.Position-game.Players.LocalPlayer.Character.HumanoidRootPart.Position).magnitude -- Makes a variable for the position between the character and the npc. if mag <= 10 then -- If the magnitude is less than or equal to 10 studs then local WSP = game.Workspace.CurrentCamera:WorldToScreenPoint(v.Torso.Position) -- The position of the NPC's Torso to 2d script.Parent.Visible = true script.Parent.Position = UDim2.new(0,WSP.X,0,WSP.Y) script.Parent.TextLabel.Text = "to chat with "..v.Name -- Refreshes the text and puts the name of the npc end end end
in dummy in gui, in textbutton
script.Parent.NPCTalk.OnServerEvent:connect(function(player) if not player.PlayerGui:FindFirstChild("") then -- Checks if the player already has the gui. Put your gui name between the quotation marks to the name of your GUI local gui = script.Parent:FindFirstChild(""):Clone() -- Change here too. Clones the gui gui.Parent = player.PlayerGui -- Clone the gui and put its parent to the player gui. end end)
local UIS = game:GetService("UserInputService") UIS.InputBegan:connect(function(input,gameProcessed) if input.KeyCode == Enum.KeyCode.E then for i,v in pairs(game.Workspace.NPCS:GetChildren()) do local mag = (v.Torso.Position - game.Players.LocalPlayer.Character.HumanoidRootPart.Position).magnitude if mag <= 10 then for i = 1,0.6,-0.05 do wait() script.Parent.ImageColor3 = Color3.new(i,i,i) end wait() for i = 0.6,1,0.05 do wait() script.Parent.ImageColor3 = Color3.new(i,i,i) end v.NPCTalk:FireServer() end end end end) --[[here is your error, running a white wait() do loop will never let the other parts in the script run while wait() do script.Parent.Visible = false -- Makes it invisible on screen for i,v in pairs(game.Workspace.NPCs:GetChildren()) do -- Finds all the children from the folder. In this case it will find all the NPCs local mag = (v.Torso.Position-game.Players.LocalPlayer.Character.HumanoidRootPart.Position).magnitude -- Makes a variable for the position between the character and the npc. if mag <= 10 then -- If the magnitude is less than or equal to 10 studs then local WSP = game.Workspace.CurrentCamera:WorldToScreenPoint(v.Torso.Position) -- The position of the NPC's Torso to 2d script.Parent.Visible = true script.Parent.Position = UDim2.new(0,WSP.X,0,WSP.Y) script.Parent.TextLabel.Text = "to chat with "..v.Name -- Refreshes the text and puts the name of the npc end end end]]
you dont need to check if the user is typing on the keyboard, all u need to check is what letter is being used. you dont need to check if the player is talking in chat either since that automaticaly disables the input code from running