Compatibility
Minecraft: Java Edition
1.21–1.21.3
Platforms
Supported environments
Creators
Details
Changelog
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
Dependencies
Files
Metadata
Release channel
ReleaseVersion number
v1.1.0Loaders
Game versions
1.21–1.21.1Downloads
185Publication date
October 19, 2025 at 12:18 PMPublisher

Bichal
Owner


