Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

help with voice influenced npc?

Asked by
Xeilot -1
5 years ago

I want to make a script where if you are a certain distance away from an NPC, like a maximum of 10 studs, and you say something like hi, it will say hi back. does anyone know how?

I know already how to do the chat

game:GetService("Chat"):Chat(script.Parent.Head, "Hello.", Enum.ChatColor.White)

and i have a door script to like recognize if you chatted

function onChatted(msg, recipient, speaker)

local source = string.lower(speaker.Name)
msg = string.lower(msg)

if (msg == "hi") then

2 answers

Log in to vote
0
Answered by
yellp1 193
5 years ago
Edited 5 years ago
-- First comes our global variables.
local npc = script.Parent

-- Services
local chatService = game:GetService("Chat")
local plrs = game:GetService("Players") -- Define our player service.

-- Variables
local messages = 
    {
        ["hi"] = "Hello Player!",
    }

--- Functions
function chat(part,msg,color)
    chatService:Chat(part,msg,color or Enum.ChatColor.White)
end

function checkMessage(msg)
    msg = string.lower(msg) -- lowercase our message

    local response = messages[msg]

    if response then
        chat(npc.Head,response)
    end
end

function playerAdded(plr)   -- Define our function for when players join.
    plr.Chatted:Connect(function(message,reciever)
        if plr.Character then       -- Check if the player has a character
            if not reciever then    -- Make sure it isn't a private message.
                local plrPos= plr.Character:GetPrimaryPartCFrame().p
                local npcPos = npc:GetPrimaryPartCFrame().p
                local distance = (plrPos-npcPos).magnitude -- Define the distance from the character to our NPC.

                if distance < 10 then
            wait(1)
                    checkMessage(message)
                end
            end
        end
    end)
end

-- Event listeners
plrs.PlayerAdded:Connect(playerAdded)
Ad
Log in to vote
0
Answered by
Eqicness 255 Moderation Voter
5 years ago

Hello Xeilot,

First, let's define a chat function for you to use:

local chatService = game:GetService("Chat")

function chat(part,msg,color)
    chatService:Chat(part,msg,color or Enum.ChatColor.White)
end

This allows you to make any part you want chat. We define the chat service outside of the function so we don't have to get it every time we use the function.

After that, we'll create a checkMessage function to check valid messages, and have the NPC reply.

local messages = 
    {
        ["player message here"] = "NPC Response here",
    }

function checkMessage(msg)
    msg = string.lower(msg) -- lowercase our message

    local response = messages[msg]

    if response then
        chat(npc.Head,response)
    end
end

Next, we need to check for player chats. This one is a bit more tricky, but overall pretty easy.

local plrs = game:GetService("Players") -- Define our player service.

function playerAdded(plr)   -- Define our function for when players join.

end

plrs.PlayerAdded:Connect(playerAdded)

Inside that function we can check when a player has chatted.

local plrs = game:GetService("Players") -- Define our player service.

function playerAdded(plr)   -- Define our function for when players join.
    plr.Chatted:Connect(function(message,reciever)
        if plr.Character then       -- Check if the player has a character
            if not reciever then    -- Make sure it isn't a private message.
                local distance = (plr.Character:GetPrimaryPartCFrame().p-npc:GetPrimaryPartCFrame.p) -- Define the distance from the character to our NPC.

                if distance < 10 then
                    checkMessage(message)
                end
            end
        end
    end
end

plrs.PlayerAdded:Connect(playerAdded)

Now that we have those three components, let's define our NPC.

local npc = script.Parent -- Change this if your script is in a different place.

We're done! Now we can combine it into one script:

-- First comes our global variables.

-- Services
local chatService = game:GetService("Chat")
local plrs = game:GetService("Players") -- Define our player service.

-- Variables
local messages = 
    {
        ["player message here"] = "NPC Response here",
    }

--- Functions
function chat(part,msg,color)
    chatService:Chat(part,msg,color or Enum.ChatColor.White)
end

function checkMessage(msg)
    msg = string.lower(msg) -- lowercase our message

    local response = messages[msg]

    if response then
        chat(npc.Head,response)
    end
end

function playerAdded(plr)   -- Define our function for when players join.
    plr.Chatted:Connect(function(message,reciever)
        if plr.Character then       -- Check if the player has a character
            if not reciever then    -- Make sure it isn't a private message.
                local plrPos= plr.Character:GetPrimaryPartCFrame().p
                local npcPos = npc:GetPrimaryPartCFrame().p
                local distance = (plrPos-npcPos).magnitude -- Define the distance from the character to our NPC.

                if distance < 10 then
                    checkMessage(message)
                end
            end
        end
    end
end

-- Event listeners
plrs.PlayerAdded:Connect(playerAdded)

And we're done! The NPC now can detect when a player chats, check the distance between it and the player, and then reply!

If you've got any questions, feel free to ask me.

0
When I try putting that in, it says the last end has a red line under it Xeilot -1 — 5y
0
and it doesn't seem to work Xeilot -1 — 5y

Answer this question