Class HandshakeHandler
An instance is created during ClientIntentionPacket handling, and attached
 to the Connection.channel() via NetworkConstants.FML_HANDSHAKE_HANDLER.
 
The NetworkConstants.handshakeChannel is a SimpleChannel with standard messages flowing in both directions.
 
The loginWrapper transforms these messages into ServerboundCustomQueryPacket
 and ClientboundCustomQueryPacket compatible messages, by means of wrapping.
 
The handshake is ticked #tickLogin(NetworkManager) from the ServerLoginPacketListenerImpl.tick() method,
 utilizing the ServerLoginPacketListenerImpl.State#NEGOTIATING state, which is otherwise unused in vanilla code.
 
During client to server initiation, on the server, the NetworkEvent.GatherLoginPayloadsEvent is fired,
 which solicits all registered channels at the NetworkRegistry for any
 NetworkRegistry.LoginPayload they wish to supply.
 
The collected NetworkRegistry.LoginPayload are sent, one per tick, via
 the FMLLoginWrapper#wrapPacket(ResourceLocation, net.minecraft.impl.FriendlyByteBuf) mechanism to the incoming client connection. Each
 packet is indexed via ServerboundCustomQueryPacket.getTransactionId(), which is
 the only mechanism available for tracking request/response pairs.
 
Each packet sent from the server should be replied by the client, though not necessarily in sent order. The reply
 should contain the index of the server's packet it is replying to. The LoginWrapper class handles indexing
 replies correctly automatically.
 
Once all packets have been dispatched, we wait for all replies to be received. Once all replies are received, the final login phase will commence.
- 
Nested Class SummaryNested ClassesModifier and TypeClassDescriptionstatic interface
- 
Field SummaryFieldsModifier and TypeFieldDescriptionprivate final NetworkDirection(package private) static final org.apache.logging.log4j.Markerprivate static final org.apache.logging.log4j.Loggerprivate static final LoginWrapperprivate final Connectionprivate List<NetworkRegistry.LoginPayload>private booleanprivate intprivate Set<ResourceLocation>private Map<ResourceLocation,String> private Map<ResourceLocation,ForgeRegistry.Snapshot> 
- 
Constructor SummaryConstructorsModifierConstructorDescriptionprivateHandshakeHandler(Connection networkManager, NetworkDirection side) 
- 
Method SummaryModifier and TypeMethodDescriptionstatic <MSG extends IntSupplier>
 BiConsumer<MSG,Supplier<NetworkEvent.Context>> biConsumerFor(HandshakeHandler.HandshakeConsumer<MSG> consumer) Transforms a two-argument instance method reference into aBiConsumerbased on thegetHandshake(Supplier)function.private static HandshakeHandlergetHandshake(Supplier<NetworkEvent.Context> contextSupplier) Retrieve the handshake from theNetworkEvent.Context(package private) voidhandleClientAck(HandshakeMessages.C2SAcknowledge msg, Supplier<NetworkEvent.Context> contextSupplier) (package private) voidhandleClientModListOnServer(HandshakeMessages.C2SModListReply clientModList, Supplier<NetworkEvent.Context> c) (package private) voidhandleConfigSync(HandshakeMessages.S2CConfigData msg, Supplier<NetworkEvent.Context> contextSupplier) (package private) <MSG extends IntSupplier>
 voidhandleIndexedMessage(MSG message, Supplier<NetworkEvent.Context> c) (package private) voidhandleModData(HandshakeMessages.S2CModData serverModData, Supplier<NetworkEvent.Context> c) (package private) voidhandleModMismatchData(HandshakeMessages.S2CChannelMismatchData modMismatchData, Supplier<NetworkEvent.Context> c) private booleanhandleRegistryLoading(Supplier<NetworkEvent.Context> contextSupplier) (package private) voidhandleRegistryMessage(HandshakeMessages.S2CRegistry registryPacket, Supplier<NetworkEvent.Context> contextSupplier) (package private) voidhandleServerModListOnClient(HandshakeMessages.S2CModList serverModList, Supplier<NetworkEvent.Context> c) static <MSG extends IntSupplier>
 BiConsumer<MSG,Supplier<NetworkEvent.Context>> indexFirst(HandshakeHandler.HandshakeConsumer<MSG> next) Transforms a two-argument instance method reference into aBiConsumerbiConsumerFor(HandshakeConsumer), first calling thehandleIndexedMessage(IntSupplier, Supplier)method to handle index tracking.static booleanpacketNeedsResponse(Connection mgr, int packetPosition) Helper method to determine if the S2C packet at the given packet position needs a response in form of a packet handled inhandleIndexedMessage(MSG, java.util.function.Supplier<net.minecraftforge.network.NetworkEvent.Context>)for the handshake to progress.(package private) static voidregisterHandshake(Connection manager, NetworkDirection direction) Create a new handshake instance.(package private) static booleantickLogin(Connection networkManager) booleanFML will send packets, from Server to Client, from the messages queue until the queue is drained.
- 
Field Details- 
FMLHSMARKERstatic final org.apache.logging.log4j.Marker FMLHSMARKER
- 
LOGGERprivate static final org.apache.logging.log4j.Logger LOGGER
- 
loginWrapper
- 
messageList
- 
sentMessages
- 
direction
- 
manager
- 
packetPositionprivate int packetPosition
- 
registrySnapshots
- 
registriesToReceive
- 
registryHashes
- 
negotiationStartedprivate boolean negotiationStarted
- 
pendingFutures
 
- 
- 
Constructor Details- 
HandshakeHandler
 
- 
- 
Method Details- 
registerHandshakeCreate a new handshake instance. Called when connection is first created during theClientIntentionPackethandling.- Parameters:
- manager- The impl manager for this connection
- direction- The- NetworkDirectionfor this connection:- NetworkDirection.LOGIN_TO_SERVERor- NetworkDirection.LOGIN_TO_CLIENT
 
- 
tickLogin
- 
biConsumerForpublic static <MSG extends IntSupplier> BiConsumer<MSG,Supplier<NetworkEvent.Context>> biConsumerFor(HandshakeHandler.HandshakeConsumer<MSG> consumer) Transforms a two-argument instance method reference into aBiConsumerbased on thegetHandshake(Supplier)function. This should only be used for login message types.- Type Parameters:
- MSG- message type
- Parameters:
- consumer- A two argument instance method reference
- Returns:
- A BiConsumerfor use in message handling
 
- 
indexFirstpublic static <MSG extends IntSupplier> BiConsumer<MSG,Supplier<NetworkEvent.Context>> indexFirst(HandshakeHandler.HandshakeConsumer<MSG> next) Transforms a two-argument instance method reference into aBiConsumerbiConsumerFor(HandshakeConsumer), first calling thehandleIndexedMessage(IntSupplier, Supplier)method to handle index tracking. Used for client to server replies. This should only be used for login messages.- Type Parameters:
- MSG- message type
- Parameters:
- next- The method reference to call after index handling
- Returns:
- A BiConsumerfor use in message handling
 
- 
getHandshakeRetrieve the handshake from theNetworkEvent.Context- Parameters:
- contextSupplier- the- NetworkEvent.Context
- Returns:
- The handshake handler for the connection
 
- 
handleServerModListOnClientvoid handleServerModListOnClient(HandshakeMessages.S2CModList serverModList, Supplier<NetworkEvent.Context> c) 
- 
handleModData
- 
handleIndexedMessage
- 
handleClientModListOnServervoid handleClientModListOnServer(HandshakeMessages.C2SModListReply clientModList, Supplier<NetworkEvent.Context> c) 
- 
handleModMismatchDatavoid handleModMismatchData(HandshakeMessages.S2CChannelMismatchData modMismatchData, Supplier<NetworkEvent.Context> c) 
- 
handleRegistryMessagevoid handleRegistryMessage(HandshakeMessages.S2CRegistry registryPacket, Supplier<NetworkEvent.Context> contextSupplier) 
- 
handleRegistryLoading
- 
handleClientAckvoid handleClientAck(HandshakeMessages.C2SAcknowledge msg, Supplier<NetworkEvent.Context> contextSupplier) 
- 
handleConfigSyncvoid handleConfigSync(HandshakeMessages.S2CConfigData msg, Supplier<NetworkEvent.Context> contextSupplier) 
- 
tickServerpublic boolean tickServer()FML will send packets, from Server to Client, from the messages queue until the queue is drained. Each message will be indexed, and placed into the "pending acknowledgement" queue. As indexed packets are received at the server, they will be removed from the "pending acknowledgement" queue. Once the pending queue is drained, this method returns true - indicating that login processing can proceed to the next step.- Returns:
- true if there is no more need to tick this login connection.
 
- 
packetNeedsResponseHelper method to determine if the S2C packet at the given packet position needs a response in form of a packet handled inhandleIndexedMessage(MSG, java.util.function.Supplier<net.minecraftforge.network.NetworkEvent.Context>)for the handshake to progress.- Parameters:
- mgr- The impl manager for this connection
- packetPosition- The packet position of the packet that the status is queried of
- Returns:
- true if the packet at the given packet position needs a response and thus may stop the handshake from progressing
 
 
-