use of org.lanternpowered.server.network.forge.message.type.handshake.MessageForgeHandshakeInOutHello in project LanternServer by LanternPowered.
the class HandlerForgeHandshakeInStart method handle.
@Override
public void handle(NetworkContext context, MessageForgeHandshakeInStart message) {
final Attribute<ForgeServerHandshakePhase> phase = context.getChannel().attr(ForgeHandshakePhase.PHASE);
final NetworkSession session = context.getSession();
if (phase.get() != null && phase.get() != ForgeServerHandshakePhase.START) {
session.disconnect(t("Retrieved unexpected forge handshake start message."));
return;
}
final boolean fml = session.getChannel().attr(NetworkSession.FML_MARKER).get();
final Set<String> channels = new HashSet<>(Sponge.getChannelRegistrar().getRegisteredChannels(Platform.Type.SERVER));
if (fml) {
channels.add("FML");
channels.add("FML|HS");
channels.add("FML|MP");
}
if (!channels.isEmpty()) {
session.send(new MessagePlayInOutRegisterChannels(channels));
}
// future if sponge uses completely it's own protocol.
if (false && fml) {
phase.set(ForgeServerHandshakePhase.HELLO);
session.send(new MessageForgeHandshakeInOutHello());
Lantern.getLogger().info("{}: Start forge handshake.", session.getGameProfile().getName().get());
} else {
Lantern.getLogger().info("{}: Skip forge handshake.", session.getGameProfile().getName().get());
phase.set(ForgeServerHandshakePhase.DONE);
session.setProtocolState(ProtocolState.PLAY);
session.initPlayer();
}
}
use of org.lanternpowered.server.network.forge.message.type.handshake.MessageForgeHandshakeInOutHello in project LanternServer by LanternPowered.
the class CodecPlayInOutCustomPayload method decode0.
@Override
protected Message decode0(CodecContext context, String channel, ByteBuffer content) throws CodecException {
if ("FML|HS".equals(channel)) {
int type = content.readByte();
switch(type) {
case FML_HANDSHAKE_RESET:
// server -> client message: ignore
break;
case FML_HANDSHAKE_ACK:
ForgeClientHandshakePhase phase = ForgeClientHandshakePhase.values()[content.readByte()];
return new MessageForgeHandshakeInOutAck(phase);
case FML_HANDSHAKE_SERVER_HELLO:
// server -> client message: ignore
break;
case FML_HANDSHAKE_CLIENT_HELLO:
// The forge protocol version on the client
content.readByte();
return new MessageForgeHandshakeInOutHello();
case FML_HANDSHAKE_MOD_LIST:
int size = content.readVarInt();
Map<String, String> entries = Maps.newHashMapWithExpectedSize(size);
for (int i = 0; i < size; i++) {
entries.put(content.readString(), content.readString());
}
return new MessageForgeHandshakeInOutModList(entries);
case FML_HANDSHAKE_REGISTRY_DATA:
// server -> client message: ignore
break;
default:
throw new DecoderException("Unknown forge handshake message with opcode: " + type);
}
throw new DecoderException("Received an unexpected forge message with opcode: " + type);
} else {
throw new DecoderException("Received an unexpected message with channel: " + channel);
}
}
use of org.lanternpowered.server.network.forge.message.type.handshake.MessageForgeHandshakeInOutHello in project LanternServer by LanternPowered.
the class CodecPlayInOutCustomPayload method encode0.
@Override
protected MessageResult encode0(CodecContext context, Message message) throws CodecException {
if (message instanceof MessageForgeHandshakeInOutAck) {
return new MessageResult("FML|HS", context.byteBufAlloc().buffer(2).writeByte((byte) FML_HANDSHAKE_ACK).writeByte((byte) ((ForgeServerHandshakePhase) ((MessageForgeHandshakeInOutAck) message).getPhase()).ordinal()));
} else if (message instanceof MessageForgeHandshakeInOutHello) {
return new MessageResult("FML|HS", context.byteBufAlloc().buffer(2).writeByte((byte) FML_HANDSHAKE_SERVER_HELLO).writeByte((byte) FORGE_PROTOCOL));
} else if (message instanceof MessageForgeHandshakeInOutModList) {
Map<String, String> entries = ((MessageForgeHandshakeInOutModList) message).getEntries();
ByteBuffer buf = context.byteBufAlloc().buffer();
buf.writeByte((byte) FML_HANDSHAKE_MOD_LIST);
buf.writeVarInt(entries.size());
for (Map.Entry<String, String> en : entries.entrySet()) {
buf.writeString(en.getKey());
buf.writeString(en.getValue());
}
return new MessageResult("FML|HS", buf);
} else if (message instanceof MessageForgeHandshakeOutReset) {
return new MessageResult("FML|HS", context.byteBufAlloc().buffer(1).writeByte((byte) FML_HANDSHAKE_RESET));
}
throw new EncoderException("Unsupported message type: " + message);
}
Aggregations