La cámara se controla enviando un paquete SetServerCamera con un objeto ServerCameraSettings.
Ejemplo de cámara en tercera persona:
ServerCameraSettings settings = new ServerCameraSettings();
settings.distance = 10.0f; // Distancia al jugador
settings.isFirstPerson = false; // Modo tercera persona
settings.positionLerpSpeed = 0.2f; // Suavizado al seguir al jugador
playerRef.getPacketHandler().writeNoCache(
new SetServerCamera(ClientCameraView.Custom, true, settings)
);
Para restablecer la cámara a la configuración predeterminada:
playerRef.getPacketHandler().writeNoCache(
new SetServerCamera(ClientCameraView.Custom, false, null)
);
Presets de Cámara
Vista Superior (Estilo RTS/ARPG)
Fuente: PlayerCameraTopdownCommand
ServerCameraSettings settings = new ServerCameraSettings();
settings.positionLerpSpeed = 0.2f;
settings.rotationLerpSpeed = 0.2f;
settings.distance = 20.0f;
settings.displayCursor = true;
settings.isFirstPerson = false;
settings.movementForceRotationType = MovementForceRotationType.Custom;
settings.movementForceRotation = new Direction(-0.7853981634f, 0.0f, 0.0f); // 45° izquierda
settings.eyeOffset = true;
settings.positionDistanceOffsetType = PositionDistanceOffsetType.DistanceOffset;
settings.rotationType = RotationType.Custom;
settings.rotation = new Direction(0.0f, -1.5707964f, 0.0f); // Mirando hacia abajo
settings.mouseInputType = MouseInputType.LookAtPlane;
settings.planeNormal = new Vector3f(0.0f, 1.0f, 0.0f); // Plano del suelo
Lateral (Side-Scroller, Estilo 2D)
Fuente: PlayerCameraSideScrollerCommand
ServerCameraSettings settings = new ServerCameraSettings();
settings.positionLerpSpeed = 0.2f;
settings.rotationLerpSpeed = 0.2f;
settings.distance = 15.0f;
settings.displayCursor = true;
settings.isFirstPerson = false;
settings.movementForceRotationType = MovementForceRotationType.Custom;
settings.movementMultiplier = new Vector3f(1.0f, 1.0f, 0.0f); // Bloquea eje Z
settings.eyeOffset = true;
settings.positionDistanceOffsetType = PositionDistanceOffsetType.DistanceOffset;
settings.rotationType = RotationType.Custom;
settings.mouseInputType = MouseInputType.LookAtPlane;
settings.planeNormal = new Vector3f(0.0f, 0.0f, 1.0f); // Plano lateral
Configuración Común Explicada
Posición y Rotación
positionLerpSpeed(0.0-1.0): Suavizado de la posición al seguir al jugador. Más bajo = más lento pero más fluido.rotationLerpSpeed(0.0-1.0): Suavizado de la rotación de la cámara.distance: Distancia de la cámara al jugador.rotation: Ángulo de la cámara (Direction(yaw, pitch, roll)en radianes).rotationType: Tipo de cálculo de la rotación.Customusa el valor definido enrotation.
Alineación del Movimiento
movementForceRotationType:AttachedToHead: el movimiento sigue la dirección de la mirada del jugador.Custom: usamovementForceRotation.
movementForceRotation: Dirección personalizada para los movimientos W/S, alineada con el yaw de la cámara y pitch = 0.
Entrada y Visualización
displayCursor: Muestra u oculta el cursor del ratón.mouseInputType:LookAtPlane: mueve cursor sobre un plano (ideal para top-down).LookAtTarget: rota la cámara hacia el objetivo.
planeNormal: ParaLookAtPlane, define el plano sobre el que se mueve el cursor.(0,1,0)= suelo.
Avanzado
positionDistanceOffsetType:DistanceOffset: distancia simple.DistanceOffsetRaycast: evita que la cámara atraviese paredes.
eyeOffset: Desplaza la cámara desde los ojos del jugador.movementMultiplier: Escala movimiento por eje.(1,1,0)= bloquea eje Z para movimiento 2D.
Importaciones Necesarias
import com.hypixel.hytale.protocol.ClientCameraView;
import com.hypixel.hytale.protocol.Direction;
import com.hypixel.hytale.protocol.MouseInputType;
import com.hypixel.hytale.protocol.MovementForceRotationType;
import com.hypixel.hytale.protocol.PositionDistanceOffsetType;
import com.hypixel.hytale.protocol.RotationType;
import com.hypixel.hytale.protocol.ServerCameraSettings;
import com.hypixel.hytale.protocol.Vector3f;
import com.hypixel.hytale.protocol.packets.camera.SetServerCamera;
Consejos Prácticos
- Ajusta zoom con
distance(mayor = más alejada). - Controla suavidad con
positionLerpSpeedyrotationLerpSpeed. - Evita que la cámara atraviese paredes con
DistanceOffsetRaycast. - Bloquea la cámara con
isLocked = true. - Para movimiento 2D, usa
movementMultiplierpara inhabilitar un eje. - Cámaras isométricas: siempre alinea
movementForceRotationcon el yaw de la cámara. - Convierte ángulos a radianes:
Math.toRadians(degrees)odegrees * Math.PI / 180.0.
- Basado en Hytale Server build
2026.01.13-dcad8778f.
