예제 #1
0
    def read(stream, packet_size):
        channel_len = StreamIO.read_varint(stream)
        channel = StreamIO.read(stream, channel_len).decode("utf8")
        plugin_bytes = StreamIO.read(
            stream,
            packet_size - StreamIO.size_varint(channel_len) - channel_len)

        return PluginMessageServerPacket(channel, plugin_bytes)
예제 #2
0
    def read(self, stream):
        packet_size = StreamIO.read_varint(stream)

        if self.is_compression_enabled():
            data_size = StreamIO.read_varint(stream)

            if data_size == 0:
                packet_size -= StreamIO.size_varint(0)
                data = StreamIO.read(stream, packet_size)
            else:
                data = StreamIO.read(
                    stream, packet_size - StreamIO.size_varint(data_size))
                data = zlib.decompress(data)
                packet_size = data_size
        else:
            data = StreamIO.read(stream, packet_size)

        buf = StringIO(data)
        packet_id = StreamIO.read_varint(buf)
        packet_size -= StreamIO.size_varint(packet_id)

        packet_direction = None
        if self._mode == PacketSerializer.Mode.SERVER:
            packet_direction = PacketDirection.SERVERBOUND
        elif self._mode == PacketSerializer.Mode.CLIENT:
            packet_direction = PacketDirection.CLIENTBOUND

        try:
            packet_class = PacketProvider.get_packet_class(
                self._protocol, self._state, packet_direction, packet_id)
        except KeyError:
            buf.close()
            return BasePacket()  # Unknown packet

        packet = packet_class.read(buf, packet_size)
        buf.close()

        return packet
예제 #3
0
    def read(stream):
        compound_id = StreamIO.read_ubyte(stream)
        if compound_id == 0x00:
            return None

        if compound_id != NBTTagCompound.TYPE_ID:
            raise IOError("invalid magic number")

        name_len = StreamIO.read_ushort(stream)
        name = u""
        if name_len > 0:
            name = StreamIO.read(stream, name_len)

        return NBTTagCompound.read(stream)
예제 #4
0
    def read(stream):
        values = {}
        entry_type_id = StreamIO.read_ubyte(stream)

        while entry_type_id != NBTTagEnd.TYPE_ID:
            entry_name_len = StreamIO.read_ushort(stream)
            entry_name = u""
            if entry_name_len > 0:
                entry_name = StreamIO.read(stream, entry_name_len).decode("utf8")

            entry_type = NBTProvider.get_tag_class(entry_type_id)
            values[entry_name] = entry_type.read(stream)

            entry_type_id = StreamIO.read_ubyte(stream)

        return NBTTagCompound(values)
예제 #5
0
    def read(stream):
        len = StreamIO.read_ushort(stream)
        value = StreamIO.read(stream, len).decode("utf8")

        return NBTTagString(value)