Updated to 1.21.2 and 1.21.3!
- Fixed some render issues and ordering
- Simplified code syntax
- Centralized methods
- Fixed render arrow mode
Changelog
Version: 1.1.0
Summary
Version 1.1.0 refactors the rendering architecture, introduces robust asset detection, improves client-server synchronization, adds death markers, enhances configuration capabilities, and fixes multiple bugs. Backwards compatibility with existing configs and use cases is preserved.
Major Enhancements & Additions
Rendering & Architecture
- Modular separation of rendering logic into:
RenderAddonsRenderUtilsTextureManagerTextureAnimator
- Introduction of
AssetScanner:- Scans the resource manager for textures under
sprites/hud/ - Builds lists of available dot styles, arrow styles, icon borders, death marker types
- Caches texture dimensions to avoid repeated IO
- Scans the resource manager for textures under
- Death markers persistence:
Hud.deathMarkersstore marker data with timestamp and world position- Configurable limit of death markers
- Automatic cleanup of old or out-of-range markers
- Hybrid mode operation:
- Handshake with server to detect mod presence
- Fallback to local mode if server unresponsive beyond timeout (e.g.
SERVER_TIMEOUT_MS)
- Per-player overrides:
- In config, allow per-player settings: color, icon style, border style
Detailed Changes per Component
Main / Mod Initialization
- Register payload codecs for
HandshakePayloadandPositionUpdatePayloadwithPayloadTypeRegistry - Initialize server module (
BetterPlayerLocatorBarServer) on common side - Add logging for handshake success/failure and mode switching events
Client / Initialization
- On resource reload, call
AssetScanner.reload(...) - Instantiate
Hudand registerHudRenderCallback - In
ClientPlayNetworking, register receiver for handshake and position update - Track
lastServerUpdateTime; if exceeds threshold, switch to local mode
HUD (BetterPlayerLocatorBarHud)
- Maintain maps:
playerPositionslastKnownPositionscurrentIconPositionslastPositionUpdateTime
tick()andupdateRenderCache():- Filter players by distance and
maxVisibleIcons - Sort by closeness or priority if needed
- Filter players by distance and
- Easing & interpolation:
- If distance jump is large (e.g. > 75% of bar width), snap to target
- Else, advance position using
easeInOutQuad
- Separate rendering methods:
renderPlayerIcon()renderDeathMarker()renderArrow()renderNameplate()
- Hide logic:
shouldHideTarget()checks for sneaking, invisibility, helmet usage
- Angle & FOV:
- Use
CONFIG.getFovMultiplier()to adjust icon horizontal shift
- Use
- Alpha / fading:
calculateEdgeAlpha()andgetDistanceAlpha()for smooth fade near edges or by distance
- Texture selection:
getAdjustedTextureIndex(distance, config)picks animation frame
AssetScanner
- On
reload, checks for presence of each expected texture (dots, outlines, arrows, markers, tags) - Builds lists:
availableDots,availableArrows,availableDeathMarkers, etc. - Caches texture widths and heights via
NativeImageto avoid repeated loads
RenderAddons
- Central rendering of tinted icons, outlines, names, arrows, and death markers
- Supports override of head texture by UUID or name, with fallback to default skin
renderIcon(),renderArrow(),renderNameplate()share common helper logic- Outline rendering: darker border variants computed dynamically or via presets
TextureManager
- Centralizes
Identifiercreation for texture paths - Caches
Identifierobjects to reduce allocation overhead - Standardized naming scheme:
sprites/hud/player_dots/{type}_{frame}.pngsprites/hud/player_dots_outlines/...sprites/hud/arrows/{type}.pngsprites/hud/death_markers_dots/{type}.pngsprites/hud/tags/{style}.png
TextureAnimator
- Handles time-based frame switching for animated textures (if any)
- Maintains current frame, elapsed time, duration per frame
Keybinds
- Register
SHOW_PLAYER_NAMEandOPEN_CONFIG OPEN_CONFIGopensConfigScreenviaclient.setScreen(...)
RenderUtils
- Utilities for rendering:
renderTintedTexture(...)drawNineSlicedTexture(...)withMatrixPush(...)setShaderColorRGBA(...)getTextureDimensions(...)(delegates toAssetScannercache)
Network
HandshakePayloadcontains fields:serverHasMod,playerIsOpPositionUpdatePayloadcontains:positions(): list of(UUID, Vec3d)newPlayers(): optional list of new player infodisconnectedPlayers(): list of UUIDs
- Client receives payloads and updates internal maps in thread-safe manner (via
client.execute(...))
Bug Fixes
- Prevent NPE in
AssetScannerwhen a texture is missing (check.isPresent()first) - Remove stale entries in
currentIconPositionswhen players disconnect or markers expire - Fix jumping icons when large remote deltas: implement snapping threshold
- Fix fallback logic when
textureHeadOverrideis non-UUID string; add resolution fromusercache.json - Clamp angle calculations so icons outside the horizontal range don’t render incorrectly
- Fix mod/mixin registration: ensure
BetterPlayerLocateBar.mixins.jsondeclared correctly - Ensure name rendering only when Tab is held or always enabled via config
Performance & Optimization
- Cache texture dimensions in
AssetScannerto avoid repeating image loads - Cache
Identifierobjects inTextureManager - Pre-limit icon rendering count by
maxVisibleIconsbefore layout computation - Maintain intermediate render caches (
positionsToRenderCache) to avoid recomputation each frame - Asset scan only on resource reload, not every frame
- Minimize temporary allocations in loops (reuse collections, use
computeIfAbsent,subList)
Configuration & UX Enhancements
- Added config options:
deathMarkerInheritBorderColordeathMarkerBorderStyleassetScanner.textureslistadjust_to_fov,fov_multiplier
- ConfigScreen improvements:
- Renders real-time preview of names and icons
- Shows detected textures from
AssetScannerin dropdowns
- HUD offset auto-applied if icons present (
shouldApplyHudOffset()logic)
Client-Server Integration
- Server module now actively gathers player positions at interval
- Client handshake verifies server mod and sets flags accordingly
- If server stops sending updates, client falls back to local mode
PositionUpdatePayloadsends full updates so client can reconstruct state
Robustness & Edge Cases
- UUID parsing wrapped in try/catch to avoid crashes
- File I/O (e.g.
usercache.json) wrapped with existence checks - Clear logs in
Constants.LOGGERfor mode switching and error conditions
Regression Risk & Testing
- Tested:
- Mode switching (server vs local)
- Name rendering via Tab
- Death markers creation and cleanup
- Asset detection when adding custom textures
- Edge cases:
- Player wearing helmet/skull — head override logic
- Invisible or sneaking players
- Large jumps in position between updates
Previous Version (1.0.0) — Summary
- Basic HUD rendering of nearby players
- Automatic colors, simple interpolation
- Static icon style, no death markers
- Minimal configuration
Notes
- This version emphasizes stability, modularity, and configurability
- If regressions occur, open issues with logs, steps to reproduce, and version info
Fixed Fabric Loader incompatibility issue for newer versions
Mod Changelog - Versions 1.21 & 1.21.1
UI & Visual Enhancements
- Redesigned and improved configuration screen, offering a sleek and more intuitive interface.
- Custom widgets inspired by Mojang's existing UI elements for a seamless and familiar experience.
- Fully restyled icons, delivering a modern and polished look.
HUD Improvements
- Enhanced HUD interaction—visibility of XP bar icons now dynamically affects the overall interface behavior.
Performance & Code Optimization
- Major code refactoring to ensure optimal performance and efficiency across all systems.
v0.2.1 - BETA | Network & Rendering Overhaul
Core Changes
- Added dual-mode operation (Server Mode and Local Mode)
- Implemented automatic handshake system for mod detection
- Added 5-second timeout for server updates before switching to local mode
Network Improvements
- New payload registration system compatible with Minecraft 1.21 / 1.21.1
- Server now initiates handshake when players join
- Improved network efficiency with 2-tick update intervals
Rendering Fixes
- Complete rendering logic overhaul
- Fixed player position sorting and display issues
- Improved handling of edge cases in both modes
New Features
- Added server compatibility detection
- Configurable distance-based fading
- Automatic fallback to local detection when needed
Bug Fixes
- Fixed all compilation errors from previous version
- Resolved variable scope conflicts
- Corrected player visibility checks
- Fixed timeout detection logic
Configuration Updates
- Added new config options for fade distances
- Added force local mode option
- Maintained backward compatibility with old configs
Optimizations
- Reduced network overhead
- Improved client-side caching
- Better connection state handling
Known Issues
- Player visibility may still be limited on some servers in local mode
- Initial detection may take 1-2 seconds after joining
Migration Notes
- Servers need v0.2.1 - BETA for full functionality
- Clients automatically handle fallback to local mode
- Existing configs remain compatible but gain new options
🖥️ Customizable Interface
- Rounded icons representing players.
- Dynamic colors with join animations.
- Stylized borders with smooth gradients.
- Smooth animations using
lerp. - Height indicator (arrow showing if a player is above or below).
- Progressive transparency based on distance (fades at 100 blocks, nearly invisible at 5000).
- Option to display the player’s head instead of a colored icon.
🎮 Enhanced User Experience
- Smooth movements with interpolation.
- "Show Names" mode when pressing
Tab. - Automatic adjustment of the experience and status bars when interacting with the HUD.
📡 Server Synchronization
- Real-time location tracking of other players in the bar.
- Detect nearby players without needing a minimap.
- Supports official and TL Skin skins.
- Persistent data storage for players outside render distance.
⚙️ Advanced Configuration
- Complete settings menu (
F8). - Modify some of active functions.
- Coming JSON configuration editor (Experimental and maybe not functional).
- HUD bar implementation above the experience bar.
- Player tracking system with position-based icon placement.
- Dynamic icon scaling based on distance and screen edges.
- Smooth animations for icon movement.
- Height difference indicators with arrows.
- Basic skin support (official skins only).
- Performance optimizations for real-time tracking.
Full Changelog: Changelog



