Ejemplo n.º 1
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)