Due to my previous question getting moderated, here's my attempt:
-- Server Script
local bGui = script.Parent.Parent
local button = script.Parent
local clickedEvent = button.ClickedEvent
button.MouseButton1Click:connect(function()
clickedEvent:FireClient(somehowgetheclicker)
end)
clickedEvent.OnServerEvent:connect(function(plr, charactertext, backspace)
if backspace == false then
button.Text = button.Text .. tostring(charactertext)
else
button.Text = sub.string(1, #button.Text - 1)
end
end)
-- Local Script
local plr = game.Players.LocalPlayer
local sign = workspace.Sign
local ClickedEvent = sign.BillboardGui.TextButton
local UserInputService = game:GetService("UserInputService")
ClickedEvent.OnClientEvent:connect(function(playerwhoclicked)
UserInputService.InputBegan:connect(function(input)
if input ~= nil and input.KeyCode ~= Enum.KeyCode.Backspace then
ClickedEvent:FireServer(nil, true)
elseif input ~= nil then
ClickedEvent:FireServer(input, false)
end
end)
end)
Again, I believe there's a way to edit text on a surfacegui with textbox but I can't figure it out. This script doesn't work and I'm stuck at this point.

3 comments
Put the surfaceGui in PlayerGui, and set the Adornee property to the part you want to apply the GUI to.
above is correct.
You will also have to filter the edited string at some point, or else your place may be moderated.