def my_session_enter(session_id, from_scene, extra_data): content = '<font color="#ff0000">[%s %s] online </font>'%(session_id, GetNowTime()) ffext.broadcast_msg_session(1, content) player = player_t(session_id) ffext.singleton(player_mgr_t).add(session_id, player) ffext.broadcast_msg_session(1, '<font color="#ff0000">当前在线:</font>') ffext.broadcast_msg_session(1, ffext.singleton(player_mgr_t).idlist())
def real_session_verify(session_key, online_time, ip, gate_name): ''' ''' account = msg_def.account_t() ffext.decode_buff(account, session_key) player = player_t() player.nick_name = account.nick_name player.password = account.password #注册账号请求 if account.register_flag == True: if False == dbservice.register_player(player): return [] elif False == dbservice.verify_password(player): return [] player.online_time = online_time player.ip = ip player.gate_name = gate_name ffext.singleton(player_mgr_t).add(player.id(), player) print('real_session_verify用户名[%s]对应的id[%d]' % (player.nick_name, player.id())) #异步载入数据库中的数据 def callback(): print('real_session_verify载入数据库数据完成%s' % (player.nick_name)) dbservice.load_player(player, callback) return [str(player.id())]
def my_session_offline(session_id, online_time): content = '<font color="#ff0000">[%s %s] offline </font>' % (session_id, GetNowTime()) ffext.broadcast_msg_session(1, content) ffext.singleton(player_mgr_t).remove(session_id) ffext.broadcast_msg_session(1, '<font color="#ff0000">当前在线:</font>') ffext.broadcast_msg_session(1, ffext.singleton(player_mgr_t).idlist())
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 real_session_enter(session_id, from_scene, extra_data): ffext.TRACE('real_session_enter begin session_id=%d' % (session_id)) player = ffext.singleton(player_mgr_t).get(session_id) #广播所有人,上线了 def broadcast_msg(player_other): pass ffext.singleton(player_mgr_t).foreach_except(broadcast_msg, session_id) #发送当前房间的所有数据 return 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
def process_test(session_id, msg): ffext.send_msg_session(session_id, 1, '<font color="#ff0000">测试单播接口 cmd=2!'\ '</font>') player = ffext.singleton(player_mgr_t).get(session_id) player.inc_chat_times() if player.get_chat_times() > 30: ffext.close_session(session_id)
def update(self, monster, nowMs): #ffext.dump('ai attack update', monster.name, monster.x, monster.y, monster.direction) if monster.hp <= 0: monster.fsm.changeState(ffext.singleton(StateIdle)) return True enemyObj = None if monster.objTarget != None: enemyObj = monster.objTarget() if not enemyObj or enemyObj.isDeath() or enemyObj.mapObj == None: monster.objTarget = None enemyObj = monster.selectEnemy() if enemyObj: monster.objTarget = weakref.ref(enemyObj) else: ffext.dump('ai attack update exit1', monster.name) monster.fsm.changeState(ffext.singleton(StateBackBornPoint)) return elif nowMs - monster.lastSelectTargetMS >= 5*1000: monster.objTarget = None enemyObj = monster.selectEnemy() if enemyObj: monster.objTarget = weakref.ref(enemyObj) else: ffext.dump('ai attack update exit2', monster.name) monster.fsm.changeState(ffext.singleton(StateBackBornPoint)) return #攻击目标 distance = Base.distance(monster.x, monster.y, enemyObj.x,enemyObj.y) if distance > monster.attackDistance: boranDict = Base.distance(monster.x, monster.y, monster.bornX, monster.bornY) if boranDict > Base.ZHUJI_LEN: ffext.dump('ai attack changeto StateBackBornPoint', monster.name) monster.fsm.changeState(ffext.singleton(StateBackBornPoint)) return if not traceTarge(monster, enemyObj.x, enemyObj.y, distance): ffext.dump('ai attack update mvoe failed', distance, monster.name) return True return distance -= 1 if distance > monster.attackDistance: #ffext.dump('ai attack update', distance,monster.attackDistance) return #释放技能 monster.skillCtrl.autoUseSkill(enemyObj, nowMs) #ffext.dump('ai attack use skill', monster.name, monster.x, monster.y, monster.direction) return True
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 update(self, monster, nowMs): if monster.hp <= 0: monster.fsm.changeState(ffext.singleton(StateIdle)) return True 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 nowMs < monster.nextMoveTm: return True distance = Base.distance(monster.x, monster.y, monster.bornX,monster.bornY) if monster.x != monster.bornX or monster.y != monster.bornY: #ffext.dump('ai attack update mvoe begin', monster.bornX, monster.bornY, monster.name) if not traceTarge(monster, monster.bornX, monster.bornY, distance): ffext.dump('ai attack update mvoe failed', monster.bornX, monster.bornY, monster.name) return True else: monster.fsm.changeState(ffext.singleton(StateIdle)) return True
def real_session_verify(session_key, online_time, ip, gate_name): ''' ''' print(session_key) #name nick_name = session_key if 'test' == session_key: return ['123'] account = msg_def.account_req_t() ffext.decode_buff(account, session_key) player = player_t() player.online_time = online_time player.ip = ip player.gate_name = gate_name player.nick_name = nick_name player.register_flag = 0 #注册成功 id = gen_id() player.set_socket_id(id) player.set_id(id) ffext.singleton(player_mgr_t).add(player.get_socket_id(), player) return [str(player.id())]
def real_session_offline(session_id, online_time): print('real_session_offline~~~~', session_id) player = ffext.singleton(player_mgr_t).get(session_id) if player == None: return player = ffext.singleton(player_mgr_t).get(session_id) #广播所有人,上线了 def broadcast_msg(player_other): pass ffext.singleton(player_mgr_t).foreach_except(broadcast_msg, session_id) player.trace('real_session_offline') ffext.singleton(player_mgr_t).remove(session_id) #有可能 session_id player = None print('current online user num=%d' % (ffext.singleton(player_mgr_t).size()))
def process_chat(session_id, msg): content = msg.value if content == 'reload': os.system('./update_code.sh') ret = ffext.reload('main') #重载此脚本 ffext.broadcast_msg_session(1, '<b><font color="#ff0000"> main.py已完成重载'\ '%s</font></b>'%(str(ret))) return #print("process_chat session_id=%s content=%s"%(session_id, content)) ret = '<font color="#008000">[%s %s]:</font>%s' % (session_id, GetNowTime(), content) ret_msg = chat_msg_t() ret_msg.value = ret ffext.broadcast_msg_session(2, ret_msg) player = ffext.singleton(player_mgr_t).get(session_id) player.inc_chat_times() if player.get_chat_times() > 1000: ffext.close_session(session_id)
def wrapper(func_): ffext.singleton(gm_reg_t).gm_reg[cmd_] = func_ return func_
def real_session_offline(session_id, online_time): ffext.singleton(player_mgr_t).remove(session_id)
def goTo(): mapObj.copyMapHandler.autoPlayerRef = weakref.ref(player) mapObj.playerEnterMap(player, 69, 72) player.fsm.changeState(ffext.singleton(ArenaStateAttack))
def my_session_offline(session_id, online_time): content = '<font color="#ff0000">[%s %s] offline </font>'%(session_id, GetNowTime()) ffext.broadcast_msg_session(1, content) ffext.singleton(player_mgr_t).remove(session_id) ffext.broadcast_msg_session(1, '<font color="#ff0000">当前在线:</font>') ffext.broadcast_msg_session(1, ffext.singleton(player_mgr_t).idlist())
def session_id_to_player(session_id): return ffext.singleton(player_mgr_t).get(session_id)