I believe there is a custom model made for sticky messages and it was public before, here’s the script:
--[[
____
/\ _`\ __
\ \ \L\ \ __ ____/\_\ ___
\ \ _ <' /'__`\ /',__\/\ \ /'___\
\ \ \L\ \/\ \L\.\_/\__, `\ \ \/\ \__/
\ \____/\ \__/.\_\/\____/\ \_\ \____\
\/___/ \/__/\/_/\/___/ \/_/\/____/
Admin Essentials v2
Plugin Documentation
*coming soon^tm
If you have any questions regarding Plugins, contact TheFurryFish.
--]]
local Plugin = function(...)
local Data = {...}
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local StickyEvent = ReplicatedStorage:WaitForChild("StickyMessage")
local FetchSticky = ReplicatedStorage:WaitForChild("FetchSticky")
local Sticky = false
local StickyMessage = ""
local StickyPlayer
-- Included Functions and Info --
local remoteEvent = Data[1][1]
local remoteFunction = Data[1][2]
local returnPermissions = Data[1][3]
local Commands = Data[1][4]
local Prefix = Data[1][5]
local actionPrefix = Data[1][6]
local returnPlayers = Data[1][7]
local cleanData = Data[1][8] -- cleanData(Sender,Receiver,Data)
-- Practical example, for a gui specifically for a player, from another player
-- cleanData(Sender,Receiver,"hi") -- You need receiver because it's being sent to everyone
-- Or for a broadcast (something everyone sees, from one person, to nobody specific)
-- cleanData(Sender,nil,"hi") -- Receiver is nil because it is a broadcast
-- Plugin Configuration --
local pluginName = 'n'
local pluginPrefix = Prefix
local pluginLevel = 2
local pluginUsage = "<Message?>" -- leave blank if the command has no arguments
local pluginDescription = "Allow for a sticky hint to be placed at the top of the screen"
-- Example Plugin Function --
local function pluginFunction(Args) -- keep the name of the function as "pluginFunction"
local Player = Args[1]
if Args[3] then
local combinedMessage
for a,b in pairs(Args) do
if a >= 3 then
if not combinedMessage then
combinedMessage = b
else
combinedMessage = combinedMessage..' '..b
end
end
end
for a,b in next, game:GetService("Players"):GetPlayers() do
local Cleaned,newData = cleanData(combinedMessage,Player,b)
local cleansedData = ""
local cannotShow = false
if Cleaned and newData then
cleansedData = newData
elseif not Cleaned then
if newData and newData:lower():match('cannot communicate with') then
cannotShow = true
StickyEvent:FireClient(b, true, Player, 'Your chat settings prevent you from seeing messages.')
else
if not newData then
remoteEvent:FireClient(Player,'Hint', "Warning",'Your chat settings prevent you from sending messages.')
return
else
cleansedData = newData
end
end
end
if not cannotShow then
StickyEvent:FireAllClients(true, Player, cleansedData)
Sticky = true
StickyMessage = combinedMessage
StickyPlayer = Player
end
end
else
StickyEvent:FireAllClients(false, Player, "")
Sticky = false
StickyMessage = ""
StickyPlayer = nil
end
end
FetchSticky.OnServerInvoke = function(Player)
local Cleaned, newData = cleanData(StickyMessage, Player, nil)
local cleansedData = ""
local cannotShow = false
if Cleaned and newData then
cleansedData = newData
elseif not Cleaned then
if newData and newData:lower():match('cannot communicate with') then
cannotShow = true
StickyEvent:FireClient(Player, true, Player, 'Your chat settings prevent you from seeing messages.')
else
cannotShow = true
end
end
if not cannotShow then
return {
Active = Sticky,
Message = cleansedData,
Player = StickyPlayer
}
end
end
-- Return Everything to the MainModule --
local descToReturn
if pluginUsage ~= "" then
descToReturn = pluginPrefix..pluginName..' '..pluginUsage..'\n'..pluginDescription
else
descToReturn = pluginPrefix..pluginName..'\n'..pluginDescription
end
return pluginName,pluginFunction,pluginLevel,pluginPrefix,{pluginName,pluginUsage,pluginDescription}
end
return Plugin
just make sure to create a remote function and remote event inside of replicatedstorage, rf naming: FetchSticky
and re naming: StickyMessage
i pretty much recommend updating the script if necessary since it is kinda old
Furthermore, the developer can implement the module without any package linked to it (or atleast works for me) by using the command in the output:
game:GetService("InsertService"):LoadAsset(563619835).Parent = game.ServerStorage -- user can parent this anywhere