How to make an event only for a player who touched a part?

Hi devs, actually i want to make an event who show a text when a player touch a part . But only the player who touched the part can see it.

Here is my script :

local DialogueEvent = game.ReplicatedStorage.RemoteEvents:FindFirstChild("DialogueEvent")
local ToggleDialogueEvent = game.ReplicatedStorage.RemoteEvents:FindFirstChild("ToggleDialogueEvent")

script.Parent.Touched:Connect(function(hit)
	if hit.Parent:WaitForChild("Humanoid") then
		

		game.Workspace.Triggers.SpeechTriggers.DoorBasement.CanTouch = false
		game.Workspace.Triggers.SpeechTriggers.SaleDeBain.CanTouch = false
		game.Workspace.Triggers.SpeechTriggers.DoorOutside.CanTouch = false
		ToggleDialogueEvent:FireAllClients(true) 
		DialogueEvent:FireAllClients("I don't want to go outside for the moment.")
		wait(4)
		DialogueEvent:FireAllClients("")
		ToggleDialogueEvent:FireAllClients(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)

Could someone can help me?

-Tnks

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.

Tnks , but actually it doesn’t work :confused:

Try this, and let me know if it works.

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)
1 Like

Try this:

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

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.