UUID Impersonate
ModAGPL-3.0-only

UUID Impersonate

Allows you to impersonate another player at the UUID level which allows you to load in as though you are really that player (NBT and all).

130
Downloads
2
Followers
5 months ago
Updated
📦
3
Versions

📖About UUID Impersonate

The motivation behind this mod was to:

  • Modify Player (NBT) Data of Inactive Players
    1. Dump Inventories (and Ender Chests)
    2. Interact with mods as though you are the player so you don't need to resort to NBT manipulation if the mod does not have admin functionality/management

The way the mod functions is by

  • Letting the server check if the actual player joining (not the person they are impersonating) is allowed to join the server
    • So the original player cannot use this to bypass bans or other things that would inhibit joining ordinarily
    • It also has the helpful side effect of making it so (on a whitelisted server) you don't need to whitelist the player you are impersonating.
  • Then after it verifies you can join, it checks if you are trying to impersonate someone (via the /uuidimpersonate impersonate <player|uuid> command you used on the previous login)
    • The /uuidimpersonate impersonate <player|uuid> command is guarded by both a not impersonated predicate and a has OP level 4 (owner) predicate.
    • The accompanying /uuidimpersonate clear command is guarded by just an impersonated predicate (so no matter what permissions you have, you can stop the impersonation)
      • If for some reason the /uuidimpersonate clear command is not working, the impersonation list is not persistent so you can also restart the server to clear ALL impersonations.
  • If you are then it swaps out the original GameProfile with the player you are trying to impersonate's (generated) GameProfile.

It is that simple, however, as there is a hardcoded 16 character limit for the GameProfile's name, I had to inject into various places like the ServerPlayerEntity#getPlayerListName (for tab list) and the PlayerEntity#getName (for chat messages and others) functions to get the name I wanted to display ("ImpersonatedName (Impersonated by OriginalName)") while impersonating which ensures transparency for other players.

This is still not perfect though, for instance, I observed that some mods (like Fabricord) check the GameProfile name directly (instead of PlayerEntity#getName) and thus it will only appear as though the (Impersonated) player joined the world without the descriptor of who is impersonating them (looks like a normal non-impersonated join)