I have created a GUI that is enabled when a player clicks on a NPC. The click action activates a script that communicates with the client through a Remote Function.
The serverside script is as follows (it is located below a clickdetector within the NPC model and the remote Function is called "DialogEvent" located in the Replicated Storage):
-- Server Side Script local detector = script.Parent local Players = game:GetService("Players") local NextLabelVisible = false local nameLabel = "" local ImageLabel = "" local TextLabel = "" local Choice1 = "" local Choice2 = "" local Choice2Active = false local Cancel = "" local UserId = 0 local DialogEvent = game.ReplicatedStorage:WaitForChild("DialogEvent") local data = {UserID,nameLabel,TextLabel,NextLabelVisible,Choice1,Choice2Active,Choice2,Cancel} local Answer = 9 local NPCID = 265276480 -- first dialog function WelcomeDialog(Player) UserID = Player.UserId nameLabel = Player.Name .. ":" TextLabel = "Heey Alia_h, how are you?" NextLabelVisible = true Choice1 = "" Choice2Active = false Choice2 = "" Cancel = "Sorry, Got to go" DialogEvent:InvokeClient(Player,data) return Answer end --- second Dialog function secondDialog(Player) UserID = NPCID nameLabel = script.Parent.Parent.Name .. ":" TextLabel = "I am fine, How do you like my art?" NextLabelVisible = false Choice1 = "It is beautiful" Choice2Active = true Choice2 = "Not my taste but beautiful" Cancel = "Sorry, Got to go" DialogEvent:InvokeClient(Player,data) return Answer end -- Option One + Two function SecondOneDialog(Player) UserID =NPCID nameLabel = script.Parent.Parent.Name .. ":" TextLabel = "Thank you!" NextLabelVisible = true Choice1 = "" Choice2Active = false Choice2 = "" Cancel = "..." DialogEvent:InvokeClient(Player,data) end --Cancel Dialog function CancelDialog(Player) UserID =NPCID nameLabel = script.Parent.Parent.Name .. ":" TextLabel = "Oh, See you around!" NextLabelVisible = true Choice1 = "" Choice2Active = false Choice2 = "" Cancel = "..." DialogEvent:InvokeClient(Player,data) end -- main structure Answer = 0: Next; = 1: Option1; = 2: Option2; = 3: Cancel function DialogTree(Player) WelcomeDialog(Player) -- only 0 and 3 accepted if Answer == 0 then secondDialog(Player) -- only 1, 2 & 3 accepted if Answer == 0 then secondDialog(Player) elseif Answer == 1 then SecondOneDialog(Player) elseif Answer == 2 then SecondOneDialog(Player) elseif Answer == 3 then CancelDialog(Player) else print("error: option not found") end elseif Answer == 1 then WelcomeDialog(Player) elseif Answer == 2 then WelcomeDialog(Player) elseif Answer == 3 then CancelDialog(Player) else print("error: option not found") end end --detector event detector.MouseClick:connect(DialogTree)
the client side code is located in: startergui-> DialogGUI->DialogFrame-->LocalScript
the Script looks as follows:
local ReplicatedStorage = game:GetService("ReplicatedStorage") local DialogEvent = ReplicatedStorage:WaitForChild("DialogEvent") local PlayerGui = game.Players.LocalPlayer:WaitForChild("PlayerGui") local menu = game.Players.LocalPlayer.PlayerGui.Menu local GUI = script.Parent.Parent.Parent local Inputservice = game:GetService("UserInputService") local Answer = 9 local InputCorrect = false function OptionOneClicked() Answer = 1 GUI.Enabled = false menu = true return Answer end function OptionTwoClicked() Answer = 2 GUI.Enabled = false menu = true return Answer end function OptionCancelClicked() Answer = 3 GUI.Enabled = false menu = true return Answer end function optionNextClicked(InputObject, gameProcessedEvent) if InputObject.KeyCode == Enum.KeyCode.Return and not gameProcessedEvent then Answer = 0 InputCorrect = true GUI.Enabled = false menu = true return Answer,InputCorrect end end --data structure: {UserID,nameLabel,TextLabel,NextLabelVisible,Choice1,Choice2Active,Choice2,Cancel} function GUISetup(data) script.Parent.Parent.Enabled = true menu.Enabled = false script.Parent.ImageLabel.Image = "https://www.roblox.com/bust-thumbnail/image?userId=" .. data[1] .. "&width=420&height=420&format=png" script.Parent.NameLabel.Text = data[2] script.Parent.SpeechLabel = data[3] script.Parent.NextLabel.Active = data[4] script.Parent.OptionOne.Text = data[5] script.Parent.OptionTwo.Active = data[6] script.Parent.OptionTwo.Text = data[7] script.Parent.OptionCancel.Text = data[8] if data[4] ~= true then script.parent.OptionOne.MouseButton1Click:connect(OptionOneClicked) script.Parent.OptionTwo.MouseButton1Click:connect(OptionTwoClicked) else script.Parent.OptionOne.Active = false script.Parent.OptionTwo.Active = false end script.Parent.OptionCancel.MouseButton1Click:connect(OptionCancelClicked) while InputCorrect == false do Inputservice.InputBegan:connect(optionNextClicked) wait(0.1) end return Answer end DialogEvent.OnClientInvoke = GUISetup
The error I get is that it can nog concatenate the script.Parent.ImageLabel.Image adress because field ?
is a nil value…
Any idea why this occurs? am I calling the data table entry wrong?