File Details
rpessentials-4.1.1.jar
- R
- Mar 22, 2026
- 313.32 KB
- 16
- 1.21.1
- NeoForge
File Name
rpessentials-4.1.1.jar
Supported Versions
- 1.21.1
Curse Maven Snippet
[4.1.1]
Nametag system overhaul — Realistic Nametag behavior + nickname sync fix GUYS I FINALLY MADE IT OMG, THE NAMETAG ARE FINALLY HIDDEN EVEN WHEN BEHIND A BLOCK I'M SO HAPPY GUYYYYSSSSS WOWOWOWOWOW, so just to be clear, you can now hide nametag, change them with the nickname and Im so happy wowowow
Added
Realistic Nametag behavior: Nametags are now hidden behind opaque blocks without any client-side raycast.
- Implemented via
MixinEntityRenderer— changesFont.DisplayMode.SEE_THROUGHtoFont.DisplayMode.NORMALondrawInBatch, activating the GPU depth test. This is the exact mechanism used by the Realistic Nametag mod. - Works on both
ordinal = 0(background layer, visible while sneaking) andordinal = 1(white text layer, visible when not sneaking). - No performance overhead — the depth test is handled entirely by the GPU.
- Implemented via
Server nickname displayed on nametag: Nametags now display the nickname set on the server (via
/rpessentials nick) instead of any locally cached nickname.MixinEntityRenderercaptures the entity being rendered via@Inject HEADinto a@Uniquefield, then resolves the nickname fromClientNametagCachein each@ModifyArg.- Fallback to the real MC username (
getGameProfile().getName()) if the server data has not yet been received — never falls back to a locally-injected nickname. - Supports LuckPerms prefix with color codes via
ColorHelper.parseColors().
Full nametag data sync on login: When a player joins, the server now sends nametag data for all currently online players to the new player (in addition to broadcasting the new player's data to everyone else).
- Both sends are deferred by 500ms via
CompletableFutureto ensure the client has finished loading before receiving the packets. - This fixes a case where players already in-game would show their local nickname to a freshly connected player whose
ClientNametagCachewas empty.
- Both sends are deferred by 500ms via
Tab list player head hidden for obfuscated players: The small face icon next to a player's name in the tab list is now hidden when that player is obfuscated (name replaced with
§k????).- Implemented via
MixinPlayerTabOverlayusing@WrapOperationwith@Local(MixinExtras) to intercept thePlayerFaceRenderer.draw()call insidePlayerTabOverlay.render(). - The
PlayerInfolocal variable is captured directly to check whether the player's display name contains§k, which is the obfuscation marker injected byMixinServerCommonPacketListenerImpl. - When obfuscated, the face draw call is simply skipped — no placeholder is drawn.
- Non-obfuscated players, staff, whitelisted players, and always-visible players are unaffected.
- Implemented via
Changed
MixinEntityRenderer: Completely rewritten.- Added
@Inject HEAD cancellable = true→ cancelsrenderNameTagentirely whenClientNametagConfig.shouldHideNametags()is true (global hide toggle). - Added
@Inject HEAD→ captures current entity intorpessentials$currentEntity. - Added
@Inject RETURN→ clearsrpessentials$currentEntity. - Added
@ModifyArg ordinal=0 index=7→ forcesFont.DisplayMode.NORMAL(depth test / block occlusion). - Added
@ModifyArg ordinal=0 index=0and@ModifyArg ordinal=1 index=0→ replaces the renderedComponentwith the server nickname. Never returnsnull(would crashdrawInBatch) — falls back tooriginalifrpessentials$resolveNicknamereturns null. - All injections use
remap = falseand the NeoForge 1.21.1 method signature...MultiBufferSource;IF)V(with the extrafloat partialTickparameter).
- Added
ClientNametagRenderer: Rewritten to useClientNametagCache(replaces the removedClientNametagConfigplayer map).- Handles
hideNametagscheck viaRpEssentialsConfig.HIDE_NAMETAGS. - Sets
event.setContent()with the nickname + prefix from cache. - Returns early (does not override content) if cache has no entry yet for the player — avoids showing stale data.
- Handles
ClientNametagConfig: Rebuilt as a minimal class — stores only thehideNametagsboolean received viaHideNametagsPacket. All advanced nametag config fields removed.NetworkHandler: RestoredHideNametagsPacketandSyncNametagDataPacketregistrations that had been accidentally dropped. All GUI admin packets also restored.RpEssentialsEventHandler: Nametag sync logic moved entirely inside theCompletableFutureblock (500ms delay). Now sends data of all currently online players to the newly joined player in addition to broadcasting the new player's data to everyone.RpEssentialsConfig: Removed unused advanced nametag config fields (NAMETAG_ADVANCED_ENABLED,NAMETAG_FORMAT,NAMETAG_OBFUSCATION_DISTANCE,NAMETAG_RENDER_DISTANCE,NAMETAG_HIDE_BEHIND_BLOCKS,NAMETAG_SHOW_WHILE_SNEAKING,NAMETAG_STAFF_ALWAYS_SEE_REAL,NAMETAG_OBFUSCATION_ENABLED). OnlyHIDE_NAMETAGS(in[Obfuscation Settings]) is kept.RpEssentialsCommands: Removed all/rpessentials config set nametag*commands that referenced the now-deleted config fields.
Removed
NametagSyncPacket.java— replaced by the already-existingSyncNametagDataPacket.NametagSyncHelper.java— logic moved directly intoRpEssentialsEventHandler.NametagFormatter.java— formatting now handled inline inMixinEntityRendererandClientNametagRenderer.NametagConfig.java— dedicated nametag config file removed; onlyHIDE_NAMETAGSsurvives inrpessentials-core.toml.- The
rpessentials-nametag.tomlconfig file is no longer generated. Existing files can be deleted safely.
Fixed
- Nametag visible through blocks — Fixed by switching
Font.DisplayModefromSEE_THROUGHtoNORMAL, activating the GPU depth test (same technique as Realistic Nametag mod). - Server nickname not shown on nametag — Fixed by reading from
ClientNametagCache(server data) instead of falling back tooriginal(which contained the locally injected nickname fromMixinServerPlayer). NullPointerExceptioninFont.drawInBatch— Fixed by ensuring@ModifyArghandlers never returnnull; they now fall back tooriginalwhenrpessentials$resolveNicknamereturns null (e.g. for the local player or non-player entities).- Players already online not synced to new joiner — Fixed by sending
SyncNametagDataPacketfor each online player to the newly connected player inRpEssentialsEventHandler. - Player head visible in tab list for obfuscated players — Fixed via
MixinPlayerTabOverlay, which now skips thePlayerFaceRenderer.draw()call for any player whose display name contains the§kobfuscation marker, preventing skin-based identification of obfuscated players.
Migration Notes
- No breaking changes for existing servers.
rpessentials-nametag.tomlis no longer loaded or generated — delete it fromconfig/rpessentials/if present.- All existing
/rpessentials config set nametag*commands have been removed. UsehideNametagsinrpessentials-core.tomlor/rpessentials config set hideNametags true/falseto control nametag visibility. - Clients connecting to a 4.1.1 server must also run 4.1.1 — the packet registry version was bumped.

