def get_client_connector(data):
    cds = CubeDataStream(data)
    
    message_type = cds.getint()
    mycn = cds.getint()
    protocol_version = cds.getint()
    
    if protocol_version in client_connectors:
        return client_connectors[protocol_version]
    else:
        raise Exception("Unknown protocol version: {}".format(protocol_version))
        
    return None
Exemple #2
0
 def buildf(self, fmt, data_items):
     fmt = list(fmt)
     
     try:
         ic = fmt.index('c')
         while ic >= 0:
             fmt[ic] = 'i'
             data_items[ic] = data_items[ic].cn
             ic = fmt.index('c')
     except ValueError:
         pass
     
     return CubeDataStream.pack_format(fmt, data_items)
Exemple #3
0
 def sendf(self, channel, fmt, data_items, reliable=False):
     fmt = list(fmt)
     
     try:
         ic = fmt.index('c')
         while ic >= 0:
             fmt[ic] = 'i'
             data_items[ic] = data_items[ic].cn
             ic = fmt.index('c')
     except ValueError:
         pass
         
     self.send(channel, CubeDataStream.pack_format(fmt, data_items), reliable)
Exemple #4
0
 def send_room_state(self):
     flush = False
     
     for client in self.clients.values():
         if client.isai: continue
         
         room_positions = CubeDataStream()
         room_messages = CubeDataStream()
         
         for ci in self.clients.values():
             if ci == client: continue
             if ci.isai and ci.owner == client: continue
             
             ci.writestate(room_positions, room_messages)
         
         if not room_positions.empty():
             client.send(0, room_positions, False)
             flush = True
                 
         if not room_messages.empty():
             client.send(1, room_messages, True)
             flush = True
     
     return flush
Exemple #5
0
 def __init__(self):
     self.messages = CubeDataStream()
     self.position = None
     
     self.reset()
Exemple #6
0
 def on_receive_event(self, channel, data):
     if len(data) <= 0:
         pass
     
     try:
         if channel == 0:
             try:
                 cds = CubeDataStream(data)
                 message_type = cds.getint()
                 cn = cds.getint()
                 self.getclient(cn).state.position = data
             except:
                 traceback.print_exc()
         elif channel == 1:
             messages = sauerbraten_stream_spec.read(data, {'aiclientnum': -1})
             
             for message_type, message in messages:
                 if (not self.isconnected) and message_type != "N_CONNECT":
                     self.peer.disconnect(disconnect_types.DISC_TAGT) #@UndefinedVariable
                     return
                 
                 elif self.isconnected and message_type == "N_CONNECT":
                     self.peer.disconnect(disconnect_types.DISC_TAGT) #@UndefinedVariable
                     return
                 
                 elif message_type == "N_CONNECT":
                     self.isconnected = True
                     self.name = filtertext(message['name'], False, MAXNAMELEN)
                     self.pwdhash = message['pwdhash']
                     self.playermodel = message['playermodel']
                     
                     self.connected.emit(self)
                     
                 elif message_type == "N_SWITCHNAME":
                     name = filtertext(message['name'], False, MAXNAMELEN)
                     if len(name) <= 0:
                         name = "unnamed"
                         
                     if name != self.name:
                         self.name = name
                         swh.put_switchname(self.state.messages, self.name)
                     
                 elif message_type == "N_SWITCHTEAM":
                     team_name = filtertext(message['team'], False, MAXTEAMLEN)
                     if self.team is not None and team_name != self.team.name:
                         self.trysetteam.emit(self, self.cn, self.team, team_name)
                         
                 elif message_type == "N_SPECTATOR":
                     self.setspectator.emit(self, message['target_cn'], bool(message['value']))
                     
                 elif message_type == "N_PING":
                     with self.sendbuffer(1, False) as cds:
                         swh.put_pong(cds, message['cmillis'])
                     
                 elif message_type == "N_CLIENTPING":
                     self.ping_buffer.add(message['ping'])
                     self.ping.emit(self)
                     swh.put_clientping(self.state.messages, message['ping'])
                     
                 elif message_type == "N_MAPVOTE":
                     self.mapvote.emit(self, message['map_name'], message['mode_num'])
                     
                 elif message_type == "N_MAPCHANGE":
                     self.mapvote.emit(self, message['map_name'], message['mode_num'])
                     
                 elif message_type == "N_MAPCRC":
                     self.mapcrc.emit(self, message['mapcrc'])
                     
                 elif message_type == "N_ITEMLIST":
                     self.itemlist.emit(self, message['items'])
                     
                 elif message_type == "N_BASES":
                     self.baselist.emit(self, message['bases'])
                     
                 elif message_type == "N_INITFLAGS":
                     self.flaglist.emit(self, message['flags'])
                     
                 elif message_type == "N_SPAWN":
                     client = self.getclient(message['aiclientnum'])
                     
                     client.state.state = client_states.CS_ALIVE
                     client.lifesequence = message['lifesequence']
                     client.gunselect = message['gunselect']
                     
                     swh.put_spawn(client.state.messages, self)
                     
                 elif message_type == "N_TRYSPAWN":
                     self.tryspawn.emit(self.getclient(message['aiclientnum']))
                     
                 elif message_type == "N_SHOOT":
                     message['client'] = self.getclient(message['aiclientnum'])
                     del message['aiclientnum']
                     self.shoot.emit(**message)
                     
                 elif message_type == "N_EXPLODE":
                     message['client'] = self.getclient(message['aiclientnum'])
                     del message['aiclientnum']
                     self.explode.emit(**message)
                     
                 elif message_type == "N_SUICIDE":
                     self.suicide.emit(self.getclient(message['aiclientnum']))
                     
                 elif message_type == "N_JUMPPAD":
                     cn = message['clientnum']
                     self.jumppad.emit(self.getclient(cn), message['jumppad'])
                     
                 elif message_type == "N_TELEPORT":
                     cn = message['clientnum']
                     self.teleport.emit(self.getclient(cn), message['teleport'], message['teledest'])
                     
                 elif message_type == "N_GUNSELECT":
                     mcds = self.getclient(message['aiclientnum']).state.messages
                     swh.put_gunselect(mcds, message['gunselect'])
                     self.state.gunselect = message['gunselect']
                     
                 elif message_type == "N_SOUND":
                     mcds = self.getclient(message['aiclientnum']).state.messages
                     swh.put_gunselect(mcds, message['sound'])
                     
                 elif message_type == "N_ITEMPICKUP":
                     self.pickup.emit(self.getclient(message['aiclientnum']), message['item_index'])
                     
                 elif message_type == "N_REPAMMO":
                     self.replenishammo.emit(self.getclient(message['aiclientnum']))
                     
                 elif message_type == "N_TAKEFLAG":
                     self.takeflag.emit(self.getclient(message['aiclientnum']), message['flag'], message['version'])
                     
                 elif message_type == "N_TRYDROPFLAG":
                     self.trydropflag.emit(self.getclient(message['aiclientnum']))
                     
                 elif message_type == "N_PAUSEGAME":
                     self.trypausegame.emit(self, message['value'])
                     
                 else:
                     print message_type, message
             
         else: #channel == 2:
             pass
     except InvalidClientNumberReference:
         return
     except:
         traceback.print_exc()
Exemple #7
0
class ClientState(object):
    state = client_states.CS_ALIVE
    frags = 0
    deaths = 0
    flags = 0
    quadexpiry = 0
    lifesequence = -1
    health = 100
    maxhealth = 100
    armour = 0
    armourtype = armor_types.A_BLUE
    gunselect = 6
    ammo = [0 for n in range(weapon_types.NUMGUNS)]
    
    lastshot = -1
    gunwait = -1
    
    rockets = {}
    grenades = {}
    
    messages = CubeDataStream()
    position = None
    
    def __init__(self):
        self.messages = CubeDataStream()
        self.position = None
        
        self.reset()
        
    @property
    def alive(self):
        return self.state == client_states.CS_ALIVE
    
    @property
    def spectator(self):
        return self.state == client_states.CS_SPECTATOR
        
    def respawn(self, gamemode):
        self.lifesequence = (self.lifesequence + 1)&0x7F
        self.quadexpiry = -1
        self.health = gamemode.spawnhealth
        self.armour = gamemode.spawnarmour
        self.armourtype = gamemode.spawnarmourtype
        self.gunselect = gamemode.spawngunselect
        self.ammo = gamemode.spawnammo
        
        self.position = None
        
    def reset(self):
        self.state = client_states.CS_ALIVE
        self.frags = 0
        self.deaths = 0
        self.flags = 0
        self.quadexpiry = -1
        self.lifesequence = -1
        self.health = 100
        self.maxhealth = 100
        self.armour = 0
        self.armourtype = armor_types.A_BLUE
        self.gunselect = weapon_types.GUN_PISTOL
        self.ammo = [0 for n in range(weapon_types.NUMGUNS)] #@UnusedVariable
        
        self.ammo[weapon_types.GUN_PISTOL] = 40
        
        self.lastshot = -1
        self.gunwait = -1
        
        self.rockets = {}
        self.grenades = {}
        
        self.messages.clear()
        self.position = None
        
    def receive_damage(self, damage):
        ad = damage*(self.armourtype+1)*(25.0/100.0) # let armour absorb when possible
        if ad > self.armour:
            ad = self.armour
        self.armour -= ad
        damage -= ad;
        self.health -= damage
        return damage
    
    def pickup_item(self, item_type):
        if item_type < item_types.I_SHELLS or item_type > item_types.I_QUAD: 
            return
        
        itemstat = itemstats[item_type-item_types.I_SHELLS]
        
        if item_type == item_types.I_BOOST: # boost also adds to health
            self.maxhealth = min(self.maxhealth+itemstat.add, itemstat.max)
        
        if item_type in (item_types.I_BOOST, item_types.I_HEALTH):
                self.health = min(self.health+itemstat.add, self.maxhealth)

        elif item_type in [item_types.I_GREENARMOUR, item_types.I_YELLOWARMOUR]:
            self.armour = min(self.armour+itemstat.add, itemstat.max)
            self.armourtype = itemstat.info
        elif item_type == item_types.I_QUAD:
            if self.quadexpiry < time.time():
                self.quadexpiry = time.time() + float(itemstat.add)/1000.0
            else:
                self.quadexpiry = time.time() + min((self.quadexpiry - time.time()) + float(itemstat.add)/1000.0, float(itemstat.max)/1000.0)
        else: # is an ammo
            self.ammo[itemstat.info] = min(self.ammo[itemstat.info]+itemstat.add, itemstat.max)