A Fabric client mod that provides enhanced rendering capabilities for Minecraft Java Edition clients connecting to Bedrock servers via ViaProxy + ViaBedrock.
Inspired by BedrockSkinUtility, with some code reused from ViaBedrock.
- Custom Entity Rendering — Parses Bedrock geometry models, render controllers, and skeletal animations to render Bedrock custom entities on the Java Edition client
- Custom Player Skins — Supports Bedrock custom geometry skin models, capes, and animated skin overlays (blinking animations, etc.)
- Bedrock Camera API — Camera presets, position/rotation easing, fade in/out, camera shake
- Animation LOD System — Distance-based animation level-of-detail to optimize performance for distant entities
Bedrock Server
↓ Bedrock Protocol
ViaProxy (Proxy)
├── ViaBedrock (Protocol Translation)
│ ↓ Custom Payload
└── ViaBedrockUtility (Fabric Mod, this project)
├── Custom Entity Rendering
├── Custom Player Skins
└── Bedrock Camera API
↓
BECamera (Fabric Mod, camera library)
ViaBedrock handles Bedrock → Java protocol translation on the proxy side, while forwarding data that Java Edition cannot natively express (custom entity models, Bedrock skins, camera instructions, etc.) to the client mod via Custom Payload channels:
| Channel | Direction | Purpose |
|---|---|---|
viabedrockutility:data |
S→C | Entity model requests, animation data, skin/cape data |
becamera:data |
S→C | Camera presets, instructions, shake |
| Component | Description |
|---|---|
CustomEntityTicker |
Per-entity state machine managing MoLang scope, render controller evaluation, and animation condition computation |
CustomEntityRenderer |
Entity renderer managing Animator instances with multi-model blended animations |
CustomEntityModel |
Model wrapper supporting Bedrock bone visibility control |
McBoneModel / ModelPartBoneTarget |
Adapter layer wrapping Minecraft ModelPart as BedrockMotion IBoneModel/IBoneTarget |
GeometryUtil |
Bedrock geometry → Minecraft Model conversion, handling coordinate system differences and UV scaling |
Rendering Pipeline:
- ViaBedrock sends
MODEL_REQUESTpayload (entity identifier, variant, skin ID, etc.) CustomEntityTickerevaluates render controllers based on entity definition to determine current models/materials/texturesCustomEntityRendererevaluates animation conditions each frame (MoLang expressions as blend weights) to drive skeletal animations- LOD system reduces animation update frequency for distant entities
| Component | Description |
|---|---|
PayloadHandler |
Manages chunked skin data reception and assembly |
CustomPlayerRenderer |
Custom player renderer with texture override and animation overlay support |
AnimatedSkinOverlay |
Animated skin overlays supporting LINEAR (sequential frame) and BLINKING (automatic eye blink) playback modes |
PlayerAnimationManager |
Manages Bedrock animation overrides for players, handling axis clearing against vanilla animations |
PlayerSkinBuilder |
Cross-version compatible SkinTextures builder |
Skin Data Flow:
SKIN_INFORMATION— Skin dimensions, geometry JSON, chunk countSKIN_DATA× N — Chunked RGBA texture data transmissionCAPE— Cape texture (optional)SKIN_ANIMATION_INFO+SKIN_ANIMATION_DATA— Animated overlay layers (optional)
| Component | Description |
|---|---|
CameraPayloadHandler |
Processes camera instructions, shake, and presets |
CameraPresetsPayload |
Decodes server-registered camera presets (with parent inheritance) |
CameraInstructionPayload |
Camera set (position/rotation/easing), clear, fade in/out |
CameraShakePayload |
Positional/rotational camera shake |
Powered by the BECamera library for camera state management and Mixin injection.
Configuration UI available via ModMenu or Sodium:
- Animation LOD Presets: HIGH_QUALITY (no LOD), BALANCED, PERFORMANCE, CUSTOM
- Custom Tiers: Control animation update frequency by distance threshold and frame interval
CubeConverter ← Bedrock geometry model parsing
↓
BedrockMotion ← Skeletal animation engine (MoLang / animation controllers / render controllers)
↓
ViaBedrockUtility ← This project
↓
BECamera ← Bedrock Camera API library (camera control / path interpolation)
| Dependency | Version | Source | Description |
|---|---|---|---|
| CubeConverter | 1.3 | mavenLocal / JitPack | Bedrock geometry model parsing |
| BedrockMotion | 1.0.0 | mavenLocal / JitPack | Skeletal animation engine |
| BECamera | 1.2.0 | mavenLocal | Bedrock Camera API |
| Fabric API | 0.119.5 ~ 0.141.3 | Maven | Varies by MC version |
| Fabric Loader | ≥0.18.0 | Maven | |
| Lombok | 1.18.36 | Maven | Compile-time annotation processing |
Multi-version builds via Stonecutter:
1.21.5 · 1.21.6 · 1.21.7 · 1.21.8 · 1.21.9 · 1.21.10 · 1.21.11
Active development version is 1.21.11, with version-conditional compilation via //? if >=1.21.9 { comment syntax.
- ViaProxy — Proxy server through which the Java client connects to Bedrock servers
- ViaBedrock — ViaProxy plugin that performs Java ↔ Bedrock protocol translation
- ViaBedrockUtility — This mod, installed on the Fabric client
- BECamera — For Bedrock Camera API support (already included as a dependency)
- ModMenu / Cloth Config — Graphical configuration UI
- Sodium — 1.21.11+ can integrate with Sodium's config panel
- Install Fabric Loader and Fabric API
- Place
viabedrockutility-mc<version>-1.0.0.jarandbedrockcameralib-mc<version>-1.2.0.jarinto the clientmods/directory - Configure ViaProxy to connect to a Bedrock server
- Launch the game and connect through the ViaProxy proxy
Note: Choose the jar that matches your Minecraft client version. Do not use the root-level
viabedrockutility-1.0.0.jar(that's the base version for 1.21.5). Version-specific jars are located underversions/<MC version>/build/libs/.
- JDK 21+
- Dependency projects published to mavenLocal (see below)
# 1. Build and publish CubeConverter
cd CubeConverter && ./gradlew publishToMavenLocal
# 2. Build and publish BedrockMotion
cd BedrockMotion && ./gradlew publishToMavenLocal
# 3. Build and publish BECamera
cd BECamera && ./gradlew publishToMavenLocal
# 4. Build ViaBedrockUtility (all MC versions)
cd ViaBedrockUtility && ./gradlew chiseledBuildBuild artifacts are located at versions/<MC version>/build/libs/viabedrockutility-mc<version>-1.0.0.jar.
If using ViaProxyWorkspace, you can build in one step:
cd ViaProxyWorkspace && ./gradlew buildViaBedrockUtilityGitHub Actions automatically builds all dependencies from source (bypassing JitPack cache issues):
CubeConverter → BedrockMotion → BECamera → ViaBedrockUtility
Each dependency is published to mavenLocal first, then chiseledBuild builds all MC versions.
See the LICENSE file.