So I'm working on an NPC for a game I'm working on called RAID, but the NPC that is a cop will not work. Here's my script:

local npc = script.Parent
local iconGui = script.Parent.Head.aiGui
local triggerPart = npc.DetectionPart.Handle
local itemsInSight = {}
local eis = false
local curChar = nil
local num = 0
local R = 0
local B = 200
local npcStatus = script.Parent["NPC Status"]
local detected = false

triggerPart.Touched:Connect(function(hit)
	print("New item-in-sight!")
	if game.Players:GetPlayerFromCharacter(hit.Parent) then
		if eis == false and detected == false then
			local plr = game.Players:GetPlayerFromCharacter(hit.Parent)
			local pGui = plr.PlayerGui
			local char = hit.Parent
			local detectGui = plr.PlayerGui.DetectGui
			curChar = char
			eis = true
			table.insert(itemsInSight, plr)
			script.Parent.Head.Eyes.Texture = game.ReplicatedStorage.Faces.SuspiciousEyes.Value
			local dFrame = plr.PlayerGui.DetectGui.Frame:Clone()
			script.DetectBar.Value = dFrame
			dFrame.Parent = plr.PlayerGui.DetectGui
			dFrame.Visible = true
			dFrame.Target.Value = script.Parent.HumanoidRootPart
			print("New enemy-in-sight!")

			--Scan for walls
			if table.getn(itemsInSight) >= 1 then
				repeat
					local InFrontOfWall = false
					local CheckNum = 0
					repeat
						CheckNum = CheckNum +1
						if itemsInSight[CheckNum] ~= nil then
							local Mag = itemsInSight[CheckNum]
							if Mag.ClassName == "Part" or Mag.ClassName == "MeshPart" or Mag.ClassName == "UnionOperation" then
								if (Mag.Position - script.Parent.Head.Position).Magnitude <= (hit.Position - script.Parent.Head.Position).Magnitude then
									InFrontOfWall = true
								else
									InFrontOfWall = false
								end
							end
						end
						wait()
						print("Check complete, CheckNum = "..CheckNum)
					until CheckNum == table.getn(itemsInSight) or InFrontOfWall == true
					if CheckNum == table.getn(itemsInSight) then
						num = num +1
						R = R +2
						B = B -2
						dFrame.Bar1["Bar"..num].Visible = true
						dFrame.Bar2["Bar"..num].Visible = true
						local bars = dFrame.Bar1:GetChildren()
						for i = 1,#bars do
							bars[i].BackgroundColor3 = Color3.fromRGB(R, 0, B)
						end
						local bars = dFrame.Bar2:GetChildren()
						for i = 1,#bars do
							bars[i].BackgroundColor3 = Color3.fromRGB(R, 0, B)
						end
					elseif InFrontOfWall == true then
						eis = false
					end
					if eis == true then
						if (script.Parent.Head.Orientation - script.Parent.HumanoidRootPart.Orientation).Magnitude <= 90 and (script.Parent.Head.Orientation - script.Parent.HumanoidRootPart.Orientation).Magnitude >= -90 then
							script.Parent.Head.CFrame = CFrame.new(script.Parent.Head.Position, hit.Parent.Head.Position)
						end
						if (hit.Position - script.Parent.Head.Position).Magnitude <= 50 and (hit.Position - script.Parent.Head.Position).Magnitude >= 40 then
							if plr.PlayerGui.MainStats.Status.Text == "Disguised" then
								wait(0.09)
							elseif plr.PlayerGui.MainStats.Status.Text == "Armed" or plr.PlayerGui.MainStats.Text == "Frightening" then
								wait(0.03)
							end
						elseif (hit.Position - script.Parent.Head.Position).Magnitude <= 40 and (hit.Position - script.Parent.Head.Position).Magnitude >= 30 then
							if plr.PlayerGui.MainStats.Status.Text == "Disguised" then
								wait(0.08)
							elseif plr.PlayerGui.MainStats.Status.Text == "Armed" or plr.PlayerGui.MainStats.Text == "Frightening" then
								wait(0.025)
							end
						elseif (hit.Position - script.Parent.Head.Position).Magnitude <= 30 and (hit.Position - script.Parent.Head.Position).Magnitude >= 20 then
							if plr.PlayerGui.MainStats.Status.Text == "Disguised" then
								wait(0.07)
							elseif plr.PlayerGui.MainStats.Status.Text == "Armed" or plr.PlayerGui.MainStats.Text == "Frightening" then
								wait(0.02)
							end
						elseif (hit.Position - script.Parent.Head.Position).Magnitude <= 20 and (hit.Position - script.Parent.Head.Position).Magnitude >= 10 then
							if plr.PlayerGui.MainStats.Status.Text == "Disguised" then
								wait(0.06)
							elseif plr.PlayerGui.MainStats.Status.Text == "Armed" or plr.PlayerGui.MainStats.Text == "Frightening" then
								wait(0.015)
							end
						elseif (hit.Position - script.Parent.Head.Position).Magnitude <= 10 and (hit.Position - script.Parent.Head.Position).Magnitude >= 0 then
							if plr.PlayerGui.MainStats.Status.Text == "Disguised" then
								wait(0.05)
							elseif plr.PlayerGui.MainStats.Status.Text == "Armed" or plr.PlayerGui.MainStats.Text == "Frightening" then
								wait(0.01)
							end
						end
					end
					wait()
					print("Proccess Complete")
				until num >= 100 or eis == false
				if eis == false then
					wait(3)
					repeat
						num = num -1
						wait(0.01)
					until num <= 0 or eis == true
					if num <= 0 then
						print("Detect System Restart")
						script.Parent.DetectionManager.DetectBar.Value:Destroy()
						script.Parent.Head.Eyes.Texture = game.ReplicatedStorage.Faces.OpenEyes.Value
						script.Parent.Head.CFrame = CFrame.new(Vector3.new(script.Parent.Head.Position), Vector3.new(script.Parent.FaceFrontPart.Handle.Position))
						print("Detect System Restart Successful")
					end
				else
					print("Detected")
					script.Parent.HostageScript:Destroy()
					--'Ahhh! A criminal!!'
					local pGui = game.Players[hit.Parent.Parent.Name].PlayerGui
					if pGui.MainStats.Status.Text == "Armed" or pGui.MainStats.Status.Text == "Frightening" then
						workspace.Audio.NPCAlerted:Play()
						detected = true
						if pGui.MainStats.Status.Text == "Armed" then
							script.Parent.Head.aiGui.Alerted.Visible = true
							npcStatus.Value = "Alerted"
							local num = 0
							repeat
								num = num +0.01
								wait(0.01)
							until num >= 1 or pGui.MainStats.Status.Text == "Frightening"
							if num >= 1 then
								local num = 1
								local gui = pGui.ReloadingTutorial
								gui.HintLabel.Text = "You took to long to frighten the civilian! Scope in before approaching her to make her surrender!"
								repeat
									num = num -0.05
									gui.Image.ImageTransparency = num
									gui.HintLabel.TextTransparency = num
									gui.Label1.TextTransparency = num
									gui.Label2.TextTransparency = num
									wait(0.01)
								until num >= 1
								wait(1)
								script.Parent.Head.aiGui.Alerted.Visible = false
								npcStatus.Value = "Neutral"
								hit.Parent.Parent.Head.CFrame = CFrame.new(game.Workspace.ResetTP2.Position)
								wait(1)
								repeat
									num = num +0.05
									gui.Image.ImageTransparency = num
									gui.HintLabel.TextTransparency = num
									gui.Label1.TextTransparency = num
									gui.Label2.TextTransparency = num
									wait(0.01)
								until num <= 0
							else
								npcStatus.Value = "Hostage"
								script.Parent.Humanoid:LoadAnimation(game.ReplicatedStorage.Animations["Hands Up"]):Play()
								script.Parent.Head.aiGui.Alerted.Visible = false
								wait(1)
								script.Parent.Humanoid:LoadAnimation(game.ReplicatedStorage.Animations["Hands Up Idle"]):Play()
								script.Parent.Head.Mouth.Texture = game.ReplicatedStorage.Faces.Frown.Value
							end
						elseif pGui.MainStats.Status.Text == "Frightening" then
							npcStatus.Value = "Hostage"
							script.Parent.Humanoid:LoadAnimation(game.ReplicatedStorage.Animations["Hands Up"]):Play()
							script.Parent.Head.aiGui.Alerted.Visible = false
							wait(1)
							script.Parent.Humanoid:LoadAnimation(game.ReplicatedStorage.Animations["Hands Up Idle"]):Play()
							npcStatus.Value = "Hostage"
							script.Parent.Head.Mouth.Texture = game.ReplicatedStorage.Faces.Frown.Value
						end
						if script.Parent.DetectionManager.DetectBar.Value ~= nil then
							script.Parent.DetectionManager.DetectBar.Value:Destroy()
						end
					end
				end
			end
		end
	else
		table.insert(itemsInSight, hit)
	end
end)

triggerPart.TouchEnded:Connect(function(hit)
	local plr = game.Players:GetPlayerFromCharacter(hit.Parent)
	if plr then 
		table.remove(itemsInSight, table.find(itemsInSight, plr))
	else
		table.remove(itemsInSight, table.find(itemsInSight, hit))
	end
end)

When I set the Head's CFrame to look at the Players Head, the Head is destroyed. Why? I would appreciate some help. Thanks!

1 comment

0

You can't just CFrame the head otherwise the neck motor6D breaks and the Humanoid dies. You'll have to change the offsets of the neck joint!