Compatibility
Minecraft: Java Edition
Platforms
Supported environments
Creators
Details
The motivation behind this mod was to:
- Modify Player (NBT) Data of Inactive Players
- Dump Inventories (and Ender Chests)
- 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 clearcommand 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 clearcommand is not working, the impersonation list is not persistent so you can also restart the server to clear ALL impersonations.
- If for some reason the
- The
- 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)


