Protocolo de servidor clásico

Quien soy
Pau Monfort
@paumonfort
Autor y referencias
Se ha sugerido dividir esta página. [discutir] Si esta división puede ser potencialmente controvertida, no se separe hasta que se haya alcanzado un consenso.
Razón: La información desactualizada y actualizada se está mezclando en la página del protocolo de servidor desactualizado. Nota: Es un protocolo "Clásico", no "Actual". Los contenidos de esta página no son compatibles con Mojang Studios o Minecraft .  Esta función es exclusiva de Java Edition. 

Documentación sobre el protocolo de servidor utilizado por el servidor Minecraft Classic Creative.



Contenido

  • 1 Comunicación de Minecraft.net
    • 1.1 Latidos del corazón
    • 1.2 Autenticación de usuario
  • Protocolo de 2 paquetes
    • 2.1 Tipos de datos de protocolo
    • 2.2 Cliente → Paquetes de servidor
    • 2.3 Servidor → Paquetes de cliente
  • Posición de 3 jugadores
    • 3.1 Punto fijo
    • 3.2 Pararse sobre las cosas
    • 3.3 Orientación
  • 4 códigos de colores

Comunicación de Minecraft.net

Los latidos del corazón

Para poder conectarse a un servidor en Minecraft Classic desde la Lista de servidores, un servidor debe transmitir a minecraft.net un llamado "latido" cada pocos minutos.



El servidor de valores transmite este latido cada 45 segundos.

Un "latido" toma la forma de una solicitud HTTP a https://minecraft.net/heartbeat.jsp. Después de enviar un latido, se devuelve la URL del servidor.

Es fundamental para un latido exitoso que omita "www" en la solicitud HTTP, ya que lo apuntará como un URI, no como una URL.

Puede ser una solicitud GET o POST. A continuación se muestra una tabla de los parámetros requeridos:

Nombre Detalles
Puerto Número de puerto del servidor. Suele ser 25565
max Número máximo de jugadores en el servidor
nombre El nombre del servidor
público Si el servidor es público (es decir, aparece en el lobby) o no. Puede ser Verdadero or Falso, en esa capitalización.
versión Versión de Minecraft, debería ser 7
sal Una sal de base 16 aleatoria de 62 caracteres
usuarios Número de usuarios conectados al servidor

La forma más sencilla de enviar un latido es abrir un socket TCP al puerto 80 en minecraft.net y enviar lo siguiente (con los valores cambiados, obviamente):

GET /heartbeat.jsp?port=25565&max=32&name=My%20Server&public=True&version=7&salt=wo6kVAHjxoJcInKx&users=0, más un CRLF (retorno de carro y salto de línea).


Asegúrese de que se escapen las cadenas, como el nombre.

Si todo va bien, en el cuerpo de la respuesta recibirás una URL del servidor. De lo contrario, obtendrá un bonito mensaje de error HTML. No hay encabezados HTML para analizar, ya que la versión HTTP no está especificada, por lo que se usa HTTP / 0.9, que no tiene encabezados.


Autenticacion de usuario

La "clave" proporcionada cuando un usuario se une al servidor se puede comparar con la suma de comprobación MD5 de la "sal" del servidor más el nombre de usuario para verificar que el usuario haya iniciado sesión en minecraft.net con ese nombre de usuario. Esto es útil para establecer suficiente confianza en el nombre proporcionado para prohibir u oprimir al jugador por su nombre.

if (player.key == md5 (server.salt + player.name)) {// el jugador ha iniciado sesión a través de minecraft.net} else {// el jugador está falsificando el nombre de usuario}

Esta es también la forma en que Notch evita que los clientes "pirateados" o pirateados accedan a los servidores en línea. Cuando un cliente crackeado intenta conectarse a un servidor en línea, aparecerá un error en la pantalla de conexión que dice: "Error al conectar: ​​el usuario no es Premium".

Nota: Esto significa que debe asegurarse de que su "sal" se mantenga en secreto y se comparta solo con heartbeat.jsp. Si la "sal" de su servidor es visible en cualquier lugar para los usuarios, es trivial para los usuarios producir "claves" de apariencia válida sin haber iniciado sesión en minecraft.net.


Protocolo de paquetes

Cada paquete comienza con un byte que representa el ID del paquete.

Tipos de datos de protocolo

Tipo Tamaño [bytes] Descripción
Byte 1 Entero de un solo byte (0 a 255)
SByte 1 Entero de un solo byte con signo (-128 a 127)
Corto 2 Entero con signo, orden de red (-32768 a 32767)
Cordón 64 Cadena codificada US-ASCII / ISO646-US rellenada con espacios (0x20)
Matriz de bytes 1024 Datos binarios rellenados con bytes nulos (0x00)

Paquetes de cliente → servidor

ID de paquete Propósito campo Descripción Tipo de campo
0x00 Identificación del jugador ID de paquete Byte Enviado por un jugador que se une a un servidor con información relevante. La versión actual del protocolo es 0x07.
Versión del protocolo Byte
Usuario Cordón
Clave de verificación Cordón
No usado Byte
0x05 Establecer bloque ID de paquete Byte Enviado cuando un usuario cambia un bloque. El campo de modo indica si se creó un bloque (0x01) o se destruyó (0x00).

El tipo de bloque es siempre el tipo que el jugador sostiene (incluso al eliminar).


El cliente asume que este paquete de comando siempre tiene éxito y, por lo tanto, dibuja el nuevo bloque inmediatamente. Para no permitir la creación de bloques, el servidor debe devolver el paquete Set Block con el tipo de bloque antiguo.

Las coordenadas XYZ del bloque son solo números enteros que representan la coordenada del bloque. (A diferencia de las coordenadas del jugador donde los 5 bits inferiores son coordenadas fraccionarias)

X Corto
Y Corto
Z Corto
Moda Byte
Tipo de bloque Byte
0x08 Posición y orientación ID de paquete Byte Enviado con frecuencia (incluso cuando no está en movimiento) por el jugador con la ubicación y orientación actual del jugador. El ID del jugador es siempre 255, refiriéndose a sí mismo. Las coordenadas del jugador son valores de punto fijo con los 5 bits más bajos que representan la posición fraccionaria (es decir, dividir por 32 para obtener la posición real en términos de coordenadas de bloque). Los parámetros de ángulo se escalan de manera que un valor de 255 correspondería a 360 grados.
ID de jugador Byte
X Corto
Y Corto
Z Corto
Guiñada (rumbo) Byte
Paso Byte
0x0d Mensaje ID de paquete Byte Contienen mensajes de chat enviados por el jugador.
Sin usar, tal vez el color del mensaje Byte (0xFF)
Mensaje Cordón

Servidor → Paquetes de cliente

ID de paquete Propósito campo Descripción Tipo de campo
0x00 Identificación del servidor ID de paquete Byte Respuesta a un jugador que se une. El tipo de usuario indica si un jugador es una operación (0x64) o no (0x00) La versión actual del protocolo es 0x07.
Versión del protocolo Byte
Nombre del servidor Cordón
Servidor MOTD Cordón
Tipo de usuario Byte
0x01 Ping ID de paquete Byte Enviado a clientes periódicamente. La única forma en que un cliente puede desconectarse en este momento es forzar su cierre, lo que no deja saber al servidor. El paquete de ping se utiliza para determinar si la conexión aún está abierta.
0x02 Inicializar nivel ID de paquete Byte Notifica al jugador de los datos de nivel entrantes.
0x03 Trozo de datos de nivel ID de paquete Byte Contiene un fragmento de mapa comprimido con gzip (no el archivo level.dat). Después de la descompresión, el mapa consta de un int (4 bytes) que contiene el número de bloques + matriz de mapa sin procesar. (el fragmento tiene hasta 1024 bytes, relleno con 0x00 si es menos).
Longitud del trozo Corto
Chunk Data Matriz de bytes
Porcentaje completo Byte
0x04 Finalizar nivel ID de paquete Byte Se envía después de que los datos del nivel estén completos y proporcionen las dimensiones del mapa. La coordenada y es la altura del mapa.
Talla x Corto
Tamaño Y Corto
Tamaño Z Corto
0x06 Establecer bloque ID de paquete Byte Enviado para indicar un cambio de bloque por la física o por los jugadores. En el caso de un cambio de jugador, el servidor también hará eco del cambio de bloqueo al jugador que lo inició.
X Corto
Y Corto
Z Corto
Tipo de bloque Byte
0x07 Reproductor de generación ID de paquete Byte Enviado para indicar dónde está apareciendo un nuevo jugador en el mundo. La posición y la orientación se codifican de la misma manera que para el paquete 0x08 a continuación.
ID de jugador SByte
Nombre del jugador Cordón
X Corto
Y Corto
Z Corto
Guiñada (rumbo) Byte
Paso Byte
0x08 Posición y orientación (Teletransporte de jugador) ID de paquete Byte Enviado con cambios en la posición y rotación del jugador. Teletransporta al jugador al que se envía si el ID del jugador es <0 (para enviar la posición inicial en el mapa y / tp)
ID de jugador SByte
X Corto
Y Corto
Z Corto
Guiñada (rumbo) Byte
Paso Byte
0x09 Actualización de posición y orientación ID de paquete Byte Enviado con cambios en la posición y rotación del jugador. Se envía cuando se cambia la posición y la orientación al mismo tiempo.

No es necesario para el funcionamiento del servidor.

ID de jugador SByte
Cambio en X SByte
Cambio en Y SByte
Cambio en Z SByte
Guiñada (rumbo) Byte
Paso Byte
0x0a Actualización de posición ID de paquete Byte Enviado con cambios en la posición del jugador.

No es necesario para el funcionamiento del servidor.

ID de jugador SByte
Cambio en X SByte
Cambio en Y SByte
Cambio en Z SByte
0x0b Actualización de Orientación ID de paquete Byte Enviado con cambios en la rotación de jugadores.

No es necesario para el funcionamiento del servidor.

ID de jugador SByte
Guiñada (rumbo) Byte
Paso Byte
0x0c Jugador desaparecido ID de paquete Byte Enviado cuando el jugador se desconecta.
ID de jugador SByte
0x0d Mensaje ID de paquete Byte Mensajes enviados por chat o desde la consola.
ID de jugador SByte
Mensaje Cordón
0x0e Desconectar jugador ID de paquete Byte Enviado a un jugador cuando está desconectado del servidor.
  1. "Truco detectado: Distancia": ocurre no solo cuando se coloca un mosaico demasiado lejos del jugador (¿qué tan lejos está la distancia máxima y cómo se mide?), Sino también cuando el jugador se mueve y luego construye inmediatamente.
  2. "Truco detectado: tipo de mosaico"
Motivo de desconexión Cordón
0x0f Actualizar el tipo de usuario ID de paquete Byte Enviado cuando un jugador es optado / retirado

Dará o eliminará la capacidad del cliente de romper los bloques de Bedrock

  1. El tipo de usuario puede ser 100, que permitirá al jugador, o 0, que no permitirá que el jugador rompa bloques de Bedrock.
Tipo de usuario Byte

Posición de jugador

Punto fijo

La posición del jugador se representa mediante coordenadas de punto fijo X, Y y Z. La porción fraccionaria es de 5 bits, por lo que dividiendo los enteros cortos recibidos en los paquetes de actualización de posición por 32, tendrá coordenadas de punto flotante para el jugador. Esta posición corresponde al centro de la ventana del cliente.

De pie sobre las cosas

La parte inferior de los pies del jugador se encuentra 1.59375 (punto fijo: 51) unidades debajo del centro de la ventana, por lo que para colocar al jugador en la parte superior de un bloque en particular, podría enviar un paquete de teletransporte (0x08) especificando un valor Y basado en la posición del bloque como: (Y x 32 + 51)

Orientación

Un valor de guiñada de 0 significa que el jugador está mirando en la dirección Z- (Z negativa). Este valor aumenta en el sentido de las agujas del reloj como se ve desde arriba. Si llamamos "Norte" a la dirección Z negativa, entonces una guiñada de 64 significa "Este", 128 significa "Sur" y 192 significa "Oeste".

Un valor de tono de 0 significa nivel y este valor aumenta en dirección descendente. 64 está inactivo y 192 está activo. Los valores de 65 a 191 nunca deben ocurrir porque el jugador no puede mirar más hacia arriba o hacia abajo que el rango 64 → 0, 255 → 192. Sin embargo, el cliente de Minecraft Classic no ignora los valores no válidos, por lo que es posible poner las cabezas de los jugadores "al revés".

Codigos de color

Este artículo trata sobre el protocolo de servidor clásico. Para conocer los códigos de color actualizados que se utilizan en la versión actual de Minecraft, consulte Códigos de formato.

Los mensajes enviados desde el servidor al cliente pueden contener códigos de color, que permiten colorear el texto para diversos fines.

Un símbolo comercial (&) seguido de un dígito hexadecimal en el mensaje le dice al cliente que cambie de color mientras muestra el texto. La versión actual del juego usa un símbolo de sección (§), pero la versión 0.30 usa símbolos de unión. Para conocer los códigos de formato de la versión actual del juego, consulte Códigos de formato.

La codificación de colores al comienzo del mensaje solo funcionará si el byte de ID del jugador es menor que 127. Si es 127 o más, el juego agrega automáticamente & e antes del mensaje, haciéndolo amarillo. Sin embargo, los códigos de color después del primer carácter siguen funcionando. Si usa un ID por debajo de 127, no agrega un código de color, por lo que los que usa funcionarán.

Mapeo de dígitos hexadecimales a color.

Muestra Código Nombre común Nombre alternativo Color de primer plano Color de fondo
R G B MALEFICIO R G B MALEFICIO
&0 Negro Negro 0 0 0 #000 0 0 0 #000000
&1 Azul oscuro Azul 0 0 170 #00A 0 0 42 #00002A
&2 Verde Oscuro Verde 0 170 0 #0A0 0 42 0 #002A00
&3 Teal Teal 0 170 170 # 0AA 0 42 42 # 002A2A
&4 Rojo Oscuro Granate 170 0 0 # A00 42 0 0 #2A0000
&5 Morado Morado 170 0 170 # A0A 42 0 42 # 2A002A
&6 Amarillo oscuro Oro 170 170 0 #AA0 42 42 0 # 2A2A00
&7 Gray Plata 170 170 170 #AAA 42 42 42 # 2A2A2A
&8 Gris oscuro Gray 85 85 85 #555 21 21 21 #151515
&9 Índigo Blue 85 85 255 #55F 21 21 63 #15153F
&a Verde brillante Limón 85 255 85 # 5F5 21 63 21 # 153F15
&b Cian Aqua 85 255 255 # 5FF 21 63 63 # 153F3F
&c Rojo Rojo 255 85 85 # F55 63 21 21 # 3F1515
&d Rosa Rosa 255 85 255 # F5F 63 21 63 # 3F153F
&e Amarillo Amarillo 255 255 85 # FF5 63 63 21 # 3F3F15
&f Blanco Blanco 255 255 255 #FFF 63 63 63 # 3F3F3F
Edición Java
versiones
  • Demo
    • Localizaciones
  • Demostración de jugador de PC (Beta 1.3)
Desarrollo
Historial de versiones
  • Preclásico
  • Clásico
    • Creatividad clásica temprana
    • Prueba multijugador
    • Prueba de supervivencia
    • Creativo del Clásico Tardío
  • Indev
  • Infdev
  • Alpha
  • Beta
  • Versión completa
  • Versiones de desarrollo
  • Funciones eliminadas
    • Bloques
    • artículos
  • Funciones no utilizadas
  • Características exclusivas
  • Funciones mencionadas
    • Dimensión del cielo
  • Versiones planificadas
Apoyo técnico
  • Errores conocidos
    • Plataforma de Minecraft
  • Requisitos de hardware
  • al_version
  • Entidad de bloque
  • Comandos
    • Las funciones clave
  • Accidentes
  • Valores de datos
    • Clásico
    • Indev
    • Pre-aplanamiento
  • Versión de datos
  • Pantalla de depuración
  • Formatear códigos
  • Códigos clave
  • Plataforma de Minecraft
  • Versión del protocolo
  • Ubicación del recurso
  • Captura de pantalla
  • Semilla
  • Estadística
  • garrapata
  • Fragmento de desove
  • Coordenadas
.Minecraft
  • client.jar
  • client.json
  • launcher_profiles.json
  • options.txt
Recursos de desarrollo
  • Formato de archivo de yunque
  • Formato de fragmentos
  • Formato de almacenamiento de comandos
  • Formato de estructuras generadas
  • Formato de nivel
  • Tablas de botín
  • Formato de elemento de mapa
  • Modelo
  • Formato NBT
  • Mapa de ofuscación
  • Formato del reproductor
  • formato raids.dat
  • Formato de texto JSON sin procesar
  • Formato de archivo de región
  • Formato de archivo de bloque de estructura
    • Formato de archivo esquemático
  • Formato de marcador
  • Formato de lista de servidores
  • sonidos.json
  • Subtítulos
  • formato village.dat
Recursos de desarrollo heredados
  • Formato de nivel clásico
  • Protocolo de servidor clásico
  • Formato de nivel indev
  • Formato de nivel alfa
  • server_level.dat
Multijugador
  • Servidor
  • Minecraft Reinos
  • Lista de servidores
  • server.properties
  • Requisitos del servidor
Personalización del juego
  • Skins
  • Capes
  • Paquetes de recursos
  • Paquetes de datos


Añade un comentario de Protocolo de servidor clásico
¡Comentario enviado con éxito! Lo revisaremos en las próximas horas.