Super-Nostalgia-Zone/UI/Messages/init.client.lua

92 lines
2.1 KiB
Lua

local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local gui = script.Parent
local player = Players.LocalPlayer
local hintBin = Instance.new("Folder")
local msgNameFmt = "MsgLbl_%s [%s]"
local function addMessage(sourceMsg, msgType)
local isInPlayer = (sourceMsg.Parent == player)
local msgType = sourceMsg.ClassName
if msgType == "Message" and isInPlayer then
msgType = "Player"
end
local msgTemp = script:WaitForChild(msgType)
local msg = msgTemp:Clone()
msg.Name = msgNameFmt:format(msgType, sourceMsg:GetFullName())
local textUpdater = sourceMsg:GetPropertyChangedSignal("Text")
local isUpdating = false
local function updateText()
if not isUpdating then
isUpdating = true
msg.Text = sourceMsg.Text
sourceMsg.Text = ""
if msgType ~= "Hint" then
msg.Visible = (#msg.Text > 0)
end
isUpdating = false
end
end
local function onAncestryChanged()
local desiredAncestor
if msgType == "Hint" then
desiredAncestor = hintBin
elseif isInPlayer then
desiredAncestor = player
else
desiredAncestor = workspace
end
if not sourceMsg:IsDescendantOf(desiredAncestor) then
msg:Destroy()
end
end
--[[
I have to parent the Hint somewhere where it won't render since it
draws even if the Hint has no text. The server will remove the object
by it's reference address even if I change the parent, so this isn't a
problem online. But I can't rely on this in a non-network scenario so
regular Hints will still be visible offline if they're in the Workspace :(
--]]
if msgType == "Hint" then
RunService.Heartbeat:Wait()
sourceMsg.Parent = hintBin
end
updateText()
textUpdater:Connect(updateText)
sourceMsg.AncestryChanged:Connect(onAncestryChanged)
msg.Parent = gui
end
local function registerMessage(obj)
if obj:IsA("Message") then
addMessage(obj)
end
end
for _,v in pairs(workspace:GetDescendants()) do
registerMessage(v)
end
for _,v in pairs(player:GetChildren()) do
registerMessage(v)
end
player.ChildAdded:Connect(registerMessage)
workspace.DescendantAdded:Connect(registerMessage)