Esempio n. 1
0
    def rank(self):
        _rank = yield redis.zrank(RANK_WORLDBOSS_DAMAGE, self._cid)

        if not _rank:
            yield redis.zadd(RANK_WORLDBOSS_DAMAGE, self._cid, -self._damage_total)
            _rank = yield redis.zrank(RANK_WORLDBOSS_DAMAGE, self._cid)

        defer.returnValue(_rank)
Esempio n. 2
0
    def rank(self):
        _rank = yield redis.zrank(RANK_WORLDBOSS_DAMAGE, self._cid)

        if not _rank:
            yield redis.zadd(RANK_WORLDBOSS_DAMAGE, self._cid,
                             -self._damage_total)
            _rank = yield redis.zrank(RANK_WORLDBOSS_DAMAGE, self._cid)

        defer.returnValue(_rank)
Esempio n. 3
0
def world_ranklist(p, req):
    if hasattr(p, "uid"):
        log.debug('uid:{0}'.format(p.uid))
        uid = p.uid
    else:  # used to test
        log.error('client has not found uid.')
        defer.returnValue((CONNECTION_LOSE, None))

    user = g_UserMgr.getUserByUid(uid)
    if not user:
        defer.returnValue((CONNECTION_LOSE, None))

    data = list()
    other_data = list()
    weight_data = yield redis.zrange(SET_RANK_PVP_WEIGHT, 0, 10, True)
    for _rank, (_uid, _weight) in enumerate(weight_data):
        _machine_code = yield redis.hget(HASH_UID_MACHINE_CODE, _uid)
        other_data.append((_rank + 1, _uid, _machine_code, _weight))

    self_rank = yield redis.zrank(SET_RANK_PVP_WEIGHT, uid)
    self_rank = 0 if self_rank is None else int(self_rank) + 1
    self_machine_code = yield redis.hget(HASH_UID_MACHINE_CODE, uid)
    self_weight = yield redis.zscore(SET_RANK_PVP_WEIGHT, uid)
    self_weight = 0 if self_weight is None else abs(self_weight)

    data = (other_data, (self_rank, uid, self_machine_code, self_weight))
    defer.returnValue((NO_ERROR, data))
Esempio n. 4
0
def world_ranklist(p, req):
    if hasattr(p, "uid"):
        log.debug('uid:{0}'.format(p.uid))
        uid = p.uid
    else: # used to test
        log.error('client has not found uid.')
        defer.returnValue((CONNECTION_LOSE, None))

    user = g_UserMgr.getUserByUid(uid)
    if not user:
        defer.returnValue((CONNECTION_LOSE, None))

    data = list()
    other_data = list()
    weight_data = yield redis.zrange(SET_RANK_PVP_WEIGHT, 0, 10, True)
    for _rank, (_uid, _weight) in enumerate(weight_data):
        _machine_code = yield redis.hget(HASH_UID_MACHINE_CODE, _uid)
        other_data.append((_rank+1, _uid, _machine_code, _weight))

    self_rank = yield redis.zrank(SET_RANK_PVP_WEIGHT, uid)
    self_rank = 0 if self_rank is None else int(self_rank) + 1
    self_machine_code = yield redis.hget(HASH_UID_MACHINE_CODE, uid)
    self_weight = yield redis.zscore(SET_RANK_PVP_WEIGHT, uid)
    self_weight = 0 if self_weight is None else abs(self_weight)

    data = (other_data, (self_rank, uid, self_machine_code, self_weight))
    defer.returnValue((NO_ERROR, data))
Esempio n. 5
0
    def get_char_rank(self, cid, redis_key=SET_JOUST_CID_SCORE):
        ''' 
        @return : rank=0时表示玩家没有排名. 
        '''
        _rank = yield redis.zrank(redis_key, cid)
        _rank = 0 if _rank is None else int(_rank) + 1

        defer.returnValue(_rank)
Esempio n. 6
0
    def ranklist(self):
        ''' 获取天外天的排行榜 '''
        yield self.load()
        # get myself rank and layer
        _my_rank  = yield redis.zrank(SET_CLIMBING_CID_LAYER, self.cid)
        _my_rank  = 0 if _my_rank is None else int(_my_rank)+1
        _ranklist = [self.climbing.max_layer, _my_rank, []]

        _cid_layers = yield redis.zrange(SET_CLIMBING_CID_LAYER, 0, 9, withscores=True)
        for _idx, _data in enumerate(_cid_layers):
            #log.error('For Test. _idx: {0}, _cid_layers: {1}.'.format( _idx+1, _data ))
            if int(_data[1]) >= 0:
                continue
            _detail = yield load_climbing_user_data(_data[0])
            if not _detail:
                log.error('Unknown user. cid: {0}.'.format( _data[0] ))
                continue
            _detail.extend( [-int(_data[1]), _idx+1] )
            _ranklist[2].append( _detail )

        defer.returnValue( _ranklist )
Esempio n. 7
0
    def ranklist(self):
        ''' 剧情副本的排行榜 '''
        yield self._load()
        # get myself rank and star
        _my_rank   = yield redis.zrank(SET_SCENE_CID_STAR, self.cid)
        _my_rank   = 0 if _my_rank is None else int(_my_rank)+1
        _ranklist  = [self.total_star, _my_rank, []]

        _cid_stars = yield redis.zrange(SET_SCENE_CID_STAR, 0, 9, withscores=True)
        #log.error('For Test. _cid_stars: {0}.'.format( _cid_stars ))
        for _idx, _data in enumerate(_cid_stars):
            if int(_data[1]) >= 0:
                continue
            _detail = yield load_scene_user_data(_data[0])
            if not _detail:
                log.error('Unknown user. cid: {0}.'.format( _data[0] ))
                continue
            _detail.extend( [-int(_data[1]), _idx+1] )
            _ranklist[2].append( _detail )

        defer.returnValue( _ranklist )
Esempio n. 8
0
    def newUser(self, uid):
        if not self.__users:
            # common foodball and spineball
            self.__foodball = get_all_foodball()
            self.__spineball = get_all_spineball()
            foodball_conf = self.__foodball.values()
            spineball_conf = self.__spineball.values()
            self.__end_time = int((time() + PVP_SECONDS)*1000)
            #reactor.callLater(PVP_SECONDS, self._broadcastFoodball)
        else:
            foodball_conf = self.__foodball.values()
            spineball_conf = self.__spineball.values()

        self.__eat_num.setdefault(uid, 0)
        self.__be_eated_num.setdefault(uid, 0)

        userball_obj = Userball(uid)
        self.__users[uid] = userball_obj
        all_userball = userball_obj.initBall(self.count)
        for _ub in self.__users.itervalues():
            if _ub.uid == uid:
                continue
            all_userball.extend(_ub.getAllBall())
        yield redis.zadd(SET_RANK_ROOM_VOLUME%self.__id, uid, -INIT_USERBALL_VOLUME)
        rank = yield redis.zrank(SET_RANK_ROOM_VOLUME%self.__id, uid)
        rank = 0 if rank is None else int(rank) + 1

        data = {'userball': all_userball, \
                'foodball': foodball_conf, \
                'spineball': spineball_conf, \
                'end_time': self.__end_time, \
                'total': self.count, 
                'rank': rank, \
                'room_id': self.__id,
                }
        defer.returnValue(data)
Esempio n. 9
0
    def ranklist(self):
        ''' 剧情副本的排行榜 '''
        yield self._load()
        # get myself rank and star
        _my_rank = yield redis.zrank(SET_SCENE_CID_STAR, self.cid)
        _my_rank = 0 if _my_rank is None else int(_my_rank) + 1
        _ranklist = [self.total_star, _my_rank, []]

        _cid_stars = yield redis.zrange(SET_SCENE_CID_STAR,
                                        0,
                                        9,
                                        withscores=True)
        #log.error('For Test. _cid_stars: {0}.'.format( _cid_stars ))
        for _idx, _data in enumerate(_cid_stars):
            if int(_data[1]) >= 0:
                continue
            _detail = yield load_scene_user_data(_data[0])
            if not _detail:
                log.error('Unknown user. cid: {0}.'.format(_data[0]))
                continue
            _detail.extend([-int(_data[1]), _idx + 1])
            _ranklist[2].append(_detail)

        defer.returnValue(_ranklist)
Esempio n. 10
0
    def getRoomRanklist(self, room_id, self_uid):
        other_data = list()
        _volume_data = yield redis.zrange(SET_RANK_ROOM_VOLUME%room_id, 0, 5, True)
        _volume_data = _volume_data if _volume_data else list()
        for _rank, (_uid, _volume) in enumerate(_volume_data):
            _machine_code = yield redis.hget(HASH_UID_MACHINE_CODE, _uid)
            _eat_num = yield redis.zscore(SET_RANK_ROOM_EAT%room_id, _uid)
            _eat_num = abs(int(_eat_num)) if _eat_num else 0
            _be_eated_num = yield redis.hget(SET_RANK_ROOM_EATED%room_id, _uid)
            _be_eated_num = abs(int(_be_eated_num)) if _be_eated_num else 0
            other_data.append((_rank+1, _uid, _machine_code, abs(_volume)*10, _eat_num, _be_eated_num))

        _self_rank = yield redis.zrank(SET_RANK_ROOM_VOLUME%room_id, self_uid)
        _self_rank = 0 if _self_rank is None else int(_self_rank) + 1
        _self_volume = yield redis.zscore(SET_RANK_ROOM_VOLUME%room_id, self_uid)
        _self_weight = abs(_self_volume)*10 if _self_volume else 0
        _self_machine_code = yield redis.hget(HASH_UID_MACHINE_CODE, self_uid)
        _self_eat_num = yield redis.zscore(SET_RANK_ROOM_EAT%room_id, self_uid)
        _self_eat_num = abs(int(_self_eat_num)) if _self_eat_num else 0
        _self_be_eated_num = yield redis.hget(SET_RANK_ROOM_EATED%room_id, self_uid)
        _self_be_eated_num = abs(int(_self_be_eated_num)) if _self_be_eated_num else 0
        self_data = (_self_rank, self_uid, _self_machine_code, _self_weight, _self_eat_num, _self_be_eated_num)

        defer.returnValue((other_data, self_data))
Esempio n. 11
0
    def ranklist(self):
        ''' 获取天外天的排行榜 '''
        yield self.load()
        # get myself rank and layer
        _my_rank = yield redis.zrank(SET_CLIMBING_CID_LAYER, self.cid)
        _my_rank = 0 if _my_rank is None else int(_my_rank) + 1
        _ranklist = [self.climbing.max_layer, _my_rank, []]

        _cid_layers = yield redis.zrange(SET_CLIMBING_CID_LAYER,
                                         0,
                                         9,
                                         withscores=True)
        for _idx, _data in enumerate(_cid_layers):
            #log.error('For Test. _idx: {0}, _cid_layers: {1}.'.format( _idx+1, _data ))
            if int(_data[1]) >= 0:
                continue
            _detail = yield load_climbing_user_data(_data[0])
            if not _detail:
                log.error('Unknown user. cid: {0}.'.format(_data[0]))
                continue
            _detail.extend([-int(_data[1]), _idx + 1])
            _ranklist[2].append(_detail)

        defer.returnValue(_ranklist)
Esempio n. 12
0
    def syncUserball(self, character, ball_info, status):
        uid = character.attrib_id
        if not (ball_info and isinstance(ball_info[0], list)):
            log.error("args error. uid:{0}, ball_info:{1}.".format(uid, ball_info))
            defer.returnValue((ARGS_ERROR, None))

        if uid not in self.__users:
            log.error("user not in room error. uid:{0}, room_id:{1}.".format(uid, self.__id))
            defer.returnValue((PVPROOM_LOSE, None))

        _hide_fb_ids = list()
        userball_obj = self.__users[uid]
        if userball_obj.isDead:
            log.warn("room uids:{0}, __eat_num:{1}, __be_eated_num:{2}, uid:{3}, isDead:{4}, status:{5}.".format(self.__users.keys(), self.__eat_num, self.__be_eated_num, uid, userball_obj.isDead, status))
            if status:
                userball_obj.revive()
            else:
                log.error("user is dead. uid:{0}, isDead:{1}, status:{2}.".format(uid, userball_obj.isDead, status))
                defer.returnValue((USER_IS_DEAD, None))
        _hide_ub_ids, _delta_volume, ball_info = userball_obj.checkHideBall(ball_info)

        #_delta_br =  int(FOODBALL_RADIUS * MULTIPLE_ENLARGE_FOODBALL * 0.01)
        _max_hide = 1
        for _bid, _bx, _by, _bz in self.__foodball.itervalues():
            for _, ball_id, ball_x, ball_y, ball_z, ball_r, ball_v, ball_s, pow_r in ball_info:
                # 和食物球 其它玩家球比较半径大小 计算直线距离
                # 玩家球 分裂后的半径也会比食物球大吗?
                _distance = pow(ball_x-_bx, 2) + pow(ball_y-_by, 2) + pow(ball_z-_bz, 2)
                if _distance < pow_r:
                    log.warn('--------------- eated foodball uid:{0}, pow_r:{1}, _distance:{2}, source:{3}, target:{4}, _delta_volume:{5}.'.format(uid, pow_r, _distance, (ball_id, ball_x, ball_y, ball_z, ball_r), (_bid, _bx, _by, _bz), _delta_volume))
                    # 自身体积增长
                    _delta_volume[ball_id] = _delta_volume.setdefault(ball_id, ball_v) + INIT_FOODBALL_VOLUME
                    _hide_fb_ids.append(_bid)
                if len(_hide_fb_ids) > 2:
                    break
        for _bid in _hide_fb_ids:
            self.__hide_foodball_ids[_bid] = 0
            if _bid in self.__foodball:
                del self.__foodball[_bid]
        # uid and ballid
        for _ub in self.__users.itervalues():
            if _ub.isDead:
                log.error('----------------- user is dead. room_id:{0}, uid:{1}, isDead:{2}'.format(self.__id, _ub.uid, _ub.isDead))
            if _ub.uid == uid or _ub.isDead:
                continue
            _all_ball = _ub.getAllBall()
            for _uid, _bid, _bx, _by, _bz, _br, _bv, _bs in iter(_all_ball):
                _be_eated_user = g_UserMgr.getUserByUid(_uid)
                for _, ball_id, ball_x, ball_y, ball_z, ball_r, ball_v, ball_s, pow_r in ball_info:
                    if MULTIPLE_HIDE_USERBALL*_bv > ball_v:
                        continue
                    _distance = pow(ball_x-_bx, 2) + pow(ball_y-_by, 2) + pow(ball_z-_bz, 2)
                    if _distance < pow_r:
                        log.warn('---------------- eated userball uid:{0}, pow_r:{1}, _distance:{2}, source:{3}, target:{4}.'.format(uid, pow_r, _distance, (_uid, _bid, _bx, _by, _bz, _br), (ball_id, ball_x, ball_y, ball_z, ball_r)))
                        # 记录吞噬/被吞噬 玩家球的个数
                        character.eat_num += 1
                        self.__eat_num[uid] += 1
                        if _be_eated_user and _be_eated_user.attrib:
                            _be_eated_user.attrib.be_eated_num += 1
                            self.__be_eated_num[_uid] = self.__be_eated_num.setdefault(_uid, 0) + 1

                        # 自身体积增长
                        _delta_volume[ball_id] = _delta_volume.setdefault(ball_id, ball_v) + _bv
                        _ub.setHideBall(_bid)
                        _hide_ub_ids.append((_uid, _bid))
                        yield redis.zincrby(SET_RANK_ROOM_VOLUME%self.__id, _uid, _bv)

        data = list()
        _delta_ub_data = list()
        _delta_ub_volume = 0
        for _, ball_id, ball_x, ball_y, ball_z, ball_r, ball_v, ball_s, pow_r in ball_info:
            ball_v = _delta_volume[ball_id] if ball_id in _delta_volume else ball_v
            _delta_ub_data.append((uid, ball_id, ball_x, ball_y, ball_z, ball_r, ball_v, ball_s))
            _delta_ub_volume += ball_v
        # 更新自己的球体积排行榜
        yield redis.zadd(SET_RANK_ROOM_VOLUME%self.__id, uid, -_delta_ub_volume)
        # 更新自己的球体积信息
        userball_obj.updateVolume(_delta_volume)
        if (_hide_ub_ids or _hide_fb_ids or _delta_ub_data):
            data = [_hide_ub_ids, _hide_fb_ids, _delta_ub_data]
            #TODO broadcast
            uids = self.__users.keys()
            uids.remove(uid)
            if uids:
                send2client(uids, 'broadcastUserball', data)
        if _hide_ub_ids or _hide_fb_ids:
            log.error("-------------- final hide info. room_id:{0}, uid:{1}, _hide_ub_ids:{2}, _hide_fb_ids:{3}".format(self.__id, uid, _hide_ub_ids, _hide_fb_ids))

        _rank = yield redis.zrank(SET_RANK_ROOM_VOLUME%self.__id, uid)
        _rank = 0 if _rank is None else int(_rank) + 1 
        _total = len(self.__users)
        data.append((_rank, _total))
        defer.returnValue((NO_ERROR, data))