Exemple #1
0
    def patch(self, message, union_message, data, now):
        """填充联盟战争信息
        Args:
            message[protobuf UnionBattleInfo]: 需要打包的联盟信息
            union_message[protobuf UnionBattleInfo]: 己方联盟返回的战斗信息
            data[UserData]
            now[int]: 时间戳
        """
        #本方联盟返回的联盟战斗信息
        message.CopyFrom(union_message)

        #补充个人信息
        user = data.user.get(True)
        union = data.union.get(True)
        message.user.user.user_id = user.id
        message.user.user.name = user.get_readable_name()
        message.user.user.headicon_id = user.icon_id
        message.user.left_attack_count = union.battle_attack_count_left
        message.user.refresh_attack_num = union.battle_attack_refresh_num
        message.user.drum_count = union.battle_drum_count

        if (union_message.stage != union_message.INVALID
                and union_message.stage != union_message.IDLE):
            #在战争中,需要查询对手联盟的战斗信息
            rival_union_req = internal_union_pb2.InternalQueryUnionBattleReq()
            defer = GlobalObject().remote['gunion'].callRemote(
                "query_battle", union_message.rival_union_id,
                rival_union_req.SerializeToString())
            defer.addCallback(self._patch_rival_battle_info, message, data,
                              now)
            return defer
        else:
            return self._patch_ranking_info(message, data, now)
Exemple #2
0
def enterInstance1(dynamicId, characterId, InstanceId):
    '''进入副本
    @param dynamicId: int 角色动态id
    @param characterId: int 角色id
    @param InstanceId: int 副本id
    '''
    vplayer = VCharacterManager().getVCharacterByClientId(dynamicId)
    if not vplayer or vplayer.getLocked():  #判断是否存在角色或者角色是否被锁定
        return
    oldnode = 201000
    if oldnode < 300000 and oldnode != 0:  #如果角色在场景
        #创建新的副本返回服务器编号,副本动态id
        famserTag, famId = FamSerManager().createNewFam(dynamicId)
        if famserTag < 0:
            return
        vplayer.lock()  #锁定角色对象
        newnode = 300000 + famserTag
        #获取角色在原先场景中的实例
        d = GlobalObject().root.callChild("scense_1000", 610, dynamicId,
                                          characterId)
        #调用失败后的处理
        d.addErrback(InFamErrbck, vplayer, newnode, famId)
        #进入副本
        d.addCallback(Transfer1501, newnode, dynamicId, characterId,
                      InstanceId, famId)
        return d
    else:
        dd = defer.Deferred()
        dd.callback({'result': True, 'message': u'nofam'})
        return dd
Exemple #3
0
def enterInstance1(dynamicId, characterId, InstanceId):
    '''进入副本
    @param dynamicId: int 角色动态id
    @param characterId: int 角色id
    @param InstanceId: int 副本id
    '''
    vplayer = VCharacterManager().getVCharacterByClientId(dynamicId)
    if not vplayer or vplayer.getLocked():#判断是否存在角色或者角色是否被锁定
        return
    oldnode = 201000
    if oldnode < 300000 and oldnode != 0:#如果角色在场景
        #创建新的副本返回服务器编号,副本动态id
        famserTag,famId=FamSerManager().createNewFam(dynamicId)
        if famserTag <0:
            return
        vplayer.lock()#锁定角色对象
        newnode = 300000+famserTag
        #获取角色在原先场景中的实例
        d = GlobalObject().root.callChild("scense_1000",610,dynamicId, characterId)
        #调用失败后的处理
        d.addErrback(InFamErrbck,vplayer,newnode,famId)
        #进入副本
        d.addCallback(Transfer1501,newnode,dynamicId,characterId,InstanceId,famId)
        return d
    else:
        dd = defer.Deferred()
        dd.callback({'result':True,'message':u'nofam'})
        return dd
Exemple #4
0
    def _calc_try_forward_season_result(self, union_response, expect,
                                        union_ids, req, res, timer):
        union_res = union_battle_pb2.TryForwardUnionBattleSeasonRes()
        union_res.ParseFromString(union_response)

        if union_res.status != 0:
            raise Exception("Try forward union battle season res error")

        if expect is None and not union_res.enable:
            #无法进入下一个赛季,直接返回
            return self._try_forward_season_succeed(req, res, timer)
        elif expect is not None and union_res.enable != expect:
            #各个联盟进入下一个赛季,出现不一致的情况
            logger.warning("Try forward union battle season unexpected")

        #各个联盟均已经进入下一个赛季
        if len(union_ids) == 0:
            res.enable = True
            self._try_forward_season_for_user_not_belong_to_union()
            return self._try_forward_season_succeed(req, res, timer)

        union_id = union_ids.pop()
        union_req = union_battle_pb2.TryForwardUnionBattleSeasonReq()
        defer = GlobalObject().remote['gunion'].callRemote(
            "try_forward_season", union_id, union_req.SerializeToString())
        defer.addCallback(self._calc_try_forward_season_result, True,
                          union_ids, req, res, timer)
        return defer
Exemple #5
0
 def _calc_exchange(self, data, req, timer):
     comm_req = exchange_pb2.QueryExchangeProportionReq()
     comm_req.user_id = data.id
     defer = GlobalObject().remote["common"].callRemote(
         "query_exchange_info", 1, comm_req.SerializeToString())
     defer.addCallback(self._calc_exchange_proportion, data, req, timer)
     return defer
Exemple #6
0
    def _calc_update(self, data, req, timer):
        """更新史实城信息
        请求 unit 模块
        """
        city_id = LegendCityInfo.generate_id(data.id, req.city_id)
        legendcity = data.legendcity_list.get(city_id)

        unit_req = unit_pb2.UnitUpdateLegendCityReq()
        unit_req.user_id = data.id
        if req.HasField("slogan"):
            unit_req.slogan = req.slogan
        if req.HasField("tax"):
            unit_req.tax = req.tax
        if req.HasField("gold"):
            #消耗元宝
            unit_req.gold = req.gold
            resource = data.resource.get()
            original_gold = resource.gold
            if not resource.cost_gold(req.gold):
                raise Exception("Cost gold failed")
            log = log_formater.output_gold(data,
                                           -req.gold,
                                           log_formater.LEGENDCITY_UPDATE,
                                           "Updata legendcity",
                                           before_gold=original_gold)
            logger.notice(log)

        defer = GlobalObject().remote['unit'].callRemote(
            "update_city_info", legendcity.city_id,
            unit_req.SerializeToString())
        defer.addCallback(self._check_update, data, req, timer)
        defer.addCallback(self._update_succeed, data, req, timer)
        return defer
Exemple #7
0
    def _try_forward_season_for_user_not_belong_to_union(self):
        """让不属于任何联盟的玩家,且参加过上个赛季联盟战争的玩家,进入下一个赛季
        """
        users = []

        flag = True
        begin = 0
        gap = 50
        while flag:
            proxy = DataProxy()
            proxy.search_by_rank("union", "season_score", begin, begin + gap)
            defer = proxy.execute()

            for i, indiv_info in enumerate(
                    proxy.get_rank_result("union", "season_score", begin,
                                          begin + gap)):
                if indiv_info.season_score > 0:
                    if indiv_info.user_id not in users:
                        users.append(indiv_info.user_id)
                else:
                    flag = False
                    break

            begin += gap

        for user_id in users:
            req = internal_pb2.UnionBattleForwardReq()
            defer = GlobalObject().root.callChild(
                "portal", "forward_union_battle_season_forward", user_id,
                req.SerializeToString())
            defer.addCallback(
                self._check_forward_season_for_user_not_belong_to_union)
Exemple #8
0
    def _calc_finish_battle(self, data, req, timer):
        res = transfer_arena_pb2.FinishTransferArenaBattleRes()
        res.status = 0

        #记录次数
        trainer = data.trainer.get()
        trainer.add_daily_battle_transfer(1)

        transfer = data.transfer.get()
        if req.target_id not in transfer.get_match_ids():
            res.ret = transfer_arena_pb2.FinishTransferArenaBattleRes.TARGET_ERROR
            return self._finish_battle_succeed(data, req, res, timer)

        transfer.finish_battle(timer.now)
        win = True if req.battle.result == battle_pb2.BattleOutputInfo.WIN else False

        #请求common模块进行换位
        common_req = internal_pb2.InternalExchangeTransferReq()
        common_req.user_id = data.id
        common_req.target_user_id = req.target_id
        common_req.exchange = win
        common_request = common_req.SerializeToString()

        defer = GlobalObject().remote["common"].callRemote(
            "exchange_transfer", 1, common_request)
        defer.addCallback(self._calc_finish_battle_result, data, req, timer)
        return defer
Exemple #9
0
    def _delete_player(self, data, req, timer):
        if not data.is_valid():
            return data

        force = False
        if req.HasField("force") and req.force == True:
            force = True

        #删除用户数据:
        # 1. 删除联盟数据
        # 2. 删除史实城官职信息
        # 3. 删除用户数据

        union = data.union.get(True)
        if union is not None and force:
            # 退出联盟
            union_req = internal_union_pb2.InternalManageUnionReq()
            union_req.user_id = data.id
            union_req.op = union_pb2.ManageUnionReq.EXIT
            union_req.target_user_id = data.id

            defer = GlobalObject().remote['gunion'].callRemote(
                "manage_union", union.union_id, union_req.SerializeToString())
            defer.addCallback(self._delete_player_union, data)
            return defer

        return self._delete_player_union(None, data)
Exemple #10
0
    def _kickout(self, data, member, target_user_id, timer):
        """踢人
        """
        target_member = member_business.find_member(data, target_user_id)
        if target_member is None:
            logger.debug("User is not belong to union")
            return self._pack_manage_response(union_pb2.UNION_MEMBER_INVALID)

        if member.user_id == target_user_id:
            #任何人都不能踢自己
            logger.debug("User is not belong to union")
            return self._pack_manage_response(union_pb2.UNION_NO_AUTH)

        elif member.is_normal_member():
            #成员不能踢人
            return self._pack_manage_response(union_pb2.UNION_NO_AUTH)

        elif member.is_vice_leader() and not target_member.is_normal_member():
            #副盟主只可以踢成员
            return self._pack_manage_response(union_pb2.UNION_NO_AUTH)

        union = data.union.get()
        member_business.leave_union(data, target_member)

        app_req = internal_union_pb2.InternalUnionOperateReq()
        app_req.operator_user_id = member.user_id
        app_req.union_name = union.get_readable_name()
        app_req.union_id = union.id

        defer = GlobalObject().remote['app'].callRemote(
            "been_kickout_from_union", target_user_id,
            app_req.SerializeToString())
        defer.addCallback(self._post_kickout, data, timer)
        return defer
Exemple #11
0
    def _calc_create_result(self, union_response, data, req, timer):
        union_res = internal_union_pb2.InternalQueryUnionRes()
        union_res.ParseFromString(union_response)
        if union_res.status != 0:
            raise Exception("Create union res error")

        res = union_pb2.CreateUnionRes()
        res.status = 0
        res.ret = union_res.ret
        if res.ret != union_pb2.UNION_OK:
            return self._create_succeed(data, req, res, timer)
        
        #创建联盟
        union_business.create_union(
                data, union_res.union.id, req.gold_cost, timer.now)

        res.union.CopyFrom(union_res.union)
        #第一次创建联盟返回时要把union member信息不全
        user = data.user.get(True)
        res.union.members[0].user.name = user.get_readable_name()
        res.union.members[0].user.level = user.level
        res.union.members[0].user.headicon_id = user.icon_id

        #查询联盟boss
        union_req = internal_union_pb2.InternalQueryUnionBossReq()
        union_req.user_id = data.id

        union = data.union.get(True)
        defer = GlobalObject().remote['gunion'].callRemote(
                "query_unionboss", union.union_id, union_req.SerializeToString())
        defer.addCallback(self._calc_create_result_unionboss, data, req, res, timer)
        return defer
Exemple #12
0
    def _calc_buy_legendcity_goods(self, data, req, timer):
        """购买史实城商店中的商品
        """
        shop_id = ShopInfo.generate_id(data.id, ShopInfo.GOODS_TYPE_LEGENDCITY,
                                       req.index)
        shop = data.shop_list.get(shop_id)
        pay = shop.calc_goods_price(req.goods.id)
        extra_pay = int(pay * (req.tax / 100.0))

        if not shop_business.buy_goods(data, shop, req.goods.id, timer.now,
                                       req.tax):
            raise Exception("Buy Goods failed")

        compare.check_item(data, req.item)

        #请求 Unit 模块,缴税
        unit_req = unit_pb2.UnitBuyGoodsReq()
        unit_req.user_id = data.id
        unit_req.pay = pay
        unit_req.extra_pay = extra_pay
        unit_req.tax = req.tax
        defer = GlobalObject().remote['unit'].callRemote(
            "buy_goods", req.index, unit_req.SerializeToString())
        defer.addCallback(self._pack_buy_legendcity_goods_response, data, req,
                          timer)
        return defer
Exemple #13
0
    def _calc_delete_legend_city(self, status, city_id, timer):
        assert status == 0

        unit_req = unit_pb2.UnitDeleteLegendCityReq()
        defer = GlobalObject().remote['unit'].callRemote(
            "delete_city", city_id, unit_req.SerializeToString())
        defer.addCallback(self._check_delete_legend_city, city_id, timer)
        return defer
Exemple #14
0
    def _calc_get_position_rank(self, state, city_id, res, timer):
        assert state == True

        unit_req = unit_pb2.UnitGetPositionRankReq()
        defer = GlobalObject().remote['unit'].callRemote(
            "get_position_rank", city_id, unit_req.SerializeToString())
        defer.addCallback(self._check_position_rank, city_id, res, timer)
        return defer
Exemple #15
0
def _get_members_info(members, members_info, i):
    app_req = internal_pb2.GetUserBasicInfoReq()
    app_req.user_id = members[i].user_id

    defer = GlobalObject().remote['app'].callRemote("get_user_basic_info",
            members[i].user_id, app_req.SerializeToString())
    defer.addCallback(_get_members_info_result, members, members_info, i)
    return defer
Exemple #16
0
    def _forward_award_prosperity(self, union_id, prosperity):
        union_req = internal_union_pb2.InternalAddUnionProsperityReq()
        union_req.prosperity = prosperity

        defer = GlobalObject().remote['gunion'].callRemote(
            "add_prosperity", union_id, union_req.SerializeToString())
        defer.addCallback(self._check_award_prosperity)
        return defer
Exemple #17
0
    def _query_notice(self, data, basic_data, request, req, timer):
        #查询广播信息

        defer = GlobalObject().remote["common"].callRemote(
            "query_broadcast_record", 1, request)
        defer.addCallback(self._check_query_broadcast_record_result,
                          basic_data, data, req, timer)
        return defer
Exemple #18
0
    def _calc_delete_common(self, status, common_id, timer):
        assert status == 0

        req = internal_pb2.DeleteCommonReq()
        defer = GlobalObject().remote['common'].callRemote(
            "delete_common", common_id, req.SerializeToString())
        defer.addCallback(self._check_delete_common, common_id, timer)
        return defer
Exemple #19
0
    def _calc_union_chat(self, data, req, timer):
        #assert req.type == req.UNION

        union_req = internal_union_pb2.InternalStartUnionChatReq()
        union_req.user_id = data.id
        defer = GlobalObject().remote['gunion'].callRemote(
            "start_union_chat", req.union_id, union_req.SerializeToString())
        defer.addCallback(self._calc_union_chat_result, req, timer)
        return defer
Exemple #20
0
 def _calc_query_anneal_record(self, data, request, req, timer):
     """
     """
     #查询通关信息
     defer = GlobalObject().remote["common"].callRemote(
         "query_anneal_record", 1, request)
     defer.addCallback(self._check_query_anneal_record_result, data, req,
                       timer)
     return defer
Exemple #21
0
 def _calc_delete_notice(self, data, request, req, timer):
     """
     """
     #删除广播信息
     defer = GlobalObject().remote["common"].callRemote(
         "delete_broadcast_record", 1, request)
     defer.addCallback(self._check_delete_broadcast_record_result, data,
                       req, timer)
     return defer
Exemple #22
0
 def _query_union_info(self, proxy, data, plunder, rival, req, timer):
     """"""
     union_req = internal_union_pb2.InternalQueryUnionReq()
     union_req.user_id = data.id
     
     defer = GlobalObject().remote['gunion'].callRemote(
             "query_union_summary", rival.union_id, union_req.SerializeToString())
     defer.addCallback(self._pack_query_player_response, data, plunder, rival, req, timer)
     return defer
Exemple #23
0
    def _calc_gain(self, data, req, timer):
        union = data.union.get()
        union_req = internal_union_pb2.InternalGainUnionBattleScoreReq()
        union_req.union_score = req.score

        defer = GlobalObject().remote['gunion'].callRemote(
            "gain_battle_score", req.union_id, union_req.SerializeToString())
        defer.addCallback(self._calc_gain_post, data, req, timer)
        return defer
Exemple #24
0
    def _calc_query_transfer_arena(self, data, req, timer):
        req = internal_pb2.InternalQueryTransferReq()
        req.user_id = data.id
        request = req.SerializeToString()

        defer = GlobalObject().remote["common"].callRemote(
            "query_transfer_info", 1, request)
        defer.addCallback(self._calc_query_transfer_arena_result, data, req,
                          timer)
        return defer
Exemple #25
0
    def _forward_award_honor(self, user_id, union_id, honor):
        forward_req = union_pb2.AddUnionHonorReq()
        forward_req.union_id = union_id
        forward_req.honor = honor

        defer = GlobalObject().root.callChild("portal", "forward_add_honor",
                                              user_id,
                                              forward_req.SerializeToString())
        defer.addCallback(self._check_award_honor)
        return defer
Exemple #26
0
def _calc_send_mail_to_all_members(member_list, i, user_id, mail_message):
    app_req = internal_pb2.AddMailReq()
    app_req.user_id = user_id
    app_req.recipients_user_id = member_list[i].user_id
    app_req.mail.CopyFrom(mail_message)

    defer = GlobalObject().remote['app'].callRemote("add_mail",
            user_id, app_req.SerializeToString())
    defer.addCallback(_calc_send_mail_to_all_members_result, member_list, i, user_id, mail_message)
    return defer
Exemple #27
0
    def _calc_delete(self, status, union_id, timer):
        """删除联盟
        """
        #请求 Union 模块,删除联盟
        union_req = internal_union_pb2.InternalDeleteUnionReq()

        defer = GlobalObject().remote['gunion'].callRemote(
                "delete_union", union_id, union_req.SerializeToString())
        defer.addCallback(self._check_delete_result, union_id, timer)
        return defer
Exemple #28
0
 def _sync_union(self, data, union_id, timer):
     """同步联盟信息
     """
     #请求 Union 模块
     union_req = internal_union_pb2.InternalQueryUnionReq()
     union_req.user_id = data.id
     defer = GlobalObject().remote['gunion'].callRemote(
         "sync_union", union_id, union_req.SerializeToString())
     defer.addCallback(self._calc_sync_result, data, timer)
     return defer
Exemple #29
0
def JoinDuiWu(dynamicId, pid, pos, dwId):
    """加入队伍
    """
    vplayer = VCharacterManager().getVCharacterByClientId(dynamicId)
    if not vplayer or vplayer.getLocked():  # 判断是否存在角色或者角色是否被锁定
        return
    #    nownode = vplayer.getNode()
    d = GlobalObject().root.callChild("scense_1000", 610, dynamicId, pid)
    d.addErrback(ErorrBack)
    d.addCallback(TransferPlayerJoin, dynamicId, pid, pos, dwId)
    return d
Exemple #30
0
 def _try_cancel_position_of_legendcity(self, data, city_id_list):
     """试图撤掉所有史诗城的官职"""
     unit_req = unit_pb2.UnitCancelPositionReq()
     unit_req.user_id = data.id
     unit_req.force = True
     city_id = city_id_list[-1]
     defer = GlobalObject().remote['unit'].callRemote(
         "cancel_position", city_id, unit_req.SerializeToString())
     defer.addCallback(self._recv_cancel_position_of_legendcity, data,
                       city_id_list)
     return defer
Exemple #31
0
    def _forward_clear_worldboss_merit(self, user_id, timer):
        """向用户转发清空世界boss战功的请求
        """
        req = boss_pb2.ReceiveClearWorldBossMeritReq()
        request = req.SerializeToString()

        defer = GlobalObject().root.callChild("portal",
                                              "forward_clear_worldboss_merit",
                                              user_id, request)
        defer.addCallback(self._check_forward_clear_worldboss_merit)
        return defer
Exemple #32
0
def CreateZuDui(dynamicId,pid,pos,gkType):
    '''创建队伍
    '''
    vplayer = VCharacterManager().getVCharacterByClientId(dynamicId)
    if not vplayer or vplayer.getLocked():#判断是否存在角色或者角色是否被锁定
        return
#    nownode = vplayer.getNode()
    d = GlobalObject().root.callChild("scense_1000",610,dynamicId, pid)
    d.addErrback(ErorrBack)
    d.addCallback(TransferPlayerCreate,dynamicId,pid,pos,gkType)
    return d
Exemple #33
0
def TransferPlayer(deferData,nownode,dynamicId,characterId,placeId,force,vplayer):
    '''传递角色'''
    player,oldplaceId = deferData
    #将角色信息写入新的场景
    d=GlobalObject().root.callChild("scense_1000",612,601,dynamicId, characterId, placeId,force,player)
#    d = root.callChild(nownode,601,dynamicId, characterId, placeId,force,player)
    #调用失败后的处理
    d.addErrback(sceneErorrBack,vplayer)
    #删除原先场景中的角色
    d.addCallback(DropCharacterInScene,vplayer,nownode,dynamicId)
    return d
Exemple #34
0
def Transfer1501(resultdata,nownode,dynamicId,characterId,instanceId,famId):
    '''调用进入副本方法
    @param nownode: int 副本服务器动态id+30W
    '''
    vplayer = VCharacterManager().getVCharacterByClientId(dynamicId)
    player,placeId = resultdata
    #加入角色的实例到创建的副本中去
    d = GlobalObject().root.callChild("scense_1000",1501,player,dynamicId,characterId,instanceId,famId)
    #写入出错时的错误处理
    d.addErrback(InFamErrbck,vplayer,nownode,famId)
    #写入成功时,清除原先场景中的角色实例
    d.addCallback(DropCharacterInSceneForFam,vplayer,nownode,dynamicId,famId)
    return d
Exemple #35
0
def DropCharacterInScene(deferResult,vcharacter,nownode,dynamicId):
    '''删除原先场景中角色的实例
    '''
    if not deferResult.get('result',False):#如果不能进行跳转
        vcharacter.release()#释放角色对象锁
        d = defer.Deferred()
        d.callback(deferResult)
    else:
#        oldnode = vcharacter.getNode()
        d=GlobalObject().root.callChild("scense_1000",612,dynamicId, vcharacter.characterId)
#        d = root.callChild(oldnode,612,dynamicId, vcharacter.characterId)
        d.addErrback(sceneErorrBack2,nownode,dynamicId,vcharacter)
        d.addCallback(cleanOldScene,deferResult,vcharacter,dynamicId,nownode)
    return d
Exemple #36
0
def DropCharacterInSceneForFam(deferResult,vcharacter,nownode,dynamicId,famId):
    '''删除原先场景角色的实例
    '''
    if not deferResult.get('result',False):#如果不能进行跳转
        vcharacter.release()#释放角色对象锁
        d = defer.Deferred()
        d.callback(deferResult)
    else:
#        oldnode = vcharacter.getNode()
        #通知原先场景服务器删除角色的信息
        d = GlobalObject().root.callChild("scense_1000",612,dynamicId, vcharacter.characterId)
        #消息出错时的处理
        d.addErrback(InFamErrbck2,vcharacter,nownode,famId)
        #消息成功时的处理
        d.addCallback(cleanOldSceneForFam,deferResult,vcharacter,nownode,famId)
    return d
Exemple #37
0
def Transfer1502(data,dynamicId,characterId,force):
    '''离开副本后将角色实例传递回来
    '''
    player, placeId = data
    vplayer = VCharacterManager().getVCharacterByClientId(dynamicId)
    oldnode = 201000 #vplayer.getNode()
    famId = vplayer.getFamId()
    if oldnode < 300000:
        dp = defer.Deferred()
        dp.callback({'result':True,'message':u'nofam'})
        return dp
    nownode = SceneSerManager().getBsetScenNodeId(placeId)
    d = GlobalObject().root.callChild("scense_1000",601,dynamicId, characterId, placeId,force,player)
    #进入场景错误时的处理
    d.addErrback(sceneErorrBack,vplayer)
    #进入成功时
    d.addCallback(DropCharacterInFam,vplayer,nownode,dynamicId,oldnode,famId)
    return d
Exemple #38
0
def closeInstance(dynamicId,characterId):
    '''退出副本'''
    vplayer = VCharacterManager().getVCharacterByClientId(dynamicId)
    if not vplayer:
        dp = defer.Deferred()
        dp.callback({'result':True,'message':u'nofam'})
        return dp
    oldnode = 201000 #vplayer.getNode()
    if oldnode > 300000:#如果角色在副本中
        #锁定角色对象
        vplayer.lock()
        #获取角色在原先场景中的实例
        d = GlobalObject().root.callChild("scense_1000",610,dynamicId, characterId)
        #获取错误时的处理
        d.addErrback(sceneErorrBack,vplayer)
        #获取成功时的处理
        d.addCallback(Transfer1502,dynamicId,characterId,True)
        return d
    else:
        dp = defer.Deferred()
        dp.callback({'result':True,'message':u'nofam'})
        return dp