OnPlayerChat is not a hacky bypass at all, it just gets called whenever any player chats, even if it’s not LocalPlayer(), which is why it triggered for everyone. All you had to do was to only open the help menu on the client where the guy chatting is LocalPlayer().
Thanks for the input. I guess my issue here is, I want to ensure I’m using the proper and secure method of doing something, and that I am not leaving exploits or anything available for someone to take advantage of. As well as whichever method is less resource intense.
Purely client sided would be the least resource intensive. As to most secure, that’d be through net messages. Just use the PlayerSay hook serverside, then send a net message to the client sending that chat. And on the clients, have the panel appear in the net.Receive function. But since this can’t really be exploited (just opening a help menu?), you’d be better off doing it client side.
Though even using net messages is not secure if you got sensitive stuff that can be exploited in the panel (like god mode or admin control). The only way to be really secure is to have all of these buttons send a message to the server which then checks if you are an admin.