Escuchando Paquetes en Hytale

Hytale: Guías, Mods, Opiniones | Videojuegos en CIBERED

Los paquetes se encuentran en el código fuente de servidor descompilado:

decompiled/sources/com/hypixel/hytale/protocol/packets

Explorando el Código de HytaleServer.jar

Paquetes de Jugador

Estos paquetes son enviados por el cliente y reflejan acciones, movimientos y actualizaciones de estado del jugador.

PaqueteIDCampos
SetClientId100clientId
SetGameMode101gameMode
SetMovementStates102movementStates
SetBlockPlacementOverride103enabled
JoinWorld104clearWorld, fadeInOut, worldUuid
ClientReady105readyForChunks, readyForGameplay
LoadHotbar106inventoryRow
SaveHotbar107inventoryRow
ClientMovement108movementStates, relativePosition, absolutePosition, bodyOrientation, lookOrientation, teleportAck, wishMovement, velocity, mountedTo, riderMovementStates
ClientTeleport109teleportId, modelTransform, resetVelocity
UpdateMovementSettings110movementSettings
MouseInteraction111clientTimestamp, activeSlot, itemInHandId, screenPoint, mouseButton, mouseMotion, worldInteraction
DamageInfo112damageSourcePosition, damageAmount, damageCause
ReticleEvent113eventIndex
DisplayDebug114shape, matrix, color, time, fade, frustumProjection
ClearDebugShapes115(ninguno)
SyncPlayerPreferences116showEntityMarkers, armorItemsPreferredPickupLocation, weaponAndToolItemsPreferredPickupLocation, usableItemsItemsPreferredPickupLocation, solidBlockItemsPreferredPickupLocation, miscItemsPreferredPickupLocation, allowNPCDetection, respondToHit
ClientPlaceBlock117position, rotation, placedBlockId
UpdateMemoriesFeatureStatus118isFeatureUnlocked
RemoveMapMarker119markerId

Paquetes de Inventario

Estos paquetes son usados por el cliente para gestionar inventario y manipulación de objetos.

PaqueteIDCampos
UpdatePlayerInventory170storage, armor, hotbar, utility, builderMaterial, tools, backpack, sortType
SetCreativeItem171inventorySectionId, slotId, item, override
DropCreativeItem172item
SmartGiveCreativeItem173item, moveType
DropItemStack174inventorySectionId, slotId, quantity
MoveItemStack175fromSectionId, fromSlotId, quantity, toSectionId, toSlotId
SmartMoveItemStack176fromSectionId, fromSlotId, quantity, moveType
SetActiveSlot177inventorySectionId, activeSlot
SwitchHotbarBlockSet178itemId
InventoryAction179inventorySectionId, inventoryActionType, actionData

Paquetes de Ventanas

Se usan para interacciones con interfaces de usuario y ventanas.

PaqueteIDCampos
OpenWindow200id, windowType, windowData, inventory, extraResources
UpdateWindow201id, windowData, inventory, extraResources
CloseWindow202id
SendWindowAction203id, action
ClientOpenWindow204type

Otros Paquetes del Cliente

Paquetes adicionales enviados desde cliente hacia servidor.

PaqueteIDCampos
ClientReferral18hostTo, data
SetUpdateRate29updatesPerSecond
SetTimeDilation30timeDilation
SetChunk131x, y, z, localLight, globalLight, data
SetChunkHeightmap132x, z, heightmap
SetChunkTintmap133x, z, tintmap
SetChunkEnvironments134x, z, environments
SetFluids136x, y, z, data
SetPaused158paused
SetEntitySeed160entitySeed
SetPage216page, canCloseThroughInteraction
SetServerAccess252access, password
SetMachinimaActorModel261model, sceneName, actorName
SetServerCamera280clientCameraView, isLocked, cameraSettings
SetFlyCameraMode283entering
SyncInteractionChains290updates

Basado en Hytale Server build 2026.01.13-dcad8778f


Manejo de Paquetes en Hytale

Los paquetes están definidos en com.hypixel.hytale.protocol y organizados por categoría en subpaquetes com.hypixel.hytale.protocol.packets.

El handler de Netty de bajo nivel es com.hypixel.hytale.server.core.io.netty.PlayerChannelHandler, que delega la lógica de procesamiento a PacketAdapters.

No necesitas engancharte directamente a Netty: el servidor tiene un sistema de adaptadores para registrar fácilmente watchers y filters para paquetes entrantes (cliente → servidor) y salientes (servidor → cliente).

Ejemplos prácticos

Imprimir todos los paquetes enviados del servidor al cliente:

PacketAdapters.registerOutbound((PacketHandler handler, Packet packet) -> {
    var handlerName = handler.getClass().getSimpleName();
    var packetName = packet.getClass().getSimpleName();

    if (!"EntityUpdates".equals(packetName) && !"CachedPacket".equals(packetName)) {
        logger.at(Level.INFO)
              .log("[" + handlerName + "] Sent packet id=" + packet.getId() + ": " + packetName);
    }
});

Modificar un paquete entrante para quitar datos de skin:

PacketAdapters.registerInbound((PacketHandler handler, Packet packet) -> {
    if (packet instanceof PlayerOptions skinPacket) {
        skinPacket.skin = null;
    }
});

Bloquear mensajes de chat con malas palabras:

PacketAdapters.registerInbound((PacketHandler handler, Packet packet) -> {
    if (packet instanceof ChatMessage chatPacket) {
        if (chatPacket.message.contains("bad words"))
            return true;  // Bloquea el paquete
        chatPacket.message = chatPacket.message.replaceAll("a", "A");
    }
    return false; // Permite continuar
});

Handlers y Paquetes Entrantes

Cada handler gestiona diferentes tipos de paquetes.

Algunos ejemplos son:

  • InitialPacketHandler: Connect (0), Disconnect (1)
  • HandshakeHandler: Disconnect (1), AuthToken (12)
  • PasswordPacketHandler: Disconnect (1), PasswordResponse (15)
  • SetupPacketHandler: RequestAssets (23), ViewRadius (32), PlayerOptions (33)
  • GamePacketHandler: ClientMovement (108), ChatMessage (211), ClientReady (105), ClientPlaceBlock (117), etc.
  • AssetEditorPacketHandler: AssetEditorRequestChildrenList (321), AssetEditorUpdateAsset (324), etc.
  • BuilderToolsPacketHandler: LoadHotbar (106), SaveHotbar (107), BuilderToolExtrudeAction (403), etc.
  • InventoryPacketHandler: SetCreativeItem (171), DropItemStack (174), InventoryAction (179)
  • (la lista completa de paquetes por handler se puede encontrar en el código fuente del server) *