Пример #1
0
        def cb(ret):
            for marryRow in ret.result:
                marryId = long(marryRow[0])
                marryTotalInfo = MarryTotalInfo(marryId)
                marryTotalInfo.assginFromDB(marryRow)
                #定时举行婚礼
                if marryTotalInfo.flagWeding == MsgDef.WeddingFlagCmd.WEDDING_APPLYED:
                    leftSec = ffext.getTime() - marryTotalInfo.tmWedding

                    if leftSec <= 0 or marryTotalInfo.tmWedding == 0:
                        leftSec = 30
                    #ffext.dump('timer wedding', leftSec, marryTotalInfo)
                    def cb():
                        handleTimerWedding(marryId)
                    ffext.timer(leftSec*1000, cb)
                #如果和谐离婚,定时离婚
                if marryTotalInfo.tmEndWedding != 0 and marryTotalInfo.getInfoByGender(Base.Gender.MALE).status == MsgDef.MarryStatusCmd.MARRY_STATUS_DIVORCING and \
                    marryTotalInfo.getInfoByGender(Base.Gender.FEMAIL).status == MsgDef.MarryStatusCmd.MARRY_STATUS_DIVORCING:
                    leftSec = marryTotalInfo.tmEndWedding - ffext.getTime()
                    if leftSec <= 0:
                        leftSec = 10
                    def cbDiv():
                        handleTimerDivorce(marryId)
                    #ffext.timer(leftSec*1000, cbDiv)
                    #ffext.dump('marry divorcing left sec', leftSec, marryId)
                #如果婚礼未举行
                self.allMarryInfo[marryTotalInfo.marryId] = marryTotalInfo
                #ffext.dump('load marryTotalInfo', marryTotalInfo)
            #ffext.dump('load self.allMarryInfo', len(self.allMarryInfo))
            return
Пример #2
0
    def exe(self, owner, skill, objDest, param):
        #TODO
        from model import PlayerModel
        newX = owner.x + 2
        newY = owner.y + 2
        if not owner.mapObj.canMove(newX, newY):
            newX = owner.x
            newY = owner.y
        player = PlayerModel.Player()
        player.forkFrom(owner, self.paramPropRate)
        player.arenaCtrl.destPlayerRef = weakref.ref(objDest)
        player.session = owner.session
        owner.mapObj.playerEnterMap(player, newX, newY)
        from model import ArenaModel
        player.fsm.changeState(ffext.singleton(ArenaModel.ArenaStateAttack))
        beginTm = ffext.getTime()

        def cb():
            if ffext.getTime() - beginTm >= 20 or player.isDeath():
                player.mapObj.playerLeaveMap(player)
                player.session = None
            else:
                try:
                    player.fsm.update(player, ffext.getTimeMs())
                except:
                    pass
                ffext.timer(1000, cb)

        ffext.timer(1000, cb)
        return
Пример #3
0
 def initTimer(self):
     nowSec = ffext.getTime()
     secondUtilMiddleNight = SECONDS_PER_DAY - (nowSec % SECONDS_PER_DAY)
     nowTm = ffext.datetime_now()
     weekDay = nowTm.weekday()
     if weekDay == 0:
         weekDay = 7
     nowCompVal = weekDay * 10000 + nowTm.hour * 100 + nowTm.minute
     for wd, tmInfo in CITYWAR_START_TM_LIST.iteritems():
         tmCompVal_1 = wd * 10000 + tmInfo[0]
         tmCompVal_2 = wd * 10000 + tmInfo[1]
         if nowCompVal >= tmCompVal_1:
             # 目前配置时间点已经过了,算到本周日结束的时间
             secondUtilWeekEnd = secondUtilMiddleNight + (
                 7 - weekDay) * SECONDS_PER_DAY
             tm2 = secondUtilWeekEnd + (wd - 1) * SECONDS_PER_DAY + (
                 tmInfo[0] / 100) * 3600 + (tmInfo[0] % 100) * 60
             ffext.timer(tm2 * 1000, onCityWarStart)
         else:
             # 目前配置时间还没来,还可以再打一场
             tm1 = nowSec % SECONDS_PER_DAY
             tm2 = (tmInfo[0] / 100) * 3600 + (tmInfo[0] % 100) * 60
             ffext.timer((tm2 - tm1) * 1000, onCityWarStart)
             pass
     return True
Пример #4
0
    def exe(self, owner, skill, objDest, param):
        PuGong.exe(self, owner, skill, objDest, param)

        def onTimer():
            PuGong.exe(self, owner, skill, objDest, param)

        ffext.timer(5 * 100, onTimer)
        return
Пример #5
0
    def update(self, monster, nowMs):
        if monster.hp <= 0:
            monster.lastAttackObjRef = None
            if nowMs < monster.nextMoveTm + 10*1000:
                return True
            else:
                if nowMs -  monster.tmpInfo.get('_killedtm_', 0) <= 2000:#2秒内不要消失
                    return True
                #先从地图上消失.,再出现
                mapObj = monster.mapObj
                oldMon = mapObj.monsterLeaveMap(monster)
                #ffext.dump('monster leave map start reborn', monster.name)
                def reborn():
                    oldMon.hp = oldMon.hpMax
                    oldMon.x = oldMon.bornX
                    oldMon.y = oldMon.bornY
                    mapObj.monsterEnterMap(oldMon, oldMon.x, oldMon.y)
                if mapObj.copyMapHandler == None and oldMon.rebornSec > 0:
                    ffext.timer(1000*oldMon.rebornSec, reborn)
                #ffext.dump('monster reborn', monster.name)
                return True
        if nowMs < monster.nextMoveTm:
            if monster.lastAttackObjRef != None:
                targetObj = monster.lastAttackObjRef()
                if targetObj != None:#直接进入攻击模式
                    ffext.dump(monster.name, 'find target', targetObj.name)
                    monster.fsm.changeState(ffext.singleton(StateAttack))
            return True
        #回血
        if monster.hp < monster.hpMax:
            nowTm = ffext.getTime()
            nAddHP = int((nowTm - monster.lastRecoverHPTM) * monster.hpMax / 100)
            if nAddHP > 0:
                monster.addHPMsg(nAddHP)
        # 如果仇恨列表中有敌人在线,那么切换到战斗状态
        if monster.aiFlag == 0:#被动攻击
            if monster.lastAttackObjRef != None:
                targetObj = monster.lastAttackObjRef()
                if targetObj != None:#直接进入攻击模式
                    ffext.dump(monster.name, 'find target', targetObj.name)
                    monster.fsm.changeState(ffext.singleton(StateAttack))
            return True
        enemyObj =  monster.selectEnemy()
        if enemyObj:
            monster.fsm.changeState(ffext.singleton(StateAttack))
            return True
        #先朝一个方向走,走到头,再随机选一个方向
        curDir = monster.direction
        if Base.distance(monster.x, monster.y, monster.bornX, monster.bornY) >= monster.calMaxReachEnemyDistance():
            curDir = int((curDir + 4 ) % 8)
        desrDir= Base.MOVE_HELP_DIRECTION[curDir]
        curDir = desrDir[random.randint(0, len(desrDir) - 1)]
        monster.direction = curDir
        x, y   = Base.getPosByDirection(monster.x, monster.y, curDir)

        monster.nextMoveTm = nowMs + random.randint(5000, 10000)
        monster.mapObj.moveMonster(monster, x, y)
        return True
Пример #6
0
 def cb():
     if ffext.getTime() - beginTm >= 20 or player.isDeath():
         player.mapObj.playerLeaveMap(player)
         player.session = None
     else:
         try:
             player.fsm.update(player, ffext.getTimeMs())
         except:
             pass
         ffext.timer(1000, cb)
Пример #7
0
        def cb():
            leftTimes = objDest.tmpInfo.get('_leftSH_', 0)
            if leftTimes <= 0 or objDest.isDeath():
                return
            hurtResult = calRealMagicHurt(owner, objDest, skill, selfvar, True,
                                          True, IGNORE_MAGIC_DEFEND)
            objDest.subHurtResult(owner, hurtResult)

            leftTimes = leftTimes - 1
            objDest.tmpInfo['_leftSH_'] = leftTimes
            ffext.timer(cbinterval * 1000, cbvar)
            return
Пример #8
0
        def cb():
            leftTimes = objDest.tmpInfo.get('_leftZYS_', 0)
            leftTimes = leftTimes - 1
            objDest.tmpInfo['_leftZYS_'] = leftTimes
            if leftTimes <= 0:
                return
            objDest.addHPMsg(self.paramHurt)
            ffext.timer(3 * 1000, cbvar)

            buff = objDest.buffCtrl.getBuff(MsgDef.BuffType.ZHIYUSHU)
            if not buff:
                objDest.buffCtrl.addBuff(MsgDef.BuffType.ZHIYUSHU, 3, 0, 320)
                objDest.updateBuffMsg()
            return
Пример #9
0
    def closeCopyMap(self, mapname, kickpoutMap=None, x=None, y=None):
        def doOps():
            mapObj = self.allMap.pop(mapname, None)
            if None == mapObj:
                return None
            self.allCopyMap.pop(mapname, None)
            #如果地图上有人,那么踢人
            self.kickoutTo(mapObj, kickpoutMap, x, y)
            #如果有怪,那么把怪给释放掉, 这个时候已经没有人了,不用广播消息了,直接把怪物释放掉即可
            mapObj.cleanup()
            ffext.dump('closeCopyMap', mapname)

        ffext.timer(1, doOps)  #立即释放掉
        return True
Пример #10
0
 def cb():
     player1 = ref1()
     player2 = ref2()
     if player1 and player1.mapObj != None:
         if not player2 or player2.mapObj == None:#player1 win
             winQieCuo(player1)
             return
         if player2.ctrlQieCuo.startMap != player2.mapname:
             winQieCuo(player1)
             return
         dist = Base.distance(player2.x, player2.y, player2.ctrlQieCuo.startX, player2.ctrlQieCuo.startY)
         if dist >  Base.QIECUO_MAX_RANGE:
             if player2.ctrlQieCuo.warnTimes == 0:
                 player2.sendMsg(MsgDef.ServerCmd.ERROR_MSG, buildErrMsg(MsgDef.ClientCmd.QIECUO_OPS, '警告!切磋出界3秒后将会被判输!'))
             player2.ctrlQieCuo.warnTimes += 1
             if player2.ctrlQieCuo.warnTimes == 4:
                 winQieCuo(player1)
                 return
         else:
             player2.ctrlQieCuo.warnTimes = 0
         if player2.hp == 1:
             winQieCuo(player1)
             return
         if player1.ctrlQieCuo.startMap != player1.mapname:
             winQieCuo(player2)
             return
         dist = Base.distance(player1.x, player1.y, player1.ctrlQieCuo.startX, player1.ctrlQieCuo.startY)
         if dist > Base.QIECUO_MAX_RANGE:
             if player1.ctrlQieCuo.warnTimes == 0:
                 player1.sendMsg(MsgDef.ServerCmd.ERROR_MSG, buildErrMsg(MsgDef.ClientCmd.QIECUO_OPS, '警告!出界3秒后将会被判输!'))
             player1.ctrlQieCuo.warnTimes += 1
             if player1.ctrlQieCuo.warnTimes == 4:
                 winQieCuo(player2)
                 return
         else:
             player1.ctrlQieCuo.warnTimes = 0
         if player1.hp == 1:
             winQieCuo(player2)
             return
         ffext.dump('check win ...')
         ffext.timer(1000, cb)
     else:
         if player2:
             winQieCuo(player2)
             return
     return
Пример #11
0
    def exe(self, owner, skill, objDest, param):
        self.paramHurt = self.paramNomal
        PuGong.exe(self, owner, skill, objDest, param)

        objDestRef = weakref.ref(objDest)
        ownerRef = weakref.ref(owner)

        def cb():
            objDest = objDestRef()
            owner = ownerRef()
            if not objDest or not owner:
                return
            self.paramHurt = self.paramHurtRate
            PuGong.exe(self, owner, skill, objDest, param)
            objDest.showEffect(MsgDef.EffectType.EFFECT_ZHUO_SHAO)

        for k in range(0, self.times):
            ffext.timer(int(self.paramSec * k * 1000 / self.times), cb)
        return
Пример #12
0
 def checkOnInit(self):
     nowTime = ffext.getTime()
     nowTm = ffext.datetime_now()
     if self.last_refresh_time > 0:
         if ffext.tmIsSameDay(self.last_refresh_time, nowTime):
             #服务器重启时,跨越了凌晨
             self.onMiddleNightEvent()
             # 是否跨周
             if nowTm.weekday() == 0:
                 self.onWeeklyNightEvent()
             pass
     # 计算出到达午夜的时间,启动定时器
     secondUtilMiddleNight = SECONDS_PER_DAY - (nowTime % SECONDS_PER_DAY)
     ffext.timer(secondUtilMiddleNight * 1000, self.onMiddleNightEvent)
     # 计算到达下一个周(一)午夜的时间,启动定时器
     secondUtilNextWeek = secondUtilMiddleNight + (
         6 - nowTm.weekday()) * SECONDS_PER_DAY
     ffext.timer(secondUtilNextWeek * 1000, self.onWeeklyNightEvent)
     return
Пример #13
0
    def handleReborn(self, rebornTm=Base.REBORN_TIMEOUT, rebornLife=10):
        #血回复10% 死亡后2s后,自动回到重生点
        if self.fsm:  #模拟怪的player,不需要重生
            return
        playerref = weakref.ref(self)

        def cb():
            player = playerref()
            if not player:
                return
            if not player.isDeath():
                return
            player.hp = int(player.hpMax * 10 / 100)
            x = player.x
            y = player.y
            mapObj = player.mapObj
            if mapObj.cfg.reviveMap != None:
                mapName = mapObj.cfg.reviveMap.mapname
                x = mapObj.cfg.reviveMap.x
                y = mapObj.cfg.reviveMap.y
                mapObj = MapMgr.getMapMgr().allocMap(mapName)
                #ffext.info('reborn name=%s, offlineMap=%s, x=%d, y=%d' % (player.name, player.mapname, x, y))
            #发送重生消息
            retMsg = buildPlayerInfoRet(player)
            retMsg.mapname = mapObj.mapname
            retMsg.x = x
            retMsg.y = y
            player.sendMsg(MsgDef.ServerCmd.REBORN, MsgDef.RebornRet(retMsg))
            mapObj.playerEnterMap(player, x, y, False)
            #ffext.info('reborn2 name=%s, offlineMap=%s, x=%d, y=%d' % (player.name, player.mapname, x, y))
            # 角色重生也要出发到副本
            if mapObj.copyMapHandler:
                try:
                    mapObj.copyMapHandler.handlePlayerRevive(mapObj, player)
                except:
                    ffext.error(
                        'mapObj.copyMapHandler.handlePlayerRevive failed mapname=%s player=%s'
                        % (mapObj.mapname, player.name))
            return

        ffext.timer(rebornTm, cb)
        return
Пример #14
0
            def funcToClose(sessOther):
                if sessOther.user.accountid == accountId:
                    ffext.warn('check relogin accountId=%d, name=%s' %
                               (accountId, sessOther.user.username))
                    #if reconnectUid:
                    #    session.sendMsg(MsgDef.ServerCmd.ERROR_MSG, buildErrMsg(MsgDef.ClientCmd.LOGIN, Base.lang('账号在其他地方登录')))
                    #else:
                    #    sessOther.close()
                    # 登出-记录log
                    LogModel.logLoginData(accountId, 0, '',
                                          LogModel.LoginOpType.LOGOUT,
                                          LogModel.LoginReason.KICKOUT)
                    sessOther.sendMsg(MsgDef.ServerCmd.RELOGIN,
                                      MsgDef.ReLoginRet())

                    def cbClose():
                        sessOther.close()

                    ffext.timer(500, cbClose)
                    return True
Пример #15
0
    def addBuff(self, buffId, buffSec=0, buffEffect=0, fromSkillId=0):
        curBuff = self.allBuff.get(buffId)
        if curBuff:
            return False
        endTime = 0
        if buffSec > 0:
            endTime = ffext.getTime() + buffSec
            owner = self.ownerref

            def cb():
                player = owner()
                if not player or player.mapObj == None:
                    return
                player.buffCtrl.delBuff(buffId)
                player.updateBuffMsg()

            ffext.timer(buffSec * 1000, cb)
        newBuff = MsgDef.BuffStatus(endTime, {1: buffEffect}, fromSkillId)
        self.allBuff[buffId] = newBuff
        player = self.ownerref()
        return
Пример #16
0
    def handleObjDie(self, mapObj, obj):
        playerOther = None
        bWin = True
        if self.autoPlayerRef != None:
            playerOther = self.autoPlayerRef()
            def cb():
                playerOther.mapObj.playerLeaveMap(playerOther)
            if playerOther:
                ffext.timer(100, cb)
                if obj.uid != playerOther.uid:
                    bWin = False
            self.autoPlayerRef =None
        #self.onEnd()

        for k, v in mapObj.allPlayer.iteritems():
            if v.uid != playerOther.uid:
                v.sendMsg(MsgDef.ServerCmd.COPYMAP_END, MsgDef.CopymapEndRet(1, AWARD_EXP, GOLD_ADD, []))
                v.AddScoreArena(getScoreBytimes(v.arenaCtrl.usedTimes))
                #v.taskCtrl.trigger(Base.Action.COPY_MAP, int(mapObj.mapname), 1)
        #5秒后关闭副本
        self.createTime = ffext.getTime() + 5 - LIMIT_SEC
        return True
Пример #17
0
    def exe(self, owner, skill, objDest, param):
        objDest.tmpInfo['_leftSH_'] = int(self.paramTotalSec /
                                          self.paramInterval)

        def cb():
            leftTimes = objDest.tmpInfo.get('_leftSH_', 0)
            if leftTimes <= 0 or objDest.isDeath():
                return
            hurtResult = calRealMagicHurt(owner, objDest, skill, selfvar, True,
                                          True, IGNORE_MAGIC_DEFEND)
            objDest.subHurtResult(owner, hurtResult)

            leftTimes = leftTimes - 1
            objDest.tmpInfo['_leftSH_'] = leftTimes
            ffext.timer(cbinterval * 1000, cbvar)
            return

        cbvar = cb
        selfvar = self
        cbinterval = self.paramInterval
        ffext.timer(self.paramInterval * 1000, cb)
        return
Пример #18
0
    def init(self):
        def cb(ret):
            self.allRank = []
            i = 0
            for row in ret.result:
                i += 1
                #sql = "select uid,name,job,gender,level,fightpower,arenascore from player where arenascore > 0 order by arenascore desc limit 1000 "
                tmpMsg = MsgDef.ArenaPlayerData(long(row[0]), row[1],
                                                int(row[2]), int(row[3]),
                                                int(row[4]), int(row[5]), i,
                                                int(row[6]))
                self.allRank.append(tmpMsg)
            return

        DbService.getPlayerService().loadArenaRankInfo(0, 1000, cb)

        def cbTimer():
            #print('load arena data')
            DbService.getPlayerService().loadArenaRankInfo(0, 1000, cb)
            ffext.timer(10 * 1000, cbTimer)

        ffext.timer(10 * 1000, cbTimer)
        return True
Пример #19
0
        def cb(dbSet):
            db = dbSet['player']
            dbitem = dbSet['item']
            dbPet = dbSet['pet']
            session = ffext.SessionNone()
            player = PlayerModel.Player(db.result[0])
            session.setPlayer(player)
            player.session = session
            if dbitem.isOk():
                player.itemCtrl.fromData(dbitem.result)
            player.petCtrl.fromData(dbPet.result)
            player.direction = Base.Direction.RIGHT
            player.arenaCtrl.destPlayerRef = weakref.ref(playerSrc)
            #状态机
            player.fsm = MonsterAI.FSM(player)

            def goTo():
                mapObj.copyMapHandler.autoPlayerRef = weakref.ref(player)
                mapObj.playerEnterMap(player, 69, 72)
                player.fsm.changeState(ffext.singleton(ArenaStateAttack))

            ffext.timer(1000, goTo)
            return
Пример #20
0
    def exe(self, owner, skill, objDest, param):
        if objDest.getType() != Base.PLAYER:
            return

        objDest.tmpInfo['_leftZYS_'] = 10

        def cb():
            leftTimes = objDest.tmpInfo.get('_leftZYS_', 0)
            leftTimes = leftTimes - 1
            objDest.tmpInfo['_leftZYS_'] = leftTimes
            if leftTimes <= 0:
                return
            objDest.addHPMsg(self.paramHurt)
            ffext.timer(3 * 1000, cbvar)

            buff = objDest.buffCtrl.getBuff(MsgDef.BuffType.ZHIYUSHU)
            if not buff:
                objDest.buffCtrl.addBuff(MsgDef.BuffType.ZHIYUSHU, 3, 0, 320)
                objDest.updateBuffMsg()
            return

        cbvar = cb
        ffext.timer(3 * 1000, cb)
        return
Пример #21
0
def processXibaiReq(session, msg = None):
    player = session.player
    if msg.opstype == 0:
        if player.pkSinValue >= 100 and player.pkSinValue < 300:#橙:(100<=罪恶值<300)时显示,被人杀死后3%掉落身上任一装备。
            pass
        else:
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG, buildErrMsg(MsgDef.ClientCmd.QIECUO_OPS, '只有橙色罪恶值才能洗白'))
            return
        gold = 500
        if player.gold < gold:
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG, buildErrMsg(MsgDef.ClientCmd.QIECUO_OPS, '金币不足:%d'%(gold)))
            return
        player.addGold(gold, True)
        retMsg = MsgDef.XibaiRet(msg.opstype)
        session.sendMsg(MsgDef.ServerCmd.XIBAI_OPS, retMsg)

        def cb():
            player.pkSinValue = 0
            #更新pk罪恶值
            session.broadcast(MsgDef.ServerCmd.PK_SIN_UPDATE_OPS, MsgDef.PkSinUpdateRet(0, player.pkSinValue, player.uid))
            return
        ffext.timer(1000*10, cb)
        return
    return
Пример #22
0
    def addWarVsInfo(self, guild1, guild2):
        warInfo = GuildWarVSInfo()
        warId = idtool.allocTmpId()
        warInfo.warId = warId
        warInfo.guild1 = guild1
        warInfo.guild2 = guild2
        warInfo.tmWarStart = ffext.getTime() + WAR_SEC_START
        self.allGuildWarVSInfo[warInfo.warId] = warInfo

        def cbStart():
            retMsg = MsgDef.GuildWarOpsRet(MsgDef.GuildWarOpsCmd.WAR_START,
                                           warInfo.tmWarStart)
            retMsg.warApplyGuild = buildGuildInfoMsg(guild1)
            retMsg.warFightGuild = buildGuildInfoMsg(guild2)
            guild1.sendMsg2OnlineMember(MsgDef.ServerCmd.GUILD_WAR_OPS, retMsg)
            guild2.sendMsg2OnlineMember(MsgDef.ServerCmd.GUILD_WAR_OPS, retMsg)

            # 更新颜色
            def updatePlayerColor1(player):
                player.nameColor = MsgDef.ECOLOR.BLUE
                player.SendChangeApprMsg()
                return

            def updatePlayerColor2(player):
                player.nameColor = MsgDef.ECOLOR.YELLOW
                player.SendChangeApprMsg()
                return

            guild1.foreachOnlineMember(updatePlayerColor1)
            guild2.foreachOnlineMember(updatePlayerColor2)
            return

        def cbEnd():
            warInfo = self.allGuildWarVSInfo.pop(warId, None)
            if not warInfo:
                return
            warInfo.tmWarStart = 0
            retMsg = MsgDef.GuildWarOpsRet(MsgDef.GuildWarOpsCmd.WAR_END,
                                           warInfo.tmWarStart)
            retMsg.winGuildId = 0
            if warInfo.guildScore1 >= warInfo.guildScore2:
                retMsg.winGuildId = warInfo.guild1.guildID
            else:
                retMsg.winGuildId = warInfo.guild2.guildID
            retMsg.warApplyGuild = buildGuildInfoMsg(guild1)
            retMsg.warFightGuild = buildGuildInfoMsg(guild2)
            guild1.sendMsg2OnlineMember(MsgDef.ServerCmd.GUILD_WAR_OPS, retMsg)
            guild2.sendMsg2OnlineMember(MsgDef.ServerCmd.GUILD_WAR_OPS, retMsg)

            # 更新颜色
            def updatePlayerColor(player):
                player.nameColor = 0
                player.SendChangeApprMsg()
                return

            guild1.foreachOnlineMember(updatePlayerColor)
            guild2.foreachOnlineMember(updatePlayerColor)
            return

        ffext.timer(WAR_SEC_START * 1000, cbStart)
        ffext.timer((WAR_SEC_START + WAR_SEC_END) * 1000, cbEnd)
        return warInfo
Пример #23
0
def chekcCopyMap():
    ffext.timer(Base.COPY_MAP_TIMER_MS, chekcCopyMap)
    getMapMgr().chekcCopyMap()
Пример #24
0
 def initTimer(self):
     ffext.timer(Base.COPY_MAP_TIMER_MS, chekcCopyMap)
Пример #25
0
def autoRecoverHpMp():
    #ffext.dump('autoRecoverHpMp...')
    ffext.getSessionMgr().foreach(recoverHpMp)
    ffext.timer(Base.PLAYER_RECOVER_HPMP_MS, autoRecoverHpMp)
    return
Пример #26
0
 def cbTimer():
     #print('load arena data')
     DbService.getPlayerService().loadArenaRankInfo(0, 1000, cb)
     ffext.timer(10 * 1000, cbTimer)
Пример #27
0
    def handleDrop(self, objAttackKill):
        if objAttackKill.getType() != Base.PLAYER:
            return

        objAttack = objAttackKill

        #击杀血量最多的人,给装备奖励
        maxObj = objAttackKill
        maxHurt = 0
        for uid, data in self.allHurtCount.iteritems():
            player = self.mapObj.getPlayerById(uid)
            if not player:
                continue
            if data.hurt > maxHurt:
                maxObj = player
                maxHurt = data.hurt
        maxTeam = None
        maxTeamHurt = 0
        for uid, data in self.allTeamHurtCount.iteritems():
            from model import TeamModel
            team = TeamModel.getTeamMgr().getTeamById(uid)
            if not team:
                continue
            if data.hurt > maxTeamHurt:
                maxTeam = team
                maxTeamHurt = data.hurt
        #初始化数据,方便复活
        self.allHurtCount = {}
        self.allTeamHurtCount = {}

        objAttack.addExp(self.propCfg.expval, True)
        burstItemList = []
        from handler import ItemHandler

        def burstItemCallBack(itemCfgId, num):
            burstItemList.append((itemCfgId, num))

        def giveItemById(obj, retMsg, itemCfgId, num):
            if itemCfgId == 0:  # 金币
                obj.addGold(num, True)
                return
            item = obj.itemCtrl.addItemByCfgId(itemCfgId, num)
            if item:
                ffext.dump('whenDie itemEnterMap', item.itemCfg.name, num)

                # self.mapObj.itemEnterMap(item, self.x + 1, self.y + 1)
                if item.__class__ == list:
                    for k in item:
                        retItem = MsgDef.Item()
                        ItemHandler.buildItem(retItem, k)
                        retMsg.items.append(retItem)
                else:
                    retItem = MsgDef.Item()
                    ItemHandler.buildItem(retItem, item)
                    retMsg.items.append(retItem)
            return

        def burstItemCallBackName(name, num):
            from model import ItemModel
            itemCfg = ItemModel.getItemMgr().getCfgByName(name)
            if itemCfg:
                burstItemCallBack(itemCfg.cfgId, num)
            else:
                ffext.error('burstItemCallBackName %s %d' % (name, num))
            return

        for k in self.propCfg.allBurstCfg:
            k.genBurst(burstItemCallBackName)

        burstBagCfg = getMonsterMgr().cfgLevel2Drop.get(self.propCfg.level)
        if burstBagCfg:
            ffext.dump('burstBagCfg', burstBagCfg)
            # 1	根据表【怪物掉落包个数】获得该等级怪物的掉落物品的个数
            # 2	每个包掉落概率:根据怪物的等级和类型,获得是否该包是否掉落
            # 3	金币数目:怪物实际掉落金币=怪物等级金币*怪物的金币倍数
            # 4	物品:每一个掉落包从【金币/物品1/物品2/物品3/物品4】中随机一个
            # 5	若随机到【/物品1/物品2/物品3/物品4】,寻找制定的掉落包ID内物品
            monType = self.propCfg.getMonDifficultyType()
            num = burstBagCfg.numList[monType]
            rate = burstBagCfg.rateList[monType]
            dropBagList = burstBagCfg.bagIdList
            for k in range(num):
                rand = random.randint(1, 100)
                ffext.dump('rate trace', rate, rand, len(dropBagList))
                if rate >= rand and len(dropBagList) > 0:  # 爆落
                    destBagId = dropBagList[rand % len(dropBagList)]
                    ffext.dump('rate trace', rate, rand, len(dropBagList),
                               destBagId)
                    if destBagId == 0:  # 金币
                        gold = random.randint(burstBagCfg.goldMin,
                                              burstBagCfg.goldMax)
                        burstItemCallBack(
                            destBagId,
                            gold * self.propCfg.expgoldtimes)  # *怪物的金币倍数
                        continue
                    destBagCfg = getMonsterMgr().bagid2cfg.get(destBagId)
                    if destBagCfg:
                        for itemCfgId in destBagCfg.itemIdList:
                            burstItemCallBack(itemCfgId, 1)
        ffext.dump('handledrop', burstItemList, objAttack.name, maxHurt,
                   maxTeamHurt)
        if maxHurt >= maxTeamHurt:  #个人获得道具
            objAttack = maxObj
            retMsg = MsgDef.MonserBurstItemsRet(self.uid, objAttack.uid, [],
                                                self.propCfg.expval, 0)
            for k in burstItemList:
                giveItemById(objAttack, retMsg, k[0], k[1])
            if len(retMsg.items) > 0:
                ItemHandler.processQueryPkg(objAttack.session)
            objAttack.sendMsg(MsgDef.ServerCmd.MONSTER_BURST_ITEMS, retMsg)
            return
        else:  #团队获得道具
            allPlayers = []
            for k, v in maxTeam.getTeamMember().iteritems():
                p = self.mapObj.getPlayerById(k)
                if p:
                    allPlayers.append(p)
            if not allPlayers:
                return
            objPrize = allPlayers[random.randint(0, len(allPlayers) - 1)]
            retMsg = MsgDef.MonserBurstItemsRet(self.uid, objPrize.uid, [], 0,
                                                0)
            objPrizeRef = weakref.ref(objPrize)

            def tmpPrizeCallBack():
                objPrize = objPrizeRef()
                if not objPrize:
                    return
                for k in burstItemList:
                    giveItemById(objPrize, retMsg, k[0], k[1])
                if len(retMsg.items) > 0:
                    ItemHandler.processQueryPkg(objPrize.session)

            retMsg.teamBurstInfo = []
            callbackArg = {'players': {}, 'prizecallback': tmpPrizeCallBack}
            for arg in allPlayers:
                randNum = 1
                if arg == objPrize:
                    randNum = 6
                else:
                    randNum = random.randint(1, 5)
                retMsg.teamBurstInfo.append(
                    MsgDef.BurstRandInfo(arg.uid, arg.name, randNum))
                callbackArg[arg.uid] = arg.name
            for k in burstItemList:
                ffext.dump('busrt info', k)
                from model import ItemModel
                itemCfg = ItemModel.getItemMgr().getCfgByCfgId(k[0])
                if itemCfg:
                    retItem = MsgDef.Item()
                    ItemModel.tmpBuildItem(retItem, itemCfg)
                    retMsg.items.append(retItem)

            def timercb():
                ffext.dump("timercb teamburst...")
                cb = callbackArg['prizecallback']
                if cb:
                    callbackArg['prizecallback'] = None
                    cb()
                return

            ffext.timer(5 * 1000, timercb)
            ffext.dump('monter burst items', retMsg)
            for objAttack in allPlayers:
                retMsg.callbackId = objPrize.addCallBack(
                    burstCallBack, callbackArg)
                objAttack.sendMsg(MsgDef.ServerCmd.MONSTER_BURST_ITEMS, retMsg)
        return
Пример #28
0
def onTimer():
    gMonsterMgr.onTimer()
    ffext.timer(Base.MONSTER_TIMER_MS, onTimer)
Пример #29
0
def processMarryOPS(session, msg):
    #ffext.dump('processMarryOPS', msg)
    opstype = msg.opstype
    cmd = MsgDef.ClientCmd.MARRIAGE_OPS
    player = session.player

    if opstype == MsgDef.MarriageClientCmd.MARRY_QUERY_STATUS:  #查询结婚状态
        retMsg = processMarryOpsMsgRet(opstype, player,
                                       player.marriageCtrl.marryFlag, 0, '', 0)
        #print(retMsg)
        session.sendMsg(MsgDef.ServerCmd.MARRIAGE_OPS_MSG, retMsg)
        return
    elif opstype == MsgDef.MarriageClientCmd.MARRY_APPLY_TASK:
        marryTotalInfo = player.marriageCtrl.marryTotalInfo
        nextTaskId = MARRY_TASK_ID
        # if marryTotalInfo:#直接接任务
        #     if session.player.marriageCtrl.getStatus() != MsgDef.MarryStatusCmd.MARRY_STATUS_NOT:
        #         session.sendMsg(MsgDef.ServerCmd.ERROR_MSG, processErrorMsgRet(opstype, cmd, '不能领取任务!'))
        #         return
        #     session.player.marriageCtrl.setStatus(MsgDef.MarryStatusCmd.MARRY_STATUS_TASK_GO)
        #
        #     for taskid, task in session.player.taskCtrl.allTask.iteritems():
        #         session.player.taskCtrl.delTaskById(taskid)
        #         newTask = session.player.taskCtrl.addTaskById(nextTaskId, False)
        #         if newTask:
        #             DbService.getPlayerService().replaceTask(session.player, newTask, taskid)
        #         break
        #     from handler import  TaskHandler
        #     TaskHandler.processQueryTask(session)
        #     session.sendMsg(MsgDef.ServerCmd.MARRIAGE_OPS_MSG, processMarryOpsMsgRet(opstype, session.player, MsgDef.MarryStatusCmd.MARRY_STATUS_TASK_GO))
        #     DbService.getPlayerService().updateMarry(marryTotalInfo)
        #     return
        team = TeamModel.getTeamMgr().getTeamById(
            session.player.teamCtrl.teamID)
        if not team:
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG,
                            processErrorMsgRet(opstype, cmd, '请先组队!'))
            return
        if len(team.getTeamMember()) != 2:
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG,
                            processErrorMsgRet(opstype, cmd, '请先组队2人!'))
            return
        if player.isMarry():
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG,
                            processErrorMsgRet(opstype, cmd, '你已经结婚!'))
            return
        destPlayer = None
        mateSession = None
        marryTotalInfo = None
        for key, valdata in team.getTeamMember().iteritems():
            mateSession = ffext.getSessionMgr().findByUid(valdata.uid)
            if not mateSession:
                session.sendMsg(
                    MsgDef.ServerCmd.ERROR_MSG,
                    processErrorMsgRet(opstype, cmd,
                                       '队伍异常:%d' % (valdata.uid)))
                continue
            val = mateSession.player
            if val.uid != session.player.uid:
                if val.gender == player.gender:
                    session.sendMsg(MsgDef.ServerCmd.ERROR_MSG,
                                    processErrorMsgRet(opstype, cmd, '性别不符!'))
                    return
                mateUid = val.uid
                destPlayer = val
                if destPlayer.isMarry():
                    session.sendMsg(
                        MsgDef.ServerCmd.ERROR_MSG,
                        processErrorMsgRet(opstype, cmd, '对方已经结婚!'))
                    return
                husbend = player
                wife = val
                if player.gender == Base.Gender.FEMAIL:
                    husbend = val
                    wife = player
                strFlag = player.tmpInfo.get('_marry_task_apply_')
                marryTotalInfo = None
                if strFlag == None:
                    flag2 = destPlayer.tmpInfo.get('_marry_task_apply_')
                    if flag2 != None:
                        marryTotalInfo = flag2
                    else:
                        marryTotalInfo = MarryModel.getMarryMgr(
                        ).allocMarryTotalInfo(husbend, wife)
                    player.tmpInfo['_marry_task_apply_'] = marryTotalInfo
                    session.player.marriageCtrl.setStatus(
                        MsgDef.MarryStatusCmd.MARRY_STATUS_TASK_GO)

                if destPlayer.tmpInfo.get('_marry_task_apply_') == None:
                    session.sendMsg(
                        MsgDef.ServerCmd.ERROR_MSG,
                        processErrorMsgRet(opstype, cmd, '等待对方确认!'))
                    husbend.sendMsg(
                        MsgDef.ServerCmd.MARRIAGE_OPS_MSG,
                        processMarryOpsMsgRet(
                            opstype, session.player,
                            MsgDef.MarryStatusCmd.MARRY_STATUS_TASK_GO, 0, '',
                            0, 0, marryTotalInfo))
                    wife.sendMsg(
                        MsgDef.ServerCmd.MARRIAGE_OPS_MSG,
                        processMarryOpsMsgRet(
                            opstype, session.player,
                            MsgDef.MarryStatusCmd.MARRY_STATUS_TASK_GO, 0, '',
                            0, 0, marryTotalInfo))
                    return

                # marryTotalInfo = MarryModel.allockMarryInfo()

                #wife.marriageCtrl.setStatus(MsgDef.MarryStatusCmd.MARRY_STATUS_TASK_GO)
                ffext.dump('dump marry', marryTotalInfo)
                break
        #领取结婚任务         | 未婚-结婚进行中任务
        nextTaskId = MARRY_TASK_ID
        for taskid, task in session.player.taskCtrl.allTask.iteritems():
            session.player.taskCtrl.delTaskById(taskid)
            newTask = session.player.taskCtrl.addTaskById(nextTaskId, False)
            if newTask:
                DbService.getPlayerService().replaceTask(
                    session.player, newTask, taskid)
            break
        for taskid, task in destPlayer.taskCtrl.allTask.iteritems():
            destPlayer.taskCtrl.delTaskById(taskid)
            newTask = destPlayer.taskCtrl.addTaskById(nextTaskId, False)
            if newTask:
                DbService.getPlayerService().replaceTask(
                    destPlayer, newTask, taskid)
            break
        from handler import TaskHandler
        TaskHandler.processQueryTask(session)
        TaskHandler.processQueryTask(destPlayer.session)

        session.sendMsg(
            MsgDef.ServerCmd.MARRIAGE_OPS_MSG,
            processMarryOpsMsgRet(opstype, session.player,
                                  MsgDef.MarryStatusCmd.MARRY_STATUS_TASK_GO))
        destPlayer.sendMsg(
            MsgDef.ServerCmd.MARRIAGE_OPS_MSG,
            processMarryOpsMsgRet(opstype, session.player,
                                  MsgDef.MarryStatusCmd.MARRY_STATUS_TASK_GO))

        DbService.getPlayerService().addMarry(player,
                                              player.marriageCtrl.marryId,
                                              mateSession.player.uid,
                                              ffext.getTime())
        DbService.getPlayerService().updateMarry(marryTotalInfo)
        player.tmpInfo['_marry_task_apply_'] = None
        destPlayer.tmpInfo['_marry_task_apply_'] = None
        return

    elif opstype == MsgDef.MarriageClientCmd.MARRY_GIVEUP_TASK:  #13:放弃结婚任务
        if not player.marriageCtrl:
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG,
                            processErrorMsgRet(opstype, cmd, 'CTRL错误!'))
            return
        marryTotalInfo = player.marriageCtrl.marryTotalInfo
        if not marryTotalInfo or marryTotalInfo.coupleData[
                0].status != MsgDef.MarryStatusCmd.MARRY_STATUS_TASK_GO:
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG,
                            processErrorMsgRet(opstype, cmd, '未领取任务!'))
            return
        anotherInfo = marryTotalInfo.getInfoByAnotherGender(player.gender)
        destPlayer = player.mapObj.getPlayerById(anotherInfo.uid)
        mateSession = None
        if destPlayer:
            mateSession = destPlayer.session

        marryTotalInfo.getInfoByGender(
            player.gender).status = MsgDef.MarryStatusCmd.MARRY_STATUS_NOT
        marryTotalInfo.getInfoByAnotherGender(
            player.gender).status = MsgDef.MarryStatusCmd.MARRY_STATUS_NOT

        MarryModel.getMarryMgr().delMarryById(marryTotalInfo.marryId)
        DbService.getPlayerService().updateMarryDivorce(marryTotalInfo.marryId)
        DbService.getPlayerService().updateMarryDivorcePlayer(player.uid)
        DbService.getPlayerService().updateMarryDivorcePlayer(anotherInfo.uid)

        # 提交任务             | 结婚进行中任务 - 已婚
        task = session.player.taskCtrl.getTask(MARRY_TASK_ID)
        if task:
            from model import TaskModel
            task.status = TaskModel.TaskStatus.FINISH
            session.player.taskCtrl.checkNewTask(task)
            from handler import TaskHandler
            TaskHandler.processQueryTask(session)

            ffext.dump('dump marry', marryTotalInfo)

        player.marriageCtrl.divorceForce()
        player.tmpInfo['_marry_task_apply_'] = None
        # 发送回包
        ret_msg = processMarryOpsMsgRet(opstype, session.player,
                                        MsgDef.MarryStatusCmd.MARRY_STATUS_NOT)
        session.sendMsg(MsgDef.ServerCmd.MARRIAGE_OPS_MSG, ret_msg)

        if destPlayer:
            task2 = destPlayer.taskCtrl.getTask(MARRY_TASK_ID)
            if task2:
                from model import TaskModel
                task2.status = TaskModel.TaskStatus.FINISH
                destPlayer.taskCtrl.checkNewTask(task2)
                from handler import TaskHandler
                TaskHandler.processQueryTask(mateSession)

            destPlayer.marriageCtrl.divorceForce()
            # 发送回包
            ret_msg = processMarryOpsMsgRet(
                opstype, destPlayer, MsgDef.MarryStatusCmd.MARRY_STATUS_NOT)
            mateSession.sendMsg(MsgDef.ServerCmd.MARRIAGE_OPS_MSG, ret_msg)

            destPlayer.tmpInfo['_marry_task_apply_'] = None

        return
    elif opstype == MsgDef.MarriageClientCmd.MARRY_COMMIT_TASK:
        if not player.marriageCtrl:
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG,
                            processErrorMsgRet(opstype, cmd, 'CTRL错误!'))
            return
        marryTotalInfo = player.marriageCtrl.marryTotalInfo
        if not marryTotalInfo:
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG,
                            processErrorMsgRet(opstype, cmd, '未领取任务!'))
            return
        anotherInfo = marryTotalInfo.getInfoByAnotherGender(player.gender)
        destPlayer = player.mapObj.getPlayerById(anotherInfo.uid)
        #ffext.dump('MARRRRRRRRRRRRR!')
        task = player.taskCtrl.getTask(MARRY_TASK_ID)
        ffext.dump('MARRYTASK', task)
        if task:
            from model import TaskModel
            task.status = TaskModel.TaskStatus.FINISH
            player.taskCtrl.checkNewTask(task)
            from handler import TaskHandler
            TaskHandler.processQueryTask(session)

            ffext.dump('dump marry', marryTotalInfo)
            marryTotalInfo.getInfoByGender(
                player.gender
            ).status = MsgDef.MarryStatusCmd.MARRY_STATUS_TASK_FINISH

        mateSession = None
        if destPlayer:
            mateSession = destPlayer.session

        status1 = marryTotalInfo.getInfoByGender(player.gender).status
        status2 = marryTotalInfo.getInfoByAnotherGender(player.gender).status
        #ffext.dump('STATUS1',status1)
        #ffext.dump('STATUS2',status2)
        #ffext.dump('MARRRRRRRRRRRRR!')
        if status1 == MsgDef.MarryStatusCmd.MARRY_STATUS_TASK_FINISH and status1 == status2:
            marryTotalInfo.getInfoByGender(
                player.gender
            ).status = MsgDef.MarryStatusCmd.MARRY_STATUS_MARRIED
            marryTotalInfo.getInfoByAnotherGender(
                player.gender
            ).status = MsgDef.MarryStatusCmd.MARRY_STATUS_MARRIED
        DbService.getPlayerService().updateMarry(marryTotalInfo)
        session.sendMsg(
            MsgDef.ServerCmd.MARRIAGE_OPS_MSG,
            processMarryOpsMsgRet(
                opstype, destPlayer,
                MsgDef.MarryStatusCmd.MARRY_STATUS_TASK_FINISH))
        destPlayer.sendMsg(
            MsgDef.ServerCmd.MARRIAGE_OPS_MSG,
            processMarryOpsMsgRet(
                opstype, destPlayer,
                MsgDef.MarryStatusCmd.MARRY_STATUS_TASK_FINISH))

        return
    elif opstype == MsgDef.MarriageClientCmd.MARRY_SEND:
        # 发请帖
        friends = session.player.friendCtrl.getFriend()
        friends_lst = []
        for k, v in friends.iteritems():
            friends_lst.append(v.name)
        #ffext.dump('Friends_lst', friends_lst)
        msg.visitors = friends_lst
        ffext.dump('QINGTIEMSG', msg)
        if msg.visitors == None:
            return
        if len(msg.visitors) > WEDDING_SEND_MAX_PLAYER:
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG,
                            processErrorMsgRet(opstype, cmd, '邀请人数太多了!'))
            return
        if len(msg.msg) > WEDDING_SEND_MAX_STR:
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG,
                            processErrorMsgRet(opstype, cmd, '请帖文字太长了!'))
            return
        marryTotalInfo = session.player.marriageCtrl.marryTotalInfo
        marryTotalInfo.flagXiTie += 1
        hasSend = []
        for k in msg.visitors:
            if k in hasSend:
                continue
            hasSend.append(k)
            #查找所有的被邀请者的“姓名”
            otherSession = ffext.getSessionMgr().getSessionByName(k)
            if otherSession:
                toPlayer = otherSession.player
                msg = msg.msg + '\n\n\n\n' + '系统提醒:请去结婚界面确认是否参加婚礼!'
                title = None
                #ffext.dump('喜帖!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')
                session.player.mailCtrl.sendMail(toPlayer.uid, 0, title, msg)
                otherSession.sendMsg(
                    MsgDef.ServerCmd.MARRIAGE_OPS_MSG,
                    processMarryOpsMsgRet(
                        opstype, session.player,
                        MsgDef.MarryStatusCmd.MARRY_STATUS_MARRIED, 0,
                        msg.msg))
        #状态变化,更新数据库
        DbService.getPlayerService().updateMarry(marryTotalInfo)
        session.sendMsg(
            MsgDef.ServerCmd.MARRIAGE_OPS_MSG,
            processMarryOpsMsgRet(opstype, session.player,
                                  MsgDef.MarryStatusCmd.MARRY_STATUS_MARRIED,
                                  0, msg.msg))
        return
    elif opstype == MsgDef.MarriageClientCmd.MARRY_APPLY_WEDDING:  #申请结婚
        marryTotalInfo = player.marriageCtrl.marryTotalInfo
        if not marryTotalInfo:
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG,
                            processErrorMsgRet(opstype, cmd, '先完成結婚任務!'))
            return
        if marryTotalInfo.flagWeding != MsgDef.WeddingFlagCmd.WEDDING_NOT_APPLY and marryTotalInfo.flagWeding != MsgDef.WeddingFlagCmd.WEDDING_FAIL:
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG,
                            processErrorMsgRet(opstype, cmd, '已经申请过!'))
            return

        mate = marryTotalInfo.getInfoByAnotherGender(player.gender)
        otherPlayer = player.mapObj.getPlayerById(mate.uid)
        if not otherPlayer:
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG,
                            processErrorMsgRet(opstype, cmd, '配有没有在线!'))
            return
        strFlag = player.tmpInfo.get('_wedding_apply_')
        if strFlag == None:
            player.tmpInfo['_wedding_apply_'] = True
        strFlag2 = otherPlayer.tmpInfo.get('_wedding_apply_')
        if strFlag2 == None:
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG,
                            processErrorMsgRet(opstype, cmd, '等待配偶确认!'))
            ret_msg = processMarryOpsMsgRet(opstype, player)
            session.sendMsg(MsgDef.ServerCmd.MARRIAGE_OPS_MSG, ret_msg)
            ret_msg = processMarryOpsMsgRet(opstype, otherPlayer)
            otherPlayer.sendMsg(MsgDef.ServerCmd.MARRIAGE_OPS_MSG, ret_msg)
            return
        player.tmpInfo['_wedding_apply_'] = None
        otherPlayer.tmpInfo['_wedding_apply_'] = None

        marryTotalInfo.flagWeding = MsgDef.WeddingFlagCmd.WEDDING_APPLYED
        leftSec = WEDDING_INTERVAL
        marryTotalInfo.tmWedding = ffext.getTime() + leftSec  #1 分钟后开始

        marryId = marryTotalInfo.marryId

        def cb():
            MarryModel.handleTimerWedding(marryId)

        ffext.timer(leftSec * 1000, cb)
        ret_msg = processMarryOpsMsgRet(opstype, player)
        session.sendMsg(MsgDef.ServerCmd.MARRIAGE_OPS_MSG, ret_msg)
        #状态变化,更新数据库
        DbService.getPlayerService().updateMarry(marryTotalInfo)

        if mate:
            marryPlayer = ffext.getSessionMgr().findByUid(mate.uid)
            if marryPlayer:
                marryPlayer.sendMsg(MsgDef.ServerCmd.MARRIAGE_OPS_MSG, ret_msg)
        return
    elif opstype == MsgDef.MarriageClientCmd.MARRY_QUERY_ALL_MARRIAGE:  ##12:查询所有夫妻,方便参加婚礼
        allMarriage = MarryModel.getAllMarriage()
        ret_msg = processMarryOpsMsgRet(opstype, None)
        ret_msg.allMarriageInfo = []
        num = 0
        for k, marryTotalInfo in allMarriage.iteritems():
            num += 1
            if num >= 100:
                break
            if marryTotalInfo.flagWeding != MsgDef.WeddingFlagCmd.WEDDING_APPLYED:
                continue
            baseInfo = MsgDef.MarriageBaseInfo(marryTotalInfo.marryId, [], [])
            for k in marryTotalInfo.coupleData:
                num += 1
                if num >= 100:
                    break
                tmpmsg = MsgDef.MarriagePlayerMsg()
                tmpmsg.uid = k.uid
                tmpmsg.name = k.name
                tmpmsg.job = k.job
                tmpmsg.gender = k.gender
                tmpmsg.level = k.level
                tmpmsg.status = k.status
                baseInfo.coupleData.append(tmpmsg)
            for k in marryTotalInfo.listAttends:
                num += 1
                if num >= 100:
                    break
                tmpmsg = MsgDef.MarriagePlayerMsg()
                tmpmsg.uid = k.uid
                tmpmsg.name = k.name
                tmpmsg.job = k.job
                tmpmsg.gender = k.gender
                tmpmsg.level = k.level
                tmpmsg.status = k.status
                baseInfo.listAttends.append(tmpmsg)
            ret_msg.allMarriageInfo.append(baseInfo)
        session.sendMsg(MsgDef.ServerCmd.MARRIAGE_OPS_MSG, ret_msg)
    elif opstype == MsgDef.MarriageClientCmd.MARRY_ATTEND_WEEDING:
        # 参加婚礼,扣礼金,发道具
        marryTotalInfo = MarryModel.getMarryMgr().getMarryTotalInfo(
            msg.marryId)
        #marryPlayer = ffext.getSessionMgr().findByUid(msg.marryUid)
        if not marryTotalInfo:
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG,
                            processErrorMsgRet(opstype, cmd, "对方还未结婚!"))
            return
        gold = 500
        item1 = 1040188
        item2 = 1040189
        if player.gold < gold:
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG,
                            processErrorMsgRet(opstype, cmd, "金币不足500!"))
            return
        for k in marryTotalInfo.listAttends:
            if k.uid == player.uid:
                session.sendMsg(MsgDef.ServerCmd.ERROR_MSG,
                                processErrorMsgRet(opstype, cmd, '不可重复报名!'))
                return
        player.addGold(gold * -1, True)
        itemObj = player.itemCtrl.addItemByCfgId(item1)
        if not itemObj:
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG,
                            processErrorMsgRet(opstype, cmd, '系统忙!'))
        # return
        itemObj2 = player.itemCtrl.addItemByCfgId(item2)
        if not itemObj2:
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG,
                            processErrorMsgRet(opstype, cmd, '系统忙!'))
            #return

        ItemHandler.processQueryPkg(session)
        # 增加总礼金,添加到列表
        marryTotalInfo.totalGold += gold
        #playerTmpInfo = MarryModel.PlayerMarryInfo()
        #playerTmpInfo.setPlayerMarryInfo(player)
        playerTmpInfo = MsgDef.MarriagePlayerMsg(player.uid, player.name,
                                                 player.job, player.gender,
                                                 player.level)
        marryTotalInfo.listAttends.append(playerTmpInfo)
        DbService.getPlayerService().updateMarry(marryTotalInfo)

        #(opstype, player, flag = 0, delTime = 0, msg = '', gold = 0, skillId = 0, marryTotalInfo = None):
        ret_msg = processMarryOpsMsgRet(
            opstype, session.player,
            MsgDef.MarryStatusCmd.MARRY_STATUS_MARRIED, 0, '', gold, 0,
            marryTotalInfo)
        addItem2MarryPlayerMsg(ret_msg, itemObj, 1)
        addItem2MarryPlayerMsg(ret_msg, itemObj2, 1)

        session.sendMsg(MsgDef.ServerCmd.MARRIAGE_OPS_MSG, ret_msg)
        return
    elif opstype == MsgDef.MarriageClientCmd.MARRY_NEW_LIST:
        # 新房列表
        retMsg = processMarryOpsMsgRet(
            opstype, session.player,
            MsgDef.MarryStatusCmd.MARRY_STATUS_MARRIED, 0, '', 0)
        allMarriage = MarryModel.getAllMarriage()
        for k, marryTotalInfo in allMarriage.iteritems():
            #if marryTotalInfo.flagWeding != MsgDef.WeddingFlagCmd.WEDDING_APPLYED and marryTotalInfo.flagWeding != MsgDef.WeddingFlagCmd.WEDDING_FINISH:
            #    continue
            if len(marryTotalInfo.coupleData
                   ) == 2 and marryTotalInfo.coupleData[
                       0].status == MsgDef.MarryStatusCmd.MARRY_STATUS_MARRIED:
                marryMsg = processMarriageVisitListBaseInfo(
                    marryTotalInfo.marryId, marryTotalInfo.coupleData[0],
                    marryTotalInfo.coupleData[1], marryTotalInfo.tmWedding)
                retMsg.listVisitHouseInfo.append(marryMsg)
            pass
        session.sendMsg(MsgDef.ServerCmd.MARRIAGE_OPS_MSG, retMsg)
        return
    elif opstype == MsgDef.MarriageClientCmd.MARRY_VISIT_HOUSE:
        # 我要参观其他新房
        mId = msg.marryId
        allMarriage = MarryModel.getAllMarriage()
        marryInfo = allMarriage.get(mId)
        if not marryInfo:
            session.sendMsg(
                MsgDef.ServerCmd.ERROR_MSG,
                processErrorMsgRet(opstype, cmd, '结婚ID:%d不存在!' % (mId)))
            return
        mItems = []
        for k, xItem in marryInfo.listSetItems.iteritems():
            #mItems.append(xItem)
            mItems.append(MsgDef.MarriageItem(k, xItem.get('itemCfgId', 0)))
        marryMsg = processMarriageVisitListBaseInfo(mId,
                                                    marryInfo.coupleData[0],
                                                    marryInfo.coupleData[1],
                                                    marryInfo.tmWedding,
                                                    mItems)

        retMsg = processMarryOpsMsgRet(
            opstype, session.player,
            MsgDef.MarryStatusCmd.MARRY_STATUS_MARRIED, 0, '', 0)
        retMsg.otherHouseInfo = marryMsg
        session.sendMsg(MsgDef.ServerCmd.MARRIAGE_OPS_MSG, retMsg)
        ffext.dump('xxx', retMsg)
        return
    elif opstype == MsgDef.MarriageClientCmd.MARRY_SET_HOUSE_ITEM:
        # 装点新房
        if not player.isMarry():
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG,
                            processErrorMsgRet(opstype, cmd, "请先结婚!"))
            return
        if msg.housePos < MsgDef.MarriageHousePos.MARRY_HOUSE_POS_1 or \
            msg.housePos > MsgDef.MarriageHousePos.MARRY_HOUSE_POS_6:
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG,
                            processErrorMsgRet(opstype, cmd, "位置错误!"))
            return

        itemToSetCfgId = 0
        item = player.itemCtrl.getItem(msg.houseItemId)
        if item:
            itemToSetCfgId = item.itemCfg.cfgId
            player.itemCtrl.delItem(msg.houseItemId)
        else:
            itemToSetCfgId = msg.houseItemId
            setItemCfg = ItemModel.getItemMgr().getCfgByCfgId(itemToSetCfgId)
            if not setItemCfg:
                session.sendMsg(
                    MsgDef.ServerCmd.ERROR_MSG,
                    processErrorMsgRet(
                        opstype, cmd,
                        "Item Id not exists! %d" % (msg.houseItemId)))
                return
            setItemHaveNum = player.itemCtrl.countItemNumbyCfgId(
                itemToSetCfgId)
            if setItemHaveNum < 1:
                session.sendMsg(
                    MsgDef.ServerCmd.ERROR_MSG,
                    processErrorMsgRet(opstype, cmd, "You do not have Item!"))
                return
            # 删除道具
            player.itemCtrl.subItemNumByCfgId(itemToSetCfgId, 1)
        # 设置到marriageCtl.marryTotalInfo
        player.marriageCtrl.marryTotalInfo.addSetItem(msg.housePos,
                                                      itemToSetCfgId)

        ret_msg = processMarryOpsMsgRet(
            opstype, session.player,
            MsgDef.MarryStatusCmd.MARRY_STATUS_MARRIED, 0, '', 0)
        #addItem2MarryPlayerMsgEx(ret_msg, msg.housePos, itemToSetCfgId)
        session.sendMsg(MsgDef.ServerCmd.MARRIAGE_OPS_MSG, ret_msg)

        #更新数据库
        itemStr = player.marriageCtrl.marryTotalInfo.toJson4SetItems()
        extraStr = player.marriageCtrl.marryTotalInfo.toJson4Extra()
        DbService.getPlayerService().updateMarryItem(
            player.uid, player.marriageCtrl.marryId, itemStr, extraStr)
        return
    elif opstype == MsgDef.MarriageClientCmd.MARRY_LEARN_COUPLE_SKILL:
        # 学习夫妻技能
        skillLevel = 1
        retErr = player.skillCtrl.learnSkill(WEDDING_SKILL_ID, skillLevel)
        if retErr:
            session.sendMsg(
                MsgDef.ServerCmd.ERROR_MSG,
                processErrorMsgRet(
                    opstype, cmd,
                    '学习技能%d失败,原因:%s!' % (WEDDING_SKILL_ID, retErr)))
            return
        session.sendMsg(MsgDef.ServerCmd.LEARN_SKILL,
                        MsgDef.LearnSkillRet(WEDDING_SKILL_ID, skillLevel))
        retMsg = processMarryOpsMsgRet(
            opstype, session.player,
            MsgDef.MarryStatusCmd.MARRY_STATUS_MARRIED, 0, '', 0,
            WEDDING_SKILL_ID)
        session.sendMsg(MsgDef.ServerCmd.MARRIAGE_OPS_MSG, retMsg)
        return
    elif opstype == MsgDef.MarriageClientCmd.MARRY_DIVORCE_NORMAL:
        # 和谐离婚             | 已婚-离婚中-(update消息)-未婚
        if player.marriageCtrl.marryFlag != MsgDef.MarryStatusCmd.MARRY_STATUS_MARRIED:
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG,
                            processErrorMsgRet(opstype, cmd, '不可以离婚!'))
            return
        marryTotalInfo = player.marriageCtrl.marryTotalInfo
        myMarryInfo = player.marriageCtrl.marryTotalInfo.getInfoByGender(
            player.gender)
        if not myMarryInfo:
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG,
                            processErrorMsgRet(opstype, cmd, '未知错误!'))
            return
        mateMarryInfo = player.marriageCtrl.marryTotalInfo.getInfoByAnotherGender(
            player.gender)
        if not mateMarryInfo:
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG,
                            processErrorMsgRet(opstype, cmd, '未知错误!!'))
            return
        matePlayer = player.mapObj.getPlayerById(mateMarryInfo.uid)
        #ffext.dump('mateplayer', matePlayer)
        if not matePlayer:
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG,
                            processErrorMsgRet(opstype, cmd, '配偶没有在线!'))
            return
        player.tmpInfo['_marry_divorce_apply_'] = True
        if matePlayer.tmpInfo.get('_marry_divorce_apply_') == None:
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG,
                            processErrorMsgRet(opstype, cmd, '等待配偶确认!'))
            ret_msg = processMarryOpsMsgRet(
                opstype, session.player,
                MsgDef.MarryStatusCmd.MARRY_STATUS_DIVORCING, 0, '', 0)
            if ret_msg.baseInfo.coupleData[0].uid == player.uid:
                ret_msg.baseInfo.coupleData[
                    0].status = MsgDef.MarryStatusCmd.MARRY_STATUS_DIVORCING
            else:
                ret_msg.baseInfo.coupleData[
                    1].status = MsgDef.MarryStatusCmd.MARRY_STATUS_DIVORCING
            #if ret_msg.baseInfo.coupleData[0].statu != ret_msg.baseInfo.coupleData[1].statu:
            #ret_msg.baseInfo.coupleData[0].status = MsgDef.MarryStatusCmd.MARRY_STATUS_MARRIED
            #ret_msg.baseInfo.coupleData[1].status = MsgDef.MarryStatusCmd.MARRY_STATUS_MARRIED
            session.sendMsg(MsgDef.ServerCmd.MARRIAGE_OPS_MSG, ret_msg)
            matePlayer.sendMsg(MsgDef.ServerCmd.MARRIAGE_OPS_MSG, ret_msg)
            return

        player.tmpInfo['_marry_divorce_apply_'] = None
        matePlayer.tmpInfo['_marry_divorce_apply_'] = None

        myMarryInfo.status = MsgDef.MarryStatusCmd.MARRY_STATUS_DIVORCING
        mateMarryInfo.status = MsgDef.MarryStatusCmd.MARRY_STATUS_DIVORCING

        allFlag = True
        delTime = ffext.getTime() + WEDDING_END_INTERVAL
        # 发送回包
        ret_msg = processMarryOpsMsgRet(
            opstype, session.player,
            MsgDef.MarryStatusCmd.MARRY_STATUS_DIVORCING, 0, '', 0)
        if allFlag:
            ret_msg.delTime = delTime
        player.skillCtrl.deleteSkill(WEDDING_SKILL_ID, True)
        matePlayer.skillCtrl.deleteSkill(WEDDING_SKILL_ID, True)
        from handler import SkillHandler
        SkillHandler.processQuerySkill(session)
        SkillHandler.processQuerySkill(matePlayer.session)
        session.sendMsg(MsgDef.ServerCmd.MARRIAGE_OPS_MSG, ret_msg)
        matePlayer.sendMsg(MsgDef.ServerCmd.MARRIAGE_OPS_MSG, ret_msg)

        #离婚确定定时器
        def divorceCB():
            MarryModel.handleTimerDivorce(marryTotalInfo.marryId)

        if allFlag:
            # 对方也和谐离婚, 定时器开始
            if WEDDING_END_INTERVAL == 1:
                ffext.timer(WEDDING_END_INTERVAL * 100, divorceCB)
            else:
                ffext.timer(WEDDING_END_INTERVAL * 1000, divorceCB)
            marryTotalInfo.tmEndWedding = delTime
            DbService.getPlayerService().updateMarry(
                player.marriageCtrl.marryTotalInfo)
    elif opstype == MsgDef.MarriageClientCmd.MARRY_DIVORCE_QUIT:  #取消离婚
        myMarryInfo = player.marriageCtrl.marryTotalInfo.getInfoByGender(
            player.gender)
        if myMarryInfo.status != MsgDef.MarryStatusCmd.MARRY_STATUS_DIVORCING:
            if player.tmpInfo.get('_marry_divorce_apply_') != None:
                player.tmpInfo['_marry_divorce_apply_'] = None
                ret_msg = processMarryOpsMsgRet(
                    opstype, session.player,
                    MsgDef.MarryStatusCmd.MARRY_STATUS_MARRIED, 0, '')
                session.sendMsg(MsgDef.ServerCmd.MARRIAGE_OPS_MSG, ret_msg)

                mateInfo = player.marriageCtrl.marryTotalInfo.getInfoByAnotherGender(
                    player.gender)
                matePlayer = player.mapObj.getPlayerById(mateInfo.uid)
                if matePlayer:
                    matePlayer.sendMsg(MsgDef.ServerCmd.MARRIAGE_OPS_MSG,
                                       ret_msg)
                return
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG,
                            processErrorMsgRet(opstype, cmd, '未申请和谐离婚!'))
            return
        myMarryInfo.status = MsgDef.MarryStatusCmd.MARRY_STATUS_MARRIED
        mateInfo = player.marriageCtrl.marryTotalInfo.getInfoByAnotherGender(
            player.gender)
        mateInfo.status = MsgDef.MarryStatusCmd.MARRY_STATUS_MARRIED
        DbService.getPlayerService().updateMarry(
            player.marriageCtrl.marryTotalInfo)
        # 发送回包
        ret_msg = processMarryOpsMsgRet(
            opstype, session.player,
            MsgDef.MarryStatusCmd.MARRY_STATUS_MARRIED, 0, '')
        session.sendMsg(MsgDef.ServerCmd.MARRIAGE_OPS_MSG, ret_msg)
        return
    elif opstype == MsgDef.MarriageClientCmd.MARRY_DIVORCE_FORCE:
        # 强制离婚             | 已婚-未婚
        if player.marriageCtrl.marryFlag != MsgDef.MarryStatusCmd.MARRY_STATUS_MARRIED:
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG,
                            processErrorMsgRet(opstype, cmd, '不可以离婚!'))
            return
        needGold = 1000000
        if player.gold < needGold:
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG,
                            processErrorMsgRet(opstype, cmd, "金币不足!"))
            return
        marryTotalInfo = player.marriageCtrl.marryTotalInfo
        if not marryTotalInfo:
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG,
                            processErrorMsgRet(opstype, cmd, '未领取任务!'))
            return
        oldMarryId = marryTotalInfo.marryId
        anotherInfo = marryTotalInfo.getInfoByAnotherGender(player.gender)
        oldMateId = anotherInfo.uid
        matePlayer = player.mapObj.getPlayerById(anotherInfo.uid)
        player.addGold(needGold * -1, True)
        matePlayer.addGold(needGold, True)
        MarryModel.getMarryMgr().delMarryById(marryTotalInfo.marryId)

        mateSession = None
        from handler import SkillHandler
        if matePlayer:
            mateSession = matePlayer.session
            matePlayer.marriageCtrl.divorceForce()
            matePlayer.skillCtrl.deleteSkill(WEDDING_SKILL_ID, True)
            SkillHandler.processQuerySkill(mateSession)
        player.marriageCtrl.divorceForce()

        player.skillCtrl.deleteSkill(WEDDING_SKILL_ID, True)
        SkillHandler.processQuerySkill(session)

        # 发送回包
        ret_msg = processMarryOpsMsgRet(opstype, session.player,
                                        MsgDef.MarryStatusCmd.MARRY_STATUS_NOT,
                                        0, '', needGold)
        session.sendMsg(MsgDef.ServerCmd.MARRIAGE_OPS_MSG, ret_msg)

        if mateSession:
            #up_msg = processMarriageUpdateRet(opstype, player, MsgDef.MarryStatusCmd.MARRY_STATUS_NOT, None)
            mateSession.sendMsg(MsgDef.ServerCmd.MARRIAGE_OPS_MSG, ret_msg)
            return

        # 更新数据库
        DbService.getPlayerService().updateMarryDivorce(oldMarryId)
        DbService.getPlayerService().updateMarryDivorcePlayer(player.uid)
        DbService.getPlayerService().updateMarryDivorcePlayer(oldMateId)
        return
Пример #30
0
def processQieCuoReq(session, msg):
    player = session.player
    if msg.opstype == 0:#0表示请求切磋 1表示同意 2表示拒绝
        destPlayer = player.mapObj.getPlayerById(msg.uidarg)
        if not destPlayer:
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG, buildErrMsg(MsgDef.ClientCmd.QIECUO_OPS, '对手不在线'))
            return
        playerInfo = MsgDef.BrotherPlayerMsg()
        buildPlayerInfo(playerInfo, player)
        retMsg = MsgDef.QieCuoRet(msg.opstype, playerInfo)#0表示请求切磋 1表示同意 2表示拒绝 3表示 切磋状态消失
        destPlayer.sendMsg(MsgDef.ServerCmd.QIECUO_OPS, retMsg)
    elif  msg.opstype == 1:
        destPlayer = player.mapObj.getPlayerById(msg.uidarg)
        if not destPlayer:
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG, buildErrMsg(MsgDef.ClientCmd.QIECUO_OPS, '对手不在线'))
            return
        playerInfo = MsgDef.BrotherPlayerMsg()
        buildPlayerInfo(playerInfo, player)
        retMsg = MsgDef.QieCuoRet(msg.opstype, playerInfo)#0表示请求切磋 1表示同意 2表示拒绝 3表示 切磋状态消失
        destPlayer.sendMsg(MsgDef.ServerCmd.QIECUO_OPS, retMsg)

        playerInfo = MsgDef.BrotherPlayerMsg()
        buildPlayerInfo(playerInfo, destPlayer)
        retMsg = MsgDef.QieCuoRet(msg.opstype, playerInfo)#0表示请求切磋 1表示同意 2表示拒绝 3表示 切磋状态消失
        session.sendMsg(MsgDef.ServerCmd.QIECUO_OPS, retMsg)

        player.ctrlQieCuo.setQieCuoPlayer(destPlayer)
        destPlayer.ctrlQieCuo.setQieCuoPlayer(player)
        ref1 = player.ctrlQieCuo.playerRefQieCuo
        ref2 = destPlayer.ctrlQieCuo.playerRefQieCuo

        def cb():
            player1 = ref1()
            player2 = ref2()
            if player1 and player1.mapObj != None:
                if not player2 or player2.mapObj == None:#player1 win
                    winQieCuo(player1)
                    return
                if player2.ctrlQieCuo.startMap != player2.mapname:
                    winQieCuo(player1)
                    return
                dist = Base.distance(player2.x, player2.y, player2.ctrlQieCuo.startX, player2.ctrlQieCuo.startY)
                if dist >  Base.QIECUO_MAX_RANGE:
                    if player2.ctrlQieCuo.warnTimes == 0:
                        player2.sendMsg(MsgDef.ServerCmd.ERROR_MSG, buildErrMsg(MsgDef.ClientCmd.QIECUO_OPS, '警告!切磋出界3秒后将会被判输!'))
                    player2.ctrlQieCuo.warnTimes += 1
                    if player2.ctrlQieCuo.warnTimes == 4:
                        winQieCuo(player1)
                        return
                else:
                    player2.ctrlQieCuo.warnTimes = 0
                if player2.hp == 1:
                    winQieCuo(player1)
                    return
                if player1.ctrlQieCuo.startMap != player1.mapname:
                    winQieCuo(player2)
                    return
                dist = Base.distance(player1.x, player1.y, player1.ctrlQieCuo.startX, player1.ctrlQieCuo.startY)
                if dist > Base.QIECUO_MAX_RANGE:
                    if player1.ctrlQieCuo.warnTimes == 0:
                        player1.sendMsg(MsgDef.ServerCmd.ERROR_MSG, buildErrMsg(MsgDef.ClientCmd.QIECUO_OPS, '警告!出界3秒后将会被判输!'))
                    player1.ctrlQieCuo.warnTimes += 1
                    if player1.ctrlQieCuo.warnTimes == 4:
                        winQieCuo(player2)
                        return
                else:
                    player1.ctrlQieCuo.warnTimes = 0
                if player1.hp == 1:
                    winQieCuo(player2)
                    return
                ffext.dump('check win ...')
                ffext.timer(1000, cb)
            else:
                if player2:
                    winQieCuo(player2)
                    return
            return
        ffext.timer(1000, cb)
    elif  msg.opstype == 2:
        destPlayer = player.mapObj.getPlayerById(msg.uidarg)
        if not destPlayer:
            session.sendMsg(MsgDef.ServerCmd.ERROR_MSG, buildErrMsg(MsgDef.ClientCmd.QIECUO_OPS, '对手不在线'))
            return
        playerInfo = MsgDef.BrotherPlayerMsg()
        buildPlayerInfo(playerInfo, player)
        retMsg = MsgDef.QieCuoRet(msg.opstype, playerInfo)#0表示请求切磋 1表示同意 2表示拒绝 3表示 切磋状态消失
        destPlayer.sendMsg(MsgDef.ServerCmd.QIECUO_OPS, retMsg)
    return