Description
Unobstructed Third Person Camera Plugin
Outdated Description - in need of some updates I do not recommend tweaking any settings with the radius command, just use the presets at the moment
A Hytale server plugin that provides a fully functional third-person camera system with server-authoritative block/entity interaction correction, automatic block transparency around the camera, and pitch-based first-person toggling.
Recommended Asset Pack: My Third Person Pack
Features
- Camera Transparency Volume — Automatically makes blocks transparent in an ellipsoid around the camera so the view is never obstructed by nearby geometry
Pitch-Based First-Person Toggle — Automatically switches to first-person view when looking steeply up or down (beyond ±55°), then back to third-person when the angle normalizes- Command runs default settings per player when they join the world
Commands
/UnobstructedCamera (aliases: /NoClipCamera, /UCamera, /UC)
The main command group for controlling the camera.
| Subcommand | Description | Usage |
|---|---|---|
Start |
Activates the third-person camera | /UC Start [--radius] |
Stop |
Deactivates the camera and restores defaults | /UC Stop |
Start accepts an optional Radius float argument to set the transparent area Radius(default: 6.0).
Examples:
/UC Start — Start with default radius(6.0)
/UC Start --radius 10.0 — Start with camera 10 blocks behind
/UC Stop — Return to default camera
How It Works
Camera Activation Flow
- Player runs
/UC Start - A
CameraTransparencyVolumewith a radius-5 ellipsoid is created - The
SetServerCamerapacket is sent to the client
Camera Transparency Volume
To prevent the camera from being inside solid blocks (common in third-person views near walls/ceilings)
- Computes the camera's block-space position each tick
- Maintains an ellipsoidal volume of block positions around the camera anchor
- Sends fake transparent block types to the client via
UpdateBlockTypespackets - Uses
ServerSetBlockto swap real blocks for transparent variants on the client - Restores original blocks when they leave the volume or the camera is deactivated
- Resets all tracking state on player reconnect to avoid stale texture references
Future Features
- ⏹️ Add small delay to loading/unloading transparent blocks or a buffer area to prevent "Flickering"
- ⏹️ Improve compatibility with ladders
- ⏹️ Secondary layer of transparent blocks to ease transition
- ⏹️ Add a "Shadow" object bellow the player's feet so that when looking down, the player has a reference for location
- 🔽 Further enhanced asset editor capabilities
- ✅ Include camera collision when camera would go below feet
- ✅ Default override for camera perspective switching
Known Bugs
- 🐞 Switching between camera modes can cause the camera to clip through the ground
- 🐞 Ghost blocks can be created if breaking a block inside the "Transparent" block ellipsoid
- ☑️
Incompatibility warning for Update 3 - ☑️
Inconsistent crashes when turning certain objects transparent - ☑️
First time running the command causes some blocks' texture to be null. - ☑️
This is resolved when turning the camera around to load new blocks. - ☑️ When the mod is loaded, you have to use the command to switch between first and third person perspective
- ☑️
Preview block placement and block selection are broken on the client side - ☑️
When facing south, the ability to break blocks can be inconsistent. - ☑️
In some cases, you may not be able to break blocks when teleporting to new worlds
Lost Feature - Planned to be added back
### Pitch-Based First-Person Toggle When the player looks steeply up or down (beyond ±55° from horizontal), the plugin automatically switches removes the player character from the view. This prevents awkward camera angles when looking at the player's feet or straight up. The toggle only sends a `SetServerCamera` packet when the state actually changes, avoiding packet spam.
Removed Items for performance and reliability
2. `CustomCameraSettings` creates a `ServerCameraSettings` with: * `distance = 3.0` (or custom), `positionOffset = (0, 1, 0)`, `eyeOffset = true` * `isFirstPerson = false`, `displayReticle = true` * Position/rotation lerp speeds of `0.9` 3. `InteractionPositionFixer` is enabled for the player and receives the camera settings ### Interaction Position Fixing Hytale's interaction system is client-authoritative: the client calculates which block the reticle is on and sends that position to the server. In a custom third-person camera, the client's target can differ from what the server expects because the server doesn't natively account for the camera offset. `InteractionPositionFixer` solves this by: 1. Running a server-side raycast every 100ms from the camera origin (`eyePos + positionOffset`) along the player's look direction 2. The raycast skips blocks made transparent by `CameraTransparencyVolume` (using `TargetUtil.getTargetBlockAvoidLocations`) 3. Intercepting inbound `SyncInteractionChains` packets and rewriting block/entity positions to match the server's computed target 4. Killing duplicate `ClientPlaceBlock` packets and resyncing ghost blocks at the client's predicted position 5. Correcting the `BlockFace` for placement interactions so connected blocks orient correctly ## Default Camera Settings | Setting |Value | | ----------------- |--------- | |
distance |3.0 | | positionOffset |(0, 1, 0) | | eyeOffset |true | | isFirstPerson |false | | displayReticle |true | | positionLerpSpeed |0.9 | | rotationLerpSpeed |0.9 |

