--// Made BY: Razorboots (Roblox 2019)
--// NPC Chat System: Gui Usage, Tweening, Camera Manipulation, Varible Switching





--// Services

local RunService = game:GetService("RunService")
local UIS = game:GetService("UserInputService")
local Players = game:GetService("Players")






--//Main Variables


local DetectedNPC = nil
local Detected = false
local Chatting = false
local Skip = false
local Exit = false





--// Player


local Player = Players.LocalPlayer
local Camera = game.Workspace.CurrentCamera

local Gui = script.Parent
local Sounds = Gui.Sounds
local PromptLabel = Gui.PromptLabel
local LineLabel = Gui.LineLabel





--// Character


local Character = Player.Character or Player.CharacterAdded:Wait()
local CharHMR = Character:WaitForChild("HumanoidRootPart")





--//NPC


local NPCS = game.Workspace.WaitForChild("NPCS")





--// Functions


UIS.InputBegan:Connect(function(Input)
	if Input.KeyCode == Enum.KeyCode.X then
		if Chatting == true then
			skip = true
			Sounds.Click:Play()
		end
	end
end)

UIS.InputBegan:Connect(function(Input)
	if Input.KeyCode == Enum.KeyCode.Z then
		if Chatting == true then
			skip = true
			Sounds.Click:Play()
		end
	end
end)

UIS.InputBegan:Connect(Function(input))
	if Input.KeyCode == Enum.Keycode.Z then
		
		
		if Detected == true then
			local Lines = DetectNPC:FindFirstChild("Lines")
			
			if Lines then
				Sounds.Click:Play() 
				
				Chatting = true
				Detected = false
				
				LineLabel.Text = "   "
				
				PromptLabel:TweenSize(UDim2.new(0, 0, 0, 0), "Out", "Linear")
			    LineLabel:TweenPosition(UDim2.new(0, 0, 0.8, 0), "In", "Linear")
			
			wait(0.5)
			
			for i, Line in pairs(Lines:GetChildren()) do
				local Text = Line.Value
				
				for i = 1 "Text" do
					LineLabel.Text = string.sub(Text, 1, i)
					Sounds.Talk:Play()
					if Skip == true then
						Skip = false
						LineLabel.Text = Text
						break
					end
					if Exit == true then
						break
					end
					wait(0.07
				end
					if Exit = true then
						Exit = false
						break
					end
					repeat wait() until Skip == true or Exit == true
					Skip = false
				 		end
				
				Exit = false
				Skip = false
				
			PromptLabel:TweenSize(UDim2.new 0, 0, 0, 0), "Out", "Linear")
			LineLabel:TweenPosition(UDim2.new(0,0, 1.2, 0), "In" "Linear")
			
			wait(0.5)
			
			Chatting = false
			Detected = false
		end
		end
	end
end)

				
				
--// Main Loop


RunService.RenderStepped:Connect(function()
	
	
	if Detected == false and Chatting == false then
		for i, NPC in pairs (NPCS:GetChildren()) do
			local Humanoid = NPC:FindFirstChild("Humanoid")
			local HMR = NPC:FindFirstChild("HumanoidRootPart")
			
			if Humanoid and HMR then 
				if (HMR.Position - CharHMR.Position).magnitude < 15 then
					Detected = true
					DetectedNPC = NPC
					PromptLabel:TweenSize(UDim2.new(0, 60, 0, 60), "In", "Linear"
					print(DetectedNPC.Name)
				end
			end
			
		end
	end
	
	if Detected == true and Chatting == false then
		local Humanoid = DetectedNPC:FindFirstChild("Humanoid")
		local HMR = DetectedNPC:FindFirstChild("HumanoidRootPart")
		
		if Humanoid and HMR then
			if (HMR.Position - CharHMR.Position).magnitude < 15 then
				Detected = false
				DetectedNPC = nil
				PromptLabel:TweenSize(UDim2.new((0, 60, 0, 60), "Out", "Linear")
					print("No Longer Detected NPC")
			else
				local WTSP = Camera:WorldToScreenPoint(HMR.Position)
				PromptLabel.Position = UDim2.new(0, WTSP.X, 0, WTSP.Y)
			end
		end
	end
	
	if Chatting == true then
		local Humanoid = DetectedNPC:FindFirstChild("Humanoid")
		local HMR = DetectedNPC:FindFirstChild("HumanoidRootPart")
		
		if Humanoid and HMR then 
	        Camera.CameraType = Enum.CameraType.Scriptable
	        Camera.CFrame = Camera.CFrame:Lerp(HMR.CFrame * CFrame.new(-4, -4, -7 * Cframe.fromOrientation(math.rad(-20), math.rad(215), 0) )
	end
		else
			Camera.CameraType = Enum.CameraType.Scriptable
	)
		end