How To Replace Roblox Globals

I am trying to replace the Roblox global game across all scripts, but I cannot figure out how to achieve this. In a single script I can simply do game = 5, and game now equals 5. At large, I can do _G.game = 5, but then I have to preface each mention of it with _G i.e. print(_G.game), which is not what I want. I want to be able to simply do print(game) and have it return 5. I have also tried using setfenv, but I’ve had no luck in using that to affect all scripts. How might I achieve this? All crazy and roundabout solutions are welcome!

You cannot set these global variables. What do you need this for?

1 Like

Are you trying to make a reference to a global variable?

You can set them within a script and in _G. The issue is having that apply to all scripts. I’m trying to accomplish this for an anti-exploit system.

I’m trying to replace the Roblox global game with, in this example, 5.

Let’s just say that setting the globals by setting _G will change it for every script. _G is a completely different table for each of these:

  • Client
  • Server
  • CoreScripts

So you can’t see what CoreScripts are doing to _G on the client.
However, Exploits also have their own _G so you can’t detect them with that. They still have a way to access the normal client _G.

1 Like

Interesting. I didn’t know that. Do you know of any possible way to redirect exploiters when they attempt to access game?

You can try to detect memory spikes with :GetTotalMemoryUsageMb(), but it wouldn’t be the most reliable form.

No, sorry. Only exploiters can redirect variables like game to something else. So, that’s not too helpful!

1 Like

I’m not too sure specifically what you want but there are 2 possibilities from what I’ve read.

Are you talking about modifying the actual instance or to write to the variables automatically? If this is what you want, you can’t and shouldn’t want to as it’s unsafe. Modifying the environment through means of set/getfenv (Luau stores globals in the environment, obtained through get/setfenv; not in _G like Lua) disables some Luau optimizations and is all-in-all not good practice. There are hardly if any viable uses for modifying the script environment in this way.

If you understand the risks and still want to, you could inject variables through a module or similar but this still has drawbacks, namely that:

  • The global can still be accessed if it’s stored to another variable before requiring the module (ie. local originalGame = game; require(path.to.module)
  • Scripts that don’t require the module won’t be affected

Really, the only way to do it is to hook into game’s metamethods and return what you’d like to, but this isn’t possible without an exploit. Even if it were, the instances still exist in memory and could still be read from in some way. It would only inconvenience exploiters, it isn’t something that’s completely foolproof.

All-in-all, a client-sided anticheat is only useful if you’re looking to inconvenience exploiters (especially to create a honeypot), but in either case, again, this isn’t completely foolproof.


If you’re actually talking about making instances have custom behaviour manually, you can just create a wrapper using metatables but again, it would not replicate to other scripts unless you create or access the wrapped instance in those scripts (eg. through a module).

1 Like