def toString(self):
     stream = io.BytesIO()
     serialize.writeVariant(stream, self.type)
     serialize.writeVariant(stream, self.session)
     serialize.writeString(stream, self.name)
     content = stream.getvalue()        
     stream.close()
     return content
 def toString(self):
     stream = io.BytesIO()
     serialize.writeVariant(stream, self.type)
     serialize.writeVariant(stream, self.session)
     serialize.writeString(stream, self.client_key)
     serialize.writeString(stream, self.digest)
     serialize.writeVariant(stream, self.sender)
     serialize.writeString(stream, self.name)
     serialize.writeString(stream, self.ip)
     serialize.writeVariant(stream, self.port)
     content = stream.getvalue()
     stream.close()
     return content
Example #3
0
    def toString(self):
        stream = io.BytesIO()
        ##write basic attrib
        ##msg id
        serialize.writeVariant(stream, self.id)
        ##type&success
        ##bin: 6bit type | 1bit success
        if self.success:
            stream.write(chr((self.type<<1)|1))
        else:
            stream.write(chr((self.type<<1)|0))
        ##sender&receiver
        serialize.writeString(stream, self.sender)
        serialize.writeString(stream, self.receiver)

        serialize.writeVariant(stream, self.session)
        serialize.writeVariant(stream, self.sequence)
        serialize.writeVariant(stream, self.transaction)
        serialize.writeVariant(stream, self.timestamp)
        self.writeParams(stream)
        content = stream.getvalue()
        
        stream.close()
        return content
 def toString(self):
     stream = io.BytesIO()
     serialize.writeVariant(stream, self.type)
     serialize.writeVariant(stream, self.session)
     if self.success:
         success = 1
     else:
         success = 0
     if self.need_digest:
         bool_value = success << 1|1
     else:
         bool_value = success << 1|0
     serialize.writeVariant(stream, bool_value)
     serialize.writeString(stream, self.client_key)
     serialize.writeString(stream, self.server_key)
     serialize.writeVariant(stream, self.sender)
     serialize.writeString(stream, self.name)
     serialize.writeString(stream, self.ip)
     serialize.writeVariant(stream, self.port)
     content = stream.getvalue()        
     stream.close()
     return content
Example #5
0
    def writeParams(self, stream):
        for value_type in self.params.keys():
            for key in self.params[value_type]:
                value = self.params[value_type][key]
                ## 2bytes: 11 bits key, 5 bits type
                key_value = key << 5|value_type
                stream.write(chr(key_value >> 8))
                stream.write(chr(key_value&0xFF))
                if self.param_type_uint == value_type:
                    ##write uint params
                    if not (isinstance(value, int) or isinstance(value, long)):
                        raise Exception("write param:invalid uint value for key %d, msg %d"%(key, self.id))
                    
                    serialize.writeVariant(stream, value)
                elif self.param_type_bool == value_type:
                    if not isinstance(value, int):
                        raise Exception("write param:invalid bool value for key %d, msg %d"%(key, self.id))
                    ##write bool params
                    if value:
                        serialize.writeVariant(stream, 1)
                    else:
                        serialize.writeVariant(stream, 0)
                elif self.param_type_int == value_type:
                    if not (isinstance(value, int) or isinstance(value, long)):
                        raise Exception("write param:invalid int value for key %d, msg %d"%(key, self.id))
                    ##write int params
                    serialize.writeVariant(stream, serialize.zigzagEncode(value))
                elif self.param_type_string == value_type:
                    if not isinstance(value, str):
                        raise Exception("write param:invalid string value for key %d, msg %d"%(key, self.id))
                    ##write string params
                    serialize.writeString(stream, value)
                elif self.param_type_float == value_type:
                    if not (isinstance(value, float) or isinstance(value, int) or isinstance(value, long)):
                        raise Exception("write param:invalid float value for key %d, msg %d"%(key, self.id))
                    ##write float
                    serialize.writeFloat(stream, value)
                elif self.param_type_uint_array == value_type:
                    ##write uint array
                    if not isinstance(value, list):
                        raise Exception("write param:invalid uint array for key %d, msg %d"%(key, self.id))
                    ##write count
                    count = len(value)
                    serialize.writeVariant(stream, count)
                    for uint_value in value:
                        if not (isinstance(uint_value, int) or isinstance(uint_value, long)):
                            raise Exception("write param:invalid uint item for key %d, msg %d"%(key, self.id))                        
                        serialize.writeVariant(stream, uint_value)
                        
                elif self.param_type_string_array == value_type:
                    ##write string array
                    if not isinstance(value, list):
                        raise Exception("write param:invalid string array for key %d, msg %d"%(key, self.id))
                    ##write count
                    count = len(value)
                    serialize.writeVariant(stream, count)
                    for string_value in value:
                        if not isinstance(string_value, str):
                            raise Exception("write param:invalid string item for key %d, msg %d, params:%s"%(key, self.id, self.params))                        

                        serialize.writeString(stream, string_value)
                elif self.param_type_float_array == value_type:
                    ##write float array
                    if not isinstance(value, list):
                        raise Exception("write param:invalid float array for key %d, msg %d"%(key, self.id))
                    ##write count
                    count = len(value)
                    serialize.writeVariant(stream, count)
                    for float_value in value:
                        if not (isinstance(float_value, float) or isinstance(float_value, int) or isinstance(float_value, long)):
                            raise Exception("write param:invalid float item for key %d, msg %d"%(key, self.id))                        
                        serialize.writeFloat(stream, float_value)

                elif self.param_type_uint_array_array == value_type:
                    ##write uint array array
                    if not isinstance(value, list):
                        raise Exception("write param:invalid uint array array for key %d, msg %d"%(key, self.id))
                    ##write count
                    array_count = len(value)
                    serialize.writeVariant(stream, array_count)
                    for sub_array in value:
                        if not isinstance(sub_array, list):
                            raise Exception("write param:invalid uint sub array for key %d, msg %d"%(key, self.id))
                        sub_count = len(sub_array)
                        serialize.writeVariant(stream, sub_count)
                        for uint_value in sub_array:
                            if not (isinstance(uint_value, int) or isinstance(uint_value, long)):
                                raise Exception("write param:invalid uint sub item for key %d, msg %d"%(key, self.id))
                            serialize.writeVariant(stream, uint_value)
                elif self.param_type_string_array_array == value_type:
                    ##write string array array
                    if not isinstance(value, list):
                        raise Exception("write param:invalid string array array for key %d, msg %d"%(key, self.id))
                    ##write count
                    array_count = len(value)
                    serialize.writeVariant(stream, array_count)
                    for sub_array in value:
                        if not isinstance(sub_array, list):
                            raise Exception("write param:invalid string sub array for key %d, msg %d"%(key, self.id))
                        sub_count = len(sub_array)
                        serialize.writeVariant(stream, sub_count)
                        for string_value in sub_array:
                            if not isinstance(string_value, str):
                                raise Exception("write param:invalid string sub item for key %d, msg %d, params:%s"%(
                                    key, self.id, self.params))                        
                            serialize.writeString(stream, string_value)                    
                elif self.param_type_float_array_array == value_type:
                    ##write float array array
                    if not isinstance(value, list):
                        raise Exception("write param:invalid float array array for key %d, msg %d"%(key, self.id))
                    ##write count
                    array_count = len(value)
                    serialize.writeVariant(stream, array_count)
                    for sub_array in value:
                        if not isinstance(sub_array, list):
                            raise Exception("write param:invalid float sub array for key %d, msg %d"%(key, self.id))
                        sub_count = len(sub_array)
                        serialize.writeVariant(stream, sub_count)
                        for float_value in sub_array:
                            if not (isinstance(float_value, float) or isinstance(float_value, int) or isinstance(float_value, long)):
                                raise Exception("write param:invalid float sub item for key %d, msg %d"%(key, self.id))                        
                            serialize.writeFloat(stream, float_value)                    
Example #6
0
    def getBlockData(self):
        out = BytesIO()
        serialize.writeU8(out, 25)  # Version

        #flags
        flags = 0x00
        if self.pos[1] < -1:
            flags |= 0x01  #is_underground
        flags |= 0x02  #day_night_differs
        flags |= 0x04  #lighting_expired
        flags |= 0x08  #generated
        serialize.writeU8(out, flags)

        serialize.writeU8(out, 2)  # content_width
        serialize.writeU8(out, 2)  # params_width

        cbuffer = BytesIO()
        # Bulk node data
        content = self.content
        k = 0
        nimap = {}
        rev_nimap = []
        first_free_content = 0
        for z in range(16):
            for y in range(16):
                for x in range(16):
                    #writeU16(cbuffer, content[k])
                    c = content[k]
                    if c in nimap:
                        serialize.writeU16(cbuffer, nimap[c])
                    else:
                        nimap[c] = first_free_content
                        serialize.writeU16(cbuffer, first_free_content)
                        rev_nimap.append(c)
                        first_free_content += 1
                    k += 1
                k += (256 - 16)
            k += (16 - (16 * 256))
        param1 = self.param1
        k = 0
        for z in range(16):
            for y in range(16):
                for x in range(16):
                    serialize.writeU8(cbuffer, param1[k])
                    k += 1
                k += (256 - 16)
            k += (16 - (16 * 256))
        param2 = self.param2
        k = 0
        for z in range(16):
            for y in range(16):
                for x in range(16):
                    serialize.writeU8(cbuffer, param2[k])
                    k += 1
                k += (256 - 16)
            k += (16 - (16 * 256))
        out.write(zlib.compress(cbuffer.getvalue()))

        # Nodemeta
        meta = self.metadata

        cbuffer = BytesIO()
        serialize.writeU8(cbuffer, 1)  # Version
        serialize.writeU16(cbuffer, len(meta))
        for pos, data in meta.items():
            serialize.writeU16(cbuffer, (pos[2] << 8) | (pos[1] << 4) | pos[0])
            serialize.writeU32(cbuffer, len(data[0]))
            for name, val in data[0].items():
                serialize.writeString(cbuffer, name)
                serialize.writeLongString(cbuffer, str(val))
            serialize_inv(cbuffer, data[1])
        out.write(zlib.compress(cbuffer.getvalue()))

        # Static objects
        serialize.writeU8(out, 0)  # Version
        serialize.writeU16(out, 0)  # Number of objects

        # Timestamp
        serialize.writeU32(out, 0xffffffff)  # BLOCK_TIMESTAMP_UNDEFINED

        # Name-ID mapping
        serialize.writeU8(out, 0)  # Version
        serialize.writeU16(out, len(rev_nimap))
        for i in range(len(rev_nimap)):
            serialize.writeU16(out, i)
            serialize.writeString(out, self.name_id_mapping[rev_nimap[i]])

        # Node timer
        serialize.writeU8(out, 2 + 4 + 4)  # Timer data len
        serialize.writeU16(out, len(self.timers))  # Number of timers
        if len(self.timers) > 0:
            pass
            #logger.info('wrote ' + str(len(self.timers)) + ' node timers')
        for i in range(len(self.timers)):
            serialize.writeU16(out, self.timers[i][0])
            serialize.writeU32(out, self.timers[i][1])
            serialize.writeU32(out, self.timers[i][2])

        return out.getvalue()