Пример #1
0
 def set_compression(self, threshold):
     """ Used internally for compression packet handlers
    """
     if not self.compression_enabled:
         self.compression_enabled = True
         yatelog.debug('MCSock', 'Compression enabled')
     self.compression_threshold = threshold
Пример #2
0
def send_yate_msg(msgtype, params, addr, sock):
    """ Sends a message and returns the message ID
    """
    msgid = gen_msg_id()
    msgdata = msgpack.packb((msgtype, params, msgid))
    sock.sendto(msgdata, (addr[0], addr[1]))
    yatelog.debug(
        'yateproto.py', 'Sent message %s to %s:%s' %
        (str([msgtype_str[msgtype], params, msgid]), addr[0], addr[1]))
    return msgid
Пример #3
0
 def __init__(self, name, sock):
     yatelog.debug('MCSock', 'Adding new packet type: %s' % name)
     self.idents = {}
     self.name = name
     self.sock = sock
     for k, v in protocol_modes.items():
         if packets.packet_idents.has_key(
             (sock.protocol_version, v, 'upstream', name)):
             self.idents[k] = packets.packet_idents[(sock.protocol_version,
                                                     v, 'upstream', name)]
Пример #4
0
 def msg_reader_thread(self, msg_type):
     """ This is used internally to handle all messages of the specified type when they come in from the parser thread
    """
     msg_type_s = msgtype_str[msg_type]
     while self.active:
         eventlet.greenthread.sleep(0)
         if not self.handlers.has_key(
                 msg_type
         ):  # don't bother wasting CPU time on it, just pull from the queue and then do nothing else
             yatelog.warn('YATESock', 'No handler for %s' % msg_type_s)
             try:
                 self.in_queues[msg_type].get()
             except:
                 pass
             continue
         eventlet.greenthread.sleep(0)
         msg_tuple = None
         while msg_tuple == None:
             eventlet.greenthread.sleep(0)
             try:
                 msg_tuple = self.in_queues[msg_type].get()
             except:
                 yatelog.minor_exception('YATESock',
                                         'Error reading packet from queue')
         if msg_tuple != None:
             msg_params = msg_tuple[0]
             msg_id = msg_tuple[1]
             from_addr = msg_tuple[2]
             yatelog.debug(
                 'YATESock', 'Got message %s from %s:%s: %s' %
                 (msg_type_s, from_addr[0], from_addr[1], msg_params))
             if (from_addr in self.known_peers):
                 try:
                     self.handlers[msg_type](msg_params, from_addr, msg_id)
                 except:
                     yatelog.minor_exception('YATESock',
                                             'Error handling message')
             else:
                 if msg_type == MSGTYPE_CONNECT:
                     self.handle_connect(msg_params, from_addr, msg_id)
                 else:
                     self.send_unknown_peer(to_addr=from_addr)
Пример #5
0
   def __init__(self,username=None,password=None,server='127.0.0.1:25565'):
       super(MinecraftDriver,self).__init__(username=username,password=password,server=server)
       self.username    = username
       self.password    = password
       self.avatar_uuid = None
       self.avatar_eid  = 0
       self.avatar_name = username # not always the same, just usually
       server_ip,server_port = server.split(':')
       self.server_addr = (server_ip,int(server_port))
       yatelog.info('minecraft','Minecraft driver starting up')
   
       pack_handlers = {'login_success':           self.handle_login_success,
                        'join_game':               self.handle_join_game,
                        'player_position_and_look':self.handle_player_position_and_look,
                        'chunk_data':              self.handle_chunk_data}

       self.sock = mcsock.MCSocket(self.server_addr,handlers=pack_handlers,display_name=username)
       self.sock.switch_mode(mcsock.protocol_modes['login'])
       self.tick_delay       = (1.0/20.0)
       self.last_tick        = time.time() - self.tick_delay # make sure that we tick after connecting
       self.last_full_update = time.time() - 1.0             # make sure we run a full update after connecting
       self.av_pos           = None # stores the avatar position, in minecraft format also known as (x,z,y) to sane humans
       self.av_pitch         = None
       self.av_yaw           = None
       self.on_ground        = True
       self.world            = smpmap.Dimension(smpmap.DIMENSION_OVERWORLD)
       self.sock.blocking_handlers = False
       yatelog.info('minecraft','Awaiting download of avatar position and terrain data')
       while self.av_pos is None:
          eventlet.greenthread.sleep(self.tick_delay)
          self.minecraft_client_tick()
       yatelog.info('minecraft','Got avatar position, awaiting chunks')
       while self.world.get_block(self.av_pos[0],self.av_pos[2],self.av_pos[1]) is None:
          self.minecraft_client_tick()
          yatelog.debug('minecraft','Waiting for chunk %s' % str(self.get_av_chunk()) )
       yatelog.info('minecraft','Got terrain data, ready to rock')
Пример #6
0
 def msg_sender_thread(self, msg_type, delay=0):
     """ World's simplest QoS implementation is here - just set delay to the number of seconds to wait in between each packet transmission
    """
     msg_type_s = msgtype_str[msg_type]
     while self.active:
         eventlet.greenthread.sleep(delay)
         msg_tuple = None
         while msg_tuple == None:
             eventlet.greenthread.sleep(0)
             try:
                 msg_tuple = self.out_queues[msg_type].get()
             except:
                 yatelog.minor_exception('YATESock',
                                         'Error reading packet from queue')
         if msg_tuple != None:
             msg_params = msg_tuple[0]
             msg_id = msg_tuple[1]
             to_addr = msg_tuple[2]
             msgdata = msgpack.packb((msg_type, msg_params, msg_id))
             msgdata = zlib.compress(msgdata)
             if to_addr == None:
                 yatelog.debug(
                     'YATESock',
                     'Broadcasting message %s to all peers: %s' %
                     (msg_type, msg_params))
                 peer_list = self.known_peers.copy()
                 for peer in peer_list:
                     try:
                         self.sock.sendto(msgdata, peer)
                         yatelog.debug(
                             'YATESock',
                             'Sent broadcast message to %s:%s' % peer)
                     except:
                         yatelog.minor_exception(
                             'YATESock',
                             'Error during broadcast of message')
             else:
                 try:
                     self.sock.sendto(msgdata, to_addr)
                     yatelog.debug(
                         'YATESock', 'Sent message %s to %s:%s: %s' %
                         (msg_type_s, to_addr[0], to_addr[1], msg_params))
                 except:
                     yatelog.minor_exception(
                         'YATESock', 'Error during transmission of message')
Пример #7
0
 def get_voxel(self,spatial_pos):
     yatelog.debug('minecraft','Querying block at %s' % str(spatial_pos))
     insane_x = spatial_pos[0]
     insane_y = spatial_pos[2]
     insane_z = spatial_pos[1]
     block = self.world.get_block(insane_x,insane_y,insane_z)
     if block is None:
        yate_type = YATE_VOXEL_UNKNOWN
        yatelog.warn('minecraft','Requested unknown block at %s' % (str(spatial_pos)))
        vox = base.YateBaseVoxel(spatial_pos=tuple(spatial_pos),basic_type=YATE_VOXEL_UNKNOWN)
        return vox 
     yatelog.debug('minecraft','Block is %s' % str(block))
     blockid = block[0]
     blockdata = burger_data.blockid_blocks[blockid]
     yatelog.debug('minecraft','Block at %s: %s' % (str(spatial_pos),blockdata))
     if blockdata['hardness'] == 0: yate_type=YATE_VOXEL_EMPTY
     if blockdata['hardness'] >  0: yate_type=YATE_VOXEL_TOTAL_OBSTACLE
     vox = base.YateBaseVoxel(spatial_pos=tuple(spatial_pos),basic_type=yate_type,specific_type=blockid)
     return vox
Пример #8
0
 def handle_connect_ack(self, msg_params, from_addr, msg_id):
     """ Confirmed new peers - only really here to shutup the warning when not overridden
    """
     yatelog.debug('YATESock', 'Confirmed connection to %s:%s' % from_addr)