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
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
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
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
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)
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
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
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
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
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)
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
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
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