Questions about handling visuals on client

Hello! So I know that it is best to run as many things as possible on the client to not burden the server, and visuals is one of them. But, to what extent should visuals be done on the client? Can I add a local script to every player that handles all of the visuals, with a server firing a remote event to give instructions to the client to handle the visual?

Server script (or, maybe at least 10 of this same server script since a game probably has many visuals)

local visualevent = game:GetService("ReplicatedStorage").VisualEvent -- remote event

-- Some random events i guess
part.Touched:Connect(function()
   visualevent:FireAllClients("A")
end)

anotherpart.Touched:Connect(function()
   visualevent:FireAllClients("B")
end)

yetanotherpart.Touched:Connect(function()
   visualevent:FireAllClients("why are there so many parts")
end)

-- And it could go on and on...the point is that there could be many functions linked to this event

Local script inside character

local player = game.Players.LocalPlayer
local character = script.Parent
local visualevent = game:GetService("ReplicatedStorage").VisualEvent

visualevent.OnClientEvent:Connect(function(visualtype)
   if visualtype == "A" then
      -- Visual for when "part" is touched
   elseif visualtype == "B" then
      -- Visual for when "anotherpart" is touched
   elseif visualtype == "why are there so many parts" then
      -- Visual for when "yetanotherpart" is touched
   end
end)

-- There could be infinite number of these "visual types"

If this is how visuals are handled, would the local script handling the visuals get overwhelmed? Because if clients are to handle as many visuals as possible, using one script to handle it all seems to be the best way to go instead of having multiple local scripts handling individual visuals.

Yes, Rendering visuals on Client is the best way to reduce lag in server. You can keep one LocalScript to handle your server requests to load visuals on Clients, it’s not that bad, but it will be too hard to understand the code, make changes to it in future and I feel it’s a bad practice.

But I do have a different approach, I think if I were to handle visuals on client, I’d make a LocalScript that will call modules that are Childrened with it ( Those modules contain functions for OnClientEvent ). This directly helps understand and update codes easier and faster.

One more thing I’d do to increase efficiency is that I’d use FireClient with players within range. For example, if a player is running an ability and I am about to render it client sided, I’d fire the event to players only within a certain range such that they can only see it. Of course you don’t want to increase memory of a player that is really really far from where the effects are happening.
And you can FireClient within certain range using some modules available in other Posts!

I hope my post helped you, good luck! :shamrock: