I used the api dump on github for this, and it spat out a rather surprisingly small list of services that will actually work with remote events:
Edit: It has been ~24 hours since the release of UnreliableRemoteEvents
and I have since retested this with the same result.
{
[1] = "StarterGui",
[2] = "Chat",
[3] = "FriendService",
[4] = "InsertService", --!?!?!
[5] = "JointsService", --????? honestly surprised that either of these work
[6] = "Lighting",
[7] = "LocalizationService",
[8] = "MarketplaceService",
[9] = "MaterialService",
[10] = "Workspace",
[11] = "Players",
[12] = "ProximityPromptService",
[13] = "ReplicatedStorage",
[14] = "SoundService",
[15] = "StarterPack",
[16] = "StarterPlayer",
[17] = "Teams",
[18] = "TestService",
[19] = "TextChatService",
[20] = "VoiceChatService"
}
Unsurprisingly, most other services either have too high of a script security to be accessed by a script, or just arent a child of game
at all (which makes it impossible to get using game:GetService()
).
I did find a really weird bug though; if you try to create an instance under LiveScriptingService
, RemoteCursorService
or ScriptCommitService
. Roblox studio just… crashes, I will most likely make a bug report on that soon but yeah.
Anyways,
You can generate this yourself using the small script I made if you’d like, it will also give you all the services that failed to work and why inside of their own respective tables.
Server:
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local TryFiring = Instance.new("RemoteFunction", ReplicatedStorage)
TryFiring.Name = "TryFiring"
local HttpService = game:GetService("HttpService")
print("Grabbing API dump.")
local ApiDump = HttpService:GetAsync("https://raw.githubusercontent.co".."m/MaximumADHD/Roblox-Client-Tracker/roblox/API-Dump.json") --split the string so that devforum would let me send the message
print("Decoding JSON.")
local JSONDecode = HttpService:JSONDecode(ApiDump)
local Services = {}
print("Indexing Classes.")
for _, Class in JSONDecode.Classes do
if not Class.Tags then
continue
end
if not table.find(Class.Tags, "Service") then
continue
end
if table.find(Services, Class.Name) then
continue
end
table.insert(Services, Class.Name)
end
local FailedToCreate = {}
local ServiceRemotes = {}
local CurrentlyInstancing = nil
print("Instancing Remotes.")
for _, ServiceName in Services do
local _, FailedCreation = pcall(function ()
if ServiceName == "LiveScriptingService" or ServiceName == "RemoteCursorService" or ServiceName == "ScriptCommitService" then
return -- stops studio from crashing... for some reason? I really can't tell you why, but it does!
end
CurrentlyInstancing = game:GetService(ServiceName)
local ServiceRemote = Instance.new("RemoteEvent", CurrentlyInstancing)
ServiceRemote.Name = CurrentlyInstancing.Name
ServiceRemotes[ServiceRemote.Name] = ServiceRemote
end)
if FailedCreation then
warn("Failed to create remote for service '"..ServiceName.."'.")
FailedToCreate[ServiceName] = FailedCreation
end
end
local Recieved = {}
print("Firing Remotes.")
for _, Remote in ServiceRemotes do
Remote.OnServerEvent:Once(function ()
table.insert(Recieved, Remote.Name)
end)
end
local FailedToFire = {}
local Players = game:GetService("Players"):GetPlayers()
local FailedToFire = TryFiring:InvokeClient(Players[1], Services)
task.wait(3) -- wait for any extra remotes that may still be firing
local CompletedTable = {
CompletedSucessfully = Recieved;
FailedToCreate = FailedToCreate;
FailedToFire = FailedToFire;
}
print(CompletedTable)
Client:
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local TryFiring: RemoteFunction = ReplicatedStorage:WaitForChild("TryFiring")
local FailedToFire = {}
function OnFire(ServiceTable: {string})
for _, ServiceName in ServiceTable do
local _, Error = pcall(function ()
local Remote = game:GetService(ServiceName):WaitForChild(ServiceName, .1)
if not Remote then
error("Couldn't grab remote from service.")
end
Remote:FireServer()
end)
if Error then
FailedToFire[ServiceName] = Error
end
end
return FailedToFire
end
TryFiring.OnClientInvoke = OnFire