Ejemplo n.º 1
0
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())
Ejemplo n.º 2
0
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())]
Ejemplo n.º 3
0
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())
Ejemplo n.º 4
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
Ejemplo n.º 5
0
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
Ejemplo n.º 6
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
Ejemplo n.º 7
0
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)
Ejemplo n.º 8
0
 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
Ejemplo n.º 9
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
Ejemplo n.º 10
0
 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
Ejemplo n.º 11
0
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())]
Ejemplo n.º 12
0
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()))
Ejemplo n.º 13
0
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)
Ejemplo n.º 14
0
 def wrapper(func_):
     ffext.singleton(gm_reg_t).gm_reg[cmd_] = func_
     return func_
Ejemplo n.º 15
0
def real_session_offline(session_id, online_time):
    ffext.singleton(player_mgr_t).remove(session_id)
Ejemplo n.º 16
0
 def goTo():
     mapObj.copyMapHandler.autoPlayerRef = weakref.ref(player)
     mapObj.playerEnterMap(player, 69, 72)
     player.fsm.changeState(ffext.singleton(ArenaStateAttack))
Ejemplo n.º 17
0
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())
Ejemplo n.º 18
0
def session_id_to_player(session_id):
    return ffext.singleton(player_mgr_t).get(session_id)
Ejemplo n.º 19
0
def session_id_to_player(session_id):
    return ffext.singleton(player_mgr_t).get(session_id)