예제 #1
0
def processTransferPointOpsReq(session, msg):
    print('processTransferPointOpsReq', msg)
    player = session.player
    destCfg = MapMgr.getMapMgr().getTransferPointCfg(msg.cfgid)
    if not destCfg:
        session.sendMsg(
            MsgDef.ServerCmd.ERROR_MSG,
            buildErrMsg(MsgDef.ClientCmd.TRANSFER_POINT_OPS,
                        Base.lang('传送点不存在')))
        return
    #添加player到地图管理器中
    mapObj = MapMgr.getMapMgr().allocMap(destCfg.tomapid)
    if not mapObj:
        ffext.error('processTransferPointOpsReq %s not exist' %
                    (str(destCfg.tomapid)))
        session.sendMsg(
            MsgDef.ServerCmd.ERROR_MSG,
            buildErrMsg(MsgDef.ClientCmd.TRANSFER_POINT_OPS,
                        Base.lang('传送点不存在!')))
        return
    # if msg.cfgid == 7:#TODO
    #     from model.copymap import TestCopy
    #     mapObj = TestCopy.create(destCfg.tomapid)
    ffext.dump('transfer ', mapObj.mapname, mapObj.showName)
    if mapObj.showName.find('副本') >= 0:
        player.taskCtrl.trigger(Base.Action.COPY_MAP, int(mapObj.mapname), 1)
    mapObj.playerEnterMap(player, destCfg.tox, destCfg.toy)
    return
예제 #2
0
 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
예제 #3
0
 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
예제 #4
0
 def playerLeaveMap(self, player, msgToSelf=True):
     #ffext.dump('playerLeaveMap', player.name)
     ret = ffext.ff.obj_leave(player, player.uid, msgToSelf)
     if ret != 0:
         return False
     player.mapObj = None
     if ret == 0 and self.copyMapHandler:
         try:
             self.copyMapHandler.handleObjLeave(self, player)
         except:
             ffext.error(
                 'self.copyMapHandler.handleObjLeave failed mapname=%s player=%s'
                 % (self.mapname, player.name))
     return True
예제 #5
0
def genMonsterById(mapName,
                   monId,
                   x,
                   y,
                   num,
                   rangeMax,
                   rebornSec=10,
                   autoattackFlag=0):
    ret = []
    propCfg = getMonsterMgr().getCfgById(monId)
    if not propCfg:
        ffext.error('propCfg not found mosnterid=%d' % (monId))
        return ret
    return genMonster(mapName, propCfg.name, x, y, num, rangeMax, rebornSec,
                      autoattackFlag)
예제 #6
0
파일: NpcModel.py 프로젝트: fanchy/spython
    def init(self):  #读取任务配置
        name2DuiBai = self.readdNpcDuibaiCfg()
        db = ffext.allocDbConnection('cfg', ffext.getConfig('-cfg'))
        ret = db.queryResult(
            'select name,appr,mapid,x,y,script,direction,cfgid from npc')
        self.allCfg = {}
        for row in ret.result:
            npcCfg = NpcCfg()
            npcCfg.name = row[0]
            npcCfg.appr = int(row[1])
            npcCfg.mapname = row[2]
            npcCfg.x = int(row[3])
            npcCfg.y = int(row[4])
            npcCfg.script = row[5]
            npcCfg.direction = int(row[6])
            npcCfg.cfgid = int(row[7])
            npcCfg.defaultDuiBai = name2DuiBai.get(npcCfg.name,
                                                   '勇士你好!我是%s' % (npcCfg.name))
            self.allCfg[npcCfg.cfgid] = npcCfg
            mapObj = MapMgr.getMapMgr().allocMapByFile(npcCfg.mapname)
            if not mapObj:
                ffext.warn(
                    'gen npc failed name=%s, script=%s, map=%s not in this gs'
                    % (npcCfg.name, npcCfg.script, npcCfg.mapname))
            #ffext.dump('load npc ', npcCfg)
            npc = Npc()
            npc.name = npcCfg.name
            npc.appr = npcCfg.appr
            npc.mapname = npcCfg.mapname
            npc.script = npcCfg.script
            npc.direction = npcCfg.direction
            npc.cfg = npcCfg
            try:
                npc.scriptMod = __import__('npc.' + npc.script,
                                           fromlist=[npc.script])

            except:
                ffext.error(
                    'gen npc failed name=%s, script=%s map=%s,%d,%d' %
                    (npc.name, npc.script, npcCfg.mapname, npcCfg.x, npcCfg.y))
            try:
                mapObj.npcEnterMap(npc, npcCfg.x, npcCfg.y)
            except:
                ffext.error(
                    'gen npc failed2 name=%s, script=%s map=%s,%d,%d' %
                    (npc.name, npc.script, npcCfg.mapname, npcCfg.x, npcCfg.y))
        ffext.dump('load npc num=%d' % (len(self.allCfg)))
        return True
예제 #7
0
def strToBurstGroupCfg(data, burstType=0):
    ret = BurstGroupCfg(burstType)
    allArgs = data.strip().split(';')
    for k in allArgs:
        args = k.strip().split('/')
        if len(args) == 0 or args[0] == '':
            continue
        itemName = args[0].split('*')
        burstCfg = BurstRateCfg(itemName[0])
        if len(itemName) >= 2:
            burstCfg.burstNum = int(itemName[1])
        if len(args) >= 2:
            try:
                burstCfg.burtRate = int(args[1])
            except:
                ffext.error('parse monster burst rate failed %s' % (data))
                pass
            pass
        if len(args) >= 3:
            burstCfg.burtRateTatal = int(args[2])
        ret.allBurstCfg.append(burstCfg)
    return ret
예제 #8
0
    def whenDie(self, objAttack):
        #怪物被击杀,给对方加经验
        self.tmpInfo['_killedtm_'] = ffext.getTimeMs()
        if not objAttack or objAttack.getType() != Base.PLAYER:
            return
        if self.mapObj and self.mapObj.copyMapHandler:
            try:
                self.mapObj.copyMapHandler.handleObjDie(self.mapObj, self)
            except:
                ffext.error(
                    'mapObj.copyMapHandler.handleObjDie failed mapname=%s player=%s'
                    % (self.mapObj.mapname, self.name))
        self.handleTaskTrigger(objAttack)
        self.handleDrop(objAttack)
        #测试方便,每次被击杀,掉落一个大补丸
        #item   = ItemModel.createItemByName('大补丸(小)')

        #try:
        #except:
        #    ffext.error('mosnter burst exception %s'%(self.name))

        return
예제 #9
0
 def whenDie(self, objAttack):
     if objAttack.getType() == Base.PLAYER:
         try:  #增加仇人
             if objAttack.uid not in self.friendCtrl.getEnemy():
                 DbService.getFriendService().addEnemy(
                     self.uid, objAttack.uid, 0)
                 self.friendCtrl.addEnemy(objAttack)
                 from handler import FriendHandler
                 opstype = MsgDef.FriendOpsClientCmd.ADD_ENEMY
                 self.sendMsg(
                     MsgDef.ServerCmd.FRIEHND_MSG,
                     FriendHandler.processFriendPlayerMsgRet(
                         opstype, objAttack.uid, objAttack.name,
                         objAttack.job, objAttack.gender, objAttack.level,
                         True))
         except:
             ffext.error('whenDie error %s' % (self.name))
         pksinVal = 100
         if objAttack.guildCtrl.GuildRankWarWhenKillOther(self):  #行会排名战
             pksinVal = 0
         if objAttack.guildCtrl.GuildWarWhenKillOther(self):  #行会战进行中
             pksinVal = 0
         if pksinVal > 0:
             objAttack.pkSinValue += pksinVal
             #更新pk罪恶值
             objAttack.broadcast(
                 MsgDef.ServerCmd.PK_SIN_UPDATE_OPS,
                 MsgDef.PkSinUpdateRet(0, objAttack.pkSinValue,
                                       objAttack.uid)
             )  #objAttack.sendMsg(MsgDef.ServerCmd.PK_SIN_UPDATE_OPS, MsgDef.PkSinUpdateRet(0, objAttack.pkSinValue))
     self.processDrop()
     if self.mapObj and self.mapObj.copyMapHandler:
         #try:
         self.mapObj.copyMapHandler.handleObjDie(self.mapObj, self)
         #except:
         #ffext.error('mapObj.copyMapHandler.handleObjDie failed mapname=%s player=%s'%(self.mapObj.mapname, self.name))
     self.handleReborn()
     return
예제 #10
0
    def addTaskById(self, taskId, saveFlag=True, status=0):
        taskCfg = getTaskMgr().getCfgById(taskId)
        if not taskCfg:
            ffext.error('not found taskId=%d' % (taskId))
            return None

        task = Task()
        task.setCfg(taskCfg)
        task.status = status

        acceptNpc = taskCfg.acceptNpc
        finishNpc = taskCfg.finishNpc
        npcData = self.npc2task.get(acceptNpc)
        if npcData == None:
            self.npc2task[acceptNpc] = {taskId: weakref.ref(task)}
        else:
            npcData[taskId] = weakref.ref(task)
        npcData = self.npc2task.get(finishNpc)
        if npcData == None:
            self.npc2task[finishNpc] = {taskId: weakref.ref(task)}
        else:
            npcData[taskId] = weakref.ref(task)
        return self.addTask(task, saveFlag)
예제 #11
0
def genMonster(mapName,
               monName,
               x,
               y,
               num,
               rangeMax,
               rebornSec=10,
               autoattackFlag=0):
    ret = []
    propCfg = getMonsterMgr().getCfgByName(monName)
    if not propCfg:
        ffext.error('propCfg not found mosntername=%s' % (monName))
        return ret
    mapObj = MapMgr.getMapMgr().allocMap(mapName)
    if None == mapObj:
        ffext.error('mon gen map failed %s %s %d %d %d %d' %
                    (mapName, monName, x, y, num, rangeMax))
        return ret
    for i in range(num):
        mon = Monster(propCfg)
        #mon.showName = monName
        mon.aiFlag = autoattackFlag
        mon.bornX = x
        mon.bornY = y
        rangeMinX = -1 * rangeMax
        if mon.bornX + rangeMinX < 0:
            rangeMinX = -1 * mon.bornX
        rangeMinY = -1 * rangeMax
        if mon.bornY + rangeMinY < 0:
            rangeMinY = -1 * mon.bornY
        newPos = None
        for kk in range(rangeMax * rangeMax):
            x = mon.bornX + random.randint(rangeMinX, rangeMax)
            y = mon.bornY + random.randint(rangeMinY, rangeMax)

            bFlag = mapObj.canMove(x, y)
            if bFlag:
                mon.bornX = x
                mon.bornY = y
                break

        if not mapObj.monsterEnterMap(mon, mon.bornX, mon.bornY):
            ffext.error(
                'mon gen pos failed %s %s %d %d %d %d' %
                (mapName, monName, mon.bornX, mon.bornY, num, rangeMax))
            continue
        mon.fsm.changeState(ffext.singleton(MonsterAI.StateIdle))
        mon.rebornSec = rebornSec
        #print('genMonster=%s'%(mon))
        ffext.info('genMonster name=%s,map=%s,x=%d,y=%d' %
                   (monName, mapName, x, y))
        ret.append(mon)
    return ret
예제 #12
0
    def init(self):  #读取任务配置
        db = ffext.allocDbConnection('cfg', ffext.getConfig('-cfg'))
        ret = db.queryResult(
            'select id,name,lastid,task_type,action,jie_npc,jiao_npc,mubiao,show_jie,show_jiao, jie_duibai,jiao_duibai,jie_juqing,complete_juqing,jiao_juqing,jl_exp,jl_coin,mubiao_name,mubiao_num,level,branch_id, jie_gei_daoju from task'
        )
        self.allTaskCfg = {}  #taskid -> TaskCfg
        self.type2Task = {}  #tasktype -> list<TaskCfg>

        for i in range(0, len(ret.result)):
            row = ret.result[i]
            taskCfg = TaskCfg()
            taskCfg.taskId = Base.str2Int(row[0])
            taskCfg.name = row[1]
            taskCfg.desc = row[7]
            preTaskId = Base.str2Int(row[2])
            taskCfg.needLevel = Base.str2Int(row[19])
            taskCfg.taskType = Base.str2Int(row[20])  #TaskType.MAIN_TASK
            action = Base.str2Action(row[4])
            taskCfg.action = action
            taskCfg.object = 0
            taskCfg.value = 1
            if action == Base.Action.KILL_MONSTER:
                taskCfg.object = 101  #TODO
            elif action == Base.Action.COPY_MAP:
                taskCfg.object = 10005  #TODO
            if action == Base.Action.NONE_ACTION:
                ffext.error(
                    'Task.Init failed taskid = %d not support action = %s' %
                    (taskCfg.taskId, row[4]))
                continue
            elif action == Base.Action.KILL_MONSTER:
                objectStr = row[7]
                monsterName = row[
                    17]  #objectStr.decode('utf-8')[2:].encode('utf-8')
                taskCfg.value = int(row[18])
                #monsterName = row[7][:4]
                monCfg = MonsterModel.getMonsterMgr().getCfgByName(monsterName)
                if None == monCfg:
                    ffext.error(
                        'Task.Init failed taskid = %d not support monsterName = %s [%s]'
                        % (taskCfg.taskId, row[7], monsterName))
                    taskCfg.object = 0
                    #return  False
                else:
                    taskCfg.object = monCfg.cfgId
                #ret2 = db.queryResult("update maintask set targetName = '%s', targetNum = 1 where taskid = %d"%(monsterName, taskCfg.taskId))
                #ffext.dump('*************', monsterName, taskCfg.object)
            elif action == Base.Action.COLLECT:
                objectStr = row[7]
                itemName = row[
                    17]  #objectStr.decode('utf-8')[2:].encode('utf-8')
                from model import ItemModel
                itemCfg = ItemModel.getItemMgr().getCfgByName(itemName)
                if itemCfg:
                    taskCfg.object = itemCfg.cfgId
                taskCfg.value = int(row[18])
                #ret2 = db.queryResult("update maintask set targetName = '%s', targetNum = 1 where taskid = %d"%(itemName, taskCfg.taskId))
                #ffext.dump('*************', itemName, taskCfg.object)

            taskCfg.nextTaskId = 0

            taskCfg.acceptshow = row[8]  #接任务NPC面板显示
            taskCfg.finishshow = row[9]  #交任务NPC面板显示
            #'select id,name,lastid,task_type,action,jie_npc,jiao_npc,mubiao,show_jie,show_jiao,'
            #'jie_duibai,jiao_duibai,jie_juqing,complete_juqing,jiao_juqing,jl_exp,jl_coin,mubiao_name,mubiao_num from task')
            if row[10] != '':
                taskCfg.acceptdialog = int(row[10])  #接任务剧情对白id jie_duibai
            if row[11] != '':
                taskCfg.finishdialog = int(row[11])  #jiao_duibai
            if row[12] != '':
                taskCfg.acceptplay = int(row[12])  #接任务插入剧情id jie_juqing

            #if row[11] != '':
            #    taskCfg.completedialog = int(row[11]) #目标完成剧情对白id
            if row[13] != '':
                taskCfg.completeplay = int(row[13])  #条件达成剧情id complete_juqing
            if row[14] != '':
                taskCfg.finishplay = int(row[14])  #交任务插入剧情id complete_juqing
            taskCfg.exp = int(row[15])  #经验奖励
            taskCfg.gold = int(row[16])  #金币奖励
            if preTaskId == taskCfg.taskId:
                preTaskId = 0
            if i != 0 and preTaskId != 0:
                if self.allTaskCfg.get(preTaskId) == None:
                    ffext.error('tid %d  前置任务 %d 不存在' %
                                (taskCfg.taskId, preTaskId))
                    continue
                self.allTaskCfg[preTaskId].nextTaskId = taskCfg.taskId
            if row[5].isdigit():
                taskCfg.acceptNpc = int(row[5])
            if row[6].isdigit():
                taskCfg.finishNpc = int(row[6])
            taskCfg.itemGiveAccept = row[21]

            self.allTaskCfg[taskCfg.taskId] = taskCfg
            cfg = self.type2Task.get(taskCfg.taskType)
            if not cfg:
                self.type2Task[taskCfg.taskType] = [taskCfg]
            else:
                cfg.append(taskCfg)
        ffext.dump('load task num=%d' % (len(ret.result)))
        return True
예제 #13
0
def init():
    #pdb.set_trace()
    print('scene init......')
    #if ffext.is_enable_option('-d'):
    #ffext.ENABLE_DUMP = False
    if not idtool.init(ffext.getConfig('-db')):
        ffext.error('idtool init failed:' + ffext.getConfig('-db'))
        return -1
    if not DbServiceBase.init():
        ffext.error('scene init failed when DbService.init......')
        return -1

    if not GlobalRecordModel.getGlobalRecordMgr().init():
        ffext.error(
            'scene init failed when GlobalRecordModel.getGlobalRecordMgr().init......'
        )
        return -1
    if not MapMgr.getMapMgr().init(TOPDIR):
        ffext.error('scene init failed when MapMgr.getMapMgr().init......')
        return -1
    if not PlayerModel.getPlayerMgr().init():
        ffext.error(
            'scene init failed when PlayerModel.getPlayerMgr().init......')
        return -1
    if not SkillModel.getSkillMgr().init():
        ffext.error(
            'scene init failed when SkillModel.getSkillMgr().init()......')
        return -1
    if not SkillModel.getSkillMgr().initMonster():
        ffext.error(
            'scene init failed when SkillModel.getSkillMgr().initMonster()......'
        )
        return -1
    if not ItemModel.getItemMgr().init():
        ffext.error(
            'scene init failed when ItemModel.getItemMgr().init().....')
        return -1

    #ffext.dump("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
    #pdb.set_trace()

    if not MonsterModel.getMonsterMgr().loadCfg():
        ffext.error('scene init failed when MonsterModel.loadCfg()......')
        return -1

    #pdb.set_trace()
    #ffext.dump("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb")
    #pdb.set_trace()
    if not TaskModel.getTaskMgr().init():
        ffext.error(
            'scene init failed when TaskModel.geTaskMgr().init()......')
        return -1

    #print "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    #pdb.set_trace()

    #读取NPC 配置
    if not NpcModel.getNpcMgr().init():
        ffext.error('scene init failed when NpcModel.getMgr().init()......')
        return -1
    if not PetModel.getPetMgr().init():
        ffext.error('scene init failed when PetModel.getMgr().init()......')
        return -1

    #读取行会配置
    if not GuildModel.getGuildMgr().init():
        ffext.error('scene init failed when GuildModel.getMgr().init()......')
        return -1
    if not TeamModel.getBrotherMgr().init():
        ffext.error(
            'scene init failed when BrotherModel.getBrotherMgr().init()......')
        return -1
    if not MarryModel.getMarryMgr().init():
        ffext.error(
            'scene init failed when MarryModel.getMarryMgr().init......')
        return -1
    if not RankModel.getRankMgr().init():
        ffext.error('scene init failed when RankModel.getRankMgr().init......')
        return -1

    # 读取每日登录配置
    if not LoginRewardModel.getLoginRewardMgr().init():
        ffext.error(
            'scene init failed when LoginRewardModel.getLoginRewardMgr().init......'
        )
        return -1
    if not ArenaModel.getArenaMgr().init():
        ffext.error('scene init failed when ArenaModel.init......')
        return -1

    #print "xxxxxxxx"
    #pdb.set_trace()
    ffext.timer(1000, MonsterModel.onTimer)
    MapMgr.getMapMgr().initTimer()
    #db.set_trace()
    ffext.timer(5000, PlayerModel.autoRecoverHpMp)
    GuildModel.getGuildMgr().initTimer()
    #print "autcitonTimer"
    #pdb.set_trace()
    ffext.timer(30000, ItemModel.auctionOnTimer)
    #pdb.set_trace()
    return 0