def create(guildInfo, srcMap='10002'): ffext.dump(__name__, srcMap) h = GuildCopy(guildInfo) mapObj = MapMgr.getMapMgr().createCopyMap(srcMap, h) h.mapname = mapObj.mapname return mapObj
def useSkill(self, skill, objDest, param): hurtCalcultor = skill.skillCfg.hurtCalcultor ffext.dump('UUUUUUUUUUUUU*********************', skill.skillCfg.skillId, type(hurtCalcultor)) if hurtCalcultor != None: #伤血计算 return hurtCalcultor.exe(self.ownerref(), skill, objDest, param) return '该技能禁止使用'
def addGuildMemberTemp(self, uid, name, level, job): guildMember = PlayerGuildInfo() guildMember.setPlayerGuildInfo(uid, name, MsgDef.GuildPostCmd.MEMBER, 0, 0, level, job) self.allGuildMemberTemp[guildMember.uid] = guildMember ffext.dump(self.allGuildMemberTemp) return
def timercb(): ffext.dump("timercb teamburst...") cb = callbackArg['prizecallback'] if cb: callbackArg['prizecallback'] = None cb() return
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 handleTimerDivorce(marryId): #ffext.dump('marry divorcing handleTimerDivorce', marryId) marryTotalInfo = getMarryMgr().getMarryTotalInfo(marryId) if not marryTotalInfo: return myMarryInfo = marryTotalInfo.getInfoByGender(Base.Gender.MALE) if myMarryInfo.status != MsgDef.MarryStatusCmd.MARRY_STATUS_DIVORCING:#取消了 ffext.dump('marry divorcing handleTimerDivorce cancel', marryId) return getMarryMgr().delMarryById(marryTotalInfo.marryId) husbend = marryTotalInfo.coupleData[0].getPlayer() wife = marryTotalInfo.coupleData[1].getPlayer() from handler import MarryHandler opstype = MsgDef.MarriageClientCmd.MARRY_DIVORCE_NORMAL if husbend: husbend.marriageCtrl.divorceForce() ret_msg = MarryHandler.processMarryOpsMsgRet(opstype, husbend) husbend.sendMsg(MsgDef.ServerCmd.MARRIAGE_OPS_MSG, ret_msg) if wife: wife.marriageCtrl.divorceForce() ret_msg = MarryHandler.processMarryOpsMsgRet(opstype, wife) wife.sendMsg(MsgDef.ServerCmd.MARRIAGE_OPS_MSG, ret_msg) # 更新数据库 DbService.getPlayerService().updateMarryDivorce(marryTotalInfo.marryId) DbService.getPlayerService().updateMarryDivorcePlayer(marryTotalInfo.coupleData[0].uid) DbService.getPlayerService().updateMarryDivorcePlayer(marryTotalInfo.coupleData[1].uid)
def brotherInfo(ret): ffext.dump('brother init', ret.result) if ret.flag == False or len(ret.result) == 0: self.allBrotherList = {} return for i in range(0, len(ret.result)): brotherID = long(ret.result[i][0]) if None == self.getBrotherById(brotherID): brotherCtrl = BrotherCtrl() brotherCtrl.bid = brotherID brotherCtrl.allBrothers = {} brotherCtrl.flag = True extra = str(ret.result[i][1]) if extra != '': extra = json.loads(extra) if extra: brotherCtrl.extra = extra brotherCtrl.ranking = 0 self.allBrotherList[brotherCtrl.bid] = brotherCtrl brotherCtrl = self.getBrotherById(brotherID) playerBrotherInfo = PlayerBrotherInfo() playerBrotherInfo.setPlayerBrother(long(ret.result[i][2]), str(ret.result[i][3]), long(ret.result[i][4]), long(ret.result[i][5]), long(ret.result[i][6])) brotherCtrl.allBrothers[ playerBrotherInfo.uid] = playerBrotherInfo return
def randsuit(session, args): xiongJiaCfgId = 0 xiongJiaItem = session.player.itemCtrl.allEquiped.get( Base.EQUIP_XIONGJIA_POS, None) from handler import ItemHandler if xiongJiaItem: ffext.dump('randsuit...', xiongJiaItem.uid) ItemHandler.processUnEquipItem(session, MsgDef.EquipOpsReq(xiongJiaItem.uid)) session.player.itemCtrl.delItem(xiongJiaItem.uid) itemCfgId = 30111113 canUseCfgId = [] needlv = 10 #session.player.level randomLv = [1, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50] lv = randomLv[random.randint(0, len(randomLv) - 1)] sql = "SELECT cfgid FROM equipprop WHERE itemtype = 103 AND job = " + str( session.player.job) + " and name like '%" + str(lv) + "级-品质1-1套'" db = ffext.allocDbConnection('cfg', ffext.getConfig('-cfg')) ret = db.queryResult(sql) if ret: result = ret.result ffext.dump('result:', result) randRow = result[random.randint(0, len(result) - 1)] itemCfgId = int(randRow[0]) item = session.player.itemCtrl.addItemByCfgId(itemCfgId) ItemHandler.processEquipItem(session, MsgDef.EquipOpsReq(item.uid))
def create(srcMap = '10002'): ffext.dump(__name__, srcMap) h = ArenaCopy() mapObj = MapMgr.getMapMgr().createCopyMap(srcMap, h) h.mapname = mapObj.mapname return mapObj
def create(attackGuild, defendGuild, mgr, srcMap=CITYWAR_MAP_ID): ffext.dump(__name__, srcMap) h = CityWarCopy(attackGuild, defendGuild, mgr) mapObj = MapMgr.getMapMgr().createCopyMap(srcMap, h) h.mapname = mapObj.mapname return mapObj
def checkNewTask(self, player): taskCtrl = player.taskCtrl for taskType, destList in self.type2Task.iteritems(): ffext.dump('checkNewTask', player.name, taskType) if taskType not in (TaskType.MAIN_TASK, TaskType.BRANCH_TASK): continue if None != taskCtrl.getTaskByType(taskType): continue tid = destList[0].taskId if taskType == TaskType.BRANCH_TASK: taskCfg = self.getCfgById(tid) if not taskCfg: continue if taskCfg.needLevel > player.level: continue status = TaskStatus.INIT task = taskCtrl.addTaskById(tid, True, status) if taskType == TaskType.MAIN_TASK: taskCtrl.acceptTask(task.taskId) #第一个主线任务发对白 cfg = task.taskCfg if cfg.acceptdialog: player.sendMsg(MsgDef.ServerCmd.SHOW_PLAY, MsgDef.ShowPlayRet(cfg.acceptdialog)) elif cfg.acceptplay: player.sendMsg(MsgDef.ServerCmd.SHOW_PLAY, MsgDef.ShowPlayRet(cfg.acceptplay)) ffext.info('uid=%d taskCtrl.addTaskById=%d' % (player.uid, tid)) return True
def onEnd(self): ffext.dump('CopyMapHandler onEnd', self.mapname) mapObj = MapMgr.getMapMgr().allocMap(self.mapname) ffext.dump('CopyMapHandler mapObj.allPlayer', len(mapObj.allPlayer)) for k, v in mapObj.allPlayer.iteritems(): v.sendMsg(MsgDef.ServerCmd.COPYMAP_END, MsgDef.CopymapEndRet(0, 0, 0, [])) MapMgr.getMapMgr().closeCopyMap(self.mapname, '10001', 47, 171)
def traceTarge(monster, destX, destY, dist = 0): srcX = monster.x srcY = monster.y destDirection = Base.getDirection(srcX, srcY, destX, destY) #ffext.dump('move traceTarge', monster.name, srcX, srcY, destX, destY, destDirection) selectList = Base.MOVE_HELP_DIRECTION[destDirection] for direction in selectList: len = 1 if dist >= 5: len = 5 elif dist >= 3: dist = 2 else: len = 1 newX, newY = Base.getPosByDirection(srcX, srcY, direction, len) monster.direction = direction if True == monster.mapObj.moveMonster(monster, newX, newY): return True else: newX, newY = Base.getPosByDirection(srcX, srcY, direction, 1) if True == monster.mapObj.moveMonster(monster, newX, newY): return True else: ffext.dump('move failed', monster.name, srcX, srcY, newX, newY, direction) return False
def doCallBack(self, callbackId): ffext.dump('doCallBack', callbackId, self.callbackFuncs) func = self.callbackFuncs.pop(callbackId, None) if None != func: func[0](self, func[1]) return True return False
def saveMailOffline(uid, mail): mailStr = mail.toJsonStr() if not mailStr or mailStr == '': return ffext.dump('mailStr', mailStr) DbService.getPlayerService().updateMail4Extend(uid, mailStr) return
def sevenData2Cfg(self, row): id = int(row[0]) loginDay = int(Base.parseStrBetween(row[1], '登录第', '天')) sevenCfg = SevenLoginRewardCfg(id, loginDay, row[2], int(row[3]), row[4], int(row[5])) ffext.dump(id, row[1], sevenCfg.loginDay) return sevenCfg
def monsterLeaveMap(self, monster): #怪物消失 if monster.mapObj: ffext.dump('monsterLeaveMap', monster.name, monster.x, monster.y) ret = ffext.ff.obj_leave(monster, monster.uid, True) if ret != 0: return False monster.mapObj = None return monster
def onEnd(self): ffext.dump('CopyMapHandler onEnd', self.mapname) mapObj = MapMgr.getMapMgr().allocMap(self.mapname) ffext.dump('CopyMapHandler mapObj.allPlayer', mapObj.getPlayerNum()) #for k, v in mapObj.allPlayer.iteritems(): # v.sendMsg(MsgDef.ServerCmd.COPYMAP_END, MsgDef.CopymapEndRet(0, 0, 0, [])) MapMgr.getMapMgr().closeCopyMap(self.mapname, '10001', 74, 35) self.guildInfo.closeCopyMap()
def fromData(self, result): ffext.dump('petctrl fromdata', result) player = self.ownerref() for row in result: pet = Pet(player) if True == pet.fromData(row): self.allPet[pet.uid] = pet return True
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
def updateGuildRankWarInvitedOverTime(self, memberUid, overTime, callback=None): sql = "update guildmemberinfo set rankWarInvitedOverTime = %d where uid = %d " % ( overTime, memberUid) ffext.dump("sql", sql) DbServiceBase.getDB().query(sql, callback) return True
def cbNewUser(retNew): accountId = long(retNew.result[0][0]) session.user.accountid = accountId ffext.dump('cbNewUser', retNew, accountId) # 登录(new)-记录log LogModel.logLoginData(accountId, 0, '', LogModel.LoginOpType.LOGIN_ACCOUNT, LogModel.LoginReason.NEW_LOGIN) return
def getDefaultSkillList(self, job): skillType = skillId2Type((job)*100+10) ffext.dump('get default skill type', skillType) ret = [self.getCfgByTypeLevel(skillType, 1)]#默认给一个1级的技能 skillType2= skillType + 10 cfg2 = self.getCfgByTypeLevel(skillType2, 0) if None != cfg2: ret.append(cfg2) return ret
def __init__(self, cfg, mapname, width, height, allPos, keyName=None): self.cfg = cfg #self.keyName = mapname#唯一性地图名 self.showName = '' self.mapname = mapname self.tmxFilePath = '' #地图文件名 if keyName != None: self.mapname = str(keyName) self.width = width self.height = height self.allPos = allPos #地图上所有点,index = Y * width + X self.allMovePos = [] #所有可以移动的点,方便随机 self.allBlock = [] #地图被分成大格子,方便广播 self.copyMapHandler = None #副本处理事件的对象 #先生成block点 self.blockWidth = int(math.ceil(self.width * 1.0 / Base.MAP_BLOCK_SIZE)) self.blockHeight = int( math.ceil(self.height * 1.0 / Base.MAP_BLOCK_SIZE)) for y in range(self.blockHeight): for x in range(self.blockWidth): self.allBlock.append(MapBlock()) def calBlockIndex(x, y): blockX = int(math.ceil(x * 1.0 / Base.MAP_BLOCK_SIZE)) if blockX > 0: blockX -= 1 blockY = int(math.ceil(y * 1.0 / Base.MAP_BLOCK_SIZE)) if blockY > 0: blockY -= 1 return blockY * self.blockWidth + blockX #整理一下数据结构 for y in range(self.height): for x in range(self.width): index = y * width + x if index >= len(self.allPos): ffext.dump('MapObj init out range', x, y) continue val = self.allPos[index] # if x == 85 and y == 165: # ffext.dump('MapObj init x, y, val',x, y, val) # if x == 27 and y == 4: # ffext.dump('MapObj init x, y, val',x, y, val) if val == 0: self.allPos[index] = None else: self.allMovePos.append((x, y)) self.allPos[index] = MapPos(calBlockIndex(x, y)) #存储id-> obj #上次更新怪物的时间 self.lastMonsterUpdateMs = 0
def addBrother(self, bid, uid1, uid2, uid3): sql = "insert into brother (bid, uid1, uid2, uid3, extra) values (%d, %d, %d, %d, '') " % ( bid, uid1, uid2, uid3) ffext.dump(sql) DbServiceBase.getDB().query(sql) sql = 'update player set brotherid =%d where uid in (%d,%d,%d)' % ( bid, uid1, uid2, uid3) DbServiceBase.getDB().query(sql) ffext.dump(sql) return True
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)
def create(srcMap='10002'): ffext.dump(__name__, srcMap) h = TestCopy() mapObj = MapMgr.getMapMgr().createCopyMap(srcMap, h) h.mapname = mapObj.mapname for k in MonsterModel.getMonsterMgr().mnstergen: MonsterModel.genMonster(mapObj.mapname, k[1], k[2], k[3], k[4], k[5], k[6]) break return mapObj
def init(self): #读取配置 db = ffext.allocDbConnection('cfg', ffext.getConfig('-cfg')) ret = db.queryResult( 'select quality,level,expMax,needlevel,hp,mp,physic_attack_min,physic_attack_max,magic_attack_min,magic_attack_max,physic_defend_min,physic_defend_max,\ magic_defend_min,magic_defend_max,crit,hit,avoid,attackspeed,attacksing,attackinterval,attackdistance,movespeed,hurtabsorb,hpabsorb, cfgid from pet' ) self.allCfg = {} def toNum(s, d=0): if s != '': return int(s) return d def toFloat(s, d=0.0): if s != '': m = s.replace('%', '') return float(m) return d for row in ret.result: cfg = PetCfg() cfg.quality = row[0] cfg.level = int(row[1]) cfg.expMax = toNum(row[2]) cfg.needlevel = toNum(row[3]) cfg.hp = toNum(row[4]) cfg.mp = toNum(row[5]) cfg.physicAttackMin = toNum(row[6]) cfg.physicAttackMax = toNum(row[7]) cfg.magicAttackMin = toNum(row[8]) cfg.magicAttackMax = toNum(row[9]) cfg.physicDefendMin = toNum(row[10]) cfg.physicDefendMax = toNum(row[11]) cfg.magicDefendMin = toNum(row[12]) cfg.magicDefendMax = toNum(row[13]) cfg.crit = int(toFloat(row[14]) * Base.CRIT_RATE_BASE / 100) cfg.hit = int(toFloat(row[15]) * Base.HIT_RATE_BASE / 100) cfg.avoid = int(toFloat(row[16]) * Base.AVOID_RATE_BASE / 100) cfg.attackspeed = toNum(row[17]) cfg.attacksing = toNum(row[18]) cfg.attackinterval = toNum(row[19]) cfg.attackdistance = toNum(row[20]) cfg.movespeed = toNum(row[21]) cfg.hurtabsorb = toNum(row[22]) cfg.hpabsorb = toNum(row[23]) cfg.petType = self.str2Type[cfg.quality] destDict = self.allCfg.get(cfg.petType) cfg.cfgid = toNum(row[24]) if None == destDict: destDict = {} self.allCfg[cfg.petType] = destDict destDict[cfg.level] = cfg self.id2cfg[cfg.cfgid] = cfg ffext.dump('load pet num=%d' % (len(ret.result))) return True
def processUpdateSkillPosReq(session, msg): ffext.dump('processUpdateSkillPosReq', msg) player = session.player for pos,skillId in msg.skill2pos.iteritems(): skill = player.skillCtrl.getSkillById(skillId) if not skill: session.sendMsg(MsgDef.ServerCmd.ERROR_MSG, buildErrMsg(MsgDef.ClientCmd.UPDATE_SKILL_POS, '技能不存在')) continue skill.position = pos session.sendMsg(MsgDef.ServerCmd.UPDATE_SKILL_POS, MsgDef.UpdateSkillPosRet(msg.skill2pos)) return
def onWeeklyNightEvent(self): ffext.dump( "***************** New Week Process Begin ... ******************:", ffext.getTime()) #所有在线玩家对象,每日refresh ffext.getSessionMgr().foreach(self.weeklyRefresh4Session) ffext.dump( "***************** New Week Process End ... ******************:", ffext.getTime()) return True