Example #1
0
class RoleRpcMixin(object):
    if 0:
        from game.core import player as player_md
        player = player_md.Player()

    # 角色升级(roleUpgrade)
    # 请求
    #
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型 - 角色基础
    #             战力(fa, int)
    #             等级(lv, int)
    #             当前经验值(exp, int)
    #         游戏模型 - 角色属性
    def rc_roleUpgrade(self):
        iCurLv = self.player.base.GetLv()
        iNextLv = iCurLv + 1
        curRes = Game.res_mgr.res_level.get(iCurLv, None)
        nextRes = Game.res_mgr.res_level.get(iNextLv, None)
        if not nextRes:
            return 0, errcode.EC_MAX_LEVEL
        #先扣经验
        iCurExp = self.player.base.GetExp()
        if iCurExp < curRes.exp:
            return 0, errcode.EC_NOT_ENOUGH
        iNewExp = iCurExp - curRes.exp
        self.player.base.SetExp(iNewExp)
        self.player.base.SetLv(iNextLv)
        #打包返回信息
        dUpdate = {}
        dUpdate["base"] = {}
        dUpdate["base"]["fa"] = self.player.base.fa
        dUpdate["base"]["lv"] = self.player.base.lv
        dUpdate["base"]['exp'] = self.player.base.exp
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp
Example #2
0
class ExamMixin(object):
    if 0:
        from game.core import player as player_md
        player = player_md.Player()

    # 获取问题(getQuestion)
    # 	请求
    # 		第几题(num, int)
    # 	返回
    # 		问题id(qid, int)
    # 		当前分数(score, int)
    # 		当前排行(rank, int)
    def rc_getQuestion(self, num):
        if num < 0 or num > 20:
            return 0, errcode.EC_PARAMS_ERR

        status = Game.rpc_exam_mgr.getStatus()
        if not status:
            return 0, errcode.EC_CLOSE

        questions, startTimePoint = self.player.exam.getExamInfo()
        if num == 1 or not questions or not startTimePoint:
            questions, startTimePoint = Game.rpc_exam_mgr.getExamInfo()
            random.shuffle(questions)
            self.player.exam.setExamInfo(questions, startTimePoint)

        playerExamInfo = Game.rpc_exam_mgr.getPlayerInfo(self.player.id)

        score, rank = 0, 0
        if playerExamInfo:
            score = playerExamInfo.get("score", 0)
            rank = playerExamInfo.get("rank", 0)

        if len(questions) < constant.QUESTION_NUM:
            return 0, errcode.EC_CLOSE

        # 抛事件
        self.player.safe_pub(msg_define.MSG_JOIN_EXAM)

        resp = {
            "qid": questions[num - 1],
            "score": score,
            "rank": rank,
            "ranking": Game.rpc_exam_mgr.getRanking(5),
        }

        return 1, resp

    # 答题(answerQuestion)
    # 	请求
    # 		第几题(num, int)
    # 		答题(answer, int)
    # 	返回
    # 		是否正确(correct, int)
    def rc_answerQuestion(self, num, answer):
        if num < 0 or num > 20:
            return 0, errcode.EC_PARAMS_ERR

        now = int(time.time())
        questions, startTimePoint = self.player.exam.getExamInfo()
        if not questions or not startTimePoint:
            questions, startTimePoint = Game.rpc_exam_mgr.getExamInfo()
            self.player.exam.setExamInfo(questions, startTimePoint)

        qid = questions[num - 1]
        startPoint = startTimePoint[num - 1]
        if now < startPoint:
            return 0, errcode.EC_PARAMS_ERR

        qRes = Game.res_mgr.res_examQuestionPool.get(qid, None)
        if not qRes:
            return 0, errcode.EC_NORES

        correct = 0
        if qRes.correct == answer:
            correct = 1

        useTime = now - startPoint
        if useTime > 10:
            useTime = 10

        if useTime == 0:
            useTime = 1

        point = Game.res_mgr.res_result_useTime_answerPoint.get(
            (correct, useTime), 0)
        self.player.exam.incAnswerTimes()

        pid = self.player.id
        name = self.player.name
        fa = self.player.base.fa

        Game.rpc_exam_mgr.updatePlayer(pid,
                                       name,
                                       fa,
                                       point,
                                       useTime,
                                       _no_result=1)

        resp = {
            "correct": correct,
            "point": point,
        }

        return 1, resp

    # 获取排行榜(getExamRank)
    # 	请求
    # 	返回
    # 		排行榜前20(ranking, [json])
    # 			名字(name, string)
    # 			分数(score, int)
    # 			战力(fa, int)
    def rc_getExamRank(self):
        resp = {
            "ranking": Game.rpc_exam_mgr.getRanking(20),
        }

        return 1, resp

    # 获取活动大厅信息(getActivityLobbyInfo)
    # 	请求
    # 	返回
    # 		答题信息(examInfo, json)
    # 			上期第一名(lastFirst, string)
    def rc_getActivityLobbyInfo(self):
        examInfo = {}
        examInfo["lastFirst"] = Game.rpc_exam_mgr.getLastFirst()

        resp = {
            "examInfo": examInfo,
        }

        return 1, resp
Example #3
0
class HetiRpcMixin(object):
    if 0:
        from game.core import player as player_md
        player = player_md.Player()

    def rc_hetiBuy(self):

        vipLv = self.player.vip.GetVipLv()
        vipRes = Game.res_mgr.res_vip.get(vipLv, None)
        if not vipRes:
            return 0, errcode.EC_NORES

        buyCostRes = Game.res_mgr.res_common.get("hetiBuyCost")
        if not buyCostRes:
            return 0, errcode.EC_NORES

        hetiBuyNum = Game.res_mgr.res_common.get("hetiBuyNum")
        if not hetiBuyNum:
            return 0, errcode.EC_NORES

        num = self.player.heti.GethetiBuyNum()
        if num >= vipRes.hetiBuyNum + hetiBuyNum.i:
            return 0, errcode.EC_HETI_BUYMAX

        if self.player.heti.HetiNum == 0:
            return 0, errcode.EC_HETI_NUMZERO

        respBag = self.player.bag.costItem(buyCostRes.arrayint2,
                                           constant.ITEM_COST_HETI,
                                           wLog=True)
        if not respBag.get("rs", 0):
            return 0, errcode.EC_COST_ERR

        self.player.heti.buyNum()

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["heti"] = self.player.heti.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    def rc_hetiInfo(self):

        dUpdate = {}

        dUpdate["heti"] = self.player.heti.to_init_data()

        # if resp_items or resp_equips:
        #     dUpdate["bag"] = self.player.bag.to_update_data(items=resp_items, equips=resp_equips)
        # if resp_wallet:
        #     dUpdate["wallet"] = self.player.wallet.to_update_data(resp_wallet)

        resp = {
            "allUpdate": dUpdate,
        }

        return 1, resp

    def rc_hetiStart(self):

        heticishu = Game.res_mgr.res_common.get("heticishu")
        if not heticishu:
            return 0, errcode.EC_NORES

        n = self.player.heti.HetiNum
        if heticishu.i <= n:
            return 0, errcode.EC_HETI_MAX

        self.player.heti.start()

        self.player.safe_pub(msg_define.MSG_MINI_GAME_JOIN)

        dUpdate = {}
        dUpdate["heti"] = self.player.heti.to_init_data()

        # if resp_items or resp_equips:
        #     dUpdate["bag"] = self.player.bag.to_update_data(items=resp_items, equips=resp_equips)
        # if resp_wallet:
        #     dUpdate["wallet"] = self.player.wallet.to_update_data(resp_wallet)

        resp = {
            "allUpdate": dUpdate,
        }

        return 1, resp

    def rc_hetiAuto(self):
        dictx = {}
        for key in self.player.heti.obj:
            dictx[key] = dictx.get(key, 0) + 1

        for key, value in dictx.items():
            if (value == max(dictx.values())):
                break

        print("========", key)
        if key == "*-*":
            return self.rc_hetiCao(0)
        else:
            return self.rc_hetiHebing(key, 0, 0)

    def rc_hetiCao(self, data):
        iCurId = self.player.map.mapSubId
        mapSubRes = Game.res_mgr.res_mapSub.get(iCurId)
        if not mapSubRes:
            return 0, errcode.EC_NORES

        hetiTime = Game.res_mgr.res_common.get("hetiTime")
        if not hetiTime:
            return 0, errcode.EC_NORES

        nt = time.time()
        if nt > self.player.heti.st + hetiTime.i + 3:
            return 0, errcode.EC_HETI_TIMEOUT

        if "*-*" not in self.player.heti.obj:
            return 0, errcode.EC_HETI_NOFOUND

        rid, score, boxtype = self.player.heti.caoPre()
        obj = "*-*"
        dReward = {}
        if rid:
            rewardRes = Game.res_mgr.res_reward.get(rid)
            if not rewardRes:
                return 0, errcode.EC_NORES
            dReward = rewardRes.doReward()
            keys = list(dReward.keys())
            if boxtype == 1:  #大奖
                for itemid in keys:
                    if itemid == constant.CURRENCY_COIN:
                        dReward[itemid] = mapSubRes.offcoin * 300
            elif boxtype == 2:  #小将
                for itemid in keys:
                    if itemid == constant.CURRENCY_COIN:
                        dReward[itemid] = mapSubRes.offcoin * 90
        else:
            obj = self.player.heti.cao()

        respBag = self.player.bag.add(dReward,
                                      constant.ITEM_ADD_HETI_REWARD,
                                      wLog=True)

        self.player.heti.addReward(dReward)

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["heti"] = self.player.heti.to_init_data()
        resp = {
            "allUpdate": dUpdate,
            "data": data,
            "obj": obj,
            "score": score,
        }
        return 1, resp

    def rc_hetiHebing(self, obj, data1, data2):
        iCurId = self.player.map.mapSubId
        mapSubRes = Game.res_mgr.res_mapSub.get(iCurId)
        if not mapSubRes:
            return 0, errcode.EC_NORES

        hetihebingReward = Game.res_mgr.res_common.get("hetihebingReward")
        if not hetihebingReward:
            return 0, errcode.EC_NORES

        rewardRes = Game.res_mgr.res_reward.get(hetihebingReward.i)
        if not rewardRes:
            return 0, errcode.EC_NORES
        dReward = rewardRes.doReward()
        keys = list(dReward.keys())
        for itemid in keys:
            if itemid == constant.CURRENCY_COIN:
                dReward[itemid] = mapSubRes.offcoin * 40

        hetiTime = Game.res_mgr.res_common.get("hetiTime")
        if not hetiTime:
            return 0, errcode.EC_NORES

        nt = time.time()
        if nt > self.player.heti.st + hetiTime.i + 3:
            return 0, errcode.EC_HETI_TIMEOUT

        if obj == "*-*":
            return 0, errcode.EC_PARAMS_ERR

        if self.player.heti.obj.count(obj) < 2:
            return 0, errcode.EC_HETI_NOFOUND

        objs, score = self.player.heti.hebing(obj)

        respBag = self.player.bag.add(dReward,
                                      constant.ITEM_ADD_HETI_REWARD,
                                      wLog=True)

        self.player.heti.addReward(dReward)

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["heti"] = self.player.heti.to_init_data()
        resp = {
            "allUpdate": dUpdate,
            "data1": data1,
            "data2": data2,
            "obj": objs,
            "score": score,
        }
        return 1, resp

    def rc_hetiDel(self, obj, data):

        hetiTime = Game.res_mgr.res_common.get("hetiTime")
        if not hetiTime:
            return 0, errcode.EC_NORES

        nt = time.time()
        if nt > self.player.heti.st + hetiTime.i + 3:
            return 0, errcode.EC_HETI_TIMEOUT

        if obj == "*-*":
            return 0, errcode.EC_PARAMS_ERR

        if obj not in self.player.heti.obj:
            return 0, errcode.EC_HETI_NOFOUND

        score = self.player.heti.delv(obj)

        dUpdate = {}

        dUpdate["heti"] = self.player.heti.to_init_data()

        # sleep(1)

        resp = {
            "allUpdate": dUpdate,
            "data": data,
            "score": score,
            "obj": "*-*",
        }

        return 1, resp

    def rc_hetiDone(self):

        orank, nrank = self.player.heti.done()

        resp = {
            "item": self.player.heti.item,
            "score": self.player.heti.histscore,
            "gold": self.player.heti.histgold,
            "rank": nrank,
            "rankHis": orank,
        }

        return 1, resp
Example #4
0
class MarryPlayerRpc(object):
    if 0:
        from game.core import player as player_md
        player = player_md.Player()

    def getMarryStatus(self):
        return self.player.marry.getMarryStatus()

    def isMarriedToday(self):
        return self.player.marry.isMarriedToday()

    def marryPush(self, data):
        spawn(self.player.call, "marryPush", data, noresult=True)

    def marryResultPush(self, data):
        spawn(self.player.call, "marryResultPush", data, noresult=True)

    def marrySomeone(self, pid, name, kind, marryId):
        marryRes = Game.res_mgr.res_marry.get(marryId, None)
        if not marryRes:
            return 0

        mailRes = Game.res_mgr.res_mail.get(constant.MAIL_ID_MARRY_REWARD,
                                            None)

        self.player.marry.marrySomeone(pid, kind, marryId)
        reward = copy.deepcopy(marryRes.reward)
        if self.player.marry.getMarryTimes() == 1:
            for k, v in marryRes.firstReward.items():
                reward.setdefault(k, 0)
                reward[k] += v

        self.player.house.setType(marryId)

        content = mailRes.content % name
        Game.rpc_mail_mgr.sendPersonMail(self.player.id, mailRes.title,
                                         content, reward)
        dUpdate = {}
        dUpdate["wallet"] = self.player.wallet.to_update_data(
            [constant.CURRENCY_BINDGOLD, constant.CURRENCY_GOLD])
        dUpdate["houseInfo"] = self.player.house.to_init_data(),
        dUpdate["marryInfo"] = self.player.marry.to_init_data(),
        pushData = {
            "result": 1,
            "targetPid": pid,
            "allUpdate": dUpdate,
            "houseInfo": self.player.house.to_init_data(),
            "marryInfo": self.player.marry.to_init_data(),
        }
        self.marryResultPush(pushData)

    def marryPowerPush(self, id, en, num, pid, name):
        self.player.marry.marryPowerPush(id, en, num, pid, name)

        dUpdate = {}
        dUpdate["marryInfo"] = self.player.marry.to_init_data()
        pushData = {
            "id": id,  # 配置表id
            "allUpdate": dUpdate,
        }
        spawn(self.player.call, "marryPowerPush", pushData, noresult=True)

    def divorce(self):
        self.player.marry.divorce()
        spawn(self.player.call, "divorcePush", {}, noresult=True)

    def addHouseExp(self, exp, kind):
        self.player.house.addUnrecvExp(exp, kind)
        spawn(self.player.call, "houseUpgradePush", {}, noresult=True)
Example #5
0
class DiaoyuRpcMixin(object):
    if 0:
        from game.core import player as player_md
        player = player_md.Player()

    def rc_diaoyuGetData(self):

        resAct = Game.res_mgr.res_activity.get(constant.ACTIVITY_DIAOYU)
        serverInfo = self.player.base.GetServerInfo()
        if not resAct.isOpen(serverInfo):
            return 0, errcode.EC_DIAOYU_NOTOPEN

        from game.mgr.room import get_rpc_diaoyu
        rpc_diaoyu = get_rpc_diaoyu()
        if not rpc_diaoyu:
            return 0, errcode.EC_GETD_RPC_ROOM_FAIL

        data = self.player.getDiaoyuInfo()
        import app
        rrv = rpc_diaoyu.hello(2, self.player.id, config.serverNo, app.addr,
                               self.player.name, data, 0, 1)
        if not rrv:
            return 0, errcode.EC_CALL_RPC_ROOM_FAIL

        rrv = rpc_diaoyu.get(2, self.player.id)
        if not rrv:
            return 0, errcode.EC_CALL_RPC_ROOM_FAIL

        # 抛事件
        self.player.safe_pub(msg_define.MSG_JOIN_DIAOYU)
        if not self.player.cycleDay.Query("todayHasJoinDiaoyu", 0):
            self.player.safe_pub(msg_define.MSG_ACTIVITY_KF_JOIN)
            self.player.cycleDay.Set("todayHasJoinDiaoyu", 1)

        return 1, rrv["v"]

    def rc_diaoyuExit(self):
        respBag = self.player.diaoyu.exitdiaoyu()
        dUpdate = self.player.packRespBag(respBag)
        dUpdate["diaoyu"] = self.player.diaoyu.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    def rc_diaoyuChange(self, roomid):

        from game.mgr.room import get_rpc_diaoyu
        rpc_diaoyu = get_rpc_diaoyu()
        if not rpc_diaoyu:
            return 0, errcode.EC_GETD_RPC_ROOM_FAIL

        rrv = rpc_diaoyu.changeRoom(2, self.player.id, roomid)
        if not rrv:
            return 0, errcode.EC_DIAOYU_CHANGEROOM_ERR

        return 1, {"roomid": rrv["roomid"]}

    def rc_diaoyuStatus(self, status):

        self.player.diaoyu.status = status

        from game.mgr.room import get_rpc_diaoyu
        rpc_diaoyu = get_rpc_diaoyu()
        if not rpc_diaoyu:
            return 0, errcode.EC_GETD_RPC_ROOM_FAIL

        data = self.player.getDiaoyuInfo()

        rrv = rpc_diaoyu.update(2, self.player.id, data)
        if not rrv:
            return 0, errcode.EC_DIAOYU_STATUSERR

        return 1, {}

    def rc_diaoyudiaoyu(self):

        resAct = Game.res_mgr.res_activity.get(constant.ACTIVITY_DIAOYU)
        serverInfo = self.player.base.GetServerInfo()
        if not resAct.isOpen(serverInfo):
            return 0, errcode.EC_DIAOYU_NOTOPEN

        q = self.player.diaoyu.getFish()
        if not q:
            return 0, errcode.EC_DIAOYU_DIAOYU_NOABLE

        from game.mgr.room import get_rpc_diaoyu
        rpc_diaoyu = get_rpc_diaoyu()
        if not rpc_diaoyu:
            return 0, errcode.EC_GETD_RPC_ROOM_FAIL

        data = self.player.getDiaoyuInfo()

        rrv = rpc_diaoyu.updateNoBroadcast(2, self.player.id, data)
        if not rrv:
            return 0, errcode.EC_DIAOYU_DIAOYUERR

        dUpdate = {}

        dUpdate["diaoyu"] = self.player.diaoyu.to_init_data()

        resp = {"allUpdate": dUpdate, "id": q}

        return 1, resp

    def rc_diaoyuReward(self, quality):
        respBag = self.player.diaoyu.diaoyuReward(quality)
        dUpdate = self.player.packRespBag(respBag)
        dUpdate["diaoyu"] = self.player.diaoyu.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    def rc_diaoyuGetUser(self, id):

        from game.mgr.room import get_rpc_diaoyu
        rpc_diaoyu = get_rpc_diaoyu()
        if not rpc_diaoyu:
            return 0, errcode.EC_GETD_RPC_ROOM_FAIL

        rrv = rpc_diaoyu.getOneByServerNo(2, config.serverNo, id)
        if not rrv:
            return 0, errcode.EC_CALL_RPC_ROOM_FAIL

        # print("1111111111",config.serverNo,id,rrv)

        data = rrv["v"]

        if len(data) == 0:
            return 0, errcode.EC_DIAOYU_NOFOUNDONE

        resp = {}
        resp["data"] = data[0]

        return 1, resp

    def rc_diaoyuRob(self, id, quality):
        diaoyuCatchNum = Game.res_mgr.res_common.get("diaoyuCatchNum")
        if not diaoyuCatchNum:
            return 0, errcode.EC_NORES

        diaoyuRobNum = Game.res_mgr.res_common.get("diaoyuRobNum")
        if not diaoyuRobNum:
            return 0, errcode.EC_NORES

        diaoyuXdayReward = Game.res_mgr.res_common.get("diaoyuXdayReward")
        if not diaoyuXdayReward:
            return 0, errcode.EC_NORES

        if self.player.diaoyu.getDiaoyuRob() >= diaoyuRobNum.i:
            return 0, errcode.EC_DIAOYU_ROB_USEUP

        from game.mgr.room import get_rpc_diaoyu
        rpc_diaoyu = get_rpc_diaoyu()
        if not rpc_diaoyu:
            return 0, errcode.EC_GETD_RPC_ROOM_FAIL

        rrv = rpc_diaoyu.getOneByServerNo(2, config.serverNo, id)
        if not rrv:
            return 0, errcode.EC_CALL_RPC_ROOM_FAIL

        data = rrv["v"]

        if len(data) == 0:
            return 0, errcode.EC_DIAOYU_NOFOUNDONE

        if quality not in data[0]["data"]["yulou"]:
            return 0, errcode.EC_DIAOYU_NOFOUNDONEFISH

        res = Game.res_mgr.res_diaoyu.get(quality)
        if not res:
            return 0, errcode.EC_NORES

        if diaoyuCatchNum.i <= data[0]["data"]["catch"]:
            return 0, errcode.EC_DIAOYU_ROB_LIMIT

        from game.mgr.logicgame import LogicGame
        proxy = get_proxy_by_addr(data[0]["addr"], LogicGame._rpc_name_)
        if not proxy:
            return 0, errcode.EC_GETD_LOGIC_PROXY_ERR

        fdata = self.player.GetFightData()

        historydata = {
            "id": self.player.id,
            "name": self.player.name,
            "quality": quality,
            "redhp": self.player.diaoyu.hp
        }

        resp = proxy.diaoyuRob(self.player.id, data[0], fdata, historydata)
        if not resp:
            return 0, errcode.EC_CALL_LOGIC_PROXY_ERR

        redhp = resp["redhp"]
        self.player.diaoyu.sethp(redhp)

        fightResult = resp["fightLog"]["result"].get("win", 0)
        if fightResult:

            self.player.diaoyu.robFishOk(quality)
            self.player.diaoyu.addDiaoyuRob()

            myhistory = {
                "id": data[0]["id"],
                "name": data[0]["name"],
                "quality": quality
            }
            self.player.diaoyu.addHistory(2, myhistory)

            iOpenDay = self.player.base.GetServerOpenDay()
            reward = copy.deepcopy(res.reward)
            if iOpenDay >= diaoyuXdayReward.i:
                reward = copy.deepcopy(res.reward2)

            respBag = self.player.bag.add(reward,
                                          constant.ITEM_ADD_DIAOYU_ROBREWARD,
                                          wLog=True)
        else:
            self.player.safe_pub(msg_define.MSG_XIANSHITUISONGLIBAO_DIAOYU_F)
            myhistory = {
                "id": data[0]["id"],
                "name": data[0]["name"],
                "quality": quality
            }
            self.player.diaoyu.addHistory(3, myhistory)
            respBag = {}

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["diaoyu"] = self.player.diaoyu.to_init_data()
        resp["allUpdate"] = dUpdate
        return 1, resp

    def rc_diaoyuRank(self):

        resp = {}

        from game.mgr.room import get_rpc_diaoyu
        rpc_diaoyu = get_rpc_diaoyu()
        if not rpc_diaoyu:
            return 0, errcode.EC_GETD_RPC_ROOM_FAIL

        resp = rpc_diaoyu.getRankList(self.player.id)
        if not resp:
            return 0, errcode.EC_DIAOYU_CHANGEROOM_ERR

        # resp["list"]=[]
        # resp["rank"]=666
        # resp["score"]=999

        return 1, resp
Example #6
0
class YishouMixin(object):
    if 0:
        from game.core import player as player_md
        player = player_md.Player()

    # 宠物装备穿戴(petEquipWear)
    # 请求
    #     宠物id(id, int)
    #     装备uid(uid, int)
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型 - 宠物模块(只刷当前操作的)
    def rc_petEquipWear(self, id, uid):
        # 宠物未激活
        if id not in self.player.pet.all_pets:
            return 0, errcode.EC_PET_NOT_ACT
        wearEquip = self.player.pet.yishou_bag.getObj(uid)
        if not wearEquip:
            return 0, errcode.EC_PET_EQUIP_NOT_FIND

        pet = self.player.pet.getPet(id)
        equipRes = Game.res_mgr.res_petEquip.get(wearEquip.id)
        if not equipRes:
            return 0, errcode.EC_NORES

        # 穿戴等级
        if pet.GetLv() < equipRes.needLv:
            return 0, errcode.EC_PET_EQUIP_LV_LIMIT

        wearEquip = self.player.pet.yishou_bag.popObj(uid)
        pos = equipRes.pos
        # 已穿戴,需要替换
        takeoffEquipList = []
        if pet.equips.get(pos):
            takeoffEquipList.append(pet.popEquip(pos))
            self.player.pet.yishou_bag.doAdd(
                takeoffEquipList, constant.ITEM_ADD_PET_EQUIP_TAKE_OFF)
        pet.wearEquip(pos, wearEquip, id)
        # 重算宠物装备属性
        pet.RecalEquipAttr()
        # 重算战力
        self.player.attr.RecalFightAbility()

        # 打包返回信息
        dRole = {}
        dRole["roleBase"] = {"fa": self.player.base.fa}

        dPet = {}
        dPet["actList"] = [pet.to_init_data()]
        dPet.update(
            self.player.pet.to_update_data(equips=takeoffEquipList,
                                           delequips=[wearEquip]))

        dUpdate = {}
        dUpdate["pet"] = dPet
        dUpdate["role"] = dRole
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 宠物装备卸下(petEquipTakeOff)
    # 请求
    #     宠物id(id, int)
    #     装备uid(uid, int)
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型 - 宠物模块(只刷当前操作的)
    def rc_petEquipTakeOff(self, id, uid):
        # 宠物未激活
        if id not in self.player.pet.all_pets:
            return 0, errcode.EC_PET_NOT_ACT
        pet = self.player.pet.getPet(id)

        wearEquip = pet.getEquipByUid(uid)
        if not wearEquip:
            return 0, errcode.EC_PET_EQUIP_NOT_FIND

        equipRes = Game.res_mgr.res_petEquip.get(wearEquip.id)
        if not equipRes:
            return 0, errcode.EC_NORES

        pos = equipRes.pos
        takeoffEquipList = [wearEquip]
        rs = self.player.pet.yishou_bag.doAdd(
            takeoffEquipList, constant.ITEM_ADD_PET_EQUIP_TAKE_OFF)
        if not rs:
            return 0, errcode.EC_PET_EQUIP_BAG_SIZE_LIMIT

        pet.popEquip(pos)

        # 重算宠物装备属性
        pet.RecalEquipAttr()
        # 重算战力
        self.player.attr.RecalFightAbility()

        # 打包返回信息
        dRole = {}
        dRole["roleBase"] = {"fa": self.player.base.fa}

        dPet = {}
        dPet["actList"] = [pet.to_init_data()]
        dPet.update(self.player.pet.to_update_data(equips=takeoffEquipList))

        dUpdate = {}
        dUpdate["pet"] = dPet
        dUpdate["role"] = dRole
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 宠物装备强化(petEquipUpgrade)
    # 请求
    #     宠物id(id, int) #强化背包装备时传0
    #     装备uid(uid, int)
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型 - 宠物模块(只刷当前操作的)
    def rc_petEquipUpgrade(self, id, uid):
        pet = self.player.pet.getPet(id)
        if pet:
            equip = pet.getEquipByUid(uid)
        else:
            equip = self.player.pet.yishou_bag.getObj(uid)
        if not equip:
            return 0, errcode.EC_PET_EQUIP_NOT_FIND

        equipRes = Game.res_mgr.res_petEquip.get(equip.id)
        if not equipRes:
            return 0, errcode.EC_NORES

        nextUpRes = Game.res_mgr.res_qalv_petEquipUpgrade.get(
            (equipRes.quality, equip.addlv))
        if not nextUpRes:
            return 0, errcode.EC_NORES

        # 扣道具
        respBag = self.player.bag.costItem(
            nextUpRes.cost, constant.ITEM_COST_PET_EQUIP_UPGRADE, wLog=True)
        if not respBag.get("rs", 0):
            return 0, errcode.EC_PET_EQUIP_UPGRADE_NOT_ENOUGH

        equip.Upgrade()

        if pet:
            # 重算宠物装备属性
            pet.RecalEquipAttr()
            # 重算战力
            self.player.attr.RecalFightAbility()

        # 打包返回信息
        dRole = {}
        dRole["roleBase"] = {"fa": self.player.base.fa}

        dPet = {}
        if pet:
            dPet["actList"] = [pet.to_init_data()]
        else:
            dPet.update(self.player.pet.to_update_data(equips=[equip]))

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["pet"] = dPet
        dUpdate["role"] = dRole
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 宠物装备共鸣替换(petEquipGongmingTihuan)
    # 请求
    #     宠物id(id, int) #强化背包装备时传0
    #     装备uid(uid, int)
    #     格子index 0 1 2(idx, int)
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型 - 宠物模块(只刷当前操作的)
    def rc_petEquipGongmingTihuan(self, id, uid, idx):

        if idx not in [0, 1, 2]:
            return 0, errcode.EC_NORES

        # print("!!!!!!!!!!!!!!!!!",id, uid, idx)

        pet = self.player.pet.getPet(id)
        if pet:
            equip = pet.getEquipByUid(uid)
        else:
            equip = self.player.pet.yishou_bag.getObj(uid)
        if not equip:
            return 0, errcode.EC_PET_EQUIP_NOT_FIND

        equip.usegongming(idx)

        dRole = {}
        if pet:
            # 重算宠物装备属性
            pet.RecalEquipAttr()
            # 重算战力
            self.player.attr.RecalFightAbility()
            dRole["roleBase"] = {"fa": self.player.base.fa}

        dPet = {}
        if pet:
            dPet["actList"] = [pet.to_init_data()]
        else:
            dPet.update(self.player.pet.to_update_data(equips=[equip]))
            # print("======",dPet)

        dUpdate = {}
        dUpdate["pet"] = dPet
        dUpdate["role"] = dRole
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 宠物装备共鸣(petEquipGongming)
    # 请求
    #     宠物id(id, int) #强化背包装备时传0
    #     装备uid(uid, int)
    #     绑定宠物id(bindpet, int) #绑定的宠物id,不绑定传0
    #     被吃掉的装备uid(eatuid, int)
    #     格子index 0 1 2(idx, int)
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型 - 宠物模块(只刷当前操作的)
    def rc_petEquipGongming(self, id, uid, bindpet, eatuid, idx):

        # print("!!!!!!!!!!!!!!!!!",id, uid, bindpet, eatuid, idx)
        if idx not in [0, 1, 2]:
            return 0, errcode.EC_PET_EQUIP_GONGMING_BAD_IDX

        pet = self.player.pet.getPet(id)
        if pet:
            equip = pet.getEquipByUid(uid)
        else:
            equip = self.player.pet.yishou_bag.getObj(uid)
        if not equip:
            # print("!!!!!!!!!!!!!!!!!33333")
            return 0, errcode.EC_PET_EQUIP_NOT_FIND

        if bindpet:
            bpet = self.player.pet.getPet(bindpet)
            if not bpet:
                return 0, errcode.EC_PET_EQUIP_GONGMING_NOFOUND_BIND_PET

        eatequip = self.player.pet.yishou_bag.getObj(eatuid)
        if not eatequip:
            return 0, errcode.EC_PET_EQUIP_GONGMING_NOFOUND_EAT

        eatequipRes = Game.res_mgr.res_petEquip.get(eatequip.id)
        if not eatequipRes:
            return 0, errcode.EC_NORES

        equipRes = Game.res_mgr.res_petEquip.get(equip.id)
        if not equipRes:
            return 0, errcode.EC_NORES

        if eatequipRes.quality != equipRes.quality:
            return 0, errcode.EC_PET_EQUIP_GONGMING_TYPE_NOTSAME

        oriType = 0
        if bindpet:
            evolveRes = Game.res_mgr.res_idlv_petevolve.get(
                (bpet.id, bpet.evolveLv))
            if not evolveRes:
                # print("!!!!!!!!!!!!!!!!!===")
                return 0, errcode.EC_NORES
            oriType = evolveRes.oriType
            if oriType == 2:
                oriType = 1

        # 扣道具
        equipCost = self.player.pet.yishou_bag.popObj(eatuid)
        if not equipCost:
            return 0, errcode.EC_PET_EQUIP_GONGMING_EAT_FAIL

        choose = []
        for kk, vv in Game.res_mgr.res_shoulinggongming.items():
            if vv.oriType == oriType and idx == vv.idx:
                choose.append((
                    kk,
                    vv.weight,
                ))

        cid = utility.Choice(choose)

        equip.gongming(idx, cid, bindpet)

        dPet = {}
        if pet:
            dPet["actList"] = [pet.to_init_data()]
            dPet.update(self.player.pet.to_update_data(delequips=[equipCost]))
        else:
            dPet.update(
                self.player.pet.to_update_data(equips=[equip],
                                               delequips=[equipCost]))

        # print("eeeeeeeeeeeee",dPet)

        dUpdate = {}
        dUpdate["pet"] = dPet
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 宠物装备强化-定向(petEquipUpgradeDir)
    # 请求
    #     装备uid(uid, int)
    #     道具id(itemid, int)
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型 - 宠物模块(只刷当前操作的)
    def rc_petEquipUpgradeDir(self, id, uid, itemid):
        pet = self.player.pet.getPet(id)
        if pet:
            equip = pet.getEquipByUid(uid)
        else:
            equip = self.player.pet.yishou_bag.getObj(uid)
        if not equip:
            return 0, errcode.EC_PET_EQUIP_NOT_FIND

        itemres = Game.res_mgr.res_item.get(itemid)
        if not itemres:
            return 0, errcode.EC_NORES

        if itemres.type != 2:
            return 0, errcode.EC_NORES

        if itemres.subType != 16:
            return 0, errcode.EC_NORES

        equipRes = Game.res_mgr.res_petEquip.get(equip.id)
        if not equipRes:
            return 0, errcode.EC_NORES

        ysDirCardUpLv = Game.res_mgr.res_common.get("ysDirCardUpLv")
        if not ysDirCardUpLv:
            return 0, errcode.EC_NORES
        ysDirCardUseNum = Game.res_mgr.res_common.get("ysDirCardUseNum")
        if not ysDirCardUseNum:
            return 0, errcode.EC_NORES

        nextlv = 0
        for v in reversed(ysDirCardUpLv.arrayint1):
            if equip.addlv < v:
                nextlv = v

        if not nextlv:
            return 0, errcode.EC_NORES

        upnum = nextlv - equip.addlv

        cost = {itemid: ysDirCardUseNum.arrayint1[equip.dicnum]}
        respBag = self.player.bag.costItem(
            cost, constant.ITEM_COST_PET_EQUIP_UPGRADE, wLog=True)
        if not respBag.get("rs", 0):
            return 0, errcode.EC_PET_EQUIP_UPGRADE_NOT_ENOUGH

        addvice = False
        for upx in range(upnum):

            nextUpRes = Game.res_mgr.res_qalv_petEquipUpgrade.get(
                (equipRes.quality, equip.addlv))
            if not nextUpRes:
                return 0, errcode.EC_NORES

            # 扣道具
            respBag1 = self.player.bag.costItem(
                nextUpRes.cost,
                constant.ITEM_COST_PET_EQUIP_UPGRADE,
                wLog=True)
            if not respBag.get("rs", 0):
                return 0, errcode.EC_PET_EQUIP_UPGRADE_NOT_ENOUGH

            respBag = self.player.mergeRespBag(respBag, respBag1)

            if upx == upnum - 1:
                addvice = True

            equip.UpgradeDir(itemres.arg1, addvice)

        equip.dicnum += 1
        equip.markDirty()

        if pet:
            # 重算宠物装备属性
            pet.RecalEquipAttr()
            # 重算战力
            self.player.attr.RecalFightAbility()

        # 打包返回信息
        dRole = {}
        dRole["roleBase"] = {"fa": self.player.base.fa}

        dPet = {}
        if pet:
            dPet["actList"] = [pet.to_init_data()]
        else:
            dPet.update(self.player.pet.to_update_data(equips=[equip]))

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["pet"] = dPet
        dUpdate["role"] = dRole
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 宠物装备回收(petEquipRecycl)
    # 请求
    #     装备uid列表(uidList, int)
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型 - 宠物模块(只刷当前操作的)
    def rc_petEquipRecycl(self, uidList):
        delequips = []
        reward = {}
        for uid in uidList:
            equip = self.player.pet.yishou_bag.popObj(uid)
            if not equip:
                continue
            equipRes = Game.res_mgr.res_petEquip.get(equip.id)
            if not equipRes:
                continue
            upRes = Game.res_mgr.res_qalv_petEquipUpgrade.get(
                (equipRes.quality, equip.addlv))
            if not upRes:
                continue
            for id, num in upRes.recycl.items():
                if id in reward:
                    reward[id] += num
                else:
                    reward[id] = num

            delequips.append(equip)

        respBag = self.player.bag.add(reward,
                                      constant.ITEM_ADD_PET_EQUIP_RECYCL,
                                      wLog=True)

        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        dPet = dUpdate.setdefault("pet", {})
        dPet.update(self.player.pet.to_update_data(delequips=delequips))
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 宠物装备上锁(petEquipLock)
    # 请求
    #     宠物id(id, int) #背包装备时传0
    #     装备uid(uid, int)
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型 - 宠物模块(只刷当前操作的)
    def rc_petEquipLock(self, id, uid):
        pet = self.player.pet.getPet(id)
        if pet:
            equip = pet.getEquipByUid(uid)
        else:
            equip = self.player.pet.yishou_bag.getObj(uid)
        if not equip:
            return 0, errcode.EC_PET_EQUIP_NOT_FIND

        equip.Lock()

        # 打包返回信息
        dPet = {}
        if pet:
            dPet["actList"] = [pet.to_init_data()]
        else:
            dPet.update(self.player.pet.to_update_data(equips=[equip]))

        dUpdate = {}
        dUpdate["pet"] = dPet
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 宠物装备解锁(petEquipUnLock)
    # 请求
    #     宠物id(id, int) #背包装备时传0
    #     装备uid(uid, int)
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型 - 宠物模块(只刷当前操作的)
    def rc_petEquipUnLock(self, id, uid):
        pet = self.player.pet.getPet(id)
        if pet:
            equip = pet.getEquipByUid(uid)
        else:
            equip = self.player.pet.yishou_bag.getObj(uid)
        if not equip:
            return 0, errcode.EC_PET_EQUIP_NOT_FIND

        equip.UnLock()

        # 打包返回信息
        dPet = {}
        if pet:
            dPet["actList"] = [pet.to_init_data()]
        else:
            dPet.update(self.player.pet.to_update_data(equips=[equip]))

        dUpdate = {}
        dUpdate["pet"] = dPet
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 宠物装备弃置(petEquipSetWaste)
    # 请求
    #     宠物id(id, int) #背包装备时传0
    #     装备uid(uid, int)
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型 - 宠物模块(只刷当前操作的)
    def rc_petEquipSetWaste(self, id, uid):
        pet = self.player.pet.getPet(id)
        if pet:
            equip = pet.getEquipByUid(uid)
        else:
            equip = self.player.pet.yishou_bag.getObj(uid)
        if not equip:
            return 0, errcode.EC_PET_EQUIP_NOT_FIND

        equip.setWaste()

        # 打包返回信息
        dPet = {}
        if pet:
            dPet["actList"] = [pet.to_init_data()]
        else:
            dPet.update(self.player.pet.to_update_data(equips=[equip]))

        dUpdate = {}
        dUpdate["pet"] = dPet
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 宠物装备不弃置(petEquipUnSetWaste)
    # 请求
    #     宠物id(id, int) #背包装备时传0
    #     装备uid(uid, int)
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型 - 宠物模块(只刷当前操作的)
    def rc_petEquipUnSetWaste(self, id, uid):
        pet = self.player.pet.getPet(id)
        if pet:
            equip = pet.getEquipByUid(uid)
        else:
            equip = self.player.pet.yishou_bag.getObj(uid)
        if not equip:
            return 0, errcode.EC_PET_EQUIP_NOT_FIND

        equip.UnSetWaste()

        # 打包返回信息
        dPet = {}
        if pet:
            dPet["actList"] = [pet.to_init_data()]
        else:
            dPet.update(self.player.pet.to_update_data(equips=[equip]))

        dUpdate = {}
        dUpdate["pet"] = dPet
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 宠物装备背包扩容(petEquipBagSizeBuy)
    # 请求
    #     扩容次数(count, int)
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型 - 宠物模块(只刷当前操作的)
    def rc_petEquipBagSizeBuy(self, count):
        yishouBagBuyAddSizeRes = Game.res_mgr.res_common.get(
            "yishouzhilingBuyBagSizeSpacing")
        if not yishouBagBuyAddSizeRes:
            return 0, errcode.EC_NORES

        yishouBagBuyMaxCountRes = Game.res_mgr.res_common.get(
            "yishouBagBuyMaxCount")
        if not yishouBagBuyMaxCountRes:
            return 0, errcode.EC_NORES

        yishouBagBuyCostRes = Game.res_mgr.res_common.get(
            "yishouzhilingBuyBagSizeCost")
        if not yishouBagBuyCostRes:
            return 0, errcode.EC_NORES

        if count + self.player.pet.yishou_bag.buy_count > yishouBagBuyMaxCountRes.i:
            return 0, errcode.EC_PET_EQUIP_ADD_BAG_SIZE_MAX

        total = 0
        curCount = self.player.pet.yishou_bag.buy_count
        for i in range(count):
            curCount += 1
            for one in yishouBagBuyCostRes.arrayint2:
                start, end, price = one
                if start <= curCount <= end:
                    total += price

        # 扣道具
        cost = {constant.CURRENCY_GOLD: total}
        respBag = self.player.bag.costItem(
            cost, constant.ITEM_COST_YISHOU_BAG_SIZE_ADD, wLog=True)
        if not respBag.get("rs", 0):
            return 0, errcode.EC_PET_EQUIP_ADD_BAG_SIZE

        self.player.pet.yishou_bag.addSize(yishouBagBuyAddSizeRes.i * count)
        self.player.pet.yishou_bag.addBuyCount(count)

        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        dPet = dUpdate.setdefault("pet", {})
        dPet["yishou_bag"]["size"] = self.player.pet.yishou_bag.size
        dPet["yishou_bag"]["buyCount"] = self.player.pet.yishou_bag.buy_count

        dUpdate["pet"] = dPet
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp
Example #7
0
class ZhudaoxunliRpcMixin(object):
    if 0:
        from game.core import player as player_md
        player = player_md.Player()


    def rc_zhudaoxunliInit(self):

        if not self.player.zhudaoxunli.time:
            self.player.zhudaoxunli.time=time.time()
            self.player.zhudaoxunli.markDirty()

        dUpdate = {}
        dUpdate["zhudaoxunli"] = self.player.zhudaoxunli.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp
    
    def rc_zhudaoxunliBuyScore(self,num):

        if not self.player.zhudaoxunli.time:
            return 0,errcode.EC_ZHUDAOXUNLI_NOTOPEN

        zhudaoxunliBuy = Game.res_mgr.res_common.get("zhudaoxunliBuy")
        if not zhudaoxunliBuy:
            return 0, errcode.EC_NORES

        cost={}
        for k,v in zhudaoxunliBuy.arrayint2.items():
            cost[k]=v*num
        

        respBag = self.player.bag.costItem(cost, constant.ITEM_COST_ZHUDAOXUNLI_BUYSOCRE, wLog=True)
        if not respBag.get("rs", 0):
            return 0, errcode.EC_NOT_ENOUGH

        self.player.zhudaoxunli.addscore(num*zhudaoxunliBuy.i)

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["zhudaoxunli"] = self.player.zhudaoxunli.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    def rc_zhudaoxunliReward(self,resid):

        if not self.player.zhudaoxunli.time:
            return 0,errcode.EC_ZHUDAOXUNLI_NOTOPEN

        res = Game.res_mgr.res_zhudaoxunliReward.get(resid)
        if not res:
            return 0, errcode.EC_NORES

        d=None
        for v in self.player.zhudaoxunli.data:
            if v["qihao"]==res.qihao:
                d=v
                break

        if not d:
            return 0, errcode.EC_NORES

        if d["score"]<res.need:
            return 0,errcode.EC_ZHUDAOXUNLI_NONEED

        if res.id in d["reward"]:
            return 0,errcode.EC_ZHUDAOXUNLI_ALREADY

        respBag = self.player.bag.add(res.reward, constant.ITEM_ADD_ZHUDAOXUNLI_REWARD, wLog=True)


        self.player.zhudaoxunli.setreward(res.qihao,res.id)

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["zhudaoxunli"] = self.player.zhudaoxunli.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp


    def rc_zhudaoxunliRewardVip(self,resid):

        if not self.player.zhudaoxunli.time:
            return 0,errcode.EC_ZHUDAOXUNLI_NOTOPEN

        res = Game.res_mgr.res_zhudaoxunliReward.get(resid)
        if not res:
            return 0, errcode.EC_NORES

        d=None
        for v in self.player.zhudaoxunli.data:
            if v["qihao"]==res.qihao:
                d=v
                break

        if not d:
            return 0, errcode.EC_NORES

        if not d["isVip"]:
            return 0,errcode.EC_ZHUDAOXUNLI_NOVIP

        if d["score"]<res.need:
            return 0,errcode.EC_ZHUDAOXUNLI_NONEED

        if res.id in d["rewardVip"]:
            return 0,errcode.EC_ZHUDAOXUNLI_ALREADY

        respBag = self.player.bag.add(res.rewardVip, constant.ITEM_ADD_ZHUDAOXUNLI_REWARD, wLog=True)

        self.player.zhudaoxunli.setrewardVip(res.qihao,res.id)

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["zhudaoxunli"] = self.player.zhudaoxunli.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp
Example #8
0
class VipMixin(object):
    if 0:
        from game.core import player as player_md
        player = player_md.Player()

    def rc_vipDayReward(self, lv):
        """vip每日奖励"""
        vipLv = self.player.vip.GetVipLv()
        vipRes = Game.res_mgr.res_vip.get(lv, None)
        if not vipRes:
            return 0, errcode.EC_NORES
        if vipLv < lv:
            return 0, errcode.EC_VIP_REWARD_ALREADY
        getList = self.player.vip.GetVIPDayRewardList()
        if lv in getList:
            return 0, errcode.EC_VIP_REWARD_NOTABLE

        reward = copy.deepcopy(vipRes.dayReward)

        resAct = Game.res_mgr.res_activity.get(constant.ACTIVITY_VIPDAYREWARD)
        serverInfo = self.player.base.GetServerInfo()
        if resAct.isOpen(serverInfo):
            for k, v in reward.items():
                reward[k] = reward[k] * 2

        respBag = self.player.bag.add(reward,
                                      constant.ITEM_ADD_VIP_DAY_REWARD,
                                      wLog=True)

        getList.append(lv)
        self.player.vip.SetVIPDayRewardList(getList)

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["vipInfo"] = self.player.vip.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    def rc_vipReward(self, lv):
        res = Game.res_mgr.res_vip.get(lv)
        if not res:
            return 0, errcode.EC_NORES

        retval = self.player.vip.vipReward(lv)
        if retval == 1:
            return 0, errcode.EC_VIP_REWARD_ALREADY
        elif retval == 2:
            return 0, errcode.EC_VIP_REWARD_NOTABLE

        respBag = self.player.bag.costItem(res.cost,
                                           constant.ITEM_COST_VIP_REWARD,
                                           wLog=True)
        if not respBag.get("rs", 0):
            return 0, errcode.EC_COST_ERR

        respBag1 = self.player.bag.add(res.reward,
                                       constant.ITEM_ADD_VIP_REWARD,
                                       wLog=True)
        respBag = self.player.mergeRespBag(respBag, respBag1)

        self.player.vip.setVipReward(lv)

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["vipInfo"] = self.player.vip.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    def rc_vipMonthReward(self):
        res = Game.res_mgr.res_common.get("monthCardDailyReward")
        if not res:
            return 0, errcode.EC_NORES

        retval = self.player.vip.vipRewardMonth()
        if not retval:
            return 0, errcode.EC_VIP_REWARD_NOTABLE_MONTH

        respBag = self.player.bag.add(res.arrayint2,
                                      constant.ITEM_ADD_VIP_REWARD_MONTH,
                                      wLog=True)

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["vipInfo"] = self.player.vip.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    def rc_vipWeekReward(self):
        res = Game.res_mgr.res_common.get("weekCardDailyReward")
        if not res:
            return 0, errcode.EC_NORES

        retval = self.player.vip.vipRewardWeek()
        if not retval:
            return 0, errcode.EC_VIP_REWARD_NOTABLE_WEEK

        respBag = self.player.bag.add(res.arrayint2,
                                      constant.ITEM_ADD_VIP_REWARD_WEEK,
                                      wLog=True)

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["vipInfo"] = self.player.vip.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    def rc_schdGift(self):

        res = Game.res_mgr.res_schd.get(self.player.charge.schdCharge + 1)
        if not res:
            return 0, errcode.EC_NORES

        if self.player.charge.schdChargeRMB < res.rmb:
            return 0, errcode.EC_VIP_REWARD_NOTABLE

        self.player.charge.schdChargeReward()

        respBag = self.player.bag.add(res.reward,
                                      constant.ITEM_ADD_SCHD,
                                      wLog=True)

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["chargeInfo"] = self.player.charge.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    def rc_dbscGift(self, id):

        res = Game.res_mgr.res_charge.get(id)
        if not res:
            return 0, errcode.EC_NORES

        if id not in self.player.charge.dbscid:
            return 0, errcode.EC_DBSC_REWARD_NOTABLE

        if id in self.player.charge.dbscreward:
            return 0, errcode.EC_DBSC_REWARD_ALREADY

        Game.glog.log2File("rc_dbscGift", "%s %s" % (self.player.id, id))

        self.player.charge.dbscReward(id)

        reward = copy.deepcopy(res.dbscReward)
        resAct = Game.res_mgr.res_activity.get(
            constant.ACTIVITY_CHARGE_TLREWAD)
        if resAct:
            serverInfo = self.player.base.GetServerInfo()
            if resAct.isOpen(serverInfo):
                if id not in self.player.charge.ChargeIDs:
                    self.player.charge.ChargeIDs.append(id)
                    for k, v in res.tlreward.items():
                        reward[k] = reward.get(k, 0) + v

        respBag = self.player.bag.add(reward,
                                      constant.ITEM_ADD_DBSC,
                                      wLog=True)

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["chargeInfo"] = self.player.charge.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        Game.glog.log2File("rc_dbscGift", "%s|%s" % (self.player.id, resp))
        return 1, resp

    def rc_vipBattleJump(self):
        battleJumpNum = self.player.vip.getBattleJumpNum()
        if battleJumpNum == -1:
            return 1, {}
        elif battleJumpNum == 0:
            #扣道具
            costRes = Game.res_mgr.res_common.get("battleJumpCost")
            if not costRes:
                return 0, errcode.EC_NORES
            respBag = self.player.bag.costItem(costRes.arrayint2,
                                               constant.ITEM_COST_BATTLE_JUMP,
                                               wLog=True)
            if not respBag.get("rs", 0):
                return 0, errcode.EC_BATTLE_JUMP_NOT_ENOUGH

            dUpdate = self.player.packRespBag(respBag)
            dUpdate["vipInfo"] = self.player.vip.to_init_data()
            resp = {
                "allUpdate": dUpdate,
            }
            return 1, resp
        else:
            #扣次数
            battleJumpNum -= 1
            self.player.vip.setBattleJumpNum(battleJumpNum)

            dUpdate = {}
            dUpdate["vipInfo"] = self.player.vip.to_init_data()
            resp = {
                "allUpdate": dUpdate,
            }
            return 1, resp

    def rc_vipZhiZunReward(self):
        res = Game.res_mgr.res_common.get("zhizunCardDailyReward")
        if not res:
            return 0, errcode.EC_NORES
        if not self.player.vip.zhizunCardFlag:
            return 0, errcode.EC_ZHIZUN_CARD_NO_HAVE

        isGet = self.player.vip.GetTodayZhiZunRewardFlag()
        if isGet:
            return 0, errcode.EC_ZHIZUN_CARD_DAYREWARD_HAS_GET

        respBag = self.player.bag.add(res.arrayint2,
                                      constant.ITEM_ADD_VIP_REWARD_ZHIZUN,
                                      wLog=True)

        self.player.vip.SetTodayZhiZunRewardFlag(1)

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["vipInfo"] = self.player.vip.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp
Example #9
0
class FriendMixin(object):
    if 0:
        from game.core import player as player_md
        player = player_md.Player()

    # 获取关注列表(getFollowList)
    # 	请求
    # 	返回
    # 		关注列表(followList, [json])
    # 			玩家id(pid, int)
    # 			角色名字(name, string)
    # 			战力(fa, int)
    # 			等级(lv, int)
    # 			vip等级(vip, int)
    # 			性别(sex, int)
    # 				0=? 1=男 2=女
    # 			在线状态(online, int)
    # 				0=不在线 1=在线
    # 			赠送状态(presentStatus, int)
    # 				0=未赠送 1=已赠送
    # 			是否粉丝(isFan, int)
    # 				0=否 1=是
    def rc_getFollowList(self):
        fl, num = Game.rpc_friend_mgr.getFollowList(self.player.id)
        resp = {
            "followList": fl,
            "presentNum": num,
        }

        return 1, resp

    # 获取粉丝列表(getFanList)
    # 	请求
    # 	返回
    # 		粉丝列表(fanList, [json])
    # 			玩家id(pid, int)
    # 			角色名字(name, string)
    # 			战力(fa, int)
    # 			等级(lv, int)
    # 			vip等级(vip, int)
    # 			性别(sex, int)
    # 				0=? 1=男 2=女
    # 			在线状态(online, int)
    # 				0=不在线 1=在线
    # 			接收状态(receiveStatus, int)
    # 				0=未接收 1=已接收
    # 			是否粉丝(isFan, int)
    # 				0=否 1=是
    # 			能否接收(canReceive, int)
    # 				0=不能 1=能
    def rc_getFanList(self):
        fl, num = Game.rpc_friend_mgr.getFanList(self.player.id)
        resp = {
            "fanList": fl,
            "receiveNum": num,
        }

        return 1, resp

    # 获取黑名单(getBlackList)
    #     请求
    #     返回
    #         黑名单(blackList, [json])
    #             玩家id(pid, int)
    #             角色名字(name, string)
    #             战力(fa, int)
    #             等级(lv, int)
    #             vip等级(vip, int)
    #             性别(sex, int)
    #                 0=? 1=男 2=女
    #             在线状态(online, int)
    #                 0=不在线 1=在线
    def rc_getBlackList(self):
        resp = {"blackList": Game.rpc_friend_mgr.getBlackList(self.player.id)}

        return 1, resp

    # 获取推荐列表(getRecommendList)
    # 	请求
    # 	返回
    # 		黑名单(recommendList, [json])
    # 			玩家id(pid, int)
    # 			角色名字(name, string)
    # 			战力(fa, int)
    # 			等级(lv, int)
    # 			vip等级(vip, int)
    # 			性别(sex, int)
    # 				0=? 1=男 2=女
    # 			在线状态(online, int)
    # 				0=不在线 1=在线
    def rc_getRecommendList(self):
        resp = {
            "recommendList":
            Game.rpc_friend_mgr.getRecommendList(self.player.id)
        }

        return 1, resp

    # 关注(addFollow)
    # 	请求
    # 		玩家id(pid, int)
    # 	返回
    # 		玩家id(pid, int)
    def rc_addFollow(self, pid):
        code, status = Game.rpc_friend_mgr.addFollow(self.player.id, pid)
        if code:
            return 0, code
        # 抛事件
        self.player.safe_pub(msg_define.MSG_ADD_FOLLOW_FRIEND)
        return 1, {"pid": pid, "presentStatus": status}

    # 取消关注(delFollow)
    # 	请求
    # 		玩家id(pid, int)
    # 	返回
    # 		玩家id(pid, int)
    def rc_delFollow(self, pid):
        code = Game.rpc_friend_mgr.delFollow(self.player.id, pid)
        if code:
            return 0, code

        return 1, {"pid": pid}

    # 拉入黑名单(addBlack)
    # 	请求
    # 		玩家id(pid, int)
    # 	返回
    # 		玩家id(pid, int)
    def rc_addBlack(self, pid):
        code = Game.rpc_friend_mgr.addBlack(self.player.id, pid)
        if code:
            return 0, code

        return 1, {"pid": pid}

    # 取消黑名单(delBlack)
    # 	请求
    # 		玩家id(pid, int)
    # 	返回
    # 		玩家id(pid, int)
    def rc_delBlack(self, pid):
        code = Game.rpc_friend_mgr.delBlack(self.player.id, pid)
        if code:
            return 0, code

        return 1, {"pid": pid}

    # 赠送(presentFollow)
    # 	请求
    # 		玩家id(pid, int)
    # 	返回
    # 		玩家id(pid, int)
    # 		赠送状态(presentStatus, int)
    # 			0=未发送 1=已发送
    def rc_presentFollow(self, pid):
        code = Game.rpc_friend_mgr.presentFollow(self.player.id, pid)
        if code:
            return 0, code
        # 抛事件
        self.player.safe_pub(msg_define.MSG_FRIEND_SEND)
        return 1, {"pid": pid}

    # 一键赠送(oneKeyPresentFollow)
    # 	请求
    # 	返回
    def rc_oneKeyPresentFollow(self):
        code = Game.rpc_friend_mgr.oneKeyPresentFollow(self.player.id)
        if code:
            return 0, code
        # 抛事件
        self.player.safe_pub(msg_define.MSG_FRIEND_SEND)
        return 1, None

    # 接收(receiveFan)
    # 	请求
    # 		玩家id(pid, int)
    # 	返回
    # 		主动推送刷新(allUpdate, json)
    # 			游戏模型-货币
    # 		玩家id(pid, int)
    # 		接收状态(receiveStatus, int)
    # 			0=未接收 1=已接收
    def rc_receiveFan(self, pid):
        code = Game.rpc_friend_mgr.receiveFan(self.player.id, pid)
        if code:
            return 0, code

        respBag = self.player.bag.add({constant.CURRENCY_FRIEND_COIN: 1},
                                      constant.ITEM_ADD_FRIEND_RECEIVE,
                                      wLog=True)

        dUpdate = self.player.packRespBag(respBag)
        resp = {
            "allUpdate": dUpdate,
            "pid": pid,
        }
        return 1, resp

    # 一键接收(oneKeyReceiveFan)
    # 请求
    # 玩家id列表(pidList, [int])
    # 返回
    # 主动推送刷新(allUpdate, json)
    # 游戏模型 - 货币
    def rc_oneKeyReceiveFan(self, pidList):
        code, num = Game.rpc_friend_mgr.oneKeyReceiveFan(
            self.player.id, pidList)
        if code:
            return 0, code

        respBag = self.player.bag.add({constant.CURRENCY_FRIEND_COIN: num},
                                      constant.ITEM_ADD_FRIEND_RECEIVE,
                                      wLog=True)

        dUpdate = self.player.packRespBag(respBag)
        resp = {
            "allUpdate": dUpdate,
        }

        return 1, resp
Example #10
0
class BasePlayerHander(AbsExport):
    DEBUG = 0
    MAIN_RPC = 1  # 是否rpc主连接

    if 0:
        from game.core import player as player_md

        player = player_md.Player()
        from game.common.gateway import Processer
        rpc = Processer()

    def __init__(self):
        setattr(self, 'player', None)
        setattr(self, 'rpc', None)

    @property
    def pid(self):
        return self.player.data.id if self.player else None

    @property
    def addr(self):
        return self.rpc.addr

    def uninit(self):
        setattr(self, 'player', None)
        self.set_rpc(None)

    def set_player(self, player):
        setattr(self, 'player', player)

    def set_rpc(self, process):
        log.debug('player(%s) handler(%s) set_rpc(%s)', self.pid, id(self),
                  id(process) if process is not None else process)
        if self.rpc:
            self.rpc.close(client=bool(self.MAIN_RPC))
        setattr(self, 'rpc', process)
        if process:
            self.rpc.set_export(self)

    def on_close(self, process):
        """ 断线处理 """
        log.debug('[handler]player(%s)on_close', self.pid)
        self.set_rpc(None)
        if self.player:
            self.player.on_close()

    def call(self, fname, data, noresult=False, timeout=None):
        if self.rpc is None:
            log.warning('***send(fname=%s, data=%s) error: player(%s).handler(%s) ?? handler(%s) rpc_is_None', fname, data,
                     id(self.player) if self.player else None,
                     id(self.player._handler) if self.player else None,
                     id(self))
            return
        if self.DEBUG:
            log.debug('send-- fname %s, data %s', fname, data)
        self.rpc.call(fname, data, noresult=noresult, timeout=timeout)

    def getProcesserInfo(self):
        if self.rpc is None:
            log.warning('***getProcesserInfo error: player(%s).handler(%s) ?? handler(%s) rpc_is_None',
                     id(self.player) if self.player else None,
                     id(self.player._handler) if self.player else None,
                     id(self))
            return
        return self.rpc.getProcesserInfo()

    def stop(self):
        log.debug('[handler]player(%s)stop', self.pid)
        self.set_rpc(None)

    def force_close(self):
        """ 服务器强制网关断开连接 """
        self.rpc.force_close()

    def router(self, addr_fnams):
        """
        添加gateway router
        addr_fnames为{"addr":["f1","f2"]}格式
        """
        if self.rpc:
            self.rpc.router(addr_fnams)

    def remove_router(self, addr):
        self.rpc.remove_router(addr)
Example #11
0
class GuildRpcMixin(object):
    if 0:
        from game.core import player as player_md
        player = player_md.Player()

    # 打开帮会主界面(openGuildUI)
    # 请求
    #     帮会id(guildId, string)
    # 返回
    #     公告(notice, string) 做时间戳校验,客户端如果取到空不做处理
    #     帮主名称(bzName, string)
    #     帮会资金(exp, int)
    #     帮会人数(num, int)
    def rc_openGuildUI(self, guildId):
        rpc_guild = get_rpc_guild(guildId)
        if not rpc_guild:
            return 0, errcode.EC_NOT_FOUND_GUILD
        resp = rpc_guild.to_openUI_dict()
        return 1, resp

    # 创建帮会(createGuild)
    # 请求
    #     帮会名称(name, string)
    #     帮会等级(lv, int)
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型 - 帮会信息
    #         游戏模型 - 货币
    def rc_createGuild(self, name, lv):
        guildlvRes = Game.res_mgr.res_guildlv.get(lv)
        if not guildlvRes:
            return 0, errcode.EC_NORES
        createLvRes = Game.res_mgr.res_common.get("guildCreateLv", [])
        if not createLvRes:
            return 0, errcode.EC_NORES
        if lv not in createLvRes.arrayint1:
            return 0, errcode.EC_GUILD_CREATE_LV_ERR
        #vip限制
        iVip = self.player.vip.GetVipLv()
        if iVip < guildlvRes.vip:
            return 0, errcode.EC_GUILD_CREATE_VIP_LIMIT
        d = Game.store.query_loads(Guild.DATA_CLS.TABLE_NAME, dict(name=name))
        if d:
            return 0, errcode.EC_GUILD_NAME_REPET
        # 扣道具
        respBag = self.player.bag.costItem(guildlvRes.cost,
                                           constant.ITEM_COST_CREATE_GUILD,
                                           wLog=True)
        if not respBag.get("rs", 0):
            return 0, errcode.EC_GUILD_CREATE_NOT_ENOUGH
        #个人信息
        playerInfo = self.player.guild.to_guild_update()
        rs, guildId = Game.rpc_guild_mgr.CreateGuild(name, lv, playerInfo)
        if not rs:
            #返回扣除的材料
            self.player.bag.add(guildlvRes.cost,
                                constant.ITEM_ADD_GUILD_CREATE_FAIL,
                                wLog=True)
            return 0, errcode.EC_GUILD_CREATE_FAIL
        self.player.guild.SetGuildId(guildId)
        # self.player.task.initGuildActTasks()
        # self.player.task.initGuildActRewardTasks()
        # 抛事件
        self.player.safe_pub(msg_define.MSG_JOIN_GUILD)
        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        dUpdate["guildInfo"] = self.player.guild.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 申请/取消入帮(enterGuild)
    # 请求
    #     帮会id(guildId, string)
    #     类型(type, int)
    #         0=取消 1=申请
    # 返回
    #     帮会id(guildId, string)
    #     类型(type, int)
    #         0=未申请 1=已申请
    def rc_enterGuild(self, guildId, type):
        if self.player.guild.GetGuildId():
            return 0, errcode.EC_GUILD_HAS_JOIN
        rpc_guild = get_rpc_guild(guildId)
        if not rpc_guild:
            return 0, errcode.EC_NOT_FOUND_GUILD
        playerInfo = self.player.guild.to_guild_update()
        rs, err = rpc_guild.enterGuild(type, playerInfo)
        if not rs:
            return rs, err
        # 打包返回信息
        resp = {
            "guildId": guildId,
            "type": type,
        }
        return 1, resp

    # 帮会申请批复respGuild
    # 请求
    #     角色id(rid, int)
    #     类型(type, int)
    #         0=拒绝 1=同意
    # 返回
    #     角色id(rid, int)
    #     类型(type, int)
    #         0=拒绝 1=同意
    def rc_respGuild(self, rid, type):
        guildId = self.player.guild.GetGuildId()
        if not guildId:
            return 0, errcode.EC_NO_GUILD
        rpc_guild = get_rpc_guild(guildId)
        if not rpc_guild:
            return 0, errcode.EC_NOT_FOUND_GUILD
        rs, data = rpc_guild.respGuild(self.player.id, rid, type)
        if not rs:
            return rs, data
        # 打包返回信息
        resp = {
            "rid": rid,
            "type": type,
            "num": data,
        }
        return 1, resp

    # 帮会成员操作(guildOper)
    # 请求
    #     角色id(rid, int)
    #     类型(type, int)
    #         1=禅让 2=升职 3=降职 4=踢出
    # 返回
    #     角色id(rid, int)
    #     类型(type, int)
    #         1=禅让 2=升职 3=降职 4=踢出
    def rc_guildOper(self, rid, type):
        guildId = self.player.guild.GetGuildId()
        if not guildId:
            return 0, errcode.EC_NO_GUILD
        rpc_guild = get_rpc_guild(guildId)
        if not rpc_guild:
            return 0, errcode.EC_NOT_FOUND_GUILD
        rs, data = rpc_guild.guildOper(self.player.id, rid, type)
        if not rs:
            return rs, data
        # 打包返回信息
        resp = {
            "rid": rid,
            "type": type,
            "num": data,
        }
        return 1, resp

    # 退出帮会(exitGuild)
    # 请求
    # 返回
    #     注意:客户端要清除帮会模块的本地数据
    def rc_exitGuild(self):
        guildId = self.player.guild.GetGuildId()
        if not guildId:
            return 0, errcode.EC_NO_GUILD
        rpc_guild = get_rpc_guild(guildId)
        if not rpc_guild:
            return 0, errcode.EC_NOT_FOUND_GUILD
        rs, err = rpc_guild.exitGuild(self.player.id)
        if not rs:
            return rs, err
        self.player.guild.SetGuildId(0)
        # 打包返回信息
        return 1, None

    # 帮会改名(guildChangeName)
    # 请求
    #     帮会名称(name, string)
    # 返回
    #     帮会名称(name, string)
    def rc_guildChangeName(self, name):
        guildId = self.player.guild.GetGuildId()
        if not guildId:
            return 0, errcode.EC_NO_GUILD
        rpc_guild = get_rpc_guild(guildId)
        if not rpc_guild:
            return 0, errcode.EC_NOT_FOUND_GUILD
        d = Game.store.query_loads(Guild.DATA_CLS.TABLE_NAME, dict(name=name))
        if d:
            return 0, errcode.EC_GUILD_NAME_REPET
        rs, err = rpc_guild.changeName(self.player.id, name)
        if not rs:
            return rs, err
        # 打包返回信息
        resp = {
            "name": name,
        }
        return 1, resp

    # 帮会改颜色(guildChangeColor)
    # 请求
    #     帮会名称(color, string)
    # 返回
    #     帮会名称(color, string)
    def rc_guildChangeColor(self, color):
        guildId = self.player.guild.GetGuildId()
        if not guildId:
            return 0, errcode.EC_NO_GUILD
        rpc_guild = get_rpc_guild(guildId)
        if not rpc_guild:
            return 0, errcode.EC_NOT_FOUND_GUILD

        rs, err = rpc_guild.changeColor(self.player.id, color)
        if not rs:
            return rs, err
        # 打包返回信息
        resp = {
            "color": color,
        }
        return 1, resp

    # 修改帮会公告(fixGuildNotice)
    # 请求
    #     帮会公告(notice, string)
    # 返回
    #     帮会公告(notice, string)
    def rc_fixGuildNotice(self, notice):
        guildId = self.player.guild.GetGuildId()
        if not guildId:
            return 0, errcode.EC_NO_GUILD
        rpc_guild = get_rpc_guild(guildId)
        if not rpc_guild:
            return 0, errcode.EC_NOT_FOUND_GUILD
        rs, err = rpc_guild.fixNotice(self.player.id, notice)
        if not rs:
            return rs, err
        # 打包返回信息
        resp = {
            "notice": notice,
        }
        return 1, resp

    # 查看帮会记录(getGuildRecord)
    # 请求
    # 返回
    #     记录列表(recordList, [json])
    #         类型(type, int)
    #             1=加入帮会 2=退出帮会 3=被踢 4=升职 5=降职 6=禅让
    #         参数(args, [string])
    #         时间戳(time, int)
    def rc_getGuildRecord(self):
        guildId = self.player.guild.GetGuildId()
        if not guildId:
            return 0, errcode.EC_NO_GUILD
        rpc_guild = get_rpc_guild(guildId)
        if not rpc_guild:
            return 0, errcode.EC_NOT_FOUND_GUILD
        logs = rpc_guild.getLogs()
        recordList = []
        for one in logs:
            iTime, args, type = one
            recordList.append({"type": type, "time": iTime, "args": args})
        # 打包返回信息
        resp = {
            "recordList": recordList,
        }
        return 1, resp

    # 请求帮会成员列表(getGuildMember)
    # 请求
    # 返回
    #     成员列表(roleList, [json])
    #         角色id(rid, int)
    #         角色名字(name, string)
    #         战力(fa, int)
    #         最后一次离线时间戳(time, int)
    #             0=在线
    #         性别(sex, int)
    #             0=? 1=男 2=女
    #         职位(job, int)
    #             1=帮主 2=副帮主 3=成员
    #         对当前帮会的累计贡献(bgCoin, int)
    def rc_getGuildMember(self):
        guildId = self.player.guild.GetGuildId()
        if not guildId:
            return 0, errcode.EC_NO_GUILD
        rpc_guild = get_rpc_guild(guildId)
        if not rpc_guild:
            return 0, errcode.EC_NOT_FOUND_GUILD
        roleList = rpc_guild.getMembers()
        # 打包返回信息
        resp = {
            "roleList": roleList,
        }
        return 1, resp

    # 查看帮会申请列表(getEnterGuild)
    # 请求
    # 返回
    #     申请列表(enterList, [json])
    #         角色id(rid, int)
    #         角色名字(name, string)
    #         战力(fa, int)
    #         性别(sex, int)
    #             0=? 1=男 2=女
    #         等级(lv, int)
    #     是否自动入帮(autoEnter, int)
    #     自动入帮战力(autoFa, int)
    def rc_getEnterGuild(self):
        guildId = self.player.guild.GetGuildId()
        if not guildId:
            return 0, errcode.EC_NO_GUILD
        rpc_guild = get_rpc_guild(guildId)
        if not rpc_guild:
            return 0, errcode.EC_NOT_FOUND_GUILD
        resp = rpc_guild.getApplyData()
        return 1, resp

    # 修改自动入帮条件(fixEnterGuild)
    # 请求
    #     是否自动入帮(autoEnter, int)
    #     自动入帮战力(autoFa, int)
    # 返回
    #     是否自动入帮(autoEnter, int)
    #     自动入帮战力(autoFa, int)
    def rc_fixEnterGuild(self, autoEnter, autoFa):
        guildId = self.player.guild.GetGuildId()
        if not guildId:
            return 0, errcode.EC_NO_GUILD
        rpc_guild = get_rpc_guild(guildId)
        if not rpc_guild:
            return 0, errcode.EC_NOT_FOUND_GUILD
        rs, err = rpc_guild.fixAutoEnter(self.player.id, autoEnter, autoFa)
        if not rs:
            return rs, err
        # 打包返回信息
        resp = {
            "autoEnter": autoEnter,
            "autoFa": autoFa,
        }
        return 1, resp

    # 查看帮会列表(getGuildList)
    # 请求
    # 返回
    #     帮会列表(guildList, [json])
    #         帮会id(guildId, string)
    #         帮会名称(name, string)
    #         帮主名称(bzName, string)
    #         帮会等级(guildLv, int)
    #         当前人数(num, int)
    #         需要战力(fa, int)
    #         是否已申请(status, int)
    #             0=未申请 1=已申请
    def rc_getGuildList(self):
        guildList = Game.rpc_guild_mgr.getGuildList(self.player.id)
        # 打包返回信息
        resp = {
            "guildList": guildList,
        }
        return 1, resp

    # 请求帮会上香记录(getGuildSxList)
    # 请求
    # 返回
    #     上香列表(sxList, [json])
    #         上香时间戳(time, int)
    #         上香人名字(name, string)
    #         上香id(id, int)
    def rc_getGuildSxList(self):
        guildId = self.player.guild.GetGuildId()
        if not guildId:
            return 0, errcode.EC_NO_GUILD
        rpc_guild = get_rpc_guild(guildId)
        if not rpc_guild:
            return 0, errcode.EC_NOT_FOUND_GUILD
        sxList = rpc_guild.getSxList()
        # 打包返回信息
        resp = {
            "sxList": sxList,
        }
        return 1, resp

    # 帮会上香(guildSx)
    # 请求
    #     上香id(id, int)
    # 返回
    #     帮会上香进度(sxBar, int)
    #         帮会每日清0
    #     帮会上香次数(sxNum, int)
    #         帮会每日清0
    #     本人今日是否已上香(finish, int)
    #         个人每日清0
    #         0=未上香 1=已上香
    # 同步给帮会在线的所有人
    #     帮会上香进度(sxBar, int)
    #         帮会每日清0
    #     帮会上香次数(sxNum, int)
    #         帮会每日清0
    def rc_guildSx(self, id):
        sxRes = Game.res_mgr.res_guildSx.get(id)
        if not sxRes:
            return 0, errcode.EC_NORES
        if self.player.guild.GetTodaySXFinish():
            return 0, errcode.EC_GUILD_TODAY_HAS_SX
        guildId = self.player.guild.GetGuildId()
        if not guildId:
            return 0, errcode.EC_NO_GUILD
        rpc_guild = get_rpc_guild(guildId)
        if not rpc_guild:
            return 0, errcode.EC_NOT_FOUND_GUILD
        # 扣道具
        respBag = self.player.bag.costItem(sxRes.cost,
                                           constant.ITEM_COST_GUILD_SX,
                                           wLog=True)
        if not respBag.get("rs", 0):
            return 0, errcode.EC_GUILD_SX_NOT_ENOUGH
        rs, data = rpc_guild.guildSx(self.player.id, id)
        if not rs:
            # 返回扣除的材料
            self.player.bag.add(sxRes.cost,
                                constant.ITEM_ADD_GUILD_SX_FAIL,
                                wLog=True)
            return rs, data
        sxBar, sxNum = data
        self.player.guild.SetTodaySXFinish(1)
        #上香奖励
        respBag1 = self.player.bag.add(sxRes.reward,
                                       constant.ITEM_ADD_GUILD_SX,
                                       wLog=True)
        respBag = self.player.mergeRespBag(respBag, respBag1)
        # 统计次数
        shangxiangNum = self.player.guild.GetShangxiangNum()
        shangxiangNum += 1
        self.player.guild.SetShangxiangNum(shangxiangNum)
        #抛事件
        self.player.safe_pub(msg_define.MSG_GUILD_SX)
        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        resp = {
            "sxBar": sxBar,
            "sxNum": sxNum,
            "finish": 1,
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 领取帮会上香奖励(getGuildSxReward)
    # 请求
    #     上香奖励id(id, int)
    # 返回
    #     上香奖励已领取列表(getList, [int])
    def rc_getGuildSxReward(self, id):
        sxBarRes = Game.res_mgr.res_guildSxBar.get(id)
        if not sxBarRes:
            return 0, errcode.EC_NORES
        getList = self.player.guild.GetTodaySXGetList()
        if id in getList:
            return 0, errcode.EC_GUILD_TODAY_HAS_SX
        guildId = self.player.guild.GetGuildId()
        if not guildId:
            return 0, errcode.EC_NO_GUILD
        rpc_guild = get_rpc_guild(guildId)
        if not rpc_guild:
            return 0, errcode.EC_NOT_FOUND_GUILD
        sxInfo = rpc_guild.GetSxInfo()
        sxBar = sxInfo.get("sxBar", 0)
        if sxBar < sxBarRes.num:
            return 0, errcode.EC_GUILD_SX_REWARD_NOT_ENOUGH
        # 上香奖励
        respBag = self.player.bag.add(sxBarRes.reward,
                                      constant.ITEM_ADD_GUILD_SX_REWARD,
                                      wLog=True)
        getList.append(id)
        self.player.guild.SetTodaySXGetList(getList)
        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        resp = {
            "getList": getList,
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 进入帮会地图(enterGuildScene)
    # 请求
    # 返回
    #     场景人员列表(roleList, [json])
    def rc_enterGuildScene(self):
        guildId = self.player.guild.GetGuildId()
        if not guildId:
            return 0, errcode.EC_NO_GUILD
        rpc_guild = get_rpc_guild(guildId)
        if not rpc_guild:
            return 0, errcode.EC_NOT_FOUND_GUILD
        roleList = []
        pids = rpc_guild.enterGuildScene()
        from game.mgr.player import get_rpc_player
        for pid in pids:
            rpc_player = get_rpc_player(pid)
            info = rpc_player.GetFightData()
            roleList.append(info)
        resp = {
            "roleList": roleList,
        }
        return 1, resp

    # 帮会采集(guildCj)
    # 请求
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型-帮会信息
    #             场景任务(taskList, [json])
    #                 任务表id(taskId, int)
    #                 当前进度(num, int)
    #                 是否已领取(status, int)
    #                     0=未领取 1=已领取
    #                 当前已刷新次数(refeNum, int)
    #             直推当前任务数据
    def rc_guildCj(self):
        guildId = self.player.guild.GetGuildId()
        if not guildId:
            return 0, errcode.EC_NO_GUILD
        info = self.player.guild.GetSceneTaskInfo(constant.GUILD_TASK_TYPE_1)
        taskId = info.get("taskId", 0)
        taskRes = Game.res_mgr.res_guildTask.get(taskId)
        if not taskRes:
            return 0, errcode.EC_NORES
        rewardRes = Game.res_mgr.res_reward.get(int(taskRes.arg2))
        if not rewardRes:
            return 0, errcode.EC_NORES
        guildTaskRewardTimeRes = Game.res_mgr.res_common.get(
            "guildTaskRewardTime")
        if not guildTaskRewardTimeRes:
            return 0, errcode.EC_NORES
        iNum = info.get("num", 0)
        if iNum >= taskRes.condition:
            return 0, errcode.EC_GUILD_TASK_HAS_FINISH
        iHour = current_hour()
        iAdd = 1
        if guildTaskRewardTimeRes.arrayint1[
                0] <= iHour < guildTaskRewardTimeRes.arrayint1[1]:
            iAdd = 5
        info["num"] = iNum + iAdd
        if info["num"] >= taskRes.condition:
            info["num"] = taskRes.condition
        self.player.guild.SetSceneTaskInfo(constant.GUILD_TASK_TYPE_1, info)
        #采集奖励
        respBag = {}
        for i in range(iAdd):
            dReward = rewardRes.doReward()
            respBag1 = self.player.bag.add(dReward,
                                           constant.ITEM_ADD_GUILD_TASK,
                                           wLog=True)
            respBag = self.player.mergeRespBag(respBag, respBag1)
        #统计采集次数
        collectNum = self.player.guild.GetCollectNum()
        collectNum += iAdd
        self.player.guild.SetCollectNum(collectNum)
        # 抛事件
        self.player.safe_pub(msg_define.MSG_GUILD_COLLECT)

        # 打包返回信息

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["guildInfo"] = {"scene": {"taskList": [info]}}
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 帮会打怪(guildKillMst)
    # 请求
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型-帮会信息
    #             场景任务(taskList, [json])
    #                 任务表id(taskId, int)
    #                 当前进度(num, int)
    #                 是否已领取(status, int)
    #                     0=未领取 1=已领取
    #                 当前已刷新次数(refeNum, int)
    #             直推当前任务数据
    def rc_guildKillMst(self):
        guildId = self.player.guild.GetGuildId()
        if not guildId:
            return 0, errcode.EC_NO_GUILD
        info = self.player.guild.GetSceneTaskInfo(constant.GUILD_TASK_TYPE_2)
        taskId = info.get("taskId", 0)
        taskRes = Game.res_mgr.res_guildTask.get(taskId)
        if not taskRes:
            return 0, errcode.EC_NORES
        rewardRes = Game.res_mgr.res_reward.get(int(taskRes.arg2))
        if not rewardRes:
            return 0, errcode.EC_NORES
        iNum = info.get("num", 0)
        if iNum >= taskRes.condition:
            return 0, errcode.EC_GUILD_TASK_HAS_FINISH
        guildTaskRewardTimeRes = Game.res_mgr.res_common.get(
            "guildTaskRewardTime")
        if not guildTaskRewardTimeRes:
            return 0, errcode.EC_NORES
        #初始化副本
        fightobj = Game.fight_mgr.createFight(constant.FIGHT_TYPE_110)
        rs = fightobj.init_by_barrId(self.player, int(taskRes.arg1))
        if not rs:
            return 0, errcode.EC_INIT_BARR_FAIL
        fightLog = fightobj.doFight()
        fightResult = fightLog["result"].get("win", 0)
        #更新数据
        respBag = {}
        if fightResult:
            iHour = current_hour()
            iAdd = 1
            if guildTaskRewardTimeRes.arrayint1[
                    0] <= iHour < guildTaskRewardTimeRes.arrayint1[1]:
                iAdd = 5
            info["num"] = iNum + iAdd
            if info["num"] >= taskRes.condition:
                info["num"] = taskRes.condition

            self.player.guild.SetSceneTaskInfo(constant.GUILD_TASK_TYPE_2,
                                               info)
            # 打怪奖励
            for i in range(iAdd):
                dReward = rewardRes.doReward()
                respBag1 = self.player.bag.add(dReward,
                                               constant.ITEM_ADD_GUILD_TASK,
                                               wLog=True)
                respBag = self.player.mergeRespBag(respBag, respBag1)
            # 统计次数
            monsterNum = self.player.guild.GetMonsterNum()
            monsterNum += iAdd
            self.player.guild.SetMonsterNum(monsterNum)
            # 抛事件
            self.player.safe_pub(msg_define.MSG_GUILD_MONSTER_KILL)
        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        dUpdate["guildInfo"] = {"scene": {"taskList": [info]}}
        resp = {
            "fightLog": fightLog,
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 帮会任务一键完成(guildTaskOneKeyFinish)
    # 请求
    #     任务表id(taskId, int)
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型-帮会信息
    #             场景任务(taskList, [json])
    #                 任务表id(taskId, int)
    #                 当前进度(num, int)
    #                 是否已领取(status, int)
    #                     0=未领取 1=已领取
    #                 当前已刷新次数(refeNum, int)
    #             直推当前任务数据
    def rc_guildTaskOneKeyFinish(self, taskId):
        guildId = self.player.guild.GetGuildId()
        if not guildId:
            return 0, errcode.EC_NO_GUILD
        taskRes = Game.res_mgr.res_guildTask.get(taskId)
        if not taskRes:
            return 0, errcode.EC_NORES
        info = self.player.guild.GetSceneTaskInfo(taskRes.type)
        if not info:
            return 0, errcode.EC_GUILD_TASK_NOT_FOUND
        rewardRes = Game.res_mgr.res_reward.get(int(taskRes.arg2))
        if not rewardRes:
            return 0, errcode.EC_NORES
        iNum = info.get("num", 0)
        if iNum >= taskRes.condition:
            return 0, errcode.EC_GUILD_TASK_HAS_FINISH
        # 扣道具
        respBag = self.player.bag.costItem(
            taskRes.finishCost,
            constant.ITEM_COST_GUILD_TASK_FINISH,
            wLog=True)
        if not respBag.get("rs", 0):
            return 0, errcode.EC_GUILD_TASK_FINISH_NOT_ENOUGH
        # 更新数据
        iAdd = taskRes.condition - iNum
        info["num"] = taskRes.condition
        self.player.guild.SetSceneTaskInfo(taskRes.type, info)
        for i in range(iAdd):
            dReward = rewardRes.doReward()
            respBag1 = self.player.bag.add(dReward,
                                           constant.ITEM_ADD_GUILD_TASK,
                                           wLog=True)
            respBag = self.player.mergeRespBag(respBag, respBag1)

        if taskRes.type == constant.GUILD_TASK_TYPE_1:
            #统计采集次数
            collectNum = self.player.guild.GetCollectNum()
            collectNum += iAdd
            self.player.guild.SetCollectNum(collectNum)
            # 抛事件
            self.player.safe_pub(msg_define.MSG_GUILD_COLLECT)
        if taskRes.type == constant.GUILD_TASK_TYPE_2:
            # 统计次数
            monsterNum = self.player.guild.GetMonsterNum()
            monsterNum += iAdd
            self.player.guild.SetMonsterNum(monsterNum)
            # 抛事件
            self.player.safe_pub(msg_define.MSG_GUILD_MONSTER_KILL)

        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        dUpdate["guildInfo"] = {"scene": {"taskList": [info]}}
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 帮会任务重置(guildTaskReset)
    # 请求
    #     任务表id(taskId, int)
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型-帮会信息
    #             场景任务(taskList, [json])
    #                 任务表id(taskId, int)
    #                 当前进度(num, int)
    #                 是否已领取(status, int)
    #                     0=未领取 1=已领取
    #                 当前已刷新次数(refeNum, int)
    #             直推当前任务数据
    def rc_guildTaskReset(self, taskId):
        guildId = self.player.guild.GetGuildId()
        if not guildId:
            return 0, errcode.EC_NO_GUILD
        taskRes = Game.res_mgr.res_guildTask.get(taskId)
        if not taskRes:
            return 0, errcode.EC_NORES
        info = self.player.guild.GetSceneTaskInfo(taskRes.type)
        if not info:
            return 0, errcode.EC_GUILD_TASK_NOT_FOUND
        iVipLv = self.player.vip.GetVipLv()
        vipRes = Game.res_mgr.res_vip.get(iVipLv)
        if not vipRes:
            return 0, errcode.EC_NORES
        #刷新次数判断
        iRefeNum = info.get("refeNum", 0)
        if iRefeNum >= vipRes.guildTaskResetNum:
            return 0, errcode.EC_GUILD_TASK_RESET_MAX_NUM
        # 扣道具
        respBag = self.player.bag.costItem(taskRes.resetCost,
                                           constant.ITEM_COST_GUILD_TASK_RESET,
                                           wLog=True)
        if not respBag.get("rs", 0):
            return 0, errcode.EC_GUILD_TASK_RESET_NOT_ENOUGH
        # 更新数据
        info["num"] = 0
        info["status"] = 0
        info["refeNum"] = iRefeNum + 1
        self.player.guild.SetSceneTaskInfo(taskRes.type, info)
        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        dUpdate["guildInfo"] = {"scene": {"taskList": [info]}}
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 帮会任务奖励领取(guildTaskGetReward)
    # 请求
    #     任务表id(taskId, int)
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型-帮会信息
    #             场景任务(taskList, [json])
    #                 任务表id(taskId, int)
    #                 当前进度(num, int)
    #                 是否已领取(status, int)
    #                     0=未领取 1=已领取
    #                 当前已刷新次数(refeNum, int)
    #             直推当前任务数据
    def rc_guildTaskGetReward(self, taskId):
        guildId = self.player.guild.GetGuildId()
        if not guildId:
            return 0, errcode.EC_NO_GUILD
        taskRes = Game.res_mgr.res_guildTask.get(taskId)
        if not taskRes:
            return 0, errcode.EC_NORES
        info = self.player.guild.GetSceneTaskInfo(taskRes.type)
        if not info:
            return 0, errcode.EC_GUILD_TASK_NOT_FOUND
        if info["status"] == 1:
            return 0, errcode.EC_GUILD_TASK_REWARD_HAS_GET
        respBag = self.player.bag.add(taskRes.rewardArrayint2,
                                      constant.ITEM_ADD_GUILD_TASK,
                                      wLog=True)
        # 更新数据
        info["status"] = 1
        self.player.guild.SetSceneTaskInfo(taskRes.type, info)
        # 抛事件
        if taskRes.type == constant.GUILD_TASK_TYPE_1:
            self.player.safe_pub(msg_define.MSG_GUILD_SCENE_CJ)
        # 抛事件
        if taskRes.type == constant.GUILD_TASK_TYPE_2:
            self.player.safe_pub(msg_define.MSG_GUILD_SCENE_BARR)
        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        dUpdate["guildInfo"] = {"scene": {"taskList": [info]}}
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 帮会兑换(guildExchange)
    # 请求
    #     兑换索引(id, int) 0,1,2,3
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型-帮会信息
    #             直推当前兑换数据
    #             兑换id列表(exList, [json])
    #                 兑换id(exId, int)
    #                 状态(status, int)
    #                     0=未兑换 1=已兑换
    def rc_guildExchange(self, id):
        guildId = self.player.guild.GetGuildId()
        if not guildId:
            return 0, errcode.EC_NO_GUILD
        if id + 1 > len(self.player.guild.exList):
            return 0, errcode.EC_NORES
        exId, status = self.player.guild.exList[id]
        if status is None:
            return 0, errcode.EC_GUILD_EXCHANGE_NOT_FOUND
        if status == 1:
            return 0, errcode.EC_GUILD_EXCHANGE_HAS_BUY
        exRes = Game.res_mgr.res_exchange.get(exId)
        if not exRes:
            return 0, errcode.EC_NORES
        # 背包检测
        addEquip = {}
        if exRes.equipId:
            addEquip[exRes.equipId] = exRes.num
            iFree = self.player.bag.getFreeSize()
            if iFree < exRes.num:
                return 0, errcode.EC_BAG_FULL
        # 扣道具
        respBag = self.player.bag.costItem(exRes.cost,
                                           constant.ITEM_COST_GUILD_EXCHANGE,
                                           wLog=True)
        if not respBag.get("rs", 0):
            return 0, errcode.EC_GUILD_EXCHANGE_NOT_ENOUGH
        # 加道具
        additem = {}
        itemRes = None
        if exRes.itemId:
            itemRes, itemobj = CreatItem(exRes.itemId)
            for i in range(exRes.num):
                reward = itemobj.getReward()
                for iNo, iNum in reward.items():
                    if iNo in additem:
                        additem[iNo] += iNum
                    else:
                        additem[iNo] = iNum
        respBag1 = self.player.bag.add(additem,
                                       constant.ITEM_ADD_GUILD_EXCHANGE,
                                       wLog=True)
        respBag = self.player.mergeRespBag(respBag, respBag1)
        # 加装备
        equipobjs = []
        for equipNo, num in addEquip.items():
            for i in range(num):
                equipRes, equipobj = CreatEquip(equipNo)
                if not equipobj:
                    break
                equipobjs.append(equipobj)
        rs, _resp_equip = self.player.bag.addEquip(
            equipobjs, constant.ITEM_ADD_GUILD_EXCHANGE)
        respBag = self.player.mergeRespBag(respBag, {"equips": _resp_equip})
        #修改状态
        self.player.guild.exList[id] = (exId, 1)
        self.player.guild.markDirty()
        #抛事件
        if itemRes:
            self.player.safe_pub(msg_define.MSG_GUILD_EXCHANGE,
                                 itemRes.quality)
        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        dUpdate["guildInfo"] = {
            "scene": {
                "exList": self.player.guild.to_exchange_data()
            }
        }
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 帮会兑换免费刷新(guildFreeExRef)
    # 请求
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型 - 帮会信息
    #             兑换id列表(exList, [json])
    #                 兑换id(exId, int)
    #                 状态(status, int)
    #                 0 = 未兑换
    #                 1 = 已兑换
    def rc_guildFreeExRef(self):
        guildId = self.player.guild.GetGuildId()
        if not guildId:
            return 0, errcode.EC_NO_GUILD
        rpc_guild = get_rpc_guild(guildId)
        if not rpc_guild:
            return 0, errcode.EC_NOT_FOUND_GUILD
        iGuildLv = rpc_guild.GetLevel()
        guildlvRes = Game.res_mgr.res_guildlv.get(iGuildLv)
        if not guildlvRes:
            return 0, errcode.EC_NORES
        now = int(time.time())
        if now < self.player.guild.refTime:
            return 0, errcode.EC_GUILD_EX_FREE_REF_TIME_ERR
        self.player.guild.reSetRefTime()
        exList = []
        for i in range(4):
            exId = utility.Choice(guildlvRes.exchange)
            exList.append((exId, 0))
        self.player.guild.SetExList(exList)
        # 打包返回信息
        dUpdate = {}
        dUpdate["guildInfo"] = {
            "scene": {
                "refTime": self.player.guild.refTime,
                "exList": self.player.guild.to_exchange_data()
            }
        }
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 帮会兑换刷新(guildExRef)
    # 请求
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型-帮会信息
    #             兑换可刷新次数(exRefNum, int)
    #             兑换id列表(exList, [json])
    #                 兑换id(exId, int)
    #                 状态(status, int)
    #                     0=未兑换 1=已兑换
    #         游戏模型-货币
    def rc_guildExRef(self):
        guildId = self.player.guild.GetGuildId()
        if not guildId:
            return 0, errcode.EC_NO_GUILD
        rpc_guild = get_rpc_guild(guildId)
        if not rpc_guild:
            return 0, errcode.EC_NOT_FOUND_GUILD
        iGuildLv = rpc_guild.GetLevel()
        guildlvRes = Game.res_mgr.res_guildlv.get(iGuildLv)
        if not guildlvRes:
            return 0, errcode.EC_NORES
        guildRefCostRes = Game.res_mgr.res_common.get(
            "guildRefCost")  # 帮会兑换刷新消耗
        guildRefNumRes = Game.res_mgr.res_common.get(
            "guildRefNum")  # 帮会兑换每日可刷新次数
        if not guildRefCostRes or not guildRefNumRes:
            return 0, errcode.EC_NORES
        iTodayNum = self.player.guild.GetTodayExRefNum()
        if iTodayNum >= guildRefNumRes.i:
            return 0, errcode.EC_GUILD_EXCHANGE_REFESH_MAX
        # 扣道具
        respBag = self.player.bag.costItem(
            guildRefCostRes.arrayint2,
            constant.ITEM_COST_GUILD_EXCHANGE_REFE,
            wLog=True)
        if not respBag.get("rs", 0):
            return 0, errcode.EC_GUILD_EXCHANGE_REFE_NOT_ENOUGH
        iTodayNum += 1
        self.player.guild.SetTodayExRefNum(iTodayNum)
        exList = []
        for i in range(4):
            exId = utility.Choice(guildlvRes.exchange)
            exList.append((exId, 0))
        self.player.guild.SetExList(exList)
        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        dUpdate["guildInfo"] = {
            "scene": {
                "exRefNum": guildRefNumRes.i - iTodayNum,
                "exList": self.player.guild.to_exchange_data()
            }
        }
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 帮会活跃升级(guildActUp)
    # 请求
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型-帮会信息
    #             帮会活跃(act, json)
    #                 帮会活跃等级(actLv, int)
    #                 帮会活跃经验(actExp, int)
    #         游戏模型-货币
    #         游戏模型-角色背包-道具列表
    #         游戏模型-角色基础-战力
    #         游戏模型-角色属性
    def rc_guildActUp(self):
        guildId = self.player.guild.GetGuildId()
        if not guildId:
            return 0, errcode.EC_NO_GUILD
        iActLv = self.player.guild.GetActLv()
        actRes = Game.res_mgr.res_guildAct.get(iActLv)
        if not actRes:
            return 0, errcode.EC_NORES
        nextRes = Game.res_mgr.res_guildAct.get(iActLv + 1)
        if not nextRes:
            return 0, errcode.EC_NORES
        iActExp = self.player.guild.GetActExp()
        if iActExp < actRes.exp:
            return 0, errcode.EC_GUILD_ACT_UPGRADE_EXP_NOT_ENOUGH
        iActExp -= actRes.exp
        self.player.guild.SetActLv(iActLv + 1)
        self.player.guild.SetActExp(iActExp)

        respBag = self.player.bag.add(actRes.reward,
                                      constant.ITEM_ADD_GUILD_ACT_UPGRADE,
                                      wLog=True)
        resp_attr = []
        #删除旧属性
        self.player.attr.delAttr(actRes.attr, constant.FIGHTABILITY_TYPE_18)
        resp_attr.extend(list(actRes.attr.keys()))
        #添加新属性
        self.player.attr.addAttr(nextRes.attr, constant.FIGHTABILITY_TYPE_18)
        resp_attr.extend(list(nextRes.attr.keys()))
        # 战力重算
        self.player.attr.RecalFightAbility()
        # 打包返回信息
        resp_attr = set(resp_attr)

        dUpdate = self.player.packRespBag(respBag,
                                          fa=self.player.base.fa,
                                          roleAttr=resp_attr)
        dUpdate["guildInfo"] = {
            "act": {
                "actLv": self.player.guild.actLv,
                "actExp": self.player.guild.actExp
            }
        }
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 帮会今日活跃奖励领取(getGuildActReward)
    # 请求
    #     活跃任务id(id, int)
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型-帮会信息
    #             帮会活跃(act, json)
    #                 活跃每日奖励已领取列表(getList, [int])
    #                     当前任务数据
    #                     活跃任务id
    #         游戏模型-货币
    #         游戏模型-角色背包-道具列表
    # def rc_getGuildActReward(self, id):
    #     guildId = self.player.guild.GetGuildId()
    #     if not guildId:
    #         return 0, errcode.EC_NO_GUILD
    #     todayActGetList = self.player.guild.GetTodayActGetList()
    #     if id in todayActGetList:
    #         return 0, errcode.EC_GUILD_ACT_TASK_REWARD_HAS_GET
    #     taskRes = Game.res_mgr.res_task.get(id)
    #     if not taskRes:
    #         return 0, errcode.EC_NORES
    #     taskobj = self.player.task.guild_act_reward_tasks.get(id)
    #     if not taskobj:
    #         return 0, errcode.EC_GUILD_ACT_TASK_NOT_FIND
    #     if not taskobj.finish:
    #         return 0, errcode.EC_GUILD_ACT_TASK_NOT_FINISH
    #     if taskobj.GetGetReward():
    #         return 0, errcode.EC_GUILD_ACT_TASK_REWARD_HAS_GET
    #     taskobj.SetGetReward(1)
    #     todayActGetList.append(id)
    #     self.player.guild.SetTodayActGetList(todayActGetList)
    #     #发放奖励
    #     respBag = self.player.bag.add(taskRes.finishReward, constant.ITEM_ADD_GUILD_ACT_TASK, wLog=True)
    #     #统计次数
    #     actRewardNum = self.player.guild.GetActRewardNum()
    #     self.player.guild.SetActRewardNum(actRewardNum+1)
    #     # 抛事件
    #     self.player.safe_pub(msg_define.MSG_GET_GUILD_ACT_REWARD)
    #     #打包返回信息
    #     dUpdate = self.player.packRespBag(respBag)
    #     dUpdate["guildInfo"] = {
    #         "act": {"getList": todayActGetList}
    #     }
    #     resp = {
    #         "allUpdate": dUpdate,
    #     }
    #     return 1, resp

    # 帮会捐献(guildDonate)
    # 请求
    #     道具id(id, string)
    #     数量(num, int)
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型-角色背包-道具列表
    #     帮会资金(exp, int)
    def rc_guildDonate(self, id, num):
        guildId = self.player.guild.GetGuildId()
        if not guildId:
            return 0, errcode.EC_NO_GUILD
        rpc_guild = get_rpc_guild(guildId)
        if not rpc_guild:
            return 0, errcode.EC_NOT_FOUND_GUILD
        itemRes = Game.res_mgr.res_item.get(id)
        if not itemRes:
            return 0, errcode.EC_NORES
        dCost = {id: num}
        # 扣道具
        respBag = self.player.bag.costItem(dCost,
                                           constant.ITEM_COST_GUILD_DONATE,
                                           wLog=True)
        if not respBag.get("rs", 0):
            return 0, errcode.EC_GUILD_DONATE_NOT_ENOUGH
        iAddExp = int(itemRes.arg1) * num
        exp, level = rpc_guild.addExp(iAddExp)
        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        resp = {
            "allUpdate": dUpdate,
            "exp": exp,
            "level": level,
        }
        return 1, resp

    # 帮会技能升级(guildSkillUp)
    # 请求
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型-帮会信息
    #             帮会技能列表(skill, [json])
    #                 部位(pos, int)
    #                 等级(lv, int)
    #         游戏模型-货币
    #         游戏模型-角色基础-战力
    #         游戏模型-角色属性
    def rc_guildSkillUp(self):
        guildId = self.player.guild.GetGuildId()
        if not guildId:
            return 0, errcode.EC_NO_GUILD
        rpc_guild = get_rpc_guild(guildId)
        if not rpc_guild:
            return 0, errcode.EC_NOT_FOUND_GUILD
        iGuildLv = rpc_guild.GetLevel()
        guildlvRes = Game.res_mgr.res_guildlv.get(iGuildLv)
        if not guildlvRes:
            return 0, errcode.EC_NORES
        minPos = 0
        minLv = 0
        for pos in constant.ALL_GUILD_SKILL:
            if not minPos:
                minPos = pos
                minLv = self.player.guild.GetSkillLv(pos)
            else:
                if self.player.guild.GetSkillLv(pos) < minLv:
                    minPos = pos
                    minLv = self.player.guild.GetSkillLv(pos)
        if minLv >= guildlvRes.skillMax:
            return 0, errcode.EC_GUILD_SKILL_UP_LIMIT
        key = (minPos, minLv)
        guildSkillRes = Game.res_mgr.res_poslv_guildSkill.get(key)
        if not guildSkillRes:
            return 0, errcode.EC_NORES
        nextKey = (minPos, minLv + 1)
        nextRes = Game.res_mgr.res_poslv_guildSkill.get(nextKey)
        if not nextRes:
            return 0, errcode.EC_NORES
        # 扣道具
        respBag = self.player.bag.costItem(guildSkillRes.cost,
                                           constant.ITEM_COST_GUILD_SKULL_UP,
                                           wLog=True)
        if not respBag.get("rs", 0):
            return 0, errcode.EC_GUILD_SKILL_UP_NOT_ENOUGH
        #修改等级
        self.player.guild.SetSkillLv(minPos, minLv + 1)
        resp_attr = []
        # 删除旧属性
        self.player.attr.delAttr(guildSkillRes.attr,
                                 constant.FIGHTABILITY_TYPE_18)
        resp_attr.extend(list(guildSkillRes.attr.keys()))
        # 添加新属性
        self.player.attr.addAttr(nextRes.attr, constant.FIGHTABILITY_TYPE_18)
        resp_attr.extend(list(nextRes.attr.keys()))
        # 战力重算
        self.player.attr.RecalFightAbility()
        #统计次数
        skillUpNum = self.player.guild.GetSkillUpNum()
        self.player.guild.SetSkillUpNum(skillUpNum + 1)
        # 抛事件
        self.player.safe_pub(msg_define.MSG_GUILD_SKILL_UPGRADE)

        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag,
                                          fa=self.player.base.fa,
                                          roleAttr=set(resp_attr))
        dUpdate["guildInfo"] = {"skill": self.player.guild.to_skill_data()}
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 帮会副本挑战(guildBarrChallenge)
    # 请求
    #     帮会副本配置表id(id, int)
    #     队伍id(teamId, int)
    # 返回
    # 全队推送(guildBarrChallengeNotice)只推送真人,机器人过滤
    #     帮会副本配置表id(id, int)
    #     战报(fightLog, json)
    #     主动推送刷新(allUpdate, json)
    #         游戏模型-货币
    #         游戏模型-角色基础-经验
    #         游戏模型-角色背包
    #         游戏模型-帮会信息
    #             帮会副本(barr, json)
    #                 已协助次数(helpNum, int)
    #                 已挑战次数(fightNum, int)
    #                 已首通帮会id列表(firstKill, [int])
    def rc_guildBarrChallenge(self, id, teamId):
        guildId = self.player.guild.GetGuildId()
        if not guildId:
            return 0, errcode.EC_NO_GUILD
        resGuidlBarr = Game.res_mgr.res_guildBarr.get(id)
        if not resGuidlBarr:
            return 0, errcode.EC_NORES
        barrRes = Game.res_mgr.res_barrier.get(resGuidlBarr.barrId)
        if not barrRes:
            return 0, errcode.EC_NORES
        rpc_guild = get_rpc_guild(guildId)
        if not rpc_guild:
            return 0, errcode.EC_NOT_FOUND_GUILD
        iGuildLv = rpc_guild.GetLevel()
        if iGuildLv < resGuidlBarr.lv:
            return 0, errcode.EC_GUILD_BARR_LIMIT

        members = Game.rpc_team_mgr.GetTeamInfo(teamId)
        if not members:
            return 0, errcode.EC_TEAM_ERROR
        from game.mgr.player import get_rpc_player
        players = [(None, 1), (None, 1)]
        index = 0
        names = []
        for one in members:
            pid = one.get("rid", 0)
            if not pid:
                continue
            names.append(one.get("name", ""))
            if pid == self.player.id:
                if not one.get("main", 0):
                    return 0, errcode.EC_TEAM_NOT_MAIN
                else:
                    continue
            rpc_player = get_rpc_player(pid)
            if not rpc_player:
                continue
            players[index] = (rpc_player, one.get("isRobot", 1))
            index += 1
        fightobj = Game.fight_mgr.createFight(constant.FIGHT_TYPE_140)
        rs = fightobj.init_by_barrId(resGuidlBarr.barrId,
                                     player1=self.player,
                                     player2=players[0][0],
                                     player3=players[1][0])
        if not rs:
            return 0, errcode.EC_INIT_BARR_FAIL
        fightLog = fightobj.doFight()
        self.player.sendGuildBarrChallengeNotice(id, fightLog, self.player.id)

        pps = []
        if players[0][0]:
            pps.extend(players[0][0].GetPetIDs())
        if players[1][0]:
            pps.extend(players[1][0].GetPetIDs())

        self.player.PostPartnerPets(pps, constant.FIGHT_TYPE_140)

        if players[0][0] and not players[0][1]:
            pps = self.player.GetPetIDs()
            if players[1][0]:
                pps.extend(players[1][0].GetPetIDs())
            players[0][0].PostPartnerPets(pps, constant.FIGHT_TYPE_140)

        if players[1][0] and not players[1][1]:
            pps = self.player.GetPetIDs()
            pps.extend(players[0][0].GetPetIDs())
            players[1][0].PostPartnerPets(pps, constant.FIGHT_TYPE_140)

        # 机器人不推送
        for playerData in players:
            if playerData[1]:
                continue
            playerData[0].sendGuildBarrChallengeNotice(id,
                                                       fightLog,
                                                       self.player.id,
                                                       _no_result=True)
        # 解散队伍
        Game.rpc_team_mgr.DeleteTeam(teamId)
        # 抛事件
        self.player.safe_pub(msg_define.MSG_GUILD_BARR)
        return 1, None
Example #12
0
class ShopMixin(object):
    if 0:
        from game.core import player as player_md
        player = player_md.Player()

    def rc_shopData(self):

        # 打包返回信息
        dUpdate = {}

        dUpdate["shop"] = self.player.shop.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    def rc_shopRefreshFree(self, resid):

        res = Game.res_mgr.res_shopConst.get(resid)
        if not res:
            return 0, errcode.EC_NORES

        if not res.freeRefersh:
            return 0, errcode.EC_NOT_ABLE

        xnum = self.player.shop.getRefreshFreeNum()

        if res.freeRefersh - xnum[resid]["refershnum"] <= 0:
            return 0, errcode.EC_TIMES_FULL

        # print("xnum",xnum)

        self.player.shop.manualRefresh(res)
        self.player.shop.CostRefreshFreeNum(resid)

        # 打包返回信息
        dUpdate = {}

        dUpdate["shop"] = self.player.shop.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    def rc_shopRefreshCost(self, resid):

        res = Game.res_mgr.res_shopConst.get(resid)
        if not res:
            return 0, errcode.EC_NORES

        if not res.costRefersh:
            return 0, errcode.EC_NOT_ABLE

        xnum = self.player.shop.getRefreshCostNum()

        if res.costRefersh - xnum[resid]["refershnum"] <= 0:
            return 0, errcode.EC_TIMES_FULL

        costidx = xnum[resid]["refershnum"]
        if costidx >= len(res.costLadder):
            costidx = len(res.costLadder) - 1

        if costidx == -1:
            return 0, errcode.EC_NORES

        cost = {}
        cost[res.costLadder[costidx][0]] = res.costLadder[costidx][1]

        respBag = self.player.bag.costItem(cost,
                                           constant.ITEM_COST_ZHUANPAN_RESET,
                                           wLog=True)
        if not respBag.get("rs", 0):
            return 0, errcode.EC_COST_ERR

        # print("xnum",xnum)

        self.player.shop.manualRefresh(res)
        self.player.shop.CostRefreshCostNum(resid)

        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)

        dUpdate["shop"] = self.player.shop.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    def rc_shopBuy(self, resid, idx, iscost2, num):

        res = Game.res_mgr.res_shopConst.get(resid)
        if not res:
            return 0, errcode.EC_NORES

        if idx >= len(res.manualgroup):
            print("==========")
            return 0, errcode.EC_NORES

        sd = self.player.shop.getshopdata()
        gid = sd[resid][idx]["id"]
        gnum = sd[resid][idx]["buynum"]

        gres = Game.res_mgr.res_shopGroup.get(gid)
        if not gres:
            return 0, errcode.EC_NORES

        if gres.limitNum:
            lnum = gres.limitNum - gnum
            if lnum < num:
                return 0, errcode.EC_EXHAUSTED

        cost = {}
        reward = {}
        for _ in range(num):
            onecost = gres.cost1
            if iscost2:
                onecost = gres.cost2

            for k, v in onecost.items():
                cost[k] = cost.get(k, 0) + v

            for k, v in gres.reward.items():
                reward[k] = reward.get(k, 0) + v

        respBag1 = self.player.bag.costItem(cost,
                                            constant.ITEM_COST_SHOP,
                                            wLog=True)
        if not respBag1.get("rs", 0):
            return 0, errcode.EC_COST_ERR

        dd = self.player.shop.getGroupID2BuyNum(gres.refCycle)
        dd[gid] = gnum + num
        self.player.shop.setGroupID2BuyNum(gres.refCycle, dd)

        respBag = self.player.bag.add(reward,
                                      constant.ITEM_ADD_SHOP,
                                      wLog=True,
                                      mail=True)

        respBag = self.player.mergeRespBag(respBag, respBag1)

        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)

        dUpdate["shop"] = self.player.shop.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp
Example #13
0
class HouseMixin(object):
    if 0:
        from game.core import player as player_md
        player = player_md.Player()

    # 获取房子信息(getHouseInfo)
    # 	请求
    # 	返回
    # 		对象个人数据(spouseInfo, json)
    # 			角色名称(name, string)
    # 			角色外形列表(showList, [json])
    # 				模块类型(modeType, int)
    # 					1=坐骑 2=翅膀 7=天仙 8=神兵
    # 				幻化类型(imageType, int)
    # 					1=坐骑 2=坐骑皮肤 (其他模块通用)
    # 				幻化id(imageId, int)
    # 					根据类型读取不同的配置表
    # 			称号id(title, int)
    # 			时装id(fashion, int)
    # 			性别(sex, int)
    # 				0=? 1=男 2=女
    # 			套装id(outfit, int)
    def rc_getHouseInfo(self):
        if not self.player.getMarryStatus():
            return 1, None

        spousePid = self.player.marry.getSpousePid()
        from game.mgr.player import get_rpc_player
        spousePlayer = get_rpc_player(spousePid, offline=True)
        if not spousePlayer:
            return 0, errcode.EC_NOFOUND

        resp = {
            "spouseInfo": spousePlayer.packbaseInfo(),
        }

        return 1, resp

    # 升阶(houseUpgrade)
    # 	请求
    # 		是否自动(auto, int)
    # 	返回
    # 		房子id(houseId, int)
    # 		经验(exp, int)
    # 		主动推送刷新(allUpdate,json)
    # 			游戏模型-货币
    # 			游戏模型-角色背包
    # 			游戏模型-角色属性
    # 			游戏模型-角色基础-战力
    def rc_houseUpgrade(self, auto):
        houseType = self.player.house.getHouseType()
        houseId = self.player.house.getHouseId()
        leftExp = self.player.house.getExp()

        if not houseType:
            return 0, errcode.EC_HOUSE_NO_HOUSE

        if not self.player.marry.getMarryStatus():
            return 0, errcode.EC_MARRY_NOT_MARRY

        houseRes = Game.res_mgr.res_house.get(houseId, None)
        if not houseRes:
            return 0, errcode.EC_NORES

        if not houseRes.exp:
            return 0, errcode.EC_HOUSE_MAX_LEVEL

        respBag = self.player.bag.costItem(houseRes.cost,
                                           constant.ITEM_COST_HOUSE_UPGRADE,
                                           wLog=True,
                                           auto=auto)
        if not respBag.get("rs", 0):
            return 0, errcode.EC_HOUSE_UPGRADE_NOT_ENOUGH

        leftExp += houseRes.addExp

        if leftExp >= houseRes.exp:
            leftExp -= houseRes.exp
            oldAttr = Game.res_mgr.res_marry_house_attr.get(
                (houseType, houseId), None)
            if oldAttr:
                self.player.attr.delAttr(oldAttr, constant.PKM2_FA_TYPE_10,
                                         constant.PKM2_ATTR_CONTAINER_GLOBAL)

            houseId += 1
            self.player.house.setHouseId(houseId)
            newAttr = Game.res_mgr.res_marry_house_attr.get(
                (houseType, houseId), None)
            self.player.attr.addAttr(newAttr, constant.PKM2_FA_TYPE_10,
                                     constant.PKM2_ATTR_CONTAINER_GLOBAL)
            self.player.attr.RecalFightAbility()

        self.player.house.setExp(leftExp)

        # 给对象加经验
        spousePid = self.player.marry.getSpousePid()
        from game.mgr.player import get_rpc_player
        spousePlayer = get_rpc_player(spousePid, offline=True)
        if spousePlayer:
            spousePlayer.addHouseExp(houseRes.addExp,
                                     self.player.marry.getKind())

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["attr"] = self.player.attr.to_update_data()
        resp = {
            "allUpdate": dUpdate,
            "houseId": houseId,
            "exp": leftExp,
        }
        return 1, resp

    # 获取未领取经验信息(getUnrecvExpInfo)
    # 	请求
    # 	返回
    # 		经验列表(expList, [json]
    # 			时间(time, int)
    # 			经验(exp, int)
    # 			我当时类型(kind, int)
    def rc_getUnrecvExpInfo(self):
        unrecvExp = self.player.house.getUnrecvExp()
        resp = {
            "expList": unrecvExp,
        }

        return 1, resp

    # 领取经验(receiveExp)
    # 	请求
    # 	返回
    # 		房子id(houseId, int)
    # 		经验(exp, int)
    # 		主动推送刷新(allUpdate,json)
    # 			游戏模型-角色属性
    # 			游戏模型-角色基础-战力
    def rc_receiveExp(self):
        houseType = self.player.house.getHouseType()
        houseId = self.player.house.getHouseId()
        leftExp = self.player.house.getExp()

        if not houseType:
            return 0, errcode.EC_HOUSE_NO_HOUSE

        houseRes = Game.res_mgr.res_house.get(houseId, None)
        if not houseRes:
            return 0, errcode.EC_NORES

        if not houseRes.exp:
            return 0, errcode.EC_HOUSE_MAX_LEVEL

        unrecvExp = self.player.house.getUnrecvExp()
        self.player.house.resetUnrecvExp()

        for item in unrecvExp:
            leftExp += item.get("exp", 0)

        while leftExp >= houseRes.exp:
            leftExp -= houseRes.exp
            oldAttr = Game.res_mgr.res_marry_house_attr.get(
                (houseType, houseId), None)
            if oldAttr:
                self.player.attr.delAttr(oldAttr, constant.PKM2_FA_TYPE_10,
                                         constant.PKM2_ATTR_CONTAINER_GLOBAL)

            houseId += 1
            self.player.house.setHouseId(houseId)
            newAttr = Game.res_mgr.res_marry_house_attr.get(
                (houseType, houseId), None)
            self.player.attr.addAttr(newAttr, constant.PKM2_FA_TYPE_10,
                                     constant.PKM2_ATTR_CONTAINER_GLOBAL)
            self.player.attr.RecalFightAbility()
            houseRes = Game.res_mgr.res_house.get(houseId, None)
            if not houseRes:
                break

        self.player.house.setExp(leftExp)

        dUpdate = {}
        dUpdate["base"] = {"fa": self.player.base.fa}
        dUpdate["attr"] = self.player.attr.to_update_data()
        resp = {
            "allUpdate": dUpdate,
            "houseId": houseId,
            "exp": leftExp,
        }

        return 1, resp
Example #14
0
class MailMixin(object):
    if 0:
        from game.core import player as player_md
        player = player_md.Player()

    # 请求邮件列表(getMailList)
    #     请求
    #     返回
    #         邮件列表(mailList, [json])
    #             邮件id(mid, int)
    #             标题(title, string)
    #             时间戳(addTime, int)
    #             状态(status, int)
    #                 0=未读未领取 1=已读未领取 2=已读已领取
    def rc_getMailList(self):
        mailList = Game.rpc_mail_mgr.getMailList(self.player.id)

        resp = {
            "mailList": mailList,
        }

        return 1, resp

    # 请求邮件详情(getOneMail)
    #     请求
    #         邮件id(mid, int)
    #     返回
    #         邮件id(mid, int)
    #         内容(content, string)
    #         附件列表(attachment, [json])
    #             道具或装备配置表id(id, int)
    #             数量(num, int)
    def rc_getOneMail(self, mid):
        detailInfo = Game.rpc_mail_mgr.getOneMail(self.player.id, mid)

        resp = detailInfo

        return 1, resp

    # 领取附件(getMailItem)
    #     请求
    #         邮件id(mid, int)
    #     返回
    #         邮件id(mid, int)
    #         状态(status, int)
    #             0=未读未领取 1=已读未领取 2=已读已领取
    #         主动推送刷新(allUpdate, json)
    #             游戏模型-货币
    #             游戏模型-角色背包
    def rc_getMailItem(self, mid):
        detailInfo = Game.rpc_mail_mgr.getOneMail(self.player.id,
                                                  mid,
                                                  pack=False)
        status = detailInfo.get("status", 0)
        if status == constant.MAIL_STATUS_3:
            return 0, errcode.EC_MAIL_ALERAY_GET_ATTACHMENT

        attachment = detailInfo.get("attachment", {})
        respBag = self.player.bag.add(attachment,
                                      constant.ITEM_ADD_MAIL_ATTACHMENT,
                                      wLog=True)

        Game.rpc_mail_mgr.takeAttachment(self.player.id, mid)

        dRole = {}
        dRole["roleBase"] = self.player.base.to_init_data()

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["role"] = dRole
        resp = {
            "mid": mid,
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 一键领取附件(OneKeyGetMailItem)
    #     请求
    #     返回
    #         主动推送刷新(allUpdate, json)
    #             游戏模型-货币
    #             游戏模型-角色背包
    def rc_OneKeyGetMailItem(self):
        mailList = Game.rpc_mail_mgr.getMailList(self.player.id)

        reward = {}

        # freeSize = self.player.bag.getFreeSize()

        untake = []

        for mail in mailList:
            mid = mail.get("mid", 0)
            hasAttachment = mail.get("hasAttachment", 0)
            status = mail.get("status", 0)
            if hasAttachment and status != constant.MAIL_STATUS_3:
                detailInfo = Game.rpc_mail_mgr.getOneMail(self.player.id,
                                                          mid,
                                                          pack=False)
                attachment = detailInfo.get("attachment", {})

                # equipCount = 0
                # for k, v in attachment.items():
                #     if k >= constant.EQUIP_START_NO:
                #         equipCount += v

                # if freeSize >= equipCount:
                # freeSize -= equipCount

                for k, v in attachment.items():
                    if k in reward:
                        reward[k] = reward[k] + v
                    else:
                        reward[k] = v

                Game.rpc_mail_mgr.takeAttachment(self.player.id, mid)
                # else:
                #     Game.rpc_mail_mgr.readMail(self.player.id, mid)
                #     untake.append(mid)
            else:
                Game.rpc_mail_mgr.readMail(self.player.id, mid)

        respBag = self.player.bag.add(
            reward,
            constant.ITEM_ADD_MAIL_ATTACHMENT,
            wLog=True,
        )

        dRole = {}
        dRole["roleBase"] = self.player.base.to_init_data()

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["role"] = dRole
        resp = {
            "untake": untake,
            "allUpdate": dUpdate,
        }
        return 1, resp
Example #15
0
class BagRpcMixin(object):
    if 0:
        from game.core import player as player_md
        player = player_md.Player()

    # 背包扩容(bagAddSize)
    # 请求
    #   类型(tp, int)    1=装备背包
    #   扩容数(add, int)
    #
    # 返回
    #   容量(size, int)
    #   主动推送刷新(allUpdate, json)
    #       游戏模型 - 货币
    def rc_bagAddSize(self, tp, add):
        if add <= 0:
            return 0, errcode.EC_VALUE
        bag = None
        if tp == 1:
            bag = self.player.bag.equip_bag
        if not bag:
            return 0, errcode.EC_NOFOUND

        iOldSize = bag.size
        maxRes = Game.res_mgr.res_common.get("bagMaxSize", None)
        if iOldSize + add > maxRes.i:
            return 0, errcode.EC_BAG_SIZE_MAX
        #先扣钱,再扩容
        res = Game.res_mgr.res_common.get("bagAddSizeCost", None)
        dCost = {}
        for itemNo, num in res.arrayint2.items():
            dCost[itemNo] = num * add
        respBag = self.player.bag.costItem(dCost,
                                           constant.ITEM_COST_ADD_BAGSIZE,
                                           wLog=True)
        if not respBag.get("rs", 0):
            return 0, errcode.EC_COST_ERR
        iNewSize = bag.addSize(add)
        #记录日志
        Game.glog.log2File(
            "rc_bagAddSize",
            "%s|%s|%s|%s|%s" % (self.player.id, tp, iOldSize, add, iNewSize))
        #打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        resp = {
            "size": bag.size,
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 道具使用(itemUse)
    # 请求
    #   道具uid(uid, string)
    #   数量(num, int)
    #
    # 返回
    #   主动推送刷新(allUpdate, json)
    #       游戏模型 - 角色背包 - 道具列表
    #       游戏模型 - 其他各种数据变化
    def rc_itemUse(self, uid, num):
        if num <= 0:
            return 0, errcode.EC_PARAMS_ERR
        itemobj = self.player.bag.item_bag.getObj(uid)
        if not itemobj:
            return 0, errcode.EC_NOFOUND
        if itemobj.getNum() < num:
            return 0, errcode.EC_NOT_ENOUGH
        itemRes = Game.res_mgr.res_item.get(itemobj.resID)
        if not itemRes:
            return 0, errcode.EC_NORES
        if not itemRes.use:
            return 0, errcode.EC_TIMES_FULL

        itemobj.Use(num)
        return 1, None

    # 可选宝箱使用(selectBoxUse)
    # 请求
    #     道具uid(uid, string)
    #     数量(num, int)
    #     选择道具id(select, int)
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型 - 角色背包 - 道具列表
    #         游戏模型 - 其他各种数据变化
    def rc_selectBoxUse(self, uid, num, select):
        if num <= 0:
            return 0, errcode.EC_PARAMS_ERR
        itemobj = self.player.bag.item_bag.getObj(uid)
        if not itemobj:
            return 0, errcode.EC_NOFOUND
        if itemobj.getNum() < num:
            return 0, errcode.EC_NOT_ENOUGH
        itemRes = Game.res_mgr.res_item.get(itemobj.resID)
        if not itemRes:
            return 0, errcode.EC_NORES
        if not itemRes.use:
            return 0, errcode.EC_TIMES_FULL

        itemobj.Use(num, select)
        return 1, None

    # 道具合成(itemCompound)
    # 请求
    #     道具uid(uid, string)
    #     数量(num, int)
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型 - 角色背包 - 道具列表
    def rc_itemCompound(self, uid, num):
        if num <= 0:
            return 0, errcode.EC_PARAMS_ERR
        itemobj = self.player.item_bag.getObj(uid)
        if not itemobj:
            return 0, errcode.EC_NOFOUND
        itemRes = Game.res_mgr.res_item.get(itemobj.resID)
        if not itemRes or not itemRes.compound:
            return 0, errcode.EC_NORES
        iNeed = itemRes.compound[0] * num
        iCompoundId = itemRes.compound[1]
        isRewardID = 0
        if len(itemRes.compound) >= 3:
            isRewardID = itemRes.compound[2]
        rewardRes = None
        if isRewardID:
            rewardRes = Game.res_mgr.res_reward.get(iCompoundId)
            if not rewardRes:
                return 0, errcode.EC_NORES
        else:
            itemCompoundRes = Game.res_mgr.res_item.get(iCompoundId)
            if not itemCompoundRes:
                return 0, errcode.EC_NORES
        if itemobj.getNum() < iNeed:
            return 0, errcode.EC_NOT_ENOUGH
        dCost = {itemobj.resID: iNeed}
        respBag = self.player.bag.costItem(dCost,
                                           constant.ITEM_COST_COMPOUND,
                                           wLog=True)
        if not respBag.get("rs", 0):
            return 0, errcode.EC_COST_ERR
        if rewardRes:
            dReward = rewardRes.doReward()
            respBag1 = self.player.bag.add(dReward,
                                           constant.ITEM_ADD_COMPOUND,
                                           wLog=True)
        else:
            dAdd = {iCompoundId: num}
            respBag1 = self.player.bag.add(dAdd,
                                           constant.ITEM_ADD_COMPOUND,
                                           wLog=True)
        respBag = self.player.mergeRespBag(respBag, respBag1)

        # 打包返回信息
        cost_update = self.player.packRespBag(respBag)
        resp = {
            "allUpdate": cost_update,
        }
        return 1, resp
Example #16
0
class DaoGuanMixin(object):
    if 0:
        from game.core import player as player_md
        player = player_md.Player()

    # 挑战道馆(daoguanChallenge)
    # 请求
    #     道馆id(daoguanId, int)
    #     副本id(fbId, int)
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型 - 道馆
    #         游戏模型 - 货币
    #         游戏模型 - 角色背包
    #         游戏模型 - 角色属性
    #         游戏模型 - 角色基础 - 战力
    #     战报(fightLog, json)
    def rc_daoguanChallenge(self, daoguanId, fbId):
        daoguanRes = Game.res_mgr.res_pavilion.get(daoguanId)
        if not daoguanRes:
            return 0, errcode.EC_NORES
        if fbId not in daoguanRes.challengeList:
            return 0, errcode.EC_DAOGUAN_FIGHT_ID_ERROR
        barrRes = Game.res_mgr.res_barrier.get(fbId)
        if not barrRes:
            return 0, errcode.EC_NORES
        if self.player.daoguan.area != daoguanRes.area:
            return 0, errcode.EC_DAOGUAN_FIGHT_AREA_ERROR
        daoguanObj = self.player.daoguan.getPavilion(daoguanId)
        if not daoguanObj:
            return 0, errcode.EC_DAOGUAN_NOT_FIND
        if not daoguanObj.hasAllTaskFinish():
            return 0, errcode.EC_DAOGUAN_FIGHT_LIMIT
        if daoguanObj.firstFinish:
            return 0, errcode.EC_DAOGUAN_HAS_FIRST_FINISH
        if self.player.daoguan.getHaveChallengeNum() <= 0:
            return 0, errcode.EC_DAOGUAN_FIGHT_NUM_LIMIT
        if fbId in daoguanObj.finishChallengeList:
            return 0, errcode.EC_DAOGUAN_BARR_HAS_FINISH
        rewardRes = Game.res_mgr.res_reward.get(barrRes.rewardId)

        firstRewardRes = Game.res_mgr.res_reward.get(daoguanRes.firstRewardId)
        if not firstRewardRes:
            return 0, errcode.EC_NORES

        # fightobj = Game.fight_mgr.createFight(constant.FIGHT_TYPE_114)
        # rs = fightobj.init_by_barrId(self.player, barrRes.id)
        # if not rs:
        #     return 0, errcode.EC_INIT_BARR_FAIL
        # fightobj.fixEleValue(daoguanRes.increase, daoguanRes.decrease)
        # fightLog = fightobj.doFight()
        # fightResult = fightLog["result"].get("win", 0)

        fightobj = createFight(constant.FIGHT_TYPE_100)
        rs = fightobj.init_data(
            self.player.GetFightData(constant.BATTLE_ARRAY_TYPE_NORMAL),
            100000)
        if not rs:
            return 0, errcode.EC_INIT_BARR_FAIL
        fightLog = fightobj.doFight()
        log_end = fightLog.get("end", {})
        winerList = log_end.get("winerList", [])
        fightResult = 1 if self.player.id in winerList else 0

        respBag = {}
        resp_attr = []
        if fightResult:
            dReward = {}
            if rewardRes:
                dReward = rewardRes.doReward()
            if dReward:
                respBag = self.player.bag.add(dReward,
                                              constant.ITEM_ADD_DAOGUAN,
                                              wLog=True)

            #已挑战副本
            ls = daoguanObj.getFinishChallengeList()
            ls.append(fbId)
            daoguanObj.setFinishChallengeList(ls)
            #加入已扫荡列表
            ls = self.player.daoguan.GetDaoGuanDaySweepList()
            if daoguanId not in ls:
                ls.append(daoguanId)
                self.player.daoguan.SetDaoGuanDaySweepList(ls)

            if daoguanObj.hasAllFinish():
                #首通道馆 属性 和 奖励
                respBag1 = self.player.bag.add(firstRewardRes.doReward(),
                                               constant.ITEM_ADD_DAOGUAN_FIRST,
                                               wLog=True)
                respBag = self.player.mergeRespBag(respBag, respBag1)

                # 附加过关属性
                self.player.attr.addAttr(daoguanRes.attr,
                                         constant.FIGHTABILITY_TYPE_36)
                resp_attr.extend(list(daoguanRes.attr.keys()))

                daoguanObj.doFirstFinish()
                self.player.safe_pub(msg_define.MSG_PASS_DAO_GUAN)

                #当前地区全部通关,去往下一个地区的道馆
                if self.player.daoguan.hasAllFinish():
                    self.player.daoguan.enterNextArea()
        else:
            #失败扣除次数
            #今日挑战次数
            iNum = self.player.daoguan.GetDaoGuanDayChallengeNum()
            iNum += 1
            self.player.daoguan.SetDaoGuanDayChallengeNum(iNum)

            if daoguanRes.eleType == 1:
                self.player.safe_pub(
                    msg_define.MSG_XIANSHITUISONGLIBAO_DAOGUAN_1_F)
            elif daoguanRes.eleType == 2:
                self.player.safe_pub(
                    msg_define.MSG_XIANSHITUISONGLIBAO_DAOGUAN_2_F)
            elif daoguanRes.eleType == 3:
                self.player.safe_pub(
                    msg_define.MSG_XIANSHITUISONGLIBAO_DAOGUAN_3_F)
            elif daoguanRes.eleType == 4:
                self.player.safe_pub(
                    msg_define.MSG_XIANSHITUISONGLIBAO_DAOGUAN_4_F)
            elif daoguanRes.eleType == 5:
                self.player.safe_pub(
                    msg_define.MSG_XIANSHITUISONGLIBAO_DAOGUAN_5_F)

        # 重算战力
        self.player.attr.RecalFightAbility()
        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag,
                                          fa=self.player.base.fa,
                                          roleAttr=resp_attr)
        dUpdate["daoguan"] = self.player.daoguan.to_init_data()
        resp = {
            "fightLog": fightLog,
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 扫荡道馆(daoguanSweep)
    # 请求
    #     道馆id(daoguanId, int)
    # 返回
    #     主动推送刷新(allUpdate,json)
    #         游戏模型-道馆
    #         游戏模型-货币
    #         游戏模型-角色背包
    def rc_daoguanSweep(self, daoguanId):
        daoguanRes = Game.res_mgr.res_pavilion.get(daoguanId)
        if not daoguanRes:
            return 0, errcode.EC_NORES
        rewardRes = Game.res_mgr.res_reward.get(daoguanRes.rewardId)
        if not rewardRes:
            return 0, errcode.EC_NORES
        ls = self.player.daoguan.GetDaoGuanDaySweepList()
        if daoguanId in ls:
            return 0, errcode.EC_DAOGUAN_HAS_SWEEP
        iPass = 0
        if self.player.daoguan.getArea() > daoguanRes.area:
            iPass = 1
        elif self.player.daoguan.getArea() == daoguanRes.area:
            daoguanObj = self.player.daoguan.getPavilion(daoguanId)
            if not daoguanObj:
                return 0, errcode.EC_DAOGUAN_NOT_FIND
            if daoguanObj.firstFinish:
                iPass = 1

        if not iPass:
            return 0, errcode.EC_DAOGUAN_SWEEP_LIMIT

        dReward = rewardRes.doReward()
        respBag = self.player.bag.add(dReward,
                                      constant.ITEM_ADD_DAOGUAN,
                                      wLog=True)

        ls.append(daoguanId)
        self.player.daoguan.SetDaoGuanDaySweepList(ls)
        # 打包返回信息
        dUpdate = self.player.packRespBag(
            respBag, fa=self.player.base.GetFightAbility())
        dUpdate["daoguan"] = self.player.daoguan.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 一键扫荡道馆(daoguanOneKeySweep)
    # 请求
    # 返回
    #     主动推送刷新(allUpdate,json)
    #         游戏模型-道馆
    #         游戏模型-货币
    #         游戏模型-角色背包
    def rc_daoguanOneKeySweep(self):
        #vip X 才开启一键扫荡
        iVipLv = self.player.vip.GetVipLv()
        vipRes = Game.res_mgr.res_vip.get(iVipLv)
        if not vipRes:
            return 0, errcode.EC_NORES
        if not vipRes.daoguanSweep:
            return 0, errcode.EC_DAOGUAN_SWEEP_LIMIT
        dReward = {}
        for daoguanId, daoguanRes in Game.res_mgr.res_pavilion.items():
            rewardRes = Game.res_mgr.res_reward.get(daoguanRes.rewardId)
            if not rewardRes:
                continue
            ls = self.player.daoguan.GetDaoGuanDaySweepList()
            if daoguanId in ls:
                continue
            iPass = 0
            if self.player.daoguan.getArea() > daoguanRes.area:
                iPass = 1
            elif self.player.daoguan.getArea() == daoguanRes.area:
                daoguanObj = self.player.daoguan.getPavilion(daoguanId)
                if not daoguanObj:
                    continue
                if daoguanObj.firstFinish:
                    iPass = 1
            if not iPass:
                continue
            _dReward = rewardRes.doReward()
            ls.append(daoguanId)
            self.player.daoguan.SetDaoGuanDaySweepList(ls)

            for itemId, num in _dReward.items():
                if itemId in dReward:
                    dReward[itemId] += num
                else:
                    dReward[itemId] = num

        respBag = self.player.bag.add(dReward,
                                      constant.ITEM_ADD_DAOGUAN,
                                      wLog=True)

        # 打包返回信息
        dUpdate = self.player.packRespBag(
            respBag, fa=self.player.base.GetFightAbility())
        dUpdate["daoguan"] = self.player.daoguan.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 道馆挑战次数购买(daoguanChallengeBuy)
    # 请求
    # 返回
    #     主动推送刷新(allUpdate,json)
    #         游戏模型-道馆
    #         游戏模型-货币
    #         游戏模型-角色背包
    def rc_daoguanChallengeBuy(self):
        iTodayBuy = self.player.daoguan.GetDaoGuanDayBuyChallengeNum()
        iVipLv = self.player.vip.GetVipLv()
        vipRes = Game.res_mgr.res_vip.get(iVipLv)
        if not vipRes:
            return 0, errcode.EC_NORES
        if iTodayBuy >= vipRes.daoguanBuyNum:
            return 0, errcode.EC_DAOGUAN_VIP_BUY_LIMIT
        costRes = Game.res_mgr.res_common.get("daoguanChallengeBuyCost")
        if not costRes:
            return 0, errcode.EC_NORES
        if len(costRes.arrayint1) <= iTodayBuy:
            return 0, errcode.EC_DAOGUAN_VIP_BUY_LIMIT
        iCost = costRes.arrayint1[iTodayBuy]
        dCost = {constant.CURRENCY_BINDGOLD: iCost}
        # 扣道具
        respBag = self.player.bag.costItem(dCost,
                                           constant.ITEM_COST_DAOGUAN_BUG_NUM,
                                           wLog=True)
        if not respBag.get("rs", 0):
            return 0, errcode.EC_DAOGUAN_VIP_BUY_NOT_ENOUGH

        self.player.daoguan.SetDaoGuanDayBuyChallengeNum(iTodayBuy + 1)

        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        dUpdate["daoguan"] = self.player.daoguan.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp
Example #17
0
class PetMixin(object):
    if 0:
        from game.core import player as player_md
        player = player_md.Player()

    # 宠物升级(petUpGrade)
    # 请求
    #     宠物唯一id(uid, str)
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型 - 宠物模块(只刷当前操作的)
    #         游戏模型 - 角色背包 - 道具列表
    #         游戏模型 - 角色基础 - 战力
    def rc_petUpGrade(self, uid):
        # 宠物未激活
        pet = self.player.pet.getPet(uid)
        if not pet:
            return 0, errcode.EC_PET_NOT_ACT
        res = Game.res_mgr.res_pet.get(pet.resID)
        if not res:
            return 0, errcode.EC_NORES
        #等级上限限制
        evolveRes = Game.res_mgr.res_idlv_petevolve.get(
            (pet.resID, pet.evolveLv))
        if not evolveRes:
            return 0, errcode.EC_NORES
        iCurLv = pet.GetLv()
        if iCurLv >= evolveRes.lvLimit:
            return 0, errcode.EC_MAX_LEVEL
        #当前等级资源
        curRes = Game.res_mgr.res_qalv_petlv.get((res.quality, iCurLv))
        if not curRes:
            return 0, errcode.EC_NORES
        # 如果没有下一阶
        iNextLv = iCurLv + 1
        nextRes = Game.res_mgr.res_qalv_petlv.get((res.quality, iNextLv))
        if not nextRes:
            return 0, errcode.EC_MAX_LEVEL
        # 扣道具
        respBag = self.player.bag.costItem(curRes.cost,
                                           constant.ITEM_COST_PET_UPGRADE,
                                           wLog=True)
        if not respBag.get("rs", 0):
            return 0, errcode.EC_PET_UPGRADE_NOT_ENOUGH
        #设置等级
        pet.SetLv(iNextLv)
        #重算宠物属性
        pet.attr.recalAttr([
            constant.PET_ATTR_MODULE_LV_EVOLVE, constant.PET_ATTR_MODULE_SKILL
        ])
        # 重算战力
        self.player.attr.RecalFightAbility()
        # 抛事件
        self.player.safe_pub(msg_define.MSG_PET_UPGRADE)

        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        dPet = dUpdate.setdefault("pet", {})
        dPet["all_pets"] = [pet.to_init_data()]
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 宠物进化(petEvolve)
    # 请求
    #     宠物唯一id(uid, str)
    #     消耗宠物列表(costPet, [str])
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型 - 宠物模块(只刷当前操作的)
    #         游戏模型 - 角色背包 - 道具列表
    #         游戏模型 - 角色基础 - 战力
    def rc_petEvolve(self, uid, costPet):
        #不能吃自己
        if uid in costPet:
            return 0, errcode.EC_PET_EVOLVE_EAT_SELF
        # 宠物未激活
        pet = self.player.pet.getPet(uid)
        if not pet:
            return 0, errcode.EC_PET_NOT_ACT
        res = Game.res_mgr.res_pet.get(pet.resID)
        if not res:
            return 0, errcode.EC_NORES
        # 等级不足
        iCurEvolveLv = pet.GetEvolveLv()
        curRes = Game.res_mgr.res_idlv_petevolve.get((pet.resID, iCurEvolveLv))
        if not curRes:
            return 0, errcode.EC_NORES
        if curRes.needLv > pet.GetLv():
            return 0, errcode.EC_NOLEVEL
        # 下一阶
        iNextEvolveLv = iCurEvolveLv + 1
        nextRes = Game.res_mgr.res_idlv_petevolve.get(
            (pet.resID, iNextEvolveLv))
        if not nextRes:
            if curRes.changeID:
                iNextEvolveLv = 1
                nextRes = Game.res_mgr.res_idlv_petevolve.get(
                    (curRes.changeID, iNextEvolveLv))
            else:
                return 0, errcode.EC_MAX_LEVEL
        #检查是否消耗宠物
        if curRes.costPet1 or curRes.costPet2:
            rs, code = self.player.pet.getCostPet(costPet, curRes.costPet1,
                                                  curRes.costPet2)
            if not rs:
                if code == 1:  #1=没有足够的宠物
                    return 0, errcode.EC_PET_EVOLVE_NOT_ENOUGH
                elif code == 2:  #2=宠物身上有装备,有各种物品时不可消耗
                    return 0, errcode.EC_PET_CAN_NOT_COST_WEAR
                elif code == 3:  #3=宠物已出战
                    return 0, errcode.EC_PET_CAN_NOT_COST_FIGHT
                else:
                    return 0, errcode.EC_PET_EVOLVE_NOT_ENOUGH
        # 扣道具
        respBag = self.player.bag.costItem(curRes.cost,
                                           constant.ITEM_COST_PET_EVOLVE,
                                           wLog=True)
        if not respBag.get("rs", 0):
            return 0, errcode.EC_PET_EVOLVE_NOT_ENOUGH
        #扣宠物
        if costPet:
            backAdd = self.player.pet.costPet(constant.ITEM_COST_PET_EVOLVE,
                                              costPet,
                                              wLog=True)
            #返还材料
            respBag1 = self.player.bag.add(backAdd,
                                           constant.ITEM_ADD_PET_EVOLVE_BACK)
            respBag = self.player.mergeRespBag(respBag, respBag1)

        #是否变宠物ID
        if curRes.changeID:
            pet.SetResID(curRes.changeID)
        #设置进化等级
        pet.SetEvolveLv(iNextEvolveLv)
        #增加被动技能
        pet.setPrivate(nextRes.private)
        pet.addPeculiarity(nextRes.peculiarityAdd)
        # 图鉴激活
        if curRes.changeID:
            self.player.pet.actAlbum(pet)

        # 战力重算
        pet.attr.recalAttr([
            constant.PET_ATTR_MODULE_LV_EVOLVE,
            constant.PET_ATTR_MODULE_PECULIARITY
        ])
        self.player.attr.RecalFightAbility()
        # 抛事件
        self.player.safe_pub(msg_define.MSG_PET_EVOLVE, uid)

        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        dUpdate["attr"] = self.player.attr.to_update_data()
        dPet = dUpdate.setdefault("pet", {})
        dPet["all_pets"] = [pet.to_init_data()]
        dPet["del_pets"] = costPet
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 上传布阵(rc_uploadBattleArray)
    # 请求
    #     出战队伍类型(tp, int)
    #     阵位列表(position, [json])  位置(str):  宠物唯一id(str)
    # 返回
    #     出战队伍类型(tp, int)
    #     阵位列表(position, [json])  位置(str):  宠物唯一id(str)
    def rc_uploadBattleArray(self, tp, position):
        #检查宠物互斥
        for one in position:
            petList = list(one.values())
            if not self.player.pet.checkPetMutex(petList):
                return 0, errcode.EC_PET_MUTEX_LIMIT
        #数据转化
        all = []
        for one in position:
            data = {}
            for k, v in one.items():
                data[int(k)] = v
            all.append(data)
        obj = self.player.battle_array.getBattleArray(tp)
        change = obj.setPosition(all)

        # 出战队伍战力
        if tp == constant.BATTLE_ARRAY_TYPE_NORMAL:
            self.player.attr.RecalFightAbility()
        # 打包返回
        dUpdate = {}
        dUpdate["base"] = {"fa": self.player.base.GetFightAbility()}
        dPet = dUpdate.setdefault("pet", {})
        dPet["all_pets"] = [pet.to_init_data() for pet in change]
        resp = {"allUpdate": dUpdate, "tp": tp, "position": position}
        return 1, resp

    # 宠物技能洗练(petSkillWash)
    # 请求
    #     宠物唯一id(uid, str)
    #     洗练类型(type, int) 1 = 普通 2 = 高级
    #     是否自动购买(auto, int) 补足当次需要材料 0 = 不自动 1 = 自动
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型 - 宠物模块(只刷当前操作的)
    #         游戏模型 - 角色背包 - 道具列表
    #         游戏模型 - 货币
    def rc_petSkillWash(self, uid, type, auto):
        # 宠物未激活
        pet = self.player.pet.getPet(uid)
        if not pet:
            return 0, errcode.EC_PET_NOT_ACT
        res = Game.res_mgr.res_pet.get(pet.resID)
        if not res:
            return 0, errcode.EC_NORES

        washRes = Game.res_mgr.res_idstar_petwash.get(
            (pet.resID, pet.washStar))
        if not washRes:
            return 0, errcode.EC_NORES
        #1 = 普通 2 = 高级
        if type == 1:
            costRes = Game.res_mgr.res_common.get("petNormalWashCost")
            addRes = Game.res_mgr.res_common.get("petNormalWashExp")
        elif type == 2:
            costRes = Game.res_mgr.res_common.get("petAdvWashCost")
            addRes = Game.res_mgr.res_common.get("petAdvWashExp")
        else:
            costRes = None
            addRes = None
        if not costRes or not addRes:
            return 0, errcode.EC_NORES
        lockCostRes = Game.res_mgr.res_common.get("petWashLockCost")
        if not lockCostRes:
            return 0, errcode.EC_NORES
        #获取锁定技能个数,如果全锁定,不能洗练
        iCostGold = 0
        if len(pet.peculiarity):
            iLockNum = pet.GetLockPeculiarityNum()
            if iLockNum >= len(pet.peculiarity):
                return 0, errcode.EC_PET_WASH_ALL_LOCK
            #如果锁定了还要扣元宝
            iCostGold = lockCostRes.arrayint2.get(iLockNum, 0)
        if iCostGold:
            dCost = {constant.CURRENCY_GOLD: iCostGold}
        else:
            dCost = {}
        dCost.update(costRes.arrayint2)
        # 扣道具
        respBag = self.player.bag.costItem(dCost,
                                           constant.ITEM_COST_PET_WASH,
                                           wLog=True,
                                           auto=auto)
        if not respBag.get("rs", 0):
            return 0, errcode.EC_PET_WASH_NOT_ENOUGH
        #洗练技能
        pet.WashPeculiarity()
        #增加洗练次数
        iWashNum = pet.GetWashNum()
        iWashNum += addRes.i
        pet.SetWashNum(iWashNum)
        #升星
        iWashStar = pet.GetWashStar()
        starRes = Game.res_mgr.res_petwashstar.get(iWashStar)
        nextRes = Game.res_mgr.res_petwashstar.get(iWashStar + 1)
        if starRes and nextRes and iWashNum >= starRes.cnt:
            iWashStar += 1
            pet.SetWashStar(iWashStar)

        #抛事件
        self.player.safe_pub(msg_define.MSG_PET_SKILL_WASH)

        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        dPet = dUpdate.setdefault("pet", {})
        dPet["all_pets"] = [pet.to_init_data()]
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 宠物技能洗练锁定(petSkillWashLock)
    # 请求
    #     宠物唯一id(uid, str)
    #     技能部位(pos, int)
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型 - 宠物模块(只刷当前操作的)
    def rc_petSkillWashLock(self, uid, pos):
        # 宠物未激活
        pet = self.player.pet.getPet(uid)
        if not pet:
            return 0, errcode.EC_PET_NOT_ACT
        res = Game.res_mgr.res_pet.get(pet.resID)
        if not res:
            return 0, errcode.EC_NORES
        #宠物初始化有多少技能就固定了,不会扩充
        if not pet.peculiarity.get(pos):
            return 0, errcode.EC_PET_WASH_POS_ERROR
        pet.LockPeculiarity(pos)
        # 打包返回信息
        dUpdate = {}
        dPet = dUpdate.setdefault("pet", {})
        dPet["all_pets"] = [pet.to_init_data()]
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 宠物技能洗练解锁(petSkillWashUnLock)
    # 请求
    #     宠物唯一id(uid, str)
    #     技能部位(pos, int)
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型 - 宠物模块(只刷当前操作的)
    def rc_petSkillWashUnLock(self, uid, pos):
        # 宠物未激活
        pet = self.player.pet.getPet(uid)
        if not pet:
            return 0, errcode.EC_PET_NOT_ACT
        res = Game.res_mgr.res_pet.get(pet.resID)
        if not res:
            return 0, errcode.EC_NORES
        # 宠物初始化有多少技能就固定了,不会扩充
        if not pet.peculiarity.get(pos):
            return 0, errcode.EC_PET_WASH_POS_ERROR
        pet.UnLockPeculiarity(pos)
        # 打包返回信息
        dUpdate = {}
        dPet = dUpdate.setdefault("pet", {})
        dPet["all_pets"] = [pet.to_init_data()]
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 宠物技能更换(petSkillChange)
    # 请求
    #     宠物唯一id(uid, str)
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型 - 宠物模块(只刷当前操作的)
    def rc_petSkillChange(self, uid):
        # 宠物未激活
        pet = self.player.pet.getPet(uid)
        if not pet:
            return 0, errcode.EC_PET_NOT_ACT
        res = Game.res_mgr.res_pet.get(pet.resID)
        if not res:
            return 0, errcode.EC_NORES

        #宠物技能更换
        pet.PeculiarityChange()
        #重算宠物属性
        pet.attr.recalAttr([constant.PET_ATTR_MODULE_PECULIARITY])
        self.player.attr.RecalFightAbility()
        # 打包返回信息
        dUpdate = {}
        dUpdate["base"] = {"fa": self.player.base.GetFightAbility()}
        dPet = dUpdate.setdefault("pet", {})
        dPet["all_pets"] = [pet.to_init_data()]
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 宠物锁定(petLock)
    # 请求
    #     宠物唯一id(uid, str)
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型 - 宠物模块(只刷当前操作的)
    def rc_petLock(self, uid):
        # 宠物未激活
        pet = self.player.pet.getPet(uid)
        if not pet:
            return 0, errcode.EC_PET_NOT_ACT
        res = Game.res_mgr.res_pet.get(pet.resID)
        if not res:
            return 0, errcode.EC_NORES
        pet.SetLock(1)
        # 打包返回信息
        dUpdate = {}
        dPet = dUpdate.setdefault("pet", {})
        dPet["all_pets"] = [pet.to_init_data()]
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 宠物解锁(petUnLock)
    # 请求
    #     宠物唯一id(uid, str)
    # 返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型 - 宠物模块(只刷当前操作的)
    def rc_petUnLock(self, uid):
        # 宠物未激活
        pet = self.player.pet.getPet(uid)
        if not pet:
            return 0, errcode.EC_PET_NOT_ACT
        res = Game.res_mgr.res_pet.get(pet.resID)
        if not res:
            return 0, errcode.EC_NORES
        pet.SetLock(0)
        # 打包返回信息
        dUpdate = {}
        dPet = dUpdate.setdefault("pet", {})
        dPet["all_pets"] = [pet.to_init_data()]
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp
Example #18
0
class TotemMixin(object):
    if 0:
        from game.core import player as player_md
        player = player_md.Player()

    #图腾激活(totemAct)
    #请求
    #    部位(pos, int)
    #
    #
    #返回
    #     主动推送刷新(allUpdate, json)
    #         游戏模型 - 图腾模块(只刷当前操作的)
    #         游戏模型 - 角色背包 - 道具列表
    #         游戏模型 - 货币
    def rc_totemAct(self, pos):
        res = Game.res_mgr.res_poslv_totem.get((pos, 0), None)
        if not res:
            return 0, errcode.EC_NORES

        nextRes = Game.res_mgr.res_poslv_totem.get((pos, 1), None)
        if not res:
            return 0, errcode.EC_NORES

        if pos in self.player.totem.actList:
            return 0, errcode.EC_TOTEM_HAS_ACT

        respBag = self.player.bag.costItem(res.tpCost,
                                           constant.ITEM_COST_TOTEM_ACT,
                                           wLog=True)
        if not respBag.get("rs", 0):
            return 0, errcode.EC_TOTEM_ACT_NOT_ENOUGH

        self.player.totem.actTotem(nextRes)

        # 战力重算
        self.player.attr.RecalFightAbility()

        dTotem = {}
        totem = self.player.totem.getTotem(pos)
        dTotem["actList"] = [totem.to_init_data()]

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["attr"] = self.player.attr.to_update_data()
        dUpdate["totem"] = dTotem
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 图腾升级(totemUp)
    # 	请求
    # 		部位(pos, int)
    # 		次数(num, int)
    # 	返回
    # 		主动推送刷新(allUpdate, json)
    # 			游戏模型-图腾模块(只刷当前操作的)
    # 			游戏模型-角色背包-道具列表
    # 			游戏模型-货币
    def rc_totemUp(self, pos, num, auto):
        totem = self.player.totem.getTotem(pos)
        if not totem:
            return 0, errcode.EC_NOT_FIND_TOTEM

        oldlv = totem.getLv()
        res = Game.res_mgr.res_poslv_totem.get((pos, oldlv), None)
        if not res:
            return 0, errcode.EC_NORES

        leftExp = totem.getExp()
        if res.tpCost and leftExp >= res.exp:
            return 0, errcode.EC_TOTEM_NEED_TP

        totalAddExp = 0
        totalMulti = 0

        respBag = {}
        for i in range(num):
            oldlv = totem.getLv()

            res = Game.res_mgr.res_poslv_totem.get((pos, oldlv), None)

            respBag1 = self.player.bag.costItem(
                res.cost,
                constant.ITEM_COST_TOTEM_UPGRADE,
                wLog=True,
                auto=auto)
            if not respBag1.get("rs", 0):
                return 0, errcode.EC_TOTEM_UPGRADE_NOT_ENOUGH
            respBag = self.player.mergeRespBag(respBag, respBag1)

            oldExp = totem.getExp()
            oldBjId = totem.getBjResId()
            oldUpgradeTimes = totem.getUpgradeTimes()
            bjRes = Game.res_mgr.res_totemBj.get(oldBjId)
            multi = 1
            if oldUpgradeTimes + 1 >= bjRes.num:
                multi = bjRes.multi
                nextBjId = oldBjId + 1
                nextBjRes = Game.res_mgr.res_totemBj.get(nextBjId)
                if not nextBjRes:
                    nextBjId = oldBjId

                totem.setBjResId(nextBjId)
                totem.setUpgradeTimes(0)
            else:
                totem.setUpgradeTimes(oldUpgradeTimes + 1)
                randomBj = utility.Choice(Game.res_mgr.res_random_totem)
                randomBjRes = Game.res_mgr.res_totemRan.get(randomBj, None)
                multi = randomBjRes.multi

            addRes = Game.res_mgr.res_common.get("totemsUpExp", None)
            addExp = addRes.i * multi
            newExp = oldExp + addExp

            if newExp > res.exp and not res.tpCost:
                newlv = oldlv + 1
                nextRes = Game.res_mgr.res_poslv_totem.get((pos, newlv), None)
                if nextRes:
                    leftExp = newExp - res.exp
                    totem.setLv(newlv, res, nextRes)
                    totem.setExp(leftExp)
                else:
                    totem.setExp(newExp)
            else:
                totem.setExp(newExp)

            if multi > 1:
                totalMulti += multi
            totalAddExp += addExp

        # 战力重算
        self.player.attr.RecalFightAbility()

        dTotem = {}
        dTotem["actList"] = [totem.to_init_data()]

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["attr"] = self.player.attr.to_update_data()
        dUpdate["totem"] = dTotem
        resp = {
            "allUpdate": dUpdate,
            "multi": totalMulti,
            "addExp": totalAddExp,
        }
        return 1, resp

    # 图腾突破(totemTp)
    # 请求
    # 部位(pos, int)
    #
    #
    # 返回
    #     主动推送刷新(allUpdate, json)
    #     游戏模型 - 图腾模块(只刷当前操作的)
    #     图腾部位(pos, int)
    #     等级(lv, int)
    #     经验(exp, int)
    #     已升级次数(upNum, int)
    #     图腾暴击配置表id(bjId, int)
    #     游戏模型 - 角色背包 - 道具列表
    #     游戏模型 - 货币
    def rc_totemTp(self, pos):
        totem = self.player.totem.getTotem(pos)
        if not totem:
            return 0, errcode.EC_NOT_FIND_TOTEM

        res = Game.res_mgr.res_poslv_totem.get((pos, totem.getLv()), None)
        if not res:
            return 0, errcode.EC_NORES

        if not res.tpCost:
            return 0, errcode.EC_TOTEM_NOT_NEED_TP

        leftExp = totem.getExp()
        if leftExp < res.exp:
            return 0, errcode.EC_TOTEM_CAN_NOT_TP

        nextRes = Game.res_mgr.res_poslv_totem.get((pos, totem.getLv() + 1),
                                                   None)
        if not nextRes:
            return 0, errcode.EC_NORES

        respBag = self.player.bag.costItem(res.tpCost,
                                           constant.ITEM_COST_TOTEM_ACT,
                                           wLog=True)
        if not respBag.get("rs", 0):
            return 0, errcode.EC_TOTEM_ACT_NOT_ENOUGH

        while True:
            leftExp -= res.exp
            totem.setLv(nextRes.level, res, nextRes)

            if not nextRes.exp:
                break

            res = nextRes
            nextRes = Game.res_mgr.res_poslv_totem.get(
                (pos, totem.getLv() + 1), None)

            if leftExp < nextRes.exp:
                break

        totem.setExp(leftExp)

        # 战力重算
        self.player.attr.RecalFightAbility()

        dTotem = {}
        dTotem["actList"] = [totem.to_init_data()]

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["attr"] = self.player.attr.to_update_data()
        dUpdate["totem"] = dTotem
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp
Example #19
0
class BossPlayerRpc(object):
    if 0:
        from game.core import player as player_md
        player = player_md.Player()

    def sendYwBossKillReward(self, bossId, isTimeout=1):
        """击杀野外boss奖励"""
        resYwBoss = Game.res_mgr.res_ywBoss.get(bossId)
        if not resYwBoss:
            return
        barrRes = Game.res_mgr.res_barrier.get(resYwBoss.fbId)
        if not barrRes:
            return
        rewardRes = Game.res_mgr.res_reward.get(barrRes.rewardId)
        if not rewardRes:
            return
        dReward = rewardRes.doReward()
        respBag = self.player.bag.add(dReward,
                                      constant.ITEM_ADD_YWBOSS_REWARD,
                                      wLog=True)
        iTodayNum = self.player.boss.GetYwBossTodayTZ()
        # 修改挑战次数
        self.player.boss.SetYwBossTodayTZ(iTodayNum + 1)
        # 修改最后挑战时间
        now = int(time.time())
        self.player.boss.SetYwBossLastTZTime(now)

        #抛事件
        self.player.safe_pub(msg_define.MSG_KILL_YW_BOSS)
        if isTimeout:
            dUpdate = self.player.packRespBag(respBag)
            resp = {
                "allUpdate": dUpdate,
            }
            spawn(self.player.call, "ywBossKill", resp, noresult=True)
        return respBag

    def ssjBossTZNotice(self, id, fightLog, pid):
        ssjRes = Game.res_mgr.res_ssjBoss.get(id)
        if not ssjRes:
            return
        barrRes = Game.res_mgr.res_barrier.get(ssjRes.fbId)
        if not barrRes:
            return
        helpres = Game.res_mgr.res_common.get("ssjBossHelpNum")
        if not helpres:
            return

        fightResult = fightLog["result"].get("win", 0)
        respBag = {}
        if fightResult:
            dReward = {}
            if not self.player.boss.GetSsjBossTodayKill(id):
                rewardRes = Game.res_mgr.res_reward.get(barrRes.rewardId)
                if rewardRes:
                    dReward = rewardRes.doReward()
                #是否已首通
                isFirst = self.player.boss.GetSsjBossFirst(id)
                if not isFirst:
                    self.player.boss.SetSsjBossFirst(id)
                    dReward.update(barrRes.firstReward)
                    #设置击杀
                    self.player.boss.SetSsjBossTodayKill(id)
            #是否协助
            if pid != self.player.id:
                iHelpNum = self.player.boss.GetSsjBossTodayHelp()
                if iHelpNum < helpres.i:
                    rewardRes = Game.res_mgr.res_reward.get(
                        barrRes.helpRewardId)
                    if rewardRes:
                        dHelpReward = rewardRes.doReward()
                        for iNo, iNum in dHelpReward.items():
                            if dReward.get(iNo):
                                dReward[iNo] += iNum
                            else:
                                dReward[iNo] = iNum

                    self.player.boss.SetSsjBossTodayHelp(iHelpNum + 1)

            respBag = self.player.bag.add(dReward,
                                          constant.ITEM_ADD_SSJBOSS_REWARD,
                                          wLog=True)
        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        dUpdate["boss"] = self.player.boss.to_ssjboss_data([id])
        resp = {
            "id": id,
            "fightLog": fightLog,
            "allUpdate": dUpdate,
        }
        spawn(self.player.call, "ssjBossTZNotice", resp, noresult=True)

    def sendYwBossTZ(self, resp):
        spawn(self.player.call, "ywBossTZ", resp, noresult=True)
Example #20
0
class ChatRpcMixin(object):
    if 0:
        from game.core import player as player_md
        player = player_md.Player()

    # 发送世界聊天(sendWorldMSG)
    # 请求
#   聊天内容(content,string)
# 返回
# 全服广播(worldMSGNotice)
#   玩家id(rid,int)
#   聊天内容(content,string)

    def rc_sendWorldMSG(self, content, type=0):

        if self.player.isShutup():
            return

        if type == 0:
            for addr, logic in Game.rpc_logic_game:
                if logic:
                    logic.sendWorldMSG(self.player.id, content)
        elif type == 2:
            from game.mgr.room import get_rpc_diaoyu
            rpc_diaoyu = get_rpc_diaoyu()
            if not rpc_diaoyu:
                return 0, errcode.EC_GETD_RPC_ROOM_FAIL

            rrv = rpc_diaoyu.msg(2, self.player.id, content)
            if not rrv:
                return 0, errcode.EC_CALL_RPC_ROOM_FAIL
        elif type == 3:
            from game.mgr.room import get_rpc_wakuang
            rpc_wakuang = get_rpc_wakuang()
            if not rpc_wakuang:
                return 0, errcode.EC_GETD_RPC_ROOM_FAIL

            data = self.player.zudui.getTeamInfo(0)
            rrv = rpc_wakuang.msg(3, data["id"], content)
            if not rrv:
                return 0, errcode.EC_CALL_RPC_ROOM_FAIL
        elif type == 4:
            from game.mgr.room import get_rpc_boss
            rpc_boss = get_rpc_boss()
            if not rpc_boss:
                return 0, errcode.EC_GETD_RPC_ROOM_FAIL

            rrv = rpc_boss.msg(4, self.player.id, content)
            if not rrv:
                return 0, errcode.EC_CALL_RPC_ROOM_FAIL

        elif type == 5:
            from game.mgr.room import get_rpc_gongcheng
            rpc_gongcheng = get_rpc_gongcheng()
            if not rpc_gongcheng:
                return 0, errcode.EC_GETD_RPC_ROOM_FAIL
            rrv = rpc_gongcheng.msg(5, self.player.id, content)
            if not rrv:
                return 0, errcode.EC_CALL_RPC_ROOM_FAIL
        elif type == 6:
            from game.mgr.room import get_rpc_jiujiyishou
            rpc_jiujiyishou = get_rpc_jiujiyishou()
            if not rpc_jiujiyishou:
                return 0, errcode.EC_GETD_RPC_ROOM_FAIL
            rrv = rpc_jiujiyishou.msg(6, self.player.id, content)
            if not rrv:
                return 0, errcode.EC_CALL_RPC_ROOM_FAIL

        # 抛事件
        self.player.safe_pub(msg_define.MSG_SEND_WORLD_MSG)

        return 1, {}

    # 发送私聊(privateChatSend)
    # 请求
    #     玩家id(rid,int)
    #     聊天内容(content,string)
    # 返回
    #     玩家id(rid,int)
    #     聊天内容(content,string)
    #     时间(sendTime, int)
    def rc_privateChatSend(self, rid, content):
        sendTime = int(time.time())
        info = self.player.toChatInfo()
        from game.mgr.player import get_rpc_player
        rpc_player = get_rpc_player(rid)
        chatinfo = rpc_player.privateChatReceive(self.player.id, info, content,
                                                 sendTime)

        self.player.chat.privateChatSend(rid, chatinfo, content, sendTime)

        resp = {}
        resp["rid"] = rid
        resp["content"] = content
        resp["sendTime"] = sendTime
        return 1, resp

    # 获取私聊列表(getPrivateChatList)
    # 请求
    # 返回
    #     私聊玩家列表(chatList, [json])
    #         玩家id(rid,int)
    #         名称(name, string)
    #         性别(sex, int)
    #             0=? 1=男 2=女
    #         等级(lv, int)
    #         vip等级(vipLv, int)
    #         战力(fa, int)
    #         是否在线(isOnline, int)
    def rc_getPrivateChatList(self):
        chatList = self.player.chat.getPrivateChatList()

        resp = {"chatList": chatList}
        return 1, resp

    # 获取私聊数据(getPrivateChatData)
    # 请求
    #     玩家id(rid,int)
    # 返回
    #     玩家id(rid,int)
    #     内容列表(contentList)
    #         玩家id(rid,int)
    #         聊天内容(content,string)
    #         时间(sendTime, int)
    def rc_getPrivateChatData(self, rid):
        contentList = self.player.chat.getPrivateChatData(rid)

        resp = {"rid": rid, "contentList": contentList}
        return 1, resp

    # 清除玩家私聊(cleanPrivateChat)
    # 请求
    #     玩家id(rid,int)
    # 返回
    #     玩家id(rid,int)
    def rc_cleanPrivateChat(self, rid):
        self.player.chat.cleanPrivateChat(rid)

        resp = {"rid": rid}
        return 1, resp

    # 发送小助手聊天(sendHelperChat)
    # 请求
    #     聊天内容(content,string)
    # 返回
    #     聊天内容(content,string)
    #     时间(sendTime, int)
    def rc_sendHelperChat(self, content):
        Game.glog.log2File(
            "rc_sendHelperChat",
            "%s|%s|%s" % (self.player.id, self.player.name, content))

        resp = {"content": content, "sendTime": int(time.time())}
        return 1, resp
Example #21
0
class MarryMixin(object):
    if 0:
        from game.core import player as player_md
        player = player_md.Player()

    # 检查对方可否结婚(marryCheck)
    #     请求
    #     对方pid(targetPid, int)
    #
    #     返回
    def rc_marryCheck(self, targetPid):
        if not Game.rpc_player_mgr.is_online(targetPid):
            return 0, errcode.EC_MARRY_NOT_ONLINE

        from game.mgr.player import get_rpc_player
        targetPlayer = get_rpc_player(targetPid, offline=False)
        if not targetPlayer:
            return 0, errcode.EC_NOFOUND

        if self.player.marry.getMarryStatus() or targetPlayer.getMarryStatus():
            return 0, errcode.EC_MARRY_ALREAY_MARRY

        if self.player.marry.isMarriedToday() or targetPlayer.isMarriedToday():
            return 0, errcode.EC_MARRY_ALEARY_TODAY

        return 1, {}

    # 求婚(marrySomeone)
    # 	请求
    # 		对方pid(targetPid, int)
    # 		身份类型(kind, int)
    #       结婚类型id(marryId, int)
    # 	返回
    def rc_marrySomeone(self, targetPid, kind, marryId):
        marryRes = Game.res_mgr.res_marry.get(marryId, None)
        if not marryRes:
            return 0, errcode.EC_NORES

        if not Game.rpc_player_mgr.is_online(targetPid):
            return 0, errcode.EC_MARRY_NOT_ONLINE

        from game.mgr.player import get_rpc_player
        targetPlayer = get_rpc_player(targetPid, offline=False)
        if not targetPlayer:
            return 0, errcode.EC_NOFOUND

        if self.player.marry.getMarryStatus() or targetPlayer.getMarryStatus():
            return 0, errcode.EC_MARRY_ALREAY_MARRY

        if self.player.marry.isMarriedToday() or targetPlayer.isMarriedToday():
            return 0, errcode.EC_MARRY_ALEARY_TODAY

        canCost = self.player.bag.canCostItem(marryRes.cost)
        if not canCost.get("rs", 0):
            return 0, errcode.EC_MARRY_NOT_ENOUGH

        pushData = {
            "targetName": self.player.name,
            "targetPid": self.player.id,
            "marryId": marryId,
            "kind": kind,
        }

        targetPlayer.marryPush(pushData)

        return 1, None

    # 求婚回应(marryAnswer)
    # 	请求
    # 		选择(option, int)
    # 			1 答应 2拒绝
    # 		你的身份(kind, int)
    # 			1 夫君 2 妻子
    #       对方pid(targetPid, int)
    #       结婚类型(marryId, int)
    # 	返回
    def rc_marryAnswer(self, option, kind, targetPid, marryId):
        from game.mgr.player import get_rpc_player
        targetPlayer = get_rpc_player(targetPid, offline=False)
        if not targetPlayer:
            return 0, errcode.EC_NOFOUND

        if option == 2:
            pushData = {
                "result": 3,
                "targetPid": self.player.id,
            }
            targetPlayer.marryResultPush(pushData)
            return 1, {}

        marryRes = Game.res_mgr.res_marry.get(marryId, None)
        if not marryRes:
            return 0, errcode.EC_NORES

        if self.player.getMarryStatus() or targetPlayer.getMarryStatus():
            return 0, errcode.EC_MARRY_ALREAY_MARRY

        respBag = targetPlayer.costItem(marryRes.cost,
                                        constant.ITEM_COST_MARRY,
                                        wLog=True)
        if not respBag.get("rs", 0):
            return 0, errcode.EC_COST_ERR

        myPid = self.player.id
        myName = self.player.name
        targetName = targetPlayer.getName()

        successPushData = {
            "husbandName": targetName,
            "husbandPid": targetPid,
            "wifeName": myName,
            "wifePid": myPid,
        }

        targetKind = 1
        if kind == 1:
            targetKind = 2
            successPushData = {
                "husbandName": myName,
                "husbandPid": myPid,
                "wifeName": targetName,
                "wifePid": targetPid,
            }

        self.player.marrySomeone(targetPid, targetName, kind, marryId)
        targetPlayer.marrySomeone(myPid, myName, targetKind, marryId)

        Game.rpc_player_mgr.broadcast("marrySuccessPush", successPushData,
                                      [myPid, targetPid])

        return 1, None

    # 赠送结婚礼金(presentMarryGfit)
    # 	请求
    # 		礼金类型(giftId, int)
    #       丈夫pid(husbandPid, int)
    #       妻子pid(wifePid, int)
    # 	返回
    # 		主动推送刷新(allUpdate,json)
    # 			游戏模型-货币
    # 			游戏模型-角色背包
    def rc_presentMarryGfit(self, giftId, husbandPid, wifePid):
        giftRes = Game.res_mgr.res_marryGift.get(giftId, None)
        giftMailRes1 = Game.res_mgr.res_mail.get(constant.MAIL_ID_MARRY_GIFT,
                                                 None)
        giftMailRes2 = Game.res_mgr.res_mail.get(
            constant.MAIL_ID_MARRY_RETGIFT, None)

        if not giftRes or not giftMailRes1 or not giftMailRes2:
            return 0, errcode.EC_NORES

        respBag = self.player.bag.costItem(giftRes.cost,
                                           constant.ITEM_COST_MARRY_GIFT,
                                           wLog=True)
        if not respBag.get("rs", 0):
            return 0, errcode.EC_COST_ERR

        content = giftMailRes1.content % self.player.name
        Game.rpc_mail_mgr.sendPersonMail(self.player.id, giftMailRes2.title,
                                         giftMailRes2.content, giftRes.reward)
        Game.rpc_mail_mgr.sendPersonMail(husbandPid, giftMailRes1.title,
                                         content, giftRes.reward)
        Game.rpc_mail_mgr.sendPersonMail(wifePid, giftMailRes1.title, content,
                                         giftRes.reward)

        dUpdate = self.player.packRespBag(respBag)
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 离婚(divorce)
    # 	请求
    # 	返回
    def rc_divorce(self):
        if not self.player.getMarryStatus():
            return 0, errcode.EC_MARRY_NOT_MARRY

        spousePid = self.player.marry.getSpousePid()
        from game.mgr.player import get_rpc_player
        spousePlayer = get_rpc_player(spousePid, offline=True)
        if not spousePlayer:
            return 0, errcode.EC_NOFOUND

        self.player.marry.divorce()
        myMailRes = Game.res_mgr.res_mail.get(constant.MAIL_ID_DIVORCE, None)
        if myMailRes:
            Game.rpc_mail_mgr.sendPersonMail(spousePid, myMailRes.title,
                                             myMailRes.content, {})

        spousePlayer.divorce()

        return 1, None

    # 亲密度时间到了需要刷新一下
    def rc_MarryRefresh(self):

        # self.player.marry.checkEn()
        dUpdate = {}
        dUpdate["marryInfo"] = self.player.marry.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 已读亲密度真爱
    def rc_MarryTureLoveRead(self):
        self.player.marry.TrueLoveRead()

        return 1, {}

    # 已读亲密度真爱
    def rc_MarryMsgRead(self):
        self.player.marry.MsgRead()

        return 1, {}

    # 赠送亲密度
    def rc_MarryPowerBuy(self, id, num, bynum, costtype, costnum):

        res = Game.res_mgr.res_marryPower.get(id, None)

        if not res:
            return 0, errcode.EC_NORES

        if not self.player.marry.spousePid:
            return 0, errcode.EC_MARRY_NOT_MARRY

        self.player.marry.checkEn()

        en = 0
        for x in self.player.marry.powerEn:
            if x["id"] == id:
                en = x["en"]
                break

        if res.enlimit and not en:
            return 0, errcode.EC_MARRY_NOT_EN

        useids = self.player.marry.getMarryUseIDs()
        usenum = useids.count(id)

        if res.uselimit and usenum >= res.uselimit:
            return 0, errcode.EC_MARRY_NOT_TODAY_LIMIT

        cost = copy.deepcopy(res.cost)

        for k, v in cost.items():
            cost[k] = cost[k] * (num - bynum)

        if costtype and costnum:
            cost[costtype] = cost.get(costtype, 0) + costnum

        delkey = []
        for k, v in cost.items():
            if not v:
                delkey.append(k)
        for k in delkey:
            del cost[k]

        # print("!!!!!!!",cost)

        respBag = self.player.bag.costItem(cost,
                                           constant.ITEM_COST_MARRY_POWER,
                                           wLog=True)
        if not respBag.get("rs", 0):
            return 0, errcode.EC_NOT_ENOUGH

        self.player.marry.addPower(id, res.add * num, res.uselimit,
                                   res.enlimit, num)

        from game.mgr.player import get_rpc_player
        targetPlayer = get_rpc_player(self.player.marry.spousePid,
                                      offline=False)
        if targetPlayer:
            targetPlayer.marryPowerPush(id, res.add * num, num, self.player.id,
                                        self.player.name)

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["marryInfo"] = self.player.marry.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 亲密度等级领奖
    def rc_MarryLvReward(self, id):

        res = Game.res_mgr.res_marryLv.get(id, None)
        if not res:
            return 0, errcode.EC_NORES

        if id in self.player.marry.powerLvReward:
            return 0, errcode.EC_NORES

        if self.player.marry.power < res.power:
            return 0, errcode.EC_NORES

        respBag = self.player.bag.add(res.reward,
                                      constant.ITEM_ADD_MARRY_POWER,
                                      wLog=True)

        self.player.marry.powerLvReward.append(id)
        self.player.marry.markDirty()

        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        dUpdate["marryInfo"] = self.player.marry.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp
Example #22
0
class RescueMixin(object):
    if 0:
        from game.core import player as player_md
        player = player_md.Player()



    def rc_rescueSave(self,resid):
        res = Game.res_mgr.res_rescueSystem.get(resid)
        if not res:
            return 0, errcode.EC_NORES


        if self.player.rescue.keyinfo[resid]["ok"]:
            return 0, errcode.EC_ALREADY_REWARD


        ok=True
        if res.num1>self.player.rescue.keyinfo[resid]["num1"]:
            ok=False
        elif res.num2>self.player.rescue.keyinfo[resid]["num2"]:
            ok=False
        elif res.num3>self.player.rescue.keyinfo[resid]["num3"]:
            ok=False
        elif res.num4>self.player.rescue.keyinfo[resid]["num4"]:
            ok=False
        elif res.num5>self.player.rescue.keyinfo[resid]["num5"]:
            ok=False
        

        if not ok:
            return 0, errcode.EC_NO_FINISH


        # if ok and not self.keyinfo[k]["ok"]:
            # self.keyinfo[k]["ok"]=1
            # self.score+=1


        # if self.player.map.mapSubId<res.mapsubid:
        #     return 0, errcode.EC_NOT_ABLE
        

        self.player.rescue.keyinfo[resid]["ok"]=1
        self.player.rescue.score+=1
        self.player.rescue.markDirty()

        
        # 打包返回信息
        dUpdate = {}
        dUpdate["rescue"] = self.player.rescue.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp


    def rc_rescueDing(self,resid):
        res = Game.res_mgr.res_rescueSystem.get(resid)
        if not res:
            return 0, errcode.EC_NORES


        if self.player.map.mapSubId<res.mapsubid:
            return 0, errcode.EC_NOT_ABLE
        

        self.player.rescue.Ding=resid
        self.player.rescue.markDirty()

        
        # 打包返回信息
        dUpdate = {}
        dUpdate["rescue"] = self.player.rescue.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    def rc_rescueReward(self,resid):
        res = Game.res_mgr.res_rescueReward.get(resid)
        if not res:
            return 0, errcode.EC_NORES

        if resid in self.player.rescue.rewards:
            return 0, errcode.EC_ALREADY_REWARD

        if self.player.rescue.score<res.score:
            return 0, errcode.EC_NOT_ENOUGH


        self.player.rescue.rewards.append(resid)
        self.player.rescue.markDirty()
        respBag = self.player.bag.add(res.reward, constant.ITEM_ADD_RESCUE_REWARD, wLog=True)
        
        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        dUpdate["rescue"] = self.player.rescue.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp


    def rc_rescueRefresh(self):

        sentFree = Game.res_mgr.res_common.get("sentFree")
        sentCost1 = Game.res_mgr.res_common.get("sentCost1")
        sentCost2 = Game.res_mgr.res_common.get("sentCost2")

        n=self.player.rescue.getfreshNum()
        respBag={}
        isGold=False
        if n>=sentFree.i:
            respBag = self.player.bag.costItem(sentCost1.arrayint2, constant.ITEM_COST_SENT_REFRESH, wLog=True)
            if not respBag.get("rs", 0):
                isGold=True
                respBag = self.player.bag.costItem(sentCost2.arrayint2, constant.ITEM_COST_SENT_REFRESH, wLog=True)
                if not respBag.get("rs", 0):
                    return 0, errcode.EC_COST_ERR


        self.player.rescue.refreshTaskUser(isGold)

        
        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        dUpdate["rescue"] = self.player.rescue.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    def rc_rescueFastXhour(self,idx,x):
        if not self.player.rescue.taskData[idx]["et"]:
            return 0, errcode.EC_NO_START

        nt = time.time()
        if self.player.rescue.taskData[idx]["et"]<=nt:
            return 0, errcode.EC_ALREADY_FINISH

        res = Game.res_mgr.res_rescueTask.get(self.player.rescue.taskData[idx]["id"])
        if not res:
            return 0, errcode.EC_NORES

        cost={}
        
        for _ in range(x):
            for k,v  in res.cost.items():
                cost[k]=cost.get(k,0)+v

        respBag = self.player.bag.costItem(cost, constant.ITEM_COST_SENT_FAST, wLog=True)
        if not respBag.get("rs", 0):
            return 0, errcode.EC_COST_ERR

        self.player.rescue.taskData[idx]["et"]-=x*3600
        self.player.rescue.markDirty()
        
        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        dUpdate["rescue"] = self.player.rescue.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp


    def rc_rescueFinishAll(self):
        
        reward={}
        newtaskData=[]
        for idx in range(len(self.player.rescue.taskData)):

            if not self.player.rescue.taskData[idx]["et"]:
                newtaskData.append(self.player.rescue.taskData[idx])
                continue

            nt = time.time()
            if self.player.rescue.taskData[idx]["et"]>nt:
                newtaskData.append(self.player.rescue.taskData[idx])
                continue

            
            res = Game.res_mgr.res_rescueTask.get(self.player.rescue.taskData[idx]["id"])
            if not res:
                newtaskData.append(self.player.rescue.taskData[idx])
                continue



            if res.rescueSystemKey:
                self.player.rescue.rescueSystemKey(res.rescueSystemKey)
            if res.rescueAuto:
                for _ in range(res.rescueAuto):
                    self.player.rescue.rescueAuto()

            for k,v in res.reward.items():
                reward[k]=reward.get(k,0)+v


        respBag = self.player.bag.add(reward, constant.ITEM_ADD_RESCUE_SENT, wLog=True)

        self.player.rescue.taskData=newtaskData
        self.player.rescue.markDirty()
        
        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        dUpdate["rescue"] = self.player.rescue.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    def rc_rescueFinish(self,idx):
        

        if not self.player.rescue.taskData[idx]["et"]:
            return 0, errcode.EC_NO_START

        nt = time.time()
        if self.player.rescue.taskData[idx]["et"]>nt:
            return 0, errcode.EC_NO_FINISH

        
        res = Game.res_mgr.res_rescueTask.get(self.player.rescue.taskData[idx]["id"])
        if not res:
            return 0, errcode.EC_NORES

        if res.rescueSystemKey:
            self.player.rescue.rescueSystemKey(res.rescueSystemKey)
        if res.rescueAuto:
            for _ in range(res.rescueAuto):
                self.player.rescue.rescueAuto()

        respBag = self.player.bag.add(res.reward, constant.ITEM_ADD_RESCUE_SENT, wLog=True)

        self.player.rescue.taskData.pop(idx)
        self.player.rescue.markDirty()
        
        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        dUpdate["rescue"] = self.player.rescue.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    def rc_rescueSent(self,idx,uids):

        if self.player.rescue.taskData[idx]["et"]:
            return 0, errcode.EC_CODE_10003

        res = Game.res_mgr.res_rescueTask.get(self.player.rescue.taskData[idx]["id"])
        if not res:
            return 0, errcode.EC_NORES

        if len(res.petid)!=len(uids):
            return 0, errcode.EC_NOT_ENOUGH

        for uidsidx in range(len(uids)):
            
            uid=uids[uidsidx]

            pet = self.player.pet.getPet(uid)
            if not pet:
                return 0, errcode.EC_PET_NOT_ACT
            petres = Game.res_mgr.res_pet.get(pet.resID)
            if not petres:
                return 0, errcode.EC_NORES
            
            evolveRes = Game.res_mgr.res_idlv_petevolve.get((pet.resID, pet.evolveLv))
            if not evolveRes:
                return 0, errcode.EC_NORES

            for td in self.player.rescue.taskData:
                if uid in td["petuid"]:
                    return 0, errcode.EC_CODE_10004

            if res.petid[uidsidx]:
                if res.petid[uidsidx]!=pet.resID:
                    return 0, errcode.EC_CODE_10005

            
            if res.eleType[uidsidx]:
                if res.eleType[uidsidx]!=petres.eleType:
                    return 0, errcode.EC_CODE_10006

            
            if res.showStar[uidsidx]:
                if res.showStar[uidsidx]>evolveRes.showStar:
                    return 0, errcode.EC_CODE_10007



        respBag = self.player.bag.costItem(res.explore, constant.ITEM_COST_SENT_PET, wLog=True)
        if not respBag.get("rs", 0):
            return 0, errcode.EC_COST_ERR


        self.player.rescue.taskData[idx]["et"]=time.time()+res.hour*3600
        self.player.rescue.taskData[idx]["petuid"]=uids
        self.player.rescue.markDirty()
        
        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        dUpdate["rescue"] = self.player.rescue.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    def rc_rescueXXX(self):

        
        # 打包返回信息
        dUpdate = {}
        dUpdate["rescue"] = self.player.rescue.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp
Example #23
0
class BossMixin(object):
    if 0:
        from game.core import player as player_md
        player = player_md.Player()

    # 挑战(grBossTZ)
    # 请求
    # 	个人bossid(id, int)
    # 返回
    # 	主动推送刷新(allUpdate, json)
    # 		游戏模型-货币
    # 		游戏模型-角色基础-经验
    # 		游戏模型-boss模块
    # 			个人boss(grBoss, json)
    # 				boss列表(bossList, [json]) #只推送更新的
    # 					个人bossId(id, int)
    # 					今日已挑战次数(num, int)
    # 					是否首通(first, int)0=未首通 1=已首通
    # 					是否已击杀(kill, int)0=未击杀 1=已击杀
    # 		游戏模型-角色背包
    # 	战报(fightLog, json)
    def rc_grBossTZ(self, id):
        bossRes = Game.res_mgr.res_grBoss.get(id)
        if not bossRes:
            return 0, errcode.EC_NORES
        barrRes = Game.res_mgr.res_barrier.get(bossRes.fbId)
        if not barrRes:
            return 0, errcode.EC_NORES
        mstRes = Game.res_mgr.res_monster.get(bossRes.mstId)
        if not mstRes:
            return 0, errcode.EC_NORES
        rewardRes = Game.res_mgr.res_reward.get(barrRes.rewardId)
        if not rewardRes:
            return 0, errcode.EC_NORES
        #判断人物的等级是否大于怪
        iLv = self.player.base.GetLv()
        if iLv < mstRes.level:
            return 0, errcode.EC_GRBOSS_LV_NOT_ENOUGH
        iKill = self.player.boss.GetGrBossTodayKill(id)
        if iKill:
            return 0, errcode.EC_GRBOSS_HAS_KILL

        # fightobj = Game.fight_mgr.createFight(constant.FIGHT_TYPE_200)
        # rs = fightobj.init_by_barrId(self.player, barrRes.id)
        # if not rs:
        #     return 0, errcode.EC_INIT_BARR_FAIL
        iNum = self.player.boss.GetGrBossTodayTZ(id)
        if iNum >= barrRes.num:  #一天只能挑战一次
            return 0, errcode.EC_GRBOSS_NUM_NOT_ENOUGH

        # fightLog = fightobj.doFight()

        fightobj = createFight(constant.FIGHT_TYPE_100)
        rs = fightobj.init_data(
            self.player.GetFightData(constant.BATTLE_ARRAY_TYPE_NORMAL),
            100000)
        if not rs:
            return 0, errcode.EC_INIT_BARR_FAIL
        fightLog = fightobj.doFight()
        log_end = fightLog.get("end", {})
        winerList = log_end.get("winerList", [])
        fightResult = 1 if self.player.id in winerList else 0

        respBag = {}
        if fightResult:
            iNum += 1
            self.player.boss.SetGrBossTodayTZ(id, iNum)
            #设置击杀
            self.player.boss.SetGrBossTodayKill(id)
            # 奖励判断是否已首通
            dReward = rewardRes.doReward()
            if not self.player.boss.IsGrBossFirst(id):
                dReward.update(barrRes.firstReward)  #首通奖励
                self.player.boss.SetGrBossFirst(id)
                respBag = self.player.bag.add(dReward,
                                              constant.ITEM_ADD_GRBOSS_REWARD,
                                              wLog=True)
        # 抛事件
        self.player.safe_pub(msg_define.MSG_GR_BOSS)
        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        dUpdate["bossInfo"] = self.player.boss.to_grboss_data([id])
        resp = {
            "fightLog": fightLog,
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 扫荡(grBossSD)
    # 请求
    # 	个人bossid(id, int)
    # 返回
    # 	主动推送刷新(allUpdate, json)
    # 		游戏模型-货币
    # 		游戏模型-角色基础-经验
    # 		游戏模型-boss模块
    # 			个人boss(grBoss, json)
    # 				boss列表(bossList, [json]) 只推送更新的
    # 					个人bossId(id, int)
    # 					今日已挑战次数(num, int)
    # 					是否首通(first, int)0=未首通 1=已首通
    # 					是否已击杀(kill, int)0=未击杀 1=已击杀
    # 		游戏模型-角色背包
    def rc_grBossSD(self, id):
        bossRes = Game.res_mgr.res_grBoss.get(id)
        if not bossRes:
            return 0, errcode.EC_NORES
        barrRes = Game.res_mgr.res_barrier.get(bossRes.fbId)
        if not barrRes:
            return 0, errcode.EC_NORES
        mstRes = Game.res_mgr.res_monster.get(bossRes.mstId)
        if not mstRes:
            return 0, errcode.EC_NORES
        rewardRes = Game.res_mgr.res_reward.get(barrRes.rewardId)
        if not rewardRes:
            return 0, errcode.EC_NORES
        #没有首通的不允许扫荡
        if not self.player.boss.IsGrBossFirst(id):
            return 0, errcode.EC_GRBOSS_NOT_KILLED
        #判断人物的等级是否大于怪
        iLv = self.player.base.GetLv()
        if iLv < mstRes.level:
            return 0, errcode.EC_GRBOSS_LV_NOT_ENOUGH
        iKill = self.player.boss.GetGrBossTodayKill(id)
        if iKill:
            return 0, errcode.EC_GRBOSS_HAS_KILL
        #设置挑战次数
        iNum = self.player.boss.GetGrBossTodayTZ(id)
        if iNum >= 1:  # 一天只能挑战一次
            return 0, errcode.EC_GRBOSS_NUM_NOT_ENOUGH
        iNum += 1
        self.player.boss.SetGrBossTodayTZ(id, iNum)
        #设置击杀
        self.player.boss.SetGrBossTodayKill(id)
        #击杀奖励
        dReward = rewardRes.doReward()
        respBag = self.player.bag.add(dReward,
                                      constant.ITEM_ADD_GRBOSS_REWARD,
                                      wLog=True)
        # 抛事件
        self.player.safe_pub(msg_define.MSG_GR_BOSS)
        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        dUpdate["bossInfo"] = self.player.boss.to_grboss_data([id])
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 一键扫荡(grBossOneKeySD)
    # 请求
    # 返回
    # 	主动推送刷新(allUpdate, json)
    # 		游戏模型-货币
    # 		游戏模型-角色基础-经验
    # 		游戏模型-boss模块
    # 			个人boss(grBoss, json)
    # 				boss列表(bossList, [json]) 只推送更新的
    # 					个人bossId(id, int)
    # 					今日已挑战次数(num, int)
    # 					是否首通(first, int)0=未首通 1=已首通
    # 					是否已击杀(kill, int)0=未击杀 1=已击杀
    # 		游戏模型-角色背包
    def rc_grBossOneKeySD(self):
        vipLv = self.player.vip.GetVipLv()
        vipRes = Game.res_mgr.res_vip.get(vipLv, None)
        if not vipRes:
            return 0, errcode.EC_NORES
        if not vipRes.grBossOneKey:
            return 0, errcode.EC_GR_BOSS_SWEEP_VIP_LIMIT

        keys = list(Game.res_mgr.res_grBoss.keys())
        keys.sort()
        respBag = {}
        resp_keys = []
        for id in keys:
            bossRes = Game.res_mgr.res_grBoss.get(id)
            if not bossRes:
                continue
            barrRes = Game.res_mgr.res_barrier.get(bossRes.fbId)
            if not barrRes:
                continue
            mstRes = Game.res_mgr.res_monster.get(bossRes.mstId)
            if not mstRes:
                continue
            rewardRes = Game.res_mgr.res_reward.get(barrRes.rewardId)
            if not rewardRes:
                continue
            # 没有首通的不允许扫荡
            if not self.player.boss.IsGrBossFirst(id):
                continue
            # 判断人物的等级是否大于怪
            iLv = self.player.base.GetLv()
            if iLv < mstRes.level:
                continue
            iKill = self.player.boss.GetGrBossTodayKill(id)
            if iKill:
                continue
            # 设置挑战次数
            iNum = self.player.boss.GetGrBossTodayTZ(id)
            if iNum >= 1:  # 一天只能挑战一次
                continue
            iNum += 1
            self.player.boss.SetGrBossTodayTZ(id, iNum)
            # 设置击杀
            self.player.boss.SetGrBossTodayKill(id)
            # 击杀奖励
            dReward = rewardRes.doReward()
            respBag1 = self.player.bag.add(dReward,
                                           constant.ITEM_ADD_GRBOSS_REWARD,
                                           wLog=True)
            respBag = self.player.mergeRespBag(respBag, respBag1)
            resp_keys.append(id)
            # 抛事件
            self.player.safe_pub(msg_define.MSG_GR_BOSS)
        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        dUpdate["bossInfo"] = self.player.boss.to_grboss_data(resp_keys)
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 打开主界面(qmBossOpenUI)
    # 请求
    # 返回
    # 	全民boss列表(bossList, [json])
    # 		全民bossid(id, int)
    # 		当前血量(curHp, int)
    # 		总血量(maxHp, int)
    # 		争夺人数(num, int)
    # 		状态(status, int)0=未击杀 1=已击杀
    # 		重生时间戳(time, int)
    def rc_qmBossOpenUI(self):
        bossList = Game.rpc_qmboss_mgr.GetAllBossInfo()
        resp = {
            "bossList": bossList,
        }
        return 1, resp

    # 刷新挑战次数(qmBossRefreNum)
    # 请求
    # 返回
    # 	剩余挑战次数(num, int)
    # 	下次恢复时间戳(time, int)
    def rc_qmBossRefreNum(self):
        num = self.player.boss.GetQmBossTZ()
        iTime = self.player.boss.GetQmBossTime()
        resp = {
            "num": num,
            "time": iTime,
        }
        return 1, resp

    # 购买挑战次数(qmBossBuyNum)
    # 请求
    # 返回
    # 	主动推送刷新(allUpdate, json)
    # 		游戏模型-vip模块
    # 			全民boss已购买挑战次数(qmBossTz, int)
    # 		游戏模型-boss模块
    # 			全民boss(qmBoss, json)
    # 				剩余挑战次数(num, int)
    # 				下次恢复时间戳(time, int)
    # 		游戏模型-货币
    def rc_qmBossBuyNum(self):
        resQmBossTzCnt = Game.res_mgr.res_common.get("qmBossTzCnt")
        resQmBossBuyNum = Game.res_mgr.res_common.get("qmBossBuyNum")
        resQmBossTzPirce = Game.res_mgr.res_common.get("qmBossTzPirce")
        if not resQmBossTzCnt or not resQmBossBuyNum or not resQmBossTzPirce:
            return 0, errcode.EC_NORES
        iVipLv = self.player.vip.GetVipLv()
        vipRes = Game.res_mgr.res_vip.get(iVipLv)
        if not vipRes:
            return 0, errcode.EC_NORES
        iBuyCnt = self.player.vip.GetBuyQmBossTz()
        if iBuyCnt >= vipRes.qmBossTz:
            return 0, errcode.EC_QMBOSS_BUY_CNT_LIMIT
        iNum = self.player.boss.GetQmBossTZ()
        if iNum >= resQmBossTzCnt.i:  #已经是满的,不需要
            return 0, errcode.EC_QMBOSS_NUM_FULL
        dCost = resQmBossTzPirce.arrayint2
        # 扣道具
        respBag = self.player.bag.costItem(dCost,
                                           constant.ITEM_COST_QMBOSS_BUY,
                                           wLog=True)
        if not respBag.get("rs", 0):
            return 0, errcode.EC_QMBOSS_BUY_NOT_ENOUGH
        self.player.boss.addQmBossTZ(resQmBossBuyNum.i)
        self.player.vip.SetBuyQmBossTz(iBuyCnt + 1)
        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        dUpdate["bossInfo"] = {
            "qmBoss":
            dict(num=self.player.boss.GetQmBossTZ(),
                 time=self.player.boss.GetQmBossTime())
        }
        dUpdate["vipInfo"] = dict(qmBossTz=self.player.vip.GetBuyQmBossTz())
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 请求争夺人数(qmBossFighterNum)
    # 请求
    # 	全民bossid(id, int)
    # 返回
    # 	争夺列表(fighters, [json])
    # 		名次(rank, int)
    # 		玩家名称(name, string)
    # 		伤害(hurt, int)
    def rc_qmBossFighterNum(self, id):
        fighters = Game.rpc_qmboss_mgr.GetFighterData(id)
        resp = {
            "fighters": fighters,
        }
        return 1, resp

    # 请求击杀列表(qmBossKillRecord)
    # 请求
    # 	全民bossid(id, int)
    # 返回
    # 	击杀列表(killList, [json])
    # 		击杀时间戳(time, int)
    # 		玩家名称(name, string)
    # 		战力(fa, int)
    def rc_qmBossKillRecord(self, id):
        killList = Game.rpc_qmboss_mgr.GetKillList(id)
        resp = {
            "killList": killList,
        }
        return 1, resp

    # boss提醒设置(qmBossSetNotice)
    # 请求
    # 	提醒列表(NoticeList, [int])
    # 		全民bossid
    # 	注意:发上来的服务器置1提醒,剩下的全部清0
    # 返回
    def rc_qmBossSetNotice(self, NoticeList):
        self.player.boss.SetQmBossRemind(NoticeList)
        return 1, None

    # 挑战(qmBossTZ)
    # 请求
    # 	全民bossid(id, int)
    # 返回
    # 	自己的伤害(hurt, int)
    # 	争夺列表(fighters, [json])
    # 		名次(rank, int)
    # 		玩家名称(name, int)
    # 		伤害(hurt, int)
    # 	战报(fightLog, json)
    # 注意:挑战之后主动请求界面数据
    def rc_qmBossTZ(self, id):
        resQmBoss = Game.res_mgr.res_qmBoss.get(id)
        if not resQmBoss:
            return 0, errcode.EC_NORES
        barrRes = Game.res_mgr.res_barrier.get(resQmBoss.fbId)
        if not barrRes:
            return 0, errcode.EC_NORES
        tzRewardRes = Game.res_mgr.res_reward.get(resQmBoss.tzReward)
        if not tzRewardRes:
            return 0, errcode.EC_NORES
        killRewardRes = Game.res_mgr.res_reward.get(resQmBoss.killReward)
        if not killRewardRes:
            return 0, errcode.EC_NORES
        iTZNum = self.player.boss.GetQmBossTZ()
        if iTZNum <= 0:
            return 0, errcode.EC_QMBOSS_TZ_NOT_ENOUGH
        #异步获取boss数据
        bossInfo = Game.rpc_qmboss_mgr.GetTZInfo(id, self.player.id)
        if not bossInfo:
            return 0, errcode.EC_QMBOSS_NOT_FIND
        status = bossInfo.get("status", 0)
        if status:
            return 0, errcode.EC_QMBOSS_HAS_KILL
        # fightobj = Game.fight_mgr.createFight(constant.FIGHT_TYPE_201)
        # rs = fightobj.init_by_barrId(self.player, barrRes.id)
        # if not rs:
        #     return 0, errcode.EC_INIT_BARR_FAIL
        #扣除挑战次数
        self.player.boss.delQmBossTZ(1)
        #修改怪物血量
        # curHp = bossInfo.get("curHp", 0)
        # fightobj.fix_monster_hp({resQmBoss.mstId:curHp})
        #战斗
        # fightLog = fightobj.doFight(logMstId=resQmBoss.mstId)

        fightobj = createFight(constant.FIGHT_TYPE_100)
        rs = fightobj.init_data(
            self.player.GetFightData(constant.BATTLE_ARRAY_TYPE_NORMAL),
            100000)
        if not rs:
            return 0, errcode.EC_INIT_BARR_FAIL
        fightLog = fightobj.doFight()
        log_end = fightLog.get("end", {})
        winerList = log_end.get("winerList", [])
        fightResult = 1 if self.player.id in winerList else 0

        #同步数据
        # hurt = curHp - fightLog.get("mstData", {}).get(constant.ATTR_HP, 0)
        hurt = 999
        fightInfo = {
            "pid": self.player.id,
            "name": self.player.name,
            "fa": self.player.base.fa,
            "portrait": self.player.myhead.getPortrait(),  # 头像
            "headframe": self.player.myhead.getHeadframe(),  # 头像框
            "hurt": hurt
        }
        #是否击杀由远端精确控制
        isKill = Game.rpc_qmboss_mgr.FightBoss(id, fightInfo)
        if isKill:  #击杀
            print("=============kill qmboss====")
            mailRes = Game.res_mgr.res_mail.get(
                constant.MAIL_ID_BOSS_KILL_REWARD_LK, None)
            Game.rpc_mail_mgr.sendPersonMail(self.player.id,
                                             mailRes.title,
                                             mailRes.content,
                                             resQmBoss.lkmailReward,
                                             push=False)

            dReward = killRewardRes.doReward()
        else:
            dReward = tzRewardRes.doReward()

        respBag = self.player.bag.add(dReward,
                                      constant.ITEM_ADD_QMBOSS_REWARD,
                                      wLog=True)

        # 抛事件
        self.player.safe_pub(msg_define.MSG_QM_BOSS)
        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        #全民boss 看到的都是挑战成功
        # fightLog["result"]={}
        # fightLog["end"]["win"] = 1
        fightLog["end"]["winerList"] = [self.player.id]
        resp = {
            "id": id,
            "hurt": bossInfo.get("myHurt", 0),
            "fighters": bossInfo.get("fighters", []),
            "fightLog": fightLog,
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 复活并挑战(qmBossFHandTZ)
    # 请求
    # 	全民bossid(id, int)
    # 返回
    # 	自己的伤害(hurt, int)
    # 	争夺列表(fighters, [json])
    # 		名次(rank, int)
    # 		玩家名称(name, int)
    # 		伤害(hurt, int)
    # 	战报(fightLog, json)
    # 	主动推送刷新(allUpdate, json)
    # 		游戏模型-货币
    # 		游戏模型-角色背包
    # 		游戏模型-角色基础-经验
    # 注意:挑战之后主动请求界面数据
    def rc_qmBossFHandTZ(self, id):
        # 全民boss是否可复活 vip 控制
        iVipLv = self.player.vip.GetVipLv()
        vipRes = Game.res_mgr.res_vip.get(iVipLv)
        if not vipRes:
            return 0, errcode.EC_NORES
        if not vipRes.qmBossFh:
            return 0, errcode.EC_QMBOSS_REBORN_LIMIT

        resQmBoss = Game.res_mgr.res_qmBoss.get(id)
        if not resQmBoss:
            return 0, errcode.EC_NORES
        if not resQmBoss.relive:  #不可复活
            return 0, errcode.EC_QMBOSS_REBORN_LIMIT
        barrRes = Game.res_mgr.res_barrier.get(resQmBoss.fbId)
        if not barrRes:
            return 0, errcode.EC_NORES
        tzRewardRes = Game.res_mgr.res_reward.get(resQmBoss.tzReward)
        if not tzRewardRes:
            return 0, errcode.EC_NORES
        killRewardRes = Game.res_mgr.res_reward.get(resQmBoss.killReward)
        if not killRewardRes:
            return 0, errcode.EC_NORES
        monsterRes = Game.res_mgr.res_monster.get(resQmBoss.mstId)
        if not monsterRes:
            return 0, errcode.EC_NORES
        iTZNum = self.player.boss.GetQmBossTZ()
        if iTZNum <= 0:
            return 0, errcode.EC_QMBOSS_TZ_NOT_ENOUGH
        # 异步获取boss数据
        bossInfo = Game.rpc_qmboss_mgr.GetTZInfo(id, self.player.id)
        if not bossInfo:
            return 0, errcode.EC_QMBOSS_NOT_FIND
        status = bossInfo.get("status", 0)
        if not status:
            return 0, errcode.EC_QMBOSS_ALIVE
        # fightobj = Game.fight_mgr.createFight(constant.FIGHT_TYPE_201)
        # rs = fightobj.init_by_barrId(self.player, barrRes.id)
        # if not rs:
        #     return 0, errcode.EC_INIT_BARR_FAIL
        #复活材料判断
        # 扣道具
        respBag = self.player.bag.costItem(resQmBoss.cost1,
                                           constant.ITEM_COST_QMBOSS_REBORN,
                                           wLog=True)
        if not respBag.get("rs", 0):
            # 扣道具
            respBag1 = self.player.bag.costItem(
                resQmBoss.cost2, constant.ITEM_COST_QMBOSS_REBORN, wLog=True)
            respBag = self.player.mergeRespBag(respBag, respBag1)
            if not respBag1.get("rs", 0):
                return 0, errcode.EC_QMBOSS_REBORN_NOT_ENOUGH
        #扣除挑战次数
        self.player.boss.delQmBossTZ(1)
        #战斗
        # fightLog = fightobj.doFight(logMstId=resQmBoss.mstId)
        #同步数据

        fightobj = createFight(constant.FIGHT_TYPE_100)
        rs = fightobj.init_data(
            self.player.GetFightData(constant.BATTLE_ARRAY_TYPE_NORMAL),
            100000)
        if not rs:
            return 0, errcode.EC_INIT_BARR_FAIL
        fightLog = fightobj.doFight()
        log_end = fightLog.get("end", {})
        winerList = log_end.get("winerList", [])
        fightResult = 1 if self.player.id in winerList else 0

        # curHp = monsterRes.attr.get(constant.ATTR_HP, 0)
        # hurt = curHp - fightLog.get("mstData", {}).get(constant.ATTR_HP, 0)
        curHp = monsterRes.attr.get(constant.ATTR_HP, 0)
        hurt = curHp - fightLog.get("mstData", {}).get(constant.ATTR_HP, 0)
        fightInfo = {
            "pid": self.player.id,
            "name": self.player.name,
            "fa": self.player.base.fa,
            "portrait": self.player.myhead.getPortrait(),  # 头像
            "headframe": self.player.myhead.getHeadframe(),  # 头像框
            "hurt": hurt
        }
        #是否击杀由远端精确控制
        isKill = Game.rpc_qmboss_mgr.FightBoss(id, fightInfo, reborn=1)
        if isKill:  #击杀

            print("=============kill qmboss=2===")
            mailRes = Game.res_mgr.res_mail.get(
                constant.MAIL_ID_BOSS_KILL_REWARD_LK, None)
            Game.rpc_mail_mgr.sendPersonMail(self.player.id,
                                             mailRes.title,
                                             mailRes.content,
                                             resQmBoss.lkmailReward,
                                             push=False)

            dReward = killRewardRes.doReward()
        else:
            dReward = tzRewardRes.doReward()

        respBag2 = self.player.bag.add(dReward,
                                       constant.ITEM_ADD_QMBOSS_REWARD,
                                       wLog=True)
        respBag = self.player.mergeRespBag(respBag, respBag2)

        # 抛事件
        self.player.safe_pub(msg_define.MSG_QM_BOSS)
        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        # 全民boss 看到的都是挑战成功
        fightLog["result"]["win"] = 1
        fightLog["result"]["winerList"] = [self.player.id]
        resp = {
            "hurt": bossInfo.get("myHurt", 0),
            "killList": bossInfo.get("fighters", []),
            "fightLog": fightLog,
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 打开野外Boss主界面(ywBossOpenUI)
    # 请求
    # 返回
    # 	野外Boss列表(ywBossList, [json])
    # 		野外BossId(id, int)
    # 		状态(status, int)1=已刷新 2=已逃跑 3=已击杀
    def rc_ywBossOpenUI(self):
        bossList = Game.rpc_ywboss_mgr.GetAllBossInfo()
        resp = {
            "ywBossList": bossList,
        }
        return 1, resp

    # 进入野外Boss详情界面(ywBossInfo)
    # 请求
    # 	野外BossId(id, int)
    # 返回
    # 	野外BossId(id, int)
    # 	当前血量(curHp, int)
    # 	总血量(maxHp, int)
    # 	占领者id(rid, int)
    # 	占领者性别(sex, int)
    # 	占领者名称(name, string)
    # 	占领结束时间戳(time, int)
    # 	野外Boss今日已挑战次数(todayNum, int)
    # 	野外Boss今日最后一次挑战时间(LastTime, int)
    def rc_ywBossInfo(self, id):
        resp = Game.rpc_ywboss_mgr.GetBossInfo(id)
        resp["todayNum"] = self.player.boss.GetYwBossTodayTZ()
        resp["LastTime"] = self.player.boss.GetYwBossLastTZTime()
        resp["id"] = id
        return 1, resp

    # 野外Boss挑战(ywBossTZ)
    # 请求
    # 	野外BossId(id, int)
    # 	是否花元宝清除cd(clean, int)
    # 返回
    # 	野外BossId(id, int)
    # 	当前血量(curHp, int)
    # 	总血量(maxHp, int)
    # 	占领者id(rid, int)
    # 	占领者性别(sex, int)
    # 	占领者名称(name, string)
    # 	占领结束时间戳(time, int)
    # 	状态(status, int)1=已刷新 2=已逃跑 3=已击杀
    # 	战报(fightLog, json)
    # 	主动推送刷新(allUpdate, json)
    # 		游戏模型-货币
    # 		游戏模型-角色基础-经验
    # 		游戏模型-角色背包
    def rc_ywBossTZ(self, id, clean):
        resYwBoss = Game.res_mgr.res_ywBoss.get(id)
        if not resYwBoss:
            return 0, errcode.EC_NORES
        barrRes = Game.res_mgr.res_barrier.get(resYwBoss.fbId)
        if not barrRes:
            return 0, errcode.EC_NORES
        rewardRes = Game.res_mgr.res_reward.get(barrRes.rewardId)
        if not rewardRes:
            return 0, errcode.EC_NORES
        monsterRes = Game.res_mgr.res_monster.get(resYwBoss.mstId)
        if not monsterRes:
            return 0, errcode.EC_NORES
        #等级不够
        iLv = self.player.base.GetLv()
        if iLv < monsterRes.level:
            return 0, errcode.EC_YWBOSS_LV_LIMIT
        rs, bossInfo = Game.rpc_ywboss_mgr.CheckYwBossTZ(self.player.id, id)
        if not rs:
            return 0, errcode.EC_YWBOSS_HAS_OCCUPY
        status = bossInfo.get("status", 0)
        if status != 1:  #1=已刷新
            return 0, errcode.EC_YWBOSS_STATUS_ERR
        resYwBossFreeNum = Game.res_mgr.res_common.get(
            "ywBossFreeNum")  # 野外boss免CD挑战次数
        resYwBossCdArr = Game.res_mgr.res_common.get(
            "ywBossCdArr")  # 野外boss免CD次数之后的挑战CD(分钟)
        resYwBossCleanCdCost = Game.res_mgr.res_common.get(
            "ywBossCleanCdCost")  # 野外boss清除1分钟cd消耗钻石
        if not resYwBossFreeNum and not resYwBossCdArr and not resYwBossCleanCdCost:
            return 0, errcode.EC_NORES
        iTodayNum = self.player.boss.GetYwBossTodayTZ()
        dCost = {}
        if iTodayNum >= resYwBossFreeNum.i:
            cdNum = iTodayNum + 1 - resYwBossFreeNum.i
            cdTime = resYwBossCdArr.arrayint2.get(cdNum)
            if not cdTime:
                maxKey = max(list(resYwBossCdArr.arrayint2.keys()))
                cdTime = resYwBossCdArr.arrayint2.get(maxKey)
            now = int(time.time())
            iLastTZTime = self.player.boss.GetYwBossLastTZTime()
            passTime = now - iLastTZTime
            needTime = cdTime * 60 - passTime
            if needTime > 0:
                if clean:
                    dCost[constant.
                          CURRENCY_BINDGOLD] = resYwBossCleanCdCost.i * int(
                              (needTime / 60 + 1))
                else:
                    return 0, errcode.EC_YWBOSS_CD
        respBag = {}
        # 高级boss挑战需要挑战令,失去归属权时不返还挑战令
        # 归属权是自己时候再次挑战不消耗令
        rid = bossInfo.get("rid", 0)
        if rid != self.player.id:
            dCost.update(resYwBoss.cost)
            # 扣道具
            respBag1 = self.player.bag.costItem(
                dCost, constant.ITEM_COST_YWBOSS_FIGHT, wLog=True)
            respBag = self.player.mergeRespBag(respBag, respBag1)
            if not respBag1.get("rs", 0):
                return 0, errcode.EC_YWBOSS_FIGHT_NOT_ENOUGH
        #有占领者
        bossStatus = 0
        other = None
        if rid and rid != self.player.id:
            from game.mgr.player import get_rpc_player
            # fightobj = Game.fight_mgr.createFight(constant.FIGHT_TYPE_204)
            # other = get_rpc_player(rid)
            # if not other:
            #     return 0, errcode.EC_INIT_BARR_FAIL
            # rs = fightobj.init_players(self.player, other)
            # if not rs:
            #     return 0, errcode.EC_INIT_BARR_FAIL
            # fightobj.SetRounds(30)
            # fightLog = fightobj.doFight()
            fightobj = createFight(constant.FIGHT_TYPE_100)
            rs = fightobj.init_data(
                self.player.GetFightData(constant.BATTLE_ARRAY_TYPE_NORMAL),
                100000)
            if not rs:
                return 0, errcode.EC_INIT_BARR_FAIL
            fightLog = fightobj.doFight()
            log_end = fightLog.get("end", {})
            winerList = log_end.get("winerList", [])
            fightResult = 1 if self.player.id in winerList else 0

            if fightResult:
                fightInfo = {
                    "pid": self.player.id,  # 占领者id(rid, int)
                    "sex": self.player.base.GetSex(),  # 占领者性别(sex, int)
                    "name": self.player.name,  # 占领者名称(name, string)
                    "fa": self.player.base.fa,  # 占领者战力(fa, int)
                    "portrait": self.player.myhead.getPortrait(),  #占领者头像
                    "headframe": self.player.myhead.getHeadframe(),  #占领者头像框
                }
                Game.rpc_ywboss_mgr.occupyBoss(id, fightInfo, rid)
        else:  #无占领者
            # fightobj = Game.fight_mgr.createFight(constant.FIGHT_TYPE_202)
            # rs = fightobj.init_by_barrId(self.player, barrRes.id)
            # if not rs:
            #     return 0, errcode.EC_INIT_BARR_FAIL
            # 修改怪物血量
            # curHp = bossInfo.get("curHp", 0)
            # fightobj.fix_monster_hp({resYwBoss.mstId: curHp})
            # 战斗
            # fightLog = fightobj.doFight(logMstId=resYwBoss.mstId)

            fightobj = createFight(constant.FIGHT_TYPE_100)
            rs = fightobj.init_data(
                self.player.GetFightData(constant.BATTLE_ARRAY_TYPE_NORMAL),
                100000)
            if not rs:
                return 0, errcode.EC_INIT_BARR_FAIL
            fightLog = fightobj.doFight()
            log_end = fightLog.get("end", {})
            winerList = log_end.get("winerList", [])
            fightResult = 1 if self.player.id in winerList else 0

            # 同步数据
            # hurt = curHp - fightLog.get("mstData", {}).get(constant.ATTR_HP, 0)
            hurt = 999
            fightInfo = {
                "pid": self.player.id,  # 占领者id(rid, int)
                "sex": self.player.base.GetSex(),  # 占领者性别(sex, int)
                "name": self.player.name,  # 占领者名称(name, string)
                "fa": self.player.base.fa,  # 占领者战力(fa, int)
                "portrait": self.player.myhead.getPortrait(),  # 占领者头像
                "headframe": self.player.myhead.getHeadframe(),  # 占领者头像框
                "hurt": hurt
            }
            # 是否击杀由远端精确控制
            bossStatus = Game.rpc_ywboss_mgr.FightBoss(id, fightInfo)
        isKill = 0
        if bossStatus == 3:
            isKill = 1
        # 打包返回信息
        bossInfo = Game.rpc_ywboss_mgr.GetBossInfo(id)
        #直接击杀奖励
        if isKill:
            respBag2 = self.player.sendYwBossKillReward(id, isTimeout=0)
            respBag = self.player.mergeRespBag(respBag, respBag2)

        dUpdate = self.player.packRespBag(respBag)
        resp = {
            "id": bossInfo.get("id", 0),
            "curHp": bossInfo.get("curHp", 0),
            "maxHp": bossInfo.get("maxHp", 0),
            "rid": bossInfo.get("rid", 0),
            "sex": bossInfo.get("sex", 0),
            "name": bossInfo.get("name", ''),
            "time": bossInfo.get("time", 0),
            "status": bossInfo.get("status", 0),
            "fightLog": fightLog,
            "allUpdate": dUpdate,
            "todayNum": self.player.boss.GetYwBossTodayTZ(),
            "LastTime": self.player.boss.GetYwBossLastTZTime(),
        }
        #同步给另外一个玩家
        if other:
            other.sendYwBossTZ(resp, _no_result=True)
        return 1, resp

    # 查看生死劫记录(ssjBossRecord)
    # 请求
    # 	生死劫配置表id(id, int)
    # 返回
    # 	全服首杀队伍名称列表(firstNames, [string]) 首杀者名字
    # 	首杀回合数(firstRounds, int)
    # 	首杀时间戳(firstTime, int)
    # 	最少回合队伍名称列表(minNames, [string]) 名字
    # 	最少回合数(minRounds, int)
    # 	最少回合击杀时间戳(minTime, int)
    def rc_ssjBossRecord(self, id):
        resp = Game.rpc_ssjboss_mgr.GetBossInfo(id)
        return 1, resp

    # 挑战(ssjBossTZ)
    # 请求
    # 	生死劫配置表id(id, int)
    # 	队伍id(teamId, int)
    # 返回
    # 全队推送(ssjBossTZNotice)只推送真人,机器人过滤
    # 	生死劫配置表id(id, int)
    # 	战报(fightLog, json)
    # 	主动推送刷新(allUpdate, json)
    # 		游戏模型-货币
    # 		游戏模型-角色基础-经验
    # 		游戏模型-角色背包
    # 		游戏模型-boss模块
    # 			生死劫(ssjBoss, json)
    # 				章节数据(allData, [json])
    # 					配置表id(id, int)
    # 					是否已首通(firstFinish, int)
    # 					今天是否已通关(finish, int)
    # 				今日剩余协助次数(num, int)
    def rc_ssjBossTZ(self, id, teamId):
        ssjRes = Game.res_mgr.res_ssjBoss.get(id)
        if not ssjRes:
            return 0, errcode.EC_NORES
        barrRes = Game.res_mgr.res_barrier.get(ssjRes.fbId)
        if not barrRes:
            return
        #前置关卡必须通关
        if id != 1 and not self.player.boss.GetSsjBossFirst(id - 1):
            return 0, errcode.EC_SSJBOSS_BARR_LIMIT
        # 是否开启
        if not self.player.checkOpenLimit(constant.SSJ_BOSS_OPEN_ID):
            return 0, errcode.EC_NOLEVEL
        # if self.player.boss.GetSsjBossTodayKill(id):
        #     return 0, errcode.EC_SSJBOSS_HAS_KILLED
        members = Game.rpc_team_mgr.GetTeamInfo(teamId)
        if not members:
            return 0, errcode.EC_TEAM_ERROR
        from game.mgr.player import get_rpc_player
        players = [(None, 1), (None, 1)]
        index = 0
        names = []
        for one in members:
            pid = one.get("rid", 0)
            if not pid:
                continue
            names.append(one.get("name", ""))
            if pid == self.player.id:
                if not one.get("main", 0):
                    return 0, errcode.EC_TEAM_NOT_MAIN
                else:
                    continue
            rpc_player = get_rpc_player(pid)
            if not rpc_player:
                continue
            players[index] = (rpc_player, one.get("isRobot", 1))
            index += 1

        # fightobj = Game.fight_mgr.createFight(constant.FIGHT_TYPE_203)
        # rs = fightobj.init_by_barrId(ssjRes.fbId, player1=self.player, player2=players[0][0], player3=players[1][0])
        # if not rs:
        #     return 0, errcode.EC_INIT_BARR_FAIL
        # fightLog = fightobj.doFight()
        # Game.glog.log2File("AttackHandle", "44444|%s"%fightLog)

        fightobj = createFight(constant.FIGHT_TYPE_100)
        rs = fightobj.init_data(
            self.player.GetFightData(constant.BATTLE_ARRAY_TYPE_NORMAL),
            100000)
        if not rs:
            return 0, errcode.EC_INIT_BARR_FAIL
        fightLog = fightobj.doFight()
        log_end = fightLog.get("end", {})
        winerList = log_end.get("winerList", [])
        fightResult = 1 if self.player.id in winerList else 0

        self.player.ssjBossTZNotice(id, fightLog, self.player.id)

        #机器人不推送
        for playerData in players:
            if playerData[1]:
                continue
            playerData[0].ssjBossTZNotice(id,
                                          fightLog,
                                          self.player.id,
                                          _no_result=True)
        #解散队伍
        Game.rpc_team_mgr.DeleteTeam(teamId)
        fightResult = fightLog["result"].get("win", 0)
        if fightResult:
            #上传生死劫结果
            FightInfo = {}
            FightInfo["ssjId"] = id
            FightInfo["round"] = fightLog.get("useRound", 999)
            FightInfo["names"] = names
            Game.rpc_ssjboss_mgr.ReportFight(FightInfo)
        else:
            self.player.safe_pub(msg_define.MSG_XIANSHITUISONGLIBAO_SSJ_F)

        # import ujson
        # Game.glog.log2File("testSsjBossTZ", "%s" % ujson.dumps(fightLog))
        #抛事件
        self.player.safe_pub(msg_define.MSG_SSJ_BOSS)
        return 1, None

    # 扫荡(ssjBossSD)
    # 请求
    # 	生死劫配置表id(id, int)
    # 返回
    # 	生死劫配置表id(id, int)
    # 	主动推送刷新(allUpdate, json)
    # 		游戏模型-货币
    # 		游戏模型-角色基础-经验
    # 		游戏模型-角色背包
    # 		游戏模型-boss模块
    # 			生死劫(ssjBoss, json)
    # 				章节数据(allData, [json])
    # 					配置表id(id, int)
    # 					是否已首通(firstFinish, int)
    # 					今天是否已通关(finish, int)
    # 				今日剩余协助次数(num, int)
    def rc_ssjBossSD(self, id):
        ssjRes = Game.res_mgr.res_ssjBoss.get(id)
        if not ssjRes:
            return 0, errcode.EC_NORES
        # 关卡必须通关
        if not self.player.boss.GetSsjBossFirst(id):
            return 0, errcode.EC_SSJBOSS_BARR_LIMIT
        # 是否开启
        if not self.player.checkOpenLimit(constant.SSJ_BOSS_OPEN_ID):
            return 0, errcode.EC_NOLEVEL
        if self.player.boss.GetSsjBossTodayKill(id):
            return 0, errcode.EC_SSJBOSS_HAS_KILLED
        barrRes = Game.res_mgr.res_barrier.get(ssjRes.fbId)
        if not barrRes:
            return 0, errcode.EC_NORES
        rewardRes = Game.res_mgr.res_reward.get(barrRes.rewardId)
        if not rewardRes:
            return 0, errcode.EC_NORES
        self.player.boss.SetSsjBossTodayKill(id)
        dReward = rewardRes.doReward()

        respBag = self.player.bag.add(dReward,
                                      constant.ITEM_ADD_SSJBOSS_REWARD,
                                      wLog=True)
        # 抛事件
        self.player.safe_pub(msg_define.MSG_SSJ_BOSS)
        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        dUpdate["bossInfo"] = self.player.boss.to_ssjboss_data([id])
        resp = {
            "id": id,
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 一键扫荡(ssjBossOnekeySD)
    # 请求
    # 返回
    # 	主动推送刷新(allUpdate, json)
    # 		游戏模型-货币
    # 		游戏模型-角色基础-经验
    # 		游戏模型-角色背包
    # 		游戏模型-boss模块
    # 			生死劫(ssjBoss, json)
    # 				章节数据(allData, [json])
    # 					配置表id(id, int)
    # 					是否已首通(firstFinish, int)
    # 					今天是否已通关(finish, int)
    # 				今日剩余协助次数(num, int)
    def rc_ssjBossOnekeySD(self):
        keys = list(Game.res_mgr.res_ssjBoss.keys())
        keys.sort()
        respBag = {}
        resp_keys = []
        for id in keys:
            ssjRes = Game.res_mgr.res_ssjBoss.get(id)
            if not ssjRes:
                continue
            # 关卡必须通关
            if not self.player.boss.GetSsjBossFirst(id):
                continue
            if self.player.boss.GetSsjBossTodayKill(id):
                continue
            barrRes = Game.res_mgr.res_barrier.get(ssjRes.fbId)
            if not barrRes:
                continue
            rewardRes = Game.res_mgr.res_reward.get(barrRes.rewardId)
            if not rewardRes:
                continue
            self.player.boss.SetSsjBossTodayKill(id)
            dReward = rewardRes.doReward()

            respBag1 = self.player.bag.add(dReward,
                                           constant.ITEM_ADD_SSJBOSS_REWARD,
                                           wLog=True)
            respBag = self.player.mergeRespBag(respBag, respBag1)
            # 抛事件
            self.player.safe_pub(msg_define.MSG_SSJ_BOSS)

            resp_keys.append(id)
        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)
        dUpdate["bossInfo"] = self.player.boss.to_ssjboss_data(resp_keys)
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp
Example #24
0
class GongchengRpcMixin(object):
    if 0:
        from game.core import player as player_md
        player = player_md.Player()

    def rc_gongchengQuanmingReward(self):
        gongchengActiveSerNum = Game.res_mgr.res_common.get("gongchengActiveSerNum")
        if not gongchengActiveSerNum:
            return 0, errcode.EC_NORES

        if config.serverNo not in Game.res_mgr.res_List_kuafuServerNo:
            return 0, errcode.EC_NORES
        
        idx=Game.res_mgr.res_List_kuafuServerNo.index(config.serverNo)
        startidx=(idx+1)-gongchengActiveSerNum.i
        if startidx<0:
            startidx=0

        slist=Game.res_mgr.res_List_kuafuServerNo[startidx:startidx+gongchengActiveSerNum.i]

        from game.mgr.room import get_rpc_gongcheng
        rpc_gongcheng = get_rpc_gongcheng()
        if not rpc_gongcheng:
            return 0, errcode.EC_GETD_RPC_ROOM_FAIL

        iOpenServiceDay = self.player.base.GetServerOpenDay()  # 开服天数
        t = self.player.base.GetServerOpenTime()  # 开服时间戳


        for k,v in Game.res_mgr.res_gongchengActive.items():
            if v.lastDay:
                if v.lastDayRank and v.openDay<=iOpenServiceDay<v.openDay+v.lastDay and v.openDay+v.lastDayRank<=iOpenServiceDay:

                    data=rpc_gongcheng.gongchengQuanmingRank()

                    newdata={}
    

                    ymds=[]
                    for x in range(v.lastDayRank):
                        tt=t+ (x+v.openDay-1)  *3600*24
                        ymd=gtime.getYYYYMMDDbyT(tt)
                        ymds.append(ymd)
                    

                    bestGuild={}
                    
                    for x in data:
                        if x["d"] in ymds:
                            for kk,vv in x["s"].items():
                                if kk in slist:


                                    newdata[kk]=newdata.get(kk,{"sno":kk,"list":[],"gnum":0,"score":0})
                                    newdata[kk]["score"]+=vv["score"]

                                    for kkk,vvv in vv["ghid"].items():

                                        bestGuild[kkk]=bestGuild.get(kkk,{"sno":kkk,"name":vvv["name"],"score":0})
                                        bestGuild[kkk]["score"]+=vvv["score"]
                                        
                                        

                                        # 去重计算工会数量
                                        if kkk not in newdata[kk]["list"]:
                                            newdata[kk]["list"].append(kkk)
                                            newdata[kk]["gnum"]+=1
                                        
                    bgs=list(newdata.values())
                    bgs = sorted(bgs, key=lambda fff: fff["score"], reverse=True)
                    if not len(bgs):
                        return 0, errcode.EC_GONGCHENG_QUANMING_NORANK #



                    if k in self.player.gongcheng.isRankRewardList:
                        return 0, errcode.EC_GONGCHENG_QUANMING_ALREADY #
                    
                    self.player.gongcheng.gongchengisRankReward(k)

                    reward=v.reward2
                    if bgs[0]["sno"]==config.serverNo:
                        reward=v.reward1
                    

                    respBag = self.player.bag.add(reward, constant.ITEM_ADD_GONGCHENG_QUANMING_RANK, wLog=True)

                    dUpdate = self.player.packRespBag(respBag)
                    dUpdate["gongcheng"] = self.player.gongcheng.to_init_data()
                    resp = {
                        "allUpdate": dUpdate,
                    }
                    return 1, resp

        


        return 0, errcode.EC_GONGCHENG_QUANMING_NOOPEN #


    def rc_gongchengQuanmingRank(self):

        #同步攻城任务数据
        self.rc_gongchengGetData()

        gongchengActiveSerNum = Game.res_mgr.res_common.get("gongchengActiveSerNum")
        if not gongchengActiveSerNum:
            return 0, errcode.EC_NORES

        if config.serverNo not in Game.res_mgr.res_List_kuafuServerNo:
            return 0, 15
        
        idx=Game.res_mgr.res_List_kuafuServerNo.index(config.serverNo)
        startidx=(idx+1)-gongchengActiveSerNum.i
        if startidx<0:
            startidx=0

        slist=Game.res_mgr.res_List_kuafuServerNo[startidx:startidx+gongchengActiveSerNum.i]

        from game.mgr.room import get_rpc_gongcheng
        rpc_gongcheng = get_rpc_gongcheng()
        if not rpc_gongcheng:
            return 0, errcode.EC_GETD_RPC_ROOM_FAIL

        iOpenServiceDay = self.player.base.GetServerOpenDay()  # 开服天数
        t = self.player.base.GetServerOpenTime()  # 开服时间戳


        for k,v in Game.res_mgr.res_gongchengActive.items():
            if v.lastDay:
                if v.lastDayRank and v.openDay<=iOpenServiceDay<v.openDay+v.lastDay:

                    data=rpc_gongcheng.gongchengQuanmingRank()

                    newdata={}
                    bestGuildName=""
                    bestGuildScore=0

                    ymds=[]
                    for x in range(v.lastDayRank):
                        tt=t+ (x+v.openDay-1)  *3600*24
                        ymd=gtime.getYYYYMMDDbyT(tt)
                        ymds.append(ymd)
                    

                    bestGuild={}
                    
                    for x in data:
                        if x["d"] in ymds:
                            for kk,vv in x["s"].items():
                                if kk in slist:


                                    newdata[kk]=newdata.get(kk,{"list":[],"gnum":0,"score":0})
                                    newdata[kk]["score"]+=vv["score"]

                                    for kkk,vvv in vv["ghid"].items():

                                        bestGuild[kkk]=bestGuild.get(kkk,{"name":vvv["name"],"score":0})
                                        bestGuild[kkk]["score"]+=vvv["score"]
                                        
                                        

                                        # 去重计算工会数量
                                        if kkk not in newdata[kk]["list"]:
                                            newdata[kk]["list"].append(kkk)
                                            newdata[kk]["gnum"]+=1
                                        
                    bgs=list(bestGuild.values())
                    bgs = sorted(bgs, key=lambda fff: fff["score"], reverse=True)
                    if len(bgs):
                        bestGuildName=bgs[0]["name"]
                        bestGuildScore=bgs[0]["score"]

                    return 1,{"serverNo":config.serverNo,"rank":newdata,"bestGuildName":bestGuildName,"bestGuildScore":bestGuildScore}

        


        return 1,{"serverNo":config.serverNo,"rank":{},"bestGuildName":"","bestGuildScore":0}



    def rc_gongchengGetData(self):


        from game.mgr.room import get_rpc_gongcheng
        rpc_gongcheng = get_rpc_gongcheng()
        if not rpc_gongcheng:
            return 0, errcode.EC_GETD_RPC_ROOM_FAIL

        self.player.gongcheng.enter()

        data = self.player.getGongchengInfo()
        import app
        rrv = rpc_gongcheng.hello(5,self.player.id,config.serverNo,app.addr,self.player.name,data,0,0)
        if not rrv:
            return 0, errcode.EC_CALL_RPC_ROOM_FAIL

        rrv = rpc_gongcheng.getByServerNo(5,config.serverNo)
        if not rrv:
            return 0, errcode.EC_CALL_RPC_ROOM_FAIL

        ghid=self.player.guild.GetGuildId()
        ghname = ""
        ghcolor = 0
        ghlv = 0
        guildRpc = get_rpc_guild(ghid)
        if guildRpc:
            ghname = guildRpc.getName()
            ghcolor = guildRpc.getColor()
            ghlv = guildRpc.GetLevel()
        if ghid==0:
            return 0, errcode.EC_NO_GUILD

        fdata=self.player.GetFightData()
        pdata=self.player.GetAllPetData()
        rrv3=rpc_gongcheng.gongchengFightData(self.player.id,fdata,pdata,ghid,ghname,ghcolor,ghlv,self.player.gongcheng.serverNo)
        if not rrv3:
            return 0, errcode.EC_CALL_RPC_ROOM_FAIL
        if rrv3["err"]!=0:
            return 0, rrv3["err"]

        rrv2=rpc_gongcheng.gongchengGetAllTeam(self.player.id)
        
        if not rrv2:
            return 0, errcode.EC_CALL_RPC_ROOM_FAIL
        if rrv2["err"]!=0:
            return 0, rrv2["err"]

        # a=bytearray(os.urandom(100*1024))
        # rrv["common"]["xxyy"]=a

        # retval={"list":rrv["v"],"common":rrv["common"],"team":rrv2["team"],"myteam":rrv2["myteam"]}
        retval={"list":[],"common":rrv["common"],"team":rrv2["team"],"myteam":rrv2["myteam"]}

        # 同步攻城任务数据
        self.player.gongcheng.rsyncRpcGongchengTaskData()

        return 1,retval

    def rc_gongchengExit(self):

        self.player.gongcheng.exit()

        dUpdate = {}
        dUpdate["gongcheng"] = self.player.gongcheng.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1,resp

# 创建队伍(gongchengTeamCreate)
# 	请求
# 		队伍(team, [宠物id])
# 	返回
    def rc_gongchengTeamCreate(self,team):
        # 宠物互斥
        petList = copy.deepcopy(team)
        rs = self.player.pet.checkSpecMutex(petList)
        if not rs:
            return 0, errcode.EC_PET_MUTEX_LIMIT

        from game.mgr.room import get_rpc_gongcheng
        rpc_gongcheng = get_rpc_gongcheng()
        if not rpc_gongcheng:
            return 0, errcode.EC_GETD_RPC_ROOM_FAIL
        
        rrv = rpc_gongcheng.gongchengTeamCreate(self.player.id,team)
        if not rrv:
            return 0, errcode.EC_GONGCHENG_ERR
        if rrv["err"]!=0:
            return 0, rrv["err"]
        


        return 1,{"team":rrv["team"]}


# 解除队伍(gongchengTeamDestroy)
# 	请求
# 		队伍(team, string)
# 	返回
    def rc_gongchengTeamDestroy(self,team,reborn):

        from game.mgr.room import get_rpc_gongcheng
        rpc_gongcheng = get_rpc_gongcheng()
        if not rpc_gongcheng:
            return 0, errcode.EC_GETD_RPC_ROOM_FAIL

        respBag = {}
        if reborn:
            res = Game.res_mgr.res_common.get("gongchengReborn")
            respBag = self.player.bag.costItem(res.arrayint2, constant.ITEM_COST_GONGCHENG_REBORN, wLog=True)
            if not respBag.get("rs", 0):
                return 0, errcode.EC_KFBOSS_REVIVE_NOT_ENOUGH

        rrv = rpc_gongcheng.gongchengTeamDestroy(self.player.id,team,reborn)
        if not rrv:
            return 0, errcode.EC_GONGCHENG_ERR
        if rrv["err"]!=0:
            return 0, rrv["err"]

        dUpdate = self.player.packRespBag(respBag)
        resp = {
            "team":team,
            "allUpdate": dUpdate,
        }
        return 1, resp

    def rc_gongchengSend(self,team,city,atk):


        from game.mgr.room import get_rpc_gongcheng
        rpc_gongcheng = get_rpc_gongcheng()
        if not rpc_gongcheng:
            return 0, errcode.EC_GETD_RPC_ROOM_FAIL
        
        rrv = rpc_gongcheng.gongchengSend(self.player.id,team,city,atk)
        if not rrv:
            return 0, errcode.EC_GONGCHENG_ERR
        if rrv["err"]!=0:
            return 0, rrv["err"]
        self.player.safe_pub(msg_define.MSG_GUILD_WAR_SEND)
        return 1,{}

# 创建队伍(gongchengTeamCreate)
# 	请求
# 		队伍(team, [宠物id])
# 	返回
    def rc_gongchengTeamCreateSend(self,team,city,atk):
        # 宠物互斥
        petList = copy.deepcopy(team)
        rs = self.player.pet.checkSpecMutex(petList)
        if not rs:
            return 0, errcode.EC_PET_MUTEX_LIMIT


        from game.mgr.room import get_rpc_gongcheng
        rpc_gongcheng = get_rpc_gongcheng()
        if not rpc_gongcheng:
            return 0, errcode.EC_GETD_RPC_ROOM_FAIL
        
        rrv = rpc_gongcheng.gongchengTeamCreate(self.player.id,team)
        if not rrv:
            return 0, errcode.EC_GONGCHENG_ERR
        if rrv["err"]!=0:
            return 0, rrv["err"]


        rrv1 = rpc_gongcheng.gongchengSend(self.player.id,rrv["teamid"],city,atk)
        if not rrv1:
            return 0, errcode.EC_GONGCHENG_ERR
        if rrv1["err"]!=0:
            
            rpc_gongcheng.gongchengTeamDestroy(list(self.player.id,rrv["team"].keys()),False)
            
            return 0, rrv1["err"]

        self.player.safe_pub(msg_define.MSG_GUILD_WAR_SEND)
        return 1,{"team":rrv["team"]}



    def rc_gongchengGetPlayer(self,players):


        from game.mgr.room import get_rpc_gongcheng
        rpc_gongcheng = get_rpc_gongcheng()
        if not rpc_gongcheng:
            return 0, errcode.EC_GETD_RPC_ROOM_FAIL
        
        rrv = rpc_gongcheng.gongchengGetPlayer(self.player.id,players)
        if not rrv:
            return 0, errcode.EC_GONGCHENG_ERR
        if rrv["err"]!=0:
            return 0, rrv["err"]



        return 1,{"data":rrv["data"]}


    # 弃城操作
    # 一天只能弃1次城,有是否弃城的提示面板进行询问
    def rc_gongchengGiveup(self,cityid):


        from game.mgr.room import get_rpc_gongcheng
        rpc_gongcheng = get_rpc_gongcheng()
        if not rpc_gongcheng:
            return 0, errcode.EC_GETD_RPC_ROOM_FAIL
        
        rrv = rpc_gongcheng.gongchengGiveup(self.player.id,cityid)
        if not rrv:
            return 0, errcode.EC_GONGCHENG_ERR
        if rrv["err"]!=0:
            return 0, rrv["err"]

        guildId = self.player.guild.GetGuildId()
        if not guildId:
            return 0, errcode.EC_NO_GUILD
        rpc_guild = get_rpc_guild(guildId)
        if not rpc_guild:
            return 0, errcode.EC_NOT_FOUND_GUILD

        rpc_guild.GiveupCity()

        dUpdate = {}
        dUpdate["guildInfo"] = self.player.guild.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1,resp


    def rc_gongchengLogList(self,city):


        from game.mgr.room import get_rpc_gongcheng
        rpc_gongcheng = get_rpc_gongcheng()
        if not rpc_gongcheng:
            return 0, errcode.EC_GETD_RPC_ROOM_FAIL
        
        rrv = rpc_gongcheng.gongchengLogList(self.player.id,city)
        if not rrv:
            return 0, errcode.EC_GONGCHENG_ERR
        if rrv["err"]!=0:
            return 0, rrv["err"]



        return 1,{"data":rrv["data"]}


    def rc_gongchengHistory(self):


        from game.mgr.room import get_rpc_gongcheng
        rpc_gongcheng = get_rpc_gongcheng()
        if not rpc_gongcheng:
            return 0, errcode.EC_GETD_RPC_ROOM_FAIL
        
        guildId = self.player.guild.GetGuildId()
        rrv = rpc_gongcheng.gongchengHistory(self.player.id,guildId)
        if not rrv:
            return 0, errcode.EC_GONGCHENG_ERR
        if rrv["err"]!=0:
            return 0, rrv["err"]



        return 1,{"data":rrv["data"]}

    def rc_gongchengLogData(self,fightlog):


        from game.mgr.room import get_rpc_gongcheng
        rpc_gongcheng = get_rpc_gongcheng()
        if not rpc_gongcheng:
            return 0, errcode.EC_GETD_RPC_ROOM_FAIL
        
        rrv = rpc_gongcheng.gongchengLogData(self.player.id,fightlog)
        if not rrv:
            return 0, errcode.EC_GONGCHENG_ERR
        if rrv["err"]!=0:
            return 0, rrv["err"]



        return 1,{"fightLog":rrv["fightlog"]}


# 个人排行榜(gongchengRankPerson)
# 	请求
# 		上期(pre, int) 1 上期
# 	返回
# 		榜单(data, map[string]json)
# 			名字(name, json)
# 			分数(score, int)
# 			公会名字(ghname, string) 
# 公会排行榜(gongchengRankGuild)
# 	请求
# 		上期(pre, int) 1 上期
# 	返回
# 		榜单(data, map[string]json)
# 			公会名字(name, json)
# 			分数(score, int)

    def rc_gongchengRankPerson(self,pre):


        from game.mgr.room import get_rpc_gongcheng
        rpc_gongcheng = get_rpc_gongcheng()
        if not rpc_gongcheng:
            return 0, errcode.EC_GETD_RPC_ROOM_FAIL
        
        rrv = rpc_gongcheng.gongchengRankPerson(self.player.id,pre)
        if not rrv:
            return 0, errcode.EC_GONGCHENG_ERR
        if rrv["err"]!=0:
            return 0, rrv["err"]



        return 1,{"data":rrv["data"]}

    def rc_gongchengRankGuild(self,pre):


        from game.mgr.room import get_rpc_gongcheng
        rpc_gongcheng = get_rpc_gongcheng()
        if not rpc_gongcheng:
            return 0, errcode.EC_GETD_RPC_ROOM_FAIL
        
        rrv = rpc_gongcheng.gongchengRankGuild(self.player.id,pre)
        if not rrv:
            return 0, errcode.EC_GONGCHENG_ERR
        if rrv["err"]!=0:
            return 0, rrv["err"]



        return 1,{"data":rrv["data"]}

    def rc_gongchengTag(self,city):


        from game.mgr.room import get_rpc_gongcheng
        rpc_gongcheng = get_rpc_gongcheng()
        if not rpc_gongcheng:
            return 0, errcode.EC_GETD_RPC_ROOM_FAIL
        
        rrv = rpc_gongcheng.gongchengTag(self.player.id,city)
        if not rrv:
            return 0, errcode.EC_GONGCHENG_ERR
        if rrv["err"]!=0:
            return 0, rrv["err"]



        return 1,{}

    def rc_gongchengCleanTag(self,city):


        from game.mgr.room import get_rpc_gongcheng
        rpc_gongcheng = get_rpc_gongcheng()
        if not rpc_gongcheng:
            return 0, errcode.EC_GETD_RPC_ROOM_FAIL
        
        rrv = rpc_gongcheng.gongchengCleanTag(self.player.id,city)
        if not rrv:
            return 0, errcode.EC_GONGCHENG_ERR
        if rrv["err"]!=0:
            return 0, rrv["err"]



        return 1,{}

    # 宣战操作
    # 
    def rc_gongchengWar(self,city):


        from game.mgr.room import get_rpc_gongcheng
        rpc_gongcheng = get_rpc_gongcheng()
        if not rpc_gongcheng:
            return 0, errcode.EC_GETD_RPC_ROOM_FAIL
        
        rrv = rpc_gongcheng.gongchengWar(self.player.id,city)
        if not rrv:
            return 0, errcode.EC_GONGCHENG_ERR
        if rrv["err"]!=0:
            return 0, rrv["err"]

        guildId = self.player.guild.GetGuildId()
        if not guildId:
            return 0, errcode.EC_NO_GUILD
        rpc_guild = get_rpc_guild(guildId)
        if not rpc_guild:
            return 0, errcode.EC_NOT_FOUND_GUILD

        from game.mgr.player import get_rpc_player
        nowtime=time.time()
        members = rpc_guild.getMembers()
        for one in members:
            rid = one.get("rid", 0)
            if not rid:
                continue
            
            # isRobot = one.get("isRobot", 1)
            # if isRobot:
            #     continue

            rpc_player = get_rpc_player(rid)
            if not rpc_player:
                continue
            rpc_player.gongchengNotiyGuild(city,True,nowtime)

        rpc_guild.WarCity()

        dUpdate = {}
        dUpdate["guildInfo"] = self.player.guild.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1,resp
Example #25
0
class FubenRpcMixin(object):
    if 0:
        from game.core import player as player_md
        player = player_md.Player()

    # 挑战(clfbChallenge)
    #     请求
    #         材料副本id(id, int)
    #     返回
    #         主动推送刷新(allUpdate, json)
    #             游戏模型 - 货币
    #             游戏模型 - 角色背包
    #             游戏模型 - 角色属性
    #             游戏模型 - 角色基础 - 战力
    #         战报(fightLog, json)
    #         材料副本id(id, int)
    #         当日已挑战次数(challengeNum, int)
    def rc_clfbChallenge(self, fubenId):
        res = Game.res_mgr.res_clfb.get(fubenId, None)
        if not res:
            return 0, errcode.EC_NORES

        lv = self.player.base.GetLv()
        if lv < res.openLv:
            return 0, errcode.EC_CLFB_LEVEL_TOO_LOW

        num = self.player.fuben.getClbzChanllengeNum(fubenId)
        if num >= res.freeCount:
            return 0, errcode.EC_CLFB_ALREADY_CHALLENGE
        #按等级获取副本
        barrierId = 0
        for data in res.barrierId:
            startLv = data[0]
            endLv = data[1]
            if startLv <= self.player.base.GetLv() <= endLv:
                barrierId = data[2]

        barrierRes = Game.res_mgr.res_barrier.get(barrierId)
        if not barrierRes:
            return 0, errcode.EC_NORES

        rewardRes = Game.res_mgr.res_reward.get(barrierRes.rewardId)
        if not rewardRes:
            return 0, errcode.EC_NORES

        fightobj = Game.fight_mgr.createFight(constant.FIGHT_TYPE_190)
        rs = fightobj.init_by_barrId(self.player, barrierRes.id)
        if not rs:
            return 0, errcode.EC_INIT_BARR_FAIL

        respBag = {}
        fightLog = fightobj.doFight()
        fightResult = fightLog["result"].get("win", 0)
        if fightResult:
            dReward = rewardRes.doReward()
            respBag = self.player.bag.add(dReward, constant.ITEM_ADD_CLFB_REWARD, wLog=True)

            self.player.fuben.setClbzChanllengeNum(fubenId, num+1)
            self.player.fuben.IncClfbSuccessCount()
            self.player.fuben.IncClfbFightNum(fubenId)

            iTotal = self.player.fuben.getClbzChanllengeNumTotal()
            self.player.fuben.setClbzChanllengeNumTotal(iTotal + 1)
            # 抛事件
            self.player.safe_pub(msg_define.MSG_PASS_CLFB, fubenId)

        # 抛事件
        self.player.safe_pub(msg_define.MSG_CLFB_FIGHT)
        self.player.fuben.addClbfId(fubenId)
        dRole = {}
        dRole["roleBase"] = self.player.base.to_init_data()
        dRole["roleAttr"] = self.player.attr.to_update_data()

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["role"] = dRole
        resp = {
            "fightLog": fightLog,
            "allUpdate": dUpdate,
            "fubenId": fubenId,
            "challengeNum": num+fightResult,
        }
        return 1, resp


    # 扫荡(clfbSweep)
    #     请求
    #         材料副本id(id,int)
    #     返回
    #         主动推送刷新(allUpdate,json)
    #             游戏模型-货币
    #             游戏模型-角色背包
    #             游戏模型-角色属性
    #             游戏模型-角色基础-战力
    #         材料副本id(id,int)
    #         当日已挑战次数(challengeNum, int)
    def rc_clfbSweep(self, fubenId):
        res = Game.res_mgr.res_clfb.get(fubenId, None)
        if not res:
            return 0, errcode.EC_NORES

        vipLv = self.player.vip.GetVipLv()
        vipRes = Game.res_mgr.res_vip.get(vipLv, None)
        if not vipRes:
            return 0, errcode.EC_NORES

        # maxSweepCount = res.freeCount + res.baseSweepCount + vipRes.clbzSweepCount
        maxSweepCount = res.freeCount + vipRes.clbzSweepCount

        lv = self.player.base.GetLv()
        num = self.player.fuben.getClbzChanllengeNum(fubenId)
        if num >= maxSweepCount:
            return 0, errcode.EC_CLFB_SWEEP_MAX_TIMES

        if num == 0 and lv < res.sweepLv:
            return 0, errcode.EC_CLFB_SWEEP_LEVEL_TOO_LOW

        #按等级获取副本
        barrierId = 0
        for data in res.barrierId:
            startLv = data[0]
            endLv = data[1]
            if startLv <= self.player.base.GetLv() <= endLv:
                barrierId = data[2]

        barrierRes = Game.res_mgr.res_barrier.get(barrierId)
        if not res:
            return 0, errcode.EC_NORES

        rewardRes = Game.res_mgr.res_reward.get(barrierRes.rewardId)
        if not rewardRes:
            return 0, errcode.EC_NORES

        dReward = rewardRes.doReward()
        # if num > 0:  # 非每日首次不得绑钻
        #     dReward[3] = 0

        respBag = self.player.bag.add(dReward, constant.ITEM_ADD_CLFB_REWARD, wLog=True)

        self.player.fuben.setClbzChanllengeNum(fubenId, num+1)
        self.player.fuben.IncClfbSuccessCount()
        self.player.fuben.IncClfbFightNum(fubenId)

        iTotal = self.player.fuben.getClbzChanllengeNumTotal()
        self.player.fuben.setClbzChanllengeNumTotal(iTotal + 1)
        # 抛事件
        self.player.safe_pub(msg_define.MSG_PASS_CLFB, fubenId)
        # 抛事件
        self.player.safe_pub(msg_define.MSG_CLFB_FIGHT)

        dRole = {}
        dRole["roleBase"] = self.player.base.to_init_data()
        dRole["roleAttr"] = self.player.attr.to_update_data()

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["role"] = dRole
        resp = {
            "allUpdate": dUpdate,
            "fubenId": fubenId,
            "challengeNum": num + 1,
        }
        return 1, resp

    # 一键扫荡(clfbOneKeySweep)
    #     请求
    #        扫荡材料副本id列表(fubenIdList, [int])
    #     返回
    #         主动推送刷新(allUpdate, json)
    #             游戏模型 - 货币
    #             游戏模型 - 角色背包
    #             游戏模型 - 角色属性
    #             游戏模型 - 角色基础 - 战力
    #
    #         扫荡材料副本id列表(fubenIdList, [int])
    #         当日已挑战次数列表(challengeNumList, [int])
    def rc_clfbOneKeySweep(self, fubenIdList):
        vipLv = self.player.vip.GetVipLv()
        vipRes = Game.res_mgr.res_vip.get(vipLv, None)
        if not vipRes:
            return 0, errcode.EC_NORES

        sweepIdList = []
        sweepIdNum = []
        lv = self.player.base.GetLv()

        respBag = {}
        for fubenId in fubenIdList:
            res = Game.res_mgr.res_clfb.get(fubenId, None)
            if not res:
                return 0, errcode.EC_NORES

            maxSweepCount = res.freeCount + vipRes.clbzSweepCount

            if lv < res.sweepLv:  # 等级不够
               continue

            num = self.player.fuben.getClbzChanllengeNum(res.fubenId)
            if num >= maxSweepCount:  # 已达最大次数
                continue

            sweepIdList.append(res.fubenId)
            sweepIdNum.append(num+1)
             #按等级获取副本
            barrierId = 0
            for data in res.barrierId:
                startLv = data[0]
                endLv = data[1]
                if startLv <= self.player.base.GetLv() <= endLv:
                    barrierId = data[2]

            barrierRes = Game.res_mgr.res_barrier.get(barrierId)
            if not res:
                return 0, errcode.EC_NORES

            rewardRes = Game.res_mgr.res_reward.get(barrierRes.rewardId)
            if not rewardRes:
                return 0, errcode.EC_NORES

            dReward = rewardRes.doReward()
            # if num > 0:     # 非每日首次不得绑钻
            #     dReward[3] = 0

            respBag1 = self.player.bag.add(dReward, constant.ITEM_ADD_CLFB_REWARD, wLog=True)
            respBag = self.player.mergeRespBag(respBag, respBag1)

            self.player.fuben.setClbzChanllengeNum(res.fubenId, num+1)
            self.player.fuben.IncClfbSuccessCount()
            self.player.fuben.IncClfbFightNum(res.fubenId)

            iTotal = self.player.fuben.getClbzChanllengeNumTotal()
            self.player.fuben.setClbzChanllengeNumTotal(iTotal + 1)
            # 抛事件
            self.player.safe_pub(msg_define.MSG_PASS_CLFB, res.fubenId)
            # 抛事件
            self.player.safe_pub(msg_define.MSG_CLFB_FIGHT)

        dRole = {}
        dRole["roleBase"] = self.player.base.to_init_data()
        dRole["roleAttr"] = self.player.attr.to_update_data()

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["role"] = dRole
        resp = {
            "allUpdate": dUpdate,
            "fubenIdList": sweepIdList,
            "fubenIdNum": sweepIdNum,
        }
        return 1, resp

    # 请求材料副本数据(clfbGetInfo)
    #     请求
    #     返回
    #         材料副本列表(clbz, [json])
    #               副本id(fubenId, int)
    #               副本挑战次数(challengeNum, int)
    def rc_clfbGetInfo(self):
        resp = self.player.fuben.clfbGetInfo()
        return 1, resp

    # 挑战(lwbzChallenge)
    #     请求
    #         关卡id(id,int)
    #     返回
    #         主动推送刷新(allUpdate,json)
    #             游戏模型-货币
    #             游戏模型-角色背包
    #             游戏模型-角色属性
    #             游戏模型-角色基础-战力
    #         战报(fightLog, json)
    #         关卡id(id,int)
    #         星数(star,int)
    def rc_lwbzChallenge(self, levelId):
        res = Game.res_mgr.res_lwbz.get(levelId, None)
        if not res:
            return 0, errcode.EC_NORES

        cangbaotu = self.player.fuben.getCangbaotu(res.baotuId)
        levelStatus = cangbaotu.getDailyStatus(levelId)

        barrierRes = Game.res_mgr.res_barrier.get(res.barrierId)
        if not barrierRes:
            return 0, errcode.EC_NORES

        rewardRes = Game.res_mgr.res_reward.get(barrierRes.rewardId)
        if not rewardRes:
            return 0, errcode.EC_NORES

        starRes = None
        if res.type == 1:
            starRes = Game.res_mgr.res_common.get("LwbzNoramlStarJudge", {})
        elif res.type == 2:
            starRes = Game.res_mgr.res_common.get("LwbzHardStarJudge", {})

        if not starRes:
            return 0, errcode.EC_NORES

        starJudge = starRes.arrayint2

        fightobj = Game.fight_mgr.createFight(constant.FIGHT_TYPE_191)
        rs = fightobj.init_by_barrId(self.player, barrierRes.id)
        if not rs:
            return 0, errcode.EC_INIT_BARR_FAIL

        fightLog = fightobj.doFight()
        fightResult = fightLog["result"].get("win", 0)
        useRound = fightLog.get("useRound", 0)

        respBag = {}
        if fightResult:
            oldStar = cangbaotu.getLevelStar(levelId)
            resReward = rewardRes.doReward()
            reward = copy.deepcopy(resReward)
            if not oldStar:
                for k, v in barrierRes.firstReward.items():
                    if k in reward:
                        reward[k] = reward[k]+v
                    else:
                        reward[k] = v

            if not levelStatus:
                respBag = self.player.bag.add(reward, constant.ITEM_ADD_LWBZ_REWARD, wLog=True)
                cangbaotu.markDailyStatus(levelId)

            # 计算星数
            newStar = 0
            roundList = list(starJudge.values())
            roundList.sort()

            round = 0
            for r in roundList:
                if useRound <= r:
                    round = r
                    break

            for k, v in starJudge.items():
                if v == round:
                    newStar = k
                    break

            if newStar > oldStar:
                cangbaotu.setLevelStar(levelId, newStar)
                self.player.rank.uploadRank(constant.RANK_TYPE_LWBZ)
        else:
            self.player.safe_pub(msg_define.MSG_XIANSHITUISONGLIBAO_LWBZ_F)
        # 抛事件
        self.player.safe_pub(msg_define.MSG_PASS_LWBZ)

        # import ujson
        # Game.glog.log2File("testLwbzChallenge", "%s" % ujson.dumps(fightLog))

        dRole = {}
        dRole["roleBase"] = self.player.base.to_init_data()
        dRole["roleAttr"] = self.player.attr.to_update_data()

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["role"] = dRole
        resp = {
            "fightLog": fightLog,
            "allUpdate": dUpdate,
            "levelId": levelId,
            "star": cangbaotu.getLevelStar(levelId),
        }
        return 1, resp

    # 一键挑战(lwbzOneKeyChallenge)
    #     请求
    #     返回
    #         主动推送刷新(allUpdate,json)
    #             游戏模型-货币
    #             游戏模型-角色背包
    #             游戏模型-角色属性
    #             游戏模型-角色基础-战力
    def rc_lwbzOneKeyChallenge(self):
        vipLv = self.player.vip.GetVipLv()
        vipRes = Game.res_mgr.res_vip.get(vipLv, None)
        if not vipRes:
            return 0, errcode.EC_NORES
        if not vipRes.lwbzOneKey:
            return 0, errcode.EC_LWBZ_SWEEP_VIP_LIMIT

        unChallengeLevel = self.player.fuben.getLwbzUnChallengeLevel()

        reward = {}
        for levelId in unChallengeLevel:
            res = Game.res_mgr.res_lwbz.get(levelId, None)
            if not res:
                return 0, errcode.EC_NORES

            barrierRes = Game.res_mgr.res_barrier.get(res.barrierId)
            if not barrierRes:
                return 0, errcode.EC_NORES

            rewardRes = Game.res_mgr.res_reward.get(barrierRes.rewardId)
            if not rewardRes:
                return 0, errcode.EC_NORES

            resReward = rewardRes.doReward()

            for k, v in resReward.items():
                if k in reward:
                    reward[k] = reward[k] + v
                else:
                    reward[k] = v

            # 抛事件
            self.player.safe_pub(msg_define.MSG_PASS_LWBZ)

        for levelId in unChallengeLevel:
            res = Game.res_mgr.res_lwbz.get(levelId, None)
            cangbaotu = self.player.fuben.getCangbaotu(res.baotuId)
            cangbaotu.markDailyStatus(levelId)

        respBag = self.player.bag.add(reward, constant.ITEM_ADD_LWBZ_REWARD, wLog=True)

        dRole = {}
        dRole["roleBase"] = self.player.base.to_init_data()
        dRole["roleAttr"] = self.player.attr.to_update_data()

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["role"] = dRole
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 领取星数宝箱(lwbzGetStarReward)
    #     请求
    #         星数id(startId,int)
    #             1,2,3
    #     返回
    #         主动推送刷新(allUpdate,json)
    #             游戏模型-货币
    #             游戏模型-角色背包
    #             游戏模型-角色属性
    #             游戏模型-角色基础-战力
    def rc_lwbzGetStarReward(self, starId, baotuId):
        res = Game.res_mgr.res_lwbzStarReward.get(baotuId, None)
        if not res:
            return 0, errcode.EC_NORES

        cangbaotu = self.player.fuben.getCangbaotu(baotuId)
        totalStar = cangbaotu.getTotalStar()

        if starId < 1 or starId > 4:
            return 0, errcode.EC_LWBZ_UNKNOWN_STARID

        targetStar = 0
        if starId == 1:
            targetStar = 6
        elif starId == 2:
            targetStar = 12
        elif starId == 3:
            targetStar = 18

        if totalStar < targetStar:
            return 0, errcode.EC_LWBZ_STAR_NO_ENOUGH

        status = cangbaotu.getStarRewardStatus(starId)
        if status:
            return 0, errcode.EC_LWBZ_STAR_REWARD_ALREADY_OPEN

        reward = res.reward.get(starId, None)
        if not reward:
            return 0, errcode.EC_NORES

        cangbaotu.markStarRewardStatus(starId)

        respBag = self.player.bag.add(reward, constant.ITEM_ADD_LWBZ_REWARD, wLog=True)

        self.player.fuben.IncLwbzRewardNum()
        # 抛事件
        self.player.safe_pub(msg_define.MSG_GET_LWBZ_STAR_REWARD)

        dRole = {}
        dRole["roleBase"] = self.player.base.to_init_data()
        dRole["roleAttr"] = self.player.attr.to_update_data()

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["role"] = dRole
        resp = {
            "allUpdate": dUpdate,
            "starId": starId,
            "baotuId": baotuId,
        }
        return 1, resp

    def rc_xlysBuyBuff(self,key):

        canbuy=self.player.fuben.getXlysBuffCanBuy()
        if key not in canbuy:
            return 0, errcode.EC_XLYS_BUFF_BUY

        res=Game.res_mgr.res_xlysBuff.get(key,None)
        if not res:
            return 0, errcode.EC_NORES
        
        buff=self.player.fuben.getXlysBuff()

        xlysBuffLimitRes = Game.res_mgr.res_common.get("xlysBuffLimit")
        if not xlysBuffLimitRes:
            return 0, errcode.EC_NORES

        iTotal = 0
        for val in buff.values():
            iTotal += val.get("count", 0)

        if iTotal >= xlysBuffLimitRes.i:
            return 0, errcode.EC_TIMES_FULL

        count=buff[key]["count"]

        costl=len(res.cost)
        
        if count>=costl:
            count=costl-1
        
        cost={}
        cost[res.cost[count][0]]=res.cost[count][1]

        respBag = self.player.bag.costItem(cost, constant.ITEM_COST_XLYS_BUFF, wLog=True)
        if not respBag.get("rs", 0):
            return 0, errcode.EC_COST_ERR

        self.player.fuben.addXlysBuff(key)

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["fubenInfo"]=self.player.fuben.to_init_data()
        resp = {

            "allUpdate": dUpdate,
        }
        return 1, resp

    # 挑战(xlysChallenge)
    #     请求
    #         关卡id(id,int)
    #     返回
    #         主动推送刷新(allUpdate,json)
    #             游戏模型-货币
    #             游戏模型-角色背包
    #             游戏模型-角色属性
    #             游戏模型-角色基础-战力
    #         战报(fightLog, json)
    #         关卡id(id,int)
    def rc_xlysChallenge(self, levelId):
        oldLevelId = self.player.fuben.getXlysMaxLevelId()
        if levelId != oldLevelId + 1:
            return 0, errcode.EC_XLYS_LEVEL_ERROR

        res = Game.res_mgr.res_xlys.get(levelId, None)
        if not res:
            return 0, errcode.EC_NORES

        barrierRes = Game.res_mgr.res_barrier.get(res.barrierId)
        if not barrierRes:
            return 0, errcode.EC_NORES

        rewardRes = Game.res_mgr.res_reward.get(barrierRes.rewardId)
        if not rewardRes:
            return 0, errcode.EC_NORES

        fightobj = Game.fight_mgr.createFight(constant.FIGHT_TYPE_192)
        rs = fightobj.init_by_barrId(self.player, barrierRes.id)
        if not rs:
            return 0, errcode.EC_INIT_BARR_FAIL

        buff=self.player.fuben.getXlysBuff()
        fightobj.enhanceRedTeamPer(buff)

        respBag = {}
        fightLog = fightobj.doFight()
        fightResult = fightLog["result"].get("win", 0)
        if fightResult:
            dReward = rewardRes.doReward()
            respBag = self.player.bag.add(dReward, constant.ITEM_ADD_XLYS_REWARD, wLog=True)
            self.player.fuben.setXlysMaxLevelId(levelId)

            self.player.rank.uploadRank(constant.RANK_TYPE_XLYS, {"levelId": levelId})
        else:
            self.player.safe_pub(msg_define.MSG_XIANSHITUISONGLIBAO_XLYS_F)
        # 抛事件
        self.player.safe_pub(msg_define.MSG_PASS_XLYS)

        dRole = {}
        dRole["roleBase"] = self.player.base.to_init_data()
        dRole["roleAttr"] = self.player.attr.to_update_data()

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["role"] = dRole
        resp = {
            "allUpdate": dUpdate,
            "fightLog": fightLog,
            "levelId": levelId,
        }
        return 1, resp

    # 挑战(ttslChallenge)
    #     请求
    #         关卡id(id,int)
    #     返回
    #         主动推送刷新(allUpdate,json)
    #             游戏模型-货币
    #             游戏模型-角色背包
    #             游戏模型-角色属性
    #             游戏模型-角色基础-战力
    #         战报(fightLog, json)
    #         关卡id(id,int)
    def rc_ttslChallenge(self, levelId):
        todayMaxlevelId = self.player.fuben.getTtslTodayMaxLevelId()

        if levelId != todayMaxlevelId + 1:
            return 0, errcode.EC_TTSL_LEVEL_ERROR

        res = Game.res_mgr.res_ttsl.get(levelId, None)
        if not res:
            return 0, errcode.EC_NORES


        barrierRes = Game.res_mgr.res_barrier.get(res.barrierId)
        if not barrierRes:
            return 0, errcode.EC_NORES

        rewardRes = Game.res_mgr.res_reward.get(barrierRes.rewardId)
        if not rewardRes:
            return 0, errcode.EC_NORES

        fightobj = Game.fight_mgr.createFight(constant.FIGHT_TYPE_193)
        rs = fightobj.init_by_barrId(self.player, barrierRes.id)
        if not rs:
            return 0, errcode.EC_INIT_BARR_FAIL

        respBag = {}
        fightLog = fightobj.doFight()
        fightResult = fightLog["result"].get("win", 0)
        if fightResult:
            dReward = rewardRes.doReward()
            respBag = self.player.bag.add(dReward, constant.ITEM_ADD_TTSL_REWARD, wLog=True)

            self.player.fuben.setTtslTodayMaxLevelId(levelId)
            maxLevelId = self.player.fuben.getTtslMaxLevelId()
            if levelId > maxLevelId:
                self.player.fuben.setTtslMaxLevelId(levelId)

                self.player.rank.uploadRank(constant.RANK_TYPE_TTSL, {"levelId": levelId})
        else:
            self.player.safe_pub(msg_define.MSG_XIANSHITUISONGLIBAO_TTSL_F)

        self.player.safe_pub(msg_define.MSG_PASS_TTSL)

        dRole = {}
        dRole["roleBase"] = self.player.base.to_init_data()
        dRole["roleAttr"] = self.player.attr.to_update_data()

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["role"] = dRole
        resp = {
            "allUpdate": dUpdate,
            "fightLog": fightLog,
            "levelId": levelId,
        }
        return 1, resp

    # 一键挑战(ttslOneKeyChallenge)
    #     请求
    #     返回
    #         主动推送刷新(allUpdate,json)
    #             游戏模型-货币
    #             游戏模型-角色背包
    #             游戏模型-角色属性
    #             游戏模型-角色基础-战力
    def rc_ttslOneKeyChallenge(self):
        maxLevelId = self.player.fuben.getTtslMaxLevelId()
        todayMaxlevelId = self.player.fuben.getTtslTodayMaxLevelId()

        reward = {}
        for levelId in range(todayMaxlevelId+1, maxLevelId+1):
            res = Game.res_mgr.res_ttsl.get(levelId, None)
            if not res:
                return 0, errcode.EC_NORES

            barrierRes = Game.res_mgr.res_barrier.get(res.barrierId)
            if not barrierRes:
                return 0, errcode.EC_NORES

            rewardRes = Game.res_mgr.res_reward.get(barrierRes.rewardId)
            if not rewardRes:
                return 0, errcode.EC_NORES

            resReward = rewardRes.doReward()

            for k, v in resReward.items():
                if k in reward:
                    reward[k] = reward[k] + v
                else:
                    reward[k] = v

            self.player.safe_pub(msg_define.MSG_PASS_TTSL)

        self.player.fuben.setTtslTodayMaxLevelId(maxLevelId)
        respBag = self.player.bag.add(reward, constant.ITEM_ADD_TTSL_REWARD, wLog=True)

        dRole = {}
        dRole["roleBase"] = self.player.base.to_init_data()
        dRole["roleAttr"] = self.player.attr.to_update_data()

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["role"] = dRole
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    # 领取关卡宝箱(ttslGetLevelReward)
    #     请求
    #         关卡id(levelId,int)
    #     返回
    #         主动推送刷新(allUpdate,json)
    #             游戏模型-货币
    #             游戏模型-角色背包
    #             游戏模型-角色属性
    #             游戏模型-角色基础-战力
    def rc_ttslGetLevelReward(self, levelId):
        maxLevelId = self.player.fuben.getTtslMaxLevelId()
        if levelId > maxLevelId:
            return 0, errcode.EC_TTSL_LEVEL_ERROR

        res = Game.res_mgr.res_ttsl.get(levelId, None)
        if not res:
            return 0, errcode.EC_NORES

        if not res.firstReward:
            return 0, errcode.EC_TTSL_LEVEL_ERROR

        status = self.player.fuben.getTtslRewardStatus(levelId)
        if status:
            return 0, errcode.EC_TTSL_LEVEL_REWARD_ALREADY_OPEN

        self.player.fuben.markTtslRewardStatus(levelId)

        respBag = self.player.bag.add(res.firstReward, constant.ITEM_ADD_TTSL_REWARD, wLog=True)

        dRole = {}
        dRole["roleBase"] = self.player.base.to_init_data()
        dRole["roleAttr"] = self.player.attr.to_update_data()

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["role"] = dRole
        resp = {
            "allUpdate": dUpdate,
            "levelId": levelId,
        }
        return 1, resp
Example #26
0
class NiudanMixin(object):
    if 0:
        from game.core import player as player_md
        player = player_md.Player()

    def rc_niudanRoll(self, resid, ten, useFree=False):
        print("===rc_niudanRoll===", resid, ten, useFree)
        res = Game.res_mgr.res_niudanSystem.get(resid)
        if not res:
            print("111111111111111", resid)
            return 0, errcode.EC_NORES

        resxx = getattr(Game.res_mgr, "res_niudan" + res.mod)
        if not resxx:
            print("111111111111111", res.mod)
            return 0, errcode.EC_NORES

        serverInfo = self.player.base.GetServerInfo()

        #普通池
        resAct1 = Game.res_mgr.res_activity.get(res.ptActID)
        if not resAct1:
            print("3333333333333", res.ptActID)
            return 0, errcode.EC_NORES
        if not resAct1.isOpen(serverInfo):
            return 0, errcode.EC_NOT_OPEN
        funcID1 = resAct1.getCycleFuncID(serverInfo)
        if not funcID1:
            return 0, errcode.EC_NOT_OPEN

        #精英池
        resAct2 = Game.res_mgr.res_activity.get(res.jyActID)
        if not resAct2:
            print("4444444444444", res.jyActID)
            return 0, errcode.EC_NORES
        if not resAct2.isOpen(serverInfo):
            return 0, errcode.EC_NOT_OPEN
        funcID2 = resAct2.getCycleFuncID(serverInfo)
        if not funcID2:
            return 0, errcode.EC_NOT_OPEN

        #系统活动
        resActX = Game.res_mgr.res_activity.get(res.sysActID)
        if not resActX.isOpen(serverInfo):
            return 0, errcode.EC_NOT_OPEN
        funcIDX = resActX.getCycleFuncID(serverInfo)
        if not funcIDX:
            return 0, errcode.EC_NOT_OPEN

        modres = {}

        #系统活动res
        modres = resxx.get(funcIDX)
        if not modres:
            print("55555555555", funcIDX)
            return 0, errcode.EC_NORES

        times = 1
        cost = {}
        reward = {}
        rn = {}
        onenum = 0
        if ten:
            if not res.costTen or not res.Ten:
                print("666666666666")
                return 0, errcode.EC_NORES

            times = res.Ten
            cost = res.costTen
        else:
            cost = res.cost
            times = 1

            rn = self.player.niudan.getRollOneNum()
            onenum = rn.get(resid, 0)

            if useFree:
                if onenum < res.costFree:
                    cost = {}
                else:
                    return 0, errcode.EC_FREE_EXHAUSTED

        rxAll = self.player.niudan.getRollNum()
        rxAllNum = rxAll.get(resid, 0)

        for k, v in res.reward.items():
            reward[k] = v * times

        modactnum = self.player.niudan.getCycleBaodi(res.sysActID)
        modactreward = self.player.niudan.getCycleReward(res.sysActID)

        for timesn in range(times):

            pool = []

            # if ten and not timesn and res.abpool:
            #     for v in Game.res_mgr.res_niudanPool.values():
            #         if not v.scope[1]:
            #             v.scope[1]=constant.MAX_SAFE_INTEGER

            #         if v.cycleFuncID==funcID and v.scope[0]<=rxAllNum<=v.scope[1]:
            #             value = (v.rewardten, v.WeightTen)
            #             pool.append(value)
            # else:
            for v in Game.res_mgr.res_niudanPool.values():
                if not v.scope[1]:
                    v.scope[1] = constant.MAX_SAFE_INTEGER

                if (v.cycleFuncID == funcID1 or v.cycleFuncID
                        == funcID2) and v.scope[0] <= rxAllNum <= v.scope[1]:
                    value = (v.reward, v.Weight)
                    pool.append(value)

            randomReward = utility.Choice(pool)
            print("===============", randomReward)

            modactnum += 1
            modactreward += 1
            if modres.baodiNum:
                if modactnum >= modres.baodiNum[res.modidx]:
                    modactnum = 0
                    randomReward = {}
                    randomReward[modres.reward[res.modidx][0]] = modres.reward[
                        res.modidx][1]
                    print("==!!!!!=====", randomReward)

            for k, v in randomReward.items():
                reward[k] = reward.get(k, 0) + v

            rxAllNum += 1

        rxAll[resid] = rxAllNum

        respBag1 = self.player.bag.costItem(cost,
                                            constant.ITEM_COST_NIUDAN_ROLL,
                                            wLog=True)
        if not respBag1.get("rs", 0):
            if ten:
                if res.costTenRep:
                    respBag1 = self.player.bag.costItem(
                        res.costTenRep,
                        constant.ITEM_COST_NIUDAN_ROLL,
                        wLog=True)
                    if not respBag1.get("rs", 0):
                        return 0, errcode.EC_COST_ERR
                else:
                    return 0, errcode.EC_COST_ERR

            else:
                if res.costRep:
                    respBag1 = self.player.bag.costItem(
                        res.costRep, constant.ITEM_COST_NIUDAN_ROLL, wLog=True)
                    if not respBag1.get("rs", 0):
                        return 0, errcode.EC_COST_ERR
                else:
                    return 0, errcode.EC_COST_ERR

        respBag = self.player.bag.add(reward,
                                      constant.ITEM_ADD_NIUDAN_ROLL,
                                      wLog=True,
                                      mail=True)

        respBag = self.player.mergeRespBag(respBag, respBag1)

        print("===rc_niudanRoll===reward=", reward)

        if not ten:
            onenum += 1
            for xresid in res.RollOneResID:
                rn[xresid] = onenum
            self.player.niudan.setRollOneNum(rn)

        self.player.niudan.setRollNum(rxAll)

        self.player.niudan.setCycleBaodi(modactnum, res.sysActID)
        self.player.niudan.setCycleReward(modactreward, res.sysActID)

        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)

        dUpdate["niudan"] = self.player.niudan.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp

    def rc_niudanXianshiReward(self, idx):

        totAct = constant.ACTIVITY_XIANSHINIUDAN
        serverInfo = self.player.base.GetServerInfo()

        resActX = Game.res_mgr.res_activity.get(totAct)
        if not resActX.isOpen(serverInfo):
            return 0, errcode.EC_NOT_OPEN
        funcIDX = resActX.getCycleFuncID(serverInfo)
        if not funcIDX:
            return 0, errcode.EC_NOT_OPEN

        modres = Game.res_mgr.res_niudanXianshi.get(funcIDX)
        if not modres:
            return 0, errcode.EC_NORES

        if not modres.needs:
            return 0, errcode.EC_NOT_OPEN

        if len(modres.needs) < idx + 1:
            return 0, errcode.EC_NORES

        x = self.player.niudan.getCycleReward(totAct)
        print("=====", x, modres.needs, idx)
        if x < modres.needs[idx]:
            return 0, errcode.EC_NOT_ENOUGH

        reward = {}
        reward[modres.rewardNeeds[idx][0]] = modres.rewardNeeds[idx][1]

        cn = self.player.niudan.getCycleNeeds(totAct)
        if idx in cn:
            return 0, errcode.EC_ALREADY_REWARD

        cn.append(idx)
        if len(cn) == len(modres.needs):
            cn = []
            x -= modres.needs[len(modres.needs) - 1]
            if x < 0:
                x = 0
        self.player.niudan.setCycleNeeds(cn, totAct)
        self.player.niudan.setCycleReward(x, totAct)

        respBag = self.player.bag.add(reward,
                                      constant.ITEM_ADD_NIUDAN_XIANSHI_REWARD,
                                      wLog=True,
                                      mail=True)

        # 打包返回信息
        dUpdate = self.player.packRespBag(respBag)

        dUpdate["niudan"] = self.player.niudan.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp
Example #27
0
class YabiaoRpcMixin(object):
    if 0:
        from game.core import player as player_md
        player = player_md.Player()


    def rc_husong(self):

        yabiaoHusongNum = Game.res_mgr.res_common.get("yabiaoHusongNum")
        if not yabiaoHusongNum:
            return 0, errcode.EC_NORES
        
        yabiaoDoubleTime = Game.res_mgr.res_common.get("yabiaoDoubleTime")
        if not yabiaoDoubleTime:
            return 0, errcode.EC_NORES

        if self.player.yabiao.time!=0:
            return 0, errcode.EC_HUSONG_TIME_NO_ZERO
    
        if self.player.yabiao.getYabiaoHusong()>=yabiaoHusongNum.i:
            return 0, errcode.EC_HUSONG_NUM_USEUP



        mul=1
        currHour = gtime.current_hour()
        if currHour in yabiaoDoubleTime.arrayint1:
            mul=2

        self.player.yabiao.husong(mul)


        bhname = ""
        from game.mgr.guild import get_rpc_guild
        rpc_guild = get_rpc_guild(self.player.guild.GetGuildId())
        if rpc_guild:
            bhname = rpc_guild.getName()

        days = self.player.base.GetServerOpenDay()
        ares = Game.res_mgr.res_activity.get(constant.ACTIVITY_YABIAO)
        startD = ares.openDayRange[0]
        from game.mgr.room import get_rpc_room
        rpc_room = get_rpc_room(startD<=days)
        if not rpc_room:
            return 0, errcode.EC_GETD_RPC_ROOM_FAIL


        data={
            "power":self.player.base.fa,
            "quality":self.player.yabiao.quality,
            "bhname":bhname,
            "sex":self.player.base.GetSex(),
            "portrait":self.player.myhead.getPortrait(),
            "headframe":self.player.myhead.getHeadframe(),
            "becatchID":self.player.yabiao.getBecatchID(),
        }

        import app
        rrv = rpc_room.hello(1,self.player.id,config.serverNo,app.addr,self.player.name,data,self.player.yabiao.time,0)
        if not rrv:
            return 0, errcode.EC_CALL_RPC_ROOM_FAIL
        
        rrv = rpc_room.get(1,self.player.id)
        if not rrv:
            return 0, errcode.EC_CALL_RPC_ROOM_FAIL
        
        resp = {}
        resp["list"] = rrv["v"]
        dUpdate={}
        dUpdate["jiebiao"] = self.player.yabiao.to_init_data()
        resp["allUpdate"] = dUpdate


        return 1, resp


    def rc_getHusongData(self):


        
        days = self.player.base.GetServerOpenDay()
        ares = Game.res_mgr.res_activity.get(constant.ACTIVITY_YABIAO)
        startD = ares.openDayRange[0]
        from game.mgr.room import get_rpc_room
        rpc_room = get_rpc_room(startD<=days)
        if not rpc_room:
            return 0, errcode.EC_GETD_RPC_ROOM_FAIL
        
        rrv = rpc_room.getByServerNo(1,config.serverNo)
        if not rrv:
            return 0, errcode.EC_CALL_RPC_ROOM_FAIL

        resp = {}
        resp["list"] = rrv["v"]

        return 1, resp

    def rc_getHusongUserData(self,id):
        days = self.player.base.GetServerOpenDay()
        ares = Game.res_mgr.res_activity.get(constant.ACTIVITY_YABIAO)
        startD = ares.openDayRange[0]
        from game.mgr.room import get_rpc_room
        rpc_room = get_rpc_room(startD<=days)
        if not rpc_room:
            return 0, errcode.EC_GETD_RPC_ROOM_FAIL

        rrv = rpc_room.getOneByServerNo(1,config.serverNo,id)
        if not rrv:
            return 0, errcode.EC_CALL_RPC_ROOM_FAIL
        

        # print("1111111111",config.serverNo,id,rrv)

        data = rrv["v"]



        if len(data)==0:
            return 0, errcode.EC_HUSONG_NOFOUNDONE
        
        
        
        resp = {}
        resp["data"] = data[0]

        return 1, resp
    
    def rc_fastComplete(self):
        
        yabiaoFinish = Game.res_mgr.res_common.get("yabiaoFinish")
        if not yabiaoFinish:
            return 0, errcode.EC_NORES

        t = time.time()
        
        if self.player.yabiao.time<t:
            return 0, errcode.EC_FASTCOMPLETE_TIME_BAD

        days = self.player.base.GetServerOpenDay()
        ares = Game.res_mgr.res_activity.get(constant.ACTIVITY_YABIAO)
        startD = ares.openDayRange[0]
        from game.mgr.room import get_rpc_room
        rpc_room = get_rpc_room(startD<=days)
        if not rpc_room:
            return 0, errcode.EC_GETD_RPC_ROOM_FAIL

        respBag = self.player.bag.costItem(yabiaoFinish.arrayint2, constant.ITEM_COST_FASTCOMPLETE, wLog=True)
        if not respBag.get("rs", 0):
            return 0, errcode.EC_COST_ERR

        rrv=rpc_room.bye(1,self.player.id)
        if not rrv:
            return 0, errcode.EC_CALL_RPC_ROOM_FAIL

        self.player.yabiao.setTimeFinish()

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["jiebiao"] = self.player.yabiao.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp
        
    def rc_getHusongRewardUI(self):
        resp={}
        dUpdate = {}

        dUpdate["jiebiao"] = self.player.yabiao.to_init_data()
    
        resp["allUpdate"] = dUpdate
        return 1,resp

    def rc_getHusongReward(self):

        yabiaoJiebiaoLimit = Game.res_mgr.res_common.get("yabiaoJiebiaoLimit")
        if not yabiaoJiebiaoLimit:
            return 0, errcode.EC_NORES
        # yabiaoDoubleTime = Game.res_mgr.res_common.get("yabiaoDoubleTime")
        # if not yabiaoDoubleTime:
        #     return 0, errcode.EC_NORES

        res = Game.res_mgr.res_yabiao.get(self.player.yabiao.quality)
        if not res:
            return 0, errcode.EC_NORES
        
        if self.player.yabiao.time==0:
            return 0, errcode.EC_HUSONGREWARD_NOSTART
        
        t = time.time()
        if self.player.yabiao.time>t:
            return 0, errcode.EC_HUSONGREWARD_TIMENOABLE

        # mul=1
        # currHour = gtime.current_hour()
        # if currHour in yabiaoDoubleTime.arrayint1:
        #     mul=2

        mul = self.player.yabiao.mul
        
        reward = {}
        for kk, vv in res.reward.items():
            reward[kk]=vv*mul
        
        bid = self.player.yabiao.getBecatchID()
        bidlen=len(bid)
        if bidlen>yabiaoJiebiaoLimit.i:
            bidlen=yabiaoJiebiaoLimit.i

        
        if 5!=self.player.yabiao.quality:
            for _ in range(bidlen):
                for kk, vv in res.rob.items():
                    reward[kk]-=vv
        

        self.player.yabiao.finishYabiao()

        # # 意外绑元奖励
        # DaySurpriseRewardNumRes = Game.res_mgr.res_common.get("DaySurpriseRewardNum")  # 每日意外绑元获得
        # iDayRewardNum = self.player.cycleDay.Query("DaySurpriseRewardNum", 0)
        # if iDayRewardNum < DaySurpriseRewardNumRes.i:
        #     DaySurpriseRes = Game.res_mgr.res_daySurprise.get(constant.DAY_SURPRISE_REWARD_3)
        #     if DaySurpriseRes and random.randint(1, 10000) <= DaySurpriseRes.odds:
        #         for iNo, iNum in DaySurpriseRes.reward.items():
        #             if reward.get(iNo):
        #                 reward[iNo] += iNum
        #             else:
        #                 reward[iNo] = iNum
        #         # 发送世界聊天
        #         for addr, logic in Game.rpc_logic_game:
        #             if logic:
        #                 logic.sendSystemTemplateMSG(DaySurpriseRes.chatId, [self.player.name])

        respBag = self.player.bag.add(reward, constant.ITEM_ADD_HUSONGREWARD, wLog=True)

        resp={}
        dUpdate = self.player.packRespBag(respBag)
        dUpdate["jiebiao"] = self.player.yabiao.to_init_data()
        resp["allUpdate"] = dUpdate
        return 1,resp

    def rc_robHusongCar(self,id):
        yabiaoJiebiaoLimit = Game.res_mgr.res_common.get("yabiaoJiebiaoLimit")
        if not yabiaoJiebiaoLimit:
            return 0, errcode.EC_NORES

        yabiaoJiebiaoNum = Game.res_mgr.res_common.get("yabiaoJiebiaoNum")
        if not yabiaoJiebiaoNum:
            return 0, errcode.EC_NORES

        yabiaoDoubleTime = Game.res_mgr.res_common.get("yabiaoDoubleTime")
        if not yabiaoDoubleTime:
            return 0, errcode.EC_NORES

        if self.player.yabiao.getYabiaoRob()>=yabiaoJiebiaoNum.i:
            return 0, errcode.EC_ROBHUSONG_USEUP

        days = self.player.base.GetServerOpenDay()
        ares = Game.res_mgr.res_activity.get(constant.ACTIVITY_YABIAO)
        startD = ares.openDayRange[0]
        from game.mgr.room import get_rpc_room
        rpc_room = get_rpc_room(startD<=days)
        if not rpc_room:
            return 0, errcode.EC_GETD_RPC_ROOM_FAIL

        rrv = rpc_room.getOneByServerNo(1,config.serverNo,id)
        if not rrv:
            return 0, errcode.EC_CALL_RPC_ROOM_FAIL
        
        data = rrv["v"]

        if len(data)==0:
            return 0, errcode.EC_HUSONG_NOFOUNDONE
        
        res = Game.res_mgr.res_yabiao.get(data[0]["data"]["quality"])
        if not res:
            return 0, errcode.EC_NORES
        
        if yabiaoJiebiaoLimit.i<=len(data[0]["data"]["becatchID"]):
            return 0, errcode.EC_ROBHUSONG_LIMIT

        if self.player.id in data[0]["data"]["becatchID"]:
            return 0, errcode.EC_ROBHUSONG_ALREADY

        from game.mgr.logicgame import LogicGame
        proxy = get_proxy_by_addr(data[0]["addr"], LogicGame._rpc_name_)
        if not proxy:
            return 0, errcode.EC_GETD_LOGIC_PROXY_ERR

        fdata = self.player.GetFightData()

        bhname = ""
        from game.mgr.guild import get_rpc_guild
        rpc_guild = get_rpc_guild(self.player.guild.GetGuildId())
        if rpc_guild:
            bhname = rpc_guild.getName()

        import app
        historydata={"addr":app.addr,"id":self.player.id,"endtime":0,"name":self.player.name,"data":{"quality":0,"power":self.player.base.fa,"bhname":bhname,"sex":self.player.base.GetSex()}}

        resp  = proxy.robHusongCar(self.player.id,data[0],fdata,historydata)
        if not resp:
            return 0, errcode.EC_CALL_LOGIC_PROXY_ERR

        self.player.yabiao.addYabiaoRob()

        respBag = {}
        fightResult = resp["fightLog"]["result"].get("win", 0)
        if fightResult:
            self.player.yabiao.addHistory(3,data[0])

            mul=1
            currHour = gtime.current_hour()
            if currHour in yabiaoDoubleTime.arrayint1:
                mul=2
            
            reward = {}
            for kk, vv in res.rob.items():
                reward[kk]=vv*mul

            respBag = self.player.bag.add(reward, constant.ITEM_ADD_ROBREWARD, wLog=True)
        else:
            self.player.yabiao.addHistory(2,data[0])

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["jiebiao"] = self.player.yabiao.to_init_data()

        resp["allUpdate"] = dUpdate
        return 1, resp
            
    def rc_flashHusongCar(self,type):
        yabiaoFlash = Game.res_mgr.res_common.get("yabiaoFlash")
        if not yabiaoFlash:
            return 0, errcode.EC_NORES
        yabiaoFlashMax = Game.res_mgr.res_common.get("yabiaoFlashMax")
        if not yabiaoFlashMax:
            return 0, errcode.EC_NORES
        yabiaoFlashMaxPriority = Game.res_mgr.res_common.get("yabiaoFlashMaxPriority")
        if not yabiaoFlashMaxPriority:
            return 0, errcode.EC_NORES
        
        if self.player.yabiao.time!=0:
            return 0, errcode.EC_FLASHCAR_TIMENOABLE

        cost=yabiaoFlash.arrayint2
        if type:
            cost = yabiaoFlashMax.arrayint2

        if type:
            respBag = self.player.bag.costItem(yabiaoFlashMaxPriority.arrayint2, constant.ITEM_COST_FALSHCAR, wLog=True)
            if not respBag.get("rs", 0):
                respBag1 = self.player.bag.costItem(cost, constant.ITEM_COST_FALSHCAR, wLog=True)
                if not respBag1.get("rs", 0):
                    return 0, errcode.EC_COST_ERR
                else:
                    respBag = self.player.mergeRespBag(respBag, respBag1)
        else:
            respBag = self.player.bag.costItem(cost, constant.ITEM_COST_FALSHCAR, wLog=True)
            if not respBag.get("rs", 0):
                return 0, errcode.EC_COST_ERR

        if type:
            self.player.yabiao.flashCarMax()
        else:
            self.player.yabiao.flashCar()

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["jiebiao"] = self.player.yabiao.to_init_data()
        resp = {
            "allUpdate": dUpdate,
        }
        return 1, resp
    
    def rc_getHusongHistroy(self):
        resp={}
        resp["list"]=self.player.yabiao.getHistory()
        return 1, resp

    def rc_revengeHusongCar(self,id):
        
        yabiaoDoubleTime = Game.res_mgr.res_common.get("yabiaoDoubleTime")
        if not yabiaoDoubleTime:
            return 0, errcode.EC_NORES
    

        if str(id) not in self.player.yabiao.history:
            return 0, errcode.EC_REVENGEHUSONG_NOIN

        if self.player.yabiao.history[str(id)]["type"]!=0:
            return 0, errcode.EC_REVENGEHUSONG_NOTYPE

        res = Game.res_mgr.res_yabiao.get(self.player.yabiao.history[str(id)]["data"]["data"]["quality"])
        if not res:
            return 0, errcode.EC_NORES
          
        
        from game.mgr.logicgame import LogicGame
        proxy = get_proxy_by_addr(self.player.yabiao.history[str(id)]["data"]["addr"], LogicGame._rpc_name_)
        if not proxy:
            return 0, errcode.EC_GETD_LOGIC_PROXY_ERR
  
        fdata = self.player.GetFightData()

        bhname = ""
        from game.mgr.guild import get_rpc_guild
        rpc_guild = get_rpc_guild(self.player.guild.GetGuildId())
        if rpc_guild:
            bhname = rpc_guild.getName()

        historydata={"id":self.player.id,"endtime":0,"name":self.player.name,"data":{"quality":self.player.yabiao.history[str(id)]["data"]["data"]["quality"],"power":self.player.base.fa,"bhname":bhname,"sex":self.player.base.GetSex()}}

        resp  = proxy.revengeHusongCar(self.player.id,{"id":self.player.yabiao.history[str(id)]["data"]["id"]},fdata,historydata)
        if not resp:
            return 0, errcode.EC_CALL_LOGIC_PROXY_ERR

        self.player.yabiao.modfiyHistoryFinish(id)

        respBag = {}
        fightResult = resp["fightLog"]["result"].get("win", 0)
        if fightResult:
            mul=1
            currHour = gtime.current_hour()
            if currHour in yabiaoDoubleTime.arrayint1:
                mul=2
            
            reward = {}
            for kk, vv in res.rob.items():
                reward[kk]=vv*mul

            respBag = self.player.bag.add(reward, constant.ITEM_ADD_REVREWARD, wLog=True)

        dUpdate = self.player.packRespBag(respBag)
        dUpdate["jiebiao"] = self.player.yabiao.to_init_data()

        resp["allUpdate"] = dUpdate
        return 1, resp