A simple way (Assuming I understand what you mean) to do this would be with the usage of game.Players:GetPlayerFromCharacter() which would grab the Player based on their Character, In order to do this, we would need to check if the Item we got is actually the Player which would be a very simple check how how you did it with the Humanoid, you can then say to Fire to their Client only with the Usage of RemoteEvent:FireClient()
local Player = game.Players:GetPlayerFromCharacter(hit.Parent) -- Player or nil
if Player then -- if the Player's Character was found
ToggleDialogueEvent:FireClient(Player, "")
-- 'FireClient' requires the Player as the first argument so it knows who to fire for.
end
You use FindFirstChild for this, WaitForChild would yield your code.
local DialogueEvent = game.ReplicatedStorage.RemoteEvents:FindFirstChild("DialogueEvent")
local ToggleDialogueEvent = game.ReplicatedStorage.RemoteEvents:FindFirstChild("ToggleDialogueEvent")
local debounce = false
script.Parent.Touched:Connect(function(hit)
if not debounce then
debounce = true
if game.Players:GetPlayerFromCharacter(hit.Parent) then
game.Workspace.Triggers.SpeechTriggers.DoorBasement.CanTouch = false
game.Workspace.Triggers.SpeechTriggers.SaleDeBain.CanTouch = false
game.Workspace.Triggers.SpeechTriggers.DoorOutside.CanTouch = false
ToggleDialogueEvent:FireClient(game.Players:GetPlayerFromCharacter(hit.Parent),true)
DialogueEvent:FireClient(game.Players:GetPlayerFromCharacter(hit.Parent),"I don't want to go outside for the moment.")
task.wait(4)
DialogueEvent:FireClient(game.Players:GetPlayerFromCharacter(hit.Parent),"")
ToggleDialogueEvent:FireClient(game.Players:GetPlayerFromCharacter(hit.Parent),false)
task.wait(1.5)
game.Workspace.Triggers.SpeechTriggers.DoorBasement.CanTouch = true
game.Workspace.Triggers.SpeechTriggers.SaleDeBain.CanTouch = true
game.Workspace.Triggers.SpeechTriggers.DoorOutside.CanTouch = true
end
task.wait()
debounce = false
end
end)
or you could just use a Client Script. Example:
local player = game.Players.LocalPlayer
local part = game.Workspace:WaitForChild("Part") -- part that the player touches
local db = false -- db short for Debounce
part.Touched:Connect(function()
if db == false then -- this prevents code from running multiple times
db = true
-- Code Here --
end
end)
local DialogueEvent = game.ReplicatedStorage.RemoteEvents:FindFirstChild("DialogueEvent")
local ToggleDialogueEvent = game.ReplicatedStorage.RemoteEvents:FindFirstChild("ToggleDialogueEvent")
script.Parent.Touched:Connect(function(hit)
local humanoid = hit.Parent:FindFirstChild("Humanoid")
if humanoid then
game.Workspace.Triggers.SpeechTriggers.DoorBasement.CanTouch = false
game.Workspace.Triggers.SpeechTriggers.SaleDeBain.CanTouch = false
game.Workspace.Triggers.SpeechTriggers.DoorOutside.CanTouch = false
ToggleDialogueEvent:FireClient(humanoid.Parent, true)
DialogueEvent:FireClient(humanoid.Parent, "I don't want to go outside for the moment.")
wait(4)
DialogueEvent:FireClient(humanoid.Parent, "")
ToggleDialogueEvent:FireClient(humanoid.Parent, false)
wait(1.5)
game.Workspace.Triggers.SpeechTriggers.DoorBasement.CanTouch = true
game.Workspace.Triggers.SpeechTriggers.SaleDeBain.CanTouch = true
game.Workspace.Triggers.SpeechTriggers.DoorOutside.CanTouch = true
end
end)
In the most simplistic terms, this is the way I like to handle touch events for each player.
Example
local tbl = {}; -- Storage placeholder
script.Parent.Touched:Connect(function(hit)
local hum;
-- Check if 'hit413' was hit previously
if (hum and not tbl[hit.Name]) then
-- Add the name of hit to `tbl`
tbl[hit.Name] = true;
task.wait(4);
-- Remove it from `tbl`
tbl[hit.Name] = nil;
end
end)
You could use a local script and connect .Touched to the characters humanoid, this way you can spawn a text that only the player can see + you’ll be able to detect a player character touch much easier