Search in sources :

Example 1 with MessagePlayInOutRegisterChannels

use of org.lanternpowered.server.network.vanilla.message.type.play.MessagePlayInOutRegisterChannels in project LanternServer by LanternPowered.

the class AbstractCodecPlayInOutCustomPayload method decode0.

private Message decode0(CodecContext context, ByteBuffer content, String channel) {
    if ("REGISTER".equals(channel)) {
        Set<String> channels = decodeChannels(content);
        Iterator<String> it = channels.iterator();
        while (it.hasNext()) {
            String channel0 = it.next();
            if (channel0.startsWith("FML")) {
                it.remove();
            }
        }
        if (!channels.isEmpty()) {
            return new MessagePlayInOutRegisterChannels(channels);
        }
    } else if ("UNREGISTER".equals(channel)) {
        Set<String> channels = decodeChannels(content);
        Iterator<String> it = channels.iterator();
        while (it.hasNext()) {
            String channel0 = it.next();
            if (channel0.startsWith("FML")) {
                it.remove();
            }
        }
        if (!channels.isEmpty()) {
            return new MessagePlayInOutUnregisterChannels(channels);
        }
    } else if ("FML|MP".equals(channel)) {
        Attribute<MultiPartMessage> attribute = context.getChannel().attr(FML_MULTI_PART_MESSAGE);
        MultiPartMessage message0 = attribute.get();
        if (message0 == null) {
            String channel0 = content.readString();
            int parts = content.readByte() & 0xff;
            int size = content.readInteger();
            if (size <= 0 || size >= -16797616) {
                throw new CodecException("Received FML MultiPart packet outside of valid length bounds, Max: -16797616, Received: " + size);
            }
            attribute.set(new MultiPartMessage(channel0, context.byteBufAlloc().buffer(size), parts));
        } else {
            int part = content.readByte() & 0xff;
            if (part != message0.index) {
                throw new CodecException("Received FML MultiPart packet out of order, Expected: " + message0.index + ", Got: " + part);
            }
            int len = content.available() - 1;
            content.readBytes(message0.buffer, message0.offset, len);
            message0.offset += len;
            message0.index++;
            if (message0.index >= message0.parts) {
                final Message message = decode0(context, message0.channel, message0.buffer);
                attribute.set(null);
                return message;
            }
        }
    } else {
        return decode0(context, channel, content);
    }
    return NullMessage.INSTANCE;
}
Also used : MessagePlayInOutRegisterChannels(org.lanternpowered.server.network.vanilla.message.type.play.MessagePlayInOutRegisterChannels) MessagePlayInOutUnregisterChannels(org.lanternpowered.server.network.vanilla.message.type.play.MessagePlayInOutUnregisterChannels) Set(java.util.Set) NullMessage(org.lanternpowered.server.network.message.NullMessage) Message(org.lanternpowered.server.network.message.Message) Iterator(java.util.Iterator) CodecException(io.netty.handler.codec.CodecException)

Example 2 with MessagePlayInOutRegisterChannels

use of org.lanternpowered.server.network.vanilla.message.type.play.MessagePlayInOutRegisterChannels 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();
    }
}
Also used : MessageForgeHandshakeInOutHello(org.lanternpowered.server.network.forge.message.type.handshake.MessageForgeHandshakeInOutHello) ForgeServerHandshakePhase(org.lanternpowered.server.network.forge.handshake.ForgeServerHandshakePhase) MessagePlayInOutRegisterChannels(org.lanternpowered.server.network.vanilla.message.type.play.MessagePlayInOutRegisterChannels) NetworkSession(org.lanternpowered.server.network.NetworkSession) HashSet(java.util.HashSet)

Example 3 with MessagePlayInOutRegisterChannels

use of org.lanternpowered.server.network.vanilla.message.type.play.MessagePlayInOutRegisterChannels in project LanternServer by LanternPowered.

the class LanternChannelRegistrar method create.

private LanternChannelBinding create(Object plugin, String channel, boolean rawChannel) throws ChannelRegistrationException {
    final PluginContainer container = checkPlugin(plugin, "plugin");
    checkNotNullOrEmpty(channel, "channel");
    checkArgument(channel.length() <= MAX_NAME_LENGTH, "channel length may not be longer then 20");
    if (!isChannelAvailable(channel)) {
        throw new ChannelRegistrationException("Channel with name \"" + channel + "\" is already registered!");
    }
    final LanternChannelBinding binding;
    if (rawChannel) {
        binding = new LanternRawDataChannel(this, channel, container);
    } else {
        binding = new LanternIndexedMessageChannel(this, channel, container);
    }
    binding.bound = true;
    final MessagePlayInOutRegisterChannels message = new MessagePlayInOutRegisterChannels(Sets.newHashSet(channel));
    for (Player player : this.server.getOnlinePlayers()) {
        ((NetworkSession) player.getConnection()).send(message);
    }
    return binding;
}
Also used : MessagePlayInOutRegisterChannels(org.lanternpowered.server.network.vanilla.message.type.play.MessagePlayInOutRegisterChannels) LanternPlayer(org.lanternpowered.server.entity.living.player.LanternPlayer) Player(org.spongepowered.api.entity.living.player.Player) PluginContainer(org.spongepowered.api.plugin.PluginContainer) NetworkSession(org.lanternpowered.server.network.NetworkSession) ChannelRegistrationException(org.spongepowered.api.network.ChannelRegistrationException)

Example 4 with MessagePlayInOutRegisterChannels

use of org.lanternpowered.server.network.vanilla.message.type.play.MessagePlayInOutRegisterChannels in project LanternServer by LanternPowered.

the class AbstractCodecPlayInOutCustomPayload method encode.

@Override
public ByteBuffer encode(CodecContext context, Message message) throws CodecException {
    final ByteBuffer buf = context.byteBufAlloc().buffer();
    final String channel;
    final ByteBuffer content;
    if (message instanceof MessagePlayInOutChannelPayload) {
        final MessagePlayInOutChannelPayload message1 = (MessagePlayInOutChannelPayload) message;
        content = message1.getContent();
        channel = message1.getChannel();
    } else if (message instanceof MessagePlayInOutRegisterChannels) {
        content = encodeChannels(((MessagePlayInOutRegisterChannels) message).getChannels());
        channel = "REGISTER";
    } else if (message instanceof MessagePlayInOutUnregisterChannels) {
        content = encodeChannels(((MessagePlayInOutUnregisterChannels) message).getChannels());
        channel = "UNREGISTER";
    } else {
        final MessageResult result = encode0(context, message);
        channel = result.channel;
        content = result.byteBuf;
    }
    buf.writeString(channel);
    buf.writeBytes(content);
    return buf;
}
Also used : MessagePlayInOutRegisterChannels(org.lanternpowered.server.network.vanilla.message.type.play.MessagePlayInOutRegisterChannels) MessagePlayInOutUnregisterChannels(org.lanternpowered.server.network.vanilla.message.type.play.MessagePlayInOutUnregisterChannels) MessagePlayInOutChannelPayload(org.lanternpowered.server.network.vanilla.message.type.play.MessagePlayInOutChannelPayload) ByteBuffer(org.lanternpowered.server.network.buffer.ByteBuffer)

Aggregations

MessagePlayInOutRegisterChannels (org.lanternpowered.server.network.vanilla.message.type.play.MessagePlayInOutRegisterChannels)4 NetworkSession (org.lanternpowered.server.network.NetworkSession)2 MessagePlayInOutUnregisterChannels (org.lanternpowered.server.network.vanilla.message.type.play.MessagePlayInOutUnregisterChannels)2 CodecException (io.netty.handler.codec.CodecException)1 HashSet (java.util.HashSet)1 Iterator (java.util.Iterator)1 Set (java.util.Set)1 LanternPlayer (org.lanternpowered.server.entity.living.player.LanternPlayer)1 ByteBuffer (org.lanternpowered.server.network.buffer.ByteBuffer)1 ForgeServerHandshakePhase (org.lanternpowered.server.network.forge.handshake.ForgeServerHandshakePhase)1 MessageForgeHandshakeInOutHello (org.lanternpowered.server.network.forge.message.type.handshake.MessageForgeHandshakeInOutHello)1 Message (org.lanternpowered.server.network.message.Message)1 NullMessage (org.lanternpowered.server.network.message.NullMessage)1 MessagePlayInOutChannelPayload (org.lanternpowered.server.network.vanilla.message.type.play.MessagePlayInOutChannelPayload)1 Player (org.spongepowered.api.entity.living.player.Player)1 ChannelRegistrationException (org.spongepowered.api.network.ChannelRegistrationException)1 PluginContainer (org.spongepowered.api.plugin.PluginContainer)1