NPC Chat System (Camera Malfunction?)

Hi Everyone! My name is Beast and I am an intermediate level scripter. I started scripting about a year ago and I have come to think of it as an addictive hobby.

One downside to it is that scripting can cause some baaaaaad mental breakdowns, and I am on the verge of one, so please help.

Basically I have been creating an NPC chat system, where if F is pressed the NPC talks to you. It looks a little something like this:

Screenshot_600
Don’t mind the camera, fixing that as you are reading this.

I Have searched far and wide to find something even remotely similar to this, but have come back with nothing.

Basically what has been happening is when I open up a specific NPC’s gui, my personal NPC, the camera does this:

as you can see, I can move my character around and take the camera with me.
Script:

--Made by BEasTiO12 -- Admin World --  30/09/2020
-- NPC Chat System





-----------------------------------------------------------
-- 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.LineLabel
local LineBG = Gui.LineLabel




-----------------------------------------------------------
-- Character


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




-----------------------------------------------------------
-- NPC


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




-----------------------------------------------------------
-----------------------------------------------------------
-- Functions


UIS.InputBegan:Connect(function(Input)
	if Input.KeyCode == Enum.KeyCode.X then -- X is the key to skip.
		if Chatting == true then
			Skip = true
			Sounds.Click:Play()
		end
	end
end)

UIS.InputBegan:Connect(function(Input)
	if Input.KeyCode == Enum.KeyCode.Z then -- Z is the key to exit.
		if Chatting == true then
			Exit = true
			Sounds.Click:Play()
		end
	end
end)

UIS.InputBegan:Connect(function(Input)
	if Input.KeyCode == Enum.KeyCode.F then -- Prompt is F.
		
		
		if Detected == true then
			local Lines = DetectedNPC:FindFirstChild("Lines")
			
			if Lines then
				Sounds.Click:Play()
				
				Chatting = true
				Detected = false
				
				LineLabel.Text = " "
				
				PromptLabel:TweenSize(UDim2.new(0, 0, 0, 0), "Out", "Linear", 0.1)
				LineLabel:TweenPosition(UDim2.new(0.229, 280,0.419, 0), "In", "Linear", 0.3)
				LineBG:TweenPosition(UDim2.new(0, 0, 0.6, 0), "In", "Linear", 0.3)
				
				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", 0.1)
				LineLabel:TweenPosition(UDim2.new(0, 0, 0, 0), "In", "Linear", 0.3)
				LineBG:TweenPosition(UDim2.new(0, 0, 1.2, 0), "In", "Linear", 0.3)
				
				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") -- Possible Fault
			local HMR = NPC:FindFirstChild("HumanoidRootPart")
			
			if Humanoid and HMR then 
				if (HMR.Position - CharHMR.Position).magnitude < 10 then -- Distance from Tech
					Detected = true
					DetectedNPC  = NPC
					PromptLabel:TweenSize(UDim2.new(0.145, 0, 0.145, 0), "Out", "Linear", 0.1)
					print(DetectedNPC.name)
				end
			end
		end
		
	end
		
	if Detected == true and Chatting == false then
		local Humanoid = DetectedNPC:FindFirstChild("Humanoid")
		local HMR = DetectedNPC:FindFirstChild("HumanoidRootPart")
		local Head = DetectedNPC:FindFirstChild("Head")
		
		if Humanoid and HMR then 
			if (HMR.Position - CharHMR.Position).magnitude > 10 then
				Detected = false
				DetectedNPC = nil
				PromptLabel:TweenSize(UDim2.new(0, 0, 0, 0), "In", "Linear", 0.1)
				print("No Longer Detected NPC")
			else
				local WTSP = Camera:WorldToScreenPoint(Head.Position)
				PromptLabel.Position = UDim2.new(-0, WTSP.X, -0.1, 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, 8, -10) * CFrame.fromOrientation(math.rad(-20), math.rad(255), -0.35), 0.05)
		end
	else
		Camera.CameraType = Enum.CameraType.Custom
	end
	
	
end)

This is becoming frustrating, as I don’t get what the problem is. It is a complete duplicate of the working script, just with the line local NPCS = game.Workspace.NPCS:WaitForChild(“Beast”) having a different target.

If you read this far, I thank you, and I hop you can help me out.

1 Like

Putting the script in VSCode right now to check it out better, I’ll let you know if I find anything.

The only place that I’m seeing anything even resetting the camera to Custom is here.

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, 8, -10) * CFrame.fromOrientation(math.rad(-20), math.rad(255), -0.35), 0.05)
	end
else
	Camera.CameraType = Enum.CameraType.Custom
end

Is your issue the scriptable camera updating to the position of the player’s head or is the issue it getting reset back to default?

It’s not changing. The camera ANGLE is, but not the position. I could walk away and have the camera focused on my avatar still.

Update to this I believe it is something wrong with duplicating. Because when I try to do it for another NPC (I tried switching to another NPC), It still doesnt work.